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) : _overflow_(
false) {
57 GUM_CONSTRUCTOR(SetInst);
58 _init_(
const_cast< MultiDimAdressable* >(&d));
63 SetInst::SetInst(MultiDimAdressable* d) : _overflow_(
false) {
65 GUM_CONSTRUCTOR(SetInst);
74 SetInst::SetInst(
const MultiDimAdressable* const_d) : _overflow_(
false) {
76 GUM_CONSTRUCTOR(SetInst);
78 if (const_d) _init_(
const_cast< MultiDimAdressable* >(const_d));
83 SetInst::SetInst(
const SetInst& aI) :
86 GUM_CONS_CPY(SetInst);
90 _overflow_ = aI._overflow_;
95 SetInst::SetInst(
const Instantiation& aI) :
98 GUM_CONS_CPY(SetInst);
99 const Sequence<
const DiscreteVariable* >& v = aI.variablesSequence();
100 _vars_.resize(v.size());
104 for (
const auto var: v) {
106 _vals_[_vars_.pos(var)] = (Size(1) << (aI.val(*var)));
111 SetInst& SetInst::operator=(
const SetInst& aI) {
115 _overflow_ = aI._overflow_;
121 std::string SetInst::toString()
const {
122 std::stringstream sstr;
125 if (_overflow_) { sstr <<
"<invalid>"; }
129 Sequence<
const DiscreteVariable* >::iterator_safe iter = _vars_.begin();
131 if (iter != _vars_.end()) {
132 std::stringstream sstr2;
134 Size si = variable(iter.pos()).domainSize();
135 Size valb = vals(iter.pos());
138 std::stringstream sstr4;
139 sstr4 << ((valb & 1) ?
"1" :
"0") << sstr2.str();
143 sstr2 << sstr4.str();
146 sstr << variable(iter.pos()).name() <<
":" << sstr2.str();
149 while (iter != _vars_.end()) {
150 std::stringstream sstr3;
152 si = variable(iter.pos()).domainSize();
154 valb = vals(iter.pos());
157 std::stringstream sstr4;
159 sstr4 << ((valb & 1) ?
"1" :
"0") << sstr3.str();
162 sstr3 << sstr4.str();
165 sstr <<
"|" << variable(iter.pos()).name() <<
":" << sstr3.str();
176 std::ostream& operator<<(std::ostream& aStream,
const SetInst& i) {
177 aStream << i.toString();
180 gum::SetInst& operator<<(gum::SetInst& inst,
const gum::DiscreteVariable& i) {
184 gum::SetInst& operator>>(gum::SetInst& inst,
const gum::DiscreteVariable& i) {
189 void gum::SetInst::assign_values(
190 gum::Bijection<
const gum::DiscreteVariable*,
const gum::DiscreteVariable* >& bij,
191 const gum::SetInst& i,
194 for (
const auto var: i.variablesSequence())
195 j.chgVal(bij.second(var), i.val(var));
196 }
catch (gum::NotFound&) {
197 GUM_ERROR(gum::NotFound,
"missing variable in bijection or SetInst")