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 >
160 CorrectedMutualInformation< ALLOC >&
162 const CorrectedMutualInformation< ALLOC >& from) {
165 __k_NML = from.__k_NML;
166 __score_MDL = from.__score_MDL;
167 __kmode = from.__kmode;
168 __use_ICache = from.__use_ICache;
169 __use_HCache = from.__use_HCache;
170 __use_KCache = from.__use_KCache;
171 __use_CnrCache = from.__use_CnrCache;
172 __ICache = from.__ICache;
173 __KCache = from.__KCache;
180 template <
template <
typename >
class ALLOC >
181 CorrectedMutualInformation< ALLOC >&
183 CorrectedMutualInformation< ALLOC >&& from) {
185 __NH = std::move(from.__NH);
186 __k_NML = std::move(from.__k_NML);
187 __score_MDL = std::move(from.__score_MDL);
188 __kmode = from.__kmode;
189 __use_ICache = from.__use_ICache;
190 __use_HCache = from.__use_HCache;
191 __use_KCache = from.__use_KCache;
192 __use_CnrCache = from.__use_CnrCache;
193 __ICache = std::move(from.__ICache);
194 __KCache = std::move(from.__KCache);
201 template <
template <
typename >
class ALLOC >
211 template <
template <
typename >
class ALLOC >
213 if (!on_off) __ICache.clear();
214 __use_ICache = on_off;
219 template <
template <
typename >
class ALLOC >
221 if (!on_off) __NH.clearCache();
222 __use_HCache = on_off;
223 __NH.useCache(on_off);
228 template <
template <
typename >
class ALLOC >
230 if (!on_off) __KCache.clear();
231 __use_KCache = on_off;
236 template <
template <
typename >
class ALLOC >
238 if (!on_off) __k_NML.clearCache();
239 __use_CnrCache = on_off;
240 __k_NML.useCache(on_off);
245 template <
template <
typename >
class ALLOC >
255 template <
template <
typename >
class ALLOC >
258 __k_NML.clearCache();
265 template <
template <
typename >
class ALLOC >
272 template <
template <
typename >
class ALLOC >
279 template <
template <
typename >
class ALLOC >
286 template <
template <
typename >
class ALLOC >
288 __k_NML.clearCache();
293 template <
template <
typename >
class ALLOC >
296 __NH.setMaxNbThreads(nb);
297 __k_NML.setMaxNbThreads(nb);
298 __score_MDL.setMaxNbThreads(nb);
303 template <
template <
typename >
class ALLOC >
305 return __NH.nbThreads();
311 template <
template <
typename >
class ALLOC >
313 const std::size_t nb)
const {
314 __NH.setMinNbRowsPerThread(nb);
315 __k_NML.setMinNbRowsPerThread(nb);
316 __score_MDL.setMinNbRowsPerThread(nb);
321 template <
template <
typename >
class ALLOC >
324 return __NH.minNbRowsPerThread();
335 template <
template <
typename >
class ALLOC >
336 template <
template <
typename >
class XALLOC >
338 const std::vector< std::pair< std::size_t, std::size_t >,
339 XALLOC< std::pair< std::size_t, std::size_t > > >&
341 std::vector< std::pair< std::size_t, std::size_t >,
342 ALLOC< std::pair< std::size_t, std::size_t > > >
345 __NH.setRanges(new_ranges);
346 __k_NML.setRanges(new_ranges);
347 __score_MDL.setRanges(new_ranges);
354 template <
template <
typename >
class ALLOC >
356 std::vector< std::pair< std::size_t, std::size_t >,
357 ALLOC< std::pair< std::size_t, std::size_t > > >
360 __k_NML.clearRanges();
361 __score_MDL.clearRanges();
367 template <
template <
typename >
class ALLOC >
368 INLINE
const std::vector< std::pair< std::size_t, std::size_t >,
369 ALLOC< std::pair< std::size_t, std::size_t > > >&
371 return __NH.ranges();
376 template <
template <
typename >
class ALLOC >
384 template <
template <
typename >
class ALLOC >
392 template <
template <
typename >
class ALLOC >
400 template <
template <
typename >
class ALLOC >
403 return score(var1, var2, __empty_conditioning_set);
408 template <
template <
typename >
class ALLOC >
412 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
413 return __NI_score(var1, var2, conditioning_ids)
414 - __K_score(var1, var2, conditioning_ids);
419 template <
template <
typename >
class ALLOC >
423 return score(var1, var2, var3, __empty_conditioning_set);
428 template <
template <
typename >
class ALLOC >
433 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
434 return __NI_score(var1, var2, var3, conditioning_ids)
435 + __K_score(var1, var2, var3, conditioning_ids);
440 template <
template <
typename >
class ALLOC >
441 double CorrectedMutualInformation< ALLOC >::__NI_score(
444 const std::vector<
NodeId, ALLOC< NodeId > >& vars_z) {
461 const IdSet< ALLOC > idset_xyz(var_x, var_y, vars_z,
false,
false);
464 return __ICache.score(idset_xyz);
465 }
catch (
const NotFound&) {}
473 if (!vars_z.empty()) {
474 std::vector< NodeId, ALLOC< NodeId > > vars(vars_z);
476 vars.push_back(var_x);
477 vars.push_back(var_y);
478 const double NHxyz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
481 const double NHxz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
484 vars.push_back(var_y);
485 const double NHyz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
488 const double NHz = -__NH.score(IdSet< ALLOC >(vars,
false,
true));
490 const double NHxz_NHyz = NHxz + NHyz;
491 double NHz_NHxyz = NHz + NHxyz;
496 ratio = (NHxz_NHyz - NHz_NHxyz) / NHxz_NHyz;
497 }
else if (NHz_NHxyz > 0) {
498 ratio = (NHxz_NHyz - NHz_NHxyz) / NHz_NHxyz;
500 if (ratio < 0) ratio = -ratio;
501 if (ratio < __threshold) {
502 NHz_NHxyz = NHxz_NHyz;
505 score = NHxz_NHyz - NHz_NHxyz;
507 const double NHxy = -__NH.score(
508 IdSet< ALLOC >(var_x, var_y, __empty_conditioning_set,
true,
false));
509 const double NHx = -__NH.score(var_x);
510 const double NHy = -__NH.score(var_y);
512 double NHx_NHy = NHx + NHy;
517 ratio = (NHx_NHy - NHxy) / NHx_NHy;
518 }
else if (NHxy > 0) {
519 ratio = (NHx_NHy - NHxy) / NHxy;
521 if (ratio < 0) ratio = -ratio;
522 if (ratio < __threshold) {
526 score = NHx_NHy - NHxy;
531 if (__use_ICache) { __ICache.insert(idset_xyz, score); }
538 template <
template <
typename >
class ALLOC >
539 INLINE
double CorrectedMutualInformation< ALLOC >::__NI_score(
543 const std::vector<
NodeId, ALLOC< NodeId > >& ui_ids) {
546 std::vector< NodeId, ALLOC< NodeId > > uiz_ids = ui_ids;
547 uiz_ids.push_back(var_z);
548 return __NI_score(var_x, var_y, ui_ids) - __NI_score(var_x, var_y, uiz_ids);
553 template <
template <
typename >
class ALLOC >
554 double CorrectedMutualInformation< ALLOC >::__K_score(
557 const std::vector<
NodeId, ALLOC< NodeId > >& conditioning_ids) {
563 IdSet< ALLOC > idset;
565 idset = std::move(IdSet< ALLOC >(var1, var2, conditioning_ids,
false));
567 return __KCache.score(idset);
568 }
catch (
const NotFound&) {}
576 const auto& database = __NH.database();
577 const auto& node2cols = __NH.nodeId2Columns();
580 if (!node2cols.empty()) {
581 rx = database.domainSize(node2cols.second(var1));
582 ry = database.domainSize(node2cols.second(var2));
583 for (
const NodeId i: conditioning_ids) {
584 rui *= database.domainSize(node2cols.second(i));
587 rx = database.domainSize(var1);
588 ry = database.domainSize(var2);
589 for (
const NodeId i: conditioning_ids) {
590 rui *= database.domainSize(i);
596 idset = std::move(IdSet< ALLOC >(var1, var2, conditioning_ids,
false));
598 const double N = __score_MDL.N(idset);
600 score = 0.5 * (rx - 1) * (ry - 1) * rui * std::log2(N);
604 score = __k_NML.score(var1, var2, conditioning_ids);
609 "CorrectedMutualInformation mode does " 610 "not support yet this correction");
614 if (__use_KCache) { __KCache.insert(idset, score); }
620 template <
template <
typename >
class ALLOC >
621 INLINE
double CorrectedMutualInformation< ALLOC >::__K_score(
625 const std::vector<
NodeId, ALLOC< NodeId > >& ui_ids) {
627 std::vector< NodeId, ALLOC< NodeId > > uiz_ids = ui_ids;
628 uiz_ids.push_back(var3);
629 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)