Mantid
Loading...
Searching...
No Matches
SLSQPMinimizer.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2013 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
9#include "MantidKernel/DllConfig.h"
10#include "MantidKernel/Matrix.h"
11
12#include <vector>
13
14namespace Mantid {
15namespace Kernel {
16namespace Math {
43class MANTID_KERNEL_DLL SLSQPMinimizer {
44public:
54 template <typename T>
55 SLSQPMinimizer(const size_t nparams, const T &objfunc)
56 : m_nparams(nparams), m_neq(0), m_nineq(0), m_objfunc(objfunc), m_constraintNorms() {}
57
71 template <typename T>
72 SLSQPMinimizer(const size_t nparams, const T &objfunc, const DblMatrix &equality, const DblMatrix &inequality)
73 : m_nparams(nparams), m_neq(equality.numRows()), m_nineq(inequality.numRows()), m_objfunc(objfunc),
74 m_constraintNorms() {
75 initializeConstraints(equality, inequality);
76 }
77
79 SLSQPMinimizer() = delete;
80
82 SLSQPMinimizer(const SLSQPMinimizer &) = delete;
83
86
88 inline size_t numParameters() const { return m_nparams; }
90 inline size_t numEqualityConstraints() const { return m_neq; }
92 inline size_t numInequalityConstraints() const { return m_nineq; }
93
95 std::vector<double> minimize(const std::vector<double> &x0) const;
96
97private:
103 inline double fvalue(const std::vector<double> &x) const { return m_objfunc.eval(x); }
105 void fprime(std::vector<double> &grad, const std::vector<double> &x) const;
107 void evaluateConstraints(std::vector<double> &constrValues, const std::vector<double> &x) const;
108
110 void initializeConstraints(const DblMatrix &equality, const DblMatrix &inequality);
111
116 private:
118 public:
119 virtual ~BaseHolder() = default;
120 virtual double eval(const std::vector<double> &x) const = 0;
121 };
122 template <typename T> class TypeHolder : public BaseHolder {
123 public:
124 TypeHolder(const T &func) : func(func) {}
125 double eval(const std::vector<double> &x) const override { return func.eval(x); }
128 };
129
130 public:
132 template <typename T> FunctionWrapper(const T &func) : m_funcHolder(std::make_unique<TypeHolder<T>>(func)) {}
138 double eval(const std::vector<double> &x) const { return m_funcHolder->eval(x); }
140 std::unique_ptr<BaseHolder> m_funcHolder;
141 };
142
144 const size_t m_nparams;
146 const size_t m_neq;
148 const size_t m_nineq;
149
153 mutable std::vector<double> m_constraintNorms;
154};
155
156} // namespace Math
157} // namespace Kernel
158} // namespace Mantid
virtual double eval(const std::vector< double > &x) const =0
double eval(const std::vector< double > &x) const override
Non-templated wrapper for objective function object to allow it to be stored without templating the c...
double eval(const std::vector< double > &x) const
Calls user supplied function.
std::unique_ptr< BaseHolder > m_funcHolder
Templated holder.
Minimize an objective function using the SLSQP optimization subroutine originally implemented by Diet...
SLSQPMinimizer()=delete
Disable default constructor.
const size_t m_nineq
Number of inequality constraints.
SLSQPMinimizer & operator=(const SLSQPMinimizer &)=delete
Disable assignment operator.
const size_t m_neq
Number of equality constraints.
SLSQPMinimizer(const size_t nparams, const T &objfunc)
Constructor.
FunctionWrapper m_objfunc
User-defined function.
SLSQPMinimizer(const size_t nparams, const T &objfunc, const DblMatrix &equality, const DblMatrix &inequality)
Constructor with constraints.
const size_t m_nparams
Number of parameters under minimization.
SLSQPMinimizer(const SLSQPMinimizer &)=delete
Disable copy operator.
double fvalue(const std::vector< double > &x) const
Compute the value of the objective function.
std::vector< double > m_constraintNorms
Holder for constraint normals.
Helper class which provides the Collimation Length for SANS instruments.
STL namespace.