51#ifndef DOXYGEN_SHOULD_SKIP_THIS
66 const Bijection< NodeId, std::size_t >& nodeId2columns) :
67 Prior(prior_parser.database(), Bijection<
NodeId, std::size_t >()),
68 _counter_(prior_parser,
69 std::vector< std::pair< std::size_t, std::size_t > >(),
73 const DatabaseTable& prior_db = prior_parser.database();
74 const auto& prior_names = prior_db.variableNames();
75 const std::size_t prior_size = prior_names.size();
76 HashTable< std::string, std::size_t > names2col(prior_size);
77 for (std::size_t i = std::size_t(0); i < prior_size; ++i)
78 names2col.insert(prior_names[i], i);
80 const auto& learning_names = learning_db.variableNames();
81 const std::size_t learning_size = learning_names.size();
82 HashTable< std::size_t, std::size_t > learning2prior_index(learning_size);
83 bool different_index =
false;
84 for (
auto i = std::size_t(0); i < learning_size; ++i) {
86 std::size_t prior_col;
88 prior_col = names2col[learning_names[i]];
91 "Variable " << learning_names[i]
92 <<
" could not be found in the prior database");
96 const Variable& learning_var = learning_db.variable(i);
97 const Variable& prior_var = prior_db.variable(prior_col);
98 if (learning_var.varType() != prior_var.varType()) {
100 "Variable " << learning_names[i]
101 <<
" has not the same type in the learning database "
102 " and the prior database");
104 if (learning_var.domain() != prior_var.domain()) {
106 "Variable " << learning_names[i] <<
" has domain " << learning_var.domain()
107 <<
" in the learning database and domain " << prior_var.domain()
108 <<
" in the aprioi database");
112 learning2prior_index.insert(i, prior_col);
113 if (i != prior_col) different_index =
true;
119 if (!different_index) {
120 this->nodeId2columns_ = nodeId2columns;
122 if (nodeId2columns.empty()) {
123 for (
auto i = std::size_t(0); i < learning_size; ++i) {
124 this->nodeId2columns_.insert(NodeId(i), learning2prior_index[i]);
127 for (
auto iter = nodeId2columns.begin(); iter != nodeId2columns.end(); ++iter) {
128 this->nodeId2columns_.insert(iter.first(), learning2prior_index[iter.second()]);
134 std::vector< std::pair< std::size_t, std::size_t > > ranges;
135 RecordCounter good_counter(prior_parser, ranges, this->nodeId2columns_);
136 _counter_ = std::move(good_counter);
138 if (prior_db.nbRows() == std::size_t(0)) _internal_weight_ = 0.0;
139 else _internal_weight_ = this->weight_ /
double(prior_db.nbRows());
141 GUM_CONSTRUCTOR(DirichletPriorFromDatabase);
A dirichlet priori: computes its N'_ijk from a database.
A dirichlet priori: computes its N'_ijk from a database.
Error: An unknown error occurred while accessing a database.
the class used to read a row in the database and to transform it into a set of DBRow instances that c...
The class representing a tabular database as used by learning tasks.
DirichletPriorFromDatabase(const DatabaseTable &learning_db, const DBRowGeneratorParser &prior_parser, const Bijection< NodeId, std::size_t > &nodeId2columns=Bijection< NodeId, std::size_t >())
default constructor
the base class for all a priori
#define GUM_ERROR(type, msg)
Size NodeId
Type for node ids.
include the inlined functions if necessary
gum is the global namespace for all aGrUM entities