File: MinimizerAdapter.h

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (124 lines) | stat: -rw-r--r-- 4,226 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//  ************************************************************************************************
//
//  BornAgain: simulate and fit reflection and scattering
//
//! @file      Fit/Adapter/MinimizerAdapter.h
//! @brief     Declares class MinimizerAdapter.
//!
//! @homepage  http://www.bornagainproject.org
//! @license   GNU General Public License v3 or higher (see COPYING)
//! @copyright Forschungszentrum Jülich GmbH 2018
//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
//
//  ************************************************************************************************

#ifdef SWIG
#error no need to expose this header to Swig
#endif // SWIG
#ifndef BORNAGAIN_FIT_ADAPTER_MINIMIZERADAPTER_H
#define BORNAGAIN_FIT_ADAPTER_MINIMIZERADAPTER_H

#include "Fit/Minimizer/IMinimizer.h"
#include "Fit/Minimizer/MinimizerInfo.h"
#include "Fit/Option/MinimizerOptions.h"
#include <memory>
#include <string>

namespace mumufit {
class MinimizerResult;
class ObjectiveFunctionAdapter;
class Parameter;
class Parameters;
} // namespace mumufit

namespace ROOT::Math {
class Minimizer;
}

//! Abstract base class that adapts the CERN ROOT minimizer to our IMinimizer.

class MinimizerAdapter : public IMinimizer {
public:
    using root_minimizer_t = ROOT::Math::Minimizer;

    ~MinimizerAdapter() override;

    mumufit::MinimizerResult minimize_scalar(fcn_scalar_t fcn,
                                             mumufit::Parameters parameters) override;
    mumufit::MinimizerResult minimize_residual(fcn_residual_t fcn,
                                               mumufit::Parameters parameters) override;

    //! Returns name of the minimizer.
    std::string minimizerName() const override;

    //! Returns name of the minimization algorithm.
    std::string algorithmName() const override;

    void setParameters(const mumufit::Parameters& parameters);

    double minValue() const override;

    MinimizerOptions& options() { return m_options; }
    const MinimizerOptions& options() const { return m_options; }

    //! Returns string representation of current minimizer status.
    virtual std::string statusToString() const;

    //! Returns true if minimizer provides error and error matrix
    bool providesError() const;

    //! Returns map of string representing different minimizer statuses
    virtual std::map<std::string, std::string> statusMap() const;

    //! Sets option string to the minimizer
    void setOptions(const std::string& optionString) override;

protected:
    explicit MinimizerAdapter(const MinimizerInfo& minimizerInfo);

    mumufit::MinimizerResult minimize(mumufit::Parameters parameters);

    void propagateResults(mumufit::Parameters& parameters);

    virtual void setParameter(unsigned int index, const mumufit::Parameter& par);
    size_t fitRank() const;
    std::vector<double> parValuesAtMinimum() const;
    std::vector<double> parErrorsAtMinimum() const;

    virtual void propagateOptions() = 0;
    virtual const root_minimizer_t* rootMinimizer() const = 0;
    root_minimizer_t* rootMinimizer();

    template <typename T>
    OptionContainer::option_t addOption(const std::string& optionName, T value,
                                        const std::string& description = "");

    template <typename T> void setOptionValue(const std::string& optionName, T value);

    template <typename T> T optionValue(const std::string& optionName) const;

private:
    MinimizerOptions m_options;
    MinimizerInfo m_minimizer_info;
    std::unique_ptr<mumufit::ObjectiveFunctionAdapter> m_adapter;
    bool m_status;
};

template <typename T>
OptionContainer::option_t MinimizerAdapter::addOption(const std::string& optionName, T value,
                                                      const std::string& description)
{
    return m_options.addOption(optionName, value, description);
}

template <typename T> void MinimizerAdapter::setOptionValue(const std::string& optionName, T value)
{
    m_options.setOptionValue(optionName, value);
}

template <typename T> T MinimizerAdapter::optionValue(const std::string& optionName) const
{
    return m_options.optionValue<T>(optionName);
}

#endif // BORNAGAIN_FIT_ADAPTER_MINIMIZERADAPTER_H