X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=doc%2Fexamples%2Fcompile1.cpp;h=cc81229e84c2ac721613696552253337f85b0c31;hp=e2fa8e022f4b261a25bf3f49a76622bd1942b025;hb=d625a28c3def007a9d2d5108141a6f6a4889bf9d;hpb=541c2950a84f2e0a19edae0da44ad2d317824ec4 diff --git a/doc/examples/compile1.cpp b/doc/examples/compile1.cpp index e2fa8e02..cc81229e 100644 --- a/doc/examples/compile1.cpp +++ b/doc/examples/compile1.cpp @@ -1,45 +1,69 @@ +#include #include using namespace std; #include using namespace GiNaC; -// Yes, we are using CUBA (should be installed on the system!) -#include "cuba.h" + +/* + * Demonstrates the use of compile_ex. + * + * Compiles a small expression as C code via compile_ex and evaluates the + * expression numerically. The evalation speed is timed and compared to the + * evaluation of the original GiNaC expression. + * + */ int main() { - // Let the user enter a expression - symbol x("x"), y("y"); - string s; - cout << "Enter an expression containing 'x' and/or 'y': "; - cin >> s; - // Expression now in expr - ex expr(s, lst(x,y)); + // Define some expression + symbol x("x"); + ex expr = sin(x); - cout << "start integration of " << expr << " ..." << endl; - - // Some definitions for VEGAS - #define NDIM 2 - #define NCOMP 1 - #define EPSREL 1e-3 - #define EPSABS 1e-12 - #define VERBOSE 0 - #define MINEVAL 0 - #define MAXEVAL 50000 - #define NSTART 1000 - #define NINCREASE 500 - - // Some variables for VEGAS - int comp, nregions, neval, fail; - double integral[NCOMP], error[NCOMP], prob[NCOMP]; - - // Starting VEGAS - // By invocation of compile() the expression in expr is converted into the - // appropriate function pointer - Vegas(NDIM, NCOMP, compile(lst(expr), lst(x,y)), EPSREL, EPSABS, VERBOSE, - MINEVAL, MAXEVAL, NSTART, NINCREASE, &neval, &fail, integral, error, prob); - - // Show the result - cout << "result: " << integral[0] << endl; + // Some variables for timing + time_t start, end; + double cpu_time_used; + + // Our function pointer that points to the compiled ex + FUNCP_1P fp; + compile_ex(expr, x, fp); + + // Do some (not necessarily meaningful ;-)) numerical stuff ... + + cout << "Doing numerics with compile_ex ..." << endl; + + // First using compile_ex + { + double result; + double point = 0.2; + start = clock(); + for (int i=0; i<100000; ++i) { + point += 0.001; + result += fp(point); + } + end = clock(); + + // Show the result + cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; + cout << "result = " << result << " in " << cpu_time_used << " seconds" << endl; + } + + cout << "Doing numerics without compile_ex ..." << endl; + + // Then without compile_ex + { + ex result; + ex point = 0.2; + start = clock(); + for (int i=0; i<100000; ++i) { + point += 0.001; + result += sin(point); + } + end = clock(); + + // Show the other result + cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; + cout << "result = " << result << " in " << cpu_time_used << " seconds" << endl; + } return 0; }