41 bool baseCaseSimple1(mpz_class& accumulator,
55 else if (genCount == 2)
65 bool optimizeSimpleFromDivCounts(mpz_class& accumulator,
73 for (
size_t var = 0; var < varCount; ++var) {
77 if (divCounts[var] < genCount - 2)
80 if (divCounts[var] == genCount - 1) {
81 const Word* nonMultiple =
91 }
else if (divCounts[var] == genCount - 2) {
102 ASSERT(divCounts[var] == genCount);
111 bool baseCaseSimple2(mpz_class& accumulator,
118 for (
size_t var = 0; var < varCount; ++var)
119 if (divCounts[var] != 1 && divCounts[var] != genCount)
123 accumulator += state.
getSign();
125 accumulator -= state.
getSign();
129 bool baseCasePreconditionSimplified(mpz_class& accumulator,
147 for (; var < varCount; ++var) {
148 if (divCounts[var] != 1)
160 for (++var; var < varCount; ++var) {
183 for (
size_t var = 0; var < varCount; ++var) {
204 ASSERT(state.debugIsValid());
206 if (baseCaseSimple1(_euler, state))
210 size_t* divCountsTmp = &(_divCountsTmp[0]);
212 if (_useUniqueDivSimplify &&
213 optimizeOneDivCounts(state, divCountsTmp, _termTmp))
215 if (_useManyDivSimplify &&
216 optimizeSimpleFromDivCounts(_euler, state, divCountsTmp, _termTmp))
218 if (_useAllPairsSimplify) {
219 if (optimizeVarPairs(state, _termTmp, divCountsTmp))
221 if (baseCasePreconditionSimplified(_euler, state))
224 if (_autoTranspose && autoTranspose(state))
232 size_t* divCountsTmp = &(_divCountsTmp[0]);
233 ASSERT(_pivotStrategy.get() != 0);
234 EulerState* next = _pivotStrategy->doPivot(state, divCountsTmp);
246 _useUniqueDivSimplify(true),
247 _useManyDivSimplify(true),
248 _useAllPairsSimplify(false),
249 _autoTranspose(true),
250 _initialAutoTranspose(true) {
303 if (nextState == 0) {
void getLcmOfNonMultiples(Word *lcm, size_t var) const
Sets lcm to be the least common multple of those generators that var does not divide.
bool toColonSubState(const Word *pivot)
EulerState * processState(EulerState &state)
size_t getNonMultiple(size_t var) const
Returns the index of the first generator that var does not divide or getGeneratorCount() if no such g...
void lcmInPlace(Word *res, const Word *resEnd, const Word *a)
void compactEliminatedVariablesIfProfitable()
Word * getGenerator(size_t index)
Returns the generator at index.
void getVarDividesCounts(vector< size_t > &counts) const
Sets counts[var] to the number of generators that var divides.
Represents a monomial ideal with int exponents.
void lcm(Word *res, const Word *resEnd, const Word *a, const Word *b)
void removeGenerator(size_t index)
A bit packed square free ideal placed in a pre-allocated buffer.
size_t getVarCount() const
void computeEuler(EulerState *state)
void setExponent(Word *a, size_t var, bool value)
static Arena & getArena()
Returns an arena object that can be used for non-thread safe scratch memory after static objects have...
unsigned long Word
The native unsigned type for the CPU.
size_t getVarCount() const
void getPivot(const EulerState &state, Word *pivot)
bool autoTranspose(EulerState &state)
Emulates stack allocation of an array using an Arena.
static EulerState * construct(const Ideal &idealParam, Arena *arena)
bool getExponent(const Word *a, size_t var)
returns true if var divides a and false otherwise.
size_t getWordCount(size_t varCount)
size_t getGeneratorCount() const
size_t getMultiple(size_t var) const
Returns the index of the first generator that var divides or getGeneratorCount() if no such generator...
size_t getVarCount() const
bool hasFullSupport(const Word *ignore) const
Returns true if for every variable it either divides ignore or it divides some (not necessarily minim...
bool _initialAutoTranspose
const Word * getEliminatedVars() const
void toColonSubStateNoReminimizeNecessary(size_t pivotVar)
size_t getGeneratorCount() const
void assign(Word *a, const Word *b, size_t varCount)
auto_ptr< PivotStrategy > newDefaultPivotStrategy()
bool hasFullSupport(const Word *a, size_t varCount)
const mpz_class & computeEulerCharacteristic(const Ideal &ideal)
void freeAndAllAfter(void *ptr)
Frees the buffer pointed to by ptr and all not yet freed allocations that have happened since that bu...
auto_ptr< PivotStrategy > _pivotStrategy
void toZeroAtSupport(const Word *a, size_t *inc, size_t varCount)
For every variable var that divides a, set inc[var] to zero.
RawSquareFreeIdeal & getIdeal()