use denominators to compute the correct index in ComputeSparseTable
parent
3fca55acc3
commit
ff93c8be29
|
@ -89,6 +89,14 @@ static Eigen::SparseVector<double> ComputeSparseTable(
|
||||||
|
|
||||||
KeySet allKeys(dt.keys().begin(), dt.keys().end());
|
KeySet allKeys(dt.keys().begin(), dt.keys().end());
|
||||||
|
|
||||||
|
// Compute denominators to be used in computing sparse table indices
|
||||||
|
std::map<Key, size_t> denominators;
|
||||||
|
double denom = sparseTable.size();
|
||||||
|
for (const DiscreteKey& dkey : dkeys) {
|
||||||
|
denom /= dkey.second;
|
||||||
|
denominators.insert(std::pair<Key, double>(dkey.first, denom));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Functor which is called by the DecisionTree for each leaf.
|
* @brief Functor which is called by the DecisionTree for each leaf.
|
||||||
* For each leaf value, we use the corresponding assignment to compute a
|
* For each leaf value, we use the corresponding assignment to compute a
|
||||||
|
@ -127,12 +135,10 @@ static Eigen::SparseVector<double> ComputeSparseTable(
|
||||||
|
|
||||||
// Generate index and add to the sparse vector.
|
// Generate index and add to the sparse vector.
|
||||||
Eigen::Index idx = 0;
|
Eigen::Index idx = 0;
|
||||||
size_t previousCardinality = 1;
|
|
||||||
// We go in reverse since a DecisionTree has the highest label first
|
// We go in reverse since a DecisionTree has the highest label first
|
||||||
for (auto&& it = updatedAssignment.rbegin();
|
for (auto&& it = updatedAssignment.rbegin();
|
||||||
it != updatedAssignment.rend(); it++) {
|
it != updatedAssignment.rend(); it++) {
|
||||||
idx += previousCardinality * it->second;
|
idx += it->second * denominators.at(it->first);
|
||||||
previousCardinality *= dt.cardinality(it->first);
|
|
||||||
}
|
}
|
||||||
sparseTable.coeffRef(idx) = p;
|
sparseTable.coeffRef(idx) = p;
|
||||||
}
|
}
|
||||||
|
@ -252,9 +258,9 @@ DecisionTreeFactor TableFactor::operator*(const DecisionTreeFactor& f) const {
|
||||||
DecisionTreeFactor TableFactor::toDecisionTreeFactor() const {
|
DecisionTreeFactor TableFactor::toDecisionTreeFactor() const {
|
||||||
DiscreteKeys dkeys = discreteKeys();
|
DiscreteKeys dkeys = discreteKeys();
|
||||||
|
|
||||||
std::vector<double> table;
|
std::vector<double> table(sparse_table_.size(), 0.0);
|
||||||
for (auto i = 0; i < sparse_table_.size(); i++) {
|
for (SparseIt it(sparse_table_); it; ++it) {
|
||||||
table.push_back(sparse_table_.coeff(i));
|
table[it.index()] = it.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
AlgebraicDecisionTree<Key> tree(dkeys, table);
|
AlgebraicDecisionTree<Key> tree(dkeys, table);
|
||||||
|
|
Loading…
Reference in New Issue