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)23IdealConsolidator::IdealConsolidator(auto_ptr<BigTermConsumer> consumer): 24 _consumer(consumer), 25 _inList(false), 26 _inIdeal(false) { 27 } 28 consumeRing(const VarNames & names)29void 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()39void IdealConsolidator::beginConsumingList() { 40 ASSERT(!_inList); 41 ASSERT(!_inIdeal); 42 43 _consumer->beginConsumingList(); 44 _inList = true; 45 } 46 beginConsuming()47void IdealConsolidator::beginConsuming() { 48 ASSERT(!_inIdeal); 49 _inIdeal = true; 50 } 51 consume(const Term & term)52void 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)60void 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)69void 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()76void IdealConsolidator::doneConsuming() { 77 ASSERT(_inIdeal); 78 79 _inIdeal = false; 80 _consumer->consume(_ideal); 81 _ideal.clear(); 82 } 83 doneConsumingList()84void IdealConsolidator::doneConsumingList() { 85 ASSERT(_inList); 86 _inList = false; 87 _consumer->doneConsumingList(); 88 } 89 consume(const BigIdeal & ideal)90void IdealConsolidator::consume(const BigIdeal& ideal) { 91 _consumer->consume(ideal); 92 } 93