51#ifndef DOXYGEN_SHOULD_SKIP_THIS
68 const std::vector< std::pair< std::size_t, std::size_t > >& ranges,
69 const Bijection< NodeId, std::size_t >& nodeId2columns) :
70 Score(parser, prior, ranges, nodeId2columns),
71 _internal_prior_(parser.database(), nodeId2columns) {
72 GUM_CONSTRUCTOR(ScoreBD);
76 ScoreBD::ScoreBD(
const DBRowGeneratorParser& parser,
78 const Bijection< NodeId, std::size_t >& nodeId2columns) :
79 Score(parser, prior, nodeId2columns), _internal_prior_(parser.database(), nodeId2columns) {
80 GUM_CONSTRUCTOR(ScoreBD);
84 ScoreBD::ScoreBD(
const ScoreBD& from) :
85 Score(from), _internal_prior_(from._internal_prior_), _gammalog2_(from._gammalog2_) {
86 GUM_CONS_CPY(ScoreBD);
90 ScoreBD::ScoreBD(ScoreBD&& from) :
91 Score(
std::move(from)), _internal_prior_(
std::move(from._internal_prior_)),
92 _gammalog2_(
std::move(from._gammalog2_)) {
93 GUM_CONS_MOV(ScoreBD);
97 ScoreBD::~ScoreBD() { GUM_DESTRUCTOR(ScoreBD); }
100 ScoreBD& ScoreBD::operator=(
const ScoreBD& from) {
102 Score::operator=(from);
103 _internal_prior_ = from._internal_prior_;
109 ScoreBD& ScoreBD::operator=(ScoreBD&& from) {
111 Score::operator=(std::move(from));
112 _internal_prior_ = std::move(from._internal_prior_);
118 std::string ScoreBD::isPriorCompatible(PriorType prior_type,
double weight) {
119 if (prior_type == PriorType::NoPriorType) {
return "The BD score requires an prior"; }
122 return "The prior is currently compatible with the BD score but if "
123 "you change the weight, it may become biased";
127 return std::format(
"The prior '{}' is not yet compatible with the score 'BD'.",
132 double ScoreBD::score_(
const IdCondSet& idset) {
134 if (!this->prior_->isInformative()) {
136 "The BD score requires its external prior to " <<
"be strictly positive");
140 std::vector< double > N_ijk(this->counter_.counts(idset,
true));
141 const std::size_t all_size = N_ijk.size();
142 std::vector< double > N_prime_ijk(all_size, 0.0);
143 this->prior_->addJointPseudoCount(idset, N_prime_ijk);
149 if (idset.hasConditioningSet()) {
151 std::vector< double > N_ij(this->marginalize_(idset[0], N_ijk));
152 const std::size_t conditioning_size = N_ij.size();
154 std::vector< double > N_prime_ij(N_ij.size(), 0.0);
155 this->prior_->addConditioningPseudoCount(idset, N_prime_ij);
161 for (std::size_t j = std::size_t(0); j < conditioning_size; ++j) {
162 score += _gammalog2_(N_prime_ij[j]) - _gammalog2_(N_ij[j] + N_prime_ij[j]);
164 for (std::size_t k = std::size_t(0); k < all_size; ++k) {
165 score += _gammalog2_(N_ijk[k] + N_prime_ijk[k]) - _gammalog2_(N_prime_ijk[k]);
172 double N_prime = 0.0;
173 for (std::size_t k = std::size_t(0); k < all_size; ++k) {
174 score += _gammalog2_(N_ijk[k] + N_prime_ijk[k]) - _gammalog2_(N_prime_ijk[k]);
176 N_prime += N_prime_ijk[k];
178 score += _gammalog2_(N_prime) - _gammalog2_(N + N_prime);
Exception : out of bound.
the class used to read a row in the database and to transform it into a set of DBRow instances that c...
the base class for all a priori
ScoreBD(const DBRowGeneratorParser &parser, const Prior &prior, const std::vector< std::pair< std::size_t, std::size_t > > &ranges, const Bijection< NodeId, std::size_t > &nodeId2columns=Bijection< NodeId, std::size_t >())
default constructor
The base class for all the scores used for learning (BIC, BDeu, etc).
#define GUM_ERROR(type, msg)
include the inlined functions if necessary
constexpr const char * priorTypeToString(PriorType e) noexcept
gum is the global namespace for all aGrUM entities
the class for computing Bayesian Dirichlet (BD) log2 scores
the class for computing BD scores