Frobby  0.9.1
MonosIOHandler.cpp
Go to the documentation of this file.
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 "MonosIOHandler.h"
19 
20 #include "Scanner.h"
21 #include "BigTermConsumer.h"
22 #include "DataType.h"
23 #include "IdealWriter.h"
24 #include "error.h"
25 #include "InputConsumer.h"
26 
27 #include <cstdio>
28 
29 namespace IO {
30  namespace Monos {
31  void writeRing(const VarNames& names, FILE* out);
32  }
33  namespace M = Monos;
34 
35  class MonosIdealWriter : public IdealWriter {
36  public:
37  MonosIdealWriter(FILE* out): IdealWriter(out) {
38  }
39 
40  private:
41  virtual void doWriteHeader(bool first) {
43  fputc('[', getFile());
44  }
45 
46  virtual void doWriteTerm(const Term& term,
47  const TermTranslator& translator,
48  bool first) {
49  fputs(first ? "\n " : ",\n ", getFile());
50  writeTermProduct(term, translator, getFile());
51  }
52 
53  virtual void doWriteTerm(const vector<mpz_class>& term,
54  bool first) {
55  fputs(first ? "\n " : ",\n ", getFile());
56  writeTermProduct(term, getNames(), getFile());
57  }
58 
59  virtual void doWriteFooter(bool wasZeroIdeal) {
60  fputs("\n];\n", getFile());
61  }
62 
63  virtual void doWriteEmptyList() {
65  }
66  };
67 
69  IOHandlerCommon(staticGetName(),
70  "Older format used by the program Monos.") {
75  }
76 
78  return "monos";
79  }
80 
82  return new MonosIdealWriter(out);
83  }
84 
85  void MonosIOHandler::doWriteTerm(const vector<mpz_class>& term,
86  const VarNames& names,
87  FILE* out) {
88  writeTermProduct(term, names, out);
89  }
90 
92  consumer.consumeTermProductNotation(in);
93  }
94 
96  names.clear();
97  in.expect("vars");
98  if (!in.match(';')) {
99  do {
100  names.addVarSyntaxCheckUnique(in, in.readIdentifier());
101  } while (in.match(','));
102  in.expect(';');
103  }
104  }
105 
107  return in.peek('v');
108  }
109 
111  consumer.beginIdeal();
112 
113  in.expect('[');
114  if (!in.match(']')) {
115  do {
116  consumer.consumeTermProductNotation(in);
117  } while (in.match(','));
118  if (!in.match(']')) {
119  if (in.peekIdentifier())
120  in.expect('*');
121  else
122  in.expect(']');
123  }
124  }
125  in.expect(';');
126 
127  consumer.endIdeal();
128  }
129 
130  void M::writeRing(const VarNames& names, FILE* out) {
131  fputs("vars ", out);
132  const char* pre = "";
133  for (unsigned int i = 0; i < names.getVarCount(); ++i) {
134  fputs(pre, out);
135  fputs(names.getName(i).c_str(), out);
136  pre = ", ";
137  }
138  fputs(";\n", out);
139  }
140 }
DataType.h
IO::MonosIOHandler::doReadBareIdeal
virtual void doReadBareIdeal(Scanner &in, InputConsumer &consumer)
Definition: MonosIOHandler.cpp:110
IO::writeTermProduct
void writeTermProduct(const Term &term, const TermTranslator &translator, FILE *out)
Definition: CoCoA4IOHandler.cpp:289
DataType::getMonomialIdealListType
static const DataType & getMonomialIdealListType()
Returns the one and only instance for monomial ideal lists.
Definition: DataType.cpp:54
IO::MonosIOHandler::staticGetName
static const char * staticGetName()
Definition: MonosIOHandler.cpp:77
stdinc.h
IO::MonosIdealWriter::doWriteHeader
virtual void doWriteHeader(bool first)
Definition: MonosIOHandler.cpp:41
BigTermConsumer.h
Scanner
This class offers an input interface which is more convenient and for some purposes more efficient th...
Definition: Scanner.h:50
IO::IOHandlerCommon
This class contains further functionality that makes it more convenient to derive from than IOHandler...
Definition: IOHandlerCommon.h:33
IO::IOHandlerImpl::registerInput
void registerInput(const DataType &type)
Specify that input of the argument type is supported.
Definition: IOHandlerImpl.cpp:60
IO::IdealWriter::getNames
const VarNames & getNames()
Definition: IdealWriter.h:44
IO::MonosIdealWriter::doWriteEmptyList
virtual void doWriteEmptyList()
Definition: MonosIOHandler.cpp:63
Scanner::match
bool match(char c)
Return true if the next character is c, and in that case skip past it.
Definition: Scanner.h:215
IO::MonosIOHandler::doPeekRing
virtual bool doPeekRing(Scanner &in)
Definition: MonosIOHandler.cpp:106
IO::MonosIdealWriter::doWriteTerm
virtual void doWriteTerm(const vector< mpz_class > &term, bool first)
Definition: MonosIOHandler.cpp:53
Scanner::readIdentifier
const char * readIdentifier()
The returned string is only valid until the next method on this object gets called.
Definition: Scanner.cpp:255
VarNames::getName
const string & getName(size_t index) const
The returned reference can become invalid next time addVar is called.
Definition: VarNames.cpp:100
TermTranslator
TermTranslator handles translation between terms whose exponents are infinite precision integers and ...
Definition: TermTranslator.h:41
VarNames::addVarSyntaxCheckUnique
void addVarSyntaxCheckUnique(const Scanner &in, const string &name)
As addvar, except it reports a syntax error if name is already a variable.
Definition: VarNames.cpp:68
IO::MonosIdealWriter
Definition: MonosIOHandler.cpp:35
VarNames::getVarCount
size_t getVarCount() const
Returns the current number of variables.
Definition: VarNames.h:113
Scanner.h
InputConsumer::endIdeal
void endIdeal()
Done reading an ideal.
Definition: InputConsumer.cpp:191
IO
Definition: CoCoA4IOHandler.cpp:33
IO::MonosIOHandler::doCreateIdealWriter
virtual BigTermConsumer * doCreateIdealWriter(FILE *out)
Definition: MonosIOHandler.cpp:81
IO::MonosIOHandler::doReadTerm
virtual void doReadTerm(Scanner &in, InputConsumer &consumer)
Definition: MonosIOHandler.cpp:91
InputConsumer
Definition: InputConsumer.h:30
IO::IdealWriter::getFile
FILE * getFile()
Definition: IdealWriter.h:43
IO::Monos::writeRing
void writeRing(const VarNames &names, FILE *out)
IO::MonosIOHandler::doWriteTerm
virtual void doWriteTerm(const vector< mpz_class > &term, const VarNames &names, FILE *out)
Definition: MonosIOHandler.cpp:85
InputConsumer::consumeTermProductNotation
void consumeTermProductNotation(Scanner &in)
Reads a term in a format like "a^4*b*c^2".
Definition: InputConsumer.cpp:148
Term
Term represents a product of variables which does not include a coefficient.
Definition: Term.h:49
IO::MonosIdealWriter::doWriteTerm
virtual void doWriteTerm(const Term &term, const TermTranslator &translator, bool first)
Definition: MonosIOHandler.cpp:46
error.h
BigTermConsumer
Definition: BigTermConsumer.h:29
Scanner::expect
void expect(char expected)
Require the next character to be equal to expected.
Definition: Scanner.h:231
IdealWriter.h
VarNames::clear
void clear()
Resets the number of variables to zero.
Definition: VarNames.cpp:106
IO::MonosIdealWriter::doWriteFooter
virtual void doWriteFooter(bool wasZeroIdeal)
Definition: MonosIOHandler.cpp:59
IO::IOHandlerImpl::registerOutput
void registerOutput(const DataType &type)
Specify that output of the argument type is supported.
Definition: IOHandlerImpl.cpp:67
DataType::getMonomialIdealType
static const DataType & getMonomialIdealType()
Returns the one and only instance for monomial ideals.
Definition: DataType.cpp:45
MonosIOHandler.h
IO::MonosIdealWriter::MonosIdealWriter
MonosIdealWriter(FILE *out)
Definition: MonosIOHandler.cpp:37
InputConsumer.h
IO::MonosIOHandler::doReadRing
virtual void doReadRing(Scanner &in, VarNames &names)
Definition: MonosIOHandler.cpp:95
InputConsumer::beginIdeal
void beginIdeal()
Start consuming an ideal.
Definition: InputConsumer.cpp:50
Scanner::peekIdentifier
bool peekIdentifier()
Skips whitespace and returns true if the next token is an identifier.
Definition: Scanner.h:257
VarNames
Defines the variables of a polynomial ring and facilities IO involving them.
Definition: VarNames.h:40
IO::MonosIOHandler::MonosIOHandler
MonosIOHandler()
Definition: MonosIOHandler.cpp:68
Scanner::peek
bool peek(char character)
Skips whitespace and returns true if the next character is equal to the parameter(s).
Definition: Scanner.h:262
IO::IdealWriter
Definition: IdealWriter.h:28