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