1 #include "libmesh/fparser_ad.hh"    21            double _min, 
double _max, 
double _dx = 1e-6,
    22            double _reltol = 1e-5, 
int _steps = 20, 
double _abstol = 1e-10) :
    31       CPPUNIT_ASSERT_MESSAGE (
"Failed to parse test function", 
F.Parse(
func, 
"x") == -1);
    36       CPPUNIT_ASSERT_MESSAGE (
"Failed to take derivative of function", 
dF.AutoDiff(
"x") == -1);
    39       CPPUNIT_ASSERT_MESSAGE (
"Failed to take derivative of optimized function", 
dFopt.AutoDiff(
"x") == -1);
    41       dFaopt.SetADFlags(FunctionParserAD::ADAutoOptimize, 
true);
    42       CPPUNIT_ASSERT_MESSAGE (
"Failed to take derivative of auto-optimized function", 
dFaopt.AutoDiff(
"x") == -1);
    47       double x1, x2, vdF, vF1, vF2, fd;
    60           if (std::abs(vdF) > 
abstol && std::abs((fd - vdF)/vdF) > 
reltol && std::abs(fd - vdF)> 
abstol)
    62               std::cout << 
"Error in " << 
func << 
": " << fd << 
"!=" << vdF << 
" at x=" << x << 
'\n';
    67           if (std::abs(vdF) > 
abstol && std::abs((fd - vdF)/vdF) > 
reltol && std::abs(fd - vdF)> 
abstol)
    69               std::cout << 
"Error in opt " << 
func << 
": " << fd << 
"!=" << vdF << 
" at x=" << x << 
'\n';
    74           if (std::abs(vdF) > 
abstol && std::abs((fd - vdF)/vdF) > 
reltol && std::abs(fd - vdF)> 
abstol)
    76               std::cout << 
"Error in auto opt " << 
func << 
": " << fd << 
"!=" << vdF << 
" at x=" << x << 
'\n';
    97     tests.push_back(
ADTest(
"log(x*x) + log2(2*x) + log10(4*x)", 0.1, 3.0));
    98     tests.push_back(
ADTest(
"sin(-x) + cos(2*x) + tan(4*x)", -5.0, 5.0, 1e-7, 1e-5, 100));
    99     tests.push_back(
ADTest(
"sinh(-x) + cosh(x/2) + tanh(x/3)", -4.0, 4.0, 0.0001, 1e-5, 100));
   100     tests.push_back(
ADTest(
"plog(-x,0.01)", 0.001, 0.05, 0.00001, 1e-5, 100));
   101     tests.push_back(
ADTest(
"2 + 4*x + 8*x^2 + 16*x^3 + 32*x^4", -5.0, 5.0, 1e-5,1e-4));
   103     tests.push_back(
ADTest(
"sqrt(x*2)", 0.001, 2.0, 1e-6));
   108     tests.push_back(
ADTest(
"x*sin(-x)*log(x)*tanh(x)", 0.001, 5, 1e-8));
   109     tests.push_back(
ADTest(
"exp(-x) + 2*exp2(x)", -1.0, 2.0));
   110     tests.push_back(
ADTest(
"hypot(2*x,1) - hypot(1,4*x)", -10, 10.0));
   111     tests.push_back(
ADTest(
"if(x<0, (-x)^3, x^3)", -1.0, 1.0));
   112     tests.push_back(
ADTest(
"max(x^2-0.5,0)", -1.5, 1.5));
   113     tests.push_back(
ADTest(
"min(x^2-0.5,0)", -1.5, 1.5));
   114     tests.push_back(
ADTest(
"atan2(x,1) + atan2(2,x)", -0.99, 0.99));
   115     tests.push_back(
ADTest(
"0.767^sin(x)", -1.5, 1.5));
   116     tests.push_back(
ADTest(
"A := sin(x) + tanh(x); A + sqrt(A) - x", 0, 1.5));
   117     tests.push_back(
ADTest(
"3*sin(2*x)*sin(2*x)", -5.0, 5.0, 1e-7, 1e-5, 100));
   118     tests.push_back(
ADTest(
"erf(0.5*x)", -2., 2., 1e-6, 1e-5, 100));
   125     const unsigned int ntests = 
tests.size();
   127     unsigned int passed = 0;
   128     for (
unsigned i = 0; i < ntests; ++i)
   129       passed += 
tests[i].run() ? 1 : 0;
   131     CPPUNIT_ASSERT_EQUAL (passed, ntests);
   139     std::string func = 
"x*a";
   140     R.SetADFlags(FunctionParserAD::ADCacheDerivatives, 
true);
   143     R.Parse(func, 
"x,a");
   147     R.RegisterDerivative(
"a", 
"x", 
"y");
   155     FunctionParserAD dR(R);
   156     CPPUNIT_ASSERT_EQUAL (dR.AutoDiff(
"x"), -1);
   160     FunctionParserAD d2R(dR);
   161     CPPUNIT_ASSERT_EQUAL (d2R.AutoDiff(
"x"), -1);
   166     for (x = -1.0; x < 1.0; x+=0.3726)
   167       for (a = -1.0; a < 1.0; a+=0.2642)
   168         for (y = -1.0; y < 1.0; y+=0.3156)
   170             LIBMESH_ASSERT_FP_EQUAL(x*a, R.Eval(p),  1.e-12);
   171             LIBMESH_ASSERT_FP_EQUAL(a+x*y, dR.Eval(p), 1.e-12);
   172             LIBMESH_ASSERT_FP_EQUAL(2*y, d2R.Eval(p), 1.e-12);
   183     std::string func = 
"x*a";
   184     R.SetADFlags(FunctionParserAD::ADCacheDerivatives, 
true);
   187     R.Parse(func, 
"x,a");
   191     R.RegisterDerivative(
"a", 
"x", 
"a");
   199     FunctionParserAD dR(R);
   200     CPPUNIT_ASSERT_EQUAL (dR.AutoDiff(
"x"), -1);
   204     FunctionParserAD d2R(dR);
   205     CPPUNIT_ASSERT_EQUAL (d2R.AutoDiff(
"x"), -1);
   210     for (x = -1.0; x < 1.0; x+=0.3726)
   211       for (a = -1.0; a < 1.0; a+=0.2642)
   212         for (y = -1.0; y < 1.0; y+=0.3156)
   214             LIBMESH_ASSERT_FP_EQUAL(x*a, R.Eval(p), 1.e-12);
   215             LIBMESH_ASSERT_FP_EQUAL(a+x*a, dR.Eval(p), 1.e-12);
   216             LIBMESH_ASSERT_FP_EQUAL(2*a+x*a, d2R.Eval(p), 1.e-12);
 
std::vector< ADTest > tests
void registerDerivativeTest()
LIBMESH_CPPUNIT_TEST_SUITE(FParserAutodiffTest)
CPPUNIT_TEST_SUITE_REGISTRATION(FParserAutodiffTest)
ADTest(const std::string &_func, double _min, double _max, double _dx=1e-6, double _reltol=1e-5, int _steps=20, double _abstol=1e-10)
void registerDerivativeRepeatTest()