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 >
static_cast<Integer>(0) && FunOutDim >
static_cast<Integer>(0),
47 "Negative-dimensional function? Are you serious?");
52 using
InputType = typename std::conditional_t<ForceEigen || (FunInDim > 1), Eigen::Vector<Real, FunInDim>, Real>;
53 using
OutputType = typename std::conditional_t<ForceEigen || (FunOutDim > 1), Eigen::Vector<Real, FunOutDim>, Real>;
56 using
FirstDerivativeType = std::conditional_t<ForceEigen || (FunInDim > 1) || (FunOutDim > 1), Eigen::Matrix<Real, FunOutDim, FunInDim>, Real>;
58 std::conditional_t<FunInDim == 1 || FunOutDim == 1, Eigen::Matrix<Real, FunInDim, FunInDim>,
59 std::vector<Eigen::Matrix<Real, FunInDim, FunInDim>>>, Real>;
75 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->
name();};
84 static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
94 static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
104 static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
154 if constexpr (ForceEigen || FunInDim > 1) {
155 if((x - s).norm() < tol) {
return true;}
157 if (std::abs(x - s) < tol) {
return true;}
182 template <
typename Real, Integer N, Integer M,
typename DerivedFunction,
bool ForceEigen = false>
189 static_assert(N !=
static_cast<Integer>(0) && M !=
static_cast<Integer>(0),
190 "Are you sure you want to a zero-dimensional system of equations?");
209 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
218 static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
228 static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
238 static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
252 template <
typename Real, Integer N,
typename DerivedFunction>
260 "Are you sure you want to a zero-dimensional system of equations?");
278 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
287 static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
297 static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
307 static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
320 template <
typename Real,
typename DerivedFunction>
335 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->name_impl();}
344 static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
354 static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
364 static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
#define OPTIMIST_BASIC_CONSTANTS(Real)
Definition Optimist.hh:70
Function()
Definition Function.hh:329
void first_derivative(Real x, Real &out) const
Definition Function.hh:352
void second_derivative(Real x, Real &out) const
Definition Function.hh:362
void evaluate(Real x, Real &out) const
Definition Function.hh:342
std::string name() const
Definition Function.hh:335
typename FunctionBase< Real, N, 1, DerivedFunction >::InputType Vector
Definition Function.hh:263
Function()
Definition Function.hh:272
typename FunctionBase< Real, N, 1, DerivedFunction >::FirstDerivativeType RowVector
Definition Function.hh:266
void evaluate(const Vector &x, Vector &out) const
Definition Function.hh:285
void gradient(const Vector &x, RowVector &out) const
Definition Function.hh:295
typename FunctionBase< Real, N, 1, DerivedFunction >::SecondDerivativeType Matrix
Definition Function.hh:267
std::string name() const
Definition Function.hh:278
typename std::conditional_t< ForceEigen||(FunOutDim > 1), Eigen::Vector< Real, FunOutDim >, Real > OutputType
Definition Function.hh:53
const InputType & guess(const Integer i) const
Definition Function.hh:143
const std::vector< InputType > & solutions() const
Definition Function.hh:123
void second_derivative(const InputType &x, SecondDerivativeType &out) const
Definition Function.hh:102
bool is_solution(const InputType &x, const Real tol=EPSILON_LOW) const
Definition Function.hh:151
FunctionBase()
Definition Function.hh:69
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:57
std::vector< InputType > m_guesses
Definition Function.hh:63
std::conditional_t< ForceEigen||(FunInDim > 1)||(FunOutDim > 1), Eigen::Matrix< Real, FunOutDim, FunInDim >, Real > FirstDerivativeType
Definition Function.hh:56
std::vector< InputType > m_solutions
Definition Function.hh:62
typename std::conditional_t< ForceEigen||(FunInDim > 1), Eigen::Vector< Real, FunInDim >, Real > InputType
Definition Function.hh:52
std::string name() const
Definition Function.hh:75
const InputType & solution(const Integer i) const
Definition Function.hh:136
const std::vector< InputType > & guesses() const
Definition Function.hh:129
constexpr Integer input_dimension() const
Definition Function.hh:111
void first_derivative(const InputType &x, FirstDerivativeType &out) const
Definition Function.hh:92
constexpr Integer output_dimension() const
Definition Function.hh:117
void evaluate(const InputType &x, OutputType &out) const
Definition Function.hh:82
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::OutputType OutputVector
Definition Function.hh:194
std::string name() const
Definition Function.hh:209
void evaluate(const InputVector &x, OutputVector &out) const
Definition Function.hh:216
void jacobian(const InputVector &x, Matrix &out) const
Definition Function.hh:226
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::InputType InputVector
Definition Function.hh:193
void hessian(const InputVector &x, Tensor &out) const
Definition Function.hh:236
Function()
Definition Function.hh:203
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::FirstDerivativeType Matrix
Definition Function.hh:197
typename FunctionBase< Real, N, M, DerivedFunction, ForceEigen >::SecondDerivativeType Tensor
Definition Function.hh:198
Namespace for the Optimist library.
Definition Optimist.hh:87
OPTIMIST_DEFAULT_INTEGER_TYPE Integer
The Integer type as used for the API.
Definition Optimist.hh:95