Skip to content

Commit d1c35ad

Browse files
committed
applied the composition structure. Having some bugs that have to do with the parameter inconsistency between the UI, module and algorithms
1 parent e4b90e0 commit d1c35ad

16 files changed

+187
-116
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828

2929
SET(Algorithms_Legacy_Inverse_SRCS
3030
TikhonovAlgoAbstractBase.cc
31-
SolveInverseProblemWithTikhonovImpl_child.cc
31+
SolveInverseProblemWithStandardTikhonovImpl.cc
3232
SolveInverseProblemWithTikhonovSVD_impl.cc
3333
)
3434

3535
SET(Algorithms_Legacy_Inverse_HEADERS
3636
TikhonovAlgoAbstractBase.h
37-
SolveInverseProblemWithTikhonovImpl_child.h
37+
TikhonovImpl.h
38+
SolveInverseProblemWithStandardTikhonovImpl.h
3839
SolveInverseProblemWithTikhonovSVD_impl.h
3940
share.h
4041
)

src/Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithTikhonovImpl_child.cc renamed to src/Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithStandardTikhonovImpl.cc

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ DEALINGS IN THE SOFTWARE.
3434
#include <boost/lexical_cast.hpp>
3535

3636
#include <Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.h>
37-
#include <Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithTikhonovImpl_child.h>
37+
#include <Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithStandardTikhonovImpl.h>
3838

3939
#include <Core/Datatypes/Matrix.h>
4040
#include <Core/Datatypes/DenseMatrix.h>
@@ -57,7 +57,7 @@ using namespace SCIRun::Core::Algorithms::Inverse;
5757

