LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
probability_discrete.c
浏览该文件的文档.
1
#include <math.h>
2
3
#include "
lmmc/config.h
"
4
#include "
lmmc/numeric.h
"
5
#include "
lmmc/stats.h
"
6
7
#include "
statistics_internal.h
"
8
9
10
static
lmmc_status_t
store_log_mass(
lmmc_real_t
log_pmf,
lmmc_real_t
* out) {
11
lmmc_real_t
result;
12
if
(!isfinite(log_pmf)) {
13
if
(log_pmf == -INFINITY) {
14
*out = 0.0;
15
return
LMMC_STATUS_OK
;
16
}
17
return
LMMC_STATUS_NUMERICAL_FAILURE
;
18
}
19
result = exp(log_pmf);
20
if
(!isfinite(result) || result < 0.0 || result > 1.0) {
return
LMMC_STATUS_NUMERICAL_FAILURE
; }
21
*out = result;
22
return
LMMC_STATUS_OK
;
23
}
24
25
lmmc_status_t
lmmc_dist_binomial_pmf
(
size_t
k,
size_t
n,
lmmc_real_t
p,
26
lmmc_real_t
* out) {
27
if
(!out) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
28
if
(!isfinite(p) || p < 0.0 || p > 1.0) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
29
if
(k > n) { *out = 0.0;
return
LMMC_STATUS_OK
; }
30
31
/* Use log to avoid overflow: log(C(n,k)) + k*log(p) + (n-k)*log(1-p) */
32
if
(p == 0.0) {
33
*out = (k == 0) ? 1.0 : 0.0;
34
return
LMMC_STATUS_OK
;
35
}
36
if
(p == 1.0) {
37
*out = (k == n) ? 1.0 : 0.0;
38
return
LMMC_STATUS_OK
;
39
}
40
41
{
42
const
lmmc_real_t
trials = (
lmmc_real_t
)n;
43
const
lmmc_real_t
successes = (
lmmc_real_t
)k;
44
const
lmmc_real_t
failures = (
lmmc_real_t
)(n - k);
45
const
lmmc_real_t
q = 1.0 - p;
46
lmmc_real_t
log_pmf;
47
48
if
(k == 0) {
49
log_pmf = trials * log1p(-p);
50
}
else
if
(k == n) {
51
log_pmf = trials * log(p);
52
}
else
{
53
const
lmmc_real_t
correction =
54
lmmc_stirling_error
(trials) -
55
lmmc_stirling_error
(successes) -
56
lmmc_stirling_error
(failures);
57
const
lmmc_real_t
deviance =
58
lmmc_deviance_part
(successes, trials * p) +
59
lmmc_deviance_part
(failures, trials * q);
60
const
lmmc_real_t
log_scale =
61
2.0 *
LMMC_LOG_SQRT_2PI
+ log(successes) +
62
log1p(-successes / trials);
63
log_pmf = correction - deviance - 0.5 * log_scale;
64
}
65
66
return
store_log_mass(log_pmf, out);
67
}
68
}
69
70
lmmc_status_t
lmmc_dist_binomial_cdf
(
size_t
k,
size_t
n,
lmmc_real_t
p_param,
71
lmmc_real_t
* out) {
72
if
(!out) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
73
if
(!isfinite(p_param) || p_param < 0.0 || p_param > 1.0) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
74
if
(k >= n) { *out = 1.0;
return
LMMC_STATUS_OK
; }
75
77
return
regularized_beta_upper
(
78
p_param,
79
(
lmmc_real_t
)(k + 1),
80
(
lmmc_real_t
)(n - k),
81
out);
82
}
83
84
lmmc_status_t
lmmc_dist_poisson_pmf
(
size_t
k,
lmmc_real_t
lambda,
85
lmmc_real_t
* out) {
86
if
(!out) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
87
if
(!isfinite(lambda) || lambda < 0.0) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
88
if
(lambda == 0.0) {
89
*out = (k == 0) ? 1.0 : 0.0;
90
return
LMMC_STATUS_OK
;
91
}
92
93
{
94
const
lmmc_real_t
count = (
lmmc_real_t
)k;
95
lmmc_real_t
log_pmf;
96
97
if
(k == 0) {
98
log_pmf = -lambda;
99
}
else
{
100
log_pmf =
101
-
lmmc_stirling_error
(count) -
102
lmmc_deviance_part
(count, lambda) -
103
0.5 * (2.0 *
LMMC_LOG_SQRT_2PI
+ log(count));
104
}
105
return
store_log_mass(log_pmf, out);
106
}
107
}
108
109
lmmc_status_t
lmmc_dist_poisson_cdf
(
size_t
k,
lmmc_real_t
lambda,
110
lmmc_real_t
* out) {
111
if
(!out) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
112
if
(!isfinite(lambda) || lambda < 0.0) {
return
LMMC_STATUS_INVALID_ARGUMENT
; }
113
if
(lambda == 0.0) { *out = 1.0;
return
LMMC_STATUS_OK
; }
114
115
/* CDF = Q(k+1, lambda); evaluate the small upper-gamma tail directly. */
116
return
regularized_gamma_upper
((
lmmc_real_t
)k + 1.0, lambda, out);
117
}
config.h
LMMC binary real type and arithmetic spelling.
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
numeric.h
数值标量、特殊函数和 FFT 公共接口。
lmmc_stirling_error
lmmc_real_t lmmc_stirling_error(lmmc_real_t x)
定义
statistics_internal.c:14
regularized_beta_upper
lmmc_status_t regularized_beta_upper(lmmc_real_t x, lmmc_real_t a, lmmc_real_t b, lmmc_real_t *out)
计算上尾;1 - x 舍入至端点时仍保留 x。
定义
statistics_internal.c:462
regularized_gamma_upper
lmmc_status_t regularized_gamma_upper(lmmc_real_t a, lmmc_real_t x, lmmc_real_t *out)
正则化不完全伽马函数上尾 Q(a, x)。
定义
statistics_internal.c:211
lmmc_deviance_part
lmmc_real_t lmmc_deviance_part(lmmc_real_t x, lmmc_real_t mean)
定义
statistics_internal.c:54
statistics_internal.h
LMMC_LOG_SQRT_2PI
#define LMMC_LOG_SQRT_2PI
定义
statistics_internal.h:63
stats.h
基础统计量与组合数学接口。
lmmc_dist_poisson_cdf
lmmc_status_t lmmc_dist_poisson_cdf(size_t k, lmmc_real_t lambda, lmmc_real_t *out)
泊松分布累积分布函数;直接计算正则化上不完全伽马尾。
定义
probability_discrete.c:109
lmmc_dist_binomial_cdf
lmmc_status_t lmmc_dist_binomial_cdf(size_t k, size_t n, lmmc_real_t p_param, lmmc_real_t *out)
二项分布累积分布函数。
定义
probability_discrete.c:70
lmmc_dist_poisson_pmf
lmmc_status_t lmmc_dist_poisson_pmf(size_t k, lmmc_real_t lambda, lmmc_real_t *out)
泊松分布概率质量函数。
定义
probability_discrete.c:84
lmmc_dist_binomial_pmf
lmmc_status_t lmmc_dist_binomial_pmf(size_t k, size_t n, lmmc_real_t p, lmmc_real_t *out)
离散分布函数的公共参数约束。
定义
probability_discrete.c:25
lmmc_status_t
lmmc_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_NUMERICAL_FAILURE
定义
status.h:29
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
src
probability_discrete.c
生成于
, 为 LMMC使用
1.18.0