mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-29 08:34:37 +08:00
Block oriented fill reducing orderings.
By virtue of the modeling layer in Ceres being block oriented, all the matrices used by Ceres are also block oriented. When doing sparse direct factorization of these matrices, the fill-reducing ordering algorithms can either be run on the block or the scalar form of these matrices. Running it on the block form exposes more of the super-nodal structure of the matrix to the Cholesky factorization routines. This leads to substantial gains in factorization performance. This changelist adds support for approximate minimium degree orderings to be computed on the block structure of the Schur complement matrix. This affects, SchurComplementSolver and VisibilityBasedPreconditioner and SparseNormalCholesky when using SuiteSparse. A bool, use_block_amd has been added to Solver::Options and bundle_adjuster.cc has been updated to allow testing with it. When combined with a multithreaded Schur elimination, speed ups can be seen quite uniformly across the board. For some problems this can be dramatic, reducing the factorization time from 70 seconds down to 17 seconds. Change-Id: I15ebb0afcbc85ada032ec8d179ee3a2f7c8d3e46
This commit is contained in:
@@ -31,11 +31,13 @@
|
||||
#ifndef CERES_INTERNAL_COMPRESSED_ROW_SPARSE_MATRIX_H_
|
||||
#define CERES_INTERNAL_COMPRESSED_ROW_SPARSE_MATRIX_H_
|
||||
|
||||
#include <vector>
|
||||
#include <glog/logging.h>
|
||||
#include "ceres/sparse_matrix.h"
|
||||
#include "ceres/triplet_sparse_matrix.h"
|
||||
#include "ceres/internal/eigen.h"
|
||||
#include "ceres/internal/macros.h"
|
||||
#include "ceres/internal/port.h"
|
||||
#include "ceres/types.h"
|
||||
|
||||
namespace ceres {
|
||||
@@ -110,6 +112,12 @@ class CompressedRowSparseMatrix : public SparseMatrix {
|
||||
const int* rows() const { return rows_.get(); }
|
||||
int* mutable_rows() { return rows_.get(); }
|
||||
|
||||
const vector<int>& row_blocks() const { return row_blocks_; };
|
||||
vector<int>* mutable_row_blocks() { return &row_blocks_; };
|
||||
|
||||
const vector<int>& col_blocks() const { return col_blocks_; };
|
||||
vector<int>* mutable_col_blocks() { return &col_blocks_; };
|
||||
|
||||
private:
|
||||
scoped_array<int> cols_;
|
||||
scoped_array<int> rows_;
|
||||
@@ -117,9 +125,16 @@ class CompressedRowSparseMatrix : public SparseMatrix {
|
||||
|
||||
int num_rows_;
|
||||
int num_cols_;
|
||||
|
||||
int max_num_nonzeros_;
|
||||
|
||||
// If the matrix has an underlying block structure, then it can also
|
||||
// carry with it row and column block sizes. This is auxilliary and
|
||||
// optional information for use by algorithms operating on the
|
||||
// matrix. The class itself does not make use of this information in
|
||||
// any way.
|
||||
vector<int> row_blocks_;
|
||||
vector<int> col_blocks_;
|
||||
|
||||
CERES_DISALLOW_COPY_AND_ASSIGN(CompressedRowSparseMatrix);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user