From 63636f6aeb39cfca7d99850b5b8f56802de563fa Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Fri, 22 Mar 2024 17:55:21 +0100 Subject: [PATCH] [Minuit2] Use `std::span` instead of `std::vector const&` for parameters Use `std::span` instead of `std::vector const&` for function parameters in Minuit2. The motivation is that `std::span` is more general. If the function takes a `std::vector const&`, the inputs are forced to be allocated on the heap. So if one wants to call functions with constant size or even scalar input, that would cause a large overhead. This overhead can be avoided when generalizing with `std::span`. The standalone Minuit2 build files were also changed to consider the `std::span` backport to C++17 that is already in ROOT. --- math/mathcore/inc/Math/Minimizer.h | 4 +- math/mathcore/src/Fitter.cxx | 2 +- math/minuit2/StandAlone.cmake | 10 +++ math/minuit2/inc/Minuit2/ContoursError.h | 6 +- math/minuit2/inc/Minuit2/FCNAdapter.h | 4 +- math/minuit2/inc/Minuit2/FCNBase.h | 8 +- math/minuit2/inc/Minuit2/FCNGradAdapter.h | 14 ++-- math/minuit2/inc/Minuit2/FCNGradientBase.h | 8 +- math/minuit2/inc/Minuit2/FumiliChi2FCN.h | 4 +- math/minuit2/inc/Minuit2/FumiliFCNAdapter.h | 8 +- math/minuit2/inc/Minuit2/FumiliFCNBase.h | 6 +- .../inc/Minuit2/FumiliMaximumLikelihoodFCN.h | 4 +- .../inc/Minuit2/FumiliStandardChi2FCN.h | 21 ++--- .../FumiliStandardMaximumLikelihoodFCN.h | 10 +-- math/minuit2/inc/Minuit2/FunctionMinimizer.h | 17 ++-- math/minuit2/inc/Minuit2/FunctionMinimum.h | 4 +- math/minuit2/inc/Minuit2/GenericFunction.h | 4 +- math/minuit2/inc/Minuit2/Minuit2Minimizer.h | 2 +- math/minuit2/inc/Minuit2/MnFumiliMinimize.h | 8 +- math/minuit2/inc/Minuit2/MnFunctionCross.h | 5 +- math/minuit2/inc/Minuit2/MnHesse.h | 10 ++- math/minuit2/inc/Minuit2/MnMigrad.h | 14 ++-- math/minuit2/inc/Minuit2/MnMinimize.h | 14 ++-- math/minuit2/inc/Minuit2/MnPlot.h | 7 +- math/minuit2/inc/Minuit2/MnScan.h | 6 +- math/minuit2/inc/Minuit2/MnSimplex.h | 6 +- math/minuit2/inc/Minuit2/MnUserCovariance.h | 5 +- .../inc/Minuit2/MnUserParameterState.h | 8 +- math/minuit2/inc/Minuit2/MnUserParameters.h | 2 +- .../inc/Minuit2/MnUserTransformation.h | 4 +- .../inc/Minuit2/ModularFunctionMinimizer.h | 12 +-- .../Minuit2/Numerical2PGradientCalculator.h | 4 +- math/minuit2/inc/Minuit2/NumericalDerivator.h | 19 +++-- math/minuit2/inc/Minuit2/ParametricFunction.h | 12 +-- math/minuit2/inc/Minuit2/SimplexParameters.h | 6 +- math/minuit2/src/FumiliStandardChi2FCN.cxx | 4 +- .../FumiliStandardMaximumLikelihoodFCN.cxx | 4 +- math/minuit2/src/Minuit2Minimizer.cxx | 8 +- math/minuit2/src/MnFunctionCross.cxx | 4 +- math/minuit2/src/MnHesse.cxx | 10 +-- math/minuit2/src/MnPlot.cxx | 4 +- math/minuit2/src/MnUserParameterState.cxx | 79 +++++++++---------- math/minuit2/src/MnUserParameters.cxx | 2 +- math/minuit2/src/MnUserTransformation.cxx | 7 +- math/minuit2/src/ModularFunctionMinimizer.cxx | 16 ++-- .../src/Numerical2PGradientCalculator.cxx | 2 +- math/minuit2/src/NumericalDerivator.cxx | 14 ++-- math/minuit2/src/ParametricFunction.cxx | 2 +- math/minuit2/src/SimplexBuilder.cxx | 8 +- math/minuit2/test/MnSim/GaussFcn.cxx | 2 +- math/minuit2/test/MnSim/GaussFcn.h | 9 ++- math/minuit2/test/MnSim/GaussFcn2.cxx | 2 +- math/minuit2/test/MnSim/GaussFcn2.h | 9 ++- .../test/MnSim/GaussianModelFunction.h | 10 +-- math/minuit2/test/MnSim/ParallelTest.cxx | 4 +- math/minuit2/test/MnSim/PaulTest4.cxx | 14 ++-- math/minuit2/test/MnSim/ReneTest.cxx | 8 +- math/minuit2/test/MnTutorial/Quad12F.h | 2 +- math/minuit2/test/MnTutorial/Quad1F.h | 4 +- math/minuit2/test/MnTutorial/Quad4F.h | 6 +- math/minuit2/test/MnTutorial/Quad8F.h | 2 +- math/minuit2/test/testADMinim.cxx | 4 +- math/minuit2/test/testMinimizer.cxx | 2 +- 63 files changed, 287 insertions(+), 233 deletions(-) diff --git a/math/mathcore/inc/Math/Minimizer.h b/math/mathcore/inc/Math/Minimizer.h index 5b54df7b211ab..8aec23e982130 100644 --- a/math/mathcore/inc/Math/Minimizer.h +++ b/math/mathcore/inc/Math/Minimizer.h @@ -16,6 +16,8 @@ #include "Math/IFunction.h" #include "Math/MinimizerOptions.h" +#include + #include #include #include @@ -159,7 +161,7 @@ class Minimizer { virtual void SetFunction(const ROOT::Math::IMultiGenFunction & func) = 0; /// set the function implementing Hessian computation (re-implemented by Minimizer using it) - virtual void SetHessianFunction(std::function &, double *)> ) {} + virtual void SetHessianFunction(std::function, double *)> ) {} /// add variables . Return number of variables successfully added template diff --git a/math/mathcore/src/Fitter.cxx b/math/mathcore/src/Fitter.cxx index c6a1b16d27b42..546667fe37028 100644 --- a/math/mathcore/src/Fitter.cxx +++ b/math/mathcore/src/Fitter.cxx @@ -726,7 +726,7 @@ bool Fitter::DoInitMinimizer() { const ROOT::Math::FitMethodGradFunction *fitGradFcn = dynamic_cast(gradfcn); if (fitGradFcn && fitGradFcn->HasHessian()) { - auto hessFcn = [=](const std::vector &x, double *hess) { + auto hessFcn = [=](std::span x, double *hess) { unsigned int ndim = x.size(); unsigned int nh = ndim * (ndim + 1) / 2; std::vector h(nh); diff --git a/math/minuit2/StandAlone.cmake b/math/minuit2/StandAlone.cmake index c8a81b6ec5d87..7f3282f649af6 100644 --- a/math/minuit2/StandAlone.cmake +++ b/math/minuit2/StandAlone.cmake @@ -39,6 +39,16 @@ endfunction() # This file adds copy_standalone include(copy_standalone.cmake) +# We need the std::span backport. This can be removed once the minimum C++ +# standard gets raised to C++20, which should happen if also the minimum C++ +# standard of ROOT gets raised and the std::span backport in RSpan is removed. +include_directories(../../core/foundation/inc/) +set(SPAN_HEADERS RSpan.hxx span.hxx) +copy_standalone(SOURCE ../../core/foundation/inc/ROOT DESTINATION . OUTPUT SPAN_HEADERS + FILES ${SPAN_HEADERS}) +install(FILES ${SPAN_HEADERS} DESTINATION include/ROOT) + + # Copy these files in if needed copy_standalone(SOURCE ../../core/foundation/inc/ROOT DESTINATION . OUTPUT VERSION_FILE FILES RVersion.hxx) diff --git a/math/minuit2/inc/Minuit2/ContoursError.h b/math/minuit2/inc/Minuit2/ContoursError.h index 6a6e9cd7a0eb4..2fe2fbcacc34b 100644 --- a/math/minuit2/inc/Minuit2/ContoursError.h +++ b/math/minuit2/inc/Minuit2/ContoursError.h @@ -13,6 +13,8 @@ #include "Minuit2/MnConfig.h" #include "Minuit2/MinosError.h" +#include + #include #include @@ -23,9 +25,9 @@ namespace Minuit2 { class ContoursError { public: - ContoursError(unsigned int parX, unsigned int parY, const std::vector> &points, + ContoursError(unsigned int parX, unsigned int parY, std::span> points, const MinosError &xmnos, const MinosError &ymnos, unsigned int nfcn) - : fParX(parX), fParY(parY), fPoints(points), fXMinos(xmnos), fYMinos(ymnos), fNFcn(nfcn) + : fParX(parX), fParY(parY), fPoints(points.begin(), points.end()), fXMinos(xmnos), fYMinos(ymnos), fNFcn(nfcn) { } diff --git a/math/minuit2/inc/Minuit2/FCNAdapter.h b/math/minuit2/inc/Minuit2/FCNAdapter.h index e47308482c853..3e5e5a16a3ce7 100644 --- a/math/minuit2/inc/Minuit2/FCNAdapter.h +++ b/math/minuit2/inc/Minuit2/FCNAdapter.h @@ -12,6 +12,8 @@ #include "Minuit2/FCNBase.h" +#include + #include namespace ROOT { @@ -37,7 +39,7 @@ class FCNAdapter : public FCNBase { ~FCNAdapter() override {} - double operator()(const std::vector &v) const override { return fFunc.operator()(&v[0]); } + double operator()(std::span v) const override { return fFunc.operator()(&v[0]); } double operator()(const double *v) const { return fFunc.operator()(v); } double Up() const override { return fUp; } diff --git a/math/minuit2/inc/Minuit2/FCNBase.h b/math/minuit2/inc/Minuit2/FCNBase.h index e204b84111c9b..e825bad79caf5 100644 --- a/math/minuit2/inc/Minuit2/FCNBase.h +++ b/math/minuit2/inc/Minuit2/FCNBase.h @@ -12,10 +12,12 @@ #include "Minuit2/MnConfig.h" -#include - #include "Minuit2/GenericFunction.h" +#include + +#include + namespace ROOT { namespace Minuit2 { @@ -69,7 +71,7 @@ class FCNBase : public GenericFunction { */ - double operator()(const std::vector &v) const override = 0; + double operator()(std::span v) const override = 0; /** diff --git a/math/minuit2/inc/Minuit2/FCNGradAdapter.h b/math/minuit2/inc/Minuit2/FCNGradAdapter.h index fe897c22fbd89..8e8bcbb885830 100644 --- a/math/minuit2/inc/Minuit2/FCNGradAdapter.h +++ b/math/minuit2/inc/Minuit2/FCNGradAdapter.h @@ -39,17 +39,17 @@ class FCNGradAdapter : public FCNGradientBase { ~FCNGradAdapter() override {} - double operator()(const std::vector &v) const override { return fFunc.operator()(&v[0]); } + double operator()(std::span v) const override { return fFunc.operator()(&v[0]); } double operator()(const double *v) const { return fFunc.operator()(v); } double Up() const override { return fUp; } - std::vector Gradient(const std::vector &v) const override + std::vector Gradient(std::span v) const override { fFunc.Gradient(&v[0], &fGrad[0]); return fGrad; } - std::vector GradientWithPrevResult(const std::vector &v, double *previous_grad, double *previous_g2, + std::vector GradientWithPrevResult(std::span v, double *previous_grad, double *previous_g2, double *previous_gstep) const override { fFunc.GradientWithPrevResult(&v[0], &fGrad[0], previous_grad, previous_g2, previous_gstep); @@ -68,7 +68,7 @@ class FCNGradAdapter : public FCNGradientBase { } /// return second derivatives (diagonal of the Hessian matrix) - std::vector G2(const std::vector & x) const override { + std::vector G2(std::span x) const override { if (fG2Func) return fG2Func(x); if (fHessianFunc) { @@ -89,7 +89,7 @@ class FCNGradAdapter : public FCNGradientBase { } /// compute Hessian. Return Hessian as a std::vector of size(n*n) - std::vector Hessian(const std::vector & x ) const override { + std::vector Hessian(std::span x ) const override { unsigned int n = fFunc.NDim(); if (fHessianFunc) { if (fHessian.empty() ) fHessian.resize(n * n); @@ -127,8 +127,8 @@ class FCNGradAdapter : public FCNGradientBase { mutable std::vector fHessian; mutable std::vector fG2Vec; - std::function(const std::vector &)> fG2Func; - mutable std::function &, double *)> fHessianFunc; + std::function(std::span )> fG2Func; + mutable std::function , double *)> fHessianFunc; }; } // end namespace Minuit2 diff --git a/math/minuit2/inc/Minuit2/FCNGradientBase.h b/math/minuit2/inc/Minuit2/FCNGradientBase.h index a92cb9a7d30f3..92567d9f6b57e 100644 --- a/math/minuit2/inc/Minuit2/FCNGradientBase.h +++ b/math/minuit2/inc/Minuit2/FCNGradientBase.h @@ -40,8 +40,8 @@ class FCNGradientBase : public FCNBase { public: ~FCNGradientBase() override {} - virtual std::vector Gradient(const std::vector &) const = 0; - virtual std::vector GradientWithPrevResult(const std::vector ¶meters, double * /*previous_grad*/, + virtual std::vector Gradient(std::span ) const = 0; + virtual std::vector GradientWithPrevResult(std::span parameters, double * /*previous_grad*/, double * /*previous_g2*/, double * /*previous_gstep*/) const { return Gradient(parameters); @@ -54,10 +54,10 @@ class FCNGradientBase : public FCNBase { }; /// return second derivatives (diagonal of the Hessian matrix) - virtual std::vector G2(const std::vector &) const { return std::vector();} + virtual std::vector G2(std::span ) const { return std::vector();} /// return Hessian - virtual std::vector Hessian(const std::vector &) const { return std::vector();} + virtual std::vector Hessian(std::span ) const { return std::vector();} virtual bool HasHessian() const { return false; } diff --git a/math/minuit2/inc/Minuit2/FumiliChi2FCN.h b/math/minuit2/inc/Minuit2/FumiliChi2FCN.h index 6e2a48437ca20..5126312da537a 100644 --- a/math/minuit2/inc/Minuit2/FumiliChi2FCN.h +++ b/math/minuit2/inc/Minuit2/FumiliChi2FCN.h @@ -87,7 +87,7 @@ class FumiliChi2FCN : public FumiliFCNBase { */ - virtual std::vector Elements(const std::vector &par) const = 0; + virtual std::vector Elements(std::span par) const = 0; /** @@ -129,7 +129,7 @@ class FumiliChi2FCN : public FumiliFCNBase { */ - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double chiSquare = 0.0; diff --git a/math/minuit2/inc/Minuit2/FumiliFCNAdapter.h b/math/minuit2/inc/Minuit2/FumiliFCNAdapter.h index 1f5700d31283b..56770149b9e44 100644 --- a/math/minuit2/inc/Minuit2/FumiliFCNAdapter.h +++ b/math/minuit2/inc/Minuit2/FumiliFCNAdapter.h @@ -50,13 +50,13 @@ class FumiliFCNAdapter : public FumiliFCNBase { ~FumiliFCNAdapter() override {} - double operator()(const std::vector &v) const override { return fFunc.operator()(&v[0]); } + double operator()(std::span v) const override { return fFunc.operator()(&v[0]); } double operator()(const double *v) const { return fFunc.operator()(v); } double Up() const override { return fUp; } void SetErrorDef(double up) override { fUp = up; } - // virtual std::vector Gradient(const std::vector&) const; + // virtual std::vector Gradient(std::span ) const; // forward interface // virtual double operator()(int npar, double* params,int iflag = 4) const; @@ -64,7 +64,7 @@ class FumiliFCNAdapter : public FumiliFCNBase { /** evaluate gradient hessian and function value needed by fumili */ - void EvaluateAll(const std::vector &v) override; + void EvaluateAll(std::span v) override; private: // data member @@ -74,7 +74,7 @@ class FumiliFCNAdapter : public FumiliFCNBase { }; template -void FumiliFCNAdapter::EvaluateAll(const std::vector &v) +void FumiliFCNAdapter::EvaluateAll(std::span v) { MnPrint print("FumiliFCNAdapter"); diff --git a/math/minuit2/inc/Minuit2/FumiliFCNBase.h b/math/minuit2/inc/Minuit2/FumiliFCNBase.h index a00c71621499f..7a1c7cd8e47cf 100644 --- a/math/minuit2/inc/Minuit2/FumiliFCNBase.h +++ b/math/minuit2/inc/Minuit2/FumiliFCNBase.h @@ -82,7 +82,7 @@ class FumiliFCNBase : public FCNGradientBase { **/ - virtual void EvaluateAll(const std::vector &par) = 0; + virtual void EvaluateAll(std::span par) = 0; /** Return cached Value of objective function estimated previously using the FumiliFCNBase::EvaluateAll method @@ -96,7 +96,7 @@ class FumiliFCNBase : public FCNGradientBase { **/ virtual const std::vector &Gradient() const { return fGradient; } - std::vector Gradient(const std::vector &) const override { return fGradient;} + std::vector Gradient(std::span) const override { return fGradient;} /** Return Value of the i-th j-th element of the Hessian matrix estimated previously using the @@ -105,7 +105,7 @@ class FumiliFCNBase : public FCNGradientBase { @param col col Index of the matrix **/ - std::vector Hessian(const std::vector &) const override { return fHessian;} + std::vector Hessian(std::span) const override { return fHessian;} virtual double Hessian(unsigned int row, unsigned int col) const { assert(row < fGradient.size() && col < fGradient.size()); diff --git a/math/minuit2/inc/Minuit2/FumiliMaximumLikelihoodFCN.h b/math/minuit2/inc/Minuit2/FumiliMaximumLikelihoodFCN.h index f293cc88d759b..59669e7d5d29b 100644 --- a/math/minuit2/inc/Minuit2/FumiliMaximumLikelihoodFCN.h +++ b/math/minuit2/inc/Minuit2/FumiliMaximumLikelihoodFCN.h @@ -84,7 +84,7 @@ class FumiliMaximumLikelihoodFCN : public FumiliFCNBase { */ - virtual std::vector Elements(const std::vector &par) const = 0; + virtual std::vector Elements(std::span par) const = 0; /** @@ -126,7 +126,7 @@ class FumiliMaximumLikelihoodFCN : public FumiliFCNBase { */ - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double sumoflogs = 0.0; diff --git a/math/minuit2/inc/Minuit2/FumiliStandardChi2FCN.h b/math/minuit2/inc/Minuit2/FumiliStandardChi2FCN.h index a115a25fdd00f..39873f28beb49 100644 --- a/math/minuit2/inc/Minuit2/FumiliStandardChi2FCN.h +++ b/math/minuit2/inc/Minuit2/FumiliStandardChi2FCN.h @@ -12,6 +12,9 @@ #include "Minuit2/FumiliChi2FCN.h" #include "Minuit2/ParametricFunction.h" + +#include + #include #include #include @@ -57,14 +60,14 @@ class FumiliStandardChi2FCN : public FumiliChi2FCN { */ - FumiliStandardChi2FCN(const ParametricFunction &modelFCN, const std::vector &meas, - const std::vector &pos, const std::vector &mvar) + FumiliStandardChi2FCN(const ParametricFunction &modelFCN, std::span meas, + std::span pos, std::span mvar) { // this->fModelFCN = &modelFunction; this->SetModelFunction(modelFCN); assert(meas.size() == pos.size()); assert(meas.size() == mvar.size()); - fMeasurements = meas; + fMeasurements.assign(meas.begin(), meas.end()); std::vector x(1); unsigned int n = mvar.size(); fPositions.reserve(n); @@ -98,15 +101,15 @@ class FumiliStandardChi2FCN : public FumiliChi2FCN { */ - FumiliStandardChi2FCN(const ParametricFunction &modelFCN, const std::vector &meas, - const std::vector> &pos, const std::vector &mvar) + FumiliStandardChi2FCN(const ParametricFunction &modelFCN, std::span meas, + std::span> pos, std::span mvar) { // this->fModelFCN = &modelFunction; this->SetModelFunction(modelFCN); assert(meas.size() == pos.size()); assert(meas.size() == mvar.size()); - fMeasurements = meas; - fPositions = pos; + fMeasurements.assign(meas.begin(), meas.end()); + fPositions.assign(pos.begin(), pos.end()); // correct for variance == 0 unsigned int n = mvar.size(); fInvErrors.resize(n); @@ -138,7 +141,7 @@ class FumiliStandardChi2FCN : public FumiliChi2FCN { */ - std::vector Elements(const std::vector &par) const override; + std::vector Elements(std::span par) const override; /** @@ -173,7 +176,7 @@ class FumiliStandardChi2FCN : public FumiliChi2FCN { **/ - void EvaluateAll(const std::vector &par) override; + void EvaluateAll(std::span par) override; private: std::vector fMeasurements; diff --git a/math/minuit2/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h b/math/minuit2/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h index 4149433b88074..48f30aef9d569 100644 --- a/math/minuit2/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h +++ b/math/minuit2/inc/Minuit2/FumiliStandardMaximumLikelihoodFCN.h @@ -45,7 +45,7 @@ class FumiliStandardMaximumLikelihoodFCN : public FumiliMaximumLikelihoodFCN { */ - FumiliStandardMaximumLikelihoodFCN(const ParametricFunction &modelFCN, const std::vector &pos) + FumiliStandardMaximumLikelihoodFCN(const ParametricFunction &modelFCN, std::span pos) { this->SetModelFunction(modelFCN); unsigned int n = pos.size(); @@ -68,10 +68,10 @@ class FumiliStandardMaximumLikelihoodFCN : public FumiliMaximumLikelihoodFCN { */ - FumiliStandardMaximumLikelihoodFCN(const ParametricFunction &modelFCN, const std::vector> &pos) + FumiliStandardMaximumLikelihoodFCN(const ParametricFunction &modelFCN, std::span> pos) { this->SetModelFunction(modelFCN); - fPositions = pos; + fPositions.assign(pos.begin(), pos.end()); } ~FumiliStandardMaximumLikelihoodFCN() override {} @@ -88,7 +88,7 @@ class FumiliStandardMaximumLikelihoodFCN : public FumiliMaximumLikelihoodFCN { */ - std::vector Elements(const std::vector &par) const override; + std::vector Elements(std::span par) const override; /** @@ -123,7 +123,7 @@ class FumiliStandardMaximumLikelihoodFCN : public FumiliMaximumLikelihoodFCN { **/ - void EvaluateAll(const std::vector &par) override; + void EvaluateAll(std::span par) override; private: std::vector> fPositions; diff --git a/math/minuit2/inc/Minuit2/FunctionMinimizer.h b/math/minuit2/inc/Minuit2/FunctionMinimizer.h index 8c3d430cccc7d..61a47c1f6d201 100644 --- a/math/minuit2/inc/Minuit2/FunctionMinimizer.h +++ b/math/minuit2/inc/Minuit2/FunctionMinimizer.h @@ -11,6 +11,9 @@ #define ROOT_Minuit2_FunctionMinimizer #include "Minuit2/MnConfig.h" + +#include + #include namespace ROOT { @@ -37,22 +40,22 @@ class FunctionMinimizer { virtual ~FunctionMinimizer() {} // starting values for parameters and errors - virtual FunctionMinimum Minimize(const FCNBase &, const std::vector &par, const std::vector &err, + virtual FunctionMinimum Minimize(const FCNBase &, std::span par, std::span err, unsigned int strategy, unsigned int maxfcn, double toler) const = 0; // starting values for parameters and errors and FCN with Gradient - virtual FunctionMinimum Minimize(const FCNGradientBase &, const std::vector &par, - const std::vector &err, unsigned int strategy, unsigned int maxfcn, + virtual FunctionMinimum Minimize(const FCNGradientBase &, std::span par, + std::span err, unsigned int strategy, unsigned int maxfcn, double toler) const = 0; // starting values for parameters and covariance matrix - virtual FunctionMinimum Minimize(const FCNBase &, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int strategy, unsigned int maxfcn, + virtual FunctionMinimum Minimize(const FCNBase &, std::span par, unsigned int nrow, + std::span cov, unsigned int strategy, unsigned int maxfcn, double toler) const = 0; // starting values for parameters and covariance matrix and FCN with Gradient - virtual FunctionMinimum Minimize(const FCNGradientBase &, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int strategy, unsigned int maxfcn, + virtual FunctionMinimum Minimize(const FCNGradientBase &, std::span par, unsigned int nrow, + std::span cov, unsigned int strategy, unsigned int maxfcn, double toler) const = 0; }; diff --git a/math/minuit2/inc/Minuit2/FunctionMinimum.h b/math/minuit2/inc/Minuit2/FunctionMinimum.h index ab0fe8d5fffe8..6b03cead4ba3d 100644 --- a/math/minuit2/inc/Minuit2/FunctionMinimum.h +++ b/math/minuit2/inc/Minuit2/FunctionMinimum.h @@ -54,8 +54,8 @@ class FunctionMinimum { } /// Constructor at the end of a minimization from seed and vector of states - FunctionMinimum(const MinimumSeed &seed, const std::vector &states, double up, Status status = MnValid) - : fPtr{new Data{seed, states, up, status == MnAboveMaxEdm, status == MnReachedCallLimit, {}}} + FunctionMinimum(const MinimumSeed &seed, std::span states, double up, Status status = MnValid) + : fPtr{new Data{seed, {states.begin(), states.end()}, up, status == MnAboveMaxEdm, status == MnReachedCallLimit, {}}} { } diff --git a/math/minuit2/inc/Minuit2/GenericFunction.h b/math/minuit2/inc/Minuit2/GenericFunction.h index d7c0e751f96fb..cc7959ae3d717 100644 --- a/math/minuit2/inc/Minuit2/GenericFunction.h +++ b/math/minuit2/inc/Minuit2/GenericFunction.h @@ -12,6 +12,8 @@ #include "Minuit2/MnConfig.h" +#include + #include namespace ROOT { @@ -47,7 +49,7 @@ class GenericFunction { */ - virtual double operator()(const std::vector &x) const = 0; + virtual double operator()(std::span x) const = 0; }; } // namespace Minuit2 diff --git a/math/minuit2/inc/Minuit2/Minuit2Minimizer.h b/math/minuit2/inc/Minuit2/Minuit2Minimizer.h index a6ef01525dddf..ba660e3b18747 100644 --- a/math/minuit2/inc/Minuit2/Minuit2Minimizer.h +++ b/math/minuit2/inc/Minuit2/Minuit2Minimizer.h @@ -90,7 +90,7 @@ class Minuit2Minimizer : public ROOT::Math::Minimizer { void SetFunction(const ROOT::Math::IMultiGenFunction &func) override; /// set the function implementing Hessian computation - void SetHessianFunction(std::function &, double *)> hfunc) override; + void SetHessianFunction(std::function, double *)> hfunc) override; /// set free variable bool SetVariable(unsigned int ivar, const std::string &name, double val, double step) override; diff --git a/math/minuit2/inc/Minuit2/MnFumiliMinimize.h b/math/minuit2/inc/Minuit2/MnFumiliMinimize.h index 25212ccb3600f..9de26c16574b3 100644 --- a/math/minuit2/inc/Minuit2/MnFumiliMinimize.h +++ b/math/minuit2/inc/Minuit2/MnFumiliMinimize.h @@ -39,22 +39,22 @@ class MnFumiliMinimize : public MnApplication { public: /// construct from FumiliFCNBase + std::vector for parameters and errors - MnFumiliMinimize(const FumiliFCNBase &fcn, const std::vector &par, const std::vector &err, + MnFumiliMinimize(const FumiliFCNBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) { } /// construct from FumiliFCNBase + std::vector for parameters and covariance - MnFumiliMinimize(const FumiliFCNBase &fcn, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int stra = 1) + MnFumiliMinimize(const FumiliFCNBase &fcn, std::span par, unsigned int nrow, + std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) { } /// construct from FumiliFCNBase + std::vector for parameters and MnUserCovariance - MnFumiliMinimize(const FumiliFCNBase &fcn, const std::vector &par, const MnUserCovariance &cov, + MnFumiliMinimize(const FumiliFCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(FumiliMinimizer()), fFCN(fcn) { diff --git a/math/minuit2/inc/Minuit2/MnFunctionCross.h b/math/minuit2/inc/Minuit2/MnFunctionCross.h index 11a677460b143..7655e66008938 100644 --- a/math/minuit2/inc/Minuit2/MnFunctionCross.h +++ b/math/minuit2/inc/Minuit2/MnFunctionCross.h @@ -11,6 +11,9 @@ #define ROOT_Minuit2_MnFunctionCross #include "Minuit2/MnConfig.h" + +#include + #include namespace ROOT { @@ -36,7 +39,7 @@ class MnFunctionCross { ~MnFunctionCross() {} - MnCross operator()(const std::vector &, const std::vector &, const std::vector &, + MnCross operator()(std::span , std::span, std::span, double, unsigned int) const; private: diff --git a/math/minuit2/inc/Minuit2/MnHesse.h b/math/minuit2/inc/Minuit2/MnHesse.h index 058a89429d94e..e633aafa6d16a 100644 --- a/math/minuit2/inc/Minuit2/MnHesse.h +++ b/math/minuit2/inc/Minuit2/MnHesse.h @@ -13,6 +13,8 @@ #include "Minuit2/MnConfig.h" #include "Minuit2/MnStrategy.h" +#include + #include namespace ROOT { @@ -55,14 +57,14 @@ class MnHesse { /// low-level API /// /// FCN + parameters + errors - MnUserParameterState operator()(const FCNBase &, const std::vector &, const std::vector &, + MnUserParameterState operator()(const FCNBase &, std::span, std::span, unsigned int maxcalls = 0) const; /// FCN + parameters + covariance - MnUserParameterState operator()(const FCNBase &, const std::vector &, unsigned int nrow, - const std::vector &, unsigned int maxcalls = 0) const; + MnUserParameterState operator()(const FCNBase &, std::span, unsigned int nrow, + std::span, unsigned int maxcalls = 0) const; /// FCN + parameters + MnUserCovariance MnUserParameterState - operator()(const FCNBase &, const std::vector &, const MnUserCovariance &, unsigned int maxcalls = 0) const; + operator()(const FCNBase &, std::span, const MnUserCovariance &, unsigned int maxcalls = 0) const; /// /// high-level API /// diff --git a/math/minuit2/inc/Minuit2/MnMigrad.h b/math/minuit2/inc/Minuit2/MnMigrad.h index ab1c2d831d698..e1db22a90b405 100644 --- a/math/minuit2/inc/Minuit2/MnMigrad.h +++ b/math/minuit2/inc/Minuit2/MnMigrad.h @@ -33,13 +33,13 @@ class MnMigrad : public MnApplication { public: /// construct from FCNBase + std::vector for parameters and errors - MnMigrad(const FCNBase &fcn, const std::vector &par, const std::vector &err, unsigned int stra = 1) + MnMigrad(const FCNBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) { } /// construct from FCNBase + std::vector for parameters and covariance - MnMigrad(const FCNBase &fcn, const std::vector &par, unsigned int nrow, const std::vector &cov, + MnMigrad(const FCNBase &fcn, std::span par, unsigned int nrow, std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) @@ -47,7 +47,7 @@ class MnMigrad : public MnApplication { } /// construct from FCNBase + std::vector for parameters and MnUserCovariance - MnMigrad(const FCNBase &fcn, const std::vector &par, const MnUserCovariance &cov, unsigned int stra = 1) + MnMigrad(const FCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) { } @@ -73,22 +73,22 @@ class MnMigrad : public MnApplication { // constructs from gradient FCN /// construct from FCNGradientBase + std::vector for parameters and errors - MnMigrad(const FCNGradientBase &fcn, const std::vector &par, const std::vector &err, + MnMigrad(const FCNGradientBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) { } /// construct from FCNGradientBase + std::vector for parameters and covariance - MnMigrad(const FCNGradientBase &fcn, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int stra = 1) + MnMigrad(const FCNGradientBase &fcn, std::span par, unsigned int nrow, + std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) { } /// construct from FCNGradientBase + std::vector for parameters and MnUserCovariance - MnMigrad(const FCNGradientBase &fcn, const std::vector &par, const MnUserCovariance &cov, + MnMigrad(const FCNGradientBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(VariableMetricMinimizer()) { diff --git a/math/minuit2/inc/Minuit2/MnMinimize.h b/math/minuit2/inc/Minuit2/MnMinimize.h index e86fcdc619d68..ab8f73537190c 100644 --- a/math/minuit2/inc/Minuit2/MnMinimize.h +++ b/math/minuit2/inc/Minuit2/MnMinimize.h @@ -31,20 +31,20 @@ class MnMinimize : public MnApplication { public: /// construct from FCNBase + std::vector for parameters and errors - MnMinimize(const FCNBase &fcn, const std::vector &par, const std::vector &err, unsigned int stra = 1) + MnMinimize(const FCNBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { } /// construct from FCNBase + std::vector for parameters and covariance - MnMinimize(const FCNBase &fcn, const std::vector &par, unsigned int nrow, const std::vector &cov, + MnMinimize(const FCNBase &fcn, std::span par, unsigned int nrow, std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { } /// construct from FCNBase + std::vector for parameters and MnUserCovariance - MnMinimize(const FCNBase &fcn, const std::vector &par, const MnUserCovariance &cov, unsigned int stra = 1) + MnMinimize(const FCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { } @@ -70,21 +70,21 @@ class MnMinimize : public MnApplication { // interfaces using FCNGradientBase /// construct from FCNGradientBase + std::vector for parameters and errors - MnMinimize(const FCNGradientBase &fcn, const std::vector &par, const std::vector &err, + MnMinimize(const FCNGradientBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { } /// construct from FCNGradientBase + std::vector for parameters and covariance - MnMinimize(const FCNGradientBase &fcn, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int stra = 1) + MnMinimize(const FCNGradientBase &fcn, std::span par, unsigned int nrow, + std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { } /// construct from FCNGradientBase + std::vector for parameters and MnUserCovariance - MnMinimize(const FCNGradientBase &fcn, const std::vector &par, const MnUserCovariance &cov, + MnMinimize(const FCNGradientBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(CombinedMinimizer()) { diff --git a/math/minuit2/inc/Minuit2/MnPlot.h b/math/minuit2/inc/Minuit2/MnPlot.h index a6b51aace5549..28fa9c2b69a08 100644 --- a/math/minuit2/inc/Minuit2/MnPlot.h +++ b/math/minuit2/inc/Minuit2/MnPlot.h @@ -11,6 +11,9 @@ #define ROOT_Minuit2_MnPlot #include "Minuit2/MnConfig.h" + +#include + #include #include @@ -37,8 +40,8 @@ class MnPlot { ~MnPlot() {} - void operator()(const std::vector> &) const; - void operator()(double, double, const std::vector> &) const; + void operator()(std::span> ) const; + void operator()(double, double, std::span> ) const; unsigned int Width() const { return fPageWidth; } unsigned int Length() const { return fPageLength; } diff --git a/math/minuit2/inc/Minuit2/MnScan.h b/math/minuit2/inc/Minuit2/MnScan.h index a91016affafa1..b8985a4ddc19a 100644 --- a/math/minuit2/inc/Minuit2/MnScan.h +++ b/math/minuit2/inc/Minuit2/MnScan.h @@ -34,20 +34,20 @@ class MnScan : public MnApplication { public: /// construct from FCNBase + std::vector for parameters and errors - MnScan(const FCNBase &fcn, const std::vector &par, const std::vector &err, unsigned int stra = 1) + MnScan(const FCNBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(ScanMinimizer()) { } /// construct from FCNBase + std::vector for parameters and covariance - MnScan(const FCNBase &fcn, const std::vector &par, unsigned int nrow, const std::vector &cov, + MnScan(const FCNBase &fcn, std::span par, unsigned int nrow, std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(ScanMinimizer()) { } /// construct from FCNBase + std::vector for parameters and MnUserCovariance - MnScan(const FCNBase &fcn, const std::vector &par, const MnUserCovariance &cov, unsigned int stra = 1) + MnScan(const FCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(ScanMinimizer()) { } diff --git a/math/minuit2/inc/Minuit2/MnSimplex.h b/math/minuit2/inc/Minuit2/MnSimplex.h index 5ea2e0c64d4d7..6fd6296a54737 100644 --- a/math/minuit2/inc/Minuit2/MnSimplex.h +++ b/math/minuit2/inc/Minuit2/MnSimplex.h @@ -36,20 +36,20 @@ class MnSimplex : public MnApplication { public: /// construct from FCNBase + std::vector for parameters and errors - MnSimplex(const FCNBase &fcn, const std::vector &par, const std::vector &err, unsigned int stra = 1) + MnSimplex(const FCNBase &fcn, std::span par, std::span err, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, err), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) { } /// construct from FCNBase + std::vector for parameters and covariance - MnSimplex(const FCNBase &fcn, const std::vector &par, unsigned int nrow, const std::vector &cov, + MnSimplex(const FCNBase &fcn, std::span par, unsigned int nrow, std::span cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov, nrow), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) { } /// construct from FCNBase + std::vector for parameters and MnUserCovariance - MnSimplex(const FCNBase &fcn, const std::vector &par, const MnUserCovariance &cov, unsigned int stra = 1) + MnSimplex(const FCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int stra = 1) : MnApplication(fcn, MnUserParameterState(par, cov), MnStrategy(stra)), fMinimizer(SimplexMinimizer()) { } diff --git a/math/minuit2/inc/Minuit2/MnUserCovariance.h b/math/minuit2/inc/Minuit2/MnUserCovariance.h index 5ee8ec2da3104..9b8343cad4b5c 100644 --- a/math/minuit2/inc/Minuit2/MnUserCovariance.h +++ b/math/minuit2/inc/Minuit2/MnUserCovariance.h @@ -11,6 +11,9 @@ #define ROOT_Minuit2_MnUserCovariance #include "Minuit2/MnConfig.h" + +#include + #include #include @@ -29,7 +32,7 @@ class MnUserCovariance { MnUserCovariance() : fData(std::vector()), fNRow(0) {} // safe constructor using std::vector - MnUserCovariance(const std::vector &data, unsigned int nrow) : fData(data), fNRow(nrow) + MnUserCovariance(std::span data, unsigned int nrow) : fData(data.begin(), data.end()), fNRow(nrow) { assert(data.size() == nrow * (nrow + 1) / 2); } diff --git a/math/minuit2/inc/Minuit2/MnUserParameterState.h b/math/minuit2/inc/Minuit2/MnUserParameterState.h index dee9311fa5ebf..82f5dffe7b8b7 100644 --- a/math/minuit2/inc/Minuit2/MnUserParameterState.h +++ b/math/minuit2/inc/Minuit2/MnUserParameterState.h @@ -14,6 +14,8 @@ #include "Minuit2/MnUserCovariance.h" #include "Minuit2/MnGlobalCorrelationCoeff.h" +#include + #include #include @@ -42,14 +44,14 @@ class MnUserParameterState { } /// construct from user parameters (before minimization) - MnUserParameterState(const std::vector &, const std::vector &); + MnUserParameterState(std::span, std::span); MnUserParameterState(const MnUserParameters &); /// construct from user parameters + covariance (before minimization) - MnUserParameterState(const std::vector &, const std::vector &, unsigned int); + MnUserParameterState(std::span, std::span, unsigned int); - MnUserParameterState(const std::vector &, const MnUserCovariance &); + MnUserParameterState(std::span, const MnUserCovariance &); MnUserParameterState(const MnUserParameters &, const MnUserCovariance &); diff --git a/math/minuit2/inc/Minuit2/MnUserParameters.h b/math/minuit2/inc/Minuit2/MnUserParameters.h index e3fc841eba40d..4963de9aa0fdc 100644 --- a/math/minuit2/inc/Minuit2/MnUserParameters.h +++ b/math/minuit2/inc/Minuit2/MnUserParameters.h @@ -38,7 +38,7 @@ class MnUserParameters { public: MnUserParameters() : fTransformation(MnUserTransformation()) {} - MnUserParameters(const std::vector &, const std::vector &); + MnUserParameters(std::span, std::span); ~MnUserParameters() {} diff --git a/math/minuit2/inc/Minuit2/MnUserTransformation.h b/math/minuit2/inc/Minuit2/MnUserTransformation.h index 22f196a7b0bbe..88e99d34bfe1c 100644 --- a/math/minuit2/inc/Minuit2/MnUserTransformation.h +++ b/math/minuit2/inc/Minuit2/MnUserTransformation.h @@ -18,6 +18,8 @@ #include "Minuit2/SqrtLowParameterTransformation.h" #include "Minuit2/SqrtUpParameterTransformation.h" +#include + #include #include #include @@ -46,7 +48,7 @@ class MnUserTransformation { { } - MnUserTransformation(const std::vector &, const std::vector &); + MnUserTransformation(std::span, std::span); ~MnUserTransformation() {} diff --git a/math/minuit2/inc/Minuit2/ModularFunctionMinimizer.h b/math/minuit2/inc/Minuit2/ModularFunctionMinimizer.h index 57b3123889d05..423b7f469fe61 100644 --- a/math/minuit2/inc/Minuit2/ModularFunctionMinimizer.h +++ b/math/minuit2/inc/Minuit2/ModularFunctionMinimizer.h @@ -43,18 +43,18 @@ class ModularFunctionMinimizer : public FunctionMinimizer { ~ModularFunctionMinimizer() override {} // inherited interface - FunctionMinimum Minimize(const FCNBase &, const std::vector &, const std::vector &, + FunctionMinimum Minimize(const FCNBase &, std::span, std::span, unsigned int stra = 1, unsigned int maxfcn = 0, double toler = 0.1) const override; - FunctionMinimum Minimize(const FCNGradientBase &, const std::vector &, const std::vector &, + FunctionMinimum Minimize(const FCNGradientBase &, std::span, std::span, unsigned int stra = 1, unsigned int maxfcn = 0, double toler = 0.1) const override; - FunctionMinimum Minimize(const FCNBase &, const std::vector &, unsigned int, - const std::vector &, unsigned int stra = 1, unsigned int maxfcn = 0, + FunctionMinimum Minimize(const FCNBase &, std::span, unsigned int, + std::span, unsigned int stra = 1, unsigned int maxfcn = 0, double toler = 0.1) const override; - FunctionMinimum Minimize(const FCNGradientBase &, const std::vector &, unsigned int, - const std::vector &, unsigned int stra = 1, unsigned int maxfcn = 0, + FunctionMinimum Minimize(const FCNGradientBase &, std::span, unsigned int, + std::span, unsigned int stra = 1, unsigned int maxfcn = 0, double toler = 0.1) const override; // extension diff --git a/math/minuit2/inc/Minuit2/Numerical2PGradientCalculator.h b/math/minuit2/inc/Minuit2/Numerical2PGradientCalculator.h index b4f76f20e9e88..a34142165f084 100644 --- a/math/minuit2/inc/Minuit2/Numerical2PGradientCalculator.h +++ b/math/minuit2/inc/Minuit2/Numerical2PGradientCalculator.h @@ -14,6 +14,8 @@ #include "Minuit2/GradientCalculator.h" +#include + #include namespace ROOT { @@ -41,7 +43,7 @@ class Numerical2PGradientCalculator : public GradientCalculator { FunctionGradient operator()(const MinimumParameters &) const override; - virtual FunctionGradient operator()(const std::vector ¶ms) const; + virtual FunctionGradient operator()(std::span params) const; FunctionGradient operator()(const MinimumParameters &, const FunctionGradient &) const override; diff --git a/math/minuit2/inc/Minuit2/NumericalDerivator.h b/math/minuit2/inc/Minuit2/NumericalDerivator.h index ee6203274f066..5aa103e5b3d5a 100644 --- a/math/minuit2/inc/Minuit2/NumericalDerivator.h +++ b/math/minuit2/inc/Minuit2/NumericalDerivator.h @@ -20,13 +20,16 @@ #include -#include #include "Fit/ParameterSettings.h" #include "Minuit2/SinParameterTransformation.h" #include "Minuit2/SqrtUpParameterTransformation.h" #include "Minuit2/SqrtLowParameterTransformation.h" #include "Minuit2/MnMachinePrecision.h" +#include + +#include + namespace ROOT { namespace Minuit2 { @@ -45,19 +48,19 @@ class NumericalDerivator { bool always_exactly_mimic_minuit2 = true); void SetupDifferentiate(const ROOT::Math::IBaseFunctionMultiDim *function, const double *cx, - const std::vector ¶meters); + std::span parameters); std::vector Differentiate(const ROOT::Math::IBaseFunctionMultiDim *function, const double *x, - const std::vector ¶meters, - const std::vector &previous_gradient); + std::span parameters, + std::span previous_gradient); DerivatorElement PartialDerivative(const ROOT::Math::IBaseFunctionMultiDim *function, const double *x, - const std::vector ¶meters, + std::span parameters, unsigned int i_component, DerivatorElement previous); DerivatorElement FastPartialDerivative(const ROOT::Math::IBaseFunctionMultiDim *function, - const std::vector ¶meters, + std::span parameters, unsigned int i_component, const DerivatorElement &previous); DerivatorElement operator()(const ROOT::Math::IBaseFunctionMultiDim *function, const double *x, - const std::vector ¶meters, unsigned int i_component, + std::span parameters, unsigned int i_component, const DerivatorElement &previous); double GetValue() const { return fVal; } @@ -71,7 +74,7 @@ class NumericalDerivator { double DInt2Ext(const ROOT::Fit::ParameterSettings ¶meter, double val) const; void SetInitialGradient(const ROOT::Math::IBaseFunctionMultiDim *function, - const std::vector ¶meters, + std::span parameters, std::vector &gradient); inline bool AlwaysExactlyMimicMinuit2() const { return fAlwaysExactlyMimicMinuit2; } diff --git a/math/minuit2/inc/Minuit2/ParametricFunction.h b/math/minuit2/inc/Minuit2/ParametricFunction.h index 0e0e431517656..2733b6adca09a 100644 --- a/math/minuit2/inc/Minuit2/ParametricFunction.h +++ b/math/minuit2/inc/Minuit2/ParametricFunction.h @@ -52,7 +52,7 @@ class ParametricFunction : public FCNBase { */ - ParametricFunction(const std::vector ¶ms) : par(params) {} + ParametricFunction(std::span params) : par(params.begin(), params.end()) {} /** @@ -75,11 +75,11 @@ class ParametricFunction : public FCNBase { */ - virtual void SetParameters(const std::vector ¶ms) const + virtual void SetParameters(std::span params) const { assert(params.size() == par.size()); - par = params; + par.assign(params.begin(), params.end()); } /** @@ -115,7 +115,7 @@ class ParametricFunction : public FCNBase { */ - double operator()(const std::vector &x) const override = 0; + double operator()(std::span x) const override = 0; /** @@ -134,7 +134,7 @@ class ParametricFunction : public FCNBase { */ - virtual double operator()(const std::vector &x, const std::vector ¶ms) const + virtual double operator()(std::span x, std::span params) const { SetParameters(params); return operator()(x); @@ -153,7 +153,7 @@ class ParametricFunction : public FCNBase { */ - virtual std::vector GetGradient(const std::vector &x) const; + virtual std::vector GetGradient(std::span x) const; protected: /** diff --git a/math/minuit2/inc/Minuit2/SimplexParameters.h b/math/minuit2/inc/Minuit2/SimplexParameters.h index 91b287aa135a1..54f61f4a04697 100644 --- a/math/minuit2/inc/Minuit2/SimplexParameters.h +++ b/math/minuit2/inc/Minuit2/SimplexParameters.h @@ -14,6 +14,8 @@ #include "Minuit2/MnMatrix.h" +#include + #include #include @@ -29,8 +31,8 @@ namespace Minuit2 { class SimplexParameters { public: - SimplexParameters(const std::vector> &simpl, unsigned int jh, unsigned int jl) - : fSimplexParameters(simpl), fJHigh(jh), fJLow(jl) + SimplexParameters(std::span> simpl, unsigned int jh, unsigned int jl) + : fSimplexParameters(simpl.begin(), simpl.end()), fJHigh(jh), fJLow(jl) { } diff --git a/math/minuit2/src/FumiliStandardChi2FCN.cxx b/math/minuit2/src/FumiliStandardChi2FCN.cxx index 664e6ebe56fbd..ea0cce62b5d80 100644 --- a/math/minuit2/src/FumiliStandardChi2FCN.cxx +++ b/math/minuit2/src/FumiliStandardChi2FCN.cxx @@ -16,7 +16,7 @@ namespace ROOT { namespace Minuit2 { -std::vector FumiliStandardChi2FCN::Elements(const std::vector &par) const +std::vector FumiliStandardChi2FCN::Elements(std::span par) const { // Calculate the f(i) contribution to the Chi2. Chi2 = Sum[f(i)**2] @@ -54,7 +54,7 @@ int FumiliStandardChi2FCN::GetNumberOfMeasurements() const return fPositions.size(); } -void FumiliStandardChi2FCN::EvaluateAll(const std::vector &par) +void FumiliStandardChi2FCN::EvaluateAll(std::span par) { // Evaluate chi2 value, gradient and hessian all in a single // loop on the measurements diff --git a/math/minuit2/src/FumiliStandardMaximumLikelihoodFCN.cxx b/math/minuit2/src/FumiliStandardMaximumLikelihoodFCN.cxx index 67bee83aa98f5..3127c89aff33a 100644 --- a/math/minuit2/src/FumiliStandardMaximumLikelihoodFCN.cxx +++ b/math/minuit2/src/FumiliStandardMaximumLikelihoodFCN.cxx @@ -17,7 +17,7 @@ namespace ROOT { namespace Minuit2 { -std::vector FumiliStandardMaximumLikelihoodFCN::Elements(const std::vector &par) const +std::vector FumiliStandardMaximumLikelihoodFCN::Elements(std::span par) const { // calculate likelihood element f(i) = pdf(x(i)) @@ -54,7 +54,7 @@ int FumiliStandardMaximumLikelihoodFCN::GetNumberOfMeasurements() const return fPositions.size(); } -void FumiliStandardMaximumLikelihoodFCN::EvaluateAll(const std::vector &par) +void FumiliStandardMaximumLikelihoodFCN::EvaluateAll(std::span par) { // Evaluate in one loop likelihood value, gradient and hessian diff --git a/math/minuit2/src/Minuit2Minimizer.cxx b/math/minuit2/src/Minuit2Minimizer.cxx index 37de5be4ad888..ef69ab2dd09df 100644 --- a/math/minuit2/src/Minuit2Minimizer.cxx +++ b/math/minuit2/src/Minuit2Minimizer.cxx @@ -409,7 +409,7 @@ void Minuit2Minimizer::SetFunction(const ROOT::Math::IMultiGenFunction &func) } } -void Minuit2Minimizer::SetHessianFunction(std::function &, double *)> hfunc) +void Minuit2Minimizer::SetHessianFunction(std::function, double *)> hfunc) { // for Fumili not supported for the time being if (fUseFumili) return; @@ -595,7 +595,7 @@ bool Minuit2Minimizer::ExamineMinimum(const ROOT::Minuit2::FunctionMinimum &min) int debugLevel = PrintLevel(); if (debugLevel >= 3) { - const std::vector &iterationStates = min.States(); + std::span iterationStates = min.States(); std::cout << "Number of iterations " << iterationStates.size() << std::endl; for (unsigned int i = 0; i < iterationStates.size(); ++i) { // std::cout << iterationStates[i] << std::endl; @@ -663,7 +663,7 @@ bool Minuit2Minimizer::ExamineMinimum(const ROOT::Minuit2::FunctionMinimum &min) PrintResults(); // set the minimum values in the fValues vector - const std::vector ¶msObj = fState.MinuitParameters(); + std::span paramsObj = fState.MinuitParameters(); if (paramsObj.empty()) return false; assert(fDim == paramsObj.size()); @@ -713,7 +713,7 @@ void Minuit2Minimizer::PrintResults() const double *Minuit2Minimizer::Errors() const { // return error at minimum (set to zero for fixed and constant params) - const std::vector ¶msObj = fState.MinuitParameters(); + std::span paramsObj = fState.MinuitParameters(); if (paramsObj.empty()) return nullptr; assert(fDim == paramsObj.size()); diff --git a/math/minuit2/src/MnFunctionCross.cxx b/math/minuit2/src/MnFunctionCross.cxx index c3191c8c40f52..242aacef022d6 100644 --- a/math/minuit2/src/MnFunctionCross.cxx +++ b/math/minuit2/src/MnFunctionCross.cxx @@ -22,8 +22,8 @@ namespace ROOT { namespace Minuit2 { -MnCross MnFunctionCross::operator()(const std::vector &par, const std::vector &pmid, - const std::vector &pdir, double tlr, unsigned int maxcalls) const +MnCross MnFunctionCross::operator()(std::span par, std::span pmid, + std::span pdir, double tlr, unsigned int maxcalls) const { // evaluate crossing point where function is equal to MIN + UP, // with direction pdir from values pmid diff --git a/math/minuit2/src/MnHesse.cxx b/math/minuit2/src/MnHesse.cxx index 0208b230bcb08..74ed629ec9ee8 100644 --- a/math/minuit2/src/MnHesse.cxx +++ b/math/minuit2/src/MnHesse.cxx @@ -28,21 +28,21 @@ namespace ROOT { namespace Minuit2 { -MnUserParameterState MnHesse::operator()(const FCNBase &fcn, const std::vector &par, - const std::vector &err, unsigned int maxcalls) const +MnUserParameterState MnHesse::operator()(const FCNBase &fcn, std::span par, + std::span err, unsigned int maxcalls) const { // interface from vector of params and errors return (*this)(fcn, MnUserParameterState(par, err), maxcalls); } -MnUserParameterState MnHesse::operator()(const FCNBase &fcn, const std::vector &par, unsigned int nrow, - const std::vector &cov, unsigned int maxcalls) const +MnUserParameterState MnHesse::operator()(const FCNBase &fcn, std::span par, unsigned int nrow, + std::span cov, unsigned int maxcalls) const { // interface from vector of params and covariance return (*this)(fcn, MnUserParameterState(par, cov, nrow), maxcalls); } -MnUserParameterState MnHesse::operator()(const FCNBase &fcn, const std::vector &par, +MnUserParameterState MnHesse::operator()(const FCNBase &fcn, std::span par, const MnUserCovariance &cov, unsigned int maxcalls) const { // interface from vector of params and covariance diff --git a/math/minuit2/src/MnPlot.cxx b/math/minuit2/src/MnPlot.cxx index fcd728e15dfe6..c1e059453df9a 100644 --- a/math/minuit2/src/MnPlot.cxx +++ b/math/minuit2/src/MnPlot.cxx @@ -16,7 +16,7 @@ namespace Minuit2 { void mnplot(double *xpt, double *ypt, char *chpt, int nxypt, int npagwd, int npagln); -void MnPlot::operator()(const std::vector> &points) const +void MnPlot::operator()(std::span> points) const { // call routine from Fortran minuit (mnplot) to plot the vector of (x,y) points std::vector x; @@ -35,7 +35,7 @@ void MnPlot::operator()(const std::vector> &points) co mnplot(x.data(), y.data(), chpt.data(), points.size(), Width(), Length()); } -void MnPlot::operator()(double xmin, double ymin, const std::vector> &points) const +void MnPlot::operator()(double xmin, double ymin, std::span> points) const { // call routine from Fortran minuit (mnplot) to plot the vector of (x,y) points + minimum values std::vector x; diff --git a/math/minuit2/src/MnUserParameterState.cxx b/math/minuit2/src/MnUserParameterState.cxx index d47c0b0b46da4..9667c6f021c10 100644 --- a/math/minuit2/src/MnUserParameterState.cxx +++ b/math/minuit2/src/MnUserParameterState.cxx @@ -19,10 +19,10 @@ namespace Minuit2 { // // construct from user parameters (before minimization) // -MnUserParameterState::MnUserParameterState(const std::vector &par, const std::vector &err) +MnUserParameterState::MnUserParameterState(std::span par, std::span err) : fValid(true), fCovarianceValid(false), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fParameters(MnUserParameters(par, err)), - fIntParameters(par) + fIntParameters(par.begin(), par.end()) { } @@ -32,25 +32,24 @@ MnUserParameterState::MnUserParameterState(const MnUserParameters &par) { // construct from user parameters (before minimization) - for (std::vector::const_iterator ipar = MinuitParameters().begin(); - ipar != MinuitParameters().end(); ++ipar) { - if ((*ipar).IsConst() || (*ipar).IsFixed()) + for (auto const &ipar : MinuitParameters()) { + if (ipar.IsConst() || ipar.IsFixed()) continue; - if ((*ipar).HasLimits()) - fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value())); + if (ipar.HasLimits()) + fIntParameters.push_back(Ext2int(ipar.Number(), ipar.Value())); else - fIntParameters.push_back((*ipar).Value()); + fIntParameters.push_back(ipar.Value()); } } // // construct from user parameters + errors (before minimization) // -MnUserParameterState::MnUserParameterState(const std::vector &par, const std::vector &cov, +MnUserParameterState::MnUserParameterState(std::span par, std::span cov, unsigned int nrow) : fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), fCovariance(MnUserCovariance(cov, nrow)), - fIntParameters(par), fIntCovariance(MnUserCovariance(cov, nrow)) + fIntParameters(par.begin(), par.end()), fIntCovariance(MnUserCovariance(cov, nrow)) { // construct from user parameters + errors (before minimization) using std::vector for parameter error and // an // std::vector of size n*(n+1)/2 for the covariance matrix and n (rank of cov matrix) @@ -65,9 +64,9 @@ MnUserParameterState::MnUserParameterState(const std::vector &par, const assert(fCovariance.Nrow() == VariableParameters()); } -MnUserParameterState::MnUserParameterState(const std::vector &par, const MnUserCovariance &cov) +MnUserParameterState::MnUserParameterState(std::span par, const MnUserCovariance &cov) : fValid(true), fCovarianceValid(true), fGCCValid(false), fCovStatus(-1), fFVal(0.), fEDM(0.), fNFcn(0), - fCovariance(cov), fIntParameters(par), + fCovariance(cov), fIntParameters(par.begin(), par.end()), fIntCovariance(cov) { // construct from user parameters + errors (before minimization) using std::vector (params) and MnUserCovariance @@ -92,14 +91,13 @@ MnUserParameterState::MnUserParameterState(const MnUserParameters &par, const Mn // MnUserParameters and MnUserCovariance objects fIntCovariance.Scale(0.5); - for (std::vector::const_iterator ipar = MinuitParameters().begin(); - ipar != MinuitParameters().end(); ++ipar) { - if ((*ipar).IsConst() || (*ipar).IsFixed()) + for (auto const &ipar : MinuitParameters()) { + if (ipar.IsConst() || ipar.IsFixed()) continue; - if ((*ipar).HasLimits()) - fIntParameters.push_back(Ext2int((*ipar).Number(), (*ipar).Value())); + if (ipar.HasLimits()) + fIntParameters.push_back(Ext2int(ipar.Number(), ipar.Value())); else - fIntParameters.push_back((*ipar).Value()); + fIntParameters.push_back(ipar.Value()); } assert(fCovariance.Nrow() == VariableParameters()); // @@ -119,37 +117,36 @@ MnUserParameterState::MnUserParameterState(const MinimumState &st, double up, co // // std::cout << "build a MnUserParameterState after minimization.." << std::endl; - for (std::vector::const_iterator ipar = trafo.Parameters().begin(); - ipar != trafo.Parameters().end(); ++ipar) { - if ((*ipar).IsConst()) { - Add((*ipar).GetName(), (*ipar).Value()); - } else if ((*ipar).IsFixed()) { - Add((*ipar).GetName(), (*ipar).Value(), (*ipar).Error()); - if ((*ipar).HasLimits()) { - if ((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit()) - SetLimits((*ipar).GetName(), (*ipar).LowerLimit(), (*ipar).UpperLimit()); - else if ((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit()) - SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit()); + for (auto const &ipar : trafo.Parameters()) { + if (ipar.IsConst()) { + Add(ipar.GetName(), ipar.Value()); + } else if (ipar.IsFixed()) { + Add(ipar.GetName(), ipar.Value(), ipar.Error()); + if (ipar.HasLimits()) { + if (ipar.HasLowerLimit() && ipar.HasUpperLimit()) + SetLimits(ipar.GetName(), ipar.LowerLimit(), ipar.UpperLimit()); + else if (ipar.HasLowerLimit() && !ipar.HasUpperLimit()) + SetLowerLimit(ipar.GetName(), ipar.LowerLimit()); else - SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit()); + SetUpperLimit(ipar.GetName(), ipar.UpperLimit()); } - Fix((*ipar).GetName()); - } else if ((*ipar).HasLimits()) { - unsigned int i = trafo.IntOfExt((*ipar).Number()); + Fix(ipar.GetName()); + } else if (ipar.HasLimits()) { + unsigned int i = trafo.IntOfExt(ipar.Number()); double err = st.Error().IsValid() ? std::sqrt(2. * up * st.Error().InvHessian()(i, i)) : st.Parameters().Dirin()(i); - Add((*ipar).GetName(), trafo.Int2ext(i, st.Vec()(i)), trafo.Int2extError(i, st.Vec()(i), err)); - if ((*ipar).HasLowerLimit() && (*ipar).HasUpperLimit()) - SetLimits((*ipar).GetName(), (*ipar).LowerLimit(), (*ipar).UpperLimit()); - else if ((*ipar).HasLowerLimit() && !(*ipar).HasUpperLimit()) - SetLowerLimit((*ipar).GetName(), (*ipar).LowerLimit()); + Add(ipar.GetName(), trafo.Int2ext(i, st.Vec()(i)), trafo.Int2extError(i, st.Vec()(i), err)); + if (ipar.HasLowerLimit() && ipar.HasUpperLimit()) + SetLimits(ipar.GetName(), ipar.LowerLimit(), ipar.UpperLimit()); + else if (ipar.HasLowerLimit() && !ipar.HasUpperLimit()) + SetLowerLimit(ipar.GetName(), ipar.LowerLimit()); else - SetUpperLimit((*ipar).GetName(), (*ipar).UpperLimit()); + SetUpperLimit(ipar.GetName(), ipar.UpperLimit()); } else { - unsigned int i = trafo.IntOfExt((*ipar).Number()); + unsigned int i = trafo.IntOfExt(ipar.Number()); double err = st.Error().IsValid() ? std::sqrt(2. * up * st.Error().InvHessian()(i, i)) : st.Parameters().Dirin()(i); - Add((*ipar).GetName(), st.Vec()(i), err); + Add(ipar.GetName(), st.Vec()(i), err); } } diff --git a/math/minuit2/src/MnUserParameters.cxx b/math/minuit2/src/MnUserParameters.cxx index c4e1b0dd13750..7f1ddbe2659f5 100644 --- a/math/minuit2/src/MnUserParameters.cxx +++ b/math/minuit2/src/MnUserParameters.cxx @@ -13,7 +13,7 @@ namespace ROOT { namespace Minuit2 { -MnUserParameters::MnUserParameters(const std::vector &par, const std::vector &err) +MnUserParameters::MnUserParameters(std::span par, std::span err) : fTransformation(par, err) { } diff --git a/math/minuit2/src/MnUserTransformation.cxx b/math/minuit2/src/MnUserTransformation.cxx index 088412066c4b6..b7f0e513ccde3 100644 --- a/math/minuit2/src/MnUserTransformation.cxx +++ b/math/minuit2/src/MnUserTransformation.cxx @@ -37,7 +37,7 @@ class MnParStr { const std::string &fName; }; -MnUserTransformation::MnUserTransformation(const std::vector &par, const std::vector &err) +MnUserTransformation::MnUserTransformation(std::span par, std::span err) { // constructor from a vector of parameter values and a vector of errors (step sizes) // class has as data member the transformation objects (all of the types), @@ -250,8 +250,9 @@ std::vector MnUserTransformation::Errors() const // return std::vector of double with parameter errors std::vector result; result.reserve(fParameters.size()); - for (std::vector::const_iterator ipar = Parameters().begin(); ipar != Parameters().end(); ++ipar) - result.push_back((*ipar).Error()); + for (auto const &ipar : Parameters()) { + result.push_back(ipar.Error()); + } return result; } diff --git a/math/minuit2/src/ModularFunctionMinimizer.cxx b/math/minuit2/src/ModularFunctionMinimizer.cxx index 597a4874ca907..76da34f924533 100644 --- a/math/minuit2/src/ModularFunctionMinimizer.cxx +++ b/math/minuit2/src/ModularFunctionMinimizer.cxx @@ -34,8 +34,8 @@ namespace Minuit2 { // #include "Minuit2/MnUserParametersPrint.h" -FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, const std::vector &par, - const std::vector &err, unsigned int stra, +FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, std::span par, + std::span err, unsigned int stra, unsigned int maxfcn, double toler) const { // minimize from FCNBase and std::vector of double's for parameter values and errors (step sizes) @@ -44,8 +44,8 @@ FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, const std return Minimize(fcn, st, strategy, maxfcn, toler); } -FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase &fcn, const std::vector &par, - const std::vector &err, unsigned int stra, +FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase &fcn, std::span par, + std::span err, unsigned int stra, unsigned int maxfcn, double toler) const { // minimize from FCNGradientBase (use analytical gradient provided in FCN) @@ -56,8 +56,8 @@ FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase &fcn, c } // move nrow before cov to avoid ambiguities when using default parameters -FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, const std::vector &par, - unsigned int nrow, const std::vector &cov, unsigned int stra, +FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, std::span par, + unsigned int nrow, std::span cov, unsigned int stra, unsigned int maxfcn, double toler) const { // minimize from FCNBase using std::vector for parameter error and @@ -68,8 +68,8 @@ FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNBase &fcn, const std return Minimize(fcn, st, strategy, maxfcn, toler); } -FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase &fcn, const std::vector &par, - unsigned int nrow, const std::vector &cov, unsigned int stra, +FunctionMinimum ModularFunctionMinimizer::Minimize(const FCNGradientBase &fcn, std::span par, + unsigned int nrow, std::span cov, unsigned int stra, unsigned int maxfcn, double toler) const { // minimize from FCNGradientBase (use analytical gradient provided in FCN) diff --git a/math/minuit2/src/Numerical2PGradientCalculator.cxx b/math/minuit2/src/Numerical2PGradientCalculator.cxx index 33ee6072c027a..8a56561053c89 100644 --- a/math/minuit2/src/Numerical2PGradientCalculator.cxx +++ b/math/minuit2/src/Numerical2PGradientCalculator.cxx @@ -42,7 +42,7 @@ FunctionGradient Numerical2PGradientCalculator::operator()(const MinimumParamete } // comment it, because it was added -FunctionGradient Numerical2PGradientCalculator::operator()(const std::vector ¶ms) const +FunctionGradient Numerical2PGradientCalculator::operator()(std::span params) const { // calculate gradient from an std;:vector of paramteters diff --git a/math/minuit2/src/NumericalDerivator.cxx b/math/minuit2/src/NumericalDerivator.cxx index b03b394899670..ebd62aaa83a29 100644 --- a/math/minuit2/src/NumericalDerivator.cxx +++ b/math/minuit2/src/NumericalDerivator.cxx @@ -55,7 +55,7 @@ NumericalDerivator::NumericalDerivator(const NumericalDerivator &/*other*/) = de /// This function sets internal state based on input parameters. This state /// setup is used in the actual (partial) derivative calculations. void NumericalDerivator::SetupDifferentiate(const ROOT::Math::IBaseFunctionMultiDim *function, const double *cx, - const std::vector ¶meters) + std::span parameters) { assert(function != nullptr && "function is a nullptr"); @@ -80,7 +80,7 @@ void NumericalDerivator::SetupDifferentiate(const ROOT::Math::IBaseFunctionMulti DerivatorElement NumericalDerivator::PartialDerivative(const ROOT::Math::IBaseFunctionMultiDim *function, const double *x, - const std::vector ¶meters, + std::span parameters, unsigned int i_component, DerivatorElement previous) { SetupDifferentiate(function, x, parameters); @@ -89,7 +89,7 @@ DerivatorElement NumericalDerivator::PartialDerivative(const ROOT::Math::IBaseFu // leaves the parameter setup to the caller DerivatorElement NumericalDerivator::FastPartialDerivative(const ROOT::Math::IBaseFunctionMultiDim *function, - const std::vector ¶meters, + std::span parameters, unsigned int i_component, const DerivatorElement &previous) { DerivatorElement deriv{previous}; @@ -143,7 +143,7 @@ DerivatorElement NumericalDerivator::FastPartialDerivative(const ROOT::Math::IBa } DerivatorElement NumericalDerivator::operator()(const ROOT::Math::IBaseFunctionMultiDim *function, const double *x, - const std::vector ¶meters, + std::span parameters, unsigned int i_component, const DerivatorElement &previous) { return PartialDerivative(function, x, parameters, i_component, previous); @@ -151,8 +151,8 @@ DerivatorElement NumericalDerivator::operator()(const ROOT::Math::IBaseFunctionM std::vector NumericalDerivator::Differentiate(const ROOT::Math::IBaseFunctionMultiDim *function, const double *cx, - const std::vector ¶meters, - const std::vector &previous_gradient) + std::span parameters, + std::span previous_gradient) { SetupDifferentiate(function, cx, parameters); @@ -222,7 +222,7 @@ double NumericalDerivator::DInt2Ext(const ROOT::Fit::ParameterSettings ¶mete /// This function was not implemented as in Minuit2. Now it copies the behavior /// of InitialGradientCalculator. See https://github.com/roofit-dev/root/issues/10 void NumericalDerivator::SetInitialGradient(const ROOT::Math::IBaseFunctionMultiDim *, - const std::vector ¶meters, + std::span parameters, std::vector &gradient) { // set an initial gradient using some given steps diff --git a/math/minuit2/src/ParametricFunction.cxx b/math/minuit2/src/ParametricFunction.cxx index 9370deaabdc39..9bd77a74b978e 100644 --- a/math/minuit2/src/ParametricFunction.cxx +++ b/math/minuit2/src/ParametricFunction.cxx @@ -21,7 +21,7 @@ namespace Minuit2 { //#include "Minuit2/MnPrint.h" -std::vector ParametricFunction::GetGradient(const std::vector &x) const +std::vector ParametricFunction::GetGradient(std::span x) const { // calculate the numerical gradient (using Numerical2PGradientCalculator) diff --git a/math/minuit2/src/SimplexBuilder.cxx b/math/minuit2/src/SimplexBuilder.cxx index 43e85bd191b55..490f6b59d0d7e 100644 --- a/math/minuit2/src/SimplexBuilder.cxx +++ b/math/minuit2/src/SimplexBuilder.cxx @@ -43,7 +43,7 @@ FunctionMinimum SimplexBuilder::Minimum(const MnFcn &mfcn, const GradientCalcula if (n == 0) { MinimumState st(MinimumParameters(MnAlgebraicVector{0}, MnAlgebraicVector{0}, mfcn(x)), 0.0, mfcn.NumOfCalls()); - return FunctionMinimum(seed, {st}, mfcn.Up()); + return FunctionMinimum(seed, {&st, 1}, mfcn.Up()); } const double wg = 1. / double(n); @@ -227,15 +227,15 @@ FunctionMinimum SimplexBuilder::Minimum(const MnFcn &mfcn, const GradientCalcula if (mfcn.NumOfCalls() > maxfcn) { print.Warn("Simplex did not converge, #fcn calls exhausted"); - return FunctionMinimum(seed, {st}, mfcn.Up(), FunctionMinimum::MnReachedCallLimit); + return FunctionMinimum(seed, {&st, 1}, mfcn.Up(), FunctionMinimum::MnReachedCallLimit); } if (simplex.Edm() > minedm) { print.Warn("Simplex did not converge, edm > minedm"); - return FunctionMinimum(seed, {st}, mfcn.Up(), FunctionMinimum::MnAboveMaxEdm); + return FunctionMinimum(seed, {&st, 1}, mfcn.Up(), FunctionMinimum::MnAboveMaxEdm); } - return FunctionMinimum(seed, {st}, mfcn.Up()); + return FunctionMinimum(seed, {&st, 1}, mfcn.Up()); } } // namespace Minuit2 diff --git a/math/minuit2/test/MnSim/GaussFcn.cxx b/math/minuit2/test/MnSim/GaussFcn.cxx index cdf70b42f37e7..d31f1c85ca99d 100644 --- a/math/minuit2/test/MnSim/GaussFcn.cxx +++ b/math/minuit2/test/MnSim/GaussFcn.cxx @@ -16,7 +16,7 @@ namespace ROOT { namespace Minuit2 { -double GaussFcn::operator()(const std::vector &par) const +double GaussFcn::operator()(std::span par) const { assert(par.size() == 3); diff --git a/math/minuit2/test/MnSim/GaussFcn.h b/math/minuit2/test/MnSim/GaussFcn.h index 452d86c6068aa..8eb2f7463f3ec 100644 --- a/math/minuit2/test/MnSim/GaussFcn.h +++ b/math/minuit2/test/MnSim/GaussFcn.h @@ -21,15 +21,18 @@ namespace Minuit2 { class GaussFcn : public FCNBase { public: - GaussFcn(const std::vector &meas, const std::vector &pos, const std::vector &mvar) - : fMeasurements(meas), fPositions(pos), fMVariances(mvar), fErrorDef(1.) + GaussFcn(std::span meas, std::span pos, std::span mvar) + : fMeasurements(meas.begin(), meas.end()), + fPositions(pos.begin(), pos.end()), + fMVariances(mvar.begin(), mvar.end()), + fErrorDef(1.) { } ~GaussFcn() override {} double Up() const override { return fErrorDef; } - double operator()(const std::vector &) const override; + double operator()(std::span) const override; std::vector Measurements() const { return fMeasurements; } std::vector Positions() const { return fPositions; } diff --git a/math/minuit2/test/MnSim/GaussFcn2.cxx b/math/minuit2/test/MnSim/GaussFcn2.cxx index 0b193fd7cf6e3..9ed7837eda2d7 100644 --- a/math/minuit2/test/MnSim/GaussFcn2.cxx +++ b/math/minuit2/test/MnSim/GaussFcn2.cxx @@ -16,7 +16,7 @@ namespace ROOT { namespace Minuit2 { -double GaussFcn2::operator()(const std::vector &par) const +double GaussFcn2::operator()(std::span par) const { assert(par.size() == 6); diff --git a/math/minuit2/test/MnSim/GaussFcn2.h b/math/minuit2/test/MnSim/GaussFcn2.h index 5302bb32b612f..f654d68247047 100644 --- a/math/minuit2/test/MnSim/GaussFcn2.h +++ b/math/minuit2/test/MnSim/GaussFcn2.h @@ -21,8 +21,11 @@ namespace Minuit2 { class GaussFcn2 : public FCNBase { public: - GaussFcn2(const std::vector &meas, const std::vector &pos, const std::vector &mvar) - : fMeasurements(meas), fPositions(pos), fMVariances(mvar), fMin(0.) + GaussFcn2(std::span meas, std::span pos, std::span mvar) + : fMeasurements(meas.begin(), meas.end()), + fPositions(pos.begin(), pos.end()), + fMVariances(mvar.begin(), mvar.end()), + fMin(0.) { Init(); } @@ -31,7 +34,7 @@ class GaussFcn2 : public FCNBase { virtual void Init(); double Up() const override { return 1.; } - double operator()(const std::vector &) const override; + double operator()(std::span) const override; double ErrorDef() const override { return Up(); } std::vector Measurements() const { return fMeasurements; } diff --git a/math/minuit2/test/MnSim/GaussianModelFunction.h b/math/minuit2/test/MnSim/GaussianModelFunction.h index 75130b87496b9..d619c25212823 100644 --- a/math/minuit2/test/MnSim/GaussianModelFunction.h +++ b/math/minuit2/test/MnSim/GaussianModelFunction.h @@ -80,7 +80,7 @@ class GaussianModelFunction : public ParametricFunction { */ - GaussianModelFunction(const std::vector ¶ms) : ParametricFunction(params) { assert(params.size() == 1); } + GaussianModelFunction(std::span params) : ParametricFunction(params) { assert(params.size() == 1); } ~GaussianModelFunction() override {} @@ -97,7 +97,7 @@ class GaussianModelFunction : public ParametricFunction { */ - double operator()(const std::vector &x) const override + double operator()(std::span x) const override { assert(x.size() == 3); @@ -128,7 +128,7 @@ class GaussianModelFunction : public ParametricFunction { */ - double operator()(const std::vector &x, const std::vector ¶m) const override + double operator()(std::span x, std::span param) const override { constexpr double two_pi = 2 * 3.14159265358979323846; // M_PI is not standard @@ -148,10 +148,10 @@ class GaussianModelFunction : public ParametricFunction { double Up() const override { return 1.0; } - std::vector GetGradient(const std::vector &x) const override + std::vector GetGradient(std::span x) const override { - const std::vector ¶m = GetParameters(); + std::span param = GetParameters(); assert(param.size() == 1); std::vector grad(x.size()); diff --git a/math/minuit2/test/MnSim/ParallelTest.cxx b/math/minuit2/test/MnSim/ParallelTest.cxx index 66d3e24cb0893..99e53206ea54f 100644 --- a/math/minuit2/test/MnSim/ParallelTest.cxx +++ b/math/minuit2/test/MnSim/ParallelTest.cxx @@ -39,7 +39,7 @@ double GaussPdf(double x, double x0, double sigma) return (1.0 / (std::sqrt(two_pi) * std::fabs(sigma))) * std::exp(-tmp * tmp / 2); } -double LogMultiGaussPdf(const std::vector &x, const std::vector &p) +double LogMultiGaussPdf(std::span x, std::span p) { double f = 0; int ndim = x.size(); @@ -59,7 +59,7 @@ struct LogLikeFCN : public FCNBase { LogLikeFCN(const Data &data) : fData(data) {} - double operator()(const std::vector &p) const override + double operator()(std::span p) const override { double logl = 0; int ndata = fData.size(); diff --git a/math/minuit2/test/MnSim/PaulTest4.cxx b/math/minuit2/test/MnSim/PaulTest4.cxx index 546ea3bba30cd..34518114016ec 100644 --- a/math/minuit2/test/MnSim/PaulTest4.cxx +++ b/math/minuit2/test/MnSim/PaulTest4.cxx @@ -46,14 +46,16 @@ class PowerLawFunc { class PowerLawChi2FCN : public FCNBase { public: - PowerLawChi2FCN(const std::vector &meas, const std::vector &pos, const std::vector &mvar) - : fMeasurements(meas), fPositions(pos), fMVariances(mvar) + PowerLawChi2FCN(std::span meas, std::span pos, std::span mvar) + : fMeasurements(meas.begin(), meas.end()), + fPositions(pos.begin(), pos.end()), + fMVariances(mvar.begin(), mvar.end()) { } ~PowerLawChi2FCN() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { assert(par.size() == 2); PowerLawFunc pl(par[0], par[1]); @@ -77,14 +79,14 @@ class PowerLawChi2FCN : public FCNBase { class PowerLawLogLikeFCN : public FCNBase { public: - PowerLawLogLikeFCN(const std::vector &meas, const std::vector &pos) - : fMeasurements(meas), fPositions(pos) + PowerLawLogLikeFCN(std::span meas, std::span pos) + : fMeasurements(meas.begin(), meas.end()), fPositions(pos.begin(), pos.end()) { } ~PowerLawLogLikeFCN() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { assert(par.size() == 2); PowerLawFunc pl(par[0], par[1]); diff --git a/math/minuit2/test/MnSim/ReneTest.cxx b/math/minuit2/test/MnSim/ReneTest.cxx index 1355779182180..4e3af8ba3eefb 100644 --- a/math/minuit2/test/MnSim/ReneTest.cxx +++ b/math/minuit2/test/MnSim/ReneTest.cxx @@ -26,11 +26,11 @@ using namespace ROOT::Minuit2; class ReneFcn : public FCNBase { public: - ReneFcn(const std::vector &meas) : fMeasurements(meas) {} + ReneFcn(std::span meas) : fMeasurements(meas.begin(), meas.end()) {} ~ReneFcn() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double a = par[2]; double b = par[1]; @@ -77,11 +77,11 @@ class ReneFcn : public FCNBase { public: - ReneFcn(const std::vector& meas) : fMeasurements(meas) {} + ReneFcn(std::span meas) : fMeasurements(meas) {} virtual ~ReneFcn() {} - virtual double operator()(const std::vector& par) const { + virtual double operator()(std::span par) const { double mypar[6]; for(std::vector::const_iterator ipar = par.begin(); ipar != par.end(); ipar++) diff --git a/math/minuit2/test/MnTutorial/Quad12F.h b/math/minuit2/test/MnTutorial/Quad12F.h index ca09f3cfab5d5..e43c4143a54fd 100644 --- a/math/minuit2/test/MnTutorial/Quad12F.h +++ b/math/minuit2/test/MnTutorial/Quad12F.h @@ -18,7 +18,7 @@ namespace Minuit2 { class Quad12F : public FCNBase { public: - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double x = par[0]; diff --git a/math/minuit2/test/MnTutorial/Quad1F.h b/math/minuit2/test/MnTutorial/Quad1F.h index 24f57abafc900..4ecfb045908a7 100644 --- a/math/minuit2/test/MnTutorial/Quad1F.h +++ b/math/minuit2/test/MnTutorial/Quad1F.h @@ -22,7 +22,7 @@ class Quad1F : public FCNGradientBase { ~Quad1F() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double x = par[0]; @@ -30,7 +30,7 @@ class Quad1F : public FCNGradientBase { return (x * x); } - std::vector Gradient(const std::vector &par) const override + std::vector Gradient(std::span par) const override { double x = par[0]; diff --git a/math/minuit2/test/MnTutorial/Quad4F.h b/math/minuit2/test/MnTutorial/Quad4F.h index 83f13d253e388..38d1f68dfe850 100644 --- a/math/minuit2/test/MnTutorial/Quad4F.h +++ b/math/minuit2/test/MnTutorial/Quad4F.h @@ -22,7 +22,7 @@ class Quad4F : public FCNBase { ~Quad4F() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double x = par[0]; @@ -46,7 +46,7 @@ class Quad4FGrad : public FCNGradientBase { ~Quad4FGrad() override {} - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double x = par[0]; @@ -57,7 +57,7 @@ class Quad4FGrad : public FCNGradientBase { return ((1. / 70.) * (21 * x * x + 20 * y * y + 19 * z * z - 14 * x * z - 20 * y * z) + w * w); } - std::vector Gradient(const std::vector &par) const override + std::vector Gradient(std::span par) const override { double x = par[0]; diff --git a/math/minuit2/test/MnTutorial/Quad8F.h b/math/minuit2/test/MnTutorial/Quad8F.h index 9fdfd938c75e9..7ef9e8680b00b 100644 --- a/math/minuit2/test/MnTutorial/Quad8F.h +++ b/math/minuit2/test/MnTutorial/Quad8F.h @@ -18,7 +18,7 @@ namespace Minuit2 { class Quad8F : public FCNBase { public: - double operator()(const std::vector &par) const override + double operator()(std::span par) const override { double x = par[0]; diff --git a/math/minuit2/test/testADMinim.cxx b/math/minuit2/test/testADMinim.cxx index 1f756de22618e..1f2c1401bcc91 100644 --- a/math/minuit2/test/testADMinim.cxx +++ b/math/minuit2/test/testADMinim.cxx @@ -411,7 +411,7 @@ const double *TrueMinimum(const ROOT::Math::IMultiGenFunction &func) return nullptr; } -void printMinimum(const std::vector &x) +void printMinimum(std::span x) { std::cout << "Minimum X values\n"; std::cout << "\t"; @@ -456,7 +456,7 @@ int DoADMinimization(const std::string & formula, const double *x0, const double func.SetParameters(x); func.GradientPar(nullptr,g); }; - auto hessFcn = [&](const std::vector &x, double *h) { + auto hessFcn = [&](std::span x, double *h) { for (int i = 0; i < ndim*ndim; i++) h[i] = 0; func.SetParameters(x.data()); diff --git a/math/minuit2/test/testMinimizer.cxx b/math/minuit2/test/testMinimizer.cxx index c667564a1bee9..eb3d6517e3430 100644 --- a/math/minuit2/test/testMinimizer.cxx +++ b/math/minuit2/test/testMinimizer.cxx @@ -406,7 +406,7 @@ const double *TrueMinimum(const ROOT::Math::IMultiGenFunction &func) return nullptr; } -void printMinimum(const std::vector &x) +void printMinimum(std::span x) { std::cout << "Minimum X values\n"; std::cout << "\t";