00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
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
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
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
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
00250 return 0;
00251 };
00252
00253 const long
00254 SetupOptimizationProcessor::
00255 GetCurrentIterationCount() const
00256 {
00257 return m_lCurIteration;
00258 }
00259
00260 }