13#ifndef OPTIMIST_FUNCTION_HH
14#define OPTIMIST_FUNCTION_HH
31 template <
typename Real, Integer FunInDim, Integer FunOutDim,
typename DerivedFunction>
36 static_assert(FunInDim >
static_cast<Integer>(0) && FunOutDim >
static_cast<Integer>(0),
37 "Negative-dimensional function? Are you serious?");
42 using
InputType = typename std::conditional_t<FunInDim == 1, Real, Eigen::Vector<Real, FunInDim>>;
43 using
OutputType = typename std::conditional_t<FunOutDim == 1, Real, Eigen::Vector<Real, FunOutDim>>;
46 using
FirstDerivativeType = std::conditional_t<FunInDim == 1 && FunOutDim == 1, Real, Eigen::Matrix<Real, FunOutDim, FunInDim>>;
48 std::conditional_t<FunInDim == 1 || FunOutDim == 1, Eigen::Matrix<Real, FunInDim, FunInDim>,
49 std::vector<Eigen::Matrix<Real, FunInDim, FunInDim>>>>;
65 std::string
name()
const {
return static_cast<const DerivedFunction *
>(
this)->
name();};
74 static_cast<const DerivedFunction *
>(
this)->evaluate_impl(x, out);
84 static_cast<const DerivedFunction *
>(
this)->first_derivative_impl(x, out);
94 static_cast<const DerivedFunction *
>(
this)->second_derivative_impl(x, out);
144 if constexpr (FunInDim == 1) {
145 if (std::abs(x - s) < tol) {
return true;}
146 }
else if constexpr (FunInDim > 1) {
147 if((x - s).norm() < tol) {
return true;}
149 OPTIMIST_ERROR(
"Optimist::Function::is_solution(...): invalid input dimension.");
#define OPTIMIST_ERROR(MSG)
Definition Optimist.hh:33
#define OPTIMIST_BASIC_CONSTANTS(Real)
Definition Optimist.hh:70
bool is_solution(const InputType &x, const Real tol=EPSILON_LOW) const
Definition Function.hh:141
const InputType & guess(const Integer i) const
Definition Function.hh:133
std::conditional_t< FunInDim==1 &&FunOutDim==1, Real, std::conditional_t< FunInDim==1||FunOutDim==1, Eigen::Matrix< Real, FunInDim, FunInDim >, std::vector< Eigen::Matrix< Real, FunInDim, FunInDim > > > > SecondDerivativeType
Definition Function.hh:47
const std::vector< InputType > & solutions() const
Definition Function.hh:113
const std::vector< InputType > & guesses() const
Definition Function.hh:119
const InputType & solution(const Integer i) const
Definition Function.hh:126
std::vector< InputType > m_solutions
Definition Function.hh:52
typename std::conditional_t< FunInDim==1, Real, Eigen::Vector< Real, FunInDim > > InputType
Definition Function.hh:42
void second_derivative(const InputType &x, SecondDerivativeType &out) const
Definition Function.hh:92
void first_derivative(const InputType &x, FirstDerivativeType &out) const
Definition Function.hh:82
constexpr Integer input_dimension() const
Definition Function.hh:101
std::conditional_t< FunInDim==1 &&FunOutDim==1, Real, Eigen::Matrix< Real, FunOutDim, FunInDim > > FirstDerivativeType
Definition Function.hh:46
std::vector< InputType > m_guesses
Definition Function.hh:53
Function()
Definition Function.hh:59
void evaluate(const InputType &x, OutputType &out) const
Definition Function.hh:72
constexpr Integer output_dimension() const
Definition Function.hh:107
std::string name() const
Definition Function.hh:65
typename std::conditional_t< FunOutDim==1, Real, Eigen::Vector< Real, FunOutDim > > OutputType
Definition Function.hh:43
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