SchreyerOrder *value() { if (symm1_result == 0) { symm1_result = SchreyerOrder::create(M); if (n >= 0) { symm1_base = M->make_one(); symm1(0, n); M->remove(symm1_base); } } return symm1_result; }
FreeModule *value() { if (symm1_result == 0) { symm1_result = F->get_ring()->make_FreeModule(); if (n >= 0) { symm1_deg = D->make_one(); symm1(0, n); D->remove(symm1_deg); } } return symm1_result; }
void MTLmarks::DmatDmatRun(std::string benchmark) { if(benchmark == "dmatdmatadd"){ mtl_result = dmatdmatadd(size, steps); } else if(benchmark == "dmatdmatmult"){ mtl_result = dmatdmatmult(size, steps); } else if(benchmark == "cmajordmdmmult"){ mtl_result = cmajordmdmmult(size, steps); } else if(benchmark == "rmajordmdmmult"){ mtl_result = rmajordmdmmult(size, steps); } else if(benchmark == "nestedprod"){ mtl_result = nestedprod(size, steps); } else if(benchmark == "symm1"){ mtl_result = symm1(size, steps); } else if(benchmark == "symm1rect"){ mtl_result = symm1rect(size, steps); } else if(benchmark == "symm2"){ mtl_result = symm2(size, steps); } else if(benchmark == "syr2k"){ mtl_result = syr2k(size, steps); } else if(benchmark == "syr2krect"){ mtl_result = syr2krect(size, steps); } else if(benchmark == "syrk"){ mtl_result = syrk(size, steps); } else if(benchmark == "syrkrect"){ mtl_result = syrkrect(size, steps); } else if(benchmark == "custom"){ mtl_result = custom(size, steps); } else{ std::cerr << "MTLmarks benchmark does not exist." << std::endl; exit(1); } }
SymmMatrix(const Matrix *m0, int p) : symm1_next(0), R(m0->get_ring()), ncols(m0->n_cols()), m(m0), result() { const FreeModule *Fp = m0->rows()->symm(p); const FreeModule *Gp = m0->cols()->symm(p); int *dp = R->degree_monoid()->make_new(m->degree_shift()); R->degree_monoid()->power(dp, p, dp); result = MatrixConstructor(Fp, Gp, dp); if (p >= 0) { vec f = R->e_sub_i(0); symm1(f, 0, p); // consumes f } }
void symm1(vec f, // product so far generated int lastn, // can use lastn..n_cols()-1 in product int pow) // remaining power to take { if (pow == 0) result.set_column(symm1_next++, f); else { for (int i=lastn; i<ncols; i++) { ring_elem r = m->elem(0,i); vec h = R->copy_vec(f); R->mult_vec_to(h,r,false); symm1(h, i, pow-1); } R->remove_vec(f); } }
void symm1(int lastn, // can use lastn..rank()-1 in product int pow) const // remaining power to take { if (pow == 0) symm1_result->append(symm1_deg); else { for (int i=lastn; i<F->rank(); i++) { // increase symm1_deg, with e_i D->mult(symm1_deg, F->degree(i), symm1_deg); symm1(i, pow-1); // decrease symm1_deg back D->divide(symm1_deg, F->degree(i), symm1_deg); } } }
void symm1(int lastn, // can use lastn..rank()-1 in product int pow) // remaining power to take { if (pow == 0) symm1_result->append(symm1_next++, symm1_base); else { for (int i=lastn; i<S->rank(); i++) { // increase symm1_base with e_i M->mult(symm1_base, S->base_monom(i), symm1_base); symm1(i, pow-1); // decrease symm1_base back M->divide(symm1_base, S->base_monom(i), symm1_base); } } }