freLimitedAxisAmoebaSOOptimizer.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: freLimitedAxisAmoebaSOOptimizer.h,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 "freLimitedAxisAmoebaSOOptimizer.h"
00024 #include "itkCommand.h"
00025 #include "itkEventObject.h"
00026 
00027 namespace FREE
00028 {
00029 
00030 LimitedAxisAmoebaSOOptimizer
00031 ::LimitedAxisAmoebaSOOptimizer()
00032 {
00033         m_InitialSimplexDelta.SetSize(1);
00034   m_ParameterAxis.Fill(-1); //Axis index equals parameter index.
00035         m_NumberOfAxis = 0;
00036 }
00037 
00038 void
00039 LimitedAxisAmoebaSOOptimizer
00040 ::PrintSelf(std::ostream& os, itk::Indent indent) const
00041 {
00042   Superclass::PrintSelf(os,indent);
00043 
00044   os << indent << "NumberOfAxis: "
00045      << m_NumberOfAxis << std::endl;
00046   os << indent << "ParameterAxis: "
00047      << m_ParameterAxis << std::endl;
00048 }
00049 
00050 LimitedAxisAmoebaSOOptimizer::MeasureType
00051 LimitedAxisAmoebaSOOptimizer
00052 ::GetValue (const ParametersType &parameters)
00053 {
00054         //translate 
00055   ParametersType scaledParameters = parameters;
00056   if(m_ScalesInitialized)
00057   {
00058     const ScalesType scales = this->GetScales();
00059     for(unsigned int i=0;i<parameters.size();i++)
00060     {
00061       scaledParameters[i] *= scales[i]; 
00062     }
00063   }
00064   return this->GetNonConstCostFunctionAdaptor()->f( scaledParameters );
00065 };
00066 
00067 LimitedAxisAmoebaSOOptimizer::DecomposedMeasureType
00068 LimitedAxisAmoebaSOOptimizer
00069 ::GetDecomposedValue (const ParametersType &parameters)
00070 {
00071         this->GetValue(parameters);
00072         return this->GetNonConstCostFunctionAdaptor()->GetCachedDecomposedValue();
00073 };
00074 
00075 void
00076 LimitedAxisAmoebaSOOptimizer::
00077 SetCostFunction( CostFunctionType * costFunction )
00078 {
00079         const unsigned int numberOfParameters = 
00080                 costFunction->GetNumberOfParameters();
00081 
00082         CostFunctionAdaptorType * adaptor = 
00083                 new CostFunctionAdaptorType( numberOfParameters, m_NumberOfAxis );
00084 
00085         this->m_CostFunction = costFunction;
00086         adaptor->SetCostFunction( costFunction );
00087 
00088         if( m_OptimizerInitialized )
00089         { 
00090                 delete m_VnlOptimizer;
00091         }
00092 
00093         this->SetCostFunctionAdaptor( adaptor );
00094 
00095         m_VnlOptimizer = new vnl_amoeba( *adaptor );
00096 
00097         // set up optimizer parameters
00098         m_VnlOptimizer->set_max_iterations( static_cast<int>( m_MaximumNumberOfIterations ) );
00099         m_VnlOptimizer->set_x_tolerance( m_ParametersConvergenceTolerance );
00100         m_VnlOptimizer->set_f_tolerance( m_FunctionConvergenceTolerance );
00101 
00102         m_OptimizerInitialized = true;
00103 }
00104 
00105 void
00106 LimitedAxisAmoebaSOOptimizer
00107 ::StartOptimization( void )
00108 {
00109     
00110         this->InvokeEvent( itk::StartEvent() );
00111 
00112         CostFunctionAdaptorType* pCostFunctionAdaptor = static_cast<CostFunctionAdaptorType*>(this->GetCostFunctionAdaptor());
00113 
00114         if( this->GetMaximize() )
00115     {
00116     pCostFunctionAdaptor->NegateCostFunctionOn();
00117     }
00118 
00119   ParametersType originPosition = this->GetInitialPosition();
00120 
00121   InternalParametersType internalParameters( m_NumberOfAxis );
00122         internalParameters.fill(0.0); //The limited axis optimization always starts at axis origins
00123 
00124         ScalesType scales(this->GetCostFunction()->GetNumberOfParameters());
00125         scales.Fill(1.0);
00126   if(m_ScalesInitialized)
00127     {
00128     scales = this->GetScales();
00129     }
00130 
00131         pCostFunctionAdaptor->SetScales(scales);
00132         pCostFunctionAdaptor->SetOriginPosition(originPosition);
00133         pCostFunctionAdaptor->SetParameterAxis(this->GetParameterAxis());
00134 
00135   // vnl optimizers return the solution by reference 
00136   // in the variable provided as initial position
00137   if (m_AutomaticInitialSimplex)
00138     {
00139     m_VnlOptimizer->minimize( internalParameters );
00140     }
00141   else
00142     {
00143     InternalParametersType delta( m_InitialSimplexDelta );
00144     m_VnlOptimizer->minimize( internalParameters, delta );
00145     }
00146   
00147   this->SetCurrentPosition(this->GetCachedCurrentPosition());
00148 
00149         m_BestPosition = this->GetCachedCurrentPosition();
00150         m_BestValue     = this->GetCachedValue();
00151     
00152         this->InvokeEvent( itk::EndEvent() );
00153 }
00154 
00155 } // end namespace FREE
00156 
00157 

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