funcy  1.6.1
cnd.h
1 #pragma once
2 
3 #include <funcy/concepts.h>
4 #include <funcy/util/chainer.h>
5 
6 #include <cmath>
7 
8 namespace funcy
9 {
19  struct CumulativeNormalDistribution : Chainer< CumulativeNormalDistribution >
20  {
25  explicit CumulativeNormalDistribution( double x = 0. ) noexcept
26  {
27  update( x );
28  }
29 
31  void update( double x ) noexcept
32  {
33  x_ = x;
34  value_ = 0.5 * ( 1 + std::erf( x_ * div_sqrt2 ) );
35  d1_ = std::exp( -0.5 * x_ * x_ );
36  }
37 
39  [[nodiscard]] double d0() const noexcept
40  {
41  return value_;
42  }
43 
45  [[nodiscard]] double d1( double dx = 1. ) const noexcept
46  {
47  return div_sqrt2pi * d1_ * dx;
48  }
49 
51  [[nodiscard]] double d2( double dx = 1., double dy = 1. ) const noexcept
52  {
53  return -div_sqrt2pi * x_ * d1_ * dx * dy;
54  }
55 
57  [[nodiscard]] double d3( double dx = 1., double dy = 1., double dz = 1. ) const noexcept
58  {
59  return div_sqrt2pi * ( -d1_ + x_ * x_ * d1_ ) * dx * dy * dz;
60  }
61 
62  private:
63  static const double div_sqrt2;
64  static const double div_sqrt2pi;
65  double value_;
66  double d1_;
67  double x_;
68  };
69 
70  inline const double CumulativeNormalDistribution::div_sqrt2 = 1 / std::sqrt( 2 );
71  inline const double CumulativeNormalDistribution::div_sqrt2pi = 1 / std::sqrt( 2 * M_PI );
72 
73  [[nodiscard]] inline auto cnd( double x )
74  {
75  return CumulativeNormalDistribution( x )();
76  }
77 
84  template < Function F >
85  [[nodiscard]] auto cnd( const F& f )
86  {
87  return CumulativeNormalDistribution()( f );
88  }
89 } // namespace funcy
void update(double x) noexcept
Set point of evaluation.
Definition: cnd.h:31
double d0() const noexcept
Function value.
Definition: cnd.h:39
auto erf(const F &f)
Generate .
Definition: erf.h:73
double d3(double dx=1., double dy=1., double dz=1.) const noexcept
Third (directional) derivative.
Definition: cnd.h:57
CumulativeNormalDistribution(double x=0.) noexcept
Constructor.
Definition: cnd.h:25
auto sqrt(const F &f)
Generate .
Definition: pow.h:404
auto exp(const F &f)
Generate .
Definition: exp.h:117
double d2(double dx=1., double dy=1.) const noexcept
Second (directional) derivative.
Definition: cnd.h:51
Main namespace of the funcy library.
double d1(double dx=1.) const noexcept
First (directional) derivative.
Definition: cnd.h:45
Cumulative standard normal distribution.
Definition: cnd.h:19