17 #ifndef _itkCumulativeGaussianOptimizer_cxx
18 #define _itkCumulativeGaussianOptimizer_cxx
56 double mean = startingPointForInsertion + m_ComputedMean;
57 double sd = m_ComputedStandardDeviation;
58 double amplitude = m_ComputedAmplitude;
60 m_OffsetForMean = startingPointForInsertion;
64 extendedArray->put(i, amplitude * vcl_exp(- ( vcl_pow((i-mean),2) / (2*vcl_pow(sd,2)) ) ));
69 extendedArray->put(i+startingPointForInsertion, originalArray->get(i));
82 for (
int i=0; i<size; i++)
83 sum = sum + (array1->get(i) - array2->get(i)) * (array1->get(i) - array2->get(i));
96 MeasureGaussianParameters(sampledGaussianArray);
100 PrintComputedParameterHeader();
101 PrintComputedParameters();
105 int extendedArraySize = 3 * sampledGaussianArraySize;
107 extendedArray->
SetSize(extendedArraySize);
109 extendedArrayCopy->
SetSize(extendedArraySize);
111 double averageSumOfSquaredDifferences = m_DifferenceTolerance;
113 extendedArray = ExtendGaussian(sampledGaussianArray, extendedArray, sampledGaussianArraySize);
115 MeasureGaussianParameters(extendedArray);
116 bool smallChangeBetweenIterations =
false;
117 while (averageSumOfSquaredDifferences >= m_DifferenceTolerance)
119 for(
int j = 0; j < extendedArraySize; j++)
121 extendedArrayCopy->put(j, extendedArray->get(j));
123 extendedArray = RecalculateExtendedArrayFromGaussianParameters(sampledGaussianArray,
125 sampledGaussianArraySize);
127 MeasureGaussianParameters(extendedArray);
130 PrintComputedParameters();
132 double temp = averageSumOfSquaredDifferences;
133 averageSumOfSquaredDifferences = FindAverageSumOfSquaredDifferences(extendedArray, extendedArrayCopy);
136 if(vcl_fabs(temp - averageSumOfSquaredDifferences) <= m_DifferenceTolerance)
138 m_StopConditionDescription.str(
"");
139 m_StopConditionDescription << this->GetNameOfClass() <<
": "
140 <<
"Change between iterations ("
141 << vcl_fabs(temp - averageSumOfSquaredDifferences)
142 <<
") is less than DifferenceTolerance ("
143 << m_DifferenceTolerance
148 if (!smallChangeBetweenIterations)
150 m_StopConditionDescription.str(
"");
151 m_StopConditionDescription << this->GetNameOfClass() <<
": "
152 <<
"Average sum of squared differences ("
153 << averageSumOfSquaredDifferences
154 <<
") is less than DifferenceTolerance ("
155 << m_DifferenceTolerance
160 m_ComputedMean = m_ComputedMean - m_OffsetForMean;
162 delete extendedArray;
163 delete extendedArrayCopy;
171 m_ComputedStandardDeviation = 0;
172 m_ComputedAmplitude = 0;
173 m_ComputedTransitionHeight = 0;
180 m_ComputedMean += i * array->get(i);
181 sum += array->get(i);
186 m_ComputedMean /= sum;
191 m_ComputedStandardDeviation += array->get(i) * vcl_pow((i - m_ComputedMean), 2);
193 m_ComputedStandardDeviation = vcl_sqrt(m_ComputedStandardDeviation/sum );
196 m_ComputedTransitionHeight = sum;
199 m_ComputedAmplitude = sum / (m_ComputedStandardDeviation * vcl_sqrt(2*vnl_math::pi));
206 std::cerr <<
"Mean\t" <<
"SD\t" <<
"Amp\t" <<
"Transition" <<std::endl;
212 std::cerr << m_ComputedMean - m_OffsetForMean <<
"\t"
213 << m_ComputedStandardDeviation <<
"\t"
214 << m_ComputedAmplitude <<
"\t"
215 << m_ComputedTransitionHeight << std::endl;
222 int startingPointForInsertion)
227 double mean = m_ComputedMean;
228 double sd = m_ComputedStandardDeviation;
229 double amplitude = m_ComputedAmplitude;
234 if( i < startingPointForInsertion ||
237 extendedArray->put(i, amplitude * vcl_exp(-(vcl_pow((i - mean),2) / (2 * vcl_pow(sd,2)))));
240 return extendedArray;
247 m_CumulativeGaussianArray = cumGaussianArray;
255 m_StopConditionDescription.str(
"");
256 m_StopConditionDescription << this->GetNameOfClass() <<
": Running";
259 int cumGaussianArraySize = m_CumulativeGaussianArray->GetNumberOfElements();
260 int sampledGaussianArraySize = cumGaussianArraySize;
264 sampledGaussianArray->
SetSize(sampledGaussianArraySize);
267 cumGaussianArrayCopy->
SetSize(cumGaussianArraySize);
270 for(
int j = 0; j < cumGaussianArraySize; j++)
272 cumGaussianArrayCopy->put(j, m_CumulativeGaussianArray->get(j));
276 derivative->
SetSize(cumGaussianArraySize - 1);
280 derivative->put(i-1, m_CumulativeGaussianArray->get(i) - m_CumulativeGaussianArray->get(i-1) );
282 m_CumulativeGaussianArray = derivative;
285 FindParametersOfGaussian(m_CumulativeGaussianArray);
288 for(
int i = 0; i < sampledGaussianArraySize; i++)
290 sampledGaussianArray->put(i, m_ComputedAmplitude * vcl_exp(- ( vcl_pow((i-m_ComputedMean),2) / (2*vcl_pow(m_ComputedStandardDeviation,2)) ) ));
296 for(
int i = sampledGaussianArraySize-1; i > 0; i--)
298 sampledGaussianArray->put(i-1, sampledGaussianArray->get(i) - sampledGaussianArray->get(i-1));
300 m_ComputedMean += 0.5;
303 double c = VerticalBestShift(cumGaussianArrayCopy, sampledGaussianArray);
308 sampledGaussianArray->put(i, sampledGaussianArray->get(i) + c);
312 int floorOfMean = (int)(m_ComputedMean);
313 double yFloorOfMean = sampledGaussianArray->get(floorOfMean);
314 double yCeilingOfMean = sampledGaussianArray->get(floorOfMean + 1);
315 double y = (m_ComputedMean-floorOfMean)*(yCeilingOfMean-yFloorOfMean)+yFloorOfMean;
316 m_UpperAsymptote = y + m_ComputedTransitionHeight/2;
317 m_LowerAsymptote = y - m_ComputedTransitionHeight/2;
321 for(
int i = 0; i < (int)(m_FinalSampledArray->GetNumberOfElements()); i++)
323 m_FinalSampledArray->put(i, sampledGaussianArray->get(i));
326 m_FitError =
static_cast<CostFunctionType*
>(m_CostFunction.GetPointer())->CalculateFitError(sampledGaussianArray);
329 delete sampledGaussianArray;
330 delete cumGaussianArrayCopy;
338 std::cerr << i <<
" " << array->get(i) << std::endl;
363 for(
int i=0; i<size; i++)
365 c += originalArray->get(i);
367 for(
int i=0; i<size; i++)
369 c -= newArray->get(i);
378 return m_StopConditionDescription.str();
385 Superclass::PrintSelf(os,indent);
387 os << indent <<
"Difference Tolerance = " << m_DifferenceTolerance << std::endl;
388 os << indent <<
"Computed Mean = " << m_ComputedMean << std::endl;
389 os << indent <<
"Computed Standard Deviation = " << m_ComputedStandardDeviation << std::endl;
390 os << indent <<
"Computed Amplitude = " << m_ComputedAmplitude << std::endl;
391 os << indent <<
"Computed Transition Height = " << m_ComputedTransitionHeight << std::endl;
393 os << indent <<
"Upper Asymptote = " << m_UpperAsymptote << std::endl;
394 os << indent <<
"Lower Asymptote = " << m_LowerAsymptote << std::endl;
395 os << indent <<
"Offset For Mean = " << m_OffsetForMean << std::endl;
396 os << indent <<
"Verbose = " << m_Verbose << std::endl;
397 os << indent <<
"Fit Error = " << m_FitError << std::endl;
399 os << indent <<
"StopConditionDescription: " << m_StopConditionDescription << std::endl;
400 if(m_FinalSampledArray)
402 os << indent <<
"Final Sampled Array = " << m_FinalSampledArray << std::endl;
406 os << indent <<
"Final Sampled Array = [not defined] " << std::endl;