From 0f464d9d876d9bf6bdfe64d7fe47cd8e35ad3c2c Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Mon, 16 Feb 2015 17:05:10 +0100 Subject: bug #897: fix regression in BiCGSTAB(mat) ctor (an all other iterative solvers). Add respective regression unit test. --- Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'Eigen/src/IterativeLinearSolvers') diff --git a/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h b/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h index 38334028a..46bc0ac78 100644 --- a/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +++ b/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h @@ -54,9 +54,10 @@ public: */ template explicit IterativeSolverBase(const SparseMatrixBase& A) + : mp_matrix(A) { init(); - compute(A.derived()); + compute(mp_matrix); } ~IterativeSolverBase() {} @@ -69,7 +70,7 @@ public: template Derived& analyzePattern(const SparseMatrixBase& A) { - grab(A); + grab(A.derived()); m_preconditioner.analyzePattern(mp_matrix); m_isInitialized = true; m_analysisIsOk = true; @@ -90,7 +91,7 @@ public: Derived& factorize(const SparseMatrixBase& A) { eigen_assert(m_analysisIsOk && "You must first call analyzePattern()"); - grab(A); + grab(A.derived()); m_preconditioner.factorize(mp_matrix); m_factorizationIsOk = true; m_info = Success; @@ -110,7 +111,7 @@ public: template Derived& compute(const SparseMatrixBase& A) { - grab(A); + grab(A.derived()); m_preconditioner.compute(mp_matrix); m_isInitialized = true; m_analysisIsOk = true; @@ -229,6 +230,15 @@ protected: ::new (&mp_matrix) Ref(A); } + void grab(const Ref &A) + { + if(&(A.derived()) != &mp_matrix) + { + mp_matrix.~Ref(); + ::new (&mp_matrix) Ref(A); + } + } + MatrixType m_dummy; Ref mp_matrix; Preconditioner m_preconditioner; -- cgit v1.2.3