Miscellaneous fixes.
Change-Id: I521e11f2d20bf24960bbc6b5dab4ec8bb1503d23
diff --git a/docs/changes.tex b/docs/changes.tex
index 5e5bf44..cd41fd3 100644
--- a/docs/changes.tex
+++ b/docs/changes.tex
@@ -12,6 +12,8 @@
TolerantLossFunction} and \texttt{ComposedLossFunction}. (James Roseborough).
\item New \texttt{DENSE\_NORMAL\_CHOLESKY} linear solver, which uses Eigen's
LDLT factorization on the normal equations.
+\item Cached symbolic factorization when using \texttt{CXSparse}.
+ (Petter Strandark)
\item The traditional Dogleg solver now uses an elliptical trust
region (Markus Moll)
\item Support for returning initial and final gradients \& Jacobians.
@@ -38,7 +40,7 @@
\begin{itemize}
\item Do not link to \texttt{libgomp} when building on
windows. (Petter Strandmark)
-\item Include \texttt{gflags.h} in \texttt{test_utils.cc}. (Petter
+\item Include \texttt{gflags.h} in \texttt{test\_utils.cc}. (Petter
Strandmark)
\item Use standard random number generation routines. (Petter Strandmark)
\item \texttt{TrustRegionMinimizer} does not implicitly negate the
diff --git a/internal/ceres/cxsparse.cc b/internal/ceres/cxsparse.cc
index f54d24f..ca36ce0 100644
--- a/internal/ceres/cxsparse.cc
+++ b/internal/ceres/cxsparse.cc
@@ -48,7 +48,9 @@
}
}
-bool CXSparse::SolveCholesky(cs_di* A, cs_dis* factor, double* b) {
+bool CXSparse::SolveCholesky(cs_di* A,
+ cs_dis* symbolic_factorization,
+ double* b) {
// Make sure we have enough scratch space available.
if (scratch_size_ < A->n) {
if (scratch_size_ > 0) {
@@ -58,28 +60,29 @@
}
// Solve using Cholesky factorization
- csn* N = cs_chol(A, factor);
- if (N == NULL) {
+ csn* numeric_factorization = cs_chol(A, symbolic_factorization);
+ if (numeric_factorization == NULL) {
LOG(WARNING) << "Cholesky factorization failed.";
return false;
}
// When the Cholesky factorization succeeded, these methods are guaranteed to
- // succeed as well. In the comments below, "x" refers to the scratch space.
+ // succeeded as well. In the comments below, "x" refers to the scratch space.
+ //
// Set x = P * b.
- cs_ipvec(factor->pinv, b, scratch_, A->n);
+ cs_ipvec(symbolic_factorization->pinv, b, scratch_, A->n);
// Set x = L \ x.
- cs_lsolve(N->L, scratch_);
+ cs_lsolve(numeric_factorization->L, scratch_);
// Set x = L' \ x.
- cs_ltsolve(N->L, scratch_);
+ cs_ltsolve(numeric_factorization->L, scratch_);
// Set b = P' * x.
- cs_pvec(factor->pinv, scratch_, b, A->n);
+ cs_pvec(symbolic_factorization->pinv, scratch_, b, A->n);
// Free Cholesky factorization.
- cs_nfree(N);
+ cs_nfree(numeric_factorization);
return true;
}
diff --git a/internal/ceres/cxsparse.h b/internal/ceres/cxsparse.h
index a126510..d3b64fc 100644
--- a/internal/ceres/cxsparse.h
+++ b/internal/ceres/cxsparse.h
@@ -51,13 +51,13 @@
~CXSparse();
// Solves a symmetric linear system A * x = b using Cholesky factorization.
- // A - The system matrix.
- // factor - The symbolic factorization of A. This is obtained from
- // AnalyzeCholesky.
- // b - The right hand size of the linear equation. This array will also
- // recieve the solution.
+ // A - The system matrix.
+ // symbolic_factorization - The symbolic factorization of A. This is obtained
+ // from AnalyzeCholesky.
+ // b - The right hand size of the linear equation. This
+ // array will also recieve the solution.
// Returns false if Cholesky factorization of A fails.
- bool SolveCholesky(cs_di* A, cs_dis* factor, double* b);
+ bool SolveCholesky(cs_di* A, cs_dis* symbolic_factorization, double* b);
// Creates a sparse matrix from a compressed-column form. No memory is
// allocated or copied; the structure A is filled out with info from the