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 =
void>
314 template<
class JF1_t =
void>
321 template<
class JF1_t>
329 template<
class ...Args>
332 return static_cast<const JF1_t&
>(*this).getValue(args...);
458 template<
class JF2_t>
472 template<
class JF2_t>
486 template<
class JF2_t>
500 template<
class JF2_t>
540 return static_cast<const JF1_t&
>(*this).*JF1_t::parameters[i];
552 return static_cast<JF1_t&
>(*this).*JF1_t::parameters[i];
560 template<
class JF1_t>
592 template<
class ...Args>
595 return -
static_cast<const JF1_t&
>(*this).getValue(args...);
607 return -
static_cast<const JF1_t&
>(*this).getDerivative(x);
617 template<
class ...Args>
622 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
623 static_cast<JF1_t&
>(gradient).negate();
633 template<
class JF1_t>
635 public JMathlib< JAdd<JF1_t, double> >,
655 JAdd(
const JF1_t& f1,
const double value) :
667 template<
class ...Args>
670 return static_cast<const JF1_t&
>(*this).getValue(args...) + value;
682 return static_cast<const JF1_t&
>(*this).getDerivative(x);
692 template<
class ...Args>
697 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
710 template<
class JF1_t>
712 public JMathlib< JSub<JF1_t, double> >,
732 JSub(
const JF1_t& f1,
const double value) :
744 template<
class ...Args>
747 return static_cast<const JF1_t&
>(*this).getValue(args...) - value;
759 return static_cast<const JF1_t&
>(*this).getDerivative(x);
769 template<
class ...Args>
774 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
787 template<
class JF1_t>
789 public JMathlib< JMul<JF1_t, double> >,
809 JMul(
const JF1_t& f1,
const double value) :
821 template<
class ...Args>
824 return static_cast<const JF1_t&
>(*this).getValue(args...) * value;
836 return static_cast<const JF1_t&
>(*this).getDerivative(x) * value;
846 template<
class ...Args>
851 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
852 static_cast<JF1_t&
>(gradient) *= value;
865 template<
class JF1_t>
867 public JMathlib< JDiv<JF1_t, double> >,
887 JDiv(
const JF1_t& f1,
const double value) :
899 template<
class ...Args>
902 return static_cast<const JF1_t&
>(*this).getValue(args...) / value;
914 return static_cast<const JF1_t&
>(*this).getDerivative(x) / value;
924 template<
class ...Args>
929 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
930 static_cast<JF1_t&
>(gradient) /= value;
943 template<
class JF1_t,
class JF2_t,
944 bool v1 = JF1_t::parameters.size() == 0 && !std::is_base_of<JPf<>, JF1_t>::value && !std::is_base_of<JFn<>, JF1_t>::value,
945 bool v2 = JF2_t::parameters.size() == 0 && !std::is_base_of<JPf<>, JF2_t>::value && !std::is_base_of<JFn<>, JF2_t>::value>
963 JPair(
const JF1_t& f1,
const JF2_t& f2) :
975 template<
class JF1_t,
class JF2_t>
976 struct JPair<JF1_t, JF2_t, false, true> :
977 public virtual JF2_t,
993 JPair(
const JF1_t& f1,
const JF2_t& f2) :
1004 template<
class JF1_t,
class JF2_t>
1005 struct JPair<JF1_t, JF2_t, true, false> :
1006 public virtual JF1_t,
1022 JPair(
const JF1_t& f1,
const JF2_t& f2) :
1033 template<
class JF1_t,
class JF2_t>
1034 struct JPair<JF1_t, JF2_t, true, true> :
1035 public virtual JF1_t,
1036 public virtual JF2_t
1061 template<
class JF1_t,
class JF2_t>
1063 public JPair<JF1_t, JF2_t>,
1064 public JCalculus< JPair_t<JF1_t, JF2_t> >
1087 JPair<JF1_t, JF2_t>(f1, f2)
1095 template<
class JF1_t,
class JF2_t>
1097 public JMathlib< JAdd<JF1_t, JF2_t> >,
1117 JAdd(
const JF1_t& f1,
const JF2_t& f2) :
1128 template<
class ...Args>
1131 return (
static_cast<const JF1_t&
>(*this).getValue(args...) +
1132 static_cast<const JF2_t&
>(*this).getValue(args...));
1144 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) +
1145 static_cast<const JF2_t&
>(*this).getDerivative(x));
1155 template<
class ...Args>
1160 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1161 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).
getGradient(args...);
1171 template<
class JF1_t,
class JF2_t>
1173 public JMathlib< JSub<JF1_t, JF2_t> >,
1193 JSub(
const JF1_t& f1,
const JF2_t& f2) :
1204 template<
class ...Args>
1207 return (
static_cast<const JF1_t&
>(*this).getValue(args...) -
1208 static_cast<const JF2_t&
>(*this).getValue(args...));
1220 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) -
1221 static_cast<const JF2_t&
>(*this).getDerivative(x));
1231 template<
class ...Args>
1236 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1237 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).
getGradient(args...);
1238 static_cast<JF2_t&
>(gradient).
negate();
1248 template<
class JF1_t,
class JF2_t>
1250 public JMathlib< JMul<JF1_t, JF2_t> >,
1270 JMul(
const JF1_t& f1,
const JF2_t& f2) :
1281 template<
class ...Args>
1284 return (
static_cast<const JF1_t&
>(*this).getValue(args...) *
1285 static_cast<const JF2_t&
>(*this).getValue(args...));
1297 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) *
static_cast<const JF2_t&
>(*this).getValue(x) +
1298 static_cast<const JF1_t&
>(*this).getValue(x) *
static_cast<const JF2_t&
>(*this).getDerivative(x));
1308 template<
class ...Args>
1313 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
1314 static_cast<JF1_t&
>(gradient) *=
static_cast<const JF2_t&
>(*this).
getValue(args...);
1315 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).getGradient(args...);
1316 static_cast<JF2_t&
>(gradient) *=
static_cast<const JF1_t&
>(*this).getValue(args...);
1326 template<
class JF1_t,
class JF2_t>
1328 public JMathlib< JDiv<JF1_t, JF2_t> >,
1348 JDiv(
const JF1_t& f1,
const JF2_t& f2) :
1359 template<
class ...Args>
1362 return (
static_cast<const JF1_t&
>(*this).getValue(args...) /
1363 static_cast<const JF2_t&
>(*this).getValue(args...));
1375 const double v =
static_cast<const JF1_t&
>(*this).getValue(x);
1376 const double w =
static_cast<const JF2_t&
>(*this).getValue(x);
1378 return (
static_cast<const JF1_t&
>(*this).getDerivative(x) * w -
1379 v *
static_cast<const JF2_t&
>(*this).getDerivative(x)) / (w*w);
1389 template<
class ...Args>
1394 const double v =
static_cast<const JF1_t&
>(*this).
getValue(args...);
1395 const double w =
static_cast<const JF2_t&
>(*this).getValue(args...);
1397 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(args...);
1398 static_cast<JF1_t&
>(gradient) *= 1.0/w;
1399 static_cast<JF2_t&
>(gradient) =
static_cast<const JF2_t&
>(*this).getGradient(args...);
1400 static_cast<JF2_t&
>(gradient) *= -v/(w*w);
1417 template<
class JF1_t>
1442 JFn(
const JF1_t& f1,
const int N) :
1454 template<
class ...Args>
1457 const double u =
static_cast<const JF1_t&
>(*this).getValue(args...);
1471 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
1472 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
1474 return N *
pow(u,
N - 1) * v;
1484 template<
class ...Args>
1489 const double u =
static_cast<const JF1_t&
>(*this).
getValue(args...);
1490 const double w =
N *
pow(u,
N - 1);
1492 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(args...);
1493 static_cast<JF1_t&
>(gradient) *= w;
1596 return N *
pow(x, N - 1);
1635 template<
class JF1_t>
1669 template<
class ...Args>
1672 return f1->getValue(args...);
1684 return f1->getDerivative(x);
1694 template<
class ...Args>
1712 template<
int ID_t,
size_t N>
1714 public JMathlib < JPolynome<ID_t, N> >,
1718 static const int ID = ID_t;
1744 template<
class ...Args>
1760 for (
size_t i = 0; i <= N; ++i) {
1761 (*this)[i] = std::data(args)[i];
1800 gradient.
a =
pow(x,N);
1818 template<
class ...Args>
1819 void set(
const double x,
const Args& ...args)
1834 public JMathlib < JPolynome<ID_t, 0> >,
1837 static const int ID = ID_t;
1868 a = std::data(args)[0];
1944 template<
int ID_t,
bool normalised = false>
1949 static const int ID = ID_t;
1968 const double sigma) :
1996 const double w = 1.0 /
sigma;
1999 return get(u) * -u * w;
2013 const double w = 1.0 /
sigma;
2014 const double u = (x -
center) * w;
2015 const double f0 =
get(u);
2035 inline double get(
const double u)
const
2037 return exp(-0.5*u*u);
2047 public JMathlib < JGauss<ID_t, true> >,
2050 static const int ID = ID_t;
2069 const double sigma) :
2097 const double w = 1.0 /
sigma;
2100 return get(u) * -u * w;
2114 const double w = 1.0 /
sigma;
2115 const double u = (x -
center) * w;
2116 const double f0 =
get(u);
2136 inline double get(
const double u)
const
2138 static const double W = 1.0 / sqrt(2.0 * acos(-1.0));
2140 return exp(-0.5*u*u) * W /
sigma;
2148 template<
int ID_t,
class JF1_t = JX>
2150 public JMathlib < JPow<ID_t, JF1_t> >,
2153 static const int ID = ID_t;
2199 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2213 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2214 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2230 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2233 gradient.
alpha = w * log(u);
2235 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2236 static_cast<JF1_t&
>(gradient) *=
alpha * w / u;
2254 template<
class JF1_t>
2264 template<
class JF1_t = JX>
2299 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2313 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2314 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2316 return 0.5 * v / sqrt(u);
2330 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2332 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2333 static_cast<JF1_t&
>(gradient) *= 0.5 / sqrt(u);
2346 template<
class JF1_t>
2356 template<
class JF1_t = JX>
2391 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2405 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2406 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2422 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2424 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2425 static_cast<JF1_t&
>(gradient) *= cos(u);
2438 template<
class JF1_t>
2448 template<
class JF1_t = JX>
2483 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2497 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2498 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2514 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2516 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2517 static_cast<JF1_t&
>(gradient) *= -sin(u);
2530 template<
class JF1_t>
2540 template<
class JF1_t = JX>
2575 return exp(
static_cast<const JF1_t&
>(*this).getValue(x));
2587 return static_cast<const JF1_t&
>(*this).getDerivative(x) *
getValue(x);
2601 gradient =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2614 public JMathlib< JExp< JPolynome<ID_t, 0> > >,
2684 template<
class JF1_t>
2694 template<
class JF1_t = JX>
2729 return log(
static_cast<const JF1_t&
>(*this).getValue(x));
2741 return static_cast<const JF1_t&
>(*this).getDerivative(x) /
static_cast<const JF1_t&
>(*this).getValue(x);
2755 gradient =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2756 gradient /= (
static_cast<const JF1_t&
>(*this).getValue(x));
2769 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.
Addition of two functions.
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.
Division of two functions.
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.
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.
Auxiliary base class for mathematical operations on functions.
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.
Multiplication of two functions.
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(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
JPair()
Default constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
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.
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.
Subtraction of two functions.
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