LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
probability_discrete.c
浏览该文件的文档.
1#include <math.h>
2
3#include "lmmc/config.h"
4#include "lmmc/numeric.h"
5#include "lmmc/stats.h"
6
8
9
10static 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 }
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
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
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
78 p_param,
79 (lmmc_real_t)(k + 1),
80 (lmmc_real_t)(n - k),
81 out);
82}
83
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
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}
LMMC binary real type and arithmetic spelling.
double lmmc_real_t
Public and internal LMMC real type.
数值标量、特殊函数和 FFT 公共接口。
lmmc_real_t lmmc_stirling_error(lmmc_real_t x)
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。
lmmc_status_t regularized_gamma_upper(lmmc_real_t a, lmmc_real_t x, lmmc_real_t *out)
正则化不完全伽马函数上尾 Q(a, x)。
lmmc_real_t lmmc_deviance_part(lmmc_real_t x, lmmc_real_t mean)
#define LMMC_LOG_SQRT_2PI
基础统计量与组合数学接口。
lmmc_status_t lmmc_dist_poisson_cdf(size_t k, lmmc_real_t lambda, lmmc_real_t *out)
泊松分布累积分布函数;直接计算正则化上不完全伽马尾。
lmmc_status_t lmmc_dist_binomial_cdf(size_t k, size_t n, lmmc_real_t p_param, lmmc_real_t *out)
二项分布累积分布函数。
lmmc_status_t lmmc_dist_poisson_pmf(size_t k, lmmc_real_t lambda, lmmc_real_t *out)
泊松分布概率质量函数。
lmmc_status_t lmmc_dist_binomial_pmf(size_t k, size_t n, lmmc_real_t p, lmmc_real_t *out)
离散分布函数的公共参数约束。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT