123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- // boost_math.h
- // Copyright John Maddock 2007.
- // Copyright Paul A. Bristow 2007.
- // Use, modification and distribution are subject to the
- // Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt
- // or copy at http://www.boost.org/LICENSE_1_0.txt)
- //#define BOOST_MATH_OVERFLOW_ERROR_POLICY errno_on_error
- //#define BOOST_MATH_ASSERT_UNDEFINED_POLICY false
- // These are now defined in project properties
- // "BOOST_MATH_ASSERT_UNDEFINED_POLICY=0"
- // "BOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error"
- // to avoid complications with pre-compiled headers.
- #ifdef _MSC_VER
- # pragma once
- # pragma warning (disable : 4127)
- #endif
- using namespace System;
- #define TRANSLATE_EXCEPTIONS_BEGIN try{
- #define TRANSLATE_EXCEPTIONS_END \
- }catch(const std::exception& e){ \
- System::String^ s = gcnew System::String(e.what());\
- InvalidOperationException^ se = gcnew InvalidOperationException(s);\
- throw se; \
- }
- namespace boost_math {
- class any_imp
- {
- public:
- // Distribution properties.
- virtual double mean()const = 0;
- virtual double mode()const = 0;
- virtual double median()const = 0;
- virtual double variance()const = 0;
- virtual double standard_deviation()const = 0;
- virtual double skewness()const = 0;
- virtual double kurtosis()const = 0;
- virtual double kurtosis_excess()const = 0;
- virtual double coefficient_of_variation()const = 0;
- // Values computed from random variate x.
- virtual double hazard(double x)const = 0;
- virtual double chf(double x)const = 0;
- virtual double cdf(double x)const = 0;
- virtual double ccdf(double x)const = 0;
- virtual double pdf(double x)const = 0;
- virtual double quantile(double x)const = 0;
- virtual double quantile_c(double x)const = 0;
- // Range & support of x
- virtual double lowest()const = 0;
- virtual double uppermost()const = 0;
- virtual double lower()const = 0;
- virtual double upper()const = 0;
- };
- template <class Distribution>
- class concrete_distribution : public any_imp
- {
- public:
- concrete_distribution(const Distribution& d) : m_dist(d) {}
- // Distribution properties.
- virtual double mean()const
- {
- return boost::math::mean(m_dist);
- }
- virtual double median()const
- {
- return boost::math::median(m_dist);
- }
- virtual double mode()const
- {
- return boost::math::mode(m_dist);
- }
- virtual double variance()const
- {
- return boost::math::variance(m_dist);
- }
- virtual double skewness()const
- {
- return boost::math::skewness(m_dist);
- }
- virtual double standard_deviation()const
- {
- return boost::math::standard_deviation(m_dist);
- }
- virtual double coefficient_of_variation()const
- {
- return boost::math::coefficient_of_variation(m_dist);
- }
- virtual double kurtosis()const
- {
- return boost::math::kurtosis(m_dist);
- }
- virtual double kurtosis_excess()const
- {
- return boost::math::kurtosis_excess(m_dist);
- }
- // Range of x for the distribution.
- virtual double lowest()const
- {
- return boost::math::range(m_dist).first;
- }
- virtual double uppermost()const
- {
- return boost::math::range(m_dist).second;
- }
- // Support of x for the distribution.
- virtual double lower()const
- {
- return boost::math::support(m_dist).first;
- }
- virtual double upper()const
- {
- return boost::math::support(m_dist).second;
- }
- // Values computed from random variate x.
- virtual double hazard(double x)const
- {
- return boost::math::hazard(m_dist, x);
- }
- virtual double chf(double x)const
- {
- return boost::math::chf(m_dist, x);
- }
- virtual double cdf(double x)const
- {
- return boost::math::cdf(m_dist, x);
- }
- virtual double ccdf(double x)const
- {
- return boost::math::cdf(complement(m_dist, x));
- }
- virtual double pdf(double x)const
- {
- return boost::math::pdf(m_dist, x);
- }
- virtual double quantile(double x)const
- {
- return boost::math::quantile(m_dist, x);
- }
- virtual double quantile_c(double x)const
- {
- return boost::math::quantile(complement(m_dist, x));
- }
- private:
- Distribution m_dist;
- };
- public ref class any_distribution
- {
- public:
- // Added methods for this class here.
- any_distribution(int t, double arg1, double arg2, double arg3);
- ~any_distribution()
- {
- reset(0);
- }
- // Is it OK for these to be inline?
- // Distribution properties as 'pointer-to-implementions'.
- double mean()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->mean();
- TRANSLATE_EXCEPTIONS_END
- }
- double median()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->median();
- TRANSLATE_EXCEPTIONS_END
- }
- double mode()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->mode();
- TRANSLATE_EXCEPTIONS_END
- }
- double variance()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->variance();
- TRANSLATE_EXCEPTIONS_END
- }
- double standard_deviation()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->standard_deviation();
- TRANSLATE_EXCEPTIONS_END
- }
- double coefficient_of_variation()
- { // aka Relative Standard deviation.
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->coefficient_of_variation();
- TRANSLATE_EXCEPTIONS_END
- }
- double skewness()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->skewness();
- TRANSLATE_EXCEPTIONS_END
- }
- double kurtosis()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->kurtosis();
- TRANSLATE_EXCEPTIONS_END
- }
- double kurtosis_excess()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->kurtosis_excess();
- TRANSLATE_EXCEPTIONS_END
- }
- // Values computed from random variate x.
- double hazard(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->hazard(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double chf(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->chf(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double cdf(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->cdf(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double ccdf(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->ccdf(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double pdf(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->pdf(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double quantile(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->quantile(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double quantile_c(double x)
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->quantile_c(x);
- TRANSLATE_EXCEPTIONS_END
- }
- double lowest()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->lowest();
- TRANSLATE_EXCEPTIONS_END
- }
- double uppermost()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->uppermost();
- TRANSLATE_EXCEPTIONS_END
- }
- double lower()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->lower();
- TRANSLATE_EXCEPTIONS_END
- }
- double upper()
- {
- TRANSLATE_EXCEPTIONS_BEGIN
- return pimpl->upper();
- TRANSLATE_EXCEPTIONS_END
- }
- // How many distributions are supported:
- static int size();
- // Display name of i'th distribution:
- static System::String^ distribution_name(int i);
- // Name of first distribution parameter, or null if not supported:
- static System::String^ first_param_name(int i);
- // Name of second distribution parameter, or null if not supported:
- static System::String^ second_param_name(int i);
- // Name of third distribution parameter, or null if not supported:
- static System::String^ third_param_name(int i);
- // Default value for first parameter:
- static double first_param_default(int i);
- // Default value for second parameter:
- static double second_param_default(int i);
- // Default value for third parameter:
- static double third_param_default(int i);
- private:
- any_distribution(const any_distribution^)
- { // Constructor is private.
- }
- const any_distribution^ operator=(const any_distribution^ d)
- { // Copy Constructor is private too.
- return d;
- }
- // We really should use a shared_ptr here,
- // but apparently it's not allowed in a managed class like this :-(
- void reset(any_imp* p)
- {
- if(pimpl)
- { // Exists already, so
- delete pimpl;
- }
- pimpl = p;
- }
- any_imp* pimpl;
- };
- }
|