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 ¶meters) 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 ¶meters) 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
1.5.3 written by Dimitri van Heesch,
© 1997-2000