12 Eigen::ArrayXd
n,
t,
d;
14 template<
typename TauType,
typename DeltaType>
15 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
16 using result = std::common_type_t<TauType, DeltaType>;
17 result r = 0.0, lntau = log(tau);
19 if (base_delta == 0) {
20 for (
auto i = 0; i <
n.size(); ++i) {
21 r = r +
n[i] * exp(
t[i] * lntau)*
powi(delta,
static_cast<int>(
d[i]));
25 result lndelta = log(delta);
26 for (
auto i = 0; i <
n.size(); ++i) {
27 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta);
42 template<
typename TauType,
typename DeltaType>
43 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
44 using result = std::common_type_t<TauType, DeltaType>;
45 result r = 0.0, lntau = log(tau);
46 if (
l_i.size() == 0 &&
n.size() > 0) {
47 throw std::invalid_argument(
"l_i cannot be zero length if some terms are provided");
50 for (
auto i = 0; i <
n.size(); ++i) {
51 r = r +
n[i] * exp(
t[i] * lntau -
c[i] *
powi(delta,
l_i[i])) *
powi(delta,
static_cast<int>(
d[i]));
55 result lndelta = log(delta);
56 for (
auto i = 0; i <
n.size(); ++i) {
57 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
c[i] *
powi(delta,
l_i[i]));
72 template<
typename TauType,
typename DeltaType>
73 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
74 using result = std::common_type_t<TauType, DeltaType>;
75 result r = 0.0, lntau = log(tau);
77 for (
auto i = 0; i <
n.size(); ++i) {
78 r = r +
n[i] * exp(
t[i] * lntau -
g[i] *
powi(delta,
l_i[i]))*
powi(delta,
static_cast<int>(
d[i]));
82 result lndelta = log(delta);
83 for (
auto i = 0; i <
n.size(); ++i) {
84 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
g[i] *
powi(delta,
l_i[i]));
99 template<
typename TauType,
typename DeltaType>
100 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
101 using result = std::common_type_t<TauType, DeltaType>;
102 result r = 0.0, lntau = log(tau);
103 if (
ld_i.size() == 0 &&
n.size() > 0) {
104 throw std::invalid_argument(
"ld_i cannot be zero length if some terms are provided");
107 for (
auto i = 0; i <
n.size(); ++i) {
108 r = r +
n[i] *
powi(delta,
static_cast<int>(
d[i])) * exp(
t[i] * lntau -
gd[i]*
powi(delta,
ld_i[i]) -
gt[i]*
pow(tau,
lt[i]));
112 result lndelta = log(delta);
113 for (
auto i = 0; i <
n.size(); ++i) {
114 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
gd[i]*
powi(delta,
ld_i[i]) -
gt[i]*
pow(tau,
lt[i]));
128 template<
typename TauType,
typename DeltaType>
129 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
130 using result = std::common_type_t<TauType, DeltaType>;
131 result r = 0.0, lntau = log(tau);
132 auto square = [](
auto x) {
return x * x; };
134 for (
auto i = 0; i <
n.size(); ++i) {
135 r = r +
n[i] * exp(
t[i] * lntau -
eta[i] * square(delta -
epsilon[i]) -
beta[i] * square(tau -
gamma[i]))*
powi(delta,
static_cast<int>(
d[i]));
139 result lndelta = log(delta);
140 for (
auto i = 0; i <
n.size(); ++i) {
141 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
eta[i] * square(delta -
epsilon[i]) -
beta[i] * square(tau -
gamma[i]));
155 template<
typename TauType,
typename DeltaType>
156 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
157 using result = std::common_type_t<TauType, DeltaType>;
158 result r = 0.0, lntau = log(tau);
159 auto square = [](
auto x) {
return x * x; };
161 for (
auto i = 0; i <
n.size(); ++i) {
162 r = r +
n[i] * exp(
t[i] * lntau -
eta[i] * square(delta -
epsilon[i]) -
beta[i] * (delta -
gamma[i]))*
powi(delta,
static_cast<int>(
d[i]));
166 result lndelta = log(delta);
167 for (
auto i = 0; i <
n.size(); ++i) {
168 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
eta[i] * square(delta -
epsilon[i]) -
beta[i] * (delta -
gamma[i]));
184 template<
typename TauType,
typename DeltaType>
185 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
186 using result = std::common_type_t<TauType, DeltaType>;
187 result r = 0.0, lntau = log(tau);
189 for (
auto i = 0; i <
n.size(); ++i) {
190 r = r +
n[i] * exp(
t[i] * lntau -
powi(delta,
l_i[i]) -
pow(tau,
m[i]))*
powi(delta,
static_cast<int>(
d[i]));
194 result lndelta = log(delta);
195 for (
auto i = 0; i <
n.size(); ++i) {
196 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
powi(delta,
l_i[i]) -
pow(tau,
m[i]));
210 template<
typename TauType,
typename DeltaType>
211 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
213 using result = std::common_type_t<TauType, DeltaType>;
214 result r = 0.0, lntau = log(tau);
215 auto square = [](
auto x) {
return x * x; };
217 for (
auto i = 0; i <
n.size(); ++i) {
218 r = r +
n[i] * exp(
t[i] * lntau -
eta[i] * square(delta -
epsilon[i]) + 1.0 / (
beta[i] * square(tau -
gamma[i]) +
b[i]))*
powi(delta,
static_cast<int>(
d[i]));
222 result lndelta = log(delta);
223 for (
auto i = 0; i <
n.size(); ++i) {
224 r = r +
n[i] * exp(
t[i] * lntau +
d[i] * lndelta -
eta[i] * square(delta -
epsilon[i]) + 1.0 / (
beta[i] * square(tau -
gamma[i]) +
b[i]));
240 template<
typename vectype,
typename XType>
242 int N =
static_cast<int>(c.size()) - 1;
243 std::common_type_t<typename vectype::Scalar, XType> u_k = 0, u_kp1 = 0, u_kp2 = 0;
244 for (
int k = N; k >= 0; --k){
246 u_k = 2.0*ind*u_kp1 - u_kp2 + c[k];
249 u_kp2 = u_kp1; u_kp1 = u_k;
252 return (u_k - u_kp2)/2.0;
256 template<
typename MatType,
typename XType>
258 int N =
static_cast<int>(c.rows()) - 1;
259 constexpr int Cols = MatType::ColsAtCompileTime;
260 using NumType = std::common_type_t<typename MatType::Scalar, XType>;
261 static Eigen::Array<NumType, 1, Cols> u_k, u_kp1, u_kp2;
263 if constexpr (Cols == Eigen::Dynamic) {
264 int M =
static_cast<int>(c.rows());
269 u_k.setZero(); u_kp1.setZero(); u_kp2.setZero();
271 for (
int k = N; k >= 0; --k) {
273 u_k = 2.0 * ind * u_kp1 - u_kp2 + c.row(k);
276 u_kp2 = u_kp1; u_kp1 = u_k;
279 return (u_k - u_kp2) / 2.0;
287 template<
typename MatType,
typename XType,
typename YType>
293 template<
typename TauType,
typename DeltaType>
294 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
306 template<
typename TauType,
typename DeltaType>
307 auto alphar(
const TauType& ,
const DeltaType& )
const {
308 return static_cast<std::common_type_t<TauType, DeltaType>
>(0.0);
316 template<
typename TauType,
typename DeltaType>
317 auto alphar(
const TauType& tau,
const DeltaType& delta)
const {
319 auto square = [](
auto x) {
return x * x; };
320 auto delta_min1_sq = square(delta - 1.0);
322 using result = std::common_type_t<TauType, DeltaType>;
324 for (
auto i = 0; i <
n.size(); ++i) {
325 auto Psi = exp(-
C[i]*delta_min1_sq -
D[i]*square(tau - 1.0));
326 auto k = 1.0 / (2.0 *
beta[i]);
327 auto theta = (1.0 - tau) +
A[i] *
pow(delta_min1_sq, k);
328 auto Delta = square(theta) +
B[i]*
pow(delta_min1_sq,
a[i]);
329 r = r +
n[i]*
pow(Delta,
b[i])*delta*Psi;
334 double dbl =
static_cast<double>(
getbaseval(outval));
335 if (std::isfinite(dbl)) {
339 return static_cast<decltype(outval)
>(0.0);
345template<
typename... Args>
348 using varEOSTerms = std::variant<Args...>;
349 std::vector<varEOSTerms> coll;
352 auto size()
const {
return coll.size(); }
354 template<
typename Instance>
356 coll.emplace_back(instance);
359 template <
class Tau,
class Delta>
360 auto alphar(
const Tau& tau,
const Delta& delta)
const {
361 std::common_type_t <Tau, Delta> ar = 0.0;
362 for (
const auto& term : coll) {
363 auto contrib = std::visit([&](
auto& t) {
return t.alphar(tau, delta); }, term);
static auto Clenshaw1DByRow(const MatType &c, const XType &ind)
Clenshaw evaluation of one dimensional flattening of the Chebyshev expansion.
static auto Clenshaw1D(const vectype &c, const XType &ind)
Clenshaw evaluation of a Chebyshev expansion in 1D.
auto alphar(const TauType &tau, const DeltaType &delta) const
static auto Clenshaw2DEigen(const MatType &a, const XType &x, const YType &y)
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const Tau &tau, const Delta &delta) const
auto add_term(Instance &&instance)
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto alphar(const TauType &, const DeltaType &) const
auto alphar(const TauType &tau, const DeltaType &delta) const
auto getbaseval(const T &expr)
T powi(const T &x, int n)
From Ulrich Deiters.
auto pow(const double &x, const double &e)