Macaulay2 Engine
Loading...
Searching...
No Matches

◆ monomials()

Matrix * Matrix::monomials ( M2_arrayint vars) const

Definition at line 1699 of file matrix.cpp.

1704{
1705 const PolynomialRing *P = get_ring()->cast_to_PolynomialRing();
1706 if (P == nullptr)
1707 {
1708 const M2FreeAlgebraOrQuotient* Q = dynamic_cast<const M2FreeAlgebraOrQuotient*>(get_ring());
1709 if (Q == nullptr)
1710 {
1711 ERROR("expected polynomial ring");
1712 return nullptr;
1713 }
1714 ModuleMonomialSet monom_set {ModuleMonomDefaultConfig(Q->n_vars())};
1715 NCMonomials(monom_set, this);
1716 //PRINT_ELEMENTS(monom_set.set(), "hashtable: ");
1717 //PRINT_ELEMENTS(monom_set.uniqueMonoms(), "monoms: ");
1718 //printHashTableState(monom_set.set());
1719 //monom_set.display(std::cout);
1720 return NCMonomialMatrix(monom_set, rows());
1721 // NCMonomialSet H(Q->n_vars());
1722 // NCMonomials(H, this);
1723 // MonomialAreaTest montest;
1724 // size_t sz = montest.test1();
1725 // std::cout << "sz = " << sz << std::endl;
1726 }
1727 const Monoid *M = P->getMonoid();
1728 const Ring *K = P->getCoefficients();
1729 int nvars = M->n_vars();
1730 // Check that 'vars' is valid
1731 for (unsigned int i = 0; i < vars->len; i++)
1732 if (vars->array[i] < 0 || vars->array[i] >= nvars)
1733 {
1734 ERROR("expected a list of indices of indeterminates");
1735 return nullptr;
1736 }
1737
1738 // Now collect all of the monomials
1739 monomial mon = M->make_one();
1741 ring_elem one = K->from_long(1);
1742 exponent_table *E =
1743 exponent_table_new(50000, vars->len + 1); // the +1 is for the component
1744
1745 for (int c = 0; c < n_cols(); c++)
1746 {
1747 vec v = elem(c);
1748 for (; v != nullptr; v = v->next)
1749 {
1750 for (Nterm& t : v->coeff)
1751 {
1752 exponents_t exp1 = newarray_atomic(int, vars->len + 1);
1753 M->to_expvector(t.monom, exp);
1754 for (unsigned int i = 0; i < vars->len; i++)
1755 exp1[i] = exp[vars->array[i]];
1756 exp1[vars->len] = v->comp;
1757 exponent_table_put(E, exp1, 1);
1758 }
1759 }
1760 }
1761
1762 // Take all of these monomials and make an array_ out of them
1763 MatrixConstructor mat(rows(), 0);
1764 const void **monoms = exponent_table_to_array(E);
1765 for (int i = 0; i < nvars; i++) exp[i] = 0;
1766 for (int i = 0; monoms[i] != nullptr; i += 2)
1767 {
1768 const_exponents exp1 = reinterpret_cast<const_exponents>(monoms[i]);
1769 for (unsigned int j = 0; j < vars->len; j++)
1770 exp[vars->array[j]] = exp1[j];
1771 int x = exp1[vars->len]; // component
1772 M->from_expvector(exp, mon);
1773 ring_elem a = P->make_flat_term(one, mon);
1774 mat.append(P->make_vec(x, a));
1775 }
1776
1777 // Remove the garbage memory
1778 freemem(exp);
1779 M->remove(mon);
1781
1782 // Finally, we sort them
1783 Matrix *result = mat.to_matrix();
1784 M2_arrayint perm = result->sort(0, -1);
1785 return result->sub_matrix(perm);
1786}
exponents::ConstExponents const_exponents
exponents::Exponents exponents_t
virtual int n_vars() const =0
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
friend class MatrixConstructor
Definition matrix.hpp:76
int n_cols() const
Definition matrix.hpp:147
const FreeModule * rows() const
Definition matrix.hpp:144
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
int n_vars() const
Definition monoid.hpp:207
monomial make_one() const
Definition monoid.cpp:455
void remove(monomial d) const
Definition monoid.cpp:462
void from_expvector(const_exponents exp, monomial result) const
Definition monoid.cpp:742
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
virtual ring_elem make_flat_term(const ring_elem a, const_monomial m) const =0
virtual const Ring * getCoefficients() const
Definition polyring.hpp:277
vec make_vec(int r, ring_elem a) const
Definition ring-vecs.cpp:60
virtual ring_elem from_long(long n) const =0
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
void exponent_table_free(exponent_table **E)
Definition exptable.c:55
const void ** exponent_table_to_array(exponent_table *E)
Definition exptable.c:79
exponent_table * exponent_table_new(int hint, int nvars)
Definition exptable.c:45
long exponent_table_put(exponent_table *E, const exponent expon, long value)
Definition exptable.c:62
#define Matrix
Definition factory.cpp:14
#define monomial
Definition gb-toric.cpp:11
void freemem(void *s)
Definition m2-mem.cpp:103
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
Matrix * NCMonomialMatrix(ModuleMonomialSet &H, const FreeModule *target)
Definition matrix.cpp:1615
void NCMonomials(ModuleMonomialSet &H, const Matrix *M)
Definition matrix.cpp:1593
IntsSet< ModuleMonomDefaultConfig > ModuleMonomialSet
const mpreal exp(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
Definition mpreal.h:2298
#define newarray_atomic(T, len)
Definition newdelete.hpp:91
volatile int x
int monom[1]
Definition ringelem.hpp:160

References MatrixConstructor::append(), elem(), ERROR, exponent_table_free(), exponent_table_new(), exponent_table_put(), exponent_table_to_array(), freemem(), Monoid::from_expvector(), Ring::from_long(), get_ring(), PolynomialRing::getCoefficients(), PolynomialRing::getMonoid(), PolynomialRing::make_flat_term(), Monoid::make_one(), Ring::make_vec(), Matrix(), MatrixConstructor, Nterm::monom, monomial, monomials(), n_cols(), M2FreeAlgebraOrQuotient::n_vars(), Monoid::n_vars(), NCMonomialMatrix(), NCMonomials(), newarray_atomic, Monoid::remove(), result(), rows(), Monoid::to_expvector(), MatrixConstructor::to_matrix(), and x.

Referenced by IM2_Matrix_monomials(), and monomials().