LibRan  0.1
Pseudo-random number distribution generator
LRerlang.c
Go to the documentation of this file.
1 
46 /*
47  * Copyright 2019 R.K. Owen, Ph.D.
48  * License see lgpl.md (Gnu Lesser General Public License)
49  */
50 #ifdef __cplusplus
51 extern "C" {
52 #endif
53 
54 #include <math.h>
55 #include "libran.h"
56 
57 /* double */
66 double LRd_erlang_RAN(LR_obj *o) {
67  double zero = 0.0, one = 1.0, u, p = one;
68  int kk = o->k;
69 
70  while (kk--) {
71  do {
72  u = o->ud(o);
73  } while (u == zero);
74  p *= u;
75  }
76  return - o->m.d*log(p);
77 }
78 
87 double LRd_erlang_PDF(LR_obj *o, double x) {
88  double zero = 0.0, one = 1.0, p = one, xx = x;
89  if (isnan(o->s.d))
90  o->s.d = one/o->m.d;
91 
92  if (x < zero) return zero;
93 
94  if (x == zero) {
95  if (o->k == 1) {
96  return o->s.d;
97  } else {
98  return zero;
99  }
100  } else {
101  p *= o->s.d;
102  xx *= p;
103  for (int nn = 1; nn < o->k; nn++) {
104  p *= (xx/nn);
105  }
106  return p * exp(- o->s.d * x);
107  }
108 }
109 
118 double LRd_erlang_CDF(LR_obj *o, double x) {
119  double zero = 0.0, one = 1.0, xx = x, p = one, s = one;
120  if (isnan(o->s.d))
121  o->s.d = one/o->m.d;
122 
123  if (x < zero) return zero;
124 
125  xx *= o->s.d;
126  for (int nn = 1; nn < o->k; nn++) {
127  p *= (xx / nn);
128  s += p;
129  }
130  return one - s * exp(- o->s.d * x);
131 }
132 
133 /* float */
143  float zero = 0.0, one = 1.0, u, p = one;
144  int kk = o->k;
145 
146  while (kk--) {
147  do {
148  u = o->uf(o);
149  } while (u == zero);
150  p *= u;
151  }
152  return - o->m.f*logf(p);
153 }
154 
163 float LRf_erlang_PDF(LR_obj *o, float x) {
164  float zero = 0.0, one = 1.0, p = one, xx = x;
165  if (isnan(o->s.f))
166  o->s.f = one/o->m.f;
167 
168  if (x < zero) return zero;
169 
170  if (x == zero) {
171  if (o->k == 1) {
172  return o->s.f;
173  } else {
174  return zero;
175  }
176  } else {
177  p *= o->s.f;
178  xx *= p;
179  for (int nn = 1; nn < o->k; nn++) {
180  p *= (xx/nn);
181  }
182  return p * expf(- o->s.f * x);
183  }
184 }
185 
194 float LRf_erlang_CDF(LR_obj *o, float x) {
195  float zero = 0.0, one = 1.0, xx = x, p = one, s = one;
196  if (isnan(o->s.f))
197  o->s.f = one/o->m.f;
198 
199  if (x < zero) return zero;
200 
201  xx *= o->s.f;
202  for (int nn = 1; nn < o->k; nn++) {
203  p *= (xx / nn);
204  s += p;
205  }
206  return one - s * expf(- o->s.f * x);
207 }
208 
209 
210 #ifdef __cplusplus
211 }
212 #endif
double LRd_erlang_PDF(LR_obj *o, double x)
LRd_erlang_PDF(LR_obj *o, double x) - Erlang distribution probablity distribution function...
Definition: LRerlang.c:87
float LRf_erlang_CDF(LR_obj *o, float x)
LRf_erlang_CDF(LR_obj *o, float x) - Erlang distribution cumulative distribution function.
Definition: LRerlang.c:194
double LRd_erlang_RAN(LR_obj *o)
LRd_erlang_RAN(LR_obj *o) - double random negative exponential distribution using the inversion metho...
Definition: LRerlang.c:66
double(* ud)(LR_obj *)
Definition: libran.h:154
float LRf_erlang_PDF(LR_obj *o, float x)
LRf_erlang_PDF(LR_obj *o, float x) - Erlang distribution probablity distribution function.
Definition: LRerlang.c:163
double LRd_erlang_CDF(LR_obj *o, double x)
LRd_erlang_CDF(LR_obj *o, double x) - Erlang distribution cumulative distribution function...
Definition: LRerlang.c:118
LR_val s
Definition: libran.h:141
double d
Definition: libran.h:87
float f
Definition: libran.h:86
float(* uf)(LR_obj *)
Definition: libran.h:153
int k
Definition: libran.h:143
The LibRan common header file.
the fundamental LibRan random variate distribution object
Definition: libran.h:134
LR_val m
Definition: libran.h:140
float LRf_erlang_RAN(LR_obj *o)
LRf_erlang_RAN(LR_obj *o) - float random negative exponential distribution using the inversion method...
Definition: LRerlang.c:142