Skip to content

Commit f336a67

Browse files
committed
statistics: running statistcis without quantiles
1 parent dfddd01 commit f336a67

File tree

6 files changed

+406
-4
lines changed

6 files changed

+406
-4
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
* []()
1818
* []()
1919
* [Statistics](https://www.gnu.org/software/gsl/doc/html/statistics.html)
20+
* [Running Statistics](https://www.gnu.org/software/gsl/doc/html/rstat.html)
2021

2122
Full list of functions in [PHP stub file](gslext.stub.php)
2223

2324
## Tests
24-
* tests in this extension are only to check if functions are working. Correctness of calculations relay on library
25+
* tests in this extension are only to check if functions are working. Correctness of calculations relays on library

gslext.stub.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,16 @@ function gsl_stats_mad(array $data, int $stride): float {}
9292
function gsl_stats_Sn0_from_sorted_data(array $sorted_data, int $stride): float {}
9393
function gsl_stats_Sn_from_sorted_data(array $sorted_data, int $stride): float {}
9494
function gsl_stats_Qn0_from_sorted_data(array $sorted_data, int $stride): float {}
95-
function gsl_stats_Qn_from_sorted_data(array $sorted_data, int $stride): float {}
95+
function gsl_stats_Qn_from_sorted_data(array $sorted_data, int $stride): float {}
96+
97+
// Running Statistics
98+
function gsl_rstat_min(array $data): float {}
99+
function gsl_rstat_max(array $data): float {}
100+
function gsl_rstat_mean(array $data): float {}
101+
function gsl_rstat_variance(array $data): float {}
102+
function gsl_rstat_sd(array $data): float {}
103+
function gsl_rstat_sd_mean(array $data): float {}
104+
function gsl_rstat_rms(array $data): float {}
105+
function gsl_rstat_skew(array $data): float {}
106+
function gsl_rstat_kurtosis(array $data): float {}
107+
function gsl_rstat_median(array $data): float {}

gslext_arginfo.h

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: ff2821df6a63df9aa60e187ced5591b4928cf084 */
2+
* Stub hash: 4d98192c53df38f52c976d4b6aefd16aed9630ac */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_GSL_log1p, 0, 1, IS_DOUBLE, 0)
55
ZEND_ARG_TYPE_INFO(0, x, IS_DOUBLE, 0)
@@ -276,6 +276,28 @@ ZEND_END_ARG_INFO()
276276

277277
#define arginfo_gsl_stats_Qn_from_sorted_data arginfo_gsl_stats_median_from_sorted_data
278278

279+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gsl_rstat_min, 0, 1, IS_DOUBLE, 0)
280+
ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
281+
ZEND_END_ARG_INFO()
282+
283+
#define arginfo_gsl_rstat_max arginfo_gsl_rstat_min
284+
285+
#define arginfo_gsl_rstat_mean arginfo_gsl_rstat_min
286+
287+
#define arginfo_gsl_rstat_variance arginfo_gsl_rstat_min
288+
289+
#define arginfo_gsl_rstat_sd arginfo_gsl_rstat_min
290+
291+
#define arginfo_gsl_rstat_sd_mean arginfo_gsl_rstat_min
292+
293+
#define arginfo_gsl_rstat_rms arginfo_gsl_rstat_min
294+
295+
#define arginfo_gsl_rstat_skew arginfo_gsl_rstat_min
296+
297+
#define arginfo_gsl_rstat_kurtosis arginfo_gsl_rstat_min
298+
299+
#define arginfo_gsl_rstat_median arginfo_gsl_rstat_min
300+
279301

