34 _term(new mpz_ptr[varCount]) {
45 for (
size_t var = 0; var <
_varCount; ++var)
46 _term[var] = const_cast<mpz_ptr>
50 void setTerm(
const vector<mpz_class>& term) {
53 for (
size_t var = 0; var <
_varCount; ++var)
54 _term[var] = const_cast<mpz_ptr>(term[var].get_mpz_t());
84 _consumer->consume(
_term);
87 virtual void consume(
const vector<mpz_class>& term) {
91 _consumer->consume(
_term);
95 _consumer->idealEnd();
128 _consumer->consume(coef.get_mpz_t(),
_term);
132 const vector<mpz_class>& term) {
135 for (
size_t var = 0; var <
_varCount; ++var)
136 _term[var] = const_cast<mpz_ptr>(term[var].get_mpz_t());
137 _consumer->consume(coef.get_mpz_t(),
_term);
145 _consumer->polynomialEnd();
178 _atVariable(variableCount) {
228 mpz_set(ref.get_mpz_t(), exponent);
233 mpz_class tmp(exponent);
238 mpz_class tmp(exponent);
243 const mpz_t* reflectionMonomial,
251 SliceFacade facade(params, bigIdeal, wrappedConsumer);
253 if (reflectionMonomial == 0)
256 vector<mpz_class> point;
258 for (
size_t var = 0; var < bigIdeal.
getVarCount(); ++var)
259 mpz_set(point[var].get_mpz_t(), reflectionMonomial[var]);
263 reflectionMonomial = 0;
276 const Ideal& reflectionMonomial,
287 const vector<mpz_class>& monomial = reflectionIdeal.
getTerm(0);
288 const mpz_t* monomialPtr = 0;
290 monomialPtr = (
const mpz_t*)&(monomial[0]);
302 SliceFacade facade(params, bigIdeal, wrappedConsumer);
313 SliceFacade facade(params, bigIdeal, wrappedConsumer);
335 _term.resize(varCount);
336 for (
size_t var = 0; var <
_varCount; ++var)
337 _term[var] = _zero.get_mpz_t();
344 virtual void consume(mpz_ptr* exponentVector) {
348 for (
size_t var = 0; var <
_varCount; ++var) {
349 if (mpz_cmp_ui(exponentVector[var], 0) != 0) {
351 _term[var] = exponentVector[var];
352 _consumer->consume(&*(
_term.begin()));
353 _term[var] = _zero.get_mpz_t();
357 _consumer->idealEnd();
386 SliceFacade facade(params, bigIdeal, wrappedConsumer);
399 SliceFacade facade(params, bigIdeal, wrappedConsumer);
411 SliceFacade facade(params, bigIdeal, wrappedConsumer);
423 vector<mpz_class> grading;
424 for (
size_t var = 0; var < bigIdeal.
getVarCount(); ++var)
425 grading.push_back(mpz_class(l[var]));
431 SliceFacade facade(params, bigIdeal, wrappedConsumer);
448 mpz_set(dim, dimen.get_mpz_t());
458 SliceFacade facade(params, bigIdeal, wrappedConsumer);
virtual void consume(const mpz_class &coef, const vector< mpz_class > &term)
IdealConsumer * _consumer
virtual void consumeRing(const VarNames &names)
Tell the consumer which ring is being used.
void computeAlexanderDual(const vector< mpz_class > &point)
Compute the Alexander dual of the ideal.
void setTerm(const Term &term, const TermTranslator &translator)
virtual void consume(const mpz_class &coef, const Term &term, const TermTranslator &translator)
bool irreducibleDecompositionAsMonomials(const Ideal &ideal, IdealConsumer &consumer)
Compute the irreducible decomposition of ideal, and encode each irreducible component as a monomial...
Ideal(size_t variableCount)
virtual void consume(const Term &term, const TermTranslator &translator)
size_t getVarCount() const
mpz_class computeDimension(const BigIdeal &ideal, bool codimension=false, bool squareFreeAndMinimal=false)
Compute the Krull dimension of ideal.
FrobbyImpl::FrobbyIdealHelper * _data
mpz_class & getLastTermExponentRef(size_t var)
virtual void consume(mpz_ptr *exponentVector)
For output of a generator of the ideal.
void irreducibleDecompositionAsIdeals(const Ideal &ideal, IdealConsumer &consumer)
Compute the irreducible decomposition of ideal.
void setTerm(const vector< mpz_class > &term)
ExternalPolynomialConsumerWrapper(Frobby::PolynomialConsumer *consumer, size_t varCount)
Ideal & operator=(const Ideal &ideal)
void computeMultigradedHilbertSeries()
Compute the numerator of the multigraded Hilbert-Poincare series.
virtual void idealEnd()
Called after output of a monomial ideal.
Defines the variables of a polynomial ring and facilities IO involving them.
bool alexanderDual(const Ideal &ideal, const mpz_t *reflectionMonomial, IdealConsumer &consumer)
Compute the Alexander dual of ideal using the point reflectionMonomial.
virtual ~IdealConsumer()
The provided implementation does nothing.
void maximalStandardMonomials(const Ideal &ideal, IdealConsumer &consumer)
Compute the maximal standard monomials of ideal.
virtual void consume(const vector< mpz_class > &term)
void codimension(const Ideal &ideal, mpz_t codim)
Compute the codimension of a monomial ideal.
size_t getVarCount() const
This class provides a way to get polynomials as output from Frobby one term at a time.
virtual void consumeRing(const VarNames &names)
Frobby::IdealConsumer * _consumer
const mpz_class & getExponent(size_t variable, Exponent exponent) const
This method translates from IDs to arbitrary precision integers.
void computeMaximalStandardMonomials()
Compute the maximal standard monomials of the ideal.
void multigradedHilbertPoincareSeries(const Ideal &ideal, PolynomialConsumer &consumer)
Compute the multigraded Hilbert-Poincare series of ideal.
size_t getVarCount() const
void dimension(const Ideal &ideal, mpz_t dim)
Compute the Krull dimension of a monomial ideal.
bool solveStandardMonomialProgram(const Ideal &ideal, const mpz_t *l, IdealConsumer &consumer)
Solve the optimization program.
bool solveStandardProgram(const vector< mpz_class > &grading, mpz_class &value, bool reportAllSolutions)
Solve an optimization program over maximal standard monomials.
virtual void idealEnd()
Called after output of a monomial ideal.
This class provides a way to get monomial ideals as output from Frobby one generator at a time...
size_t getGeneratorCount() const
virtual void beginConsuming()
Tell the consumer to begin consuming an ideal.
virtual void polynomialEnd()
Called after output of a polynomial.
virtual void idealBegin(size_t varCount)
Called before output of a monomial ideal.
A facade for operations on monomial ideals using the Slice Algorithm.
A facade for performing operations on BigIdeal.
virtual void polynomialBegin(size_t varCount)
Called before output of a polynomial.
static const BigIdeal & getIdeal(const Frobby::Ideal &ideal)
void addExponent(const mpz_t exponent)
Call addExponent once for each variable to add a term one exponent at a time.
Frobby::PolynomialConsumer * _consumer
void primaryDecomposition(const Ideal &ideal, IdealConsumer &consumer)
Compute the canonical primary decomposition of a monomial ideal.
virtual ~PolynomialConsumer()
The provided implementation does nothing.
bool isIdentity(const Word *a, Word *aEnd)
void computeIrreducibleDecomposition(bool encode)
Compute the unique irredundant set of irreducible ideals whose intersection equals ideal...
virtual void idealBegin(size_t varCount)
Called before output of a monomial ideal.
void computeAssociatedPrimes()
Compute the associated primes of the ideal.
const vector< mpz_class > & getTerm(size_t term) const
This is the base of the Frobby exception hierarchy for exceptions that can occur due to expected erro...
void useIndependenceSplits(bool value)
TermTranslator handles translation between terms whose exponents are infinite precision integers and ...
~IrreducibleIdealDecoder()
virtual void doneConsuming()
Must be called once after each time beginConsuming has been called.
IrreducibleIdealDecoder(IdealConsumer *consumer)
virtual ~ConsumerWrapper()
virtual void beginConsuming()
virtual void doneConsuming()
The namespace FrobbyImpl is for internal use inside Frobby only.
void univariateHilbertPoincareSeries(const Ideal &ideal, PolynomialConsumer &consumer)
Compute the univariate Hilbert-Poincare series of ideal.
ConsumerWrapper(size_t varCount)
size_t getVarCount() const
Returns the current number of variables.
FrobbyIdealHelper(size_t variableCount)
void computeUnivariateHilbertSeries()
Compute the numerator of the univariate Hilbert-Poincare series.
void associatedPrimes(const Ideal &ideal, IdealConsumer &consumer)
Compute the associated primes of the ideal.
void computePrimaryDecomposition()
Compute the unique "nicest" primary decomposition of the ideal.
Term represents a product of variables which does not include a coefficient.
ExternalIdealConsumerWrapper(Frobby::IdealConsumer *consumer, size_t varCount)