@@ -44,10 +44,13 @@ Last modification : April 20 2017
4444#include < Core/Datatypes/DenseColumnMatrix.h>
4545#include < Core/Datatypes/SparseRowMatrix.h>
4646#include < Core/Datatypes/MatrixTypeConversions.h>
47+ #include < Core/Math/MiscMath.h>
4748
4849// SCIRun structural
4950#include < Core/Algorithms/Base/AlgorithmPreconditions.h>
51+ #include < Core/Algorithms/Base/AlgorithmVariableNames.h>
5052#include < Core/Logging/LoggerInterface.h>
53+ #include < Core/Logging/Log.h>
5154#include < Core/Utils/Exception.h>
5255
5356using namespace SCIRun ;
@@ -65,38 +68,41 @@ const AlgorithmInputName TikhonovAlgoAbstractBase::WeightingInSensorSpace("Weigh
6568const AlgorithmOutputName TikhonovAlgoAbstractBase::InverseSolution (" InverseSolution" );
6669const AlgorithmOutputName TikhonovAlgoAbstractBase::RegularizationParameter (" RegularizationParameter" );
6770const AlgorithmOutputName TikhonovAlgoAbstractBase::RegInverse (" RegInverse" );
68-
69- const AlgorithmParameterName TikhonovAlgoAbstractBase::TikhonovImplementation (" TikhonovImplementationOption" );
70- const AlgorithmParameterName TikhonovAlgoAbstractBase::RegularizationMethod (" lambdaMethodComboBox" );
71- const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationChoice (" autoRadioButton" );
72- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaFromDirectEntry (" lambdaDoubleSpinBox" );
73- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaMin (" lambdaMinDoubleSpinBox" );
74- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaMax (" lambdaMaxDoubleSpinBox" );
75- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaNum (" lambdaNumberSpinBox" );
76- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaResolution (" lambdaResolutionDoubleSpinBox" );
77- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaSliderValue (" lambdaSliderDoubleSpinBox" );
78- const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaCorner (" lCurveLambdaLineEdit" );
79- const AlgorithmParameterName TikhonovAlgoAbstractBase::LCurveText (" lCurveTextEdit" );
80- const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationSolutionSubcase (" solutionConstraintRadioButton" );
81- const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationResidualSubcase (" residualConstraintRadioButton" );
82-
83- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, RegularizationMethod);
84- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, regularizationChoice);
85- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaFromDirectEntry);
86- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaMin);
87- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaMax);
88- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaNum);
89- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaResolution);
90- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaSliderValue);
91- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LambdaCorner);
92- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, LCurveText);
93- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, regularizationSolutionSubcase);
94- // ALGORITHM_PARAMETER_DEF( TikhonovAlgoAbstractBase, regularizationResidualSubcase);
71+ //
72+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::TikhonovImplementation("TikhonovImplementationOption");
73+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::RegularizationMethod("lambdaMethodComboBox");
74+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationChoice("autoRadioButton");
75+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaFromDirectEntry("lambdaDoubleSpinBox");
76+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaMin("lambdaMinDoubleSpinBox");
77+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaMax("lambdaMaxDoubleSpinBox");
78+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaNum("lambdaNumberSpinBox");
79+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaResolution("lambdaResolutionDoubleSpinBox");
80+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaSliderValue("lambdaSliderDoubleSpinBox");
81+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaCorner("lCurveLambdaLineEdit");
82+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::LCurveText("lCurveTextEdit");
83+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationSolutionSubcase("solutionConstraintRadioButton");
84+ // const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationResidualSubcase("residualConstraintRadioButton");
85+
86+ ALGORITHM_PARAMETER_DEF ( Inverse, TikhonovImplementation);
87+ ALGORITHM_PARAMETER_DEF ( Inverse, RegularizationMethod);
88+ ALGORITHM_PARAMETER_DEF ( Inverse, regularizationChoice);
89+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaFromDirectEntry);
90+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaMin);
91+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaMax);
92+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaNum);
93+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaResolution);
94+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaSliderValue);
95+ ALGORITHM_PARAMETER_DEF ( Inverse, LambdaCorner);
96+ ALGORITHM_PARAMETER_DEF ( Inverse, LCurveText);
97+ ALGORITHM_PARAMETER_DEF ( Inverse, regularizationSolutionSubcase);
98+ ALGORITHM_PARAMETER_DEF ( Inverse, regularizationResidualSubcase);
9599
96100TikhonovAlgoAbstractBase::TikhonovAlgoAbstractBase ()
97101{
102+ using namespace Parameters ;
103+
98104 addParameter (TikhonovImplementation, NoMethodSelected);
99- addParameter (RegularizationMethod, " lcurve" );
105+ addOption (RegularizationMethod, " lcurve " , " single|slider| lcurve" );
100106 addParameter (regularizationChoice, 0 );
101107 addParameter (LambdaFromDirectEntry,1e-6 );
102108 // addParameter(lambdaDoubleSpinBox,1e-6);
@@ -142,7 +148,7 @@ bool TikhonovAlgoAbstractBase::checkInputMatrixSizes( const AlgorithmInput & inp
142148 // check source regularization matrix sizes
143149 if (sourceWeighting_)
144150 {
145- if ( get (regularizationSolutionSubcase).toInt ()==solution_constrained )
151+ if ( get (Parameters:: regularizationSolutionSubcase).toInt ()==solution_constrained )
146152 {
147153 // check that the matrix is of appropriate size (equal number of rows as columns in fwd matrix)
148154 if ( N != sourceWeighting_->ncols () )
@@ -152,7 +158,7 @@ bool TikhonovAlgoAbstractBase::checkInputMatrixSizes( const AlgorithmInput & inp
152158 }
153159 }
154160 // otherwise, if the source regularization is provided as the squared version (RR^T)
155- else if ( get (regularizationSolutionSubcase).toInt ()==solution_constrained_squared )
161+ else if ( get (Parameters:: regularizationSolutionSubcase).toInt ()==solution_constrained_squared )
156162 {
157163 // check that the matrix is of appropriate size and squared (equal number of rows as columns in fwd matrix)
158164 if ( ( N != sourceWeighting_->nrows () ) || ( N != sourceWeighting_->ncols () ) )
@@ -166,7 +172,7 @@ bool TikhonovAlgoAbstractBase::checkInputMatrixSizes( const AlgorithmInput & inp
166172 // check measurement regularization matrix sizes
167173 if (sensorWeighting_)
168174 {
169- if (get (regularizationResidualSubcase).toInt () == residual_constrained)
175+ if (get (Parameters:: regularizationResidualSubcase).toInt () == residual_constrained)
170176 {
171177 // check that the matrix is of appropriate size (equal number of rows as rows in fwd matrix)
172178 if (M != sensorWeighting_->ncols ())
@@ -176,7 +182,7 @@ bool TikhonovAlgoAbstractBase::checkInputMatrixSizes( const AlgorithmInput & inp
176182 }
177183 }
178184 // otherwise if the source covariance matrix is provided in squared form
179- else if ( get (regularizationResidualSubcase).toInt () == residual_constrained_squared )
185+ else if ( get (Parameters:: regularizationResidualSubcase).toInt () == residual_constrained_squared )
180186 {
181187 // check that the matrix is of appropriate size and squared (equal number of rows as rows in fwd matrix)
182188 if ( (M != sensorWeighting_->nrows ()) || (M != sensorWeighting_->ncols ()) )
@@ -204,8 +210,8 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
204210 auto sensorWeighting_ = input.get <Matrix>(TikhonovAlgoAbstractBase::WeightingInSensorSpace);
205211
206212 // get Parameters
207- auto RegularizationMethod_gotten = get ( RegularizationMethod). toString ( );
208- auto TikhonovImplementation_gotten = get (TikhonovImplementation).toString ();
213+ auto RegularizationMethod_gotten = getOption (Parameters:: RegularizationMethod);
214+ auto TikhonovImplementation_gotten = get (Parameters:: TikhonovImplementation).toString ();
209215
210216 // Alocate Variable
211217 DenseMatrix solution;
@@ -217,18 +223,18 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
217223
218224 // Determine specific Tikhonov Implementation
219225 TikhonovImpl *algoImpl;
220- if ( get (RegularizationMethod).toInt () == standardTikhonov ){
226+ if ( get (Parameters:: RegularizationMethod).toInt () == standardTikhonov ){
221227 // get Parameters
222- int regularizationChoice_ = get (regularizationChoice).toInt ();
223- int regularizationSolutionSubcase_ = get (regularizationSolutionSubcase).toInt ();
224- int regularizationResidualSubcase_ = get (regularizationResidualSubcase).toInt ();
228+ int regularizationChoice_ = get (Parameters:: regularizationChoice).toInt ();
229+ int regularizationSolutionSubcase_ = get (Parameters:: regularizationSolutionSubcase).toInt ();
230+ int regularizationResidualSubcase_ = get (Parameters:: regularizationResidualSubcase).toInt ();
225231
226232 algoImpl = new SolveInverseProblemWithStandardTikhonovImpl ( *castMatrix::toDense (forwardMatrix_), *castMatrix::toDense (measuredData_), *castMatrix::toDense (sourceWeighting_), *castMatrix::toDense (sensorWeighting_), regularizationChoice_, regularizationSolutionSubcase_, regularizationResidualSubcase_);
227233 }
228- else if ( get (RegularizationMethod).toInt () == TikhonovSVD ){
234+ else if ( get (Parameters:: RegularizationMethod).toInt () == TikhonovSVD ){
229235 // algoImpl = new SolveInverseProblemWithTikhonovSVD_impl( *castMatrix::toDense(forwardMatrix_), *castMatrix::toDense(measuredData_), *castMatrix::toDense(sourceWeighting_), *castMatrix::toDense(sensorWeighting_));
230236 }
231- else if ( get (RegularizationMethod).toInt () == TikhonovTSVD ){
237+ else if ( get (Parameters:: RegularizationMethod).toInt () == TikhonovTSVD ){
232238 THROW_ALGORITHM_PROCESSING_ERROR (" Tikhonov TSVD not implemented yet" );
233239 }
234240 else {
@@ -243,12 +249,12 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
243249 if (RegularizationMethod_gotten == " single" )
244250 {
245251 // Use single fixed lambda value, entered in UI
246- lambda_ = get (LambdaFromDirectEntry).toDouble ();
252+ lambda_ = get (Parameters:: LambdaFromDirectEntry).toDouble ();
247253 }
248254 else if (RegularizationMethod_gotten == " slider" )
249255 {
250256 // Use single fixed lambda value, select via slider
251- lambda_ = get (LambdaSliderValue).toDouble ();
257+ lambda_ = get (Parameters:: LambdaSliderValue).toDouble ();
252258 }
253259 }
254260 else if (RegularizationMethod_gotten == " lcurve" )
@@ -302,9 +308,9 @@ double TikhonovAlgoAbstractBase::computeLcurve( const SCIRun::Core::Algorithms::
302308 auto sensorWeighting_ = input.get <Matrix>(TikhonovAlgoAbstractBase::WeightingInSensorSpace);
303309
304310 // define the step size of the lambda vector to be computed (distance between min and max divided by number of desired lambdas in log scale)
305- const int nLambda = get (LambdaNum).toInt ();
306- const int lambdaMin_ = get (LambdaMin).toDouble ();
307- const int lambdaMax_ = get (LambdaMax).toDouble ();
311+ const int nLambda = get (Parameters:: LambdaNum).toInt ();
312+ const int lambdaMin_ = get (Parameters:: LambdaMin).toDouble ();
313+ const int lambdaMax_ = get (Parameters:: LambdaMax).toDouble ();
308314 const double lam_step = pow (10.0 , lambdaMax_ / lambdaMin_) / (nLambda-1 );
309315 double lambda = 0 ;
310316
0 commit comments