]> www.ginac.de Git - ginac.git/blobdiff - check/time_dennyfliegner.cpp
Update copyright statements.
[ginac.git] / check / time_dennyfliegner.cpp
index 23c7a95351088ae9fe746db847624db8b835ff8d..dc06936fb95382e746184a6b6609e859a7bb7169 100644 (file)
@@ -7,7 +7,7 @@
  *  after which e should be just a1^2. */
 
 /*
- *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2014 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include "times.h"
+#include "ginac.h"
+#include "timer.h"
+using namespace GiNaC;
 
-#define VECSIZE 200
+#include <iostream>
+#include <sstream>
+#include <vector>
+using namespace std;
 
 static unsigned expand_subs(unsigned size)
 {
-    unsigned result = 0;
-    symbol a1("a1");
-    symbol a[VECSIZE];
-    ex e, aux;
-    
-    a[1] = a1;
-    for (unsigned i=0; i<size; ++i) {
-        e = e + a[i];
-    }
-    
-    // prepare aux so it will swallow anything but a1^2:
-    aux = -e + a[0] + a[1];
-    e = expand(subs(expand(pow(e, 2)), a[0] == aux));
-    
-    if (e != pow(a1,2)) {
-        clog << "Denny Fliegner's quick consistency check erroneously returned "
-             << e << "." << endl;
-        ++result;
-    }
-    
-    return result;
+       unsigned result = 0;
+       // create a vector of size symbols named "a0", "a1", ...
+       vector<symbol> a;
+       ex e;
+       for (unsigned i=0; i<size; ++i) {
+               ostringstream buf;
+               buf << "a" << i << ends;
+               a.push_back(symbol(buf.str()));
+               e += a[i];
+       }
+       ex aux;
+       
+       // prepare aux so it will swallow anything but a1^2:
+       aux = -e + a[0] + a[1];
+       e = pow(e,2).expand().subs(a[0]==aux, subs_options::no_pattern).expand();
+       
+       if (e != pow(a[1],2)) {
+               clog << "Denny Fliegner's quick consistency check erroneously returned "
+                    << e << "." << endl;
+               ++result;
+       }
+       
+       return result;
 }
 
-unsigned time_dennyfliegner(void)
+unsigned time_dennyfliegner()
 {
-    unsigned result = 0;
-    
-    cout << "timing commutative expansion and substitution" << flush;
-    clog << "-------commutative expansion and substitution:" << endl;
-    
-    vector<unsigned> sizes;
-    vector<double> times;
-    timer rolex;
-    
-    sizes.push_back(40);
-    sizes.push_back(60);
-    sizes.push_back(100);
-    sizes.push_back(150);
-    
-    for (vector<unsigned>::iterator i=sizes.begin(); i!=sizes.end(); ++i) {
-        rolex.start();
-        result += expand_subs(*i);  cout << '.' << flush;
-        times.push_back(rolex.read());
-    }
-    
-    if (!result) {
-        cout << " passed ";
-        clog << "(no output)" << endl;
-    } else {
-        cout << " failed ";
-    }
-    // print the report:
-    cout << endl << "    size:  ";
-    for (vector<unsigned>::iterator i=sizes.begin(); i!=sizes.end(); ++i) {
-        cout << '\t' << (*i);
-    }
-    cout << endl << "    time/s:";
-    for (vector<double>::iterator i=times.begin(); i!=times.end(); ++i) {
-        cout << '\t' << (*i);
-    }
-    cout << endl;
-    
-    return result;
+       unsigned result = 0;
+       
+       cout << "timing commutative expansion and substitution" << flush;
+       
+       vector<unsigned> sizes;
+       vector<double> times;
+       timer breitling;
+       
+       sizes.push_back(100);
+       sizes.push_back(200);
+       sizes.push_back(400);
+       sizes.push_back(800);
+       
+       for (vector<unsigned>::iterator i=sizes.begin(); i!=sizes.end(); ++i) {
+               breitling.start();
+               result += expand_subs(*i);
+               times.push_back(breitling.read());
+               cout << '.' << flush;
+       }
+       
+       // print the report:
+       cout << endl << "       size:  ";
+       for (vector<unsigned>::iterator i=sizes.begin(); i!=sizes.end(); ++i)
+               cout << '\t' << *i;
+       cout << endl << "       time/s:";
+       for (vector<double>::iterator i=times.begin(); i!=times.end(); ++i)
+               cout << '\t' << *i;
+       cout << endl;
+       
+       return result;
+}
+
+extern void randomify_symbol_serials();
+
+int main(int argc, char** argv)
+{
+       randomify_symbol_serials();
+       cout << setprecision(2) << showpoint;
+       return time_dennyfliegner();
 }