deprecated optimize
parent
7564300744
commit
e22f8f04bc
|
@ -43,6 +43,7 @@ double DiscreteBayesNet::evaluate(const DiscreteValues& values) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V42
|
||||||
DiscreteValues DiscreteBayesNet::optimize() const {
|
DiscreteValues DiscreteBayesNet::optimize() const {
|
||||||
DiscreteValues result;
|
DiscreteValues result;
|
||||||
return optimize(result);
|
return optimize(result);
|
||||||
|
@ -50,10 +51,16 @@ DiscreteValues DiscreteBayesNet::optimize() const {
|
||||||
|
|
||||||
DiscreteValues DiscreteBayesNet::optimize(DiscreteValues result) const {
|
DiscreteValues DiscreteBayesNet::optimize(DiscreteValues result) const {
|
||||||
// solve each node in turn in topological sort order (parents first)
|
// solve each node in turn in topological sort order (parents first)
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma message("DiscreteBayesNet::optimize (deprecated) does not compute MPE!")
|
||||||
|
#else
|
||||||
|
#warning "DiscreteBayesNet::optimize (deprecated) does not compute MPE!"
|
||||||
|
#endif
|
||||||
for (auto conditional : boost::adaptors::reverse(*this))
|
for (auto conditional : boost::adaptors::reverse(*this))
|
||||||
conditional->solveInPlace(&result);
|
conditional->solveInPlace(&result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
DiscreteValues DiscreteBayesNet::sample() const {
|
DiscreteValues DiscreteBayesNet::sample() const {
|
||||||
|
|
|
@ -31,12 +31,12 @@
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
/** A Bayes net made from linear-Discrete densities */
|
/** A Bayes net made from discrete conditional distributions. */
|
||||||
class GTSAM_EXPORT DiscreteBayesNet: public BayesNet<DiscreteConditional>
|
class GTSAM_EXPORT DiscreteBayesNet: public BayesNet<DiscreteConditional>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef FactorGraph<DiscreteConditional> Base;
|
typedef BayesNet<DiscreteConditional> Base;
|
||||||
typedef DiscreteBayesNet This;
|
typedef DiscreteBayesNet This;
|
||||||
typedef DiscreteConditional ConditionalType;
|
typedef DiscreteConditional ConditionalType;
|
||||||
typedef boost::shared_ptr<This> shared_ptr;
|
typedef boost::shared_ptr<This> shared_ptr;
|
||||||
|
@ -45,7 +45,7 @@ namespace gtsam {
|
||||||
/// @name Standard Constructors
|
/// @name Standard Constructors
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
/** Construct empty factor graph */
|
/// Construct empty Bayes net.
|
||||||
DiscreteBayesNet() {}
|
DiscreteBayesNet() {}
|
||||||
|
|
||||||
/** Construct from iterator over conditionals */
|
/** Construct from iterator over conditionals */
|
||||||
|
@ -98,27 +98,6 @@ namespace gtsam {
|
||||||
return evaluate(values);
|
return evaluate(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief solve by back-substitution.
|
|
||||||
*
|
|
||||||
* Assumes the Bayes net is reverse topologically sorted, i.e. last
|
|
||||||
* conditional will be optimized first. If the Bayes net resulted from
|
|
||||||
* eliminating a factor graph, this is true for the elimination ordering.
|
|
||||||
*
|
|
||||||
* @return a sampled value for all variables.
|
|
||||||
*/
|
|
||||||
DiscreteValues optimize() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief solve by back-substitution, given certain variables.
|
|
||||||
*
|
|
||||||
* Assumes the Bayes net is reverse topologically sorted *and* that the
|
|
||||||
* Bayes net does not contain any conditionals for the given values.
|
|
||||||
*
|
|
||||||
* @return given values extended with optimized value for other variables.
|
|
||||||
*/
|
|
||||||
DiscreteValues optimize(DiscreteValues given) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief do ancestral sampling
|
* @brief do ancestral sampling
|
||||||
*
|
*
|
||||||
|
@ -152,7 +131,16 @@ namespace gtsam {
|
||||||
std::string html(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
std::string html(const KeyFormatter& keyFormatter = DefaultKeyFormatter,
|
||||||
const DiscreteFactor::Names& names = {}) const;
|
const DiscreteFactor::Names& names = {}) const;
|
||||||
|
|
||||||
|
///@}
|
||||||
|
|
||||||
|
#ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V42
|
||||||
|
/// @name Deprecated functionality
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
DiscreteValues GTSAM_DEPRECATED optimize() const;
|
||||||
|
DiscreteValues GTSAM_DEPRECATED optimize(DiscreteValues given) const;
|
||||||
/// @}
|
/// @}
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Serialization function */
|
/** Serialization function */
|
||||||
|
|
|
@ -106,26 +106,13 @@ TEST(DiscreteBayesNet, Asia) {
|
||||||
DiscreteConditional expected2(Bronchitis % "11/9");
|
DiscreteConditional expected2(Bronchitis % "11/9");
|
||||||
EXPECT(assert_equal(expected2, *chordal->back()));
|
EXPECT(assert_equal(expected2, *chordal->back()));
|
||||||
|
|
||||||
// solve
|
|
||||||
auto actualMPE = chordal->optimize();
|
|
||||||
DiscreteValues expectedMPE;
|
|
||||||
insert(expectedMPE)(Asia.first, 0)(Dyspnea.first, 0)(XRay.first, 0)(
|
|
||||||
Tuberculosis.first, 0)(Smoking.first, 0)(Either.first, 0)(
|
|
||||||
LungCancer.first, 0)(Bronchitis.first, 0);
|
|
||||||
EXPECT(assert_equal(expectedMPE, actualMPE));
|
|
||||||
|
|
||||||
// add evidence, we were in Asia and we have dyspnea
|
// add evidence, we were in Asia and we have dyspnea
|
||||||
fg.add(Asia, "0 1");
|
fg.add(Asia, "0 1");
|
||||||
fg.add(Dyspnea, "0 1");
|
fg.add(Dyspnea, "0 1");
|
||||||
|
|
||||||
// solve again, now with evidence
|
// solve again, now with evidence
|
||||||
DiscreteBayesNet::shared_ptr chordal2 = fg.eliminateSequential(ordering);
|
DiscreteBayesNet::shared_ptr chordal2 = fg.eliminateSequential(ordering);
|
||||||
auto actualMPE2 = chordal2->optimize();
|
EXPECT(assert_equal(expected2, *chordal->back()));
|
||||||
DiscreteValues expectedMPE2;
|
|
||||||
insert(expectedMPE2)(Asia.first, 1)(Dyspnea.first, 1)(XRay.first, 0)(
|
|
||||||
Tuberculosis.first, 0)(Smoking.first, 1)(Either.first, 0)(
|
|
||||||
LungCancer.first, 0)(Bronchitis.first, 1);
|
|
||||||
EXPECT(assert_equal(expectedMPE2, actualMPE2));
|
|
||||||
|
|
||||||
// now sample from it
|
// now sample from it
|
||||||
DiscreteValues expectedSample;
|
DiscreteValues expectedSample;
|
||||||
|
|
Loading…
Reference in New Issue