1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef _LIBCPP___RANDOM_LOGNORMAL_DISTRIBUTION_H 10 #define _LIBCPP___RANDOM_LOGNORMAL_DISTRIBUTION_H 11 12 #include <__config> 13 #include <__random/normal_distribution.h> 14 #include <cmath> 15 #include <iosfwd> 16 #include <limits> 17 18 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19 # pragma GCC system_header 20 #endif 21 22 _LIBCPP_PUSH_MACROS 23 #include <__undef_macros> 24 25 _LIBCPP_BEGIN_NAMESPACE_STD 26 27 template<class _RealType = double> 28 class _LIBCPP_TEMPLATE_VIS lognormal_distribution 29 { 30 public: 31 // types 32 typedef _RealType result_type; 33 34 class _LIBCPP_TEMPLATE_VIS param_type 35 { 36 result_type __m_; 37 result_type __s_; 38 public: 39 typedef lognormal_distribution distribution_type; 40 41 _LIBCPP_INLINE_VISIBILITY 42 explicit param_type(result_type __m = 0, result_type __s = 1) 43 : __m_(__m), __s_(__s) {} 44 45 _LIBCPP_INLINE_VISIBILITY 46 result_type m() const {return __m_;} 47 _LIBCPP_INLINE_VISIBILITY 48 result_type s() const {return __s_;} 49 50 friend _LIBCPP_INLINE_VISIBILITY 51 bool operator==(const param_type& __x, const param_type& __y) 52 {return __x.__m_ == __y.__m_ && __x.__s_ == __y.__s_;} 53 friend _LIBCPP_INLINE_VISIBILITY 54 bool operator!=(const param_type& __x, const param_type& __y) 55 {return !(__x == __y);} 56 }; 57 58 private: 59 normal_distribution<result_type> __nd_; 60 61 public: 62 // constructor and reset functions 63 #ifndef _LIBCPP_CXX03_LANG 64 _LIBCPP_INLINE_VISIBILITY 65 lognormal_distribution() : lognormal_distribution(0) {} 66 _LIBCPP_INLINE_VISIBILITY 67 explicit lognormal_distribution(result_type __m, result_type __s = 1) 68 : __nd_(__m, __s) {} 69 #else 70 _LIBCPP_INLINE_VISIBILITY 71 explicit lognormal_distribution(result_type __m = 0, 72 result_type __s = 1) 73 : __nd_(__m, __s) {} 74 #endif 75 _LIBCPP_INLINE_VISIBILITY 76 explicit lognormal_distribution(const param_type& __p) 77 : __nd_(__p.m(), __p.s()) {} 78 _LIBCPP_INLINE_VISIBILITY 79 void reset() {__nd_.reset();} 80 81 // generating functions 82 template<class _URNG> 83 _LIBCPP_INLINE_VISIBILITY 84 result_type operator()(_URNG& __g) 85 { 86 return _VSTD::exp(__nd_(__g)); 87 } 88 89 template<class _URNG> 90 _LIBCPP_INLINE_VISIBILITY 91 result_type operator()(_URNG& __g, const param_type& __p) 92 { 93 typename normal_distribution<result_type>::param_type __pn(__p.m(), __p.s()); 94 return _VSTD::exp(__nd_(__g, __pn)); 95 } 96 97 // property functions 98 _LIBCPP_INLINE_VISIBILITY 99 result_type m() const {return __nd_.mean();} 100 _LIBCPP_INLINE_VISIBILITY 101 result_type s() const {return __nd_.stddev();} 102 103 _LIBCPP_INLINE_VISIBILITY 104 param_type param() const {return param_type(__nd_.mean(), __nd_.stddev());} 105 _LIBCPP_INLINE_VISIBILITY 106 void param(const param_type& __p) 107 { 108 typename normal_distribution<result_type>::param_type __pn(__p.m(), __p.s()); 109 __nd_.param(__pn); 110 } 111 112 _LIBCPP_INLINE_VISIBILITY 113 result_type min() const {return 0;} 114 _LIBCPP_INLINE_VISIBILITY 115 result_type max() const {return numeric_limits<result_type>::infinity();} 116 117 friend _LIBCPP_INLINE_VISIBILITY 118 bool operator==(const lognormal_distribution& __x, 119 const lognormal_distribution& __y) 120 {return __x.__nd_ == __y.__nd_;} 121 friend _LIBCPP_INLINE_VISIBILITY 122 bool operator!=(const lognormal_distribution& __x, 123 const lognormal_distribution& __y) 124 {return !(__x == __y);} 125 126 template <class _CharT, class _Traits, class _RT> 127 friend 128 basic_ostream<_CharT, _Traits>& 129 operator<<(basic_ostream<_CharT, _Traits>& __os, 130 const lognormal_distribution<_RT>& __x); 131 132 template <class _CharT, class _Traits, class _RT> 133 friend 134 basic_istream<_CharT, _Traits>& 135 operator>>(basic_istream<_CharT, _Traits>& __is, 136 lognormal_distribution<_RT>& __x); 137 }; 138 139 template <class _CharT, class _Traits, class _RT> 140 inline _LIBCPP_INLINE_VISIBILITY 141 basic_ostream<_CharT, _Traits>& 142 operator<<(basic_ostream<_CharT, _Traits>& __os, 143 const lognormal_distribution<_RT>& __x) 144 { 145 return __os << __x.__nd_; 146 } 147 148 template <class _CharT, class _Traits, class _RT> 149 inline _LIBCPP_INLINE_VISIBILITY 150 basic_istream<_CharT, _Traits>& 151 operator>>(basic_istream<_CharT, _Traits>& __is, 152 lognormal_distribution<_RT>& __x) 153 { 154 return __is >> __x.__nd_; 155 } 156 157 _LIBCPP_END_NAMESPACE_STD 158 159 _LIBCPP_POP_MACROS 160 161 #endif // _LIBCPP___RANDOM_LOGNORMAL_DISTRIBUTION_H 162