1#ifndef __JMATH__JMATHLIB__
2#define __JMATH__JMATHLIB__
19namespace JPP {
using namespace JMATH; }
30 template<
class JF1_t,
size_t N>
42 template<
typename U,
typename V,
typename W,
size_t ...i>
44 const std::index_sequence<i...>& ls,
45 double W::* parameter)
47 return {parameters[i]..., parameter};
58 template<
typename U,
typename V,
size_t N,
typename W>
60 double W::* parameter)
62 return join<U>(parameters, std::make_index_sequence<N>{}, parameter);
75 template<
typename U,
typename V,
typename W,
size_t ...iv,
size_t ...iw>
77 const std::index_sequence<iv...>& lv,
79 const std::index_sequence<iw...>& lw)
81 return {v[iv]..., w[iw]... };
92 template<
typename U,
typename V,
size_t NV,
typename W,
size_t NW>
96 return join<U>(v, std::make_index_sequence<NV>{},
97 w, std::make_index_sequence<NW>{});
108 template<
typename U,
typename V,
size_t ...i>
110 const std::index_sequence<i...>& ls)
112 return {parameters[i]...};
122 template<
typename U,
typename V,
size_t N>
125 return convert<U>(parameters, std::make_index_sequence<N>{});
134 template<
class JF1_t>
137 return JF1_t::parameters.size();
147 template<
class JF1_t>
150 if (f1 != NULL && values != NULL) {
152 (*f1)[i] = values[i];
161 template<
class JF1_t>
171 for (
const auto& i : JF1_t::parameters) {
172 static_cast<JF1_t&
>(*this).*i = -(
static_cast<JF1_t&
>(*this).*i);
175 return static_cast<JF1_t&
>(*this);
185 JF1_t&
add(
const JF1_t& f1)
187 for (
const auto& i : JF1_t::parameters) {
188 static_cast<JF1_t&
>(*this).*i += f1.*i;
191 return static_cast<JF1_t&
>(*this);
201 JF1_t&
sub(
const JF1_t& f1)
203 for (
const auto& i : JF1_t::parameters) {
204 static_cast<JF1_t&
>(*this).*i -= f1.*i;
207 return static_cast<JF1_t&
>(*this);
217 JF1_t&
mul(
const double factor)
219 for (
const auto& i : JF1_t::parameters) {
220 static_cast<JF1_t&
>(*this).*i *= factor;
223 return static_cast<JF1_t&
>(*this);
233 JF1_t&
div(
const double factor)
235 for (
const auto& i : JF1_t::parameters) {
236 static_cast<JF1_t&
>(*this).*i /= factor;
239 return static_cast<JF1_t&
>(*this);
250 friend JF1_t&
operator+=(JF1_t& function,
const JF1_t& value)
252 return function.add(value);
263 friend JF1_t&
operator-=(JF1_t& function,
const JF1_t& value)
265 return function.sub(value);
276 friend JF1_t&
operator*=(JF1_t& function,
const double factor)
278 return function.mul(factor);
289 friend JF1_t&
operator/=(JF1_t& function,
const double factor)
291 return function.div(factor);
296 template<
class JF1_t>
299 template<
class JF1_t,
class JF2_t =
double>
302 template<
class JF1_t,
class JF2_t =
double>
305 template<
class JF1_t,
class JF2_t =
double>
308 template<
class JF1_t,
class JF2_t =
double>
311 template<
class JF1_t>
314 template<
class JF1_t =
void>
322 template<
class JF1_t>
330 template<
class ...Args>
333 return static_cast<const JF1_t&
>(*this).getValue(args...);
459 template<
class JF2_t>
473 template<
class JF2_t>
487 template<
class JF2_t>
501 template<
class JF2_t>
541 return static_cast<const JF1_t&
>(*this).*JF1_t::parameters[i];
553 return static_cast<JF1_t&
>(*this).*JF1_t::parameters[i];
561 template<
class JF1_t>
593 template<
class ...Args>
596 return -
static_cast<const JF1_t&
>(*this).getValue(args...);
608 return -
static_cast<const JF1_t&
>(*this).getDerivative(x);
618 template<
class ...Args>
623 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
624 static_cast<JF1_t&
>(gradient).negate();
634 template<
class JF1_t>
636 public JMathlib< JAdd<JF1_t, double> >,
656 JAdd(
const JF1_t& f1,
const double value) :
668 template<
class ...Args>
671 return static_cast<const JF1_t&
>(*this).getValue(args...) + value;
683 return static_cast<const JF1_t&
>(*this).getDerivative(x);
693 template<
class ...Args>
698 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
711 template<
class JF1_t>
713 public JMathlib< JSub<JF1_t, double> >,
733 JSub(
const JF1_t& f1,
const double value) :
745 template<
class ...Args>
748 return static_cast<const JF1_t&
>(*this).getValue(args...) - value;
760 return static_cast<const JF1_t&
>(*this).getDerivative(x);
770 template<
class ...Args>
775 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
788 template<
class JF1_t>
790 public JMathlib< JMul<JF1_t, double> >,
810 JMul(
const JF1_t& f1,
const double value) :
822 template<
class ...Args>
825 return static_cast<const JF1_t&
>(*this).getValue(args...) * value;
837 return static_cast<const JF1_t&
>(*this).getDerivative(x) * value;
847 template<
class ...Args>
852 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
853 static_cast<JF1_t&
>(gradient) *= value;
866 template<
class JF1_t>
868 public JMathlib< JDiv<JF1_t, double> >,
888 JDiv(
const JF1_t& f1,
const double value) :
900 template<
class ...Args>
903 return static_cast<const JF1_t&
>(*this).getValue(args...) / value;
915 return static_cast<const JF1_t&
>(*this).getDerivative(x) / value;
925 template<
class ...Args>
930 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
931 static_cast<JF1_t&
>(gradient) /= value;
944 template<
class JF1_t,
class JF2_t,
945 bool v1 = JF1_t::parameters.size() != 0 || std::is_base_of<JPf<>, JF1_t>::value,
946 bool v2 = JF2_t::parameters.size() != 0 || std::is_base_of<JPf<>, JF2_t>::value>
964 JPair(
const JF1_t& f1,
const JF2_t& f2) :
976 template<
class JF1_t,
class JF2_t>
977 struct JPair<JF1_t, JF2_t, true, false> :
978 public virtual JF2_t,
994 JPair(
const JF1_t& f1,
const JF2_t& f2) :
1005 template<
class JF1_t,
class JF2_t>
1006 struct JPair<JF1_t, JF2_t, false, true> :
1007 public virtual JF1_t,
1023 JPair(
const JF1_t& f1,
const JF2_t& f2) :
1034 template<
class JF1_t,
class JF2_t>
1035 struct JPair<JF1_t, JF2_t, false, false> :
1036 public virtual JF1_t,
1037 public virtual JF2_t
1062 template<
class JF1_t,
class JF2_t>
1064 public JPair<JF1_t, JF2_t>,
1065 public JCalculus< JPair_t<JF1_t, JF2_t> >
1088 JPair<JF1_t, JF2_t>(f1, f2)
1096 template<
class JF1_t,
class JF2_t>
1098 public JMathlib< JAdd<JF1_t, JF2_t> >,
1118 JAdd(
const JF1_t& f1,
const JF2_t& f2) :
1129 template<
class ...Args>
1132 return (
static_cast<const JF1_t&
>(*this).getValue(args...) +
1133 static_cast<const JF2_t&
>(*this).getValue(args...));
1145 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) +
1146 static_cast<const JF2_t&
>(*this).getDerivative(x));
1156 template<
class ...Args>
1161 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1162 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).
getGradient(args...);
1172 template<
class JF1_t,
class JF2_t>
1174 public JMathlib< JSub<JF1_t, JF2_t> >,
1194 JSub(
const JF1_t& f1,
const JF2_t& f2) :
1205 template<
class ...Args>
1208 return (
static_cast<const JF1_t&
>(*this).getValue(args...) -
1209 static_cast<const JF2_t&
>(*this).getValue(args...));
1221 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) -
1222 static_cast<const JF2_t&
>(*this).getDerivative(x));
1232 template<
class ...Args>
1237 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1238 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).
getGradient(args...);
1239 static_cast<JF2_t&
>(gradient).
negate();
1249 template<
class JF1_t,
class JF2_t>
1251 public JMathlib< JMul<JF1_t, JF2_t> >,
1271 JMul(
const JF1_t& f1,
const JF2_t& f2) :
1282 template<
class ...Args>
1285 return (
static_cast<const JF1_t&
>(*this).getValue(args...) *
1286 static_cast<const JF2_t&
>(*this).getValue(args...));
1298 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) *
static_cast<const JF2_t&
>(*this).getValue(x) +
1299 static_cast<const JF1_t&
>(*this).getValue(x) *
static_cast<const JF2_t&
>(*this).getDerivative(x));
1309 template<
class ...Args>
1314 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1315 static_cast<JF1_t&
>(gradient) *=
static_cast<const JF2_t&
>(*this).
getValue(args...);
1316 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).getGradient(args...);
1317 static_cast<JF2_t&
>(gradient) *=
static_cast<const JF1_t&
>(*this).getValue(args...);
1327 template<
class JF1_t,
class JF2_t>
1329 public JMathlib< JDiv<JF1_t, JF2_t> >,
1349 JDiv(
const JF1_t& f1,
const JF2_t& f2) :
1360 template<
class ...Args>
1363 return (
static_cast<const JF1_t&
>(*this).getValue(args...) /
1364 static_cast<const JF2_t&
>(*this).getValue(args...));
1376 const double v =
static_cast<const JF1_t&
>(*this).getValue(x);
1377 const double w =
static_cast<const JF2_t&
>(*this).getValue(x);
1379 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) * w -
1380 v *
static_cast<const JF2_t&
>(*this).getDerivative(x)) / (w*w);
1390 template<
class ...Args>
1395 const double v =
static_cast<const JF1_t&
>(*this).
getValue(args...);
1396 const double w =
static_cast<const JF2_t&
>(*this).getValue(args...);
1398 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(args...);
1399 static_cast<JF1_t&
>(gradient) *= 1.0/w;
1400 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).getGradient(args...);
1401 static_cast<JF2_t&
>(gradient) *= -v/(w*w);
1411 template<
class JF1_t>
1435 JFn(
const JF1_t& f1,
const int N) :
1447 template<
class ...Args>
1450 const double u =
static_cast<const JF1_t&
>(*this).getValue(args...);
1464 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
1465 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
1467 return N *
pow(u,
N - 1) * v;
1477 template<
class ...Args>
1482 const double u =
static_cast<const JF1_t&
>(*this).
getValue(args...);
1483 const double w =
N *
pow(u,
N - 1);
1485 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(args...);
1486 static_cast<JF1_t&
>(gradient) *= w;
1589 return N *
pow(x, N - 1);
1628 template<
class JF1_t>
1662 template<
class ...Args>
1665 return f1->getValue(args...);
1677 return f1->getDerivative(x);
1687 template<
class ...Args>
1705 template<
int ID_t,
size_t N>
1707 public JMathlib < JPolynome<ID_t, N> >,
1711 static const int ID = ID_t;
1737 template<
class ...Args>
1753 for (
size_t i = 0; i <= N; ++i) {
1754 (*this)[i] = std::data(args)[i];
1793 gradient.
a =
pow(x,N);
1811 template<
class ...Args>
1812 void set(
const double x,
const Args& ...args)
1827 public JMathlib < JPolynome<ID_t, 0> >,
1830 static const int ID = ID_t;
1861 a = std::data(args)[0];
1937 template<
int ID_t,
bool normalised = false>
1942 static const int ID = ID_t;
1961 const double sigma) :
1989 const double w = 1.0 /
sigma;
1992 return get(u) * -u * w;
2006 const double w = 1.0 /
sigma;
2007 const double u = (x -
center) * w;
2008 const double f0 =
get(u);
2028 inline double get(
const double u)
const
2030 return exp(-0.5*u*u);
2040 public JMathlib < JGauss<ID_t, true> >,
2043 static const int ID = ID_t;
2062 const double sigma) :
2090 const double w = 1.0 /
sigma;
2093 return get(u) * -u * w;
2107 const double w = 1.0 /
sigma;
2108 const double u = (x -
center) * w;
2109 const double f0 =
get(u);
2129 inline double get(
const double u)
const
2131 static const double W = 1.0 / sqrt(2.0 * acos(-1.0));
2133 return exp(-0.5*u*u) * W /
sigma;
2141 template<
int ID_t,
class JF1_t = JX>
2143 public JMathlib < JPow<ID_t, JF1_t> >,
2146 static const int ID = ID_t;
2192 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2206 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2207 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2223 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2226 gradient.
alpha = w * log(u);
2228 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2229 static_cast<JF1_t&
>(gradient) *=
alpha * w / u;
2247 template<
class JF1_t>
2257 template<
class JF1_t = JX>
2292 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2306 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2307 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2309 return 0.5 * v / sqrt(u);
2323 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2325 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2326 static_cast<JF1_t&
>(gradient) *= 0.5 / sqrt(u);
2339 template<
class JF1_t>
2349 template<
class JF1_t = JX>
2384 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2398 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2399 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2415 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2417 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2418 static_cast<JF1_t&
>(gradient) *= cos(u);
2431 template<
class JF1_t>
2441 template<
class JF1_t = JX>
2476 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2490 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2491 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2507 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2509 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2510 static_cast<JF1_t&
>(gradient) *= -sin(u);
2523 template<
class JF1_t>
2533 template<
class JF1_t = JX>
2568 return exp(
static_cast<const JF1_t&
>(*this).getValue(x));
2580 return static_cast<const JF1_t&
>(*this).getDerivative(x) *
getValue(x);
2594 gradient =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2607 public JMathlib< JExp< JPolynome<ID_t, 0> > >,
2677 template<
class JF1_t>
2687 template<
class JF1_t = JX>
2722 return log(
static_cast<const JF1_t&
>(*this).getValue(x));
2734 return static_cast<const JF1_t&
>(*this).getDerivative(x) /
static_cast<const JF1_t&
>(*this).getValue(x);
2748 gradient =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2749 gradient /= (
static_cast<const JF1_t&
>(*this).getValue(x));
2762 template<
class JF1_t>
constexpr size_t getNumberOfParameters()
Get number of parameters.
void setParameters(JF1_t *f1, const double *values)
Set values of all parameters.
JPow< JF1_t::ID, JF1_t > Pow(const JF1_t &f1, const double alpha)
Power of function.
static const JXn< 5 > X5
Function object for x^4;.
JSqrt< JF1_t > Sqrt(const JF1_t &f1)
Square root of function.
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
static const JXn< 3 > X3
Function object for x^2;.
T pow(const T &x, const double y)
Power .
static const JXn< 4 > X4
Function object for x^3;.
JCos< JF1_t > Cos(const JF1_t &f1)
Cosine of function.
constexpr parameter_list< U, sizeof...(i)> convert(const parameter_list< V, sizeof...(i)> ¶meters, const std::index_sequence< i... > &ls)
Auxiliary method to convert parameter list.
constexpr parameter_list< U, sizeof...(i)+1 > join(const parameter_list< V, sizeof...(i)> ¶meters, const std::index_sequence< i... > &ls, double W::*parameter)
Auxiliary method to join parameter and list of parameters.
static const JXn< 2 > X2
Invalidate x^0.
JSin< JF1_t > Sin(const JF1_t &f1)
Sine of function.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getDerivative(const double x) const
Derivative value.
JAdd getGradient(const Args &...args) const
Get gradient.
JAdd()
Default constructor.
JAdd(const JF1_t &f1, const double value)
Constructor.
double getValue(const Args &...args) const
Function value.
forward declaration for negation of function.
JAdd getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
JAdd()
Default constructor.
double getValue(const Args &...args) const
Function value.
JAdd(const JF1_t &f1, const JF2_t &f2)
Constructor.
Auxiliary base class for mathematical operations on parameters of function.
JF1_t & div(const double factor)
Scale function.
JF1_t & mul(const double factor)
Scale function.
JF1_t & add(const JF1_t &f1)
Add function.
friend JF1_t & operator+=(JF1_t &function, const JF1_t &value)
Add function.
friend JF1_t & operator/=(JF1_t &function, const double factor)
Scale function.
friend JF1_t & operator*=(JF1_t &function, const double factor)
Scale function.
JF1_t & sub(const JF1_t &f1)
Subtract function.
JF1_t & negate()
Negate function.
friend JF1_t & operator-=(JF1_t &function, const JF1_t &value)
Subtract function.
JCos(const JF1_t &f1)
Constructor.
double getDerivative(const double x) const
Derivative value.
JCos getGradient(const double x) const
Get gradient.
double getValue(const double x) const
Function value.
JCos()
Default constructor.
JDiv(const JF1_t &f1, const double value)
Constructor.
double getValue(const Args &...args) const
Function value.
JDiv getGradient(const Args &...args) const
Get gradient.
JDiv()
Default constructor.
double getDerivative(const double x) const
Derivative value.
forward declaration for multiplication of fuction.
double getValue(const Args &...args) const
Function value.
JDiv getGradient(const Args &...args) const
Get gradient.
JDiv()
Default constructor.
JDiv(const JF1_t &f1, const JF2_t &f2)
Constructor.
double getDerivative(const double x) const
Derivative value.
double getDerivative(...) const
Derivative value.
double getValue(...) const
Function value.
JExp()
Default constructor.
JExp(const JPolynome< ID_t, 0 > &f1)
Constructor.
JExp getGradient(...) const
Get gradient.
JExp()
Default constructor.
JExp getGradient(const double x) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
JExp(const JF1_t &f1)
Constructor.
forward declaration for division of fuction.
JFn()
Default constructor.
JFn(const JF1_t &f1, const int N)
Constructor.
double getDerivative(const double x) const
Derivative value.
JFn getGradient(const Args &...args) const
Get gradient.
double getValue(const Args &...args) const
Function value.
JGauss(const double center, const double sigma)
Constructor.
JGauss getGradient(const double x) const
Get gradient.
JGauss()
Default constructor.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
double get(const double u) const
Get ordinate value.
double getDerivative(const double x) const
Derivative value.
JGauss()
Default constructor.
static constexpr parameter_list< JGauss, 2 > parameters
double getValue(const double x) const
Function value.
JGauss getGradient(const double x) const
Get gradient.
double get(const double u) const
Get ordinate value.
JGauss(const double center, const double sigma)
Constructor.
double getValue(const double x) const
Function value.
JLog getGradient(const double x) const
Get gradient.
JLog()
Default constructor.
JLog(const JF1_t &f1)
Constructor.
double getDerivative(const double x) const
Derivative value.
forward declaration for pointer to function.
friend JMul< JF1_t, JF2_t > operator*(const JF1_t &f1, const JF2_t &f2)
Multiplication of two functions.
friend JDiv< JF1_t, JF2_t > operator/(const JF1_t &f1, const JF2_t &f2)
Division of two functions.
friend JAdd< JNegate< JF1_t > > operator-(const double value, const JF1_t &f1)
Subtraction of constant value.
friend JFn< JF1_t > operator^(const JF1_t &f1, int N)
Power-of operator.
double operator[](const size_t i) const
Get value of parameter at given index.
double & operator[](const size_t i)
Get value of parameter at given index.
friend JAdd< JF1_t > operator+(const double value, const JF1_t &f1)
Addition of constant value.
friend JSub< JF1_t > operator-(const JF1_t &f1, const double value)
Subtraction of constant value.
friend const JF1_t & operator+(const JF1_t &function)
Affirm operator.
friend JMul< JF1_t > operator*(const double value, const JF1_t &f1)
Multiplication of constant value.
friend JSub< JF1_t, JF2_t > operator-(const JF1_t &f1, const JF2_t &f2)
Subtraction of two functions.
friend JDiv< JF1_t > operator/(const JF1_t &f1, const double value)
Division of constant value.
double operator()(const Args &...args) const
Function value.
friend JAdd< JF1_t > operator+(const JF1_t &f1, const double value)
Addition of constant value.
friend JPf< JF1_t > operator&(const JF1_t &f1)
Address-of operator.
friend JNegate< JF1_t > operator-(const JF1_t &function)
Negate operator.
friend JAdd< JF1_t, JF2_t > operator+(const JF1_t &f1, const JF2_t &f2)
Addition of two functions.
friend JMul< JF1_t > operator*(const JF1_t &f1, const double value)
Multiplication of constant value.
double getValue(const Args &...args) const
Function value.
JMul(const JF1_t &f1, const double value)
Constructor.
double getDerivative(const double x) const
Derivative value.
JMul getGradient(const Args &...args) const
Get gradient.
JMul()
Default constructor.
forward declaration for subtraction of fuction.
double getValue(const Args &...args) const
Function value.
JMul()
Default constructor.
JMul(const JF1_t &f1, const JF2_t &f2)
Constructor.
JMul getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
double getValue(const Args &...args) const
Function value.
JNegate()
Default constructor.
JNegate(const JF1_t &f1)
Constructor.
JNegate getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
JPair()
Default constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
Auxiliary data structure for pair of functions.
JPair_t()
Default constructor.
JPair_t(const JF1_t &f1, const JF2_t &f2)
Constructor.
Auxiliary data structure for pair of functions.
static constexpr parameter_list< JPair, JF1_t::parameters.size()+JF2_t::parameters.size()> parameters
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
forward declaration for fixed power of function.
JPf getGradient(const Args &...args) const
Get gradient.
JPf()
Default constructor.
JPf(const JF1_t *f1)
Constructor.
double getValue(const Args &...args) const
Function value.
static constexpr parameter_list< JPf, 0 > parameters
double getDerivative(const double x) const
Derivative value.
Termination class for polynomial function.
JPolynome getGradient(...) const
Get gradient.
double getValue(...) const
Function value.
double getDerivative(...) const
Derivative value.
JPolynome()
Default constructor.
void set(const double x)
Recursive method for setting values.
JPolynome(const std::array< double, 1 > &args)
Constructor.
JPolynome(const double a)
Constructor.
JPolynome_t & mul(const double factor)
Scale polynome.
JPolynome_t & sub(const JPolynome_t &polynome)
Subtract polynome.
JPolynome_t & add(const JPolynome_t &polynome)
Add polynome.
Recursive template class for polynomial function.
static const size_t NUMBER_OF_DEGREES
JPolynome()
Default constructor.
JPolynome(const Args &...args)
Constructor.
double getValue(const double x) const
Function value.
void set(const double x, const Args &...args)
Recursive method for setting values.
JPolynome(const std::array< double, N+1 > &args)
Constructor.
JPolynome getGradient(const double x) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
static constexpr parameter_list< JPolynome, N+1 > parameters
double getValue(const double x) const
Function value.
JPow(const JF1_t &f1, const double alpha)
Constructor.
JPow getGradient(const double x) const
Get gradient.
static constexpr parameter_list< JPow, 1 > parameters
JPow(const double alpha)
Constructor.
JPow()
Default constructor.
double getDerivative(const double x) const
Derivative value.
JSin()
Default constructor.
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
JSin getGradient(const double x) const
Get gradient.
JSin(const JF1_t &f1)
Constructor.
JSqrt()
Default constructor.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
JSqrt getGradient(const double x) const
Get gradient.
JSqrt(const JF1_t &f1)
Constructor.
double getValue(const Args &...args) const
Function value.
JSub getGradient(const Args &...args) const
Get gradient.
JSub()
Default constructor.
double getDerivative(const double x) const
Derivative value.
JSub(const JF1_t &f1, const double value)
Constructor.
forward declaration for addition of fuction.
double getDerivative(const double x) const
Derivative value.
double getValue(const Args &...args) const
Function value.
JSub getGradient(const Args &...args) const
Get gradient.
JSub()
Default constructor.
JSub(const JF1_t &f1, const JF2_t &f2)
Constructor.
double getValue(const double x) const
Function value.
JX getGradient(const double x) const
Get gradient.
static constexpr parameter_list< JX, 0 > parameters
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
JXn()
Default constructor.
JXn getGradient(const double x) const
Get gradient.
static constexpr parameter_list< JXn, 0 > parameters