1 /** @file printtree.cpp
3 * print in tree- (indented-) form, so developers can have a look at the
4 * underlying structure. */
7 * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include "expairseq.h"
38 #include "relational.h"
43 #ifndef NO_GINAC_NAMESPACE
45 #endif // ndef NO_GINAC_NAMESPACE
47 void ex::printtree(ostream & os, unsigned indent) const
49 debugmsg("ex printtree",LOGLEVEL_PRINT);
51 // os << "refcount=" << bp->refcount << " ";
52 bp->printtree(os,indent);
55 void ex::dbgprinttree(void) const
57 debugmsg("ex dbgprinttree",LOGLEVEL_PRINT);
62 void basic::printtree(ostream & os, unsigned indent) const
64 debugmsg("basic printtree",LOGLEVEL_PRINT);
65 os << string(indent,' ') << "type=" << typeid(*this).name()
66 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
67 << ", flags=" << flags
68 << ", nops=" << nops() << endl;
69 for (int i=0; i<nops(); ++i) {
70 op(i).printtree(os,indent+delta_indent);
74 void basic::dbgprinttree(void) const
79 void numeric::printtree(ostream & os, unsigned indent) const
81 debugmsg("numeric printtree", LOGLEVEL_PRINT);
82 // We are cheating here, because we don't want to include the underlying
83 // bignum package's headers again, so we use ostream::operator<<(numeric):
84 os << string(indent,' ');
87 << "hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
88 << ", flags=" << flags << endl;
91 void symbol::printtree(ostream & os, unsigned indent) const
93 debugmsg("symbol printtree",LOGLEVEL_PRINT);
94 os << string(indent,' ') << name << " (symbol): "
95 << "serial=" << serial
96 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
97 << ", flags=" << flags << endl;
100 void power::printtree(ostream & os, unsigned indent) const
102 debugmsg("power printtree",LOGLEVEL_PRINT);
104 os << string(indent,' ') << "power: "
105 << "hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
106 << ", flags=" << flags << endl;
107 basis.printtree(os,indent+delta_indent);
108 exponent.printtree(os,indent+delta_indent);
111 void expairseq::printtree(ostream & os, unsigned indent) const
113 debugmsg("expairseq printtree",LOGLEVEL_PRINT);
115 os << string(indent,' ') << "type=" << typeid(*this).name()
116 << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")"
117 << ", flags=" << flags
118 << ", nops=" << nops() << endl;
119 for (unsigned i=0; i<seq.size(); ++i) {
120 seq[i].rest.printtree(os,indent+delta_indent);
121 seq[i].coeff.printtree(os,indent+delta_indent);
122 if (i!=seq.size()-1) {
123 os << string(indent+delta_indent,' ') << "-----" << endl;
126 if (!overall_coeff.is_equal(default_overall_coeff())) {
127 os << string(indent+delta_indent,' ') << "-----" << endl;
128 os << string(indent+delta_indent,' ') << "overall_coeff" << endl;
129 overall_coeff.printtree(os,indent+delta_indent);
131 os << string(indent+delta_indent,' ') << "=====" << endl;
132 #ifdef EXPAIRSEQ_USE_HASHTAB
133 os << string(indent+delta_indent,' ')
134 << "hashtab size " << hashtabsize << endl;
135 if (hashtabsize==0) return;
137 unsigned count[MAXCOUNT+1];
138 for (int i=0; i<MAXCOUNT+1; ++i) count[i]=0;
139 unsigned this_bin_fill;
140 unsigned cum_fill_sq=0;
142 for (unsigned i=0; i<hashtabsize; ++i) {
144 if (hashtab[i].size()>0) {
145 os << string(indent+delta_indent,' ')
146 << "bin " << i << " with entries ";
147 for (epplist::const_iterator it=hashtab[i].begin();
148 it!=hashtab[i].end(); ++it) {
149 os << *it-seq.begin() << " ";
153 cum_fill += this_bin_fill;
154 cum_fill_sq += this_bin_fill*this_bin_fill;
156 if (this_bin_fill<MAXCOUNT) {
157 ++count[this_bin_fill];
164 double lambda=(1.0*seq.size())/hashtabsize;
165 for (int k=0; k<MAXCOUNT; ++k) {
167 double prob=pow(lambda,k)/fact*exp(-lambda);
169 os << string(indent+delta_indent,' ') << "bins with " << k << " entries: "
170 << int(1000.0*count[k]/hashtabsize)/10.0 << "% (expected: "
171 << int(prob*1000)/10.0 << ")" << endl;
173 os << string(indent+delta_indent,' ') << "bins with more entries: "
174 << int(1000.0*count[MAXCOUNT]/hashtabsize)/10.0 << "% (expected: "
175 << int((1-cum_prob)*1000)/10.0 << ")" << endl;
177 os << string(indent+delta_indent,' ') << "variance: "
178 << 1.0/hashtabsize*cum_fill_sq-(1.0/hashtabsize*cum_fill)*(1.0/hashtabsize*cum_fill)
180 os << string(indent+delta_indent,' ') << "average fill: "
181 << (1.0*cum_fill)/hashtabsize
182 << " (should be equal to " << (1.0*seq.size())/hashtabsize << ")" << endl;
183 #endif // def EXPAIRSEQ_USE_HASHTAB
186 #ifndef NO_GINAC_NAMESPACE
188 #endif // ndef NO_GINAC_NAMESPACE