13#ifndef OPTIMIST_FUNCTION_HH
14#define OPTIMIST_FUNCTION_HH
41 template <
typename Real, Integer FunInDim, Integer FunOutDim,
typename DerivedFunction,
bool ForceEigen = false>
46 static_assert(FunInDim > 0 && FunOutDim > 0,
47 "Negative-dimensional function? Are you serious?");
52 using
InputType = typename std::conditional_t<ForceEigen || (FunInDim > 1),
53 Eigen::Vector<Real, FunInDim>, Real>;
54 using
OutputType = typename std::conditional_t<ForceEigen || (FunOutDim > 1),
55 Eigen::Vector<Real, FunOutDim>, Real>;
59 Eigen::Matrix<Real, FunOutDim, FunInDim>, Real>;
61 std::conditional_t<FunInDim == 1 || FunOutDim == 1, Eigen::Matrix<Real, FunInDim, FunInDim>,
62 std::vector<Eigen::Matrix<Real, FunInDim, FunInDim>>>, Real>;
78 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->
name();};
88 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
99 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
110 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
160 if constexpr (ForceEigen || FunInDim > 1) {
161 if((x - s).norm() < tol) {
return true;}
163 if (std::abs(x - s) < tol) {
return true;}
188 template <
typename Real, Integer N, Integer M,
typename DerivedFunction,
bool ForceEigen = false>
195 static_assert(N != 0 && M != 0,
196 "Are you sure you want to a zero-dimensional system of equations?");
215 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
225 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
236 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
247 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
261 template <
typename Real, Integer N,
typename DerivedFunction>
268 static_assert(N != 0,
269 "Are you sure you want to a zero-dimensional system of equations?");
287 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
297 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
308 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
319 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
332 template <
typename Real,
typename DerivedFunction>
347 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
357 return static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
368 return static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
379 return static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
#define OPTIMIST_BASIC_CONSTANTS(Real)
Definition Optimist.hh:71
bool second_derivative(Real x, Real &out) const
Definition Function.hh:377
Function()
Definition Function.hh:341
bool first_derivative(Real x, Real &out) const
Definition Function.hh:366
bool evaluate(Real x, Real &out) const
Definition Function.hh:355
std::string name() const
Definition Function.hh:347
typename FunctionBase< Real, N, 1, DerivedFunction >::InputType Vector
Definition Function.hh:272
bool gradient(Vector const &x, RowVector &out) const
Definition Function.hh:306
Function()
Definition Function.hh:281
typename FunctionBase< Real, N, 1, DerivedFunction >::FirstDerivativeType RowVector
Definition Function.hh:275
bool evaluate(Vector const &x, Vector &out) const
Definition Function.hh:295
typename FunctionBase< Real, N, 1, DerivedFunction >::SecondDerivativeType Matrix
Definition Function.hh:276
std::string name() const
Definition Function.hh:287
const InputType & guess(Integer const i) const
Definition Function.hh:149
const std::vector< InputType > & solutions() const
Definition Function.hh:129
FunctionBase()
Definition Function.hh:72
std::conditional_t< ForceEigen||(FunInDim > 1)||(FunOutDim > 1), std::conditional_t< FunInDim==1||FunOutDim==1, Eigen::Matrix< Real, FunInDim, FunInDim >, std::vector< Eigen::Matrix< Real, FunInDim, FunInDim > > >, Real > SecondDerivativeType
Definition Function.hh:60
std::vector< InputType > m_guesses
Definition Function.hh:66
bool second_derivative(const InputType &x, SecondDerivativeType &out) const
Definition Function.hh:108
std::vector< InputType > m_solutions
Definition Function.hh:65
typename std::conditional_t< ForceEigen||(FunInDim > 1), Eigen::Vector< Real, FunInDim >, Real > InputType
Definition Function.hh:52
std::string name() const
Definition Function.hh:78
std::conditional_t< ForceEigen||(FunInDim > 1)||(FunOutDim > 1), Eigen::Matrix< Real, FunOutDim, FunInDim >, Real > FirstDerivativeType
Definition Function.hh:58
bool first_derivative(const InputType &x, FirstDerivativeType &out) const
Definition Function.hh:97
const std::vector< InputType > & guesses() const
Definition Function.hh:135
typename std::conditional_t< ForceEigen||(FunOutDim > 1), Eigen::Vector< Real, FunOutDim >, Real > OutputType
Definition Function.hh:54
constexpr Integer input_dimension() const
Definition Function.hh:117
const InputType & solution(Integer const i) const
Definition Function.hh:142
bool is_solution(const InputType &x, Real const tol=EPSILON_LOW) const
Definition Function.hh:157
constexpr Integer output_dimension() const
Definition Function.hh:123
bool evaluate(const InputType &x, OutputType &out) const
Definition Function.hh:86
bool jacobian(const InputVector &x, Matrix &out) const
Definition Function.hh:234
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::OutputType OutputVector
Definition Function.hh:200
bool evaluate(const InputVector &x, OutputVector &out) const
Definition Function.hh:223
std::string name() const
Definition Function.hh:215
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::InputType InputVector
Definition Function.hh:199
bool hessian(const InputVector &x, Tensor &out) const
Definition Function.hh:245
Function()
Definition Function.hh:209
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::FirstDerivativeType Matrix
Definition Function.hh:203
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::SecondDerivativeType Tensor
Definition Function.hh:204
Namespace for the Optimist library.
Definition Optimist.hh:88
OPTIMIST_DEFAULT_INTEGER_TYPE Integer
The Integer type as used for the API.
Definition Optimist.hh:96