280302
ZEND_FUNCTION(GSL_log1p);
281303
ZEND_FUNCTION(GSL_expm1);
@@ -357,6 +379,16 @@ ZEND_FUNCTION(gsl_stats_Sn0_from_sorted_data);
357379
ZEND_FUNCTION(gsl_stats_Sn_from_sorted_data);
358380
ZEND_FUNCTION(gsl_stats_Qn0_from_sorted_data);
359381
ZEND_FUNCTION(gsl_stats_Qn_from_sorted_data);
382+
ZEND_FUNCTION(gsl_rstat_min);
383+
ZEND_FUNCTION(gsl_rstat_max);
384+
ZEND_FUNCTION(gsl_rstat_mean);
385+
ZEND_FUNCTION(gsl_rstat_variance);
386+
ZEND_FUNCTION(gsl_rstat_sd);
387+
ZEND_FUNCTION(gsl_rstat_sd_mean);
388+
ZEND_FUNCTION(gsl_rstat_rms);
389+
ZEND_FUNCTION(gsl_rstat_skew);
390+
ZEND_FUNCTION(gsl_rstat_kurtosis);
391+
ZEND_FUNCTION(gsl_rstat_median);
360392

361393

362394
static const zend_function_entry ext_functions[] = {
@@ -440,5 +472,15 @@ static const zend_function_entry ext_functions[] = {
440472
ZEND_FE(gsl_stats_Sn_from_sorted_data, arginfo_gsl_stats_Sn_from_sorted_data)
441473
ZEND_FE(gsl_stats_Qn0_from_sorted_data, arginfo_gsl_stats_Qn0_from_sorted_data)
442474
ZEND_FE(gsl_stats_Qn_from_sorted_data, arginfo_gsl_stats_Qn_from_sorted_data)
475+
ZEND_FE(gsl_rstat_min, arginfo_gsl_rstat_min)
476+
ZEND_FE(gsl_rstat_max, arginfo_gsl_rstat_max)
477+
ZEND_FE(gsl_rstat_mean, arginfo_gsl_rstat_mean)
478+
ZEND_FE(gsl_rstat_variance, arginfo_gsl_rstat_variance)
479+
ZEND_FE(gsl_rstat_sd, arginfo_gsl_rstat_sd)
480+
ZEND_FE(gsl_rstat_sd_mean, arginfo_gsl_rstat_sd_mean)
481+
ZEND_FE(gsl_rstat_rms, arginfo_gsl_rstat_rms)
482+
ZEND_FE(gsl_rstat_skew, arginfo_gsl_rstat_skew)
483+
ZEND_FE(gsl_rstat_kurtosis, arginfo_gsl_rstat_kurtosis)
484+
ZEND_FE(gsl_rstat_median, arginfo_gsl_rstat_median)
443485
ZEND_FE_END
444486
};

inc/_functions.inc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
#include "small_int_pows.c"
33
#include "min_max.c"
44
#include "gsl_fcmp.c"
5-
#include "statistics.c"
5+
#include "statistics.c"
6+
#include "running_statistics.c"

inc/running_statistics.c

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
// https://www.gnu.org/software/gsl/doc/html/rstat.html
2+
3+
#include <gsl/gsl_rstat.h>
4+
5+
PHP_FUNCTION(gsl_rstat_min)
6+
{
7+
zval *p_data;
8+
long i, n;
9+
double *data, rv;
10+
11+
ZEND_PARSE_PARAMETERS_START(1, 1)
12+
Z_PARAM_ZVAL(p_data)
13+
ZEND_PARSE_PARAMETERS_END();
14+
15+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
16+
17+
n = (long) zend_array_count(Z_ARR_P(p_data));
18+
19+
__alloc_double_array(&data, n);
20+
__zval_to_double_array(p_data, data, n);
21+
22+
for (i = 0; i < n; ++i)
23+
gsl_rstat_add(data[i], rstat_p);
24+
25+
rv = gsl_rstat_min(rstat_p);
26+
27+
gsl_rstat_reset(rstat_p);
28+
gsl_rstat_free(rstat_p);
29+
30+
RETURN_DOUBLE(rv);
31+
}
32+
33+
PHP_FUNCTION(gsl_rstat_max)
34+
{
35+
zval *p_data;
36+
long i, n;
37+
double *data, rv;
38+
39+
ZEND_PARSE_PARAMETERS_START(1, 1)
40+
Z_PARAM_ZVAL(p_data)
41+
ZEND_PARSE_PARAMETERS_END();
42+
43+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
44+
45+
n = (long) zend_array_count(Z_ARR_P(p_data));
46+
47+
__alloc_double_array(&data, n);
48+
__zval_to_double_array(p_data, data, n);
49+
50+
for (i = 0; i < n; ++i)
51+
gsl_rstat_add(data[i], rstat_p);
52+
53+
rv = gsl_rstat_max(rstat_p);
54+
55+
gsl_rstat_reset(rstat_p);
56+
gsl_rstat_free(rstat_p);
57+
58+
RETURN_DOUBLE(rv);
59+
}
60+
61+
PHP_FUNCTION(gsl_rstat_mean)
62+
{
63+
zval *p_data;
64+
long i, n;
65+
double *data, rv;
66+
67+
ZEND_PARSE_PARAMETERS_START(1, 1)
68+
Z_PARAM_ZVAL(p_data)
69+
ZEND_PARSE_PARAMETERS_END();
70+
71+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
72+
73+
n = (long) zend_array_count(Z_ARR_P(p_data));
74+
75+
__alloc_double_array(&data, n);
76+
__zval_to_double_array(p_data, data, n);
77+
78+
for (i = 0; i < n; ++i)
79+
gsl_rstat_add(data[i], rstat_p);
80+
81+
rv = gsl_rstat_mean(rstat_p);
82+
83+
gsl_rstat_reset(rstat_p);
84+
gsl_rstat_free(rstat_p);
85+
86+
RETURN_DOUBLE(rv);
87+
}
88+
89+
PHP_FUNCTION(gsl_rstat_variance)
90+
{
91+
zval *p_data;
92+
long i, n;
93+
double *data, rv;
94+
95+
ZEND_PARSE_PARAMETERS_START(1, 1)
96+
Z_PARAM_ZVAL(p_data)
97+
ZEND_PARSE_PARAMETERS_END();
98+
99+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
100+
101+
n = (long) zend_array_count(Z_ARR_P(p_data));
102+
103+
__alloc_double_array(&data, n);
104+
__zval_to_double_array(p_data, data, n);
105+
106+
for (i = 0; i < n; ++i)
107+
gsl_rstat_add(data[i], rstat_p);
108+
109+
rv = gsl_rstat_variance(rstat_p);
110+
111+
gsl_rstat_reset(rstat_p);
112+
gsl_rstat_free(rstat_p);
113+
114+
RETURN_DOUBLE(rv);
115+
}
116+
117+
PHP_FUNCTION(gsl_rstat_sd)
118+
{
119+
zval *p_data;
120+
long i, n;
121+
double *data, rv;
122+
123+
ZEND_PARSE_PARAMETERS_START(1, 1)
124+
Z_PARAM_ZVAL(p_data)
125+
ZEND_PARSE_PARAMETERS_END();
126+
127+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
128+
129+
n = (long) zend_array_count(Z_ARR_P(p_data));
130+
131+
__alloc_double_array(&data, n);
132+
__zval_to_double_array(p_data, data, n);
133+
134+
for (i = 0; i < n; ++i)
135+
gsl_rstat_add(data[i], rstat_p);
136+
137+
rv = gsl_rstat_sd(rstat_p);
138+
139+
gsl_rstat_reset(rstat_p);
140+
gsl_rstat_free(rstat_p);
141+
142+
RETURN_DOUBLE(rv);
143+
}
144+
145+
PHP_FUNCTION(gsl_rstat_sd_mean)
146+
{
147+
zval *p_data;
148+
long i, n;
149+
double *data, rv;
150+
151+
ZEND_PARSE_PARAMETERS_START(1, 1)
152+
Z_PARAM_ZVAL(p_data)
153+
ZEND_PARSE_PARAMETERS_END();
154+
155+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
156+
157+
n = (long) zend_array_count(Z_ARR_P(p_data));
158+
159+
__alloc_double_array(&data, n);
160+
__zval_to_double_array(p_data, data, n);
161+
162+
for (i = 0; i < n; ++i)
163+
gsl_rstat_add(data[i], rstat_p);
164+
165+
rv = gsl_rstat_sd_mean(rstat_p);
166+
167+
gsl_rstat_reset(rstat_p);
168+
gsl_rstat_free(rstat_p);
169+
170+
RETURN_DOUBLE(rv);
171+
}
172+
173+
PHP_FUNCTION(gsl_rstat_rms)
174+
{
175+
zval *p_data;
176+
long i, n;
177+
double *data, rv;
178+
179+
ZEND_PARSE_PARAMETERS_START(1, 1)
180+
Z_PARAM_ZVAL(p_data)
181+
ZEND_PARSE_PARAMETERS_END();
182+
183+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
184+
185+
n = (long) zend_array_count(Z_ARR_P(p_data));
186+
187+
__alloc_double_array(&data, n);
188+
__zval_to_double_array(p_data, data, n);
189+
190+
for (i = 0; i < n; ++i)
191+
gsl_rstat_add(data[i], rstat_p);
192+
193+
rv = gsl_rstat_rms(rstat_p);
194+
195+
gsl_rstat_reset(rstat_p);
196+
gsl_rstat_free(rstat_p);
197+
198+
RETURN_DOUBLE(rv);
199+
}
200+
201+
PHP_FUNCTION(gsl_rstat_skew)
202+
{
203+
zval *p_data;
204+
long i, n;
205+
double *data, rv;
206+
207+
ZEND_PARSE_PARAMETERS_START(1, 1)
208+
Z_PARAM_ZVAL(p_data)
209+
ZEND_PARSE_PARAMETERS_END();
210+
211+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
212+
213+
n = (long) zend_array_count(Z_ARR_P(p_data));
214+
215+
__alloc_double_array(&data, n);
216+
__zval_to_double_array(p_data, data, n);
217+
218+
for (i = 0; i < n; ++i)
219+
gsl_rstat_add(data[i], rstat_p);
220+
221+
rv = gsl_rstat_skew(rstat_p);
222+
223+
gsl_rstat_reset(rstat_p);
224+
gsl_rstat_free(rstat_p);
225+
226+
RETURN_DOUBLE(rv);
227+
}
228+
229+
PHP_FUNCTION(gsl_rstat_kurtosis)
230+
{
231+
zval *p_data;
232+
long i, n;
233+
double *data, rv;
234+
235+
ZEND_PARSE_PARAMETERS_START(1, 1)
236+
Z_PARAM_ZVAL(p_data)
237+
ZEND_PARSE_PARAMETERS_END();
238+
239+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
240+
241+
n = (long) zend_array_count(Z_ARR_P(p_data));
242+
243+
__alloc_double_array(&data, n);
244+
__zval_to_double_array(p_data, data, n);
245+
246+
for (i = 0; i < n; ++i)
247+
gsl_rstat_add(data[i], rstat_p);
248+
249+
rv = gsl_rstat_kurtosis(rstat_p);
250+
251+
gsl_rstat_reset(rstat_p);
252+
gsl_rstat_free(rstat_p);
253+
254+
RETURN_DOUBLE(rv);
255+
}
256+
257+
PHP_FUNCTION(gsl_rstat_median)
258+
{
259+
zval *p_data;
260+
long i, n;
261+
double *data, rv;
262+
263+
ZEND_PARSE_PARAMETERS_START(1, 1)
264+
Z_PARAM_ZVAL(p_data)
265+
ZEND_PARSE_PARAMETERS_END();
266+
267+
gsl_rstat_workspace *rstat_p = gsl_rstat_alloc();
268+
269+
n = (long) zend_array_count(Z_ARR_P(p_data));
270+
271+
__alloc_double_array(&data, n);
272+
__zval_to_double_array(p_data, data, n);
273+
274+
for (i = 0; i < n; ++i)
275+
gsl_rstat_add(data[i], rstat_p);
276+
277+
rv = gsl_rstat_median(rstat_p);
278+
279+
gsl_rstat_reset(rstat_p);
280+
gsl_rstat_free(rstat_p);
281+
282+
RETURN_DOUBLE(rv);
283+
}
284+
285+

0 commit comments

Comments
 (0)