22 #include <agrum/tools/multidim/implementations/multiDimAdressable.h> 23 #include <agrum/tools/multidim/setInst.h> 27 # include <agrum/tools/multidim/setInst_inl.h> 30 #ifndef DOXYGEN_SHOULD_SKIP_THIS 34 void SetInst::init__(MultiDimAdressable* master) {
36 const Sequence<
const DiscreteVariable* >& v = master->variablesSequence();
37 vars__.resize(v.size());
38 vals__.reserve(v.size());
41 for (
const auto var: v)
49 SetInst::SetInst(MultiDimAdressable& d) : overflow__(
false) {
51 GUM_CONSTRUCTOR(SetInst);
55 SetInst::SetInst(
const MultiDimAdressable& d) :
58 GUM_CONSTRUCTOR(SetInst);
59 init__(
const_cast< MultiDimAdressable* >(&d));
64 SetInst::SetInst(MultiDimAdressable* d) : overflow__(
false) {
66 GUM_CONSTRUCTOR(SetInst);
75 SetInst::SetInst(
const MultiDimAdressable* const_d) :
78 GUM_CONSTRUCTOR(SetInst);
80 if (const_d) init__(
const_cast< MultiDimAdressable* >(const_d));
85 SetInst::SetInst(
const SetInst& aI) :
88 GUM_CONS_CPY(SetInst);
92 overflow__ = aI.overflow__;
97 SetInst::SetInst(
const Instantiation& aI) :
100 GUM_CONS_CPY(SetInst);
101 const Sequence<
const DiscreteVariable* >& v = aI.variablesSequence();
102 vars__.resize(v.size());
106 for (
const auto var: v) {
108 vals__[vars__.pos(var)] = (Size(1) << (aI.val(*var)));
113 SetInst& SetInst::operator=(
const SetInst& aI) {
117 overflow__ = aI.overflow__;
123 std::string SetInst::toString()
const {
124 std::stringstream sstr;
127 if (overflow__) { sstr <<
"<invalid>"; }
131 Sequence<
const DiscreteVariable* >::iterator_safe iter = vars__.begin();
133 if (iter != vars__.end()) {
134 std::stringstream sstr2;
136 Size si = variable(iter.pos()).domainSize();
137 Size valb = vals(iter.pos());
140 std::stringstream sstr4;
141 sstr4 << ((valb & 1) ?
"1" :
"0") << sstr2.str();
145 sstr2 << sstr4.str();
148 sstr << variable(iter.pos()).name() <<
":" << sstr2.str();
151 while (iter != vars__.end()) {
152 std::stringstream sstr3;
154 si = variable(iter.pos()).domainSize();
156 valb = vals(iter.pos());
159 std::stringstream sstr4;
161 sstr4 << ((valb & 1) ?
"1" :
"0") << sstr3.str();
164 sstr3 << sstr4.str();
167 sstr <<
"|" << variable(iter.pos()).name() <<
":" << sstr3.str();
178 std::ostream& operator<<(std::ostream& aStream,
const SetInst& i) {
179 aStream << i.toString();
182 gum::SetInst& operator<<(gum::SetInst& inst,
const gum::DiscreteVariable& i) {
186 gum::SetInst& operator>>(gum::SetInst& inst,
const gum::DiscreteVariable& i) {
191 void gum::SetInst::assign_values(
192 gum::Bijection<
const gum::DiscreteVariable*,
const gum::DiscreteVariable* >&
194 const gum::SetInst& i,
197 for (
const auto var: i.variablesSequence())
198 j.chgVal(bij.second(var), i.val(var));
199 }
catch (gum::NotFound&) {
200 GUM_ERROR(gum::NotFound,
"missing variable in bijection or SetInst");