d9604b1145463887d9aa3224c650212cf039d1f0
[ginac.git] / check / time_lw_H.cpp
1 /** @file time_lw_H.cpp
2  *
3  *  Test H from the paper "Comparison of Polynomial-Oriented CAS" by Robert H.
4  *  Lewis and Michael Wester. */
5
6 /*
7  *  GiNaC Copyright (C) 1999-2001 Johannes Gutenberg University Mainz, Germany
8  *
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.
13  *
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.
18  *
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
22  */
23
24 #include "times.h"
25
26 static unsigned test(void)
27 {
28         matrix h80(80,80);
29         
30         for (unsigned r=0; r<80; ++r)
31                 for (unsigned c=0; c<80; ++c)
32                         h80.set(r,c,numeric(1,r+c+1));
33         ex det = h80.determinant();
34         
35         if (abs(det.evalf()-numeric(".10097939769690107E-3789"))>numeric("1.E-3800")) {
36                 clog << "determinant of 80x80 erroneously returned " << det << endl;
37                 return 1;
38         }
39         return 0;
40 }
41
42 unsigned time_lw_H(void)
43 {
44         unsigned result = 0;
45         unsigned count = 0;
46         timer rolex;
47         double time = .0;
48         
49         cout << "timing Lewis-Wester test H (det of 80x80 Hilbert)" << flush;
50         clog << "-------Lewis-Wester test H (det of 80x80 Hilbert)" << endl;
51         
52         rolex.start();
53         // correct for very small times:
54         do {
55                 result = test();
56                 ++count;
57         } while ((time=rolex.read())<0.1 && !result);
58         cout << '.' << flush;
59         
60         if (!result) {
61                 cout << " passed ";
62                 clog << "(no output)" << endl;
63         } else {
64                 cout << " failed ";
65         }
66         cout << int(1000*(time/count))*0.001 << 's' << endl;
67         
68         return result;
69 }