File: itkCumulativeGaussianOptimizerTest.cxx

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (132 lines) | stat: -rw-r--r-- 5,670 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*=========================================================================
 *
 *  Copyright NumFOCUS
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *         https://www.apache.org/licenses/LICENSE-2.0.txt
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *=========================================================================*/

#include "itkCumulativeGaussianOptimizer.h"
#include "itkMath.h"
#include "itkTestingMacros.h"

#include <iostream>

/**
 * Generate test data with the Cumulative Gaussian Cost Function
 * given parameter values for mean, standard deviation,
 * lower and upper asymptotes of a Cumulative Gaussian.
 * Estimate the parameters of the test data with the
 * Cumulative Gaussian optimizer. The solution should
 * be within differenceTolerance of the fitError.
 */

int
itkCumulativeGaussianOptimizerTest(int, char *[])
{
  double mean = 3;                    // Mean of the Cumulative Gaussian.
                                      // Ranges from 0 to N-1, where N is numberOfSamples.
  double standardDeviation = 2;       // Standard deviation of the Cumulative Gaussian.
  double lowerAsymptote = -10;        // Lower asymptotic value of the Cumulative Gaussian.
  int    numberOfSamples = 9;         // Number of data samples.
  double upperAsymptote = 10;         // Upper asymptotic value of the Cumulative Gaussian.
  double differenceTolerance = 1e-20; // Tolerance allowed for the difference between Gaussian iterations.

  // Typedef and initialization for the Cumulative Gaussian Optimizer.
  using CumulativeGaussianOptimizerType = itk::CumulativeGaussianOptimizer;
  auto optimizer = CumulativeGaussianOptimizerType::New();

  ITK_EXERCISE_BASIC_OBJECT_METHODS(optimizer, CumulativeGaussianOptimizer, MultipleValuedNonLinearOptimizer);


  // Typedef and initialization for the Cumulative Gaussian Cost Function.
  using CostFunctionType = itk::CumulativeGaussianCostFunction;
  auto costFunction = CostFunctionType::New();

  // Declare and initialize the data array.
  // CostFunctionType::MeasureType * cumGaussianArray = new CostFunctionType::MeasureType();
  // cumGaussianArray->SetSize(numberOfSamples);

  // Set the parameters.
  CostFunctionType::ParametersType parameters;
  parameters.SetSize(4);
  parameters[0] = mean;
  parameters[1] = standardDeviation;
  parameters[2] = lowerAsymptote;
  parameters[3] = upperAsymptote;

  // Set the range of data sampled from a Cumulative Gaussian.
  costFunction->Initialize(numberOfSamples);

  // Generate data given a set of parameters.
  CostFunctionType::MeasureType * cumGaussianArray = costFunction->GetValuePointer(parameters);

  // Set the data array.
  costFunction->SetOriginalDataArray(cumGaussianArray);

  // Not used; empty method body; called for coverage purposes
  CostFunctionType::DerivativeType derivative;
  costFunction->GetDerivative(parameters, derivative);

  // Set the cost function.
  optimizer->SetCostFunction(costFunction);

  // Set the tolerance for the Gaussian iteration error.
  optimizer->SetDifferenceTolerance(differenceTolerance);
  ITK_TEST_SET_GET_VALUE(differenceTolerance, optimizer->GetDifferenceTolerance());

  // Print results after each iteration.
  bool verbose = true;
  ITK_TEST_SET_GET_BOOLEAN(optimizer, Verbose, verbose);

  // Set the data array.
  optimizer->SetDataArray(cumGaussianArray);

  // Start optimization;
  optimizer->StartOptimization();

  std::cout << "StopConditionDescription: " << optimizer->GetStopConditionDescription() << std::endl;

  // The test passes if the difference between the given parameters and estimated parameters
  // is less than or equal to 0.1.
  if (itk::Math::abs(optimizer->GetComputedMean() - mean) <= 0.1 &&
      itk::Math::abs(optimizer->GetComputedStandardDeviation() - standardDeviation) <= 0.1 &&
      itk::Math::abs(optimizer->GetUpperAsymptote() - upperAsymptote) <= 0.1 &&
      itk::Math::abs(optimizer->GetLowerAsymptote() - lowerAsymptote) <= 0.1)
  {
    std::cerr << std::endl << "Test Passed with a Fit Error of " << optimizer->GetFitError() << std::endl << std::endl;

    // Print out the resulting parameters.
    std::cerr << "Fitted mean = " << optimizer->GetComputedMean() << std::endl;
    std::cerr << "Fitted standard deviation = " << optimizer->GetComputedStandardDeviation() << std::endl;
    std::cerr << "Fitted upper intensity = " << optimizer->GetUpperAsymptote() << std::endl;
    std::cerr << "Fitted lower intensity = " << optimizer->GetLowerAsymptote() << std::endl;

    std::cerr << "FinalSampledArray: " << optimizer->GetFinalSampledArray() << std::endl;

    std::cout << "[TEST DONE]" << std::endl;
    return EXIT_SUCCESS;
  }
  else
  {
    std::cerr << std::endl << "Test Failed with a Fit Error of " << optimizer->GetFitError() << std::endl << std::endl;

    // Print out the resulting parameters.
    std::cerr << "Fitted mean = " << optimizer->GetComputedMean() << std::endl;
    std::cerr << "Fitted standard deviation = " << optimizer->GetComputedStandardDeviation() << std::endl;
    std::cerr << "Fitted upper asymptote = " << optimizer->GetUpperAsymptote() << std::endl;
    std::cerr << "Fitted lower asymptote = " << optimizer->GetLowerAsymptote() << std::endl;

    return EXIT_FAILURE;
  }
}