Merge branch 'feature/modernize_discrete' into feature/arc_consistency
# Conflicts: # gtsam_unstable/discrete/CSP.h # gtsam_unstable/discrete/tests/testCSP.cpp # gtsam_unstable/discrete/tests/testSudoku.cpprelease/4.3a0
commit
84014c96c4
|
@ -56,8 +56,8 @@ int main(int argc, char **argv) {
|
|||
DiscreteBayesNet::shared_ptr chordal = fg.eliminateSequential(ordering);
|
||||
|
||||
// solve
|
||||
DiscreteFactor::sharedValues mpe = chordal->optimize();
|
||||
GTSAM_PRINT(*mpe);
|
||||
auto mpe = chordal->optimize();
|
||||
GTSAM_PRINT(mpe);
|
||||
|
||||
// We can also build a Bayes tree (directed junction tree).
|
||||
// The elimination order above will do fine:
|
||||
|
@ -70,14 +70,14 @@ int main(int argc, char **argv) {
|
|||
|
||||
// solve again, now with evidence
|
||||
DiscreteBayesNet::shared_ptr chordal2 = fg.eliminateSequential(ordering);
|
||||
DiscreteFactor::sharedValues mpe2 = chordal2->optimize();
|
||||
GTSAM_PRINT(*mpe2);
|
||||
auto mpe2 = chordal2->optimize();
|
||||
GTSAM_PRINT(mpe2);
|
||||
|
||||
// We can also sample from it
|
||||
cout << "\n10 samples:" << endl;
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
DiscreteFactor::sharedValues sample = chordal2->sample();
|
||||
GTSAM_PRINT(*sample);
|
||||
auto sample = chordal2->sample();
|
||||
GTSAM_PRINT(sample);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -33,11 +33,11 @@ using namespace gtsam;
|
|||
int main(int argc, char **argv) {
|
||||
// Define keys and a print function
|
||||
Key C(1), S(2), R(3), W(4);
|
||||
auto print = [=](DiscreteFactor::sharedValues values) {
|
||||
cout << boolalpha << "Cloudy = " << static_cast<bool>((*values)[C])
|
||||
<< " Sprinkler = " << static_cast<bool>((*values)[S])
|
||||
<< " Rain = " << boolalpha << static_cast<bool>((*values)[R])
|
||||
<< " WetGrass = " << static_cast<bool>((*values)[W]) << endl;
|
||||
auto print = [=](const DiscreteFactor::Values& values) {
|
||||
cout << boolalpha << "Cloudy = " << static_cast<bool>(values.at(C))
|
||||
<< " Sprinkler = " << static_cast<bool>(values.at(S))
|
||||
<< " Rain = " << boolalpha << static_cast<bool>(values.at(R))
|
||||
<< " WetGrass = " << static_cast<bool>(values.at(W)) << endl;
|
||||
};
|
||||
|
||||
// We assume binary state variables
|
||||
|
@ -85,7 +85,7 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
|
||||
// "Most Probable Explanation", i.e., configuration with largest value
|
||||
DiscreteFactor::sharedValues mpe = graph.eliminateSequential()->optimize();
|
||||
auto mpe = graph.eliminateSequential()->optimize();
|
||||
cout << "\nMost Probable Explanation (MPE):" << endl;
|
||||
print(mpe);
|
||||
|
||||
|
@ -97,7 +97,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
// solve again, now with evidence
|
||||
DiscreteBayesNet::shared_ptr chordal = graph.eliminateSequential();
|
||||
DiscreteFactor::sharedValues mpe_with_evidence = chordal->optimize();
|
||||
auto mpe_with_evidence = chordal->optimize();
|
||||
|
||||
cout << "\nMPE given C=0:" << endl;
|
||||
print(mpe_with_evidence);
|
||||
|
@ -113,7 +113,7 @@ int main(int argc, char **argv) {
|
|||
// We can also sample from it
|
||||
cout << "\n10 samples:" << endl;
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
DiscreteFactor::sharedValues sample = chordal->sample();
|
||||
auto sample = chordal->sample();
|
||||
print(sample);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -66,14 +66,14 @@ int main(int argc, char **argv) {
|
|||
chordal->print("Eliminated");
|
||||
|
||||
// solve
|
||||
DiscreteFactor::sharedValues mpe = chordal->optimize();
|
||||
GTSAM_PRINT(*mpe);
|
||||
auto mpe = chordal->optimize();
|
||||
GTSAM_PRINT(mpe);
|
||||
|
||||
// We can also sample from it
|
||||
cout << "\n10 samples:" << endl;
|
||||
for (size_t k = 0; k < 10; k++) {
|
||||
DiscreteFactor::sharedValues sample = chordal->sample();
|
||||
GTSAM_PRINT(*sample);
|
||||
auto sample = chordal->sample();
|
||||
GTSAM_PRINT(sample);
|
||||
}
|
||||
|
||||
// Or compute the marginals. This re-eliminates the FG into a Bayes tree
|
||||
|
|
|
@ -70,8 +70,8 @@ int main(int argc, char** argv) {
|
|||
// "Decoding", i.e., configuration with largest value
|
||||
// We use sequential variable elimination
|
||||
DiscreteBayesNet::shared_ptr chordal = graph.eliminateSequential();
|
||||
DiscreteFactor::sharedValues optimalDecoding = chordal->optimize();
|
||||
optimalDecoding->print("\nMost Probable Explanation (optimalDecoding)\n");
|
||||
auto optimalDecoding = chordal->optimize();
|
||||
optimalDecoding.print("\nMost Probable Explanation (optimalDecoding)\n");
|
||||
|
||||
// "Inference" Computing marginals for each node
|
||||
// Here we'll make use of DiscreteMarginals class, which makes use of
|
||||
|
|
|
@ -63,8 +63,8 @@ int main(int argc, char** argv) {
|
|||
// "Decoding", i.e., configuration with largest value (MPE)
|
||||
// We use sequential variable elimination
|
||||
DiscreteBayesNet::shared_ptr chordal = graph.eliminateSequential();
|
||||
DiscreteFactor::sharedValues optimalDecoding = chordal->optimize();
|
||||
optimalDecoding->print("\noptimalDecoding");
|
||||
auto optimalDecoding = chordal->optimize();
|
||||
GTSAM_PRINT(optimalDecoding);
|
||||
|
||||
// "Inference" Computing marginals
|
||||
cout << "\nComputing Node Marginals .." << endl;
|
||||
|
|
|
@ -54,20 +54,20 @@ namespace gtsam {
|
|||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
DiscreteFactor::sharedValues DiscreteBayesNet::optimize() const {
|
||||
DiscreteFactor::Values DiscreteBayesNet::optimize() const {
|
||||
// solve each node in turn in topological sort order (parents first)
|
||||
DiscreteFactor::sharedValues result(new DiscreteFactor::Values());
|
||||
DiscreteFactor::Values result;
|
||||
for (auto conditional: boost::adaptors::reverse(*this))
|
||||
conditional->solveInPlace(*result);
|
||||
conditional->solveInPlace(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
DiscreteFactor::sharedValues DiscreteBayesNet::sample() const {
|
||||
DiscreteFactor::Values DiscreteBayesNet::sample() const {
|
||||
// sample each node in turn in topological sort order (parents first)
|
||||
DiscreteFactor::sharedValues result(new DiscreteFactor::Values());
|
||||
DiscreteFactor::Values result;
|
||||
for (auto conditional: boost::adaptors::reverse(*this))
|
||||
conditional->sampleInPlace(*result);
|
||||
conditional->sampleInPlace(&result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,10 +83,10 @@ namespace gtsam {
|
|||
/**
|
||||
* Solve the DiscreteBayesNet by back-substitution
|
||||
*/
|
||||
DiscreteFactor::sharedValues optimize() const;
|
||||
DiscreteFactor::Values optimize() const;
|
||||
|
||||
/** Do ancestral sampling */
|
||||
DiscreteFactor::sharedValues sample() const;
|
||||
DiscreteFactor::Values sample() const;
|
||||
|
||||
///@}
|
||||
|
||||
|
|
|
@ -117,9 +117,9 @@ Potentials::ADT DiscreteConditional::choose(const Values& parentsValues) const {
|
|||
}
|
||||
|
||||
/* ******************************************************************************** */
|
||||
void DiscreteConditional::solveInPlace(Values& values) const {
|
||||
void DiscreteConditional::solveInPlace(Values* values) const {
|
||||
// TODO: Abhijit asks: is this really the fastest way? He thinks it is.
|
||||
ADT pFS = choose(values); // P(F|S=parentsValues)
|
||||
ADT pFS = choose(*values); // P(F|S=parentsValues)
|
||||
|
||||
// Initialize
|
||||
Values mpe;
|
||||
|
@ -145,16 +145,16 @@ void DiscreteConditional::solveInPlace(Values& values) const {
|
|||
|
||||
//set values (inPlace) to mpe
|
||||
for(Key j: frontals()) {
|
||||
values[j] = mpe[j];
|
||||
(*values)[j] = mpe[j];
|
||||
}
|
||||
}
|
||||
|
||||
/* ******************************************************************************** */
|
||||
void DiscreteConditional::sampleInPlace(Values& values) const {
|
||||
void DiscreteConditional::sampleInPlace(Values* values) const {
|
||||
assert(nrFrontals() == 1);
|
||||
Key j = (firstFrontalKey());
|
||||
size_t sampled = sample(values); // Sample variable
|
||||
values[j] = sampled; // store result in partial solution
|
||||
size_t sampled = sample(*values); // Sample variable given parents
|
||||
(*values)[j] = sampled; // store result in partial solution
|
||||
}
|
||||
|
||||
/* ******************************************************************************** */
|
||||
|
|
|
@ -45,7 +45,6 @@ public:
|
|||
/** A map from keys to values..
|
||||
* TODO: Again, do we need this??? */
|
||||
typedef Assignment<Key> Values;
|
||||
typedef boost::shared_ptr<Values> sharedValues;
|
||||
|
||||
/// @name Standard Constructors
|
||||
/// @{
|
||||
|
@ -133,10 +132,10 @@ public:
|
|||
/// @{
|
||||
|
||||
/// solve a conditional, in place
|
||||
void solveInPlace(Values& parentsValues) const;
|
||||
void solveInPlace(Values* parentsValues) const;
|
||||
|
||||
/// sample in place, stores result in partial solution
|
||||
void sampleInPlace(Values& parentsValues) const;
|
||||
void sampleInPlace(Values* parentsValues) const;
|
||||
|
||||
/// @}
|
||||
|
||||
|
|
|
@ -51,7 +51,6 @@ public:
|
|||
* the new class DiscreteValue, as the varible's type (domain)
|
||||
*/
|
||||
typedef Assignment<Key> Values;
|
||||
typedef boost::shared_ptr<Values> sharedValues;
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ namespace gtsam {
|
|||
// }
|
||||
|
||||
/* ************************************************************************* */
|
||||
DiscreteFactor::sharedValues DiscreteFactorGraph::optimize() const
|
||||
DiscreteFactorGraph::Values DiscreteFactorGraph::optimize() const
|
||||
{
|
||||
gttic(DiscreteFactorGraph_optimize);
|
||||
return BaseEliminateable::eliminateSequential()->optimize();
|
||||
|
|
|
@ -74,7 +74,6 @@ public:
|
|||
/** A map from keys to values */
|
||||
typedef KeyVector Indices;
|
||||
typedef Assignment<Key> Values;
|
||||
typedef boost::shared_ptr<Values> sharedValues;
|
||||
|
||||
/** Default constructor */
|
||||
DiscreteFactorGraph() {}
|
||||
|
@ -142,7 +141,7 @@ public:
|
|||
* the dense elimination function specified in \c function,
|
||||
* followed by back-substitution resulting from elimination. Is equivalent
|
||||
* to calling graph.eliminateSequential()->optimize(). */
|
||||
DiscreteFactor::sharedValues optimize() const;
|
||||
Values optimize() const;
|
||||
|
||||
|
||||
// /** Permute the variables in the factors */
|
||||
|
|
|
@ -104,12 +104,12 @@ TEST(DiscreteBayesNet, Asia) {
|
|||
EXPECT(assert_equal(expected2, *chordal->back()));
|
||||
|
||||
// solve
|
||||
DiscreteFactor::sharedValues actualMPE = chordal->optimize();
|
||||
auto actualMPE = chordal->optimize();
|
||||
DiscreteFactor::Values 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));
|
||||
EXPECT(assert_equal(expectedMPE, actualMPE));
|
||||
|
||||
// add evidence, we were in Asia and we have dyspnea
|
||||
fg.add(Asia, "0 1");
|
||||
|
@ -117,12 +117,12 @@ TEST(DiscreteBayesNet, Asia) {
|
|||
|
||||
// solve again, now with evidence
|
||||
DiscreteBayesNet::shared_ptr chordal2 = fg.eliminateSequential(ordering);
|
||||
DiscreteFactor::sharedValues actualMPE2 = chordal2->optimize();
|
||||
auto actualMPE2 = chordal2->optimize();
|
||||
DiscreteFactor::Values 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));
|
||||
EXPECT(assert_equal(expectedMPE2, actualMPE2));
|
||||
|
||||
// now sample from it
|
||||
DiscreteFactor::Values expectedSample;
|
||||
|
@ -130,8 +130,8 @@ TEST(DiscreteBayesNet, Asia) {
|
|||
insert(expectedSample)(Asia.first, 1)(Dyspnea.first, 1)(XRay.first, 1)(
|
||||
Tuberculosis.first, 0)(Smoking.first, 1)(Either.first, 1)(
|
||||
LungCancer.first, 1)(Bronchitis.first, 0);
|
||||
DiscreteFactor::sharedValues actualSample = chordal2->sample();
|
||||
EXPECT(assert_equal(expectedSample, *actualSample));
|
||||
auto actualSample = chordal2->sample();
|
||||
EXPECT(assert_equal(expectedSample, actualSample));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
|
@ -169,8 +169,8 @@ TEST( DiscreteFactorGraph, test)
|
|||
// Test optimization
|
||||
DiscreteFactor::Values expectedValues;
|
||||
insert(expectedValues)(0, 0)(1, 0)(2, 0);
|
||||
DiscreteFactor::sharedValues actualValues = graph.optimize();
|
||||
EXPECT(assert_equal(expectedValues, *actualValues));
|
||||
auto actualValues = graph.optimize();
|
||||
EXPECT(assert_equal(expectedValues, actualValues));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
@ -186,11 +186,11 @@ TEST( DiscreteFactorGraph, testMPE)
|
|||
// graph.product().print();
|
||||
// DiscreteSequentialSolver(graph).eliminate()->print();
|
||||
|
||||
DiscreteFactor::sharedValues actualMPE = graph.optimize();
|
||||
auto actualMPE = graph.optimize();
|
||||
|
||||
DiscreteFactor::Values expectedMPE;
|
||||
insert(expectedMPE)(0, 0)(1, 1)(2, 1);
|
||||
EXPECT(assert_equal(expectedMPE, *actualMPE));
|
||||
EXPECT(assert_equal(expectedMPE, actualMPE));
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
@ -216,8 +216,8 @@ TEST( DiscreteFactorGraph, testMPE_Darwiche09book_p244)
|
|||
|
||||
// Use the solver machinery.
|
||||
DiscreteBayesNet::shared_ptr chordal = graph.eliminateSequential();
|
||||
DiscreteFactor::sharedValues actualMPE = chordal->optimize();
|
||||
EXPECT(assert_equal(expectedMPE, *actualMPE));
|
||||
auto actualMPE = chordal->optimize();
|
||||
EXPECT(assert_equal(expectedMPE, actualMPE));
|
||||
// DiscreteConditional::shared_ptr root = chordal->back();
|
||||
// EXPECT_DOUBLES_EQUAL(0.4, (*root)(*actualMPE), 1e-9);
|
||||
|
||||
|
@ -244,8 +244,8 @@ ETree::shared_ptr eTree = ETree::Create(graph, structure);
|
|||
// eliminate normally and check solution
|
||||
DiscreteBayesNet::shared_ptr bayesNet = eTree->eliminate(&EliminateDiscrete);
|
||||
// bayesNet->print(">>>>>>>>>>>>>> Bayes Net <<<<<<<<<<<<<<<<<<");
|
||||
DiscreteFactor::sharedValues actualMPE = optimize(*bayesNet);
|
||||
EXPECT(assert_equal(expectedMPE, *actualMPE));
|
||||
auto actualMPE = optimize(*bayesNet);
|
||||
EXPECT(assert_equal(expectedMPE, actualMPE));
|
||||
|
||||
// Approximate and check solution
|
||||
// DiscreteBayesNet::shared_ptr approximateNet = eTree->approximate();
|
||||
|
|
|
@ -302,6 +302,7 @@ virtual class JacobianFactor : gtsam::GaussianFactor {
|
|||
void print(string s = "", const gtsam::KeyFormatter& keyFormatter =
|
||||
gtsam::DefaultKeyFormatter) const;
|
||||
void printKeys(string s) const;
|
||||
gtsam::KeyVector& keys() const;
|
||||
bool equals(const gtsam::GaussianFactor& lf, double tol) const;
|
||||
size_t size() const;
|
||||
Vector unweighted_error(const gtsam::VectorValues& c) const;
|
||||
|
@ -514,9 +515,9 @@ virtual class GaussianBayesNet {
|
|||
size_t size() const;
|
||||
|
||||
// FactorGraph derived interface
|
||||
// size_t size() const;
|
||||
gtsam::GaussianConditional* at(size_t idx) const;
|
||||
gtsam::KeySet keys() const;
|
||||
gtsam::KeyVector keyVector() const;
|
||||
bool exists(size_t idx) const;
|
||||
|
||||
void saveGraph(const string& s) const;
|
||||
|
|
|
@ -14,17 +14,15 @@ using namespace std;
|
|||
namespace gtsam {
|
||||
|
||||
/// Find the best total assignment - can be expensive
|
||||
CSP::sharedValues CSP::optimalAssignment() const {
|
||||
CSP::Values CSP::optimalAssignment() const {
|
||||
DiscreteBayesNet::shared_ptr chordal = this->eliminateSequential();
|
||||
sharedValues mpe = chordal->optimize();
|
||||
return mpe;
|
||||
return chordal->optimize();
|
||||
}
|
||||
|
||||
/// Find the best total assignment - can be expensive
|
||||
CSP::sharedValues CSP::optimalAssignment(const Ordering& ordering) const {
|
||||
CSP::Values CSP::optimalAssignment(const Ordering& ordering) const {
|
||||
DiscreteBayesNet::shared_ptr chordal = this->eliminateSequential(ordering);
|
||||
sharedValues mpe = chordal->optimize();
|
||||
return mpe;
|
||||
return chordal->optimize();
|
||||
}
|
||||
|
||||
bool CSP::runArcConsistency(const VariableIndex& index,
|
||||
|
|
|
@ -22,7 +22,6 @@ class GTSAM_UNSTABLE_EXPORT CSP : public DiscreteFactorGraph {
|
|||
public:
|
||||
/** A map from keys to values */
|
||||
typedef Assignment<Key> Values;
|
||||
typedef boost::shared_ptr<Values> sharedValues;
|
||||
|
||||
public:
|
||||
/// Add a unary constraint, allowing only a single value
|
||||
|
@ -47,10 +46,10 @@ class GTSAM_UNSTABLE_EXPORT CSP : public DiscreteFactorGraph {
|
|||
// }
|
||||
|
||||
/// Find the best total assignment - can be expensive.
|
||||
sharedValues optimalAssignment() const;
|
||||
Values optimalAssignment() const;
|
||||
|
||||
/// Find the best total assignment, with given ordering - can be expensive.
|
||||
sharedValues optimalAssignment(const Ordering& ordering) const;
|
||||
Values optimalAssignment(const Ordering& ordering) const;
|
||||
|
||||
// /*
|
||||
// * Perform loopy belief propagation
|
||||
|
|
|
@ -202,16 +202,16 @@ void Scheduler::print(const string& s, const KeyFormatter& formatter) const {
|
|||
} // print
|
||||
|
||||
/** Print readable form of assignment */
|
||||
void Scheduler::printAssignment(sharedValues assignment) const {
|
||||
void Scheduler::printAssignment(const Values& assignment) const {
|
||||
// Not intended to be general! Assumes very particular ordering !
|
||||
cout << endl;
|
||||
for (size_t s = 0; s < nrStudents(); s++) {
|
||||
Key j = 3 * maxNrStudents_ + s;
|
||||
size_t slot = assignment->at(j);
|
||||
size_t slot = assignment.at(j);
|
||||
cout << studentName(s) << " slot: " << slotName_[slot] << endl;
|
||||
Key base = 3 * s;
|
||||
for (size_t area = 0; area < 3; area++) {
|
||||
size_t faculty = assignment->at(base + area);
|
||||
size_t faculty = assignment.at(base + area);
|
||||
cout << setw(12) << studentArea(s, area) << ": " << facultyName_[faculty]
|
||||
<< endl;
|
||||
}
|
||||
|
@ -220,8 +220,8 @@ void Scheduler::printAssignment(sharedValues assignment) const {
|
|||
}
|
||||
|
||||
/** Special print for single-student case */
|
||||
void Scheduler::printSpecial(sharedValues assignment) const {
|
||||
Values::const_iterator it = assignment->begin();
|
||||
void Scheduler::printSpecial(const Values& assignment) const {
|
||||
Values::const_iterator it = assignment.begin();
|
||||
for (size_t area = 0; area < 3; area++, it++) {
|
||||
size_t f = it->second;
|
||||
cout << setw(12) << studentArea(0, area) << ": " << facultyName_[f] << endl;
|
||||
|
@ -230,12 +230,12 @@ void Scheduler::printSpecial(sharedValues assignment) const {
|
|||
}
|
||||
|
||||
/** Accumulate faculty stats */
|
||||
void Scheduler::accumulateStats(sharedValues assignment,
|
||||
void Scheduler::accumulateStats(const Values& assignment,
|
||||
vector<size_t>& stats) const {
|
||||
for (size_t s = 0; s < nrStudents(); s++) {
|
||||
Key base = 3 * s;
|
||||
for (size_t area = 0; area < 3; area++) {
|
||||
size_t f = assignment->at(base + area);
|
||||
size_t f = assignment.at(base + area);
|
||||
assert(f < stats.size());
|
||||
stats[f]++;
|
||||
} // area
|
||||
|
@ -256,7 +256,7 @@ DiscreteBayesNet::shared_ptr Scheduler::eliminate() const {
|
|||
}
|
||||
|
||||
/** Find the best total assignment - can be expensive */
|
||||
Scheduler::sharedValues Scheduler::optimalAssignment() const {
|
||||
Scheduler::Values Scheduler::optimalAssignment() const {
|
||||
DiscreteBayesNet::shared_ptr chordal = eliminate();
|
||||
|
||||
if (ISDEBUG("Scheduler::optimalAssignment")) {
|
||||
|
@ -267,22 +267,21 @@ Scheduler::sharedValues Scheduler::optimalAssignment() const {
|
|||
}
|
||||
|
||||
gttic(my_optimize);
|
||||
sharedValues mpe = chordal->optimize();
|
||||
Values mpe = chordal->optimize();
|
||||
gttoc(my_optimize);
|
||||
return mpe;
|
||||
}
|
||||
|
||||
/** find the assignment of students to slots with most possible committees */
|
||||
Scheduler::sharedValues Scheduler::bestSchedule() const {
|
||||
sharedValues best;
|
||||
Scheduler::Values Scheduler::bestSchedule() const {
|
||||
Values best;
|
||||
throw runtime_error("bestSchedule not implemented");
|
||||
return best;
|
||||
}
|
||||
|
||||
/** find the corresponding most desirable committee assignment */
|
||||
Scheduler::sharedValues Scheduler::bestAssignment(
|
||||
sharedValues bestSchedule) const {
|
||||
sharedValues best;
|
||||
Scheduler::Values Scheduler::bestAssignment(const Values& bestSchedule) const {
|
||||
Values best;
|
||||
throw runtime_error("bestAssignment not implemented");
|
||||
return best;
|
||||
}
|
||||
|
|
|
@ -134,26 +134,26 @@ class GTSAM_UNSTABLE_EXPORT Scheduler : public CSP {
|
|||
const KeyFormatter& formatter = DefaultKeyFormatter) const override;
|
||||
|
||||
/** Print readable form of assignment */
|
||||
void printAssignment(sharedValues assignment) const;
|
||||
void printAssignment(const Values& assignment) const;
|
||||
|
||||
/** Special print for single-student case */
|
||||
void printSpecial(sharedValues assignment) const;
|
||||
void printSpecial(const Values& assignment) const;
|
||||
|
||||
/** Accumulate faculty stats */
|
||||
void accumulateStats(sharedValues assignment,
|
||||
void accumulateStats(const Values& assignment,
|
||||
std::vector<size_t>& stats) const;
|
||||
|
||||
/** Eliminate, return a Bayes net */
|
||||
DiscreteBayesNet::shared_ptr eliminate() const;
|
||||
|
||||
/** Find the best total assignment - can be expensive */
|
||||
sharedValues optimalAssignment() const;
|
||||
Values optimalAssignment() const;
|
||||
|
||||
/** find the assignment of students to slots with most possible committees */
|
||||
sharedValues bestSchedule() const;
|
||||
Values bestSchedule() const;
|
||||
|
||||
/** find the corresponding most desirable committee assignment */
|
||||
sharedValues bestAssignment(sharedValues bestSchedule) const;
|
||||
Values bestAssignment(const Values& bestSchedule) const;
|
||||
|
||||
}; // Scheduler
|
||||
|
||||
|
|
|
@ -122,7 +122,7 @@ void runLargeExample() {
|
|||
// SETDEBUG("timing-verbose", true);
|
||||
SETDEBUG("DiscreteConditional::DiscreteConditional", true);
|
||||
gttic(large);
|
||||
DiscreteFactor::sharedValues MPE = scheduler.optimalAssignment();
|
||||
auto MPE = scheduler.optimalAssignment();
|
||||
gttoc(large);
|
||||
tictoc_finishedIteration();
|
||||
tictoc_print();
|
||||
|
@ -225,7 +225,7 @@ void sampleSolutions() {
|
|||
// now, sample schedules
|
||||
for (size_t n = 0; n < 500; n++) {
|
||||
vector<size_t> stats(19, 0);
|
||||
vector<Scheduler::sharedValues> samples;
|
||||
vector<Scheduler::Values> samples;
|
||||
for (size_t i = 0; i < 7; i++) {
|
||||
samples.push_back(samplers[i]->sample());
|
||||
schedulers[i].accumulateStats(samples[i], stats);
|
||||
|
@ -331,7 +331,7 @@ void accomodateStudent() {
|
|||
|
||||
// sample schedules
|
||||
for (size_t n = 0; n < 10; n++) {
|
||||
Scheduler::sharedValues sample0 = chordal->sample();
|
||||
auto sample0 = chordal->sample();
|
||||
scheduler.printAssignment(sample0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -129,7 +129,7 @@ void runLargeExample() {
|
|||
tictoc_finishedIteration();
|
||||
tictoc_print();
|
||||
for (size_t i=0;i<100;i++) {
|
||||
DiscreteFactor::sharedValues assignment = chordal->sample();
|
||||
auto assignment = chordal->sample();
|
||||
vector<size_t> stats(scheduler.nrFaculty());
|
||||
scheduler.accumulateStats(assignment, stats);
|
||||
size_t max = *max_element(stats.begin(), stats.end());
|
||||
|
@ -143,7 +143,7 @@ void runLargeExample() {
|
|||
}
|
||||
#else
|
||||
gttic(large);
|
||||
DiscreteFactor::sharedValues MPE = scheduler.optimalAssignment();
|
||||
auto MPE = scheduler.optimalAssignment();
|
||||
gttoc(large);
|
||||
tictoc_finishedIteration();
|
||||
tictoc_print();
|
||||
|
@ -234,7 +234,7 @@ void sampleSolutions() {
|
|||
// now, sample schedules
|
||||
for (size_t n = 0; n < 500; n++) {
|
||||
vector<size_t> stats(19, 0);
|
||||
vector<Scheduler::sharedValues> samples;
|
||||
vector<Scheduler::Values> samples;
|
||||
for (size_t i = 0; i < NRSTUDENTS; i++) {
|
||||
samples.push_back(samplers[i]->sample());
|
||||
schedulers[i].accumulateStats(samples[i], stats);
|
||||
|
|
|
@ -153,7 +153,7 @@ void runLargeExample() {
|
|||
tictoc_finishedIteration();
|
||||
tictoc_print();
|
||||
for (size_t i=0;i<100;i++) {
|
||||
DiscreteFactor::sharedValues assignment = sample(*chordal);
|
||||
auto assignment = sample(*chordal);
|
||||
vector<size_t> stats(scheduler.nrFaculty());
|
||||
scheduler.accumulateStats(assignment, stats);
|
||||
size_t max = *max_element(stats.begin(), stats.end());
|
||||
|
@ -167,7 +167,7 @@ void runLargeExample() {
|
|||
}
|
||||
#else
|
||||
gttic(large);
|
||||
DiscreteFactor::sharedValues MPE = scheduler.optimalAssignment();
|
||||
auto MPE = scheduler.optimalAssignment();
|
||||
gttoc(large);
|
||||
tictoc_finishedIteration();
|
||||
tictoc_print();
|
||||
|
@ -259,7 +259,7 @@ void sampleSolutions() {
|
|||
// now, sample schedules
|
||||
for (size_t n = 0; n < 10000; n++) {
|
||||
vector<size_t> stats(nrFaculty, 0);
|
||||
vector<Scheduler::sharedValues> samples;
|
||||
vector<Scheduler::Values> samples;
|
||||
for (size_t i = 0; i < NRSTUDENTS; i++) {
|
||||
samples.push_back(samplers[i]->sample());
|
||||
schedulers[i].accumulateStats(samples[i], stats);
|
||||
|
|
|
@ -132,11 +132,11 @@ TEST(CSP, allInOne) {
|
|||
EXPECT(assert_equal(expectedProduct, product));
|
||||
|
||||
// Solve
|
||||
CSP::sharedValues mpe = csp.optimalAssignment();
|
||||
auto mpe = csp.optimalAssignment();
|
||||
CSP::Values expected;
|
||||
insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 1);
|
||||
EXPECT(assert_equal(expected, *mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9);
|
||||
EXPECT(assert_equal(expected, mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(mpe), 1e-9);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
@ -176,10 +176,9 @@ TEST(CSP, WesternUS) {
|
|||
Ordering ordering;
|
||||
ordering += Key(0), Key(1), Key(2), Key(3), Key(4), Key(5), Key(6), Key(7),
|
||||
Key(8), Key(9), Key(10);
|
||||
|
||||
// Solve using that ordering:
|
||||
CSP::sharedValues mpe = csp.optimalAssignment(ordering);
|
||||
// GTSAM_PRINT(*mpe);
|
||||
auto mpe = csp.optimalAssignment(ordering);
|
||||
// GTSAM_PRINT(mpe);
|
||||
CSP::Values expected;
|
||||
insert(expected)(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)(
|
||||
|
@ -188,8 +187,8 @@ TEST(CSP, WesternUS) {
|
|||
// 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???
|
||||
EXPECT(assert_equal(expected, *mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9);
|
||||
EXPECT(assert_equal(expected, mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(mpe), 1e-9);
|
||||
|
||||
// Write out the dual graph for hmetis
|
||||
#ifdef DUAL
|
||||
|
@ -228,11 +227,11 @@ TEST(CSP, ArcConsistency) {
|
|||
EXPECT_DOUBLES_EQUAL(1, csp(valid), 1e-9);
|
||||
|
||||
// Solve
|
||||
CSP::sharedValues mpe = csp.optimalAssignment();
|
||||
auto mpe = csp.optimalAssignment();
|
||||
CSP::Values expected;
|
||||
insert(expected)(ID.first, 1)(UT.first, 0)(AZ.first, 2);
|
||||
EXPECT(assert_equal(expected, *mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(*mpe), 1e-9);
|
||||
EXPECT(assert_equal(expected, mpe));
|
||||
EXPECT_DOUBLES_EQUAL(1, csp(mpe), 1e-9);
|
||||
|
||||
// ensure arc-consistency, i.e., narrow domains...
|
||||
Domains domains;
|
||||
|
|
|
@ -122,7 +122,7 @@ TEST(schedulingExample, test) {
|
|||
|
||||
// Do exact inference
|
||||
gttic(small);
|
||||
DiscreteFactor::sharedValues MPE = s.optimalAssignment();
|
||||
auto MPE = s.optimalAssignment();
|
||||
gttoc(small);
|
||||
|
||||
// print MPE, commented out as unit tests don't print
|
||||
|
@ -133,13 +133,13 @@ TEST(schedulingExample, test) {
|
|||
|
||||
// find the assignment of students to slots with most possible committees
|
||||
// Commented out as not implemented yet
|
||||
// sharedValues bestSchedule = s.bestSchedule();
|
||||
// GTSAM_PRINT(*bestSchedule);
|
||||
// auto bestSchedule = s.bestSchedule();
|
||||
// GTSAM_PRINT(bestSchedule);
|
||||
|
||||
// find the corresponding most desirable committee assignment
|
||||
// Commented out as not implemented yet
|
||||
// sharedValues bestAssignment = s.bestAssignment(bestSchedule);
|
||||
// GTSAM_PRINT(*bestAssignment);
|
||||
// auto bestAssignment = s.bestAssignment(bestSchedule);
|
||||
// GTSAM_PRINT(bestAssignment);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
|
@ -88,11 +88,11 @@ class Sudoku : public CSP {
|
|||
}
|
||||
|
||||
/// Print readable form of assignment
|
||||
void printAssignment(const DiscreteFactor::sharedValues& assignment) const {
|
||||
void printAssignment(const DiscreteFactor::Values& assignment) const {
|
||||
for (size_t i = 0; i < n_; i++) {
|
||||
for (size_t j = 0; j < n_; j++) {
|
||||
Key k = key(i, j);
|
||||
cout << 1 + assignment->at(k) << " ";
|
||||
cout << 1 + assignment.at(k) << " ";
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ class Sudoku : public CSP {
|
|||
|
||||
/// solve and print solution
|
||||
void printSolution() const {
|
||||
DiscreteFactor::sharedValues MPE = optimalAssignment();
|
||||
auto MPE = optimalAssignment();
|
||||
printAssignment(MPE);
|
||||
}
|
||||
|
||||
|
@ -126,14 +126,14 @@ TEST_UNSAFE(Sudoku, small) {
|
|||
0, 1, 0, 0);
|
||||
|
||||
// optimize and check
|
||||
CSP::sharedValues solution = csp.optimalAssignment();
|
||||
auto solution = csp.optimalAssignment();
|
||||
CSP::Values expected;
|
||||
insert(expected)(csp.key(0, 0), 0)(csp.key(0, 1), 1)(csp.key(0, 2), 2)(
|
||||
csp.key(0, 3), 3)(csp.key(1, 0), 2)(csp.key(1, 1), 3)(csp.key(1, 2), 0)(
|
||||
csp.key(1, 3), 1)(csp.key(2, 0), 3)(csp.key(2, 1), 2)(csp.key(2, 2), 1)(
|
||||
csp.key(2, 3), 0)(csp.key(3, 0), 1)(csp.key(3, 1), 0)(csp.key(3, 2), 3)(
|
||||
csp.key(3, 3), 2);
|
||||
EXPECT(assert_equal(expected, *solution));
|
||||
EXPECT(assert_equal(expected, solution));
|
||||
// csp.printAssignment(solution);
|
||||
|
||||
// Do BP (AC1)
|
||||
|
|
Loading…
Reference in New Issue