#ifndef QPSOLVER_CHOLESKYSPARSESOLVER_H #define QPSOLVER_CHOLESKYSPARSESOLVER_H #include "types.h" #include "SparseMatrixMath.h" template class CholeskySparseSolver { public: CholeskySparseSolver() = default; void preSetup(const DenseMatrix& kktMat, bool b_print = true); void preSetup(const std::vector>& kktMat, u32 n, bool b_print = true); void setup(bool b_print = true); void solve(Vector& out); void amdOrder(MatCSC& mat, u32* perm, u32* iperm); ~CholeskySparseSolver() { A.freeAll(); L.freeAll(); delete[] reverseOrder; delete[] nnzLCol; delete[] P; delete[] D; delete[] rP; delete[] rD; delete[] parent; delete[] tempSolve; } private: void reorder(); u32 symbolicFactor(); void factor(); void sanityCheck(); void solveOrder(); SparseTriple A_triple; MatCSC A; MatCSC L; u32 n; T* tempSolve = nullptr; T* reverseOrder = nullptr; u32* nnzLCol = nullptr; // # of nonzeros per column in L u32* P = nullptr; // reorder permutation u32* rP = nullptr; // reorder inverse permutation T* D = nullptr; // Diagonal T* rD = nullptr; // inverse diagonal s32* parent = nullptr; // tree }; #endif //QPSOLVER_CHOLESKYSPARSESOLVER_H