Isolated main colamd call in function templated on key type.
parent
a5ae9c12ef
commit
78ac705d05
|
@ -230,38 +230,27 @@ pair<Matrix,Vector> LinearFactorGraph::matrix(const Ordering& ordering) const {
|
|||
|
||||
/* ************************************************************************* */
|
||||
|
||||
Ordering LinearFactorGraph::getOrdering() const {
|
||||
/**
|
||||
* Call colamd given a column-major symbolic matrix A
|
||||
* @param n_col colamd arg 1: number of rows in A
|
||||
* @param n_row colamd arg 2: number of columns in A
|
||||
* @param nrNonZeros number of non-zero entries in A
|
||||
* @param columns map from keys to a sparse column of non-zero row indices
|
||||
*/
|
||||
template <class Key>
|
||||
Ordering colamd(int n_col, int n_row, int nrNonZeros, const map<Key, vector<int> >& columns) {
|
||||
|
||||
// A factor graph is really laid out in row-major format, each factor a row
|
||||
// Below, we compute a symbolic matrix stored in sparse columns.
|
||||
typedef string Key; // default case with string keys
|
||||
map<Key, vector<int> > columns; // map from keys to a sparse column of non-zero row indices
|
||||
int nrNonZeros = 0; // number of non-zero entries
|
||||
int n_row = factors_.size(); /* colamd arg 1: number of rows in A */
|
||||
|
||||
// loop over all factors = rows
|
||||
for (int i = 0; i < n_row; i++) {
|
||||
shared_factor factor = factors_[i];
|
||||
for (map<Key, Matrix>::const_iterator lit = factor->begin(); lit != factor->end(); lit++) {
|
||||
const Key& key = lit->first;
|
||||
columns[key].push_back(i);
|
||||
nrNonZeros++;
|
||||
}
|
||||
}
|
||||
int n_col = (int)(columns.size()); /* colamd arg 2: number of columns in A */
|
||||
|
||||
if(n_col == 0) return Ordering(); // empty ordering
|
||||
|
||||
// Now convert to compressed column major format colamd wants it in (== MATLAB format!)
|
||||
// Convert to compressed column major format colamd wants it in (== MATLAB format!)
|
||||
vector<Key> initialOrder;
|
||||
int Alen = nrNonZeros*30; /* colamd arg 3: size of the array A */
|
||||
int Alen = nrNonZeros*30; /* colamd arg 3: size of the array A TODO: use Tim's function ! */
|
||||
int * A = new int[Alen]; /* colamd arg 4: row indices of A, of size Alen */
|
||||
int * p = new int[n_col + 1]; /* colamd arg 5: column pointers of A, of size n_col+1 */
|
||||
{
|
||||
p[0] = 0;
|
||||
int j = 1;
|
||||
int count = 0;
|
||||
for(map<Key, vector<int> >::const_iterator it = columns.begin(); it != columns.end(); it++)
|
||||
typedef typename map<Key, vector<int> >::const_iterator iterator;
|
||||
for(iterator it = columns.begin(); it != columns.end(); it++)
|
||||
{
|
||||
const Key& key = it->first;
|
||||
const vector<int>& column = it->second;
|
||||
|
@ -290,3 +279,30 @@ Ordering LinearFactorGraph::getOrdering() const {
|
|||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
Ordering LinearFactorGraph::getOrdering() const {
|
||||
|
||||
// A factor graph is really laid out in row-major format, each factor a row
|
||||
// Below, we compute a symbolic matrix stored in sparse columns.
|
||||
typedef string Key; // default case with string keys
|
||||
map<Key, vector<int> > columns; // map from keys to a sparse column of non-zero row indices
|
||||
int nrNonZeros = 0; // number of non-zero entries
|
||||
int n_row = factors_.size(); /* colamd arg 1: number of rows in A */
|
||||
|
||||
// loop over all factors = rows
|
||||
for (int i = 0; i < n_row; i++) {
|
||||
shared_factor factor = factors_[i];
|
||||
for (map<Key, Matrix>::const_iterator lit = factor->begin(); lit != factor->end(); lit++) {
|
||||
const Key& key = lit->first;
|
||||
columns[key].push_back(i);
|
||||
nrNonZeros++;
|
||||
}
|
||||
}
|
||||
int n_col = (int)(columns.size()); /* colamd arg 2: number of columns in A */
|
||||
|
||||
if(n_col == 0)
|
||||
return Ordering(); // empty ordering
|
||||
else
|
||||
return colamd(n_col, n_row, nrNonZeros, columns);
|
||||
}
|
||||
|
||||
/* ************************************************************************* */
|
||||
|
|
Loading…
Reference in New Issue