9 typedef map<Tree,mterm>
SM;
21 cerr <<
"aterm::aterm (" <<
ppsig(t)<<
")" << endl;
25 cerr <<
"aterm::aterm (" <<
ppsig(t)<<
") : -> " << *
this << endl;
47 }
else if (t1 <= t2) {
67 for (
int order = 0; order < 4; order++) P[order] = N[order] =
tree(0);
70 for (SM::const_iterator p = fSig2MTerms.begin(); p != fSig2MTerms.end(); p++) {
71 const mterm& m = p->second;
85 for (
int order = 0; order < 4; order++) {
90 if (
isZero(SUM) && (order < 3)) {
94 SUM =
sigSub(SUM, N[order]);
109 if (fSig2MTerms.empty()) {
112 const char* sep =
"";
113 for (SM::const_iterator p = fSig2MTerms.begin(); p != fSig2MTerms.end(); p++) {
114 dst << sep << p->second;
183 cerr << *
this <<
" aterm::+= " << m << endl;
187 cerr <<
"signature " << *sig << endl;
189 SM::const_iterator p = fSig2MTerms.find(sig);
190 if (p == fSig2MTerms.end()) {
192 fSig2MTerms.insert(make_pair(sig,m));
194 fSig2MTerms[sig] += m;
208 SM::const_iterator p = fSig2MTerms.find(sig);
209 if (p == fSig2MTerms.end()) {
211 fSig2MTerms.insert(make_pair(sig,m*
mterm(-1)));
213 fSig2MTerms[sig] -= m;
220 int maxComplexity = 0;
223 for (SM::const_iterator p1 = fSig2MTerms.begin(); p1 != fSig2MTerms.end(); p1++) {
224 for (SM::const_iterator p2 = p1; p2 != fSig2MTerms.end(); p2++) {
226 mterm g =
gcd(p1->second,p2->second);
248 for (SM::const_iterator p1 = fSig2MTerms.begin(); p1 != fSig2MTerms.end(); p1++) {
249 mterm t = p1->second;
mterm gcd(const mterm &m1, const mterm &m2)
return a mterm that is the greatest common divisor of two mterms
aterm()
create an empty aterm (equivalent to 0)
mterm greatestDivisor() const
return the greatest divisor of any two mterms
aterm factorize(const mterm &d)
reorganize the aterm by factorizing d
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
Tree signatureTree() const
return a signature (a normalized tree)
Tree addNums(Tree a, Tree b)
static Tree simplifyingAdd(Tree t1, Tree t2)
Add two terms trying to simplify the result.
int getSigOrder(Tree sig)
retrieve the order annotation (between 0 and 3) of a signal.
const aterm & operator+=(Tree t)
add in place an additive expression tree
Implements a multiplicative term, a term of type k*x^n*y^m*...
Tree sigSub(Tree x, Tree y)
bool isSigBinOp(Tree s, int *op, Tree &x, Tree &y)
Tree sigAdd(Tree x, Tree y)
Tree normalizedTree(bool sign=false, bool neg=false) const
return the normalized tree of the mterm
int complexity() const
return an evaluation of the complexity
Tree normalizedTree() const
return the corresponding normalized expression tree
const aterm & operator-=(Tree t)
add in place an additive expression tree
Tree sigMul(Tree x, Tree y)
bool isNegative() const
true if mterm has a negative coefficient
Implements a additive term, a set of mterms added together m1 + m2 + m3 + ...
bool hasDivisor(const mterm &n) const
return true if this can be divided by n
ostream & print(ostream &dst) const
print a aterm m1 + m2 + m3 +...