Commit b03f81ee by Pierre Kraemer

### try some changes in Eigen cholesky solver

parent 734a59a7
 ... @@ -6,12 +6,14 @@ ... @@ -6,12 +6,14 @@ #include "ui_surfaceDeformation.h" #include "ui_surfaceDeformation.h" #include "Utils/drawer.h" //#include "Utils/drawer.h" using namespace CGoGN; using namespace CGoGN; using namespace SCHNApps; using namespace SCHNApps; namespace CGoGN { namespace Utils { class Drawer; } } enum SelectionMode enum SelectionMode { { ... ...
 ... @@ -3,6 +3,8 @@ ... @@ -3,6 +3,8 @@ #include "Algo/Selection/raySelector.h" #include "Algo/Selection/raySelector.h" #include "Algo/Selection/collector.h" #include "Algo/Selection/collector.h" #include "Utils/drawer.h" #include #include #include #include ... ...
 ... @@ -32,17 +32,12 @@ ... @@ -32,17 +32,12 @@ #define __CHOLESKY_SOLVER__ #define __CHOLESKY_SOLVER__ #include #include #include "OpenNL/sparse_matrix.h" #include "cholmod.h" #include "CHOLMOD/cholmod.h" template< class MATRIX, class VECTOR > template class Solver_CHOLESKY class Solver_CHOLESKY { { public: public: typedef MATRIX Matrix ; typedef VECTOR Vector ; typedef typename Vector::CoeffType CoeffType ; Solver_CHOLESKY() { Solver_CHOLESKY() { N = 0 ; N = 0 ; factorized_ = false ; factorized_ = false ; ... @@ -58,40 +53,42 @@ public: ... @@ -58,40 +53,42 @@ public: bool factorized() { return factorized_ ; } bool factorized() { return factorized_ ; } void factorize(const MATRIX &A_in) { void factorize(const Eigen::SparseMatrix& A_in) { assert(A_in.n() == A_in.m()) ; assert(A_in.rows() == A_in.cols()) ; assert(A_in.has_symmetric_storage()) ; // assert(A_in.has_symmetric_storage()) ; N = A_in.n() ; N = A_in.rows() ; int NNZ = A_in.nnz() ; // int NNZ = A_in.nonZeros() ; // Translate sparse matrix into cholmod format // Translate sparse matrix into cholmod format cholmod_sparse* A = cholmod_allocate_sparse(N, N, NNZ, false, true, -1, CHOLMOD_REAL, &c); // cholmod_sparse* A = cholmod_allocate_sparse(N, N, NNZ, false, true, -1, CHOLMOD_REAL, &c); int* colptr = static_cast(A->p) ; // int* colptr = static_cast(A->p) ; int* rowind = static_cast(A->i) ; // int* rowind = static_cast(A->i) ; double* a = static_cast(A->x) ; // double* a = static_cast(A->x) ; // Convert local Matrix into CHOLMOD Matrix // Convert local Matrix into CHOLMOD Matrix int count = 0 ; // int count = 0 ; for(int j = 0; j < N; j++) { // for(int j = 0; j < N; j++) { const typename SparseMatrix::Column& Cj = A_in.column(j) ; // const typename SparseMatrix::Column& Cj = A_in.column(j) ; colptr[j] = count ; // colptr[j] = count ; for(unsigned int ii = 0; ii < Cj.nb_coeffs(); ii++) { // for(unsigned int ii = 0; ii < Cj.nb_coeffs(); ii++) { a[count] = Cj.coeff(ii).a ; // a[count] = Cj.coeff(ii).a ; rowind[count] = Cj.coeff(ii).index ; // rowind[count] = Cj.coeff(ii).index ; count++ ; // count++ ; } // } } // } colptr[N] = NNZ ; // colptr[N] = NNZ ; cholmod_sparse A = Eigen::viewAsCholmod(A_in); // Factorize // Factorize L = cholmod_analyze(A, &c) ; L = cholmod_analyze(&A, &c) ; cholmod_factorize(A, L, &c) ; cholmod_factorize(&A, L, &c) ; factorized_ = true ; factorized_ = true ; // Cleanup // Cleanup cholmod_free_sparse(&A, &c) ; // cholmod_free_sparse(&A, &c) ; } } void solve(const VECTOR& b_in, VECTOR& x_out) { void solve(const VECTOR& b_in, VECTOR& x_out) { ... ...
 ... @@ -36,6 +36,9 @@ ... @@ -36,6 +36,9 @@ #include #include #include #include //#include "cholesky_solver.h" #include #include #include ... @@ -188,9 +191,13 @@ private: ... @@ -188,9 +191,13 @@ private: Eigen::Matrix* x_ ; Eigen::Matrix* x_ ; Eigen::Matrix* b_ ; Eigen::Matrix* b_ ; Eigen::ConjugateGradient >* symmetric_solver_; // Solver_CHOLESKY* direct_solver_; Eigen::BiCGSTAB >* nonsymmetric_solver_; Eigen::SimplicialLDLT >* direct_solver_; Eigen::LDLT >* direct_solver_; // Eigen::ConjugateGradient >* symmetric_solver_; // Eigen::BiCGSTAB >* nonsymmetric_solver_; // Eigen::SimplicialLDLT >* direct_solver_; } ; } ; #include "OpenNL/linear_solver.hpp" #include "OpenNL/linear_solver.hpp" ... ...
 ... @@ -33,8 +33,8 @@ LinearSolver::LinearSolver(unsigned int nb_variables) { ... @@ -33,8 +33,8 @@ LinearSolver::LinearSolver(unsigned int nb_variables) { A_ = NULL ; A_ = NULL ; x_ = NULL ; x_ = NULL ; b_ = NULL ; b_ = NULL ; symmetric_solver_ = NULL; // symmetric_solver_ = NULL; nonsymmetric_solver_ = NULL; // nonsymmetric_solver_ = NULL; direct_solver_ = NULL; direct_solver_ = NULL; } } ... @@ -172,7 +172,10 @@ void LinearSolver::end_row() { ... @@ -172,7 +172,10 @@ void LinearSolver::end_row() { template template void LinearSolver::end_system() { void LinearSolver::end_system() { if(least_squares_ && direct_ && !direct_solver_) if(least_squares_ && direct_ && !direct_solver_) direct_solver_ = new Eigen::SimplicialLDLT >(*A_); direct_solver_ = new Eigen::LDLT >(*A_); // if(least_squares_ && direct_ && !direct_solver_->factorized()) // direct_solver_->factorize(*A_); transition(IN_SYSTEM, CONSTRUCTED) ; transition(IN_SYSTEM, CONSTRUCTED) ; } } ... @@ -185,12 +188,12 @@ void LinearSolver::solve() { ... @@ -185,12 +188,12 @@ void LinearSolver::solve() { if(direct_) { if(direct_) { *x_ = direct_solver_->solve(*b_) ; *x_ = direct_solver_->solve(*b_) ; } else { } else { symmetric_solver_ = new Eigen::ConjugateGradient >(*A_) ; Eigen::ConjugateGradient > solver(*A_) ; *x_ = symmetric_solver_->solve(*b_) ; *x_ = solver->solve(*b_) ; } } } else { } else { nonsymmetric_solver_ = new Eigen::BiCGSTAB >(*A_) ; Eigen::BiCGSTAB > solver(*A_) ; *x_ = nonsymmetric_solver_->solve(*b_) ; *x_ = solver->solve(*b_) ; } } vector_to_variables() ; vector_to_variables() ; transition(CONSTRUCTED, SOLVED) ; transition(CONSTRUCTED, SOLVED) ; ... @@ -206,9 +209,10 @@ void LinearSolver::reset(bool keep_matrix) { ... @@ -206,9 +209,10 @@ void LinearSolver::reset(bool keep_matrix) { delete A_ ; A_ = NULL ; delete A_ ; A_ = NULL ; delete x_ ; x_ = NULL ; delete x_ ; x_ = NULL ; delete b_ ; b_ = NULL ; delete b_ ; b_ = NULL ; if(symmetric_solver_) delete symmetric_solver_ ; symmetric_solver_ = NULL ; // if(symmetric_solver_) delete symmetric_solver_ ; symmetric_solver_ = NULL ; if(nonsymmetric_solver_) delete nonsymmetric_solver_ ; nonsymmetric_solver_ = NULL ; // if(nonsymmetric_solver_) delete nonsymmetric_solver_ ; nonsymmetric_solver_ = NULL ; if(direct_solver_) delete direct_solver_ ; direct_solver_ = NULL ; if(direct_solver_) delete direct_solver_ ; direct_solver_ = NULL ; // direct_solver_->reset(); matrix_already_set_ = false ; matrix_already_set_ = false ; for(unsigned int i = 0; i < nb_variables_; ++i) { for(unsigned int i = 0; i < nb_variables_; ++i) { variable_[i].unlock() ; variable_[i].unlock() ; ... ...
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!