SparseOptimizerIncremental::SparseOptimizerIncremental() { _cholmodSparse = new CholmodExt(); _cholmodFactor = 0; cholmod_start(&_cholmodCommon); // setup ordering strategy to not permute the matrix _cholmodCommon.nmethods = 1 ; _cholmodCommon.method[0].ordering = CHOLMOD_NATURAL; _cholmodCommon.postorder = 0; _cholmodCommon.supernodal = CHOLMOD_SIMPLICIAL; _permutedUpdate = cholmod_allocate_triplet(1000, 1000, 1024, 0, CHOLMOD_REAL, &_cholmodCommon); _L = 0; _cholmodFactor = 0; _solverInterface = 0; }
// doing cholesky decomposition void Algebra::CK_decomp(Matrix &A, cholmod_factor *&L, cholmod_common *cm, size_t &peak_mem, size_t & CK_mem){ // doing factorization first cholmod_triplet * T; size_t n_row = A.get_row(); size_t n_col = A.get_row(); size_t nnz = A.size(); int *Ti; int *Tj; double *Tx; int stype = -1;// lower triangular storage T = cholmod_allocate_triplet(n_row, n_col, nnz, stype, CHOLMOD_REAL, cm); Ti = static_cast<int *>(T->i); Tj = static_cast<int *>(T->j); Tx = static_cast<double *>(T->x); // copy data into T for(size_t k=0;k<nnz;k++){ Ti[k] = A.Ti[k]; Tj[k] = A.Tj[k]; Tx[k] = A.Tx[k]; } T->nnz = nnz; A.Ti.clear(); A.Tj.clear(); A.Tx.clear(); cholmod_sparse * A_cholmod; A_cholmod = cholmod_triplet_to_sparse(T, nnz, cm); // free the triplet pointer cholmod_free_triplet(&T, cm); //cm->supernodal = -1; L = cholmod_analyze(A_cholmod, cm); //L->ordering = CHOLMOD_NATURAL; cholmod_factorize(A_cholmod, L, cm); //cholmod_print_factor(L, "L", cm); //if(peak_mem < cm->memory_usage) //peak_mem = cm->memory_usage; //CK_mem += cm->lnz; cholmod_free_sparse(&A_cholmod, cm); }