18#include "TLinearFitter.h"
25 LOGP(info, fmt::runtime(getFormula().c_str()));
30 std::string formula = getFormula();
31 formula.replace(formula.find(
"p"), formula.find(
"]") + 1,
"1");
32 size_t pos = std::string::npos;
33 while ((
pos = formula.find(
"* p")) != std::string::npos) {
34 size_t end_pos = formula.find(
"]",
pos) + 2;
35 formula.erase(
pos, end_pos -
pos);
38 while ((
pos = formula.find(
" + ")) != std::string::npos) {
39 formula.replace(
pos + 1, 1,
"++");
46 std::string formula =
"";
47 const auto terms = getTerms();
48 for (int32_t
i = 0;
i < (int32_t)terms.size() - 1; ++
i) {
49 formula += fmt::format(
"{} + ", terms[
i]);
51 formula += terms.back();
57 std::vector<std::string> terms{
"par[0]"};
59 for (uint32_t deg = 1; deg <= mDegree; ++deg) {
60 const auto strTmp = combination_with_repetiton<std::vector<std::string>>(deg, mDim,
nullptr, indexPar,
nullptr, mInteractionOnly);
61 terms.insert(terms.end(), strTmp.begin(), strTmp.end());
68 const std::string formula = getTLinearFitterFormula();
69 return TLinearFitter(int32_t(mDim), formula.data(),
"");
77 const int32_t nDim =
static_cast<int32_t
>(
x.size() /
y.size());
78 fitter.AssignData(
static_cast<int32_t
>(
y.size()), nDim,
x.data(),
y.data(),
error.empty() ? nullptr :
error.data());
80 const int32_t status = fitter.Eval();
82 LOGP(info,
"Fitting failed with status: {}", status);
83 return std::vector<float>();
87 fitter.GetParameters(
params);
88 std::vector<float> paramsFloat;
89 paramsFloat.reserve(
static_cast<uint32_t
>(
params.GetNrows()));
90 std::copy(
params.GetMatrixArray(),
params.GetMatrixArray() +
params.GetNrows(), std::back_inserter(paramsFloat));
96 TLinearFitter fitter = getTLinearFitter();
97 return fit(fitter,
x,
y, error, clearPoints);
105 uint32_t
pos[FMaxdegree + 1]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
111 for (uint32_t
i = degree;
i > 0; --
i) {
117 for (uint32_t
j =
i;
j <= degree; ++
j) {
128 if (interactionOnly) {
129 bool checkInteraction =
false;
130 for (
size_t i = 1;
i < degree; ++
i) {
131 checkInteraction =
pos[
i] ==
pos[
i + 1];
132 if (checkInteraction) {
136 if (checkInteraction) {
142 if constexpr (std::is_same_v<Type, float>) {
143 float term =
par[indexPar++];
144 for (
size_t i = 1;
i <= degree; ++
i) {
150 for (
size_t i = 1;
i <= degree; ++
i) {
151 term += fmt::format(
"x[{}] * ",
pos[
i]);
153 term += fmt::format(
"par[{}]", indexPar++);
154 val.emplace_back(term);
168 int32_t indexPar = 1;
169 for (uint32_t deg = 1; deg <= degree; ++deg) {
170 val += combination_with_repetiton<float>(deg, dim, par, indexPar,
x, interactionOnly);
GLenum const GLfloat * params
Node par(int index)
Parameters.
TFitResultPtr fit(const size_t nBins, const T *arr, const T xMin, const T xMax, TF1 &func, std::string_view option="")