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 >* >
52 # ifdef GUM_DEBUG_MODE 56 static bool first_time =
true;
60 __debug__::inc_deletion__(
"HashTable",
72 template <
typename GUM_SCALAR >
73 HashTable<
const MultiDimImplementation< GUM_SCALAR >*, Idx >&
74 ScheduleMultiDim< GUM_SCALAR >::multidim2id__() {
75 static HashTable<
const MultiDimImplementation< GUM_SCALAR >*, Idx >
77 # ifdef GUM_DEBUG_MODE 81 static bool first_time =
true;
85 __debug__::inc_deletion__(
"HashTable",
89 (
void*)&multidim_ids__);
93 return multidim_ids__;
97 template <
typename GUM_SCALAR >
98 HashTable< Idx, Idx >& ScheduleMultiDim< GUM_SCALAR >::id2refs__() {
99 static HashTable< Idx, Idx > ids__;
100 # ifdef GUM_DEBUG_MODE 104 static bool first_time =
true;
108 __debug__::inc_deletion__(
"HashTable",
120 template <
typename GUM_SCALAR >
121 HashTable< Idx,
const Sequence<
const DiscreteVariable* >* >&
122 ScheduleMultiDim< GUM_SCALAR >::id2vars__() {
123 static HashTable< Idx,
const Sequence<
const DiscreteVariable* >* > vars__;
124 # ifdef GUM_DEBUG_MODE 128 static bool first_time =
true;
132 __debug__::inc_deletion__(
"HashTable",
144 template <
typename GUM_SCALAR >
145 HashTable< Idx, Size >& ScheduleMultiDim< GUM_SCALAR >::id2size__() {
146 static HashTable< Idx, Size > size__;
147 # ifdef GUM_DEBUG_MODE 151 static bool first_time =
true;
155 __debug__::inc_deletion__(
"HashTable",
167 template <
typename GUM_SCALAR >
168 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
169 const MultiDimImplementation< GUM_SCALAR >& multidim) {
171 GUM_CONSTRUCTOR(ScheduleMultiDim);
175 if (multidim2id__().exists(&multidim)) {
177 id__ = multidim2id__().operator[](&multidim);
180 HashTable< Idx, Idx >& refs = id2refs__();
187 id2multidim__().insert(id__, &multidim);
188 multidim2id__().insert(&multidim, id__);
191 id2refs__().insert(id__, 1);
194 const Sequence<
const DiscreteVariable* >* vars
195 =
new Sequence<
const DiscreteVariable* >(multidim.variablesSequence());
196 id2vars__().insert(id__, vars);
199 id2size__().insert(id__, multidim.domainSize());
204 template <
typename GUM_SCALAR >
205 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
206 const MultiDimDecorator< GUM_SCALAR >& multidim) {
208 GUM_CONSTRUCTOR(ScheduleMultiDim);
210 const MultiDimImplementation< GUM_SCALAR >* impl = multidim.content();
214 if (multidim2id__().exists(impl)) {
216 id__ = multidim2id__().operator[](impl);
219 HashTable< Idx, Idx >& refs = id2refs__();
226 id2multidim__().insert(id__, impl);
227 multidim2id__().insert(impl, id__);
230 id2refs__().insert(id__, 1);
233 const Sequence<
const DiscreteVariable* >* vars
234 =
new Sequence<
const DiscreteVariable* >(multidim.variablesSequence());
235 id2vars__().insert(id__, vars);
238 id2size__().insert(id__, multidim.domainSize());
243 template <
typename GUM_SCALAR >
244 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
245 const Sequence<
const DiscreteVariable* >& vars) :
248 GUM_CONSTRUCTOR(ScheduleMultiDim);
251 id2refs__().insert(id__, 1);
254 const Sequence<
const DiscreteVariable* >* new_vars
255 =
new Sequence<
const DiscreteVariable* >(vars);
256 id2vars__().insert(id__, new_vars);
261 for (
const auto var: *new_vars)
262 size *= var->domainSize();
264 id2size__().insert(id__, size);
268 template <
typename GUM_SCALAR >
269 ScheduleMultiDim< GUM_SCALAR >::ScheduleMultiDim(
270 const ScheduleMultiDim< GUM_SCALAR >& from) :
273 GUM_CONS_CPY(ScheduleMultiDim);
276 HashTable< Idx, Idx >& refs = id2refs__();
281 template <
typename GUM_SCALAR >
282 ScheduleMultiDim< GUM_SCALAR >::~ScheduleMultiDim() {
284 GUM_DESTRUCTOR(ScheduleMultiDim);
287 HashTable< Idx, Idx >& refs = id2refs__();
288 Idx& nb_refs = refs[id__];
292 if (id2multidim__().exists(id__)) {
293 multidim2id__().erase(id2multidim__().operator[](id__));
294 id2multidim__().erase(id__);
299 delete id2vars__().operator[](id__);
300 id2vars__().erase(id__);
301 id2size__().erase(id__);
307 template <
typename GUM_SCALAR >
308 ScheduleMultiDim< GUM_SCALAR >& ScheduleMultiDim< GUM_SCALAR >::operator=(
309 const ScheduleMultiDim< GUM_SCALAR >& from) {
311 if (id__ != from.id__) {
313 HashTable< Idx, Idx >& refs = id2refs__();
314 Idx& nb_refs = refs[id__];
318 if (id2multidim__().exists(id__)) {
319 multidim2id__().erase(id2multidim__().operator[](id__));
320 id2multidim__().erase(id__);
325 delete id2vars__().operator[](id__);
326 id2vars__().erase(id__);
327 id2size__().erase(id__);
340 template <
typename GUM_SCALAR >
341 INLINE
bool ScheduleMultiDim< GUM_SCALAR >::operator==(
342 const ScheduleMultiDim< GUM_SCALAR >& m)
const {
343 return (id__ == m.id__);
347 template <
typename GUM_SCALAR >
348 INLINE
bool ScheduleMultiDim< GUM_SCALAR >::operator!=(
349 const ScheduleMultiDim< GUM_SCALAR >& m)
const {
350 return (id__ != m.id__);
355 template <
typename GUM_SCALAR >
356 INLINE
const MultiDimImplementation< GUM_SCALAR >&
357 ScheduleMultiDim< GUM_SCALAR >::multiDim()
const {
358 return *(id2multidim__().operator[](id__));
363 template <
typename GUM_SCALAR >
364 INLINE
bool ScheduleMultiDim< GUM_SCALAR >::isAbstract()
const {
365 return !id2multidim__().exists(id__);
369 template <
typename GUM_SCALAR >
370 INLINE Idx ScheduleMultiDim< GUM_SCALAR >::id()
const {
375 template <
typename GUM_SCALAR >
376 INLINE
const Sequence<
const DiscreteVariable* >&
377 ScheduleMultiDim< GUM_SCALAR >::variablesSequence()
const {
378 return *(id2vars__().operator[](id__));
382 template <
typename GUM_SCALAR >
383 INLINE Size ScheduleMultiDim< GUM_SCALAR >::domainSize()
const {
384 return id2size__().operator[](id__);
388 template <
typename GUM_SCALAR >
389 void ScheduleMultiDim< GUM_SCALAR >::setMultiDim(
390 const MultiDimImplementation< GUM_SCALAR >& m) {
394 if (multidim2id__().exists(&m)) {
395 if (multidim2id__().operator[](&m) != id__) {
396 GUM_ERROR(DuplicateElement,
397 "the multidim table has already been " 398 "wrapped into a ScheduleMultidim with another id");
406 if (id2multidim__().exists(id__)) {
407 const MultiDimImplementation< GUM_SCALAR >* impl
408 = id2multidim__(). operator[](id__);
410 if (impl == &m)
return;
412 multidim2id__().erase(impl);
414 id2multidim__().operator[](id__) = &m;
417 id2multidim__().insert(id__, &m);
420 multidim2id__().insert(&m, id__);
423 const Sequence<
const DiscreteVariable* >& m_vars = m.variablesSequence();
424 Sequence<
const DiscreteVariable* >* vars
425 =
const_cast< Sequence<
const DiscreteVariable* >* >(
426 id2vars__().operator[](id__));
430 id2size__().operator[](id__) = m.domainSize();
435 template <
typename GUM_SCALAR >
436 INLINE
void ScheduleMultiDim< GUM_SCALAR >::setMultiDim(
437 const MultiDimDecorator< GUM_SCALAR >& m) {
438 setMultiDim(*(m.content()));
442 template <
typename GUM_SCALAR >
443 std::string ScheduleMultiDim< GUM_SCALAR >::toString()
const {
444 std::stringstream str;
450 str << id2multidim__().operator[](id__);
451 }
catch (NotFound&) { str << id__; }