00001
00015 #ifndef _DLR_OPTIMIZER_H_
00016 #define _DLR_OPTIMIZER_H_
00017
00018 #include <functional>
00019
00020 namespace dlr {
00021
00026 namespace optimization {
00027
00037
00038 template<class Functor>
00039 class Optimizer {
00040 public:
00041
00043 typedef typename Functor::argument_type argument_type;
00044
00045
00047 typedef typename Functor::result_type result_type;
00048
00049
00055 Optimizer();
00056
00057
00067 explicit Optimizer(const Functor& functor);
00068
00069
00076 Optimizer(const Optimizer& source);
00077
00078
00082 virtual ~Optimizer();
00083
00084
00091 Functor objectiveFunction() {return m_functor;}
00092
00093
00101 Optimizer&
00102 operator=(const Optimizer& source);
00103
00104
00113 result_type
00114 optimalValue();
00115
00116
00125 argument_type
00126 optimum();
00127
00128
00139 void
00140 setObjectiveFunction(const Functor& functor);
00141
00142 protected:
00143
00152 virtual
00153 std::pair<typename Functor::argument_type, typename Functor::result_type>
00154 run() = 0;
00155
00156
00170 virtual
00171 void
00172 setOptimum(const typename Functor::argument_type& optimum,
00173 const typename Functor::result_type& optimalValue,
00174 bool needsFurtherOptimization) {
00175 m_optimum = optimum;
00176 m_optimalValue = optimalValue;
00177 m_needsOptimization = needsFurtherOptimization;
00178 }
00179
00180
00182 Functor m_functor;
00183
00185 bool m_needsOptimization;
00186
00188 argument_type m_optimum;
00189
00191 result_type m_optimalValue;
00192
00193 };
00194
00195 }
00196
00197 }
00198
00199
00200
00201
00202 namespace dlr {
00203
00204 using optimization::Optimizer;
00205
00206 }
00207
00208
00209
00210
00211
00212
00213
00214 #include <dlrNumeric/array1D.h>
00215 #include <dlrOptimization/optimizerCommon.h>
00216
00217 namespace dlr {
00218
00219 namespace optimization {
00220
00221
00222
00223 template <class Functor>
00224 Optimizer<Functor>::
00225 Optimizer()
00226 : m_functor(),
00227 m_needsOptimization(true),
00228 m_optimum()
00229 {
00230
00231 }
00232
00233
00234 template <class Functor>
00235 Optimizer<Functor>::
00236 Optimizer(const Functor& functor)
00237 : m_functor(functor),
00238 m_needsOptimization(true),
00239 m_optimum()
00240 {
00241
00242 }
00243
00244
00245 template <class Functor>
00246 Optimizer<Functor>::
00247 Optimizer(const Optimizer& source)
00248 : m_functor(source.m_functor),
00249 m_needsOptimization(source.m_needsOptimization),
00250 m_optimum()
00251 {
00252 copyArgumentType(source.m_optimum, m_optimum);
00253 }
00254
00255
00256 template <class Functor>
00257 Optimizer<Functor>::
00258 ~Optimizer()
00259 {
00260
00261 }
00262
00263
00264 template <class Functor>
00265 Optimizer<Functor>&
00266 Optimizer<Functor>::
00267 operator=(const Optimizer& source)
00268 {
00269 if(&source != this) {
00270 m_functor = source.m_functor;
00271 m_needsOptimization = source.m_needsOptimization;
00272 copyArgumentType(source.m_optimum, m_optimum);
00273 }
00274 return *this;
00275 }
00276
00277
00278
00279 template <class Functor>
00280 typename Optimizer<Functor>::result_type
00281 Optimizer<Functor>::
00282 optimalValue()
00283 {
00284 if(m_needsOptimization==true) {
00285 std::pair<argument_type, result_type> optimum_optimalValue = this->run();
00286 this->setOptimum(
00287 optimum_optimalValue.first, optimum_optimalValue.second, false);
00288 }
00289 return m_optimalValue;
00290 }
00291
00292
00293
00294 template <class Functor>
00295 typename Optimizer<Functor>::argument_type
00296 Optimizer<Functor>::
00297 optimum()
00298 {
00299 if(m_needsOptimization==true) {
00300 std::pair<argument_type, result_type> optimum_optimalValue = this->run();
00301 this->setOptimum(
00302 optimum_optimalValue.first, optimum_optimalValue.second, false);
00303 }
00304 return m_optimum;
00305 }
00306
00307
00308 template <class Functor>
00309 void
00310 Optimizer<Functor>::
00311 setObjectiveFunction(const Functor& functor)
00312 {
00313 m_functor = functor;
00314 m_needsOptimization = true;
00315 }
00316
00317 }
00318
00319 }
00320
00321 #endif // #ifndef _DLR_OPTIMIZER_H_