linting
parent
94c692ddd1
commit
ca329daa13
|
|
@ -17,9 +17,9 @@
|
||||||
* @author Frank Dellaert
|
* @author Frank Dellaert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <gtsam/base/FastSet.h>
|
||||||
#include <gtsam/discrete/DecisionTreeFactor.h>
|
#include <gtsam/discrete/DecisionTreeFactor.h>
|
||||||
#include <gtsam/discrete/DiscreteConditional.h>
|
#include <gtsam/discrete/DiscreteConditional.h>
|
||||||
#include <gtsam/base/FastSet.h>
|
|
||||||
|
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
@ -29,42 +29,42 @@ using namespace std;
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
/* ******************************************************************************** */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::DecisionTreeFactor() {
|
DecisionTreeFactor::DecisionTreeFactor() {}
|
||||||
}
|
|
||||||
|
|
||||||
/* ******************************************************************************** */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys& keys,
|
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys& keys,
|
||||||
const ADT& potentials) :
|
const ADT& potentials)
|
||||||
DiscreteFactor(keys.indices()), ADT(potentials),
|
: DiscreteFactor(keys.indices()),
|
||||||
cardinalities_(keys.cardinalities()) {
|
ADT(potentials),
|
||||||
}
|
cardinalities_(keys.cardinalities()) {}
|
||||||
|
|
||||||
/* *************************************************************************/
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::DecisionTreeFactor(const DiscreteConditional& c) :
|
DecisionTreeFactor::DecisionTreeFactor(const DiscreteConditional& c)
|
||||||
DiscreteFactor(c.keys()), AlgebraicDecisionTree<Key>(c), cardinalities_(c.cardinalities_) {
|
: DiscreteFactor(c.keys()),
|
||||||
}
|
AlgebraicDecisionTree<Key>(c),
|
||||||
|
cardinalities_(c.cardinalities_) {}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
bool DecisionTreeFactor::equals(const DiscreteFactor& other, double tol) const {
|
bool DecisionTreeFactor::equals(const DiscreteFactor& other,
|
||||||
if(!dynamic_cast<const DecisionTreeFactor*>(&other)) {
|
double tol) const {
|
||||||
|
if (!dynamic_cast<const DecisionTreeFactor*>(&other)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
const auto& f(static_cast<const DecisionTreeFactor&>(other));
|
const auto& f(static_cast<const DecisionTreeFactor&>(other));
|
||||||
return ADT::equals(f, tol);
|
return ADT::equals(f, tol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
double DecisionTreeFactor::safe_div(const double &a, const double &b) {
|
double DecisionTreeFactor::safe_div(const double& a, const double& b) {
|
||||||
// The use for safe_div is when we divide the product factor by the sum
|
// The use for safe_div is when we divide the product factor by the sum
|
||||||
// factor. If the product or sum is zero, we accord zero probability to the
|
// factor. If the product or sum is zero, we accord zero probability to the
|
||||||
// event.
|
// event.
|
||||||
return (a == 0 || b == 0) ? 0 : (a / b);
|
return (a == 0 || b == 0) ? 0 : (a / b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
void DecisionTreeFactor::print(const string& s,
|
void DecisionTreeFactor::print(const string& s,
|
||||||
const KeyFormatter& formatter) const {
|
const KeyFormatter& formatter) const {
|
||||||
cout << s;
|
cout << s;
|
||||||
|
|
@ -75,31 +75,32 @@ namespace gtsam {
|
||||||
ADT::print("", formatter);
|
ADT::print("", formatter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor DecisionTreeFactor::apply(const DecisionTreeFactor& f,
|
DecisionTreeFactor DecisionTreeFactor::apply(const DecisionTreeFactor& f,
|
||||||
ADT::Binary op) const {
|
ADT::Binary op) const {
|
||||||
map<Key,size_t> cs; // new cardinalities
|
map<Key, size_t> cs; // new cardinalities
|
||||||
// make unique key-cardinality map
|
// make unique key-cardinality map
|
||||||
for(Key j: keys()) cs[j] = cardinality(j);
|
for (Key j : keys()) cs[j] = cardinality(j);
|
||||||
for(Key j: f.keys()) cs[j] = f.cardinality(j);
|
for (Key j : f.keys()) cs[j] = f.cardinality(j);
|
||||||
// Convert map into keys
|
// Convert map into keys
|
||||||
DiscreteKeys keys;
|
DiscreteKeys keys;
|
||||||
for(const std::pair<const Key,size_t>& key: cs)
|
for (const std::pair<const Key, size_t>& key : cs) keys.push_back(key);
|
||||||
keys.push_back(key);
|
|
||||||
// apply operand
|
// apply operand
|
||||||
ADT result = ADT::apply(f, op);
|
ADT result = ADT::apply(f, op);
|
||||||
// Make a new factor
|
// Make a new factor
|
||||||
return DecisionTreeFactor(keys, result);
|
return DecisionTreeFactor(keys, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::shared_ptr DecisionTreeFactor::combine(size_t nrFrontals,
|
DecisionTreeFactor::shared_ptr DecisionTreeFactor::combine(
|
||||||
ADT::Binary op) const {
|
size_t nrFrontals, ADT::Binary op) const {
|
||||||
|
if (nrFrontals > size())
|
||||||
if (nrFrontals > size()) throw invalid_argument(
|
throw invalid_argument(
|
||||||
(boost::format(
|
(boost::format(
|
||||||
"DecisionTreeFactor::combine: invalid number of frontal keys %d, nr.keys=%d")
|
"DecisionTreeFactor::combine: invalid number of frontal "
|
||||||
% nrFrontals % size()).str());
|
"keys %d, nr.keys=%d") %
|
||||||
|
nrFrontals % size())
|
||||||
|
.str());
|
||||||
|
|
||||||
// sum over nrFrontals keys
|
// sum over nrFrontals keys
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
@ -113,20 +114,21 @@ namespace gtsam {
|
||||||
DiscreteKeys dkeys;
|
DiscreteKeys dkeys;
|
||||||
for (; i < keys().size(); i++) {
|
for (; i < keys().size(); i++) {
|
||||||
Key j = keys()[i];
|
Key j = keys()[i];
|
||||||
dkeys.push_back(DiscreteKey(j,cardinality(j)));
|
dkeys.push_back(DiscreteKey(j, cardinality(j)));
|
||||||
}
|
}
|
||||||
return boost::make_shared<DecisionTreeFactor>(dkeys, result);
|
return boost::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************ */
|
||||||
/* ************************************************************************* */
|
DecisionTreeFactor::shared_ptr DecisionTreeFactor::combine(
|
||||||
DecisionTreeFactor::shared_ptr DecisionTreeFactor::combine(const Ordering& frontalKeys,
|
const Ordering& frontalKeys, ADT::Binary op) const {
|
||||||
ADT::Binary op) const {
|
if (frontalKeys.size() > size())
|
||||||
|
throw invalid_argument(
|
||||||
if (frontalKeys.size() > size()) throw invalid_argument(
|
(boost::format(
|
||||||
(boost::format(
|
"DecisionTreeFactor::combine: invalid number of frontal "
|
||||||
"DecisionTreeFactor::combine: invalid number of frontal keys %d, nr.keys=%d")
|
"keys %d, nr.keys=%d") %
|
||||||
% frontalKeys.size() % size()).str());
|
frontalKeys.size() % size())
|
||||||
|
.str());
|
||||||
|
|
||||||
// sum over nrFrontals keys
|
// sum over nrFrontals keys
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
@ -137,20 +139,22 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new factor, note we collect keys that are not in frontalKeys
|
// create new factor, note we collect keys that are not in frontalKeys
|
||||||
// TODO: why do we need this??? result should contain correct keys!!!
|
// TODO(frank): why do we need this??? result should contain correct keys!!!
|
||||||
DiscreteKeys dkeys;
|
DiscreteKeys dkeys;
|
||||||
for (i = 0; i < keys().size(); i++) {
|
for (i = 0; i < keys().size(); i++) {
|
||||||
Key j = keys()[i];
|
Key j = keys()[i];
|
||||||
// TODO: inefficient!
|
// TODO(frank): inefficient!
|
||||||
if (std::find(frontalKeys.begin(), frontalKeys.end(), j) != frontalKeys.end())
|
if (std::find(frontalKeys.begin(), frontalKeys.end(), j) !=
|
||||||
|
frontalKeys.end())
|
||||||
continue;
|
continue;
|
||||||
dkeys.push_back(DiscreteKey(j,cardinality(j)));
|
dkeys.push_back(DiscreteKey(j, cardinality(j)));
|
||||||
}
|
}
|
||||||
return boost::make_shared<DecisionTreeFactor>(dkeys, result);
|
return boost::make_shared<DecisionTreeFactor>(dkeys, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
std::vector<std::pair<DiscreteValues, double>> DecisionTreeFactor::enumerate() const {
|
std::vector<std::pair<DiscreteValues, double>> DecisionTreeFactor::enumerate()
|
||||||
|
const {
|
||||||
// Get all possible assignments
|
// Get all possible assignments
|
||||||
std::vector<std::pair<Key, size_t>> pairs;
|
std::vector<std::pair<Key, size_t>> pairs;
|
||||||
for (auto& key : keys()) {
|
for (auto& key : keys()) {
|
||||||
|
|
@ -168,7 +172,7 @@ namespace gtsam {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
DiscreteKeys DecisionTreeFactor::discreteKeys() const {
|
DiscreteKeys DecisionTreeFactor::discreteKeys() const {
|
||||||
DiscreteKeys result;
|
DiscreteKeys result;
|
||||||
for (auto&& key : keys()) {
|
for (auto&& key : keys()) {
|
||||||
|
|
@ -180,7 +184,7 @@ namespace gtsam {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
static std::string valueFormatter(const double& v) {
|
static std::string valueFormatter(const double& v) {
|
||||||
return (boost::format("%4.2g") % v).str();
|
return (boost::format("%4.2g") % v).str();
|
||||||
}
|
}
|
||||||
|
|
@ -194,8 +198,8 @@ namespace gtsam {
|
||||||
|
|
||||||
/** output to graphviz format, open a file */
|
/** output to graphviz format, open a file */
|
||||||
void DecisionTreeFactor::dot(const std::string& name,
|
void DecisionTreeFactor::dot(const std::string& name,
|
||||||
const KeyFormatter& keyFormatter,
|
const KeyFormatter& keyFormatter,
|
||||||
bool showZero) const {
|
bool showZero) const {
|
||||||
ADT::dot(name, keyFormatter, valueFormatter, showZero);
|
ADT::dot(name, keyFormatter, valueFormatter, showZero);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,8 +209,8 @@ namespace gtsam {
|
||||||
return ADT::dot(keyFormatter, valueFormatter, showZero);
|
return ADT::dot(keyFormatter, valueFormatter, showZero);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print out header.
|
// Print out header.
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
string DecisionTreeFactor::markdown(const KeyFormatter& keyFormatter,
|
string DecisionTreeFactor::markdown(const KeyFormatter& keyFormatter,
|
||||||
const Names& names) const {
|
const Names& names) const {
|
||||||
stringstream ss;
|
stringstream ss;
|
||||||
|
|
@ -271,17 +275,19 @@ namespace gtsam {
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys &keys, const vector<double> &table) :
|
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys& keys,
|
||||||
DiscreteFactor(keys.indices()), AlgebraicDecisionTree<Key>(keys, table),
|
const vector<double>& table)
|
||||||
cardinalities_(keys.cardinalities()) {
|
: DiscreteFactor(keys.indices()),
|
||||||
}
|
AlgebraicDecisionTree<Key>(keys, table),
|
||||||
|
cardinalities_(keys.cardinalities()) {}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys &keys, const string &table) :
|
DecisionTreeFactor::DecisionTreeFactor(const DiscreteKeys& keys,
|
||||||
DiscreteFactor(keys.indices()), AlgebraicDecisionTree<Key>(keys, table),
|
const string& table)
|
||||||
cardinalities_(keys.cardinalities()) {
|
: DiscreteFactor(keys.indices()),
|
||||||
}
|
AlgebraicDecisionTree<Key>(keys, table),
|
||||||
|
cardinalities_(keys.cardinalities()) {}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************ */
|
||||||
} // namespace gtsam
|
} // namespace gtsam
|
||||||
|
|
|
||||||
|
|
@ -18,16 +18,18 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtsam/discrete/AlgebraicDecisionTree.h>
|
||||||
#include <gtsam/discrete/DiscreteFactor.h>
|
#include <gtsam/discrete/DiscreteFactor.h>
|
||||||
#include <gtsam/discrete/DiscreteKey.h>
|
#include <gtsam/discrete/DiscreteKey.h>
|
||||||
#include <gtsam/discrete/AlgebraicDecisionTree.h>
|
|
||||||
#include <gtsam/inference/Ordering.h>
|
#include <gtsam/inference/Ordering.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include <map>
|
||||||
#include <vector>
|
|
||||||
#include <exception>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
|
|
@ -36,21 +38,19 @@ namespace gtsam {
|
||||||
/**
|
/**
|
||||||
* A discrete probabilistic factor
|
* A discrete probabilistic factor
|
||||||
*/
|
*/
|
||||||
class GTSAM_EXPORT DecisionTreeFactor: public DiscreteFactor, public AlgebraicDecisionTree<Key> {
|
class GTSAM_EXPORT DecisionTreeFactor : public DiscreteFactor,
|
||||||
|
public AlgebraicDecisionTree<Key> {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// typedefs needed to play nice with gtsam
|
// typedefs needed to play nice with gtsam
|
||||||
typedef DecisionTreeFactor This;
|
typedef DecisionTreeFactor This;
|
||||||
typedef DiscreteFactor Base; ///< Typedef to base class
|
typedef DiscreteFactor Base; ///< Typedef to base class
|
||||||
typedef boost::shared_ptr<DecisionTreeFactor> shared_ptr;
|
typedef boost::shared_ptr<DecisionTreeFactor> shared_ptr;
|
||||||
typedef AlgebraicDecisionTree<Key> ADT;
|
typedef AlgebraicDecisionTree<Key> ADT;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::map<Key,size_t> cardinalities_;
|
std::map<Key, size_t> cardinalities_;
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
|
public:
|
||||||
/// @name Standard Constructors
|
/// @name Standard Constructors
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
|
|
@ -61,7 +61,8 @@ namespace gtsam {
|
||||||
DecisionTreeFactor(const DiscreteKeys& keys, const ADT& potentials);
|
DecisionTreeFactor(const DiscreteKeys& keys, const ADT& potentials);
|
||||||
|
|
||||||
/** Constructor from doubles */
|
/** Constructor from doubles */
|
||||||
DecisionTreeFactor(const DiscreteKeys& keys, const std::vector<double>& table);
|
DecisionTreeFactor(const DiscreteKeys& keys,
|
||||||
|
const std::vector<double>& table);
|
||||||
|
|
||||||
/** Constructor from string */
|
/** Constructor from string */
|
||||||
DecisionTreeFactor(const DiscreteKeys& keys, const std::string& table);
|
DecisionTreeFactor(const DiscreteKeys& keys, const std::string& table);
|
||||||
|
|
@ -86,7 +87,8 @@ namespace gtsam {
|
||||||
bool equals(const DiscreteFactor& other, double tol = 1e-9) const override;
|
bool equals(const DiscreteFactor& other, double tol = 1e-9) const override;
|
||||||
|
|
||||||
// print
|
// print
|
||||||
void print(const std::string& s = "DecisionTreeFactor:\n",
|
void print(
|
||||||
|
const std::string& s = "DecisionTreeFactor:\n",
|
||||||
const KeyFormatter& formatter = DefaultKeyFormatter) const override;
|
const KeyFormatter& formatter = DefaultKeyFormatter) const override;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
@ -105,7 +107,7 @@ namespace gtsam {
|
||||||
|
|
||||||
static double safe_div(const double& a, const double& b);
|
static double safe_div(const double& a, const double& b);
|
||||||
|
|
||||||
size_t cardinality(Key j) const { return cardinalities_.at(j);}
|
size_t cardinality(Key j) const { return cardinalities_.at(j); }
|
||||||
|
|
||||||
/// divide by factor f (safely)
|
/// divide by factor f (safely)
|
||||||
DecisionTreeFactor operator/(const DecisionTreeFactor& f) const {
|
DecisionTreeFactor operator/(const DecisionTreeFactor& f) const {
|
||||||
|
|
@ -113,9 +115,7 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert into a decisiontree
|
/// Convert into a decisiontree
|
||||||
DecisionTreeFactor toDecisionTreeFactor() const override {
|
DecisionTreeFactor toDecisionTreeFactor() const override { return *this; }
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create new factor by summing all values with the same separator values
|
/// Create new factor by summing all values with the same separator values
|
||||||
shared_ptr sum(size_t nrFrontals) const {
|
shared_ptr sum(size_t nrFrontals) const {
|
||||||
|
|
@ -164,27 +164,6 @@ namespace gtsam {
|
||||||
*/
|
*/
|
||||||
shared_ptr combine(const Ordering& keys, ADT::Binary op) const;
|
shared_ptr combine(const Ordering& keys, ADT::Binary op) const;
|
||||||
|
|
||||||
|
|
||||||
// /**
|
|
||||||
// * @brief Permutes the keys in Potentials and DiscreteFactor
|
|
||||||
// *
|
|
||||||
// * This re-implements the permuteWithInverse() in both Potentials
|
|
||||||
// * and DiscreteFactor by doing both of them together.
|
|
||||||
// */
|
|
||||||
//
|
|
||||||
// void permuteWithInverse(const Permutation& inversePermutation){
|
|
||||||
// DiscreteFactor::permuteWithInverse(inversePermutation);
|
|
||||||
// Potentials::permuteWithInverse(inversePermutation);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * Apply a reduction, which is a remapping of variable indices.
|
|
||||||
// */
|
|
||||||
// virtual void reduceWithInverse(const internal::Reduction& inverseReduction) {
|
|
||||||
// DiscreteFactor::reduceWithInverse(inverseReduction);
|
|
||||||
// Potentials::reduceWithInverse(inverseReduction);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// Enumerate all values into a map from values to double.
|
/// Enumerate all values into a map from values to double.
|
||||||
std::vector<std::pair<DiscreteValues, double>> enumerate() const;
|
std::vector<std::pair<DiscreteValues, double>> enumerate() const;
|
||||||
|
|
||||||
|
|
@ -194,16 +173,16 @@ namespace gtsam {
|
||||||
/// @}
|
/// @}
|
||||||
/// @name Wrapper support
|
/// @name Wrapper support
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/** output to graphviz format, stream version */
|
/** output to graphviz format, stream version */
|
||||||
void dot(std::ostream& os,
|
void dot(std::ostream& os,
|
||||||
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
bool showZero = true) const;
|
bool showZero = true) const;
|
||||||
|
|
||||||
/** output to graphviz format, open a file */
|
/** output to graphviz format, open a file */
|
||||||
void dot(const std::string& name,
|
void dot(const std::string& name,
|
||||||
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
bool showZero = true) const;
|
bool showZero = true) const;
|
||||||
|
|
||||||
/** output to graphviz format string */
|
/** output to graphviz format string */
|
||||||
std::string dot(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
std::string dot(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
|
|
@ -217,7 +196,7 @@ namespace gtsam {
|
||||||
* @return std::string a markdown string.
|
* @return std::string a markdown string.
|
||||||
*/
|
*/
|
||||||
std::string markdown(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
std::string markdown(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
const Names& names = {}) const override;
|
const Names& names = {}) const override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Render as html table
|
* @brief Render as html table
|
||||||
|
|
@ -227,14 +206,13 @@ namespace gtsam {
|
||||||
* @return std::string a html string.
|
* @return std::string a html string.
|
||||||
*/
|
*/
|
||||||
std::string html(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
std::string html(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
const Names& names = {}) const override;
|
const Names& names = {}) const override;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
};
|
||||||
};
|
|
||||||
// DecisionTreeFactor
|
|
||||||
|
|
||||||
// traits
|
// traits
|
||||||
template<> struct traits<DecisionTreeFactor> : public Testable<DecisionTreeFactor> {};
|
template <>
|
||||||
|
struct traits<DecisionTreeFactor> : public Testable<DecisionTreeFactor> {};
|
||||||
|
|
||||||
}// namespace gtsam
|
} // namespace gtsam
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue