#include #include #include #include using std::vector; using std::set; AggNode::AggNode(Index const &dim, vector nodes, vector offsets) : DeterministicNode(dim) { unsigned long length = data.length(); /* Check argument lengths */ if (length != nodes.size() || length != offsets.size()) { throw std::length_error ("Length mismatch in Aggregate Node constructor"); } /* Check that offsets are valid */ for (unsigned long i = 0; i < length; i++) { if (offsets[i] >= nodes[i]->data.length()) throw std::out_of_range("Invalid offset in Aggregate Node constructor"); } /* See if node is discrete-valued */ bool isinteger = true; for (unsigned long i = 0; i < length; i++) { if (!nodes[i]->data.isDiscreteValued()) { isinteger = false; break; } } data.setDiscreteValued(isinteger); _value_pointers = new double const *[length]; for (unsigned long i = 0; i < length; i++) { this->addParent(nodes[i]); _value_pointers[i] = nodes[i]->data.value() + offsets[i]; } } AggNode::~AggNode() { delete [] _value_pointers; } void AggNode::forwardSample() { long length = data.length(); double *value = new double[length]; for (long i = 0; i < length; i++) { value[i] = *_value_pointers[i]; } data.setValue(value, length); delete [] value; } AggNode *asAggregate(Node *node) { return dynamic_cast(node); } bool isAggregate(Node const *node) { return dynamic_cast(node); }