Skip to content

Commit 09e4532

Browse files
feat(add c implementation): add stats/base/dists/bernoulli/median
1 parent fff8d3a commit 09e4532

File tree

9 files changed

+93
-16
lines changed

9 files changed

+93
-16
lines changed

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,12 @@ Returns the [median][median] of a [Bernoulli][bernoulli-distribution] distributi
154154

155155
```c
156156
double out = stdlib_base_dists_bernoulli_median( 0.1 );
157-
// returns ~0
157+
// returns 0
158158
```
159159

160160
The function accepts the following arguments:
161161

162-
- **p**: `[in] double` maximum support
162+
- **p**: `[in] double` success probability.
163163

164164
```c
165165
double stdlib_base_dists_bernoulli_median( const double p );
@@ -194,8 +194,8 @@ int main( void ) {
194194
int i;
195195
196196
for ( i = 0; i < 25; i++ ) {
197-
p = ( (double)rand() / (double)RAND_MAX );
198-
y = stdlib_base_dists_arcsine_median( p );
197+
p = (double)rand() / ( (double)RAND_MAX + 1.0 );
198+
y = stdlib_base_dists_bernoulli_median( p );
199199
printf( "x: %lf, Median(X;p): %lf\n", p, y );
200200
}
201201
}

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/benchmark/benchmark.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24+
var Float64Array = require( '@stdlib/array/float64' );
2425
var randu = require( '@stdlib/random/base/randu' );
2526
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2627
var pkg = require( './../package.json' ).name;
@@ -30,14 +31,20 @@ var median = require( './../lib' );
3031
// MAIN //
3132

3233
bench( pkg, function benchmark( b ) {
34+
var len;
3335
var p;
3436
var y;
3537
var i;
3638

39+
len = 100;
40+
p = new Float64Array( len );
41+
for ( i = 0; i < len; i++ ) {
42+
p[ i ] = randu();
43+
}
44+
3745
b.tic();
3846
for ( i = 0; i < b.iterations; i++ ) {
39-
p = randu();
40-
y = median( p );
47+
y = median( p[ i%len ] );
4148
if ( isnan( y ) ) {
4249
b.fail( 'should not return NaN' );
4350
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/**
2+
* @license Apache-2.0
3+
*
4+
* Copyright (c) 2024 The Stdlib Authors.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
'use strict';
20+
21+
// MODULES //
22+
23+
var resolve = require( 'path' ).resolve;
24+
var bench = require( '@stdlib/bench' );
25+
var Float64Array = require( '@stdlib/array/float64' );
26+
var randu = require( '@stdlib/random/base/randu' );
27+
var isnan = require( '@stdlib/math/base/assert/is-nan' );
28+
var tryRequire = require( '@stdlib/utils/try-require' );
29+
var pkg = require( './../package.json' ).name;
30+
31+
32+
// VARIABLES //
33+
34+
var median = tryRequire( resolve( __dirname, './../lib/native.js' ) );
35+
var opts = {
36+
'skip': ( median instanceof Error )
37+
};
38+
39+
40+
// MAIN //
41+
42+
bench( pkg+'::native', opts, function benchmark( b ) {
43+
var len;
44+
var p;
45+
var y;
46+
var i;
47+
48+
len = 100;
49+
p = new Float64Array( len );
50+
for ( i = 0; i < len; i++ ) {
51+
p[ i ] = randu();
52+
}
53+
54+
b.tic();
55+
for ( i = 0; i < b.iterations; i++ ) {
56+
y = median( p[ i % len ] );
57+
if ( isnan( y ) ) {
58+
b.fail( 'should not return NaN' );
59+
}
60+
}
61+
b.toc();
62+
if ( isnan( y ) ) {
63+
b.fail( 'should not return NaN' );
64+
}
65+
b.pass( 'benchmark finished' );
66+
b.end();
67+
});

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/benchmark/c/benchmark.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,18 @@ static double rand_double( void ) {
9191
*/
9292
static double benchmark( void ) {
9393
double elapsed;
94-
double p;
94+
double p[ 100 ];
9595
double y;
9696
double t;
9797
int i;
9898

99+
for ( i = 0; i < 100; i++ ) {
100+
p[ i ] = rand_double();
101+
}
102+
99103
t = tic();
100104
for ( i = 0; i < ITERATIONS; i++ ) {
101-
p = ( (double)rand() / (double)RAND_MAX );
102-
y = stdlib_base_dists_bernoulli_median( p );
105+
y = stdlib_base_dists_bernoulli_median( p[ i%100 ] );
103106
if ( y != y ) {
104107
printf( "should not return NaN\n" );
105108
break;
@@ -130,4 +133,4 @@ int main( void ) {
130133
printf( "ok %d benchmark finished\n", i+1 );
131134
}
132135
print_summary( REPEATS, REPEATS );
133-
}
136+
}

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/examples/c/example.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ int main( void ) {
2626
int i;
2727

2828
for ( i = 0; i < 25; i++ ) {
29-
p = ( (double)rand() / (double)RAND_MAX );
29+
p = (double)rand() / ( (double)RAND_MAX + 1.0 );
3030
y = stdlib_base_dists_bernoulli_median( p );
3131
printf( "x: %lf , H(X;p): %lf\n", p , y );
3232
}

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/include/stdlib/stats/base/dists/bernoulli/median.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extern "C" {
2727
#endif
2828

2929
/**
30-
* Returns the median of a Bernoulli distribution.
30+
* Returns the median of a Bernoulli distribution with success probability `p`.
3131
*/
3232
double stdlib_base_dists_bernoulli_median( const double p );
3333

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/lib/native.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var addon = require( './../src/addon.node' );
2828
/**
2929
* Returns the median of a Bernoulli distribution.
3030
*
31+
* @private
3132
* @param {Probability} p - success probability
3233
* @returns {PositiveNumber} median
3334
*

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@
7373
]
7474
}
7575
]
76-
}
76+
}

lib/node_modules/@stdlib/stats/base/dists/bernoulli/median/src/main.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@
2727
*
2828
* @example
2929
* double y = stdlib_base_dists_bernoulli_median( 0.1 );
30-
* // returns ~0
30+
* // returns 0
3131
*
3232
* @example
3333
* double y = stdlib_base_dists_bernoulli_median( 0.8 );
34-
* // returns ~1
34+
* // returns 1
3535
*/
3636
double stdlib_base_dists_bernoulli_median( const double p ) {
37-
double q;
3837
if (
3938
stdlib_base_is_nan( p ) ||
4039
p < 0.0 ||

0 commit comments

Comments
 (0)