28 #ifndef DOXYGEN_SHOULD_SKIP_THIS 30 # include <agrum/BN/learning/scores_and_tests/scoreLog2Likelihood.h> 38 template <
template <
typename >
class ALLOC >
39 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
40 const DBRowGeneratorParser< ALLOC >& parser,
41 const Apriori< ALLOC >& apriori,
42 const std::vector< std::pair< std::size_t, std::size_t >,
43 ALLOC< std::pair< std::size_t, std::size_t > > >& ranges,
44 const Bijection< NodeId, std::size_t, ALLOC< std::size_t > >&
46 const typename ScoreLog2Likelihood< ALLOC >::allocator_type& alloc) :
47 Score< ALLOC >(parser, apriori, ranges, nodeId2columns, alloc),
48 internal_apriori__(parser.database(), nodeId2columns) {
49 GUM_CONSTRUCTOR(ScoreLog2Likelihood);
54 template <
template <
typename >
class ALLOC >
55 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
56 const DBRowGeneratorParser< ALLOC >& parser,
57 const Apriori< ALLOC >& apriori,
58 const Bijection< NodeId, std::size_t, ALLOC< std::size_t > >&
60 const typename ScoreLog2Likelihood< ALLOC >::allocator_type& alloc) :
61 Score< ALLOC >(parser, apriori, nodeId2columns, alloc),
62 internal_apriori__(parser.database(), nodeId2columns) {
63 GUM_CONSTRUCTOR(ScoreLog2Likelihood);
68 template <
template <
typename >
class ALLOC >
69 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
70 const ScoreLog2Likelihood< ALLOC >& from,
71 const typename ScoreLog2Likelihood< ALLOC >::allocator_type& alloc) :
72 Score< ALLOC >(from, alloc),
73 internal_apriori__(from.internal_apriori__, alloc) {
74 GUM_CONS_CPY(ScoreLog2Likelihood);
79 template <
template <
typename >
class ALLOC >
80 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
81 const ScoreLog2Likelihood< ALLOC >& from) :
82 ScoreLog2Likelihood< ALLOC >(from, from.getAllocator()) {}
86 template <
template <
typename >
class ALLOC >
87 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
88 ScoreLog2Likelihood< ALLOC >&& from,
89 const typename ScoreLog2Likelihood< ALLOC >::allocator_type& alloc) :
90 Score< ALLOC >(std::move(from), alloc),
91 internal_apriori__(std::move(from.internal_apriori__), alloc) {
92 GUM_CONS_MOV(ScoreLog2Likelihood);
97 template <
template <
typename >
class ALLOC >
98 INLINE ScoreLog2Likelihood< ALLOC >::ScoreLog2Likelihood(
99 ScoreLog2Likelihood< ALLOC >&& from) :
100 ScoreLog2Likelihood< ALLOC >(std::move(from), from.getAllocator()) {}
104 template <
template <
typename >
class ALLOC >
105 ScoreLog2Likelihood< ALLOC >* ScoreLog2Likelihood< ALLOC >::clone(
106 const typename ScoreLog2Likelihood< ALLOC >::allocator_type& alloc)
const {
107 ALLOC< ScoreLog2Likelihood< ALLOC > > allocator(alloc);
108 ScoreLog2Likelihood< ALLOC >* new_score = allocator.allocate(1);
110 allocator.construct(new_score, *
this, alloc);
112 allocator.deallocate(new_score, 1);
121 template <
template <
typename >
class ALLOC >
122 ScoreLog2Likelihood< ALLOC >* ScoreLog2Likelihood< ALLOC >::clone()
const {
123 return clone(
this->getAllocator());
128 template <
template <
typename >
class ALLOC >
129 ScoreLog2Likelihood< ALLOC >::~ScoreLog2Likelihood() {
130 GUM_DESTRUCTOR(ScoreLog2Likelihood);
135 template <
template <
typename >
class ALLOC >
136 ScoreLog2Likelihood< ALLOC >& ScoreLog2Likelihood< ALLOC >::operator=(
137 const ScoreLog2Likelihood< ALLOC >& from) {
139 Score< ALLOC >::operator=(from);
140 internal_apriori__ = from.internal_apriori__;
147 template <
template <
typename >
class ALLOC >
148 ScoreLog2Likelihood< ALLOC >& ScoreLog2Likelihood< ALLOC >::operator=(
149 ScoreLog2Likelihood< ALLOC >&& from) {
151 Score< ALLOC >::operator=(std::move(from));
152 internal_apriori__ = std::move(from.internal_apriori__);
159 template <
template <
typename >
class ALLOC >
160 std::string ScoreLog2Likelihood< ALLOC >::isAprioriCompatible(
161 const std::string& apriori_type,
164 if ((apriori_type == AprioriDirichletType::type)
165 || (apriori_type == AprioriSmoothingType::type)
166 || (apriori_type == AprioriNoAprioriType::type)) {
171 std::stringstream msg;
172 msg <<
"The apriori '" << apriori_type
173 <<
"' is not yet supported by method isAprioriCompatible of " 174 <<
"Score Log2Likelihood";
180 template <
template <
typename >
class ALLOC >
181 INLINE std::string ScoreLog2Likelihood< ALLOC >::isAprioriCompatible(
182 const Apriori< ALLOC >& apriori) {
183 return isAprioriCompatible(apriori.getType(), apriori.weight());
188 template <
template <
typename >
class ALLOC >
189 INLINE std::string ScoreLog2Likelihood< ALLOC >::isAprioriCompatible()
const {
190 return isAprioriCompatible(*(
this->apriori_));
195 template <
template <
typename >
class ALLOC >
196 INLINE
const Apriori< ALLOC >&
197 ScoreLog2Likelihood< ALLOC >::internalApriori()
const {
198 return internal_apriori__;
203 template <
template <
typename >
class ALLOC >
204 double ScoreLog2Likelihood< ALLOC >::score_(
const IdCondSet< ALLOC >& idset) {
206 std::vector<
double, ALLOC<
double > > N_ijk(
207 this->counter_.counts(idset,
true));
208 const bool informative_external_apriori =
this->apriori_->isInformative();
209 if (informative_external_apriori)
210 this->apriori_->addAllApriori(idset, N_ijk);
214 if (idset.hasConditioningSet()) {
216 std::vector<
double, ALLOC<
double > > N_ij(
217 this->marginalize_(idset[0], N_ijk));
224 for (
const auto n_ijk: N_ijk) {
225 if (n_ijk) { score += n_ijk * std::log(n_ijk); }
227 for (
const auto n_ij: N_ij) {
228 if (n_ij) { score -= n_ij * std::log(n_ij); }
232 score *=
this->one_log2_;
244 for (
const auto n_ijk: N_ijk) {
246 score += n_ijk * std::log(n_ijk);
250 score -= N * std::log(N);
253 score *=
this->one_log2_;
261 template <
template <
typename >
class ALLOC >
263 ScoreLog2Likelihood< ALLOC >::score(
const IdCondSet< ALLOC >& idset) {
264 return score_(idset);