mirror of
https://github.com/aportelli/LatAnalyze.git
synced 2025-04-10 19:20:44 +01:00
XY*Data: variadic functions for fit
This commit is contained in:
parent
166ed550ae
commit
9a415017c8
@ -203,21 +203,28 @@ XYSampleData::ConstSampleBlock XYSampleData::y(const Index j, const Index k)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fit /////////////////////////////////////////////////////////////////////////
|
// fit /////////////////////////////////////////////////////////////////////////
|
||||||
SampleFitResult XYSampleData::fit(
|
SampleFitResult XYSampleData::fit(Minimizer &minimizer, const DVec &init,
|
||||||
const std::vector<const DoubleModel *> &modelVector,
|
const std::vector<const DoubleModel *> &modelVector)
|
||||||
Minimizer &minimizer, const DVec &init,
|
|
||||||
const FitVerbosity verbosity)
|
|
||||||
{
|
{
|
||||||
const Index nSample = x_.size();
|
const Index nSample = x_.size();
|
||||||
FitResult sampleResult;
|
FitResult sampleResult;
|
||||||
SampleFitResult result;
|
SampleFitResult result;
|
||||||
bool initChi2;
|
bool initChi2;
|
||||||
|
|
||||||
// sample loop
|
|
||||||
result.resize(nSample);
|
result.resize(nSample);
|
||||||
result.chi2_.resize(nSample);
|
result.chi2_.resize(nSample);
|
||||||
FOR_STAT_ARRAY(x_, s)
|
FOR_STAT_ARRAY(x_, s)
|
||||||
{
|
{
|
||||||
|
// reinit chi^2 for central value only
|
||||||
|
if (s == central)
|
||||||
|
{
|
||||||
|
data_.reinitChi2(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data_.reinitChi2(false);
|
||||||
|
}
|
||||||
|
|
||||||
// set data
|
// set data
|
||||||
setDataToSample(s);
|
setDataToSample(s);
|
||||||
|
|
||||||
@ -225,8 +232,7 @@ SampleFitResult XYSampleData::fit(
|
|||||||
initChi2 = (s == central);
|
initChi2 = (s == central);
|
||||||
|
|
||||||
// fit
|
// fit
|
||||||
sampleResult = data_.fit(modelVector, minimizer, init, initChi2,
|
sampleResult = data_.fit(minimizer, init, modelVector);
|
||||||
verbosity);
|
|
||||||
|
|
||||||
// store result
|
// store result
|
||||||
result[s] = sampleResult;
|
result[s] = sampleResult;
|
||||||
@ -243,18 +249,6 @@ SampleFitResult XYSampleData::fit(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleFitResult XYSampleData::fit(const DoubleModel &model,
|
|
||||||
Minimizer &minimizer,
|
|
||||||
const DVec &init,
|
|
||||||
const FitVerbosity verbosity)
|
|
||||||
{
|
|
||||||
vector<const DoubleModel *> modelVector(1);
|
|
||||||
|
|
||||||
modelVector[0] = &model;
|
|
||||||
|
|
||||||
return fit(modelVector, minimizer, init, verbosity);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XYSampleData::setDataToSample(const Index s)
|
void XYSampleData::setDataToSample(const Index s)
|
||||||
{
|
{
|
||||||
// compute covariance matrices if necessary
|
// compute covariance matrices if necessary
|
||||||
|
@ -94,12 +94,11 @@ public:
|
|||||||
SampleBlock y(const Index i, const Index k);
|
SampleBlock y(const Index i, const Index k);
|
||||||
ConstSampleBlock y(const Index i, const Index k) const;
|
ConstSampleBlock y(const Index i, const Index k) const;
|
||||||
// fit
|
// fit
|
||||||
SampleFitResult fit(const std::vector<const DoubleModel *> &modelVector,
|
SampleFitResult fit(Minimizer &minimizer, const DVec &init,
|
||||||
Minimizer &minimizer, const DVec &init,
|
const std::vector<const DoubleModel *> &modelVector);
|
||||||
const FitVerbosity verbosity = FitVerbosity::Silent);
|
template <typename... Mods>
|
||||||
SampleFitResult fit(const DoubleModel &model, Minimizer &minimizer,
|
SampleFitResult fit(Minimizer &minimizer, const DVec &init,
|
||||||
const DVec &init,
|
const DoubleModel &model, const Mods... models);
|
||||||
const FitVerbosity verbosity = FitVerbosity::Silent);
|
|
||||||
private:
|
private:
|
||||||
void setDataToSample(const Index s);
|
void setDataToSample(const Index s);
|
||||||
private:
|
private:
|
||||||
@ -108,6 +107,21 @@ private:
|
|||||||
XYStatData data_;
|
XYStatData data_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* XYSampleData template implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
template <typename... Ts>
|
||||||
|
SampleFitResult XYSampleData::fit(Minimizer &minimizer, const DVec &init,
|
||||||
|
const DoubleModel &model, const Ts... models)
|
||||||
|
{
|
||||||
|
static_assert(static_or<std::is_assignable<DoubleModel &, Ts>::value...>::value,
|
||||||
|
"model arguments are not compatible with DoubleModel &");
|
||||||
|
|
||||||
|
std::vector<const DoubleModel *> modelVector{&model, &models...};
|
||||||
|
|
||||||
|
return fit(minimizer, init, modelVector);
|
||||||
|
}
|
||||||
|
|
||||||
END_NAMESPACE
|
END_NAMESPACE
|
||||||
|
|
||||||
#endif // Latan_XYSampleData_hpp_
|
#endif // Latan_XYSampleData_hpp_
|
||||||
|
@ -84,6 +84,11 @@ void XYStatData::resize(const Index nData, const Index xDim, const Index yDim)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XYStatData::reinitChi2(const bool doReinit)
|
||||||
|
{
|
||||||
|
reinitChi2_ = doReinit;
|
||||||
|
}
|
||||||
|
|
||||||
Block<DMatBase> XYStatData::x(const PlaceHolder ph1 __unused,
|
Block<DMatBase> XYStatData::x(const PlaceHolder ph1 __unused,
|
||||||
const PlaceHolder ph2 __unused)
|
const PlaceHolder ph2 __unused)
|
||||||
{
|
{
|
||||||
@ -205,18 +210,15 @@ ConstBlock<DMatBase> XYStatData::yxVar(const Index j, const Index i) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fit /////////////////////////////////////////////////////////////////////////
|
// fit /////////////////////////////////////////////////////////////////////////
|
||||||
FitResult XYStatData::fit(const vector<const DoubleModel *> &modelVector,
|
FitResult XYStatData::fit(Minimizer &minimizer, const DVec &init,
|
||||||
Minimizer &minimizer, const DVec &init,
|
const vector<const DoubleModel *> &modelVector)
|
||||||
const bool reinitChi2,
|
|
||||||
const FitVerbosity verbosity)
|
|
||||||
{
|
{
|
||||||
// initialization
|
// initialization
|
||||||
chi2_.setModel(modelVector);
|
chi2_.setModel(modelVector);
|
||||||
if (reinitChi2)
|
if (reinitChi2_)
|
||||||
{
|
{
|
||||||
chi2_.requestInit();
|
chi2_.requestInit();
|
||||||
}
|
}
|
||||||
minimizer.setVerbosity(verbosity);
|
|
||||||
|
|
||||||
// initial parameters
|
// initial parameters
|
||||||
const Index nPoint = getNFitPoint();
|
const Index nPoint = getNFitPoint();
|
||||||
@ -251,14 +253,3 @@ FitResult XYStatData::fit(const vector<const DoubleModel *> &modelVector,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
FitResult XYStatData::fit(const DoubleModel &model, Minimizer &minimizer,
|
|
||||||
const DVec &init, const bool reinitChi2,
|
|
||||||
const FitVerbosity verbosity)
|
|
||||||
{
|
|
||||||
vector<const DoubleModel *> modelVector(1);
|
|
||||||
|
|
||||||
modelVector[0] = &model;
|
|
||||||
|
|
||||||
return fit(modelVector, minimizer, init, reinitChi2, verbosity);
|
|
||||||
}
|
|
||||||
|
@ -75,6 +75,7 @@ public:
|
|||||||
// access
|
// access
|
||||||
void resize(const Index nData, const Index xDim,
|
void resize(const Index nData, const Index xDim,
|
||||||
const Index yDim);
|
const Index yDim);
|
||||||
|
void reinitChi2(const bool doReinit = true);
|
||||||
Block<DMatBase> x(const PlaceHolder ph1 = _,
|
Block<DMatBase> x(const PlaceHolder ph1 = _,
|
||||||
const PlaceHolder ph2 = _);
|
const PlaceHolder ph2 = _);
|
||||||
ConstBlock<DMatBase> x(const PlaceHolder ph1 = _,
|
ConstBlock<DMatBase> x(const PlaceHolder ph1 = _,
|
||||||
@ -102,21 +103,36 @@ public:
|
|||||||
Block<DMatBase> yxVar(const Index j, const Index i);
|
Block<DMatBase> yxVar(const Index j, const Index i);
|
||||||
ConstBlock<DMatBase> yxVar(const Index j, const Index i) const;
|
ConstBlock<DMatBase> yxVar(const Index j, const Index i) const;
|
||||||
// fit
|
// fit
|
||||||
FitResult fit(const std::vector<const DoubleModel *> &modelVector,
|
FitResult fit(Minimizer &minimizer, const DVec &init,
|
||||||
Minimizer &minimizer, const DVec &init,
|
const std::vector<const DoubleModel *> &modelVector);
|
||||||
const bool reinitChi2 = true,
|
template <typename... Ts>
|
||||||
const FitVerbosity verbosity = FitVerbosity::Silent);
|
FitResult fit(Minimizer &minimizer, const DVec &init,
|
||||||
FitResult fit(const DoubleModel &model, Minimizer &minimizer,
|
const DoubleModel &model, const Ts... models);
|
||||||
const DVec &init, const bool reinitChi2 = true,
|
|
||||||
const FitVerbosity verbosity = FitVerbosity::Silent);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DMat x_, y_;
|
DMat x_, y_;
|
||||||
Mat<DMat> var_[3];
|
Mat<DMat> var_[3];
|
||||||
IVec isXExact_, isFitPoint_;
|
IVec isXExact_, isFitPoint_;
|
||||||
Chi2Function chi2_;
|
Chi2Function chi2_;
|
||||||
|
bool reinitChi2_{true};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* XYStatData template implementation *
|
||||||
|
******************************************************************************/
|
||||||
|
template <typename... Ts>
|
||||||
|
FitResult XYStatData::fit(Minimizer &minimizer, const DVec &init,
|
||||||
|
const DoubleModel &model, const Ts... models)
|
||||||
|
{
|
||||||
|
static_assert(static_or<std::is_assignable<DoubleModel &, Ts>::value...>::value,
|
||||||
|
"model arguments are not compatible with DoubleModel &");
|
||||||
|
|
||||||
|
std::vector<const DoubleModel *> modelVector{&model, &models...};
|
||||||
|
|
||||||
|
return fit(minimizer, init, modelVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
END_NAMESPACE
|
END_NAMESPACE
|
||||||
|
|
||||||
#endif // Latan_XYData_hpp_
|
#endif // Latan_XYData_hpp_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user