13#ifndef OPTIMIST_FUNCTION_HH
14#define OPTIMIST_FUNCTION_HH
36 template <
typename Input,
typename Output,
typename DerivedFunction>
37 requires std::is_same<typename TypeTrait<Input>::Scalar,
38 typename TypeTrait<Output>::Scalar>::value &&
39 (TypeTrait<Input>::IsScalar || TypeTrait<Input>::IsEigen) &&
40 (TypeTrait<Output>::IsScalar || TypeTrait<Output>::IsEigen) &&
41 (!TypeTrait<Input>::IsFixed || TypeTrait<Input>::Dimension > 0) &&
42 (!TypeTrait<Output>::IsFixed ||
43 TypeTrait<Output>::Dimension > 0) &&
44 (!(TypeTrait<Input>::IsEigen && TypeTrait<Output>::IsEigen) ||
45 (TypeTrait<Input>::IsFixed && TypeTrait<Output>::IsFixed) ||
46 (TypeTrait<Input>::IsDynamic && TypeTrait<Output>::IsDynamic) ||
47 (TypeTrait<Input>::IsSparse && TypeTrait<Output>::IsSparse))
53 using Scalar =
typename InputTrait::Scalar;
57 InputTrait::IsEigen || OutputTrait::IsEigen,
58 std::conditional_t<InputTrait::IsSparse || OutputTrait::IsSparse,
59 Eigen::SparseMatrix<Scalar>,
61 OutputTrait::Dimension,
62 InputTrait::Dimension>>,
65 InputTrait::IsEigen || OutputTrait::IsEigen,
66 std::conditional_t<InputTrait::IsSparse || OutputTrait::IsSparse,
67 std::vector<Eigen::SparseMatrix<Scalar>>,
68 std::vector<Eigen::Matrix<
Scalar,
69 OutputTrait::Dimension,
70 InputTrait::Dimension>>>,
91 constexpr std::string
name()
const {
92 return static_cast<const DerivedFunction *
>(
this)->
name();
102 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
112 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(
124 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(
134 return InputTrait::Dimension;
142 return OutputTrait::Dimension;
186 const Scalar tol = FunctionBase::SQRT_EPSILON)
const {
188 if constexpr (InputTrait::IsEigen) {
189 if ((x - s).norm() < tol) {
193 if (std::abs(x - s) < tol) {
220 template <
typename Input,
typename Output,
typename DerivedFunction>
223 friend class FunctionBase<Input, Output, DerivedFunction>;
240 constexpr std::string
name()
const {
241 return static_cast<const DerivedFunction *
>(
this)->name_impl();
251 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
261 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(
273 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(
290 template <
typename T,
typename DerivedFunction>
291 requires(TypeTrait<T>::IsScalar || TypeTrait<T>::IsEigen) &&
292 (!TypeTrait<T>::IsFixed || TypeTrait<T>::Dimension > 0)
314 constexpr std::string
name()
const {
315 return static_cast<const DerivedFunction *
>(
this)->name_impl();
325 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
335 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(
347 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(
#define OPTIMIST_BASIC_CONSTANTS(Scalar)
Definition Optimist.hh:69
constexpr std::string name() const
Definition Function.hh:314
Function()
Definition Function.hh:309
bool gradient(const Input &x, FirstDerivative &out) const
Definition Function.hh:334
T Input
Definition Function.hh:300
bool evaluate(const Input &x, Output &out) const
Definition Function.hh:324
bool hessian(const Input &x, SecondDerivative &out) const
Definition Function.hh:346
T Output
Definition Function.hh:301
typename TypeTrait< T >::Scalar Scalar
Definition Function.hh:299
bool second_derivative(const Input &x, SecondDerivative &out) const
Definition Function.hh:123
typename InputTrait::Scalar Scalar
Definition Function.hh:53
bool evaluate(const Input &x, Output &out) const
Definition Function.hh:101
constexpr std::string name() const
Definition Function.hh:91
bool first_derivative(const Input &x, FirstDerivative &out) const
Definition Function.hh:111
const Input & guess(const Integer i) const
Definition Function.hh:175
const std::vector< Input > & guesses() const
Definition Function.hh:157
std::conditional_t< InputTrait::IsEigen||OutputTrait::IsEigen, std::conditional_t< InputTrait::IsSparse||OutputTrait::IsSparse, std::vector< Eigen::SparseMatrix< Scalar > >, std::vector< Eigen::Matrix< Scalar, OutputTrait::Dimension, InputTrait::Dimension > > >, Scalar > SecondDerivative
Definition Function.hh:64
std::vector< Input > m_guesses
Definition Function.hh:79
std::vector< Input > m_solutions
Definition Function.hh:77
TypeTrait< Input > InputTrait
Definition Function.hh:51
bool is_solution(const Input &x, const Scalar tol=FunctionBase::SQRT_EPSILON) const
Definition Function.hh:185
const std::vector< Input > & solutions() const
Definition Function.hh:149
std::conditional_t< InputTrait::IsEigen||OutputTrait::IsEigen, std::conditional_t< InputTrait::IsSparse||OutputTrait::IsSparse, Eigen::SparseMatrix< Scalar >, Eigen::Matrix< Scalar, OutputTrait::Dimension, InputTrait::Dimension > >, Scalar > FirstDerivative
Definition Function.hh:56
const Input & solution(const Integer i) const
Definition Function.hh:166
TypeTrait< Output > OutputTrait
Definition Function.hh:52
FunctionBase()
Definition Function.hh:85
constexpr Integer input_dimension() const
Definition Function.hh:133
constexpr Integer output_dimension() const
Definition Function.hh:141
bool hessian(const Input &x, SecondDerivative &out) const
Definition Function.hh:272
bool jacobian(const Input &x, FirstDerivative &out) const
Definition Function.hh:260
Function()
Definition Function.hh:234
bool evaluate(const Input &x, Output &out) const
Definition Function.hh:250
constexpr std::string name() const
Definition Function.hh:240
Namespace for the Optimist library.
Definition Optimist.hh:89
OPTIMIST_DEFAULT_INTEGER_TYPE Integer
The Integer type as used for the API.
Definition Optimist.hh:97
Definition Optimist.hh:113