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

◆ support()

M2_arrayintOrNull Matrix::support ( ) const

Definition at line 922 of file matrix.cpp.

923{
924 const PolynomialRing *R = get_ring()->cast_to_PolynomialRing();
925 if (R != nullptr)
926 {
927 int n = R->n_vars();
928 int nsupp = 0;
931 for (int i = 0; i < R->n_vars(); i++) exp[i] = exp2[i] = 0;
932 for (int j = 0; j < n_cols(); j++)
933 for (vec v = elem(j); v != nullptr; v = v->next)
934 for (Nterm& f : v->coeff)
935 {
936 R->getMonoid()->to_expvector(f.monom, exp2);
937 for (int k = 0; k < n; k++)
938 if (exp2[k] != 0 && exp[k] == 0)
939 {
940 exp[k] = 1;
941 if (++nsupp == n) goto out;
942 }
943 }
944out:
945 M2_arrayint result = M2_makearrayint(nsupp);
946 int next = 0;
947 for (int i = 0; i < n; i++)
948 if (exp[i] > 0) result->array[next++] = i;
949 freemem(exp);
950 freemem(exp2);
951 return result;
952 }
953
954 // FreeAlgebraOrQuotient matrix support
955 const M2FreeAlgebraOrQuotient* Q = dynamic_cast<const M2FreeAlgebraOrQuotient*>(get_ring());
956 if (Q != nullptr)
957 {
958 int n = Q->n_vars();
959 int nsupp = 0;
960 std::vector<int> exp,exp2; // commutative code above uses newarray_atomic. Is std::vector ok?
961 for (int i = 0; i < n; i++)
962 exp.push_back(0);
963 for (int j = 0; j < n_cols() && nsupp < n; j++)
964 for (vec v = elem(j); v != nullptr && nsupp < n; v = v->next)
965 {
966 auto f = Q->toPoly(v->coeff);
967 for (auto t = f->cbegin(); t != f->cend(); ++t)
968 {
969 Q->freeAlgebra().monoid().support(t.monom(),exp2);
970 for (int k = 0; k < exp2.size(); k++)
971 {
972 if (exp[exp2[k]] == 0)
973 {
974 exp[exp2[k]] = 1;
975 if (++nsupp == n) break;
976 }
977 }
978 }
979 }
980
981 M2_arrayint result = M2_makearrayint(nsupp);
982 int next = 0;
983 for (int i = 0; i < n; i++)
984 if (exp[i] > 0) result->array[next++] = i;
985 //freemem(exp);
986 //freemem(exp2);
987 return result;
988 }
989
990 ERROR("expected a polynomial ring");
991 return nullptr;
992}
exponents::Exponents exponents_t
const FreeMonoid & monoid() const
void support(const Monom &m, std::vector< int > &result) const
const Poly * toPoly(const ring_elem f) const
virtual int n_vars() const =0
virtual const FreeAlgebra & freeAlgebra() const =0
const Ring * get_ring() const
Definition matrix.hpp:134
ring_elem elem(int i, int j) const
Definition matrix.cpp:307
int n_cols() const
Definition matrix.hpp:147
void to_expvector(const_monomial m, exponents_t result_exp) const
Definition monoid.cpp:747
virtual const Monoid * getMonoid() const
Definition polyring.hpp:282
int n_vars() const
Definition polyring.hpp:196
virtual const PolynomialRing * cast_to_PolynomialRing() const
Definition ring.hpp:243
void freemem(void *s)
Definition m2-mem.cpp:103
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
M2_arrayint M2_makearrayint(int n)
Definition m2-types.cpp:6
const mpreal exp2(const mpreal &x, mp_rnd_t r=mpreal::get_default_rnd())
Definition mpreal.h:2299
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
int monom[1]
Definition ringelem.hpp:160

References Nterm::coeff, elem(), ERROR, M2FreeAlgebraOrQuotient::freeAlgebra(), freemem(), get_ring(), PolynomialRing::getMonoid(), M2_makearrayint(), FreeAlgebra::monoid(), Nterm::monom, n_cols(), M2FreeAlgebraOrQuotient::n_vars(), PolynomialRing::n_vars(), newarray_atomic, result(), FreeMonoid::support(), support(), Monoid::to_expvector(), and M2FreeAlgebraOrQuotient::toPoly().

Referenced by rawMatrixIndices(), and support().