diff --git a/Fit/NewKernel/Kernel.cpp b/Fit/NewKernel/Kernel.cpp index 1fafa52ac1bd7a10bd2c0bda34cd6f2b78b9b63c..cd8539f7d03f449fb7bec91e82edcd27d600c554 100644 --- a/Fit/NewKernel/Kernel.cpp +++ b/Fit/NewKernel/Kernel.cpp @@ -30,9 +30,10 @@ Kernel::Kernel() Kernel::~Kernel() = default; -void Kernel::setMinimizer(const std::string& minimizerName, const std::string& algorithmName) +void Kernel::setMinimizer(const std::string& minimizerName, const std::string& algorithmName, + const std::string& options) { - m_minimizer.reset(MinimizerFactory::createMinimizer(minimizerName, algorithmName)); + m_minimizer.reset(MinimizerFactory::createMinimizer(minimizerName, algorithmName, options)); } MinimizerResult Kernel::minimize(fcn_scalar_t fcn, const Parameters& parameters) diff --git a/Fit/NewKernel/Kernel.h b/Fit/NewKernel/Kernel.h index d79df2b2c076cf4ac3d3bf3a711f7c990399fd72..c2bc1c8419eb635301dd07b44547744a7179d056 100644 --- a/Fit/NewKernel/Kernel.h +++ b/Fit/NewKernel/Kernel.h @@ -36,7 +36,8 @@ public: Kernel(); ~Kernel(); - void setMinimizer(const std::string& minimizerName, const std::string& algorithmName = ""); + void setMinimizer(const std::string& minimizerName, const std::string& algorithmName = "", + const std::string& options = ""); MinimizerResult minimize(fcn_scalar_t fcn, const Parameters& parameters); diff --git a/Fit/NewKernel/Minimizer.cpp b/Fit/NewKernel/Minimizer.cpp index 6b2b915f7c993e300868e143e20300fb2380a8ea..38fa70e19dbc67a65b4687b1282382256668fc3a 100644 --- a/Fit/NewKernel/Minimizer.cpp +++ b/Fit/NewKernel/Minimizer.cpp @@ -23,6 +23,12 @@ Minimizer::Minimizer() } +void Minimizer::setMinimizer(const std::string& minimizerName, const std::string& algorithmName, + const std::string& options) +{ + m_kernel->setMinimizer(minimizerName, algorithmName, options); +} + Minimizer::~Minimizer() = default; MinimizerResult Minimizer::minimize(fcn_scalar_t fcn, diff --git a/Fit/NewKernel/Minimizer.h b/Fit/NewKernel/Minimizer.h index 86b2b0fe586ac43e6fb58bfde14acc8c3b333542..38cd64233f1e751a62287ad82d1b7ad808393c54 100644 --- a/Fit/NewKernel/Minimizer.h +++ b/Fit/NewKernel/Minimizer.h @@ -21,6 +21,7 @@ #include "MinimizerResult.h" #include <functional> #include <vector> +#include <string> #include <memory> namespace Fit { @@ -36,6 +37,9 @@ public: Minimizer(); ~Minimizer(); + void setMinimizer(const std::string& minimizerName, const std::string& algorithmName = "", + const std::string& options = ""); + MinimizerResult minimize(fcn_scalar_t fcn, const Parameters& parameters); private: diff --git a/Tests/Functional/Fit/Minimizer/MinimizerTest.cpp b/Tests/Functional/Fit/Minimizer/MinimizerTest.cpp index de429293bbd862c44e67b35e43cd638379e6998c..1afcffa91e14a07653e38ff4d69325d4dde16d1d 100644 --- a/Tests/Functional/Fit/Minimizer/MinimizerTest.cpp +++ b/Tests/Functional/Fit/Minimizer/MinimizerTest.cpp @@ -46,6 +46,7 @@ bool MinimizerTest::runTest() auto plan = plan_factory.create(m_fit_plan_name); Minimizer minimizer; + minimizer.setMinimizer(m_minimizer_name, m_algorithm_name); auto result = minimizer.minimize(plan->objectiveFunction(), plan->parameters()); std::cout << result.toString() << std::endl; @@ -60,7 +61,7 @@ namespace { bool checkResult(const Fit::MinimizerResult& result, const FunctionTestPlan& plan) { bool success(true); - std::cout << "MinimizerTest::checkResult()" << std::endl; + std::cout << "MinimizerTest::checkResult() -> " << plan.name() << std::endl; success &= plan.valuesAsExpected(result.parameters().values()); success &= plan.minimumAsExpected(result.minValue()); diff --git a/Tests/Functional/Fit/Minimizer/MinimizerTestCases.cpp b/Tests/Functional/Fit/Minimizer/MinimizerTestCases.cpp index 4ff544fbcd52e796170311ed1f927fa84bfdf384..66337bb055570ad2ce9c413a8ace93b251c3d176 100644 --- a/Tests/Functional/Fit/Minimizer/MinimizerTestCases.cpp +++ b/Tests/Functional/Fit/Minimizer/MinimizerTestCases.cpp @@ -14,6 +14,38 @@ #include "MinimizerTestCases.h" -MinuitTestV1::MinuitTestV1() : MinimizerTest("Minuit2", "Migrad", "RosenbrockPlan") {} +MinuitTestV1::MinuitTestV1() + : MinimizerTest("Minuit2", "Migrad", "RosenbrockPlan") {} -MinuitTestV2::MinuitTestV2() : MinimizerTest("Minuit2", "Migrad", "WoodFourPlan") {} +MinuitTestV2::MinuitTestV2() + : MinimizerTest("Minuit2", "Migrad", "WoodFourPlan") {} + +SteepestDescentTestV1::SteepestDescentTestV1() + : MinimizerTest("GSLMultiMin", "SteepestDescent", "RosenbrockPlan") {} + +SteepestDescentTestV2::SteepestDescentTestV2() + : MinimizerTest("GSLMultiMin", "SteepestDescent", "WoodFourPlan") {} + +ConjugateFRTestV1::ConjugateFRTestV1() + : MinimizerTest("GSLMultiMin", "ConjugateFR", "RosenbrockPlan") {} + +ConjugateFRTestV2::ConjugateFRTestV2() + : MinimizerTest("GSLMultiMin", "ConjugateFR", "WoodFourPlan") {} + +ConjugatePRTestV1::ConjugatePRTestV1() + : MinimizerTest("GSLMultiMin", "ConjugatePR", "RosenbrockPlan") {} + +ConjugatePRTestV2::ConjugatePRTestV2() + : MinimizerTest("GSLMultiMin", "ConjugatePR", "WoodFourPlan") {} + +BfgsTestV1::BfgsTestV1() + : MinimizerTest("GSLMultiMin", "BFGS", "RosenbrockPlan") {} + +BfgsTestV2::BfgsTestV2() + : MinimizerTest("GSLMultiMin", "BFGS", "WoodFourPlan") {} + +Bfgs2TestV1::Bfgs2TestV1() + : MinimizerTest("GSLMultiMin", "BFGS2", "RosenbrockPlan") {} + +Bfgs2TestV2::Bfgs2TestV2() + : MinimizerTest("GSLMultiMin", "BFGS2", "WoodFourPlan") {} diff --git a/Tests/Functional/Fit/Minimizer/MinimizerTestCases.h b/Tests/Functional/Fit/Minimizer/MinimizerTestCases.h index 75c1c6648a3b5b4a189f3d640fa7f1bfdfa143b2..c3f2af8a85a8900b022d1503d0cde380ae50215d 100644 --- a/Tests/Functional/Fit/Minimizer/MinimizerTestCases.h +++ b/Tests/Functional/Fit/Minimizer/MinimizerTestCases.h @@ -31,4 +31,64 @@ public: MinuitTestV2(); }; +class SteepestDescentTestV1 : public MinimizerTest +{ +public: + SteepestDescentTestV1(); +}; + +class SteepestDescentTestV2 : public MinimizerTest +{ +public: + SteepestDescentTestV2(); +}; + +class ConjugateFRTestV1 : public MinimizerTest +{ +public: + ConjugateFRTestV1(); +}; + +class ConjugateFRTestV2 : public MinimizerTest +{ +public: + ConjugateFRTestV2(); +}; + +class ConjugatePRTestV1 : public MinimizerTest +{ +public: + ConjugatePRTestV1(); +}; + +class ConjugatePRTestV2 : public MinimizerTest +{ +public: + ConjugatePRTestV2(); +}; + +class BfgsTestV1 : public MinimizerTest +{ +public: + BfgsTestV1(); +}; + +class BfgsTestV2 : public MinimizerTest +{ +public: + BfgsTestV2(); +}; + +class Bfgs2TestV1 : public MinimizerTest +{ +public: + Bfgs2TestV1(); +}; + +class Bfgs2TestV2 : public MinimizerTest +{ +public: + Bfgs2TestV2(); +}; + #endif // MINIMIZERTESTCASES_H diff --git a/Tests/Functional/Fit/Minimizer/MinimizerTestFactory.cpp b/Tests/Functional/Fit/Minimizer/MinimizerTestFactory.cpp index 61377e33af23e76e75be2284bfeb93b9ef00f59d..180374442dc54eb7a84e0c3339d03c8b08150a22 100644 --- a/Tests/Functional/Fit/Minimizer/MinimizerTestFactory.cpp +++ b/Tests/Functional/Fit/Minimizer/MinimizerTestFactory.cpp @@ -17,6 +17,34 @@ MinimizerTestFactory::MinimizerTestFactory() { - registerItem("MinuitTestV1", create_new<MinuitTestV1>, "Minuit + Migrad + Rosenbrock"); - registerItem("MinuitTestV2", create_new<MinuitTestV2>, "Minuit + Migrad + WoodFour"); + registerItem("MinuitTestV1", create_new<MinuitTestV1>, + "Minuit + Migrad + Rosenbrock"); + registerItem("MinuitTestV2", create_new<MinuitTestV2>, + "Minuit + Migrad + WoodFour"); + + registerItem("SteepestDescentTestV1", create_new<SteepestDescentTestV1>, + "GSLMultiMin + SteepestDescent + Rosenbrock"); + registerItem("SteepestDescentTestV2", create_new<SteepestDescentTestV2>, + "GSLMultiMin + SteepestDescent + WoodFour"); + + registerItem("ConjugateFRTestV1", create_new<ConjugateFRTestV1>, + "GSLMultiMin + ConjugateFR + Rosenbrock"); + registerItem("ConjugateFRTestV2", create_new<ConjugateFRTestV2>, + "GSLMultiMin + ConjugateFR + WoodFour"); + + registerItem("ConjugatePRTestV1", create_new<ConjugatePRTestV1>, + "GSLMultiMin + ConjugatePR + Rosenbrock"); + registerItem("ConjugatePRTestV2", create_new<ConjugatePRTestV2>, + "GSLMultiMin + ConjugatePR + WoodFour"); + + registerItem("BfgsTestV1", create_new<BfgsTestV1>, + "GSLMultiMin + BFGS + Rosenbrock"); + registerItem("BfgsTestV2", create_new<BfgsTestV2>, + "GSLMultiMin + BFGS + WoodFour"); + + registerItem("Bfgs2TestV1", create_new<Bfgs2TestV1>, + "GSLMultiMin + BFGS2 + Rosenbrock"); + registerItem("Bfgs2TestV2", create_new<Bfgs2TestV2>, + "GSLMultiMin + BFGS2 + WoodFour"); + }