OptTestSuite.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "OptTestSuite.h"
  2. #include "Opt_Namespace.h"
  3. //
  4. //
  5. //
  6. #include "core/optimization/blackbox/DownhillSimplexOptimizer.h"
  7. #include "GradientDescentOptimizer.h"
  8. #include "BFGSOptimizer.h"
  9. #include "AdaptiveDirectionRandomSearchOptimizer.h"
  10. #include "CombinatorialOptimizer.h"
  11. #include "AdditionalIceUtils.h"
  12. #include "CostFunction_ndim_2ndOrder.h"
  13. using namespace OPTIMIZATION;
  14. #include <cstdlib> // rand
  15. //#include <cmath>
  16. #include <time.h> // time for srand
  17. double getRand()
  18. {
  19. return static_cast<double>(rand())/static_cast<double>(RAND_MAX);
  20. }
  21. void OptTestSuite::runAllTests()
  22. {
  23. // seed for test
  24. srand ( time(NULL) );
  25. std::cout << "beginning runAllTests()"<< std::endl;
  26. // run simple opt test grid
  27. runSimpleOptTestGrid();
  28. // any other test: to be continued ...
  29. }
  30. void OptTestSuite::runSimpleOptTestGrid()
  31. {
  32. std::cout << "beginning runSimpleOptTestGrid" << std::endl;
  33. std::vector<CostFunction*> cfns;
  34. std::vector<Optimizer*> opts;
  35. SimpleOptTestGrid testGrid;
  36. // insert optimizers
  37. insertOptsInGrid(testGrid,opts);
  38. // insert optprobs
  39. insertOptProbsInGrid(testGrid,cfns);
  40. // run
  41. std::cout << "running tests"<< std::endl;
  42. testGrid.test();
  43. std::cout << "finisshed tests"<< std::endl;
  44. // delete the optimizers and costfunctions!
  45. for (int i =0; i < static_cast<int>(opts.size());++i)
  46. {
  47. //cout << "deleting" << i << endl;
  48. delete opts[i];
  49. }
  50. opts.clear();
  51. for (int i =0; i < static_cast<int>(cfns.size());++i)
  52. {
  53. //cout << "deleting" << i << endl;
  54. delete cfns[i];
  55. }
  56. cfns.clear();
  57. std::cout << "finished runSimpleOptTestGrid" << std::endl;
  58. }
  59. void OptTestSuite::insertOptsInGrid(SimpleOptTestGrid &testGrid, std::vector<Optimizer*> &opts )
  60. {
  61. std::cout << "insert opts" << std::endl;
  62. // 0
  63. // DownhillSimplexOptimizer
  64. DownhillSimplexOptimizer *dho= new DownhillSimplexOptimizer();
  65. dho->setMaxNumIter(true, 5000); // 0-order info
  66. //dho->setParamTol(true, 1.0e-8);
  67. testGrid.addSimpleOptimizer(dho);
  68. opts.push_back(dho);
  69. // 1
  70. // GradientDescentOptimizer
  71. GradientDescentOptimizer *gdo= new GradientDescentOptimizer();
  72. gdo->setMaxNumIter(true, 5000); // 1st-order info
  73. gdo->setParamTol(true, 1.0e-8);
  74. //gdo->setVerbose(true);
  75. testGrid.addSimpleOptimizer(gdo);
  76. opts.push_back(gdo);
  77. // 2
  78. // BFGSOptimizer
  79. BFGSOptimizer *bfgso = new BFGSOptimizer();
  80. bfgso->setMaxNumIter(true,1000); // 1+ order: approximating 2nd order info
  81. bfgso->setParamTol(true, 1.0e-8);
  82. //bfgso->setLineSearchOptions(0.0,1.0,1.0e-8);
  83. //bfgso->setVerbose(true);
  84. testGrid.addSimpleOptimizer(bfgso);
  85. opts.push_back(bfgso);
  86. // 3
  87. //AdaptiveDirectionRandomSearchOptimizer
  88. AdaptiveDirectionRandomSearchOptimizer *adrso = new AdaptiveDirectionRandomSearchOptimizer(5); // 0-order random info
  89. adrso->setMaxNumIter(true,50000);
  90. testGrid.addSimpleOptimizer(adrso);
  91. opts.push_back(adrso);
  92. // 4
  93. // CombinatorialOptimizer
  94. CombinatorialOptimizer *co = new CombinatorialOptimizer();
  95. co->setMaxNumIter(true,250000);
  96. testGrid.addSimpleOptimizer(co);
  97. opts.push_back(co);
  98. }
  99. void OptTestSuite::insertOptProbsInGrid(SimpleOptTestGrid &testGrid, std::vector<CostFunction*> &cfns)
  100. {
  101. std::cout << "insert opt probs" << std::endl;
  102. int dim=0;
  103. // 0
  104. dim=1;
  105. CostFunction_ndim_2ndOrder *secOrder1 = new CostFunction_ndim_2ndOrder(dim);
  106. cfns.push_back(secOrder1);
  107. matrix_type A(dim,dim); A(0,0)= 3;
  108. matrix_type b(dim,1); b(0,0)=1;
  109. double c=14.378; secOrder1->setAbc(A,b,c);
  110. matrix_type secOrder1_solution(dim,1); secOrder1_solution(0,0)=-2.0/6.0; double secOrder1_succdist=1.0e-3;
  111. matrix_type secOrder1_inits(dim,1); secOrder1_inits(0,0)=-15.789;
  112. matrix_type secOrder1_scales(dim,1); secOrder1_scales(0,0)=1.0;
  113. SimpleOptProblem secOrderProb1(secOrder1,secOrder1_inits,secOrder1_scales);
  114. testGrid.addSimpleOptProblem( secOrderProb1, secOrder1_solution, secOrder1_succdist);
  115. // 1
  116. dim=15;
  117. CostFunction_ndim_2ndOrder *secOrder2 = new CostFunction_ndim_2ndOrder(dim);
  118. cfns.push_back(secOrder2);
  119. matrix_type A2(dim,dim);
  120. matrix_type b2(dim,1);
  121. matrix_type secOrder2_inits(dim,1);
  122. matrix_type secOrder2_scales(dim,1);
  123. for(int i=0; i < dim;++i)
  124. {
  125. for(int j=i;j< dim;++j)
  126. {
  127. if(i == j)
  128. {
  129. A2(i,j)=dim+getRand()*200;
  130. }
  131. else
  132. {
  133. A2(i,j)=getRand();
  134. A2(j,i)=A2(i,j);
  135. }
  136. }
  137. b2(i,0)=(getRand()-0.5) *dim ;
  138. secOrder2_inits(i,0)=(getRand()-0.5) *dim;
  139. secOrder2_scales(i,0)=1.0;
  140. }
  141. //A2 = A2 * (!A2);
  142. double c2=1.23546; secOrder2->setAbc(A2,b2,c2);
  143. matrix_type secOrder2_solution(dim,1);
  144. matrix_type mb2=b2;
  145. mb2*=-1.0;
  146. linSolve(A2, secOrder2_solution, mb2);
  147. double secOrder2_succdist=1.0e-3;
  148. // test if matrix is spd
  149. matrix_type L;
  150. matrix_type V;
  151. getEig(A2, L, V);
  152. //cout << "Eigenvals: " << L << endl;
  153. //cout << "A2 " << endl << A2 << endl;
  154. //cout << "b2 " << endl << b2 << endl;
  155. //cout << "init " << endl << secOrder2_inits << endl;
  156. //cout << "sol " << endl << secOrder2_solution << endl;
  157. SimpleOptProblem secOrderProb2(secOrder2,secOrder2_inits,secOrder2_scales);
  158. testGrid.addSimpleOptProblem( secOrderProb2, secOrder2_solution, secOrder2_succdist);
  159. }