revive unstable discrete. testCSP still fails, but looks like the solution is valid. See comments in file.
parent
9639660685
commit
bf11f93cee
|
@ -143,9 +143,6 @@ namespace gtsam {
|
|||
shared_ptr combine(const Ordering& keys, ADT::Binary op) const;
|
||||
|
||||
|
||||
/** Test whether the factor is empty */
|
||||
virtual bool empty() const { return size() == 0; }
|
||||
|
||||
// /**
|
||||
// * @brief Permutes the keys in Potentials and DiscreteFactor
|
||||
// *
|
||||
|
|
|
@ -97,10 +97,6 @@ Potentials::ADT DiscreteConditional::choose(const Values& parentsValues) const {
|
|||
/* ******************************************************************************** */
|
||||
void DiscreteConditional::solveInPlace(Values& values) const {
|
||||
// TODO: Abhijit asks: is this really the fastest way? He thinks it is.
|
||||
print("Me: ");
|
||||
values.print("values:");
|
||||
cout << "nrFrontals/nrParents: " << nrFrontals() << "/" << nrParents() << endl;
|
||||
cout << "first frontal: " << firstFrontalKey() << endl;
|
||||
ADT pFS = choose(values); // P(F|S=parentsValues)
|
||||
|
||||
// Initialize
|
||||
|
|
|
@ -83,7 +83,7 @@ public:
|
|||
}
|
||||
|
||||
/** Test whether the factor is empty */
|
||||
virtual bool empty() const = 0;
|
||||
virtual bool empty() const { return size() == 0; }
|
||||
|
||||
/// @}
|
||||
/// @name Standard Interface
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
set (gtsam_unstable_subdirs
|
||||
base
|
||||
geometry
|
||||
#discrete
|
||||
discrete
|
||||
dynamics
|
||||
nonlinear
|
||||
slam
|
||||
|
@ -43,7 +43,7 @@ endforeach(subdir)
|
|||
set(gtsam_unstable_srcs
|
||||
${base_srcs}
|
||||
${geometry_srcs}
|
||||
#${discrete_srcs}
|
||||
${discrete_srcs}
|
||||
${dynamics_srcs}
|
||||
${nonlinear_srcs}
|
||||
${slam_srcs}
|
||||
|
|
|
@ -37,6 +37,18 @@ namespace gtsam {
|
|||
virtual void print(const std::string& s = "",
|
||||
const IndexFormatter& formatter = DefaultIndexFormatter) const;
|
||||
|
||||
/// equals
|
||||
bool equals(const DiscreteFactor& other, double tol) const {
|
||||
if(!dynamic_cast<const AllDiff*>(&other))
|
||||
return false;
|
||||
else {
|
||||
const AllDiff& f(static_cast<const AllDiff&>(other));
|
||||
return cardinalities_.size() == f.cardinalities_.size()
|
||||
&& std::equal(cardinalities_.begin(), cardinalities_.end(),
|
||||
f.cardinalities_.begin());
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculate value = expensive !
|
||||
virtual double operator()(const Values& values) const;
|
||||
|
||||
|
|
|
@ -39,6 +39,16 @@ namespace gtsam {
|
|||
<< formatter(keys_[1]) << std::endl;
|
||||
}
|
||||
|
||||
/// equals
|
||||
bool equals(const DiscreteFactor& other, double tol) const {
|
||||
if(!dynamic_cast<const BinaryAllDiff*>(&other))
|
||||
return false;
|
||||
else {
|
||||
const BinaryAllDiff& f(static_cast<const BinaryAllDiff&>(other));
|
||||
return (cardinality0_==f.cardinality0_) && (cardinality1_==f.cardinality1_);
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculate value
|
||||
virtual double operator()(const Values& values) const {
|
||||
return (double) (values.at(keys_[0]) != values.at(keys_[1]));
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
#include <gtsam_unstable/discrete/Domain.h>
|
||||
#include <gtsam_unstable/discrete/CSP.h>
|
||||
#include <gtsam/discrete/DiscreteSequentialSolver.h>
|
||||
#include <gtsam/base/Testable.h>
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
|
@ -17,15 +16,14 @@ namespace gtsam {
|
|||
|
||||
/// Find the best total assignment - can be expensive
|
||||
CSP::sharedValues CSP::optimalAssignment() const {
|
||||
DiscreteSequentialSolver solver(*this);
|
||||
DiscreteBayesNet::shared_ptr chordal = solver.eliminate();
|
||||
sharedValues mpe = optimize(*chordal);
|
||||
DiscreteBayesNet::shared_ptr chordal = this->eliminateSequential();
|
||||
sharedValues mpe = chordal->optimize();
|
||||
return mpe;
|
||||
}
|
||||
|
||||
void CSP::runArcConsistency(size_t cardinality, size_t nrIterations, bool print) const {
|
||||
// Create VariableIndex
|
||||
VariableIndexOrdered index(*this);
|
||||
VariableIndex index(*this);
|
||||
// index.print();
|
||||
|
||||
size_t n = index.size();
|
||||
|
@ -46,7 +44,7 @@ namespace gtsam {
|
|||
// keep track of which domains changed
|
||||
changed[v] = false;
|
||||
// loop over all factors/constraints for variable v
|
||||
const VariableIndexOrdered::Factors& factors = index[v];
|
||||
const VariableIndex::Factors& factors = index[v];
|
||||
BOOST_FOREACH(size_t f,factors) {
|
||||
// if not already a singleton
|
||||
if (!domains[v].isSingleton()) {
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include <gtsam_unstable/base/dllexport.h>
|
||||
#include <gtsam/discrete/DiscreteFactor.h>
|
||||
#include <boost/assign.hpp>
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
|
@ -43,12 +44,12 @@ namespace gtsam {
|
|||
|
||||
/// Construct unary factor
|
||||
Constraint(Index j) :
|
||||
DiscreteFactor(j) {
|
||||
DiscreteFactor(boost::assign::cref_list_of<1>(j)) {
|
||||
}
|
||||
|
||||
/// Construct binary factor
|
||||
Constraint(Index j1, Index j2) :
|
||||
DiscreteFactor(j1, j2) {
|
||||
DiscreteFactor(boost::assign::cref_list_of<2>(j1)(j2)) {
|
||||
}
|
||||
|
||||
/// construct from container
|
||||
|
|
|
@ -69,6 +69,16 @@ namespace gtsam {
|
|||
virtual void print(const std::string& s = "",
|
||||
const IndexFormatter& formatter = DefaultIndexFormatter) const;
|
||||
|
||||
/// equals
|
||||
bool equals(const DiscreteFactor& other, double tol) const {
|
||||
if(!dynamic_cast<const Domain*>(&other))
|
||||
return false;
|
||||
else {
|
||||
const Domain& f(static_cast<const Domain&>(other));
|
||||
return (cardinality_==f.cardinality_) && (values_==f.values_);
|
||||
}
|
||||
}
|
||||
|
||||
bool contains(size_t value) const {
|
||||
return values_.count(value)>0;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
#include <gtsam_unstable/discrete/Scheduler.h>
|
||||
#include <gtsam/discrete/DiscreteFactorGraph.h>
|
||||
#include <gtsam/discrete/DiscreteSequentialSolver.h>
|
||||
#include <gtsam/base/debug.h>
|
||||
#include <gtsam/base/timing.h>
|
||||
|
||||
|
@ -257,11 +256,8 @@ namespace gtsam {
|
|||
|
||||
/** Eliminate, return a Bayes net */
|
||||
DiscreteBayesNet::shared_ptr Scheduler::eliminate() const {
|
||||
gttic(my_solver);
|
||||
DiscreteSequentialSolver solver(*this);
|
||||
gttoc(my_solver);
|
||||
gttic(my_eliminate);
|
||||
DiscreteBayesNet::shared_ptr chordal = solver.eliminate();
|
||||
DiscreteBayesNet::shared_ptr chordal = this->eliminateSequential();
|
||||
gttoc(my_eliminate);
|
||||
return chordal;
|
||||
}
|
||||
|
@ -271,14 +267,14 @@ namespace gtsam {
|
|||
DiscreteBayesNet::shared_ptr chordal = eliminate();
|
||||
|
||||
if (ISDEBUG("Scheduler::optimalAssignment")) {
|
||||
DiscreteBayesNet::const_reverse_iterator it = chordal->rbegin();
|
||||
DiscreteBayesNet::const_iterator it = chordal->end()-1;
|
||||
const Student & student = students_.front();
|
||||
cout << endl;
|
||||
(*it)->print(student.name_);
|
||||
}
|
||||
|
||||
gttic(my_optimize);
|
||||
sharedValues mpe = optimize(*chordal);
|
||||
sharedValues mpe = chordal->optimize();
|
||||
gttoc(my_optimize);
|
||||
return mpe;
|
||||
}
|
||||
|
|
|
@ -45,6 +45,16 @@ namespace gtsam {
|
|||
virtual void print(const std::string& s = "",
|
||||
const IndexFormatter& formatter = DefaultIndexFormatter) const;
|
||||
|
||||
/// equals
|
||||
bool equals(const DiscreteFactor& other, double tol) const {
|
||||
if(!dynamic_cast<const SingleValue*>(&other))
|
||||
return false;
|
||||
else {
|
||||
const SingleValue& f(static_cast<const SingleValue&>(other));
|
||||
return (cardinality_==f.cardinality_) && (value_==f.value_);
|
||||
}
|
||||
}
|
||||
|
||||
/// Calculate value
|
||||
virtual double operator()(const Values& values) const;
|
||||
|
||||
|
|
|
@ -123,6 +123,11 @@ TEST_UNSAFE( CSP, WesternUS)
|
|||
(WA.first,1)(CA.first,1)(NV.first,3)(OR.first,0)
|
||||
(MT.first,1)(WY.first,0)(NM.first,3)(CO.first,2)
|
||||
(ID.first,2)(UT.first,1)(AZ.first,0);
|
||||
|
||||
// TODO: Fix me! mpe result seems to be right. (See the printing)
|
||||
// It has the same prob as the expected solution.
|
||||
// Is mpe another solution, or the expected solution is unique???
|
||||
cout << csp(*mpe) << " should be >= " << csp(expected) << endl;
|
||||
EXPECT(assert_equal(expected,*mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9);
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ DiscreteFactorGraph createExpected() {
|
|||
expected.addAllDiff(J1 & J2 & J3);
|
||||
|
||||
// Mutual exclusion for students
|
||||
expected.addAllDiff(A & J);
|
||||
expected.addAllDiff(A, J);
|
||||
|
||||
return expected;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue