inline int LinSolve(int N, int NRHS, _F *A, int LDA, _F *B, int LDB) { std::vector<int> iPIV(N,0); return LinSolve(N,NRHS,A,LDA,B,LDB,&iPIV[0]); };
inline CB_INT LinSolve(const CB_INT N, const CB_INT NRHS, _F *A, const CB_INT IA, const CB_INT JA, const CXXBLACS::ScaLAPACK_Desc_t DESCA, _F *B, const CB_INT IB, const CB_INT JB, const CXXBLACS::ScaLAPACK_Desc_t DESCB) { std::vector<CB_INT> iPIV(DESCA[8] + DESCA[4],0); // LLD + MB return LinSolve(N,NRHS,A,IA,JA,DESCA,B,IB,JB,DESCB,&iPIV[0]); }
inline int LinSolve(int N, int NRHS, _F *A, int LDA, _F *B, int LDB, CQMemManager &mem) { int* iPIV = mem.malloc<int>(N); int INFO = LinSolve(N,NRHS,A,LDA,B,LDB,iPIV); mem.free(iPIV); return INFO; };
inline CB_INT LinSolve(const CB_INT N, const CB_INT NRHS, _F *A, const CB_INT IA, const CB_INT JA, const CXXBLACS::ScaLAPACK_Desc_t DESCA, _F *B, const CB_INT IB, const CB_INT JB, const CXXBLACS::ScaLAPACK_Desc_t DESCB, CQMemManager &mem) { CB_INT* iPIV = mem.malloc<CB_INT>(DESCA[8] + DESCA[4]); // LLD + MB CB_INT INFO = LinSolve(N,NRHS,A,IA,JA,DESCA,B,IB,JB,DESCB,iPIV); mem.free(iPIV); return INFO; }
// Simple rather than efficient (esp. the call to eval) std::vector<RingElem> BM_generic(const SparsePolyRing& P, const ConstMatrixView& pts) { if (CoeffRing(P) != RingOf(pts)) CoCoA_ERROR(ERR::MixedRings, "Buchberger-Moeller"); if (NumIndets(P) < NumCols(pts)) CoCoA_ERROR(ERR::IncompatDims, "Buchberger-Moeller"); const long NumPts = NumRows(pts); const long dim = NumCols(pts); const ring k = CoeffRing(P); vector<RingElem> GB; const PPMonoid TT = PPM(P); QBGenerator QBG(TT); QBG.myCornerPPIntoQB(one(TT)); matrix M = NewDenseMat(k, 1, NumPts); // Fill first row with 1: for (int i=0; i<NumPts; ++i) SetEntry(M,0,i, 1); // The next loop removes the last indets from consideration. for (int i=dim; i < NumIndets(TT); ++i) QBG.myCornerPPIntoAvoidSet(indet(TT,i)); while (!QBG.myCorners().empty()) { const PPMonoidElem t = QBG.myCorners().front(); const vector<RingElem> v = eval(t, pts); ConstMatrixView NewRow = RowMat(v); const matrix a = LinSolve(transpose(M), transpose(NewRow)); if (IsValidSolution(a)) { QBG.myCornerPPIntoAvoidSet(t); RingElem NewGBElem = monomial(P, one(k), t); const vector<PPMonoidElem>& QB = QBG.myQB(); for (int i=0; i < NumRows(M); ++i) NewGBElem -= monomial(P, a(i,0), QB[i]); GB.push_back(NewGBElem); } else { QBG.myCornerPPIntoQB(t); M = NewDenseMat(ConcatVer(M, NewRow)); } } return GB; }