Skip to content

Commit cfce892

Browse files
author
Jaume Coll-Font
authored
Merge pull request #1 from jessdtate/tikhonov
Tikhonov parameters. Merge from Jess fixes
2 parents 51c8518 + e02a313 commit cfce892

File tree

80 files changed

+9582
-776
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+9582
-776
lines changed

src/Core/Algorithms/Legacy/Inverse/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ SCIRUN_ADD_LIBRARY(Algorithms_Legacy_Inverse
4848
TARGET_LINK_LIBRARIES(Algorithms_Legacy_Inverse
4949
Core_Datatypes #matrices
5050
Core_Datatypes_Legacy_Field
51+
Algorithms_Math
5152
Core_Geometry_Primitives #vectors
5253
Core_Basis #field basis
5354
Core_Algorithms_Legacy_Fields

src/Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.cc

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5356
using namespace SCIRun;
@@ -65,38 +68,41 @@ const AlgorithmInputName TikhonovAlgoAbstractBase::WeightingInSensorSpace("Weigh
6568
const AlgorithmOutputName TikhonovAlgoAbstractBase::InverseSolution("InverseSolution");
6669
const AlgorithmOutputName TikhonovAlgoAbstractBase::RegularizationParameter("RegularizationParameter");
6770
const 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

96100
TikhonovAlgoAbstractBase::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

src/Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.h

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,19 @@ namespace Core {
3939
namespace Algorithms {
4040
namespace Inverse {
4141

42-
// ALGORITHM_PARAMETER_DECL(RegularizationMethod);
43-
// ALGORITHM_PARAMETER_DECL(regularizationChoice);
44-
// ALGORITHM_PARAMETER_DECL(regularizationSolutionSubcase);
45-
// ALGORITHM_PARAMETER_DECL(regularizationResidualSubcase);
46-
// ALGORITHM_PARAMETER_DECL(LambdaFromDirectEntry);
47-
// ALGORITHM_PARAMETER_DECL(LambdaMin);
48-
// ALGORITHM_PARAMETER_DECL(LambdaMax);
49-
// ALGORITHM_PARAMETER_DECL(LambdaNum);
50-
// ALGORITHM_PARAMETER_DECL(LambdaResolution);
51-
// ALGORITHM_PARAMETER_DECL(LambdaSliderValue);
52-
// ALGORITHM_PARAMETER_DECL(LambdaCorner);
53-
// ALGORITHM_PARAMETER_DECL(LCurveText);
42+
ALGORITHM_PARAMETER_DECL(TikhonovImplementation);
43+
ALGORITHM_PARAMETER_DECL(RegularizationMethod);
44+
ALGORITHM_PARAMETER_DECL(regularizationChoice);
45+
ALGORITHM_PARAMETER_DECL(regularizationSolutionSubcase);
46+
ALGORITHM_PARAMETER_DECL(regularizationResidualSubcase);
47+
ALGORITHM_PARAMETER_DECL(LambdaFromDirectEntry);
48+
ALGORITHM_PARAMETER_DECL(LambdaMin);
49+
ALGORITHM_PARAMETER_DECL(LambdaMax);
50+
ALGORITHM_PARAMETER_DECL(LambdaNum);
51+
ALGORITHM_PARAMETER_DECL(LambdaResolution);
52+
ALGORITHM_PARAMETER_DECL(LambdaSliderValue);
53+
ALGORITHM_PARAMETER_DECL(LambdaCorner);
54+
ALGORITHM_PARAMETER_DECL(LCurveText);
5455

5556
class SCISHARE TikhonovAlgoAbstractBase : virtual public AlgorithmBase
5657
{
@@ -69,19 +70,19 @@ namespace Inverse {
6970
static const AlgorithmOutputName RegInverse;
7071

7172
// define parameter names
72-
static const AlgorithmParameterName TikhonovImplementation;
73-
static const AlgorithmParameterName RegularizationMethod;
74-
static const AlgorithmParameterName regularizationChoice;
75-
static const AlgorithmParameterName regularizationSolutionSubcase;
76-
static const AlgorithmParameterName regularizationResidualSubcase;
77-
static const AlgorithmParameterName LambdaFromDirectEntry;
78-
static const AlgorithmParameterName LambdaMin;
79-
static const AlgorithmParameterName LambdaMax;
80-
static const AlgorithmParameterName LambdaNum;
81-
static const AlgorithmParameterName LambdaResolution;
82-
static const AlgorithmParameterName LambdaSliderValue;
83-
static const AlgorithmParameterName LambdaCorner;
84-
static const AlgorithmParameterName LCurveText;
73+
// static const AlgorithmParameterName TikhonovImplementation;
74+
// static const AlgorithmParameterName RegularizationMethod;
75+
// static const AlgorithmParameterName regularizationChoice;
76+
// static const AlgorithmParameterName regularizationSolutionSubcase;
77+
// static const AlgorithmParameterName regularizationResidualSubcase;
78+
// static const AlgorithmParameterName LambdaFromDirectEntry;
79+
// static const AlgorithmParameterName LambdaMin;
80+
// static const AlgorithmParameterName LambdaMax;
81+
// static const AlgorithmParameterName LambdaNum;
82+
// static const AlgorithmParameterName LambdaResolution;
83+
// static const AlgorithmParameterName LambdaSliderValue;
84+
// static const AlgorithmParameterName LambdaCorner;
85+
// static const AlgorithmParameterName LCurveText;
8586

8687
// Define algorithm choices
8788
enum TikhonovImplementationChoice {

0 commit comments

Comments
 (0)