freSetupOptimizationProcessor.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: freSetupOptimizationProcessor.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 #include "freSetupOptimizationProcessor.h"
00023 
00024 #include "freControllerCentral.h"
00025 #include "freRegistrationObserver.h"
00026 #include "freSetupOptimizationProgressObserver.h"
00027 
00028 namespace FREE
00029 {
00030 
00034 
00035 
00036 
00037 Setup*
00038 SetupOptimizationProcessor::
00039 GetSetup()
00040 {
00041   return m_smpSetup.GetPointer();
00042 };
00043 
00044 void
00045 SetupOptimizationProcessor::
00046 SetSetup(Setup* pSetup)
00047 {
00048   m_smpSetup = pSetup;
00049 
00050   if (m_Transform.IsNotNull()) m_Transform->SetReferenceSetup(m_smpSetup);
00051 
00052   this->Modified();
00053 };
00054 
00055 Adaptation::AdaptationList*
00056 SetupOptimizationProcessor::
00057 GetAdaptationList()
00058 {
00059   return m_smpAdaptations;
00060 };
00061 
00062 void
00063 SetupOptimizationProcessor::
00064 SetAdaptationList(Adaptation::AdaptationList* pAdaptations)
00065 {
00066   m_smpAdaptations = pAdaptations;
00067   
00068   if (m_Metric.IsNotNull()) m_Metric->SetAdaptationList(pAdaptations);
00069 
00070   this->Modified();
00071 };
00072 
00073 void
00074 SetupOptimizationProcessor::
00075 StartOptimization()
00076 {
00077   m_lCurIteration = 0;
00078 
00079         m_bOptimizationStarted = true;
00080 
00081         if (!m_Transform) throwExceptionMacro("Cannot start registration; no transformation component available.");
00082   if (!m_Metric) throwExceptionMacro("Cannot start registration; no metric component available.");
00083   if (!m_Optimizer) throwExceptionMacro("Cannot start registration; no optimizer component available.");
00084 
00085   try
00086   {
00087     //Connect all registration components
00088     if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTInitProcessor, "Connecting components",this);
00089 
00090     m_Metric->SetTransform(m_Transform);
00091     m_Metric->SetAdaptationList(m_smpAdaptations);
00092 
00093     m_Optimizer->SetCostFunction(m_Metric);
00094 
00095     //Set initials parameters
00096     if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTInitProcessor, "Setting initial transform parameters and setup values of components", this);
00097     m_Optimizer->SetInitialPosition(m_Transform->GetParameters());
00098 
00099                 //Link Events
00100                 m_Metric->fnOnEvaluationProgress = this->fnOnMetricComputationProgress;
00101                 m_Metric->fnOnEvaluationDone = this->fnOnEvaluationDone;
00102                 m_Metric->fnOnNextAdaptation = this->fnOnNextAdaptation;
00103                 m_Metric->fnOnEvaluationFailed = this->fnOnEvaluationFailed;
00104 
00105     m_Metric->Initialize();
00106                 
00107     //also add observer for optimizer iterations
00108                 IterationObserver::Pointer iterationObserver = IterationObserver::New();
00109                 NotificationEvent<Self>::Pointer iterationNotificationEvent = NotificationEvent<Self>::New(this, &Self::OnNewIteration);
00110     iterationObserver->fnOnNotify = iterationNotificationEvent;
00111     m_Optimizer->AddObserver(itk::IterationEvent(), iterationObserver);
00112     
00113     //and the observer for evaluation progress to all subcomponents
00114                 SetupOptimizationProgressObserver::Pointer progressObserver = SetupOptimizationProgressObserver::New();
00115                 ProgressEvent<Self>::Pointer progressNotificationEvent = ProgressEvent<Self>::New(this, &Self::OnEvaluationProgress);
00116     progressObserver->fnOnNotify = progressNotificationEvent.GetPointer();
00117     m_Metric->AddObserver(EvaluationProgressObserverEvent(), progressObserver);
00118     m_Transform->AddObserver(EvaluationProgressObserverEvent(), progressObserver);
00119     m_Optimizer->AddObserver(EvaluationProgressObserverEvent(), progressObserver);
00120   }
00121   catchAllNPassMacro("Unknown Error while preparing the registration.");
00122 
00123   try
00124   {
00125     if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTProcessing,"",this);
00126 
00127                 m_Optimizer->StartOptimization();
00128   }
00129   catchAllNPassMacro("Unknown Error while itk processing the registration.");
00130 
00131   //Save the final setup
00132   if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTFinalizing, "Optimization finished; computing final setup.",this);
00133         m_FinalParameters = m_Optimizer->GetBestPosition();
00134         m_FinalMeasure = m_Optimizer->GetBestValue();
00135         m_Transform->SetParameters(m_FinalParameters);
00136         m_smpFinalSetup = m_Transform->GenerateTransformedSetup();
00137 
00138   std::stringstream sstream;
00139   sstream << "Optimized setup: final parameter: " << m_FinalParameters << "; measure: "<< m_FinalMeasure;
00140   m_smpFinalSetup->SetDescription(sstream.str());
00141 
00142   m_bOptimizationDone = true;
00143 };
00144 
00145 void
00146 SetupOptimizationProcessor::
00147 ResumeOptimization()
00148 {
00149         if (!m_bOptimizationStarted) throwExceptionMacro("Cannot resume optimization befor optimization started.");
00150 
00151   try
00152   {
00153     if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTProcessing,"",this);
00154 
00155                 m_Optimizer->ResumeOptimization();
00156   }
00157   catchAllNPassMacro("Unknown Error while itk processing the registration.");
00158 
00159   //Save the final setup
00160   if(fnOnProgress.IsNotNull()) fnOnProgress->Execute(RSTFinalizing, "Optimization finished; computing final setup.",this);
00161         m_FinalParameters = m_Optimizer->GetBestPosition();
00162         m_FinalMeasure = m_Optimizer->GetBestValue();
00163         m_Transform->SetParameters(m_FinalParameters);
00164         m_smpFinalSetup = m_Transform->GenerateTransformedSetup();
00165 
00166   std::stringstream sstream;
00167   sstream << "Optimized setup: final parameter: " << m_FinalParameters << "; measure: "<< m_FinalMeasure;
00168   m_smpFinalSetup->SetDescription(sstream.str());
00169 };
00170 
00171 bool
00172 SetupOptimizationProcessor::
00173 OptimizationIsResumable()
00174 {
00175   if (m_Optimizer.IsNotNull())
00176   {
00177                 return m_Optimizer->IsResumeable();
00178   }
00179   return false;
00180 };
00181 
00182 void
00183 SetupOptimizationProcessor::
00184 StopOptimization()
00185 {
00186   if (m_Optimizer.IsNotNull())
00187   {
00188                 m_Optimizer->StopOptimization();
00189   }
00190 };
00191 
00192 bool
00193 SetupOptimizationProcessor::
00194 OptimizationIsStoppable()
00195 {
00196   if (m_Optimizer.IsNotNull())
00197   {
00198                 return m_Optimizer->IsStoppable();
00199   }
00200   return false;
00201 };
00202 
00203 SetupOptimizationProcessor::
00204 SetupOptimizationProcessor()
00205 { 
00206   m_bOptimizationDone = false;
00207   m_bOptimizationStarted = false;
00208   fnOnNextIteration = NULL;
00209   fnOnProgress = NULL;
00210   fnOnEvaluationDone = NULL;
00211   fnOnNextAdaptation = NULL;
00212   fnOnEvaluationFailed = NULL;
00213 
00214   m_lCurIteration = 0;
00215 };
00216 
00217 SetupOptimizationProcessor::
00218 ~SetupOptimizationProcessor()
00219 {};
00220 
00221 void
00222 SetupOptimizationProcessor::
00223 ComputeOptimization()
00224 {
00225 
00226 };
00227 
00228 void
00229 SetupOptimizationProcessor::
00230 OnNewIteration(void* pSender, long threadID)
00231 {
00232         if(fnOnNextIteration.IsNotNull()) fnOnNextIteration->Execute(m_lCurIteration, m_Optimizer->GetCurrentValue(), m_Optimizer->GetCurrentDecomposedValue(), m_Optimizer->GetCurrentPosition(), this);
00233   m_lCurIteration++;
00234 };
00235 
00236 void
00237 SetupOptimizationProcessor::
00238 OnEvaluationProgress(const long iStatusID, const std::string& sComment, void* pSender, long threadID)
00239 {
00240         if(fnOnEvaluationProgress.IsNotNull()) fnOnEvaluationProgress->Execute(iStatusID, sComment, pSender, threadID);
00241 };
00242 
00243 const long
00244 SetupOptimizationProcessor::
00245 GetMaxIterationCount() const
00246 {
00247         if (m_Optimizer.IsNull()) return -1;
00248 
00249         //TODO
00250         return 0;
00251 };
00252 
00253 const long
00254 SetupOptimizationProcessor::
00255 GetCurrentIterationCount() const
00256 {
00257         return m_lCurIteration;
00258 }
00259 
00260 }//End of Namespace free

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