cmtkMultiLevelOptimizer.cxx

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2398 $
00026 //
00027 //  $LastChangedDate: 2010-10-05 14:54:37 -0700 (Tue, 05 Oct 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #include "cmtkMultiLevelOptimizer.h"
00034 
00035 #include <System/cmtkException.h>
00036 
00037 namespace
00038 cmtk
00039 {
00040 
00043 
00044 CallbackResult
00045 MultiLevelOptimizer::Optimize( CoordinateVector& v, const Types::Coordinate, const Types::Coordinate )
00046 {
00047   if ( ! this->m_Optimizer )
00048     {
00049     throw( Exception( "MultiLevelOptimizer.m_Optimizer must be set before calling Optimize().", this ) );
00050     }
00051 
00052   if ( ! this->m_FunctionalList.size() )
00053     {
00054     throw( Exception( "MultiLevelOptimizer must have at least one functional before calling Optimize().", this ) );
00055     }
00056   
00057   // save original value of final functional so we can backtrack later, if
00058   // need be.
00059   this->SetFinalValue( (*(this->m_FunctionalList.rbegin()))->m_Functional->EvaluateAt( v ) );
00060   CoordinateVector vOriginal( v );
00061   
00062   // run sequential optimization on all functional with appropriate
00063   // parameters.
00064   CallbackResult result = CALLBACK_OK;
00065   FunctionalListType::iterator fit = this->m_FunctionalList.begin();
00066   while ( (fit != this->m_FunctionalList.end()) && (result == CALLBACK_OK) )
00067     {
00068     this->m_Optimizer->SetFunctional( (*fit)->m_Functional );
00069     result = this->m_Optimizer->Optimize
00070       ( v, (*fit)->m_InitialStepSize, (*fit)->m_FinalStepSize );
00071     ++fit;
00072     }
00073 
00074   // if we made things worse during the optimization, then
00075   // backtrack.
00076   const Self::ReturnType finalFunctionalValue = this->m_Optimizer->GetFinalValue();
00077   if ( finalFunctionalValue < this->GetFinalValue() )
00078     {
00079     v = vOriginal;
00080     }
00081   else
00082     {
00083     this->SetFinalValue( finalFunctionalValue );
00084     }
00085   
00086   return result;
00087 }
00088 
00089 } // namespace cmtk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines