Moved CCOLAMD call into non-templated code to avoid dependency of projects on CCOLAMD includes. Removed unused includes and unnecessary templates in Inference at the same time
parent
9c5068e90a
commit
92ddabc4ac
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <gtsam/base/timing.h>
|
||||
#include <gtsam/inference/SymbolicFactorGraph.h>
|
||||
#include <gtsam/inference/BayesTree-inl.h>
|
||||
#include <gtsam/inference/JunctionTree.h>
|
||||
|
|
|
|||
|
|
@ -17,98 +17,36 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/lambda/bind.hpp>
|
||||
#include <boost/lambda/lambda.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
#include <ccolamd.h>
|
||||
|
||||
#include <gtsam/base/timing.h>
|
||||
#include <gtsam/inference/inference.h>
|
||||
#include <gtsam/inference/FactorGraph-inl.h>
|
||||
#include <gtsam/inference/BayesNet-inl.h>
|
||||
#include <gtsam/inference/ConditionalBase.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
/* ************************************************************************* */
|
||||
template<class VARIABLEINDEXTYPE, typename CONSTRAINTCONTAINER>
|
||||
Permutation::shared_ptr Inference::PermutationCOLAMD(const VARIABLEINDEXTYPE& variableIndex, const CONSTRAINTCONTAINER& constrainLast) {
|
||||
size_t nEntries = variableIndex.nEntries(), nFactors = variableIndex.nFactors(), nVars = variableIndex.size();
|
||||
// Convert to compressed column major format colamd wants it in (== MATLAB format!)
|
||||
int Alen = ccolamd_recommended(nEntries, nFactors, nVars); /* colamd arg 3: size of the array A */
|
||||
int * A = new int[Alen]; /* colamd arg 4: row indices of A, of size Alen */
|
||||
int * p = new int[nVars + 1]; /* colamd arg 5: column pointers of A, of size n_col+1 */
|
||||
int * cmember = new int[nVars]; /* Constraint set of A, of size n_col */
|
||||
template<typename CONSTRAINED>
|
||||
Permutation::shared_ptr Inference::PermutationCOLAMD(const VariableIndex& variableIndex, const CONSTRAINED& constrainLast) {
|
||||
|
||||
static const bool debug = false;
|
||||
|
||||
p[0] = 0;
|
||||
int count = 0;
|
||||
for(Index var = 0; var < variableIndex.size(); ++var) {
|
||||
const typename VARIABLEINDEXTYPE::Factors& column(variableIndex[var]);
|
||||
size_t lastFactorId = numeric_limits<size_t>::max();
|
||||
BOOST_FOREACH(const size_t& factorIndex, column) {
|
||||
if(lastFactorId != numeric_limits<size_t>::max())
|
||||
assert(factorIndex > lastFactorId);
|
||||
A[count++] = factorIndex; // copy sparse column
|
||||
if(debug) cout << "A[" << count-1 << "] = " << factorIndex << endl;
|
||||
}
|
||||
p[var+1] = count; // column j (base 1) goes from A[j-1] to A[j]-1
|
||||
cmember[var] = 0;
|
||||
}
|
||||
vector<int> cmember(variableIndex.size(), 0);
|
||||
|
||||
// If at least some variables are not constrained to be last, constrain the
|
||||
// ones that should be constrained.
|
||||
if(constrainLast.size() < variableIndex.size()) {
|
||||
BOOST_FOREACH(Index var, constrainLast) {
|
||||
assert(var < nVars);
|
||||
assert(var < variableIndex.size());
|
||||
cmember[var] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
assert((size_t)count == variableIndex.nEntries());
|
||||
return PermutationCOLAMD_(variableIndex, cmember);
|
||||
}
|
||||
|
||||
if(debug)
|
||||
for(size_t i=0; i<nVars+1; ++i)
|
||||
cout << "p[" << i << "] = " << p[i] << endl;
|
||||
|
||||
double* knobs = NULL; /* colamd arg 6: parameters (uses defaults if NULL) */
|
||||
// double knobs[CCOLAMD_KNOBS];
|
||||
// ccolamd_set_defaults(knobs);
|
||||
// knobs[CCOLAMD_DENSE_ROW]=-1;
|
||||
// knobs[CCOLAMD_DENSE_COL]=-1;
|
||||
|
||||
int stats[CCOLAMD_STATS]; /* colamd arg 7: colamd output statistics and error codes */
|
||||
|
||||
// call colamd, result will be in p
|
||||
/* returns (1) if successful, (0) otherwise*/
|
||||
int rv = ccolamd(nFactors, nVars, Alen, A, p, knobs, stats, cmember);
|
||||
if(rv != 1)
|
||||
throw runtime_error((boost::format("ccolamd failed with return value %1%")%rv).str());
|
||||
delete[] A; // delete symbolic A
|
||||
delete[] cmember;
|
||||
|
||||
// ccolamd_report(stats);
|
||||
|
||||
// Convert elimination ordering in p to an ordering
|
||||
Permutation::shared_ptr permutation(new Permutation(nVars));
|
||||
for (Index j = 0; j < nVars; j++) {
|
||||
permutation->operator[](j) = p[j];
|
||||
if(debug) cout << "COLAMD: " << j << "->" << p[j] << endl;
|
||||
}
|
||||
if(debug) cout << "COLAMD: p[" << nVars << "] = " << p[nVars] << endl;
|
||||
delete[] p; // delete colamd result vector
|
||||
|
||||
return permutation;
|
||||
/* ************************************************************************* */
|
||||
inline Permutation::shared_ptr Inference::PermutationCOLAMD(const VariableIndex& variableIndex) {
|
||||
vector<int> cmember(variableIndex.size(), 0);
|
||||
return PermutationCOLAMD_(variableIndex, cmember);
|
||||
}
|
||||
|
||||
} // namespace gtsam
|
||||
|
|
|
|||
|
|
@ -16,10 +16,69 @@
|
|||
*/
|
||||
|
||||
#include <gtsam/inference/inference-inl.h>
|
||||
|
||||
#include <gtsam/inference/SymbolicFactorGraph.h>
|
||||
|
||||
#include <boost/format.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <ccolamd.h>
|
||||
|
||||
namespace gtsam {
|
||||
|
||||
Permutation::shared_ptr Inference::PermutationCOLAMD_(const VariableIndex& variableIndex, std::vector<int>& cmember) {
|
||||
size_t nEntries = variableIndex.nEntries(), nFactors = variableIndex.nFactors(), nVars = variableIndex.size();
|
||||
// Convert to compressed column major format colamd wants it in (== MATLAB format!)
|
||||
int Alen = ccolamd_recommended(nEntries, nFactors, nVars); /* colamd arg 3: size of the array A */
|
||||
vector<int> A = vector<int>(Alen); /* colamd arg 4: row indices of A, of size Alen */
|
||||
vector<int> p = vector<int>(nVars + 1); /* colamd arg 5: column pointers of A, of size n_col+1 */
|
||||
|
||||
static const bool debug = false;
|
||||
|
||||
p[0] = 0;
|
||||
int count = 0;
|
||||
for(Index var = 0; var < variableIndex.size(); ++var) {
|
||||
const VariableIndex::Factors& column(variableIndex[var]);
|
||||
size_t lastFactorId = numeric_limits<size_t>::max();
|
||||
BOOST_FOREACH(const size_t& factorIndex, column) {
|
||||
if(lastFactorId != numeric_limits<size_t>::max())
|
||||
assert(factorIndex > lastFactorId);
|
||||
A[count++] = factorIndex; // copy sparse column
|
||||
if(debug) cout << "A[" << count-1 << "] = " << factorIndex << endl;
|
||||
}
|
||||
p[var+1] = count; // column j (base 1) goes from A[j-1] to A[j]-1
|
||||
}
|
||||
|
||||
assert((size_t)count == variableIndex.nEntries());
|
||||
|
||||
if(debug)
|
||||
for(size_t i=0; i<nVars+1; ++i)
|
||||
cout << "p[" << i << "] = " << p[i] << endl;
|
||||
|
||||
double* knobs = NULL; /* colamd arg 6: parameters (uses defaults if NULL) */
|
||||
// double knobs[CCOLAMD_KNOBS];
|
||||
// ccolamd_set_defaults(knobs);
|
||||
// knobs[CCOLAMD_DENSE_ROW]=-1;
|
||||
// knobs[CCOLAMD_DENSE_COL]=-1;
|
||||
|
||||
int stats[CCOLAMD_STATS]; /* colamd arg 7: colamd output statistics and error codes */
|
||||
|
||||
// call colamd, result will be in p
|
||||
/* returns (1) if successful, (0) otherwise*/
|
||||
int rv = ccolamd(nFactors, nVars, Alen, &A[0], &p[0], knobs, stats, &cmember[0]);
|
||||
if(rv != 1)
|
||||
throw runtime_error((boost::format("ccolamd failed with return value %1%")%rv).str());
|
||||
|
||||
// ccolamd_report(stats);
|
||||
|
||||
// Convert elimination ordering in p to an ordering
|
||||
Permutation::shared_ptr permutation(new Permutation(nVars));
|
||||
for (Index j = 0; j < nVars; j++) {
|
||||
permutation->operator[](j) = p[j];
|
||||
if(debug) cout << "COLAMD: " << j << "->" << p[j] << endl;
|
||||
}
|
||||
if(debug) cout << "COLAMD: p[" << nVars << "] = " << p[nVars] << endl;
|
||||
|
||||
return permutation;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,15 +34,21 @@ namespace gtsam {
|
|||
/* Static members only, private constructor */
|
||||
Inference() {}
|
||||
|
||||
// Internal version that actually calls colamd after the constraint set is created in the right format
|
||||
static Permutation::shared_ptr PermutationCOLAMD_(const VariableIndex& variableIndex, std::vector<int>& cmember);
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Compute a permutation (variable ordering) using colamd
|
||||
*/
|
||||
template<class VARIABLEINDEXTYPE>
|
||||
static boost::shared_ptr<Permutation> PermutationCOLAMD(const VARIABLEINDEXTYPE& variableIndex) { return PermutationCOLAMD(variableIndex, std::vector<Index>()); }
|
||||
template<class VARIABLEINDEXTYPE, typename CONSTRAINTCONTAINER>
|
||||
static boost::shared_ptr<Permutation> PermutationCOLAMD(const VARIABLEINDEXTYPE& variableIndex, const CONSTRAINTCONTAINER& constrainLast);
|
||||
static Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex);
|
||||
|
||||
/**
|
||||
* Compute a permutation (variable ordering) using constrained colamd
|
||||
*/
|
||||
template<typename CONSTRAINED>
|
||||
static Permutation::shared_ptr PermutationCOLAMD(const VariableIndex& variableIndex, const CONSTRAINED& constrainLast);
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
|
||||
using namespace std;
|
||||
using namespace gtsam;
|
||||
using namespace boost::assign;
|
||||
|
||||
// trick from some reading group
|
||||
#define FOREACH_PAIR( KEY, VAL, COL) BOOST_FOREACH (boost::tie(KEY,VAL),COL)
|
||||
|
|
|
|||
Loading…
Reference in New Issue