-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
feat: add Wald distribution mean package #9502
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 15 commits
498b3d9
21c98e8
e0830f7
6218210
663a7de
a0496a6
a3ea8f0
8b56e02
5bbc724
f976234
8768066
5a5139c
e54875d
7dfb31a
1a9d7b2
d78d7a5
f4dee69
e2af1d3
042fd0e
bfd0049
bc5f5c3
c3abeb3
cf2bcb0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,255 @@ | ||
| <!-- | ||
|
|
||
| @license Apache-2.0 | ||
|
|
||
| Copyright (c) 2026 The Stdlib Authors. | ||
|
|
||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
|
|
||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
|
|
||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
|
|
||
| --> | ||
|
|
||
| # Mean | ||
|
|
||
| > [Wald][wald-distribution] distribution [expected value][mean]. | ||
|
|
||
| <!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="intro"> | ||
|
|
||
| The [expected value][mean] for a [wald][wald-distribution] random variable with mean `μ` and shape parameter `λ > 0` is | ||
|
|
||
| <!-- <equation class="equation" label="eq:wald_expectation" align="center" raw="\mathbb{E}\left[ X \right] = \mu" alt="Expected value for a normal distribution."> --> | ||
|
||
|
|
||
| ```math | ||
| \mathbb{E}\left[ X \right] = \mu | ||
| ``` | ||
|
|
||
| <!-- <div class="equation" align="center" data-raw-text="\mathbb{E}\left[ X \right] = \mu" data-equation="eq:normal_expectation"> | ||
| <img src="https://cdn.jsdelivr.net/gh/stdlib-js/stdlib@51534079fef45e990850102147e8945fb023d1d0/lib/node_modules/@stdlib/stats/base/dists/normal/mean/docs/img/equation_normal_expectation.svg" alt="Expected value for a normal distribution."> | ||
| <br> | ||
| </div> --> | ||
|
|
||
| <!-- </equation> --> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.intro --> | ||
|
|
||
| <!-- Package usage documentation. --> | ||
|
|
||
| <section class="usage"> | ||
|
|
||
| ## Usage | ||
|
|
||
| ```javascript | ||
| var mean = require( '@stdlib/stats/base/dists/wald/mean' ); | ||
| ``` | ||
|
|
||
| #### mean( mu, lambda ) | ||
|
|
||
| Returns the [expected value][mean] for a [wald][wald-distribution] distribution with parameters `mu` (mean) and `lambda` (shape parameter). | ||
|
|
||
| ```javascript | ||
| var y = mean( 2.0, 1.0 ); | ||
| // returns 2.0 | ||
|
|
||
| y = mean( 0.0, 1.0 ); | ||
| // returns NaN | ||
|
|
||
| y = mean( -1.0, 4.0 ); | ||
| // returns NaN | ||
| ``` | ||
|
|
||
| If provided `NaN` as any argument, the function returns `NaN`. | ||
|
|
||
| ```javascript | ||
| var y = mean( NaN, 1.0 ); | ||
| // returns NaN | ||
|
|
||
| y = mean( 0.0, NaN ); | ||
| // returns NaN | ||
| ``` | ||
|
|
||
| If provided `mu <= 0` or `lambda <= 0`, the function returns `NaN`. | ||
|
|
||
| ```javascript | ||
| var y = mean( 0.0, 0.0 ); | ||
| // returns NaN | ||
|
|
||
| y = mean( 0.0, -1.0 ); | ||
| // returns NaN | ||
|
|
||
| y = mean( -1.0, 0.0 ); | ||
| // returns NaN | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.usage --> | ||
|
|
||
| <!-- Package usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="notes"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.notes --> | ||
|
|
||
| <!-- Package usage examples. --> | ||
|
|
||
| <section class="examples"> | ||
|
|
||
| ## Examples | ||
|
|
||
| <!-- eslint no-undef: "error" --> | ||
|
|
||
| ```javascript | ||
| var uniform = require( '@stdlib/random/array/uniform' ); | ||
| var logEachMap = require( '@stdlib/console/log-each-map' ); | ||
| var EPS = require( '@stdlib/constants/float64/eps' ); | ||
| var mean = require( '@stdlib/stats/base/dists/wald/mean' ); | ||
|
|
||
| var opts = { | ||
| 'dtype': 'float64' | ||
| }; | ||
| var mu = uniform( 10, EPS, 10.0, opts ); | ||
| var lambda = uniform( 10, EPS, 20.0, opts ); | ||
|
|
||
| logEachMap( 'µ: %0.4f, λ: %0.4f, E(X;µ,λ): %0.4f', mu, lambda, mean ); | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.examples --> | ||
|
|
||
| <!-- Section to include cited references. If references are included, add a horizontal rule *before* the section. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="references"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.references --> | ||
|
|
||
| <!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. --> | ||
|
|
||
| <section class="related"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.related --> | ||
|
|
||
| <!-- Section to include C API documentation. --> | ||
|
|
||
| <section class="c"> | ||
|
|
||
| ## C APIs | ||
|
|
||
| <!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="intro"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.intro --> | ||
|
|
||
| <!-- C API usage documentation. --> | ||
|
|
||
| <section class="usage"> | ||
|
|
||
| ### Usage | ||
|
|
||
| ```c | ||
| #include "stdlib/stats/base/dists/wald/mean.h" | ||
| ``` | ||
|
|
||
| #### stdlib_base_dists_wald_mean( mu, lambda ) | ||
|
|
||
| Returns the expected value for a [wald][wald-distribution] distribution with mean `mu` and shape parameter `lambda`. | ||
|
|
||
| - **mu**: `[in] double` mean. | ||
| - **lambda**: `[in] double` shape parameter. | ||
|
|
||
| ```c | ||
| double stdlib_base_dists_wald_mean( const double mu, const double lambda ); | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.usage --> | ||
|
|
||
| <!-- C API usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="notes"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.notes --> | ||
|
|
||
| <!-- C API usage examples. --> | ||
|
|
||
| <section class="examples"> | ||
|
|
||
| ### Examples | ||
|
|
||
| ```c | ||
| #include "stdlib/stats/base/dists/wald/mean.h" | ||
| #include <stdlib.h> | ||
| #include <stdio.h> | ||
|
|
||
| static double random_uniform( const double min, const double max ) { | ||
| double v = (double)rand() / ( (double)RAND_MAX + 1.0 ); | ||
| return min + ( v*(max-min) ); | ||
| } | ||
|
|
||
| int main( void ) { | ||
| double lambda; | ||
| double mu; | ||
| double y; | ||
| int i; | ||
|
|
||
| for ( i = 0; i < 10; i++ ) { | ||
| mu = random_uniform( 0.1, 5.0 ); | ||
| lambda = random_uniform( 0.1, 20.0 ); | ||
| y = stdlib_base_dists_wald_mean( mu, lambda ); | ||
| printf( "µ: %.4f, λ: %.4f, Mean(X;µ,λ): %.4f\n", mu, lambda, y ); | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.examples --> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.c --> | ||
|
|
||
| <!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. --> | ||
|
|
||
| <section class="related"> | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.related --> | ||
|
|
||
| <!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. --> | ||
|
|
||
| <section class="links"> | ||
|
|
||
| [wald-distribution]: https://en.wikipedia.org/wiki/Inverse_Gaussian_distribution | ||
|
|
||
| [mean]: https://en.wikipedia.org/wiki/Mean | ||
|
|
||
| </section> | ||
|
|
||
| <!-- /.links --> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| /** | ||
| * @license Apache-2.0 | ||
| * | ||
| * Copyright (c) 2026 The Stdlib Authors. | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
|
|
||
| 'use strict'; | ||
|
|
||
| // MODULES // | ||
|
|
||
| var bench = require( '@stdlib/bench' ); | ||
| var randu = require( '@stdlib/random/base/randu' ); | ||
| var isnan = require( '@stdlib/math/base/assert/is-nan' ); | ||
| var EPS = require( '@stdlib/constants/float64/eps' ); | ||
| var pkg = require( './../package.json' ).name; | ||
| var mean = require( './../lib' ); | ||
|
|
||
|
|
||
| // MAIN // | ||
|
|
||
| bench( pkg, function benchmark( b ) { | ||
| var lambda; | ||
| var mu; | ||
| var y; | ||
| var i; | ||
|
|
||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| mu = ( randu()*100.0 ) + EPS; | ||
|
||
| lambda = ( randu()*20.0 ) + EPS; | ||
| y = mean( mu, lambda ); | ||
| if ( isnan( y ) ) { | ||
| b.fail( 'should not return NaN' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( isnan( y ) ) { | ||
| b.fail( 'should not return NaN' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,71 @@ | ||
| /** | ||
| * @license Apache-2.0 | ||
| * | ||
| * Copyright (c) 2026 The Stdlib Authors. | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
|
|
||
| 'use strict'; | ||
|
|
||
| // MODULES // | ||
|
|
||
| var resolve = require( 'path' ).resolve; | ||
| var bench = require( '@stdlib/bench' ); | ||
| var Float64Array = require( '@stdlib/array/float64' ); | ||
| var uniform = require( '@stdlib/random/base/uniform' ); | ||
| var isnan = require( '@stdlib/math/base/assert/is-nan' ); | ||
| var tryRequire = require( '@stdlib/utils/try-require' ); | ||
| var format = require( '@stdlib/string/format' ); | ||
| var EPS = require( '@stdlib/constants/float64/eps' ); | ||
| var pkg = require( './../package.json' ).name; | ||
|
|
||
|
|
||
| // VARIABLES // | ||
|
|
||
| var mean = tryRequire( resolve( __dirname, './../lib/native.js' ) ); | ||
| var opts = { | ||
| 'skip': ( mean instanceof Error ) | ||
| }; | ||
|
|
||
|
|
||
| // MAIN // | ||
|
|
||
| bench( format( '%s::native', pkg ), opts, function benchmark( b ) { | ||
| var lambda; | ||
| var len; | ||
| var mu; | ||
| var y; | ||
| var i; | ||
|
|
||
| len = 100; | ||
| mu = new Float64Array( len ); | ||
| lambda = new Float64Array( len ); | ||
| for ( i = 0; i < len; i++ ) { | ||
| mu[ i ] = uniform( EPS, 100.0 ); | ||
| lambda[ i ] = uniform( EPS, 20.0 ); | ||
| } | ||
| b.tic(); | ||
| for ( i = 0; i < b.iterations; i++ ) { | ||
| y = mean( mu[ i % len ], lambda[ i % len ] ); | ||
| if ( isnan( y ) ) { | ||
| b.fail( 'should not return NaN' ); | ||
| } | ||
| } | ||
| b.toc(); | ||
| if ( isnan( y ) ) { | ||
| b.fail( 'should not return NaN' ); | ||
| } | ||
| b.pass( 'benchmark finished' ); | ||
| b.end(); | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since the distribution is named after a person, Abraham Wald, we should capitalize it here and elsewhere and use "Wald distribution".