Skip to content

Commit 70c8793

Browse files
committed
statistics: gsl_stats_Qn_from_sorted_data
1 parent f336a67 commit 70c8793

File tree

4 files changed

+61
-2
lines changed

4 files changed

+61
-2
lines changed

gslext.stub.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,5 @@ function gsl_rstat_sd_mean(array $data): float {}
104104
function gsl_rstat_rms(array $data): float {}
105105
function gsl_rstat_skew(array $data): float {}
106106
function gsl_rstat_kurtosis(array $data): float {}
107-
function gsl_rstat_median(array $data): float {}
107+
function gsl_rstat_median(array $data): float {}
108+
function gsl_rstat_quantile_get(array $data, float $factor): float {}

gslext_arginfo.h

Lines changed: 8 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: 4d98192c53df38f52c976d4b6aefd16aed9630ac */
2+
* Stub hash: d927c9345a6b29cd62bd9dbb4a3856ee6ff03cac */
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)
@@ -298,6 +298,11 @@ ZEND_END_ARG_INFO()
298298

299299
#define arginfo_gsl_rstat_median arginfo_gsl_rstat_min
300300

301+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_gsl_rstat_quantile_get, 0, 2, IS_DOUBLE, 0)
302+
ZEND_ARG_TYPE_INFO(0, data, IS_ARRAY, 0)
303+
ZEND_ARG_TYPE_INFO(0, factor, IS_DOUBLE, 0)
304+
ZEND_END_ARG_INFO()
305+
301306

302307
ZEND_FUNCTION(GSL_log1p);
303308
ZEND_FUNCTION(GSL_expm1);
@@ -389,6 +394,7 @@ ZEND_FUNCTION(gsl_rstat_rms);
389394
ZEND_FUNCTION(gsl_rstat_skew);
390395
ZEND_FUNCTION(gsl_rstat_kurtosis);
391396
ZEND_FUNCTION(gsl_rstat_median);
397+
ZEND_FUNCTION(gsl_rstat_quantile_get);
392398

393399

394400
static const zend_function_entry ext_functions[] = {
@@ -482,5 +488,6 @@ static const zend_function_entry ext_functions[] = {
482488
ZEND_FE(gsl_rstat_skew, arginfo_gsl_rstat_skew)
483489
ZEND_FE(gsl_rstat_kurtosis, arginfo_gsl_rstat_kurtosis)
484490
ZEND_FE(gsl_rstat_median, arginfo_gsl_rstat_median)
491+
ZEND_FE(gsl_rstat_quantile_get, arginfo_gsl_rstat_quantile_get)
485492
ZEND_FE_END
486493
};

inc/running_statistics.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// https://www.gnu.org/software/gsl/doc/html/rstat.html
22

33
#include <gsl/gsl_rstat.h>
4+
#include <gsl/gsl_statistics_double.h>
45

56
PHP_FUNCTION(gsl_rstat_min)
67
{
@@ -282,4 +283,38 @@ PHP_FUNCTION(gsl_rstat_median)
282283
RETURN_DOUBLE(rv);
283284
}
284285

286+
PHP_FUNCTION(gsl_rstat_quantile_get)
287+
{
288+
zval *p_data, *p_factor;
289+
long i, n;
290+
double *data, factor, rv;
291+
292+
ZEND_PARSE_PARAMETERS_START(2, 2)
293+
Z_PARAM_ZVAL(p_data)
294+
Z_PARAM_ZVAL(p_factor)
295+
ZEND_PARSE_PARAMETERS_END();
296+
297+
n = (long) zend_array_count(Z_ARR_P(p_data));
298+
__alloc_double_array(&data, n);
299+
__zval_to_double_array(p_data, data, n);
300+
301+
__zval_to_double(p_factor, &factor);
302+
303+
gsl_rstat_quantile_workspace *work = gsl_rstat_quantile_alloc(factor);
304+
305+
n = (long) zend_array_count(Z_ARR_P(p_data));
306+
307+
__alloc_double_array(&data, n);
308+
__zval_to_double_array(p_data, data, n);
309+
310+
for (i = 0; i < n; ++i)
311+
gsl_rstat_quantile_add(data[i], work);
312+
313+
rv = gsl_rstat_quantile_get(work);
314+
315+
gsl_rstat_quantile_reset(work);
316+
gsl_rstat_quantile_free(work);
317+
318+
RETURN_DOUBLE(rv);
319+
}
285320

tests/0008.running_statistics.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ var_dump(gsl_rstat_kurtosis($data));
3737
var_dump("gsl_rstat_median");
3838
var_dump(gsl_rstat_median($data));
3939

40+
$data = [0.00645272, 0.0074002, 0.0120706, 0.0207256, 0.0227282];
41+
var_dump("gsl_rstat_quantile_get");
42+
var_dump(gsl_rstat_quantile_get($data, 0.25));
43+
44+
var_dump("gsl_rstat_quantile_get");
45+
var_dump(gsl_rstat_quantile_get($data, 0.5));
46+
47+
var_dump("gsl_rstat_quantile_get");
48+
var_dump(gsl_rstat_quantile_get($data, 0.75));
49+
4050
?>
4151
--EXPECT--
4252
string(13) "gsl_rstat_min"
@@ -59,3 +69,9 @@ string(18) "gsl_rstat_kurtosis"
5969
float(-1.2217029020861698)
6070
string(16) "gsl_rstat_median"
6171
float(17.2)
72+
string(22) "gsl_rstat_quantile_get"
73+
float(0.0074002)
74+
string(22) "gsl_rstat_quantile_get"
75+
float(0.0120706)
76+
string(22) "gsl_rstat_quantile_get"
77+
float(0.0207256)

0 commit comments

Comments
 (0)