Optimizer.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // Optimizer.cpp: Implementation of the Optimizer class.
  4. //
  5. // Written by Matthias Wacker
  6. //
  7. //////////////////////////////////////////////////////////////////////
  8. #include <iostream>
  9. #include <cassert>
  10. #include "core/optimization/blackbox/Optimizer.h"
  11. using namespace OPTIMIZATION;
  12. //Optimizer::Optimizer(unsigned int numOfParameters, CostFunction *objectiveFunction, OptLogBase *loger)
  13. Optimizer::Optimizer(OptLogBase *loger)
  14. {
  15. m_costFunction = NULL;
  16. // may be NULL
  17. m_loger = loger;
  18. // SET defaults
  19. m_numberOfParameters = 0;
  20. m_maximize = false;
  21. m_lowerParameterBoundActive = false;
  22. m_upperParameterBoundActive = false;
  23. m_funcTolActive = false;
  24. m_paramTolActive = false;
  25. m_maxNumIterActive = false;
  26. m_maxSecondsActive = false;
  27. m_verbose = false;
  28. m_paramTol = 0.0001;
  29. m_funcTol = 0.000001;
  30. }
  31. Optimizer::Optimizer( const Optimizer &opt)
  32. {
  33. // no deep copies!
  34. m_costFunction = opt.m_costFunction;
  35. m_loger = opt.m_loger;
  36. //
  37. m_numberOfParameters = opt.m_numberOfParameters;
  38. m_parameters = opt.m_parameters;
  39. m_scales = opt.m_scales;
  40. m_upperParameterBound = opt.m_upperParameterBound;
  41. m_lowerParameterBound = opt.m_lowerParameterBound;
  42. m_funcTol = opt.m_funcTol;
  43. m_paramTol = opt.m_paramTol;
  44. m_maxNumIter = opt.m_maxNumIter;
  45. m_maxSeconds = opt.m_maxSeconds;
  46. m_maximize = opt.m_maximize;
  47. m_funcTolActive = opt.m_funcTolActive;
  48. m_paramTolActive = opt.m_paramTolActive;
  49. m_maxNumIterActive = opt.m_maxNumIterActive;
  50. m_maxSecondsActive = opt.m_maxSecondsActive;
  51. m_lowerParameterBoundActive = opt.m_lowerParameterBoundActive;
  52. m_upperParameterBoundActive = opt.m_upperParameterBoundActive;
  53. m_verbose = opt.m_verbose;
  54. }
  55. Optimizer & Optimizer::operator=(const Optimizer &opt)
  56. {
  57. /*
  58. avoid self-copy
  59. */
  60. if(this != &opt)
  61. {
  62. //
  63. // =operator of SuperClass
  64. //
  65. //SuperClass::operator=(opt);
  66. //
  67. // own values:
  68. //
  69. // no deep copies!
  70. m_costFunction = opt.m_costFunction;
  71. m_loger = opt.m_loger;
  72. //
  73. m_numberOfParameters = opt.m_numberOfParameters;
  74. m_parameters = opt.m_parameters;
  75. m_scales = opt.m_scales;
  76. m_upperParameterBound = opt.m_upperParameterBound;
  77. m_lowerParameterBound = opt.m_lowerParameterBound;
  78. m_funcTol = opt.m_funcTol;
  79. m_paramTol = opt.m_paramTol;
  80. m_maxNumIter = opt.m_maxNumIter;
  81. m_maxSeconds = opt.m_maxSeconds;
  82. m_maximize = opt.m_maximize;
  83. m_funcTolActive = opt.m_funcTolActive;
  84. m_paramTolActive = opt.m_paramTolActive;
  85. m_maxNumIterActive = opt.m_maxNumIterActive;
  86. m_maxSecondsActive = opt.m_maxSecondsActive;
  87. m_lowerParameterBoundActive = opt.m_lowerParameterBoundActive;
  88. m_upperParameterBoundActive = opt.m_upperParameterBoundActive;
  89. m_verbose = opt.m_verbose;
  90. }
  91. return *this;
  92. }
  93. Optimizer::~Optimizer()
  94. {
  95. }
  96. void Optimizer::setMaximize(bool maximize)
  97. {
  98. m_maximize = maximize;
  99. }
  100. void Optimizer::setParameters(const matrix_type & startParameters)
  101. {
  102. if(checkParameters(startParameters) == true)
  103. {
  104. m_parameters = startParameters;
  105. }
  106. else
  107. {
  108. if(m_loger)
  109. m_loger->logError("the parameters that were tried to set are not within the Bounds. Startparameters are set to the lower Bound");
  110. assert(false); // :)
  111. m_parameters = m_lowerParameterBound;
  112. }
  113. }
  114. bool Optimizer::checkParameters(const matrix_type & parameters)
  115. {
  116. assert( ((int)parameters.rows() == static_cast<int>(m_numberOfParameters)) && ((int)parameters.cols() == 1 ) );
  117. if(m_lowerParameterBoundActive || m_upperParameterBoundActive)
  118. {
  119. for(int i=0; i < static_cast<int>(m_numberOfParameters); i++)
  120. {
  121. if( m_upperParameterBoundActive)
  122. {
  123. if(parameters(i,0) >= m_upperParameterBound(i,0))
  124. {
  125. return false;
  126. }
  127. }
  128. if( m_lowerParameterBoundActive)
  129. {
  130. if(parameters(i,0) <= m_lowerParameterBound(i,0))
  131. {
  132. return false;
  133. }
  134. }
  135. }
  136. }
  137. return true;
  138. }
  139. void Optimizer::setScales(const matrix_type & scales)
  140. {
  141. assert ((int)scales.rows() == static_cast<int>(m_numberOfParameters) && ((int)scales.cols() == 1 ) );
  142. m_scales=scales;
  143. }
  144. void Optimizer::setUpperParameterBound(bool active, const matrix_type & upperBound)
  145. {
  146. m_upperParameterBoundActive = active;
  147. m_upperParameterBound = upperBound;
  148. }
  149. void Optimizer::setLowerParameterBound(bool active, const matrix_type & lowerBound)
  150. {
  151. m_lowerParameterBoundActive = active;
  152. m_lowerParameterBound = lowerBound;
  153. }
  154. void Optimizer::setFuncTol(bool active, double difference)
  155. {
  156. m_funcTolActive = active;
  157. m_funcTol = difference;
  158. }
  159. void Optimizer::setParamTol(bool active, double difference)
  160. {
  161. m_paramTolActive = active;
  162. m_paramTol = difference;
  163. }
  164. void Optimizer::setMaxNumIter(bool active, unsigned int num)
  165. {
  166. m_maxNumIterActive = active;
  167. m_maxNumIter = num;
  168. }
  169. void Optimizer::setTimeLimit(bool active, double seconds)
  170. {
  171. m_maxSecondsActive = active;
  172. m_maxSeconds = seconds;
  173. }
  174. void Optimizer::setLoger(OptLogBase *loger)
  175. {
  176. m_loger = loger;
  177. if(loger)
  178. {
  179. loger->init();
  180. }
  181. }
  182. void Optimizer::changeCostFunction(CostFunction* costFunction)
  183. {
  184. m_costFunction = costFunction;
  185. if (m_costFunction)
  186. {
  187. m_costFunction->init();
  188. }
  189. }
  190. double Optimizer::evaluateCostFunction(const matrix_type & x)
  191. {
  192. return ( m_maximize == true ? (-1.0 * m_costFunction->evaluate(x)):(m_costFunction->evaluate(x)));
  193. }
  194. void Optimizer::init()
  195. {
  196. /* Check costfunctin and loger */
  197. if( !m_costFunction)
  198. {
  199. if(m_loger)
  200. m_loger->logError("Optimizer init() failed because of missing costfunction");
  201. assert(false); // :)
  202. }
  203. else
  204. {
  205. m_costFunction->init();
  206. }
  207. m_numIter = 0;
  208. }
  209. /*!
  210. function that calls costfunction->evaluate for every column in x and inverts the sign in neccesary
  211. */
  212. Optimizer::matrix_type Optimizer::evaluateSetCostFunction(const matrix_type & xSet)
  213. {
  214. return ( m_maximize == true ? (m_costFunction->evaluateSet(xSet) * -1.0):(m_costFunction->evaluateSet(xSet)));
  215. }