TestGradientDescent.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifdef NICE_USELIB_CPPUNIT
  2. #include <string>
  3. #include <exception>
  4. #include <map>
  5. #include "TestGradientDescent.h"
  6. #include "MyCostFunction.h"
  7. using namespace std;
  8. using namespace OPTIMIZATION;
  9. const bool verboseStartEnd = true;
  10. const bool verbose = true;
  11. //const bool verbose = false;
  12. CPPUNIT_TEST_SUITE_REGISTRATION( TestGradientDescent );
  13. void TestGradientDescent::setUp() {
  14. }
  15. void TestGradientDescent::tearDown() {
  16. }
  17. void TestGradientDescent::testGD_1Dim ()
  18. {
  19. if (verboseStartEnd)
  20. std::cerr << "================== TestGradientDescent::testGD_1Dim ===================== " << std::endl;
  21. int dim (1);
  22. CostFunction *func = new MyCostFunction(dim, verbose);
  23. //initial guess: 2.0
  24. OPTIMIZATION::matrix_type initialParams (dim, 1);
  25. initialParams.set(2.0);
  26. //we use a dimension scale of 1.0
  27. OPTIMIZATION::matrix_type scales (dim, 1);
  28. scales.set(1.0);
  29. //setup the optimization problem
  30. SimpleOptProblem optProblem ( func, initialParams, scales );
  31. optProblem.setMaximize(false);
  32. GradientDescentOptimizer optimizer;
  33. //we search with step-width of 1.0
  34. OPTIMIZATION::matrix_type searchSteps (dim, 1);
  35. searchSteps(0,0) = 1.0f;
  36. optimizer.setVerbose(true);
  37. optimizer.setStepSize( searchSteps );
  38. optimizer.setMaxNumIter(true, 1000);
  39. // optimizer.setFuncTol(true, 1e-8);
  40. optimizer.optimizeProb ( optProblem );
  41. OPTIMIZATION::matrix_type optimizedParams (optProblem.getAllCurrentParams());
  42. double goal(4.2);
  43. if (verbose)
  44. std::cerr << "1d optimization -- result " << optimizedParams(0,0) << " -- goal: " << goal << std::endl;
  45. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams(0,0), goal, 1e-5 /* tolerance */);
  46. if (verboseStartEnd)
  47. std::cerr << "================== TestGradientDescent::testGD_1Dim done ===================== " << std::endl;
  48. }
  49. void TestGradientDescent::testGD_2Dim()
  50. {
  51. if (verboseStartEnd)
  52. std::cerr << "================== TestGradientDescent::testGD_2Dim ===================== " << std::endl;
  53. int dim (2);
  54. CostFunction *func = new MyCostFunction(dim, verbose);
  55. //initial guess: 2.0
  56. OPTIMIZATION::matrix_type initialParams (dim, 1);
  57. initialParams.set(2.0);
  58. //we use a dimension scale of 1.0
  59. OPTIMIZATION::matrix_type scales (dim, 1);
  60. scales.set(1.0);
  61. //setup the optimization problem
  62. SimpleOptProblem optProblem ( func, initialParams, scales );
  63. optProblem.setMaximize(false);
  64. GradientDescentOptimizer optimizer;
  65. //we search with step-width of 1.0
  66. OPTIMIZATION::matrix_type searchSteps (dim, 1);
  67. searchSteps(0,0) = 1.0f;
  68. searchSteps(1,0) = 1.0f;
  69. optimizer.setVerbose(true);
  70. optimizer.setStepSize( searchSteps );
  71. optimizer.setMaxNumIter(true, 1000);
  72. //optimizer.setMinimalGradientMagnitude(1e-25);
  73. // optimizer.setFuncTol(true, 1e-8);
  74. optimizer.optimizeProb ( optProblem );
  75. OPTIMIZATION::matrix_type optimizedParams (optProblem.getAllCurrentParams());
  76. double goalFirstDim(4.7);
  77. double goalSecondDim(1.1);
  78. if (verbose)
  79. {
  80. std::cerr << "2d optimization 1st dim-- result " << optimizedParams(0,0) << " -- goal: " << goalFirstDim << std::endl;
  81. std::cerr << "2d optimization 1st dim-- result " << optimizedParams(1,0) << " -- goal: " << goalSecondDim << std::endl;
  82. }
  83. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams(0,0), goalFirstDim, 1e-5 /* tolerance */);
  84. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams(1,0), goalSecondDim, 1e-5 /* tolerance */);
  85. if (verboseStartEnd)
  86. std::cerr << "================== TestGradientDescent::testGD_2Dim done ===================== " << std::endl;
  87. }
  88. #endif