optimizer.h

Go to the documentation of this file.
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     // template <std::unary_function Functor>
00038     template<class Functor>
00039     class Optimizer {
00040     public:
00041       // Typedefs for convenience
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     }; // class Optimizer
00194 
00195   } // namespace optimization
00196 
00197 } // namespace dlr
00198 
00199 
00200 /* ======= Declarations to maintain compatibility with legacy code. ======= */
00201 
00202 namespace dlr {
00203 
00204   using optimization::Optimizer;
00205 
00206 } // namespace dlr
00207 
00208 
00209 /*******************************************************************
00210  * Member function definitions follow.  This would be a .cpp file
00211  * if it weren't templated.
00212  *******************************************************************/
00213 
00214 #include <dlrNumeric/array1D.h>
00215 #include <dlrOptimization/optimizerCommon.h>
00216 
00217 namespace dlr {
00218 
00219   namespace optimization {
00220 
00221     // Default constructor in derived classes must initialize
00222     // configuration parameters to reasonable values.
00223     template <class Functor>
00224     Optimizer<Functor>::
00225     Optimizer()
00226       : m_functor(),
00227         m_needsOptimization(true),
00228         m_optimum()
00229     {
00230       // Empty
00231     }
00232     
00233     // Constructor which specifies the specific Functor instance to use.
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       // Empty
00242     }
00243 
00244     // Copy constructor.
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     // Destructor.
00256     template <class Functor>
00257     Optimizer<Functor>::
00258     ~Optimizer()
00259     {
00260       // Empty
00261     }
00262 
00263     // Assignment operator.
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     // Find the optimum of the current Functor, if necessary, and
00278     // return the Functor value at that point.
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     // Find the optimum of the current Functor, if necessary, and
00293     // return the Functor argument which produces that optimum.
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     // Specify the Functor instance to use for the optimization.
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   } // namespace optimization
00318 
00319 } // namespace dlr
00320 
00321 #endif // #ifndef _DLR_OPTIMIZER_H_

Generated on Mon Jul 9 20:34:03 2007 for dlrLibs Utility Libraries by  doxygen 1.5.2