freSPSASOOptimizer.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   F.R.E.E. - flexible registration evaluation engine
00004   Version:   v.1.0.0
00005   Date:      $Date: 2006/09/01 12:00:00 $
00006   Module:    $RCSfile: freSPSASOOptimizer.cxx,v $
00007   Language:  C++
00008 
00009 
00010         
00011   Copyright (c) 2007 Ralf o Floca (Department of Medical Informatics,
00012   Institute for Medical Biometry and Informatics, University of Heidelberg,
00013   Germany). All rights reserved.
00014   See FREECopyright.txt or http://www.mi.med.uni-hd.de/free/copyright.htm
00015   for details.
00016 
00017      This software is distributed WITHOUT ANY WARRANTY; without even 
00018      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00019      PURPOSE.  See the above copyright notices for more information.
00020 
00021 =========================================================================*/
00022 
00023 #include "freSPSASOOptimizer.h"
00024 #include "itkCommand.h"
00025 #include "itkEventObject.h"
00026 
00027 namespace FREE
00028 {
00029 
00030   SPSASOOptimizer
00031     ::SPSASOOptimizer()
00032   {
00033     m_ItkOptimizer = ItkOptimizerType::New();
00034     m_CostFunctionWrapper = ItkSingleValuedCostFunctionWrapper::New();
00035 
00036     m_ValueUpdateRate = 10;
00037 
00038     this->SetMaximize(false);
00039 
00040     m_IterationObserver = IterationObserver::New();
00041     m_IterationNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptIteration);
00042     m_IterationObserver->fnOnNotify = m_IterationNotificationEvent;
00043     m_ItkOptimizer->AddObserver(itk::IterationEvent(), m_IterationObserver);
00044 
00045     m_StartObserver = StartObserver::New();
00046     m_StartNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptStart);
00047     m_StartObserver->fnOnNotify = m_StartNotificationEvent;
00048     m_ItkOptimizer->AddObserver(itk::StartEvent(), m_StartObserver);
00049 
00050     m_EndObserver = EndObserver::New();
00051     m_EndNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnOptEnd);
00052     m_EndObserver->fnOnNotify = m_EndNotificationEvent;
00053     m_ItkOptimizer->AddObserver(itk::EndEvent(), m_EndObserver);
00054   }
00055 
00056   void
00057   SPSASOOptimizer::
00058   GuessParameters(  unsigned long numberOfGradientEstimates,
00059       double initialStepSize)
00060   {
00061     this->m_ItkOptimizer->GuessParameters(numberOfGradientEstimates,initialStepSize);
00062   };
00063 
00064   void
00065     SPSASOOptimizer::
00066     SetCostFunction( CostFunctionType * costFunction )
00067   {
00068     Superclass::SetCostFunction(costFunction);
00069     m_CostFunctionWrapper->SetWrappedCostFunction(costFunction);
00070     m_ItkOptimizer->SetCostFunction(m_CostFunctionWrapper);
00071   };
00072 
00073   void
00074     SPSASOOptimizer::
00075     SetInitialPosition (const ParametersType &param)
00076   {
00077     Superclass::SetInitialPosition(param);
00078     m_ItkOptimizer->SetInitialPosition(param);
00079   };
00080 
00081   void
00082     SPSASOOptimizer
00083     ::PrintSelf(std::ostream& os, itk::Indent indent) const
00084   {
00085     Superclass::PrintSelf(os,indent);
00086 
00087     os << indent << "a: " << this->m_ItkOptimizer->Geta() << std::endl;
00088     os << indent << "A: " << this->m_ItkOptimizer->GetA() << std::endl;
00089     os << indent << "Alpha: " << this->m_ItkOptimizer->GetAlpha() << std::endl;
00090     os << indent << "c: " << this->m_ItkOptimizer->Getc() << std::endl;
00091     os << indent << "Gamma: " << this->m_ItkOptimizer->GetGamma() << std::endl;
00092 
00093     os << indent << "NumberOfPerturbations: " << this->m_ItkOptimizer->GetNumberOfPerturbations() << std::endl;
00094 
00095     os << indent << "LearningRate: " << this->m_ItkOptimizer->GetLearningRate() << std::endl;
00096 
00097     os << indent << "MaximumNumberOfIterations: " << this->m_ItkOptimizer->GetMaximumNumberOfIterations() << std::endl;
00098     os << indent << "MinimumNumberOfIterations: " << this->m_ItkOptimizer->GetMinimumNumberOfIterations() << std::endl;
00099     os << indent << "ValueUpdateRate: " << this->m_ValueUpdateRate << std::endl;
00100 
00101     os << indent << "Maximize: " << this->m_ItkOptimizer->GetMaximize() << std::endl;
00102     os << indent << "StopCondition: "  << this->m_ItkOptimizer->GetStopCondition() << std::endl;
00103 
00104     os << indent << "Current Iteration " << this->m_ItkOptimizer->GetCurrentIteration() << std::endl;
00105     os << indent << "Current Cost      " << this->GetCurrentValue()  << std::endl;
00106   }
00107 
00108   void
00109     SPSASOOptimizer
00110     ::StartOptimization( void )
00111   {
00112     this->m_ItkOptimizer->SetScales(this->GetScales());
00113     this->m_ItkOptimizer->StartOptimization();
00114 
00115     this->m_CurrentValue = this->m_ItkOptimizer->GetValue();
00116     this->m_CurrentDecomposedValue = this->m_CostFunction->GetCurrentDecomposedValue();
00117 
00118     this->m_BestValue = this->m_CurrentValue;
00119     this->m_BestPosition = this->m_ItkOptimizer->GetCurrentPosition();
00120   }
00121 
00122   bool
00123   SPSASOOptimizer
00124   ::IsStoppable() const
00125   {
00126     return true;
00127   };
00128 
00129    
00130   void
00131   SPSASOOptimizer
00132   ::StopOptimization()
00133   {
00134     this->m_ItkOptimizer->StopOptimization();
00135   };
00136 
00137   bool
00138   SPSASOOptimizer
00139   ::IsResumeable() const
00140   {
00141     return true;
00142   };
00143 
00144   void
00145   SPSASOOptimizer
00146   ::ResumeOptimization()
00147   {
00148     this->m_ItkOptimizer->ResumeOptimization();
00149   };
00150 
00151   SPSASOOptimizer::ItkOptimizerType * 
00152     SPSASOOptimizer
00153     ::GetItkOptimizer()
00154   {
00155     return m_ItkOptimizer;
00156   }
00157 
00158   void
00159     SPSASOOptimizer::
00160     OnOptIteration(void* pSender, long threadID)
00161   {
00162     if (this->m_ItkOptimizer->GetCurrentIteration()%m_ValueUpdateRate == 0)
00163     { //retrieving the value cost on evaluation of the objectiv function, so let the
00164       //user decide how many computation time should be spent on updating information.
00165       this->m_CurrentValue = this->m_ItkOptimizer->GetValue();
00166       this->m_CurrentDecomposedValue = this->m_CostFunction->GetCurrentDecomposedValue();
00167 
00168       this->m_BestValue = this->m_CurrentValue;
00169       this->m_BestPosition = this->m_ItkOptimizer->GetCurrentPosition();
00170     };
00171 
00172     this->SetCurrentPosition(this->m_ItkOptimizer->GetCurrentPosition());
00173 
00174 
00175     //and pass the signal to the rest of the world
00176     this->InvokeEvent( itk::IterationEvent() );
00177   };
00178 
00179   void
00180     SPSASOOptimizer::
00181     OnOptStart(void* pSender, long threadID)
00182   {
00183     //just pass the signal to the rest of the world
00184     this->InvokeEvent( itk::StartEvent() );
00185   };
00186 
00187   void
00188     SPSASOOptimizer::
00189     OnOptEnd(void* pSender, long threadID)
00190   {
00191     //just pass the signal to the rest of the world
00192     this->InvokeEvent( itk::EndEvent() );
00193   };
00194 
00195 } // end namespace FREE
00196 
00197 

Generated at Sat Oct 13 17:41:41 2007 for f.r.e.e. - Flexible Registration and Evaluation Engine by doxygen 1.5.3 written by Dimitri van Heesch, © 1997-2000