29 #ifndef DOXYGEN_SHOULD_SKIP_THIS 39 template <
template <
typename >
class ALLOC >
41 const DBRowGeneratorParser< ALLOC >& parser,
42 const Apriori< ALLOC >& apriori,
43 const std::vector< std::pair< std::size_t, std::size_t >,
44 ALLOC< std::pair< std::size_t, std::size_t > > >& ranges,
45 const Bijection<
NodeId, std::size_t, ALLOC< std::size_t > >&
48 Score< ALLOC >(parser, apriori, ranges, nodeId2columns, alloc),
49 __internal_apriori(parser.database(), nodeId2columns) {
55 template <
template <
typename >
class ALLOC >
57 const DBRowGeneratorParser< ALLOC >& parser,
58 const Apriori< ALLOC >& apriori,
59 const Bijection<
NodeId, std::size_t, ALLOC< std::size_t > >&
62 Score< ALLOC >(parser, apriori, nodeId2columns, alloc),
63 __internal_apriori(parser.
database(), nodeId2columns) {
69 template <
template <
typename >
class ALLOC >
71 const ScoreK2< ALLOC >& from,
73 Score< ALLOC >(from, alloc),
74 __internal_apriori(from.__internal_apriori, alloc),
75 __gammalog2(from.__gammalog2) {
81 template <
template <
typename >
class ALLOC >
87 template <
template <
typename >
class ALLOC >
89 ScoreK2< ALLOC >&& from,
91 Score< ALLOC >(
std::move(from), alloc),
92 __internal_apriori(
std::move(from.__internal_apriori), alloc),
93 __gammalog2(
std::move(from.__gammalog2)) {
99 template <
template <
typename >
class ALLOC >
105 template <
template <
typename >
class ALLOC >
108 ALLOC< ScoreK2< ALLOC > > allocator(alloc);
109 ScoreK2< ALLOC >* new_score = allocator.allocate(1);
111 allocator.construct(new_score, *
this, alloc);
113 allocator.deallocate(new_score, 1);
122 template <
template <
typename >
class ALLOC >
129 template <
template <
typename >
class ALLOC >
136 template <
template <
typename >
class ALLOC >
140 __internal_apriori = from.__internal_apriori;
147 template <
template <
typename >
class ALLOC >
151 __internal_apriori = std::move(from.__internal_apriori);
158 template <
template <
typename >
class ALLOC >
166 return "The apriori is currently compatible with the K2 score but " 167 "if you change the weight, it will become incompatible.";
173 return "The K2 score already contains a different 'implicit' apriori. " 174 "Therefore, the learning will probably be biased.";
178 std::stringstream msg;
179 msg <<
"The apriori '" << apriori_type
180 <<
"' is not yet supported by method isAprioriCompatible os Score K2";
186 template <
template <
typename >
class ALLOC >
194 template <
template <
typename >
class ALLOC >
201 template <
template <
typename >
class ALLOC >
203 return __internal_apriori;
208 template <
template <
typename >
class ALLOC >
211 std::vector< double, ALLOC< double > > N_ijk(
212 this->
_counter.counts(idset,
true));
213 const std::size_t all_size = N_ijk.size();
214 const bool informative_external_apriori = this->
_apriori->isInformative();
219 if (idset.hasConditioningSet()) {
221 std::vector< double, ALLOC< double > > N_ij(
223 const std::size_t conditioning_size = N_ij.size();
224 const double ri =
double(all_size / conditioning_size);
226 if (informative_external_apriori) {
229 std::vector< double, ALLOC< double > > N_prime_ijk(all_size, 0.0);
230 this->
_apriori->addAllApriori(idset, N_prime_ijk);
231 std::vector< double, ALLOC< double > > N_prime_ij(N_ij.size(), 0.0);
232 this->
_apriori->addConditioningApriori(idset, N_prime_ij);
239 for (std::size_t j = std::size_t(0); j < conditioning_size; ++j) {
240 score += __gammalog2(N_prime_ij[j] + ri)
241 - __gammalog2(N_ij[j] + N_prime_ij[j] + ri);
243 for (std::size_t k = std::size_t(0); k < all_size; ++k) {
244 score += __gammalog2(N_ijk[k] + N_prime_ijk[k] + 1.0)
245 - __gammalog2(N_prime_ijk[k] + 1.0);
251 score = conditioning_size * __gammalog2(ri);
253 for (
const auto n_ij : N_ij) {
254 score -= __gammalog2(n_ij + ri);
256 for (
const auto n_ijk : N_ijk) {
257 score += __gammalog2(n_ijk + 1);
262 const double ri =
double(all_size);
264 if (informative_external_apriori) {
272 std::vector< double, ALLOC< double > > N_prime_ijk(all_size, 0.0);
273 this->
_apriori->addAllApriori(idset, N_prime_ijk);
277 double N_prime = 0.0;
278 for (std::size_t k = std::size_t(0); k < all_size; ++k) {
279 score += __gammalog2(N_ijk[k] + N_prime_ijk[k] + 1)
280 - __gammalog2(N_prime_ijk[k] + 1);
282 N_prime += N_prime_ijk[k];
284 score += __gammalog2(N_prime + ri) - __gammalog2(N + N_prime + ri);
288 score = __gammalog2(ri);
290 for (
const auto n_ijk : N_ijk) {
291 score += __gammalog2(n_ijk + 1);
294 score -= __gammalog2(N + ri);
const DatabaseTable< ALLOC > & database() const
return the database used by the score
double score(const NodeId var)
returns the score of a single node
static const std::string type
Score(const DBRowGeneratorParser< ALLOC > &parser, const Apriori< ALLOC > &external_apriori, const std::vector< std::pair< std::size_t, std::size_t >, ALLOC< std::pair< std::size_t, std::size_t > > > &ranges, const Bijection< NodeId, std::size_t, ALLOC< std::size_t > > &nodeId2columns=Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(), const allocator_type &alloc=allocator_type())
default constructor
static const std::string type
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
std::vector< double, ALLOC< double > > _marginalize(const NodeId X_id, const std::vector< double, ALLOC< double > > &N_xyz) const
returns a counting vector where variables are marginalized from N_xyz
ScoreK2< ALLOC > & operator=(const ScoreK2< ALLOC > &from)
copy operator
virtual ScoreK2< ALLOC > * clone() const
virtual copy constructor
ScoreK2(const DBRowGeneratorParser< ALLOC > &parser, const Apriori< ALLOC > &apriori, const std::vector< std::pair< std::size_t, std::size_t >, ALLOC< std::pair< std::size_t, std::size_t > > > &ranges, const Bijection< NodeId, std::size_t, ALLOC< std::size_t > > &nodeId2columns=Bijection< NodeId, std::size_t, ALLOC< std::size_t > >(), const allocator_type &alloc=allocator_type())
default constructor
Score< ALLOC > & operator=(const Score< ALLOC > &from)
copy operator
virtual const Apriori< ALLOC > & internalApriori() const final
returns the internal apriori of the score
virtual std::string isAprioriCompatible() const final
indicates whether the apriori is compatible (meaningful) with the score
virtual double _score(const IdSet< ALLOC > &idset) final
returns the score for a given IdSet
allocator_type getAllocator() const
returns the allocator used by the score
virtual ~ScoreK2()
destructor
Apriori< ALLOC > * _apriori
the expert knowledge a priori we add to the score
static const std::string type
RecordCounter< ALLOC > _counter
the record counter used for the countings over discrete variables
Size NodeId
Type for node ids.
ALLOC< NodeId > allocator_type
type for the allocators passed in arguments of methods