24#ifndef quantext_crossasset_analytics_base_hpp
25#define quantext_crossasset_analytics_base_hpp
27#include <boost/bind/bind.hpp>
29#include <ql/types.hpp>
36namespace CrossAssetAnalytics {
43template <
class E> Real
integral_helper(
const CrossAssetModel& x,
const E& e,
const Real t);
47Real
integral(
const CrossAssetModel& model,
const E& e,
const Real a,
const Real b);
50template <
typename E1,
typename E2>
struct P2_ {
51 P2_(
const E1& e1,
const E2& e2) :
e1_(e1),
e2_(e2) {}
53 return e1_.eval(x, t) *
e2_.eval(x, t);
60template <
typename E1,
typename E2,
typename E3>
struct P3_ {
61 P3_(
const E1& e1,
const E2& e2,
const E3& e3) :
e1_(e1),
e2_(e2),
e3_(e3) {}
63 return e1_.eval(x, t) *
e2_.eval(x, t) *
e3_.eval(x, t);
71template <
typename E1,
typename E2,
typename E3,
typename E4>
struct P4_ {
72 P4_(
const E1& e1,
const E2& e2,
const E3& e3,
const E4& e4) :
e1_(e1),
e2_(e2),
e3_(e3),
e4_(e4) {}
74 return e1_.eval(x, t) *
e2_.eval(x, t) *
e3_.eval(x, t) *
e4_.eval(x, t);
83template <
typename E1,
typename E2,
typename E3,
typename E4,
typename E5>
struct P5_ {
84 P5_(
const E1& e1,
const E2& e2,
const E3& e3,
const E4& e4,
const E5& e5)
87 return e1_.eval(x, t) *
e2_.eval(x, t) *
e3_.eval(x, t) *
e4_.eval(x, t) *
e5_.eval(x, t);
100template <
class E1,
class E2,
class E3>
const P3_<E1, E2, E3> P(
const E1& e1,
const E2& e2,
const E3& e3) {
105template <
class E1,
class E2,
class E3,
class E4>
111template <
class E1,
class E2,
class E3,
class E4,
class E5>
117template <
typename E1>
struct LC1_ {
119 LC1_(QuantLib::Real c, QuantLib::Real c1,
const E1& e1) :
c_(c),
c1_(c1),
e1_(e1) {}
129template <
typename E1,
typename E2>
struct LC2_ {
131 LC2_(QuantLib::Real c, QuantLib::Real c1,
const E1& e1, QuantLib::Real c2,
const E2& e2)
146template <
typename E1,
typename E2,
typename E3>
struct LC3_ {
148 LC3_(QuantLib::Real c, QuantLib::Real c1,
const E1& e1, QuantLib::Real c2,
const E2& e2, QuantLib::Real c3,
166template <
typename E1,
typename E2,
typename E3,
typename E4>
struct LC4_ {
168 LC4_(QuantLib::Real c, QuantLib::Real c1,
const E1& e1, QuantLib::Real c2,
const E2& e2, QuantLib::Real c3,
169 const E3& e3, QuantLib::Real c4,
const E4& e4)
188template <
class E1>
const LC1_<E1> LC(QuantLib::Real c, QuantLib::Real c1,
const E1& e1) {
return LC1_<E1>(c, c1, e1); }
191template <
class E1,
class E2>
192const LC2_<E1, E2> LC(QuantLib::Real c, QuantLib::Real c1,
const E1& e1, QuantLib::Real c2,
const E2& e2) {
197template <
class E1,
class E2,
class E3>
198const LC3_<E1, E2, E3> LC(QuantLib::Real c, QuantLib::Real c1,
const E1& e1, QuantLib::Real c2,
const E2& e2,
199 QuantLib::Real c3,
const E3& e3) {
204template <
class E1,
class E2,
class E3,
class E4>
206 QuantLib::Real c3,
const E3& e3, QuantLib::Real c4,
const E4& e4) {
207 return LC4_<E1, E2, E3, E4>(c, c1, e1, c2, e2, c3, e3, c4, e4);
218 return x.
integrator()->operator()(QuantLib::ext::bind(&integral_helper<E>, x, e, QuantLib::ext::placeholders::_1), a, b);
const QuantLib::ext::shared_ptr< Integrator > integrator() const
Real integral_helper(const CrossAssetModel &x, const E &e, const Real t)
const LC1_< E1 > LC(QuantLib::Real c, QuantLib::Real c1, const E1 &e1)
Real integral(const CrossAssetModel &model, const E &e, const Real a, const Real b)
const P2_< E1, E2 > P(const E1 &e1, const E2 &e2)
Real eval(const CrossAssetModel &x, const Real t) const
LC1_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1)
Real eval(const CrossAssetModel &x, const Real t) const
LC2_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2)
Real eval(const CrossAssetModel &x, const Real t) const
LC3_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2, QuantLib::Real c3, const E3 &e3)
Real eval(const CrossAssetModel &x, const Real t) const
LC4_(QuantLib::Real c, QuantLib::Real c1, const E1 &e1, QuantLib::Real c2, const E2 &e2, QuantLib::Real c3, const E3 &e3, QuantLib::Real c4, const E4 &e4)
P2_(const E1 &e1, const E2 &e2)
Real eval(const CrossAssetModel &x, const Real t) const
Real eval(const CrossAssetModel &x, const Real t) const
P3_(const E1 &e1, const E2 &e2, const E3 &e3)
Real eval(const CrossAssetModel &x, const Real t) const
P4_(const E1 &e1, const E2 &e2, const E3 &e3, const E4 &e4)
Real eval(const CrossAssetModel &x, const Real t) const
P5_(const E1 &e1, const E2 &e2, const E3 &e3, const E4 &e4, const E5 &e5)