28 #ifndef DOXYGEN_SHOULD_SKIP_THIS 33 # include <agrum/agrum.h> 35 # include <agrum/tools/graphicalModels/inference/scheduler/scheduleMultiDim.h> 40 template <
typename GUM_SCALAR >
41 Idx ScheduleMultiDim< GUM_SCALAR >::_newId_() {
42 static Idx _abstract_id_ = 0;
43 return ++_abstract_id_;
47 template <
typename GUM_SCALAR >
48 HashTable< Idx,
const MultiDimImplementation< GUM_SCALAR >* >&
49 ScheduleMultiDim< GUM_SCALAR >::_id2multidim_() {
50 static HashTable< Idx,
const MultiDimImplementation< GUM_SCALAR >* > _multidims_;
51 # ifdef GUM_DEBUG_MODE 55 static bool first_time =
true;
59 __debug__::_inc_deletion_(
"HashTable",
71 template <
typename GUM_SCALAR >
72 HashTable<
const MultiDimImplementation< GUM_SCALAR >*, Idx >&
73 ScheduleMultiDim< GUM_SCALAR >::_multidim2id_() {
74 static HashTable<
const MultiDimImplementation< GUM_SCALAR >*, Idx > _multidim_ids_;
75 # ifdef GUM_DEBUG_MODE 79 static bool first_time =
true;
83 __debug__::_inc_deletion_(
"HashTable",
87 (
void*)&_multidim_ids_);
91 return _multidim_ids_;
95 template <
typename GUM_SCALAR >
96 HashTable< Idx, Idx >& ScheduleMultiDim< GUM_SCALAR >::_id2refs_() {
97 static HashTable< Idx, Idx > _ids_;
98 # ifdef GUM_DEBUG_MODE 102 static bool first_time =
true;
106 __debug__::_inc_deletion_(
"HashTable", __FILE__, __LINE__,
"destructor of", (
void*)&_ids_);
114 template <
typename GUM_SCALAR >
115 HashTable< Idx,
const Sequence<
const DiscreteVariable* >* >&
116 ScheduleMultiDim< GUM_SCALAR >::_id2vars_() {
117 static HashTable< Idx,
const Sequence<
const DiscreteVariable* >* > _vars_;
118 # ifdef GUM_DEBUG_MODE 122 static bool first_time =
true;
126 __debug__::_inc_deletion_(
"HashTable", __FILE__, __LINE__,
"destructor of", (
void*)&_vars_);
134 template <
typename GUM_SCALAR >
135 HashTable< Idx, Size >& ScheduleMultiDim< GUM_SCALAR >::_id2size_() {
136 static HashTable< Idx, Size > _size_;
137 # ifdef GUM_DEBUG_MODE 141 static bool first_time =
true;
145 __debug__::_inc_deletion_(
"HashTable", __FILE__, __LINE__,
"destructor of", (
void*)&_size_);
153 template <
typename GUM_SCALAR >
154 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
155 const MultiDimImplementation< GUM_SCALAR >& multidim) {
157 GUM_CONSTRUCTOR(ScheduleMultiDim);
161 if (_multidim2id_().exists(&multidim)) {
163 _id_ = _multidim2id_().operator[](&multidim);
166 HashTable< Idx, Idx >& refs = _id2refs_();
173 _id2multidim_().insert(_id_, &multidim);
174 _multidim2id_().insert(&multidim, _id_);
177 _id2refs_().insert(_id_, 1);
180 const Sequence<
const DiscreteVariable* >* vars
181 =
new Sequence<
const DiscreteVariable* >(multidim.variablesSequence());
182 _id2vars_().insert(_id_, vars);
185 _id2size_().insert(_id_, multidim.domainSize());
190 template <
typename GUM_SCALAR >
191 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
192 const MultiDimDecorator< GUM_SCALAR >& multidim) {
194 GUM_CONSTRUCTOR(ScheduleMultiDim);
196 const MultiDimImplementation< GUM_SCALAR >* impl = multidim.content();
200 if (_multidim2id_().exists(impl)) {
202 _id_ = _multidim2id_().operator[](impl);
205 HashTable< Idx, Idx >& refs = _id2refs_();
212 _id2multidim_().insert(_id_, impl);
213 _multidim2id_().insert(impl, _id_);
216 _id2refs_().insert(_id_, 1);
219 const Sequence<
const DiscreteVariable* >* vars
220 =
new Sequence<
const DiscreteVariable* >(multidim.variablesSequence());
221 _id2vars_().insert(_id_, vars);
224 _id2size_().insert(_id_, multidim.domainSize());
229 template <
typename GUM_SCALAR >
230 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
231 const Sequence<
const DiscreteVariable* >& vars) :
234 GUM_CONSTRUCTOR(ScheduleMultiDim);
237 _id2refs_().insert(_id_, 1);
240 const Sequence<
const DiscreteVariable* >* new_vars
241 =
new Sequence<
const DiscreteVariable* >(vars);
242 _id2vars_().insert(_id_, new_vars);
247 for (
const auto var: *new_vars)
248 size *= var->domainSize();
250 _id2size_().insert(_id_, size);
254 template <
typename GUM_SCALAR >
255 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
const ScheduleMultiDim< GUM_SCALAR >& from) :
258 GUM_CONS_CPY(ScheduleMultiDim);
261 HashTable< Idx, Idx >& refs = _id2refs_();
266 template <
typename GUM_SCALAR >
267 ScheduleMultiDim< GUM_SCALAR >::~ScheduleMultiDim() {
269 GUM_DESTRUCTOR(ScheduleMultiDim);
272 HashTable< Idx, Idx >& refs = _id2refs_();
273 Idx& nb_refs = refs[_id_];
277 if (_id2multidim_().exists(_id_)) {
278 _multidim2id_().erase(_id2multidim_().operator[](_id_));
279 _id2multidim_().erase(_id_);
284 delete _id2vars_().operator[](_id_);
285 _id2vars_().erase(_id_);
286 _id2size_().erase(_id_);
292 template <
typename GUM_SCALAR >
293 ScheduleMultiDim< GUM_SCALAR >&
294 ScheduleMultiDim< GUM_SCALAR >::operator=(
const ScheduleMultiDim< GUM_SCALAR >& from) {
296 if (_id_ != from._id_) {
298 HashTable< Idx, Idx >& refs = _id2refs_();
299 Idx& nb_refs = refs[_id_];
303 if (_id2multidim_().exists(_id_)) {
304 _multidim2id_().erase(_id2multidim_().operator[](_id_));
305 _id2multidim_().erase(_id_);
310 delete _id2vars_().operator[](_id_);
311 _id2vars_().erase(_id_);
312 _id2size_().erase(_id_);
325 template <
typename GUM_SCALAR >
327 ScheduleMultiDim< GUM_SCALAR >::operator==(
const ScheduleMultiDim< GUM_SCALAR >& m)
const {
328 return (_id_ == m._id_);
332 template <
typename GUM_SCALAR >
334 ScheduleMultiDim< GUM_SCALAR >::operator!=(
const ScheduleMultiDim< GUM_SCALAR >& m)
const {
335 return (_id_ != m._id_);
340 template <
typename GUM_SCALAR >
341 INLINE
const MultiDimImplementation< GUM_SCALAR >&
342 ScheduleMultiDim< GUM_SCALAR >::multiDim()
const {
343 return *(_id2multidim_().operator[](_id_));
348 template <
typename GUM_SCALAR >
349 INLINE
bool ScheduleMultiDim< GUM_SCALAR >::isAbstract()
const {
350 return !_id2multidim_().exists(_id_);
354 template <
typename GUM_SCALAR >
355 INLINE Idx ScheduleMultiDim< GUM_SCALAR >::id()
const {
360 template <
typename GUM_SCALAR >
361 INLINE
const Sequence<
const DiscreteVariable* >&
362 ScheduleMultiDim< GUM_SCALAR >::variablesSequence()
const {
363 return *(_id2vars_().operator[](_id_));
367 template <
typename GUM_SCALAR >
368 INLINE Size ScheduleMultiDim< GUM_SCALAR >::domainSize()
const {
369 return _id2size_().operator[](_id_);
373 template <
typename GUM_SCALAR >
374 void ScheduleMultiDim< GUM_SCALAR >::setMultiDim(
const MultiDimImplementation< GUM_SCALAR >& m) {
378 if (_multidim2id_().exists(&m)) {
379 if (_multidim2id_().operator[](&m) != _id_) {
380 GUM_ERROR(DuplicateElement,
381 "the multidim table has already been " 382 "wrapped into a ScheduleMultidim with another id");
390 if (_id2multidim_().exists(_id_)) {
391 const MultiDimImplementation< GUM_SCALAR >* impl = _id2multidim_().operator[](_id_);
393 if (impl == &m)
return;
395 _multidim2id_().erase(impl);
397 _id2multidim_().operator[](_id_) = &m;
400 _id2multidim_().insert(_id_, &m);
403 _multidim2id_().insert(&m, _id_);
406 const Sequence<
const DiscreteVariable* >& m_vars = m.variablesSequence();
407 Sequence<
const DiscreteVariable* >* vars
408 =
const_cast< Sequence<
const DiscreteVariable* >* >(_id2vars_().operator[](_id_));
412 _id2size_().operator[](_id_) = m.domainSize();
417 template <
typename GUM_SCALAR >
419 ScheduleMultiDim< GUM_SCALAR >::setMultiDim(
const MultiDimDecorator< GUM_SCALAR >& m) {
420 setMultiDim(*(m.content()));
424 template <
typename GUM_SCALAR >
425 std::string ScheduleMultiDim< GUM_SCALAR >::toString()
const {
426 std::stringstream str;
432 str << _id2multidim_().operator[](_id_);
433 }
catch (NotFound&) { str << _id_; }