www.mooseframework.org
BoostDistribution.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "Distribution.h"
13 
14 #ifdef LIBMESH_HAVE_EXTERNAL_BOOST
15 #include "libmesh/ignore_warnings.h"
16 #pragma GCC diagnostic ignored "-Wparentheses"
17 #include <boost/math/distributions.hpp>
18 #include "libmesh/restore_warnings.h"
19 #else
21 {
22 public:
24 };
25 namespace boost
26 {
27 namespace math
28 {
29 template <typename T>
31 
32 template <typename T>
34 
35 template <typename T>
37 }
38 }
39 #endif
40 
47 template <typename T = Real>
48 class BoostDistribution : public Distribution
49 {
50 public:
51  BoostDistribution(const InputParameters & parameters);
52 
53  virtual Real pdf(const Real & x) const override;
54  virtual Real cdf(const Real & x) const override;
55  virtual Real quantile(const Real & y) const override;
56  virtual Real median() const override;
57 
58 protected:
60  std::unique_ptr<T> _distribution_unique_ptr;
61 };
62 
63 template <typename T>
64 BoostDistribution<T>::BoostDistribution(const InputParameters & parameters)
65  : Distribution(parameters)
66 {
67 #ifndef LIBMESH_HAVE_EXTERNAL_BOOST
68  mooseError("The ",
69  getParam<std::string>("type"),
70  " distribution named '",
71  name(),
72  "' requires that libMesh be compiled with an external Boost library, this may be done "
73  "using the --with-boost configure option.");
74 #endif
75 }
76 
77 template <typename T>
78 Real
79 BoostDistribution<T>::pdf(const Real & x) const
80 {
81 #ifdef LIBMESH_HAVE_EXTERNAL_BOOST
82  mooseAssert(_distribution_unique_ptr, "Boost distribution pointer not defined.");
83  TIME_SECTION(_perf_pdf);
84  return boost::math::pdf(*_distribution_unique_ptr, x);
85 #else
86  return x; // unreachable
87 #endif
88 }
89 
90 template <typename T>
91 Real
92 BoostDistribution<T>::cdf(const Real & x) const
93 {
94 #ifdef LIBMESH_HAVE_EXTERNAL_BOOST
95  mooseAssert(_distribution_unique_ptr, "Boost distribution pointer not defined.");
96  TIME_SECTION(_perf_cdf);
97  return boost::math::cdf(*_distribution_unique_ptr, x);
98 #else
99  return x; // unreachable
100 #endif
101 }
102 
103 template <typename T>
104 Real
105 BoostDistribution<T>::quantile(const Real & y) const
106 {
107 #ifdef LIBMESH_HAVE_EXTERNAL_BOOST
108  mooseAssert(_distribution_unique_ptr, "Boost distribution pointer not defined.");
109  TIME_SECTION(_perf_quantile);
110  return boost::math::quantile(*_distribution_unique_ptr, y);
111 #else
112  return y; // unreachable
113 #endif
114 }
115 
116 template <typename T>
117 Real
119 {
120 #ifdef LIBMESH_HAVE_EXTERNAL_BOOST
121  mooseAssert(_distribution_unique_ptr, "Boost distribution pointer not defined.");
122  TIME_SECTION(_perf_median);
123  return boost::math::median(*_distribution_unique_ptr);
124 #else
125  return 0; // unreachable
126 #endif
127 }
boost
Definition: BoostDistribution.h:25
BoostDistributionDummy::BoostDistributionDummy
BoostDistributionDummy(Real...)
Definition: BoostDistribution.h:23
BoostDistribution::quantile
virtual Real quantile(const Real &y) const override
Definition: BoostDistribution.h:105
BoostDistribution::cdf
virtual Real cdf(const Real &x) const override
Definition: BoostDistribution.h:92
BoostDistributionDummy
Definition: BoostDistribution.h:20
BoostDistribution
A class used to as a base for distributions defined by Boost.
Definition: BoostDistribution.h:48
name
const std::string name
Definition: Setup.h:21
BoostDistribution::_distribution_unique_ptr
std::unique_ptr< T > _distribution_unique_ptr
This must be defined by the child class in the constructor.
Definition: BoostDistribution.h:60
BoostDistribution::BoostDistribution
BoostDistribution(const InputParameters &parameters)
Definition: BoostDistribution.h:64
BoostDistribution::median
virtual Real median() const override
Definition: BoostDistribution.h:118
BoostDistribution::pdf
virtual Real pdf(const Real &x) const override
Definition: BoostDistribution.h:79