diff --git a/GUI/Model/Fit/MinimizerItem.cpp b/GUI/Model/Fit/MinimizerItem.cpp index 284db396da020a405821a10a8e74fbbaf006a523..2a531e4b71a1e5489995e5204310e270e0354831 100644 --- a/GUI/Model/Fit/MinimizerItem.cpp +++ b/GUI/Model/Fit/MinimizerItem.cpp @@ -68,6 +68,21 @@ MinimizerContainerItem::MinimizerContainerItem() : MinimizerItem(M_TYPE) "experimental data."); } +SelectionDescriptor<MinimizerItem*> MinimizerContainerItem::minimizers() const +{ + return SelectionDescriptor<MinimizerItem*>(item<GroupItem>(P_MINIMIZERS)); +} + +SelectionDescriptor<QString> MinimizerContainerItem::normFunction() const +{ + return SelectionDescriptor<QString>(getItem(P_NORM)); +} + +SelectionDescriptor<QString> MinimizerContainerItem::objectiveMetric() const +{ + return SelectionDescriptor<QString>(getItem(P_METRIC)); +} + std::unique_ptr<IMinimizer> MinimizerContainerItem::createMinimizer() const { return groupItem<MinimizerItem>(P_MINIMIZERS).createMinimizer(); @@ -116,6 +131,18 @@ std::unique_ptr<IMinimizer> MinuitMinimizerItem::createMinimizer() const return std::unique_ptr<IMinimizer>(domainMinimizer); } +ValueDescriptors MinuitMinimizerItem::valueDescriptorsForUI() const +{ + return { + SelectionDescriptor<QString>(getItem(P_ALGORITHMS)), + UIntDescriptor(getItem(P_STRATEGY), Unit::unitless), + DoubleDescriptor(getItem(P_ERRORDEF), Unit::unitless), + DoubleDescriptor(getItem(P_TOLERANCE), Unit::unitless), + DoubleDescriptor(getItem(P_PRECISION), Unit::unitless), + UIntDescriptor(getItem(P_MAXFUNCTIONCALLS), Unit::unitless), + }; +} + // ---------------------------------------------------------------------------- GSLMultiMinimizerItem::GSLMultiMinimizerItem() : MinimizerItem(M_TYPE) @@ -133,6 +160,14 @@ std::unique_ptr<IMinimizer> GSLMultiMinimizerItem::createMinimizer() const return std::unique_ptr<IMinimizer>(domainMinimizer); } +ValueDescriptors GSLMultiMinimizerItem::valueDescriptorsForUI() const +{ + return { + SelectionDescriptor<QString>(getItem(P_ALGORITHMS)), + UIntDescriptor(getItem(P_MAXITERATIONS), Unit::unitless), + }; +} + // ---------------------------------------------------------------------------- GeneticMinimizerItem::GeneticMinimizerItem() : MinimizerItem(M_TYPE) @@ -153,6 +188,16 @@ std::unique_ptr<IMinimizer> GeneticMinimizerItem::createMinimizer() const return std::unique_ptr<IMinimizer>(domainMinimizer); } +ValueDescriptors GeneticMinimizerItem::valueDescriptorsForUI() const +{ + return { + DoubleDescriptor(getItem(P_TOLERANCE), Unit::unitless), + UIntDescriptor(getItem(P_MAXITERATIONS), Unit::unitless), + UIntDescriptor(getItem(P_POPULATIONSIZE), Unit::unitless), + UIntDescriptor(getItem(P_RANDOMSEED), Unit::unitless), + }; +} + // ---------------------------------------------------------------------------- SimAnMinimizerItem::SimAnMinimizerItem() : MinimizerItem(M_TYPE) @@ -179,6 +224,19 @@ std::unique_ptr<IMinimizer> SimAnMinimizerItem::createMinimizer() const return std::unique_ptr<IMinimizer>(domainMinimizer); } +ValueDescriptors SimAnMinimizerItem::valueDescriptorsForUI() const +{ + return { + UIntDescriptor(getItem(P_MAXITERATIONS), Unit::unitless), + UIntDescriptor(getItem(P_ITERATIONSTEMP), Unit::unitless), + DoubleDescriptor(getItem(P_STEPSIZE), Unit::unitless), + DoubleDescriptor(getItem(P_BOLTZMANN_K), Unit::unitless), + DoubleDescriptor(getItem(P_BOLTZMANN_TINIT), Unit::unitless), + DoubleDescriptor(getItem(P_BOLTZMANN_MU), Unit::unitless), + DoubleDescriptor(getItem(P_BOLTZMANN_TMIN), Unit::unitless), + }; +} + // ---------------------------------------------------------------------------- GSLLMAMinimizerItem::GSLLMAMinimizerItem() : MinimizerItem(M_TYPE) @@ -195,6 +253,14 @@ std::unique_ptr<IMinimizer> GSLLMAMinimizerItem::createMinimizer() const return std::unique_ptr<IMinimizer>(domainMinimizer); } +ValueDescriptors GSLLMAMinimizerItem::valueDescriptorsForUI() const +{ + return { + DoubleDescriptor(getItem(P_TOLERANCE), Unit::unitless), + UIntDescriptor(getItem(P_MAXITERATIONS), Unit::unitless), + }; +} + // ---------------------------------------------------------------------------- TestMinimizerItem::TestMinimizerItem() : MinimizerItem(M_TYPE) {} diff --git a/GUI/Model/Fit/MinimizerItem.h b/GUI/Model/Fit/MinimizerItem.h index 2eb74b3af68ab8d7333fd1d3707a93058485cc82..e808027564785af09ed3c6f35121daf517bc1707 100644 --- a/GUI/Model/Fit/MinimizerItem.h +++ b/GUI/Model/Fit/MinimizerItem.h @@ -15,17 +15,26 @@ #ifndef BORNAGAIN_GUI_MODEL_FIT_MINIMIZERITEM_H #define BORNAGAIN_GUI_MODEL_FIT_MINIMIZERITEM_H +#include "GUI/Model/Group/SelectionDescriptor.h" #include "GUI/Model/Session/SessionItem.h" +#include "GUI/Model/Types/DoubleDescriptor.h" +#include "GUI/Model/Types/UIntDescriptor.h" +#include <variant> class IMinimizer; class ObjectiveMetric; +using ValueDescriptors = + QList<std::variant<DoubleDescriptor, UIntDescriptor, SelectionDescriptor<QString>>>; + //! The MinimizerItem class is the base item to hold minimizer settings. class BA_CORE_API_ MinimizerItem : public SessionItem { public: virtual std::unique_ptr<IMinimizer> createMinimizer() const = 0; + virtual ValueDescriptors valueDescriptorsForUI() const { return {}; } + protected: explicit MinimizerItem(const QString& model_type); }; @@ -43,6 +52,10 @@ public: MinimizerContainerItem(); + SelectionDescriptor<MinimizerItem*> minimizers() const; + SelectionDescriptor<QString> normFunction() const; + SelectionDescriptor<QString> objectiveMetric() const; + std::unique_ptr<IMinimizer> createMinimizer() const override; std::unique_ptr<ObjectiveMetric> createMetric() const; }; @@ -63,6 +76,7 @@ public: MinuitMinimizerItem(); std::unique_ptr<IMinimizer> createMinimizer() const override; + ValueDescriptors valueDescriptorsForUI() const override; }; //! The GSLMinimizerItem class represents settings for GSL MultiMin minimizer family. @@ -77,6 +91,7 @@ public: GSLMultiMinimizerItem(); std::unique_ptr<IMinimizer> createMinimizer() const override; + ValueDescriptors valueDescriptorsForUI() const override; }; //! The GeneticMinimizerItem class represents settings for TMVA/Genetic minimizer. @@ -93,6 +108,7 @@ public: GeneticMinimizerItem(); std::unique_ptr<IMinimizer> createMinimizer() const override; + ValueDescriptors valueDescriptorsForUI() const override; }; //! The SimAnMinimizerItem class represents settings for GSL's simulated annealing minimizer. @@ -113,6 +129,7 @@ public: SimAnMinimizerItem(); std::unique_ptr<IMinimizer> createMinimizer() const override; + ValueDescriptors valueDescriptorsForUI() const override; }; //! The GSLLMAMinimizerItem class represents settings for GSL's version of Levenberg-Marquardt. @@ -127,6 +144,7 @@ public: GSLLMAMinimizerItem(); std::unique_ptr<IMinimizer> createMinimizer() const override; + ValueDescriptors valueDescriptorsForUI() const override; }; //! The TestMinimizerItem class represents domain's TestMinimizer to test whole chain