#ifdef NICE_USELIB_CPPUNIT #include #include #include #include "TestDownhillSimplex.h" #include "MyCostFunction.h" using namespace std; const bool verboseStartEnd = true; // const bool verbose = true; const bool verbose = false; CPPUNIT_TEST_SUITE_REGISTRATION( TestDownhillSimplex ); void TestDownhillSimplex::setUp() { } void TestDownhillSimplex::tearDown() { } void TestDownhillSimplex::testDHS_1Dim () { if (verboseStartEnd) std::cerr << "================== TestDownhillSimplex::testDHS_1Dim ===================== " << std::endl; int dim (1); CostFunction *func = new MyCostFunction(dim, verbose); //initial guess: 2.0 optimization::matrix_type initialParams (dim, 1); initialParams.Set(2.0); //we search with step-width of 1.0 optimization::matrix_type scales (dim, 1); scales.Set(1.0); //setup the optimization problem SimpleOptProblem optProblem ( func, initialParams, scales ); DownhillSimplexOptimizer optimizer; //actually, this has no effect at all optimizer.setMaxNumIter(true, 100); optimizer.optimizeProb ( optProblem ); optimization::matrix_type optimizedParams (optProblem.getAllCurrentParams()); double goal(4.2); if (verbose) std::cerr << "1d optimization -- result " << optimizedParams[0][0] << " -- goal: " << goal << std::endl; CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[0][0], goal, 1e-7 /* tolerance */); if (verboseStartEnd) std::cerr << "================== TestDownhillSimplex::testDHS_1Dim done ===================== " << std::endl; } void TestDownhillSimplex::testDHS_2Dim() { if (verboseStartEnd) std::cerr << "================== TestDownhillSimplex::testDHS_2Dim ===================== " << std::endl; int dim (2); CostFunction *func = new MyCostFunction(dim, verbose); //initial guess: 2.0 optimization::matrix_type initialParams (dim, 1); initialParams.Set(2.0); //we search with step-width of 1.0 optimization::matrix_type scales (dim, 1); scales.Set(1.0); //setup the optimization problem SimpleOptProblem optProblem ( func, initialParams, scales ); DownhillSimplexOptimizer optimizer; //actually, this has no effect at all optimizer.setMaxNumIter(true, 100); optimizer.optimizeProb ( optProblem ); optimization::matrix_type optimizedParams (optProblem.getAllCurrentParams()); double goalFirstDim(4.7); double goalSecondDim(1.1); if (verbose) { std::cerr << "2d optimization 1st dim-- result " << optimizedParams[0][0] << " -- goal: " << goalFirstDim << std::endl; std::cerr << "2d optimization 1st dim-- result " << optimizedParams[1][0] << " -- goal: " << goalSecondDim << std::endl; } CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[0][0], goalFirstDim, 1e-7 /* tolerance */); CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[1][0], goalSecondDim, 1e-7 /* tolerance */); if (verboseStartEnd) std::cerr << "================== TestDownhillSimplex::testDHS_2Dim done ===================== " << std::endl; } #endif