/usr/include/ql/experimental/math/levyflightdistribution.hpp is in libquantlib0-dev 1.9.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2015 Andres Hernandez
This file is part of QuantLib, a free-software/open-source library
for financial quantitative analysts and developers - http://quantlib.org/
QuantLib is free software: you can redistribute it and/or modify it
under the terms of the QuantLib license. You should have received a
copy of the license along with this program; if not, please email
<quantlib-dev@lists.sf.net>. The license is also available online at
<http://quantlib.org/license.shtml>.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the license for more details.
*/
/*! \file levyflightdistribution.hpp
\brief Levy Flight, aka Pareto Type I, distribution as needed by Boost Random
*/
#ifndef quantlib_levy_flight_distribution_hpp
#define quantlib_levy_flight_distribution_hpp
#include <ql/qldefines.hpp>
// The included Boost.Random headers were added in Boost 1.47
#if BOOST_VERSION >= 104700
#include <ql/types.hpp>
#include <ql/errors.hpp>
#include <boost/config/no_tr1/cmath.hpp>
#include <boost/random/detail/config.hpp>
#include <boost/random/detail/operators.hpp>
#include <boost/random/uniform_01.hpp>
#include <iosfwd>
namespace QuantLib {
//! Levy Flight distribution as needed by Boost Random
/*! The levy flight distribution is a random distribution with
the following form:
p(x) = \frac{\alpha x_m^{\alpha}}{x^{\alpha+1}}
with support over x \elem [x_m, \infty)
and the parameter \alpha > 0
Levy Flight is normally defined as x_m = 1 and 0 < \alpha < 2, which is
where p(x) has an infinite variance. However, the more general version,
known as Pareto Type I, is well defined for \alpha > 2, so the current
implementation does not restrict \alpha to be smaller than 2
*/
class LevyFlightDistribution
{
public:
typedef Real input_type;
typedef Real result_type;
class param_type
{
public:
typedef LevyFlightDistribution distribution_type;
/*! Constructs parameters with a given xm and alpha
Requires: alpha > 0
*/
param_type(Real xm = 1.0, Real alpha = 1.0)
: xm_(xm), alpha_(alpha) { QL_REQUIRE(alpha_ > 0.0, "alpha must be larger than 0"); }
//! Returns the xm parameter of the distribution
Real xm() const { return xm_; }
//! Returns the alpha parameter of the distribution
Real alpha() const { return alpha_; }
//! Writes the parameters to a @c std::ostream
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
{
os << parm.xm_ << " " << parm.alpha_;
return os;
}
//! Reads the parameters from a @c std::istream
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
{
is >> parm.xm_ >> std::ws >> parm.alpha_;
return is;
}
//! Returns true if the two sets of parameters are equal
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
{ return lhs.xm_ == rhs.xm_ && lhs.alpha_ == rhs.alpha_; }
//! Returns true if the two sets of parameters are different
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
private:
Real xm_;
Real alpha_;
};
//! \name Constructors
//@{
/*! Constructs a LevyFlightDistribution with a given xm and alpha
Requires: alpha > 0
*/
explicit LevyFlightDistribution(Real xm = 1.0, Real alpha = 1.0)
: xm_(xm), alpha_(alpha) { QL_REQUIRE(alpha_ > 0.0, "alpha must be larger than 0"); }
//!Constructs a LevyFlightDistribution from its parameters
explicit LevyFlightDistribution(const param_type& parm)
: xm_(parm.xm()), alpha_(parm.alpha()) {}
// compiler-generated copy ctor and assignment operator are fine
//@}
//! \name Inspectors
//@{
//! Returns the xm parameter of the distribution
Real xm() const { return xm_; }
//! Returns the alpha parameter of the distribution
Real alpha() const { return alpha_; }
//! Returns the smallest value that the distribution can produce
Real min BOOST_PREVENT_MACRO_SUBSTITUTION () const
{ return xm_; }
//! Returns the largest value that the distribution can produce
Real max BOOST_PREVENT_MACRO_SUBSTITUTION () const
{ return QL_MAX_REAL; }
//! Returns the parameters of the distribution
param_type param() const { return param_type(xm_, alpha_); }
//@}
//! Sets the parameters of the distribution
void param(const param_type& parm) {
xm_ = parm.xm();
alpha_ = parm.alpha();
}
/*! Effects: Subsequent uses of the distribution do not depend
on values produced by any engine prior to invoking reset.
*/
void reset() { }
//! Returns the value of the pdf for x
Real operator()(Real x) const{
using std::pow;
if(x < xm_) return 0.0;
return alpha_*pow(xm_/x, alpha_)/x;
}
/*! Returns a random variate distributed according to the
levy flight distribution.
*/
template<class Engine>
result_type operator()(Engine& eng) const{
using std::pow;
return xm_*pow(boost::random::uniform_01<Real>()(eng), -1.0/alpha_);
}
/*! Returns a random variate distributed according to the
levy flight with parameters specified by parm
*/
template<class Engine>
result_type operator()(Engine& eng, const param_type& parm) const{
return LevyFlightDistribution (parm)(eng);
}
//! Writes the distribution to a std::ostream
BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, LevyFlightDistribution, ed)
{
os << ed.xm_ << " " << ed.alpha_;
return os;
}
//! Reads the distribution from a std::istream
BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, LevyFlightDistribution, ed)
{
is >> ed.xm_ >> std::ws >> ed.alpha_;
return is;
}
/*! Returns true iff the two distributions will produce identical
sequences of values given equal generators.
*/
BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(LevyFlightDistribution, lhs, rhs)
{ return lhs.xm_ == rhs.xm_ && lhs.alpha_ == rhs.alpha_; }
/*! Returns true iff the two distributions will produce different
sequences of values given equal generators.
*/
BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(LevyFlightDistribution)
private:
result_type xm_;
result_type alpha_;
};
}
#endif
#endif
|