From: Richard Kreckel Date: Thu, 28 Mar 2002 00:13:25 +0000 (+0000) Subject: * (time_fateman_expand.cpp): new file. X-Git-Tag: release_1-0-8~6 X-Git-Url: https://ginac.de/ginac.git/static/gitweb.css/ginac.git?a=commitdiff_plain;h=e3a85b82783389ef7d96a8d6d75c5ab64157e24b;p=ginac.git * (time_fateman_expand.cpp): new file. * (Makefile.am): compile it. * (times.h, times.cpp): declare and call it. --- diff --git a/check/Makefile.am b/check/Makefile.am index f4406cb2..bf25465c 100644 --- a/check/Makefile.am +++ b/check/Makefile.am @@ -19,7 +19,8 @@ times_SOURCES = time_dennyfliegner.cpp time_gammaseries.cpp \ time_lw_C.cpp time_lw_D.cpp time_lw_E.cpp time_lw_F.cpp time_lw_G.cpp \ time_lw_H.cpp time_lw_IJKL.cpp time_lw_M1.cpp time_lw_M2.cpp time_lw_N.cpp \ time_lw_O.cpp time_lw_P.cpp time_lw_Pprime.cpp time_lw_Q.cpp \ - time_lw_Qprime.cpp time_antipode.cpp timer.cpp times.cpp times.h + time_lw_Qprime.cpp time_antipode.cpp time_fateman_expand.cpp \ + timer.cpp times.cpp times.h times_LDADD = ../ginac/libginac.la INCLUDES = -I$(srcdir)/../ginac -I../ginac diff --git a/check/time_fateman_expand.cpp b/check/time_fateman_expand.cpp new file mode 100644 index 00000000..54f2ddf4 --- /dev/null +++ b/check/time_fateman_expand.cpp @@ -0,0 +1,72 @@ +/** @file time_fateman_expand.cpp + * + * Time for polynomial expansion of (x+y+z+1)^20 * ((x+y+z+1)^20+1). + * This test was suggested by Richard J. Fateman as a benchmark for programs + * to multiply sparse polynomials fast. + */ + +/* + * GiNaC Copyright (C) 1999-2002 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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 + */ + +#include "times.h" + +static unsigned test(void) +{ + unsigned result = 0; + const symbol x("x"), y("y"), z("z"); + + const ex p = pow(x+y+z+1, 20); + + const ex hugesum = expand(p * (p+1)); + + if (hugesum.nops()!=12341) { + clog << "(x+y+z+1)^20 * ((x+y+z+1)^20+1) was miscomputed!" << endl; + ++result; + } + + return result; +} + +unsigned time_fateman_expand(void) +{ + unsigned result = 0; + unsigned count = 0; + timer concord; + double time = .0; + + cout << "timing Fateman's polynomial expand benchmark" << flush; + clog << "-------Fateman's polynomial expand benchmark:" << endl; + + concord.start(); + // correct for very small times: + do { + result = test(); + ++count; + } while ((time=concord.read())<0.1 && !result); + cout << '.' << flush; + + if (!result) { + cout << " passed "; + clog << "(no output)" << endl; + } else { + cout << " failed "; + } + cout << int(1000*(time/count))*0.001 << 's' << endl; + + return result; +} diff --git a/check/times.cpp b/check/times.cpp index ea9f7432..c5dcff70 100644 --- a/check/times.cpp +++ b/check/times.cpp @@ -57,6 +57,7 @@ try { \ TIME(lw_Q) TIME(lw_Qprime) TIME(antipode) + TIME(fateman_expand) if (result) { cout << "Error: something went wrong. "; diff --git a/check/times.h b/check/times.h index 62ed8f29..fdf6d693 100644 --- a/check/times.h +++ b/check/times.h @@ -69,5 +69,6 @@ unsigned time_lw_Pprime(); unsigned time_lw_Q(); unsigned time_lw_Qprime(); unsigned time_antipode(); +unsigned time_fateman_expand(); #endif // ndef CHECKS_H