30 #ifndef DOXYGEN_SHOULD_SKIP_THIS 37 template <
template <
typename >
class ALLOC >
40 return __NH.getAllocator();
45 template <
template <
typename >
class ALLOC >
47 const DBRowGeneratorParser< ALLOC >& parser,
48 const Apriori< ALLOC >& apriori,
49 const std::vector< std::pair< std::size_t, std::size_t >,
50 ALLOC< std::pair< std::size_t, std::size_t > > >& ranges,
51 const Bijection<
NodeId, std::size_t, ALLOC< std::size_t > >&
54 __NH(parser, apriori, ranges, nodeId2columns, alloc),
55 __k_NML(parser, apriori, ranges, nodeId2columns, alloc),
56 __score_MDL(parser, apriori, ranges, nodeId2columns, alloc),
57 __ICache(alloc), __KCache(alloc) {
63 template <
template <
typename >
class ALLOC >
65 const DBRowGeneratorParser< ALLOC >& parser,
66 const Apriori< ALLOC >& apriori,
67 const Bijection<
NodeId, std::size_t, ALLOC< std::size_t > >&
70 __NH(parser, apriori, nodeId2columns, alloc),
71 __k_NML(parser, apriori, nodeId2columns, alloc),
72 __score_MDL(parser, apriori, nodeId2columns, alloc), __ICache(alloc),
79 template <
template <
typename >
class ALLOC >
81 const CorrectedMutualInformation< ALLOC >& from,
83 __NH(from.__NH, alloc),
84 __k_NML(from.__k_NML, alloc), __score_MDL(from.__score_MDL, alloc),
85 __kmode(from.__kmode), __use_ICache(from.__use_ICache),
86 __use_HCache(from.__use_HCache), __use_KCache(from.__use_KCache),
87 __use_CnrCache(from.__use_CnrCache), __ICache(from.__ICache, alloc),
88 __KCache(from.__KCache, alloc) {
94 template <
template <
typename >
class ALLOC >
96 const CorrectedMutualInformation< ALLOC >& from) :
101 template <
template <
typename >
class ALLOC >
103 CorrectedMutualInformation< ALLOC >&& from,
105 __NH(
std::move(from.__NH), alloc),
106 __k_NML(
std::move(from.__k_NML), alloc),
107 __score_MDL(
std::move(from.__score_MDL), alloc), __kmode(from.__kmode),
108 __use_ICache(from.__use_ICache), __use_HCache(from.__use_HCache),
109 __use_KCache(from.__use_KCache), __use_CnrCache(from.__use_CnrCache),
110 __ICache(
std::move(from.__ICache), alloc),
111 __KCache(
std::move(from.__KCache), alloc) {
117 template <
template <
typename >
class ALLOC >
119 CorrectedMutualInformation< ALLOC >&& from) :
124 template <
template <
typename >
class ALLOC >
125 CorrectedMutualInformation< ALLOC >*
129 ALLOC< CorrectedMutualInformation< ALLOC > > allocator(alloc);
130 CorrectedMutualInformation< ALLOC >* new_score = allocator.allocate(1);
132 allocator.construct(new_score, *
this, alloc);
134 allocator.deallocate(new_score, 1);
143 template <
template <
typename >
class ALLOC >
144 CorrectedMutualInformation< ALLOC >*
151 template <
template <
typename >
class ALLOC >
159 template <
template <
typename >
class ALLOC >
161 operator=(
const CorrectedMutualInformation< ALLOC >& from) {
164 __k_NML = from.__k_NML;
165 __score_MDL = from.__score_MDL;
166 __kmode = from.__kmode;
167 __use_ICache = from.__use_ICache;
168 __use_HCache = from.__use_HCache;
169 __use_KCache = from.__use_KCache;
170 __use_CnrCache = from.__use_CnrCache;
171 __ICache = from.__ICache;
172 __KCache = from.__KCache;
179 template <
template <
typename >
class ALLOC >
181 operator=(CorrectedMutualInformation< ALLOC >&& from) {
183 __NH = std::move(from.__NH);
184 __k_NML = std::move(from.__k_NML);
185 __score_MDL = std::move(from.__score_MDL);
186 __kmode = from.__kmode;
187 __use_ICache = from.__use_ICache;
188 __use_HCache = from.__use_HCache;
189 __use_KCache = from.__use_KCache;
190 __use_CnrCache = from.__use_CnrCache;
191 __ICache = std::move(from.__ICache);
192 __KCache = std::move(from.__KCache);
199 template <
template <
typename >
class ALLOC >
209 template <
template <
typename >
class ALLOC >
211 if (!on_off) __ICache.clear();
212 __use_ICache = on_off;
217 template <
template <
typename >
class ALLOC >
219 if (!on_off) __NH.clearCache();
220 __use_HCache = on_off;
221 __NH.useCache(on_off);
226 template <
template <
typename >
class ALLOC >
228 if (!on_off) __KCache.clear();
229 __use_KCache = on_off;
234 template <
template <
typename >
class ALLOC >
236 if (!on_off) __k_NML.clearCache();
237 __use_CnrCache = on_off;
238 __k_NML.useCache(on_off);
243 template <
template <
typename >
class ALLOC >
253 template <
template <
typename >
class ALLOC >
256 __k_NML.clearCache();
263 template <
template <
typename >
class ALLOC >
270 template <
template <
typename >
class ALLOC >
277 template <
template <
typename >
class ALLOC >
284 template <
template <
typename >
class ALLOC >
286 __k_NML.clearCache();
291 template <
template <
typename >
class ALLOC >
294 __NH.setMaxNbThreads(nb);
295 __k_NML.setMaxNbThreads(nb);
296 __score_MDL.setMaxNbThreads(nb);
301 template <
template <
typename >
class ALLOC >
303 return __NH.nbThreads();
309 template <
template <
typename >
class ALLOC >
311 const std::size_t nb)
const {
312 __NH.setMinNbRowsPerThread(nb);
313 __k_NML.setMinNbRowsPerThread(nb);
314 __score_MDL.setMinNbRowsPerThread(nb);
319 template <
template <
typename >
class ALLOC >
322 return __NH.minNbRowsPerThread();
333 template <
template <
typename >
class ALLOC >
334 template <
template <
typename >
class XALLOC >
336 const std::vector< std::pair< std::size_t, std::size_t >,
337 XALLOC< std::pair< std::size_t, std::size_t > > >&
339 std::vector< std::pair< std::size_t, std::size_t >,
340 ALLOC< std::pair< std::size_t, std::size_t > > >
343 __NH.setRanges(new_ranges);
344 __k_NML.setRanges(new_ranges);
345 __score_MDL.setRanges(new_ranges);
352 template <
template <
typename >
class ALLOC >
354 std::vector< std::pair< std::size_t, std::size_t >,
355 ALLOC< std::pair< std::size_t, std::size_t > > >
358 __k_NML.clearRanges();
359 __score_MDL.clearRanges();
365 template <
template <
typename >
class ALLOC >
366 INLINE
const std::vector< std::pair< std::size_t, std::size_t >,
367 ALLOC< std::pair< std::size_t, std::size_t > > >&
369 return __NH.ranges();
374 template <
template <
typename >
class ALLOC >
382 template <
template <
typename >
class ALLOC >
390 template <
template <
typename >
class ALLOC >
398 template <
template <
typename >
class ALLOC >
401 return score(var1, var2, __empty_conditioning_set);
406 template <
template <
typename >
class ALLOC >
410 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
411 return __NI_score(var1, var2, conditioning_ids)
412 - __K_score(var1, var2, conditioning_ids);
417 template <
template <
typename >
class ALLOC >
421 return score(var1, var2, var3, __empty_conditioning_set);
426 template <
template <
typename >
class ALLOC >
431 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
432 return __NI_score(var1, var2, var3, conditioning_ids)
433 + __K_score(var1, var2, var3, conditioning_ids);
438 template <
template <
typename >
class ALLOC >
439 double CorrectedMutualInformation< ALLOC >::__NI_score(
442 const std::vector<
NodeId, ALLOC< NodeId > >& vars_z) {
459 const IdSet< ALLOC > idset_xyz(var_x, var_y, vars_z,
false,
false);
462 return __ICache.score(idset_xyz);
463 }
catch (
const NotFound&) {}
471 if (!vars_z.empty()) {
472 std::vector< NodeId, ALLOC< NodeId > > vars(vars_z);
474 vars.push_back(var_x);
475 vars.push_back(var_y);
476 const double NHxyz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
479 const double NHxz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
482 vars.push_back(var_y);
483 const double NHyz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
486 const double NHz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
488 const double NHxz_NHyz = NHxz + NHyz;
489 double NHz_NHxyz = NHz + NHxyz;
494 ratio = (NHxz_NHyz - NHz_NHxyz) / NHxz_NHyz;
495 }
else if (NHz_NHxyz > 0) {
496 ratio = (NHxz_NHyz - NHz_NHxyz) / NHz_NHxyz;
498 if (ratio < 0) ratio = -ratio;
499 if (ratio < __threshold) {
500 NHz_NHxyz = NHxz_NHyz;
503 score = NHxz_NHyz - NHz_NHxyz;
505 const double NHxy = -__NH.score(
506 IdSet< ALLOC >(var_x, var_y, __empty_conditioning_set,
true,
false));
507 const double NHx = -__NH.score(var_x);
508 const double NHy = -__NH.score(var_y);
510 double NHx_NHy = NHx + NHy;
515 ratio = (NHx_NHy - NHxy) / NHx_NHy;
516 }
else if (NHxy > 0) {
517 ratio = (NHx_NHy - NHxy) / NHxy;
519 if (ratio < 0) ratio = -ratio;
520 if (ratio < __threshold) {
524 score = NHx_NHy - NHxy;
529 if (__use_ICache) { __ICache.insert(idset_xyz, score); }
536 template <
template <
typename >
class ALLOC >
537 INLINE
double CorrectedMutualInformation< ALLOC >::__NI_score(
541 const std::vector<
NodeId, ALLOC< NodeId > >& ui_ids) {
544 std::vector< NodeId, ALLOC< NodeId > > uiz_ids = ui_ids;
545 uiz_ids.push_back(var_z);
546 return __NI_score(var_x, var_y, ui_ids) - __NI_score(var_x, var_y, uiz_ids);
551 template <
template <
typename >
class ALLOC >
552 double CorrectedMutualInformation< ALLOC >::__K_score(
555 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
561 IdSet< ALLOC > idset;
563 idset = std::move(IdSet< ALLOC >(var1, var2, conditioning_ids,
false));
565 return __KCache.score(idset);
566 }
catch (
const NotFound&) {}
574 const auto& database = __NH.database();
575 const auto& node2cols = __NH.nodeId2Columns();
578 if (!node2cols.empty()) {
579 rx = database.domainSize(node2cols.second(var1));
580 ry = database.domainSize(node2cols.second(var2));
581 for (
const NodeId i : conditioning_ids) {
582 rui *= database.domainSize(node2cols.second(i));
585 rx = database.domainSize(var1);
586 ry = database.domainSize(var2);
587 for (
const NodeId i : conditioning_ids) {
588 rui *= database.domainSize(i);
594 idset = std::move(IdSet< ALLOC >(var1, var2, conditioning_ids,
false));
596 const double N = __score_MDL.N(idset);
598 score = 0.5 * (rx - 1) * (ry - 1) * rui * std::log2(N);
602 score = __k_NML.score(var1, var2, conditioning_ids);
607 "CorrectedMutualInformation mode does " 608 "not support yet this correction");
612 if (__use_KCache) { __KCache.insert(idset, score); }
618 template <
template <
typename >
class ALLOC >
619 INLINE
double CorrectedMutualInformation< ALLOC >::__K_score(
623 const std::vector<
NodeId, ALLOC< NodeId > >& ui_ids) {
625 std::vector< NodeId, ALLOC< NodeId > > uiz_ids = ui_ids;
626 uiz_ids.push_back(var3);
627 return __K_score(var1, var2, uiz_ids) - __K_score(var1, var2, ui_ids);
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Size NodeId
Type for node ids.
#define GUM_ERROR(type, msg)