LineSearcher.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // LineSearcher.cpp: Implementation of the LineSearcher class.
  4. //
  5. // Written by Matthias Wacker
  6. //
  7. //////////////////////////////////////////////////////////////////////
  8. #include "optimization/LineSearcher.h"
  9. #include <iostream>
  10. using namespace optimization;
  11. LineSearcher::LineSearcher()
  12. {
  13. m_maximize = false;
  14. m_pEq = NULL;
  15. m_numEq = 0;
  16. m_pIneq = NULL;
  17. m_numIneq = 0;
  18. m_PP = 1000.0;
  19. m_verbose= false;
  20. }
  21. LineSearcher::LineSearcher(CostFunction *costFunc,OptLogBase* loger) : m_pFunc(costFunc), m_pLoger(loger)
  22. {
  23. m_maximize = false;
  24. m_pEq = NULL;
  25. m_numEq = 0;
  26. m_pIneq = NULL;
  27. m_numIneq = 0;
  28. m_PP = 10.0;
  29. m_verbose= false;
  30. }
  31. LineSearcher::LineSearcher(const LineSearcher &lin)
  32. {
  33. m_pFunc = lin.m_pFunc;
  34. m_pLoger = lin.m_pLoger;
  35. m_maximize = lin.m_maximize;
  36. m_pEq = lin.m_pEq;
  37. m_numEq = lin.m_numEq;
  38. m_pIneq = lin.m_pIneq;
  39. m_numIneq = lin.m_numIneq;
  40. m_PP = lin.m_PP;
  41. m_verbose = lin.m_verbose;
  42. }
  43. LineSearcher & LineSearcher::operator =(const LineSearcher &lin)
  44. {
  45. /*
  46. avoid self-copy
  47. */
  48. if(this != &lin)
  49. {
  50. /*
  51. =operator of SuperClass
  52. */
  53. //SuperClass::operator=(opt);
  54. m_pFunc = lin.m_pFunc;
  55. m_pLoger = lin.m_pLoger;
  56. m_maximize = lin.m_maximize;
  57. m_pEq = lin.m_pEq;
  58. m_numEq = lin.m_numEq;
  59. m_pIneq = lin.m_pIneq;
  60. m_numIneq = lin.m_numIneq;
  61. m_PP = lin.m_PP;
  62. m_verbose = lin.m_verbose;
  63. }
  64. return *this;
  65. }
  66. LineSearcher::~LineSearcher()
  67. {
  68. }
  69. bool LineSearcher::setH0(const matrix_type &H0)
  70. {
  71. bool tmp = true;
  72. if(m_pFunc)
  73. {
  74. if(m_pFunc->setH0(H0) == false)
  75. {
  76. tmp = false;
  77. }
  78. }
  79. if(m_pEq)
  80. {
  81. if(m_pEq->setH0(H0) == false)
  82. {
  83. tmp = false;
  84. }
  85. }
  86. if(m_pIneq)
  87. {
  88. if(m_pIneq->setH0(H0) == false)
  89. {
  90. tmp = false;
  91. }
  92. }
  93. return tmp;
  94. }
  95. bool LineSearcher::setX0(const matrix_type &x0)
  96. {
  97. bool tmp = true;
  98. if(m_pFunc)
  99. {
  100. if(m_pFunc->setX0(x0) == false)
  101. {
  102. tmp = false;
  103. }
  104. }
  105. if(m_pEq)
  106. {
  107. if(m_pEq->setX0(x0) == false)
  108. {
  109. tmp = false;
  110. }
  111. }
  112. if(m_pIneq)
  113. {
  114. if(m_pIneq->setX0(x0) == false)
  115. {
  116. tmp = false;
  117. }
  118. }
  119. return tmp;
  120. }
  121. bool LineSearcher::setConstraints(InequalityConstraints *ineq,EqualityConstraints *eq)
  122. {
  123. if(ineq)
  124. {
  125. if(ineq->getNumOfParameters() != m_pFunc->getNumOfParameters() )
  126. {
  127. return false;
  128. }
  129. m_numIneq = ineq->getNumOfConstraints();
  130. m_pIneq = ineq;
  131. }
  132. else
  133. {
  134. m_numIneq = 0;
  135. }
  136. if(eq)
  137. {
  138. if(eq->getNumOfParameters() != m_pFunc->getNumOfParameters() )
  139. {
  140. return false;
  141. }
  142. m_numEq = eq->getNumOfConstraints();
  143. m_pEq = eq;
  144. }
  145. else
  146. {
  147. m_numEq = 0;
  148. }
  149. return true;
  150. }
  151. bool LineSearcher::setPP(double pp)
  152. {
  153. if( pp> 0.0)
  154. {
  155. m_PP = pp;
  156. return true;
  157. }
  158. else
  159. {
  160. return false;
  161. }
  162. }
  163. double LineSearcher::evaluateSub(double lambda)
  164. {
  165. double val = 0;
  166. val = (m_maximize == true ? (-1.0 * m_pFunc->evaluateSub(lambda)): (m_pFunc->evaluateSub(lambda)));
  167. if(m_numEq)
  168. {
  169. matrix_type tmpval = m_pEq->evaluateSub(lambda);
  170. for(int j = 0; j<static_cast<int>(m_numEq);j++)
  171. {
  172. val += m_PP * (m_maximize == true ? (-1.0 * (1+(tmpval[j][0]* tmpval[j][0]))) : (1+ (tmpval[j][0]* tmpval[j][0])));
  173. }
  174. }
  175. if(m_numIneq)
  176. {
  177. matrix_type tmpval = m_pIneq->evaluateSub(lambda);
  178. for(int j = 0; j<static_cast<int>(m_numEq);j++)
  179. {
  180. val += m_PP * (m_maximize == true ? (-1.0 * (tmpval[j][0] > 0.0 ?(1 + tmpval[j][0] * tmpval[j][0]) : 0.0))
  181. : (tmpval[j][0]) > 0.0 ?(1+ tmpval[j][0] * tmpval[j][0]) : 0.0);
  182. }
  183. }
  184. return val;
  185. }