SuiteSparse cleanup.
1. CreateSparseMatrixTransposeView now returns a struct instead
of a pointer.
2. Add AnalyzeCholeskyWithNaturalOrdering.
Change-Id: If27a5502949c3994edd95be0d25ec7a0d1fa1ae1
diff --git a/internal/ceres/suitesparse.cc b/internal/ceres/suitesparse.cc
index 87fae75..9063fa0 100644
--- a/internal/ceres/suitesparse.cc
+++ b/internal/ceres/suitesparse.cc
@@ -87,23 +87,23 @@
return cholmod_triplet_to_sparse(&triplet, triplet.nnz, &cc_);
}
-cholmod_sparse* SuiteSparse::CreateSparseMatrixTransposeView(
+cholmod_sparse SuiteSparse::CreateSparseMatrixTransposeView(
CompressedRowSparseMatrix* A) {
- cholmod_sparse* m = new cholmod_sparse_struct;
- m->nrow = A->num_cols();
- m->ncol = A->num_rows();
- m->nzmax = A->num_nonzeros();
-
- m->p = reinterpret_cast<void*>(A->mutable_rows());
- m->i = reinterpret_cast<void*>(A->mutable_cols());
- m->x = reinterpret_cast<void*>(A->mutable_values());
-
- m->stype = 0; // Matrix is not symmetric.
- m->itype = CHOLMOD_INT;
- m->xtype = CHOLMOD_REAL;
- m->dtype = CHOLMOD_DOUBLE;
- m->sorted = 1;
- m->packed = 1;
+ cholmod_sparse m;
+ m.nrow = A->num_cols();
+ m.ncol = A->num_rows();
+ m.nzmax = A->num_nonzeros();
+ m.nz = NULL;
+ m.p = reinterpret_cast<void*>(A->mutable_rows());
+ m.i = reinterpret_cast<void*>(A->mutable_cols());
+ m.x = reinterpret_cast<void*>(A->mutable_values());
+ m.z = NULL;
+ m.stype = 0; // Matrix is not symmetric.
+ m.itype = CHOLMOD_INT;
+ m.xtype = CHOLMOD_REAL;
+ m.dtype = CHOLMOD_DOUBLE;
+ m.sorted = 1;
+ m.packed = 1;
return m;
}
@@ -172,6 +172,23 @@
return factor;
}
+cholmod_factor* SuiteSparse::AnalyzeCholeskyWithNaturalOrdering(cholmod_sparse* A) {
+ cc_.nmethods = 1;
+ cc_.method[0].ordering = CHOLMOD_NATURAL;
+ cc_.postorder = 0;
+
+ cholmod_factor* factor = cholmod_analyze(A, &cc_);
+ CHECK_EQ(cc_.status, CHOLMOD_OK)
+ << "Cholmod symbolic analysis failed " << cc_.status;
+ CHECK_NOTNULL(factor);
+
+ if (VLOG_IS_ON(2)) {
+ cholmod_print_common(const_cast<char*>("Symbolic Analysis"), &cc_);
+ }
+
+ return factor;
+}
+
bool SuiteSparse::BlockAMDOrdering(const cholmod_sparse* A,
const vector<int>& row_blocks,
const vector<int>& col_blocks,