1 /* Frobby: Software for monomial ideal computations.
2    Copyright (C) 2007 Bjarke Hammersholt Roune (www.broune.com)
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8 
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see http://www.gnu.org/licenses/.
16 */
17 #include "stdinc.h"
18 #include "IdealConsolidator.h"
19 
20 #include "Term.h"
21 #include "TermTranslator.h"
22 
IdealConsolidator(auto_ptr<BigTermConsumer> consumer)23 IdealConsolidator::IdealConsolidator(auto_ptr<BigTermConsumer> consumer):
24   _consumer(consumer),
25   _inList(false),
26   _inIdeal(false) {
27 }
28 
consumeRing(const VarNames & names)29 void IdealConsolidator::consumeRing(const VarNames& names) {
30   ASSERT(!_inIdeal);
31 
32   _consumer->consumeRing(names);
33 
34   _names = names;
35   _ideal.clearAndSetNames(names);
36   _tmp.resize(names.getVarCount());
37 }
38 
beginConsumingList()39 void IdealConsolidator::beginConsumingList() {
40   ASSERT(!_inList);
41   ASSERT(!_inIdeal);
42 
43   _consumer->beginConsumingList();
44   _inList = true;
45 }
46 
beginConsuming()47 void IdealConsolidator::beginConsuming() {
48   ASSERT(!_inIdeal);
49   _inIdeal = true;
50 }
51 
consume(const Term & term)52 void IdealConsolidator::consume(const Term& term) {
53   ASSERT(term.getVarCount() == _tmp.size());
54 
55   for (size_t var = 0; var < term.getVarCount(); ++var)
56     _tmp[var] = term[var];
57   consume(_tmp);
58 }
59 
consume(const Term & term,const TermTranslator & translator)60 void IdealConsolidator::consume
61 (const Term& term, const TermTranslator& translator) {
62   ASSERT(term.getVarCount() == _tmp.size());
63 
64   for (size_t var = 0; var < term.getVarCount(); ++var)
65     _tmp[var] = translator.getExponent(var, term);
66   consume(_tmp);
67 }
68 
consume(const vector<mpz_class> & term)69 void IdealConsolidator::consume(const vector<mpz_class>& term) {
70   ASSERT(term.size() == _ideal.getVarCount());
71   // TODO: Add a method to BigIdeal that does this in one step.
72   _ideal.newLastTerm();
73   _ideal.getLastTermRef() = term;
74 }
75 
doneConsuming()76 void IdealConsolidator::doneConsuming() {
77   ASSERT(_inIdeal);
78 
79   _inIdeal = false;
80   _consumer->consume(_ideal);
81   _ideal.clear();
82 }
83 
doneConsumingList()84 void IdealConsolidator::doneConsumingList() {
85   ASSERT(_inList);
86   _inList = false;
87   _consumer->doneConsumingList();
88 }
89 
consume(const BigIdeal & ideal)90 void IdealConsolidator::consume(const BigIdeal& ideal) {
91   _consumer->consume(ideal);
92 }
93