5858
/////////////////////////
5959
///////// compute Inverse solution
60-
DenseMatrix SolveInverseProblemWithTikhonovImpl_child::computeInverseSolution( double lambda_sq, bool inverseCalculation) const
60+
DenseMatrix SolveInverseProblemWithStandardTikhonovImpl::computeInverseSolution( double lambda_sq, bool inverseCalculation) const
6161
{
6262
//............................
6363
// OPERATIONS PERFORMED IN THIS SECTION:
@@ -99,7 +99,7 @@ using namespace SCIRun::Core::Algorithms::Inverse;
9999

100100
/////// precomputeInverseMatrices
101101
///////////////
102-
void SolveInverseProblemWithTikhonovImpl_child::preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_)
102+
void SolveInverseProblemWithStandardTikhonovImpl::preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_, const int regularizationChoice_, const int regularizationSolutionSubcase_, const int regularizationResidualSubcase_)
103103
{
104104

105105
// TODO: use DimensionMismatch exception where appropriate
@@ -113,12 +113,12 @@ using namespace SCIRun::Core::Algorithms::Inverse;
113113
DenseMatrix forward_transpose = forwardMatrix_.transpose();
114114

115115
// get Parameters
116-
auto regularizationChoice_ = get(regularizationChoice).toInt();
117-
auto regularizationSolutionSubcase_ = get(regularizationSolutionSubcase).toInt();
118-
auto regularizationResidualSubcase_ = get(regularizationResidualSubcase).toInt();
116+
// auto regularizationChoice_ = get(regularizationChoice).toInt();
117+
// auto regularizationChoice_ = get(regularizationSolutionSubcase).toInt();
118+
// auto regularizationResidualSubcase_ = get(regularizationResidualSubcase).toInt();
119119

120120
// select underdetermined case if user decides so or the option is set to automatic and number of measurements is smaller than number of unknowns.
121-
if ( ( (M < N) && (regularizationChoice_ == automatic) ) || (regularizationChoice_ == underdetermined))
121+
if ( ( (M < N) && (regularizationChoice_ == TikhonovAlgoAbstractBase::automatic) ) || (regularizationChoice_ == TikhonovAlgoAbstractBase::underdetermined))
122122
{
123123
//UNDERDETERMINED CASE
124124
//.........................................................................
@@ -149,12 +149,12 @@ using namespace SCIRun::Core::Algorithms::Inverse;
149149
{
150150

151151
// if provided the non-squared version of R
152-
if( regularizationSolutionSubcase_==solution_constrained )
152+
if( regularizationSolutionSubcase_ == TikhonovAlgoAbstractBase::solution_constrained )
153153
{
154154
RRtr = sourceWeighting_.transpose() * sourceWeighting_;
155155
}
156156
// otherwise, if the source regularization is provided as the squared version (RR^T)
157-
else if ( regularizationSolutionSubcase_==solution_constrained_squared )
157+
else if ( regularizationSolutionSubcase_ == TikhonovAlgoAbstractBase::solution_constrained_squared )
158158
{
159159
RRtr = sourceWeighting_;
160160
}
@@ -183,7 +183,7 @@ using namespace SCIRun::Core::Algorithms::Inverse;
183183
else
184184
{
185185
// if measurement covariance matrix provided in non-squared form
186-
if (regularizationResidualSubcase_ == residual_constrained)
186+
if (regularizationResidualSubcase_ == TikhonovAlgoAbstractBase::residual_constrained)
187187
{
188188
// check that the matrix is of appropriate size (equal number of rows as rows in fwd matrix)
189189
if(M != sensorWeighting_.ncols())
@@ -192,7 +192,7 @@ using namespace SCIRun::Core::Algorithms::Inverse;
192192
}
193193
}
194194
// otherwise if the source covariance matrix is provided in squared form
195-
else if ( regularizationResidualSubcase_ == residual_constrained_squared )
195+
else if ( regularizationResidualSubcase_ == TikhonovAlgoAbstractBase::residual_constrained_squared )
196196
{
197197
CCtr = sensorWeighting_;
198198
}
@@ -229,7 +229,7 @@ using namespace SCIRun::Core::Algorithms::Inverse;
229229
}
230230
//OVERDETERMINED CASE,
231231
//similar procedure as underdetermined case (documentation comments similar, see above)
232-
else if ( ( (regularizationChoice_ == automatic) && (M>=N) ) || (regularizationChoice_==overdetermined) )
232+
else if ( ( (regularizationChoice_ == TikhonovAlgoAbstractBase::automatic) && (M>=N) ) || (regularizationChoice_ == TikhonovAlgoAbstractBase::overdetermined) )
233233
{
234234
//.........................................................................
235235
// OPERATE ON DATA:
@@ -260,12 +260,12 @@ using namespace SCIRun::Core::Algorithms::Inverse;
260260
else
261261
{
262262
// if provided the non-squared version of R
263-
if( regularizationSolutionSubcase_==solution_constrained )
263+
if( regularizationSolutionSubcase_ == TikhonovAlgoAbstractBase::solution_constrained )
264264
{
265265
RtrR = sourceWeighting_.transpose() * sourceWeighting_;
266266
}
267267
// otherwise, if the source regularization is provided as the squared version (RR^T)
268-
else if ( regularizationSolutionSubcase_==solution_constrained_squared )
268+
else if ( regularizationSolutionSubcase_ == TikhonovAlgoAbstractBase::solution_constrained_squared )
269269
{
270270
RtrR = sourceWeighting_;
271271
}
@@ -281,12 +281,12 @@ using namespace SCIRun::Core::Algorithms::Inverse;
281281
else
282282
{
283283
// if measurement covariance matrix provided in non-squared form
284-
if (regularizationResidualSubcase_ == residual_constrained)
284+
if (regularizationResidualSubcase_ == TikhonovAlgoAbstractBase::residual_constrained)
285285
{
286286
CtrC = sensorWeighting_.transpose() * sensorWeighting_;
287287
}
288288
// otherwise if the source covariance matrix is provided in squared form
289-
else if ( regularizationResidualSubcase_ == residual_constrained_squared )
289+
else if ( regularizationResidualSubcase_ == TikhonovAlgoAbstractBase::residual_constrained_squared )
290290
{
291291
CtrC = sensorWeighting_;
292292
}

src/Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithTikhonovImpl_child.h renamed to src/Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithStandardTikhonovImpl.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include <Core/Datatypes/DenseMatrix.h>
4141
#include <Core/Datatypes/DenseColumnMatrix.h>
4242
#include <Core/Logging/LoggerFwd.h>
43+
#include <Core/Algorithms/Legacy/Inverse/TikhonovImpl.h>
4344
#include <Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.h>
4445
#include <Core/Algorithms/Legacy/Inverse/share.h>
4546

@@ -48,13 +49,14 @@ namespace SCIRun {
4849
namespace Algorithms {
4950
namespace Inverse {
5051

51-
class SCISHARE SolveInverseProblemWithTikhonovImpl_child : public TikhonovAlgoAbstractBase
52+
class SCISHARE SolveInverseProblemWithStandardTikhonovImpl : public TikhonovImpl
5253
{
5354

5455
public:
55-
SolveInverseProblemWithTikhonovImpl_child() {};
56-
57-
void preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_);
56+
SolveInverseProblemWithStandardTikhonovImpl(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_, const int regularizationChoice_, const int regularizationSolutionSubcase_, const int regularizationResidualSubcase_ )
57+
{
58+
preAlocateInverseMatrices( forwardMatrix_, measuredData_ , sourceWeighting_, sensorWeighting_, regularizationChoice_, regularizationSolutionSubcase_, regularizationResidualSubcase_);
59+
};
5860

5961
private:
6062

@@ -64,7 +66,7 @@ namespace SCIRun {
6466
SCIRun::Core::Datatypes::DenseMatrix M4;
6567
SCIRun::Core::Datatypes::DenseMatrix y;
6668

67-
protected:
69+
void preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_, const int regularizationChoice_, const int regularizationSolutionSubcase_, const int regularizationResidualSubcase_ );
6870

6971
virtual SCIRun::Core::Datatypes::DenseMatrix computeInverseSolution( double lambda_sq, bool inverseCalculation) const;
7072
// bool checkInputMatrixSizes(); // DEFINED IN PARENT, MIGHT WANT TO OVERRIDE SOME OTHER TIME

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#include <Core/Datatypes/DenseColumnMatrix.h>
4444
#include <Core/Logging/LoggerFwd.h>
4545

46-
#include <Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.h>
46+
#include <Core/Algorithms/Legacy/Inverse/TikhonovImpl.h>
4747

4848
#include <Core/Algorithms/Legacy/Inverse/share.h>
4949

@@ -53,24 +53,26 @@ namespace Core {
5353
namespace Algorithms {
5454
namespace Inverse {
5555

56-
class SCISHARE SolveInverseProblemWithTikhonovSVD_impl : public TikhonovAlgoAbstractBase
56+
class SCISHARE SolveInverseProblemWithTikhonovSVD_impl : public TikhonovImpl
5757
{
5858

5959

6060
public:
61-
SolveInverseProblemWithTikhonovSVD_impl()
62-
{
63-
rank = 0;
64-
};
65-
66-
void preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_);
61+
SolveInverseProblemWithTikhonovSVD_impl(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_)
62+
{
63+
preAlocateInverseMatrices( forwardMatrix_, measuredData_ , sourceWeighting_, sensorWeighting_);
64+
rank = 0;
65+
};
6766

6867
private:
6968

69+
// Data Members
7070
int rank;
7171
Eigen::JacobiSVD<SCIRun::Core::Datatypes::DenseMatrix::EigenBase> SVDdecomposition;
7272
SCIRun::Core::Datatypes::DenseMatrix Uy;
7373

74+
// Methods
75+
void preAlocateInverseMatrices(const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_);
7476

7577
virtual SCIRun::Core::Datatypes::DenseMatrix computeInverseSolution( double lambda_sq, bool inverseCalculation) const;
7678
// bool checkInputMatrixSizes(); // DEFINED IN PARENT, MIGHT WANT TO OVERRIDE SOME OTHER TIME

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

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,28 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2525
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2626
DEALINGS IN THE SOFTWARE.
2727
28-
Author : Moritz Dannhauer
29-
Last modification : March 16 2014
30-
ToDo: Padding is always enabled because of exit() in cleaver lib
28+
Author : Jaume Coll-Font
29+
Last modification : April 20 2017
3130
*/
31+
3232
#include <boost/bind.hpp>
3333
#include <boost/lexical_cast.hpp>
3434

35+
// Tikhonov specific headers
3536
#include <Core/Algorithms/Legacy/Inverse/TikhonovAlgoAbstractBase.h>
37+
#include <Core/Algorithms/Legacy/Inverse/TikhonovImpl.h>
38+
#include <Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithStandardTikhonovImpl.h>
39+
#include <Core/Algorithms/Legacy/Inverse/SolveInverseProblemWithTikhonovSVD_impl.h>
3640

41+
// Datatypes
3742
#include <Core/Datatypes/Matrix.h>
3843
#include <Core/Datatypes/DenseMatrix.h>
3944
#include <Core/Datatypes/DenseColumnMatrix.h>
4045
#include <Core/Datatypes/SparseRowMatrix.h>
4146
#include <Core/Datatypes/MatrixTypeConversions.h>
4247

48+
// SCIRun structural
4349
#include <Core/Algorithms/Base/AlgorithmPreconditions.h>
44-
4550
#include <Core/Logging/LoggerInterface.h>
4651
#include <Core/Utils/Exception.h>
4752

@@ -61,7 +66,7 @@ const AlgorithmOutputName TikhonovAlgoAbstractBase::InverseSolution("InverseSolu
6166
const AlgorithmOutputName TikhonovAlgoAbstractBase::RegularizationParameter("RegularizationParameter");
6267
const AlgorithmOutputName TikhonovAlgoAbstractBase::RegInverse("RegInverse");
6368

64-
69+
const AlgorithmParameterName TikhonovAlgoAbstractBase::TikhonovImplementation("NoMethodSelected");
6570
const AlgorithmParameterName TikhonovAlgoAbstractBase::RegularizationMethod("lambdaMethodComboBox");
6671
const AlgorithmParameterName TikhonovAlgoAbstractBase::regularizationChoice("autoRadioButton");
6772
const AlgorithmParameterName TikhonovAlgoAbstractBase::LambdaFromDirectEntry("lambdaDoubleSpinBox");
@@ -109,7 +114,6 @@ TikhonovAlgoAbstractBase::TikhonovAlgoAbstractBase()
109114
////// CHECK IF INPUT MATRICES HAVE THE CORRECT SIZE
110115
bool TikhonovAlgoAbstractBase::checkInputMatrixSizes( const AlgorithmInput & input) const
111116
{
112-
113117
// get inputs
114118
auto forwardMatrix_ = input.get<Matrix>(ForwardMatrix);
115119
auto measuredData_ = input.get<Matrix>(MeasuredPotentials);
@@ -200,16 +204,37 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
200204

201205
// get Parameters
202206
auto RegularizationMethod_gotten = get(RegularizationMethod).toString();
203-
204-
// preAlocateInverseMatrices(forwardMatrix_,measuredData_,sourceWeighting_,sensorWeighting_);
205-
206-
const int M = forwardMatrix_->nrows();
207+
auto TikhonovImplementation_gotten = get(TikhonovImplementation).toString();
207208

208209
// Alocate Variable
209210
DenseMatrix solution;
210211
double lambda_sq = 0;
211212
double lambda_ = 0;
212213

214+
// check input MATRICES
215+
checkInputMatrixSizes( input );
216+
217+
// Determine specific Tikhonov Implementation
218+
TikhonovImpl *algoImpl;
219+
if ( TikhonovImplementation_gotten == "standardTikhonov"){
220+
// get Parameters
221+
int regularizationChoice_ = get(regularizationChoice).toInt();
222+
int regularizationSolutionSubcase_ = get(regularizationSolutionSubcase).toInt();
223+
int regularizationResidualSubcase_ = get(regularizationResidualSubcase).toInt();
224+
225+
algoImpl = new SolveInverseProblemWithStandardTikhonovImpl( *castMatrix::toDense(forwardMatrix_), *castMatrix::toDense(measuredData_), *castMatrix::toDense(sourceWeighting_), *castMatrix::toDense(sensorWeighting_), regularizationChoice_, regularizationSolutionSubcase_, regularizationResidualSubcase_);
226+
}
227+
else if ( TikhonovImplementation_gotten == "TikhonovSVD"){
228+
algoImpl = new SolveInverseProblemWithTikhonovSVD_impl( *castMatrix::toDense(forwardMatrix_), *castMatrix::toDense(measuredData_), *castMatrix::toDense(sourceWeighting_), *castMatrix::toDense(sensorWeighting_));
229+
}
230+
else if ( TikhonovImplementation_gotten == "TikhonovTSVD" ){
231+
THROW_ALGORITHM_PROCESSING_ERROR("Tikhonov TSVD not implemented yet");
232+
}
233+
else{
234+
THROW_ALGORITHM_PROCESSING_ERROR("Not a valid Tikhonov Implementation selection");
235+
}
236+
237+
// preAlocateInverseMatrices(forwardMatrix_,measuredData_,sourceWeighting_,sensorWeighting_);
213238

214239
//Get Regularization parameter(s) : Lambda
215240
if ((RegularizationMethod_gotten == "single") || (RegularizationMethod_gotten == "slider"))
@@ -227,7 +252,7 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
227252
}
228253
else if (RegularizationMethod_gotten == "lcurve")
229254
{
230-
lambda_ = computeLcurve( input );
255+
lambda_ = computeLcurve( algoImpl, input );
231256
}
232257
else
233258
{
@@ -239,7 +264,7 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
239264

240265

241266
// compute inverse solution
242-
solution = computeInverseSolution(lambda_sq, true);
267+
solution = algoImpl->computeInverseSolution(lambda_sq, true);
243268

244269
//
245270
// // set final result
@@ -266,7 +291,7 @@ AlgorithmOutput TikhonovAlgoAbstractBase::run(const AlgorithmInput & input) cons
266291

267292
///////////////////////////
268293
/////// compute L-curve
269-
double TikhonovAlgoAbstractBase::computeLcurve(const AlgorithmInput & input ) const
294+
double TikhonovAlgoAbstractBase::computeLcurve( const SCIRun::Core::Algorithms::Inverse::TikhonovImpl * algoImpl, const AlgorithmInput & input ) const
270295
{
271296

272297
// get inputs
@@ -309,8 +334,8 @@ double TikhonovAlgoAbstractBase::computeLcurve(const AlgorithmInput & input ) co
309334
// set current lambda
310335
lambda_sq = lambdaArray[j] * lambdaArray[j];
311336

312-
// COMPUTE INVERSE SOLUTION // Todo: @JCOLLFONT function needs to be defined
313-
solution = computeInverseSolution( lambda_sq, false);
337+
// COMPUTE INVERSE SOLUTION
338+
solution = algoImpl->computeInverseSolution( lambda_sq, false);
314339

315340

316341
// if using source regularization matrix, apply it to compute Rx (for the eta computations)

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#define BioPSE_TikhonovAlgoAbstractBase_H__
3131

3232
#include <Core/Algorithms/Base/AlgorithmBase.h>
33+
#include <Core/Algorithms/Legacy/Inverse/TikhonovImpl.h>
3334
#include <Core/Algorithms/Field/share.h>
3435

3536

@@ -68,6 +69,7 @@ namespace Inverse {
6869
static const AlgorithmOutputName RegInverse;
6970

7071
// define parameter names
72+
static const AlgorithmParameterName TikhonovImplementation;
7173
static const AlgorithmParameterName RegularizationMethod;
7274
static const AlgorithmParameterName regularizationChoice;
7375
static const AlgorithmParameterName regularizationSolutionSubcase;
@@ -117,15 +119,10 @@ namespace Inverse {
117119
// void update_graph( const AlgorithmInput & input, double lambda, int lambda_index, double epsilon);
118120
static double FindCorner( LCurveInput & Linput, const AlgorithmInput & input, int& lambda_index);
119121
static double LambdaLookup(LCurveInput& input, double lambda, int& lambda_index, const double epsilon);
120-
double computeLcurve( const AlgorithmInput & input ) const;
122+
double computeLcurve( const SCIRun::Core::Algorithms::Inverse::TikhonovImpl * algoImpl, const AlgorithmInput & input ) const;
121123

122124
bool checkInputMatrixSizes( const AlgorithmInput & input ) const;
123125

124-
protected:
125-
// Abstract functions
126-
virtual SCIRun::Core::Datatypes::DenseMatrix computeInverseSolution( double lambda_sq, bool inverseCalculation) const = 0;
127-
128-
// virtual void preAlocateInverseMatrices( const SCIRun::Core::Datatypes::DenseMatrix& forwardMatrix_, const SCIRun::Core::Datatypes::DenseMatrix& measuredData_ , const SCIRun::Core::Datatypes::DenseMatrix& sourceWeighting_, const SCIRun::Core::Datatypes::DenseMatrix& sensorWeighting_) = 0;
129126
};
130127

131128
}}}}

0 commit comments

Comments
 (0)