Skip to content
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

feat: add C ndarray interface and refactor implementation for stats/base/dsnanmeanwd #4496

Merged
merged 77 commits into from
Feb 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
9c85c1e
feat:ndarray-dsnanmeanwd
Neerajpathak07 Jan 3, 2025
d9ac6da
Merge branch 'stdlib-js:develop' into ndarray-dsnanmeanwd
Neerajpathak07 Jan 3, 2025
084f3a6
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
96b79ec
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
86b286b
fix: guard against proxy traps raising exceptions in REPL tokenizer
Snehil-Shah Jan 2, 2025
3da59ed
style: add missing parentheses
kgryte Jan 2, 2025
1dbb675
refactor: update `stats/base/smeanli` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
28cec13
refactor: update `stats/base/smeankbn2` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
d0db054
refactor: update `stats/base/smeankbn` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
f24da86
refactor: update `stats/base/smean` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
d08e176
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
f30ba4a
refactor: update `stats/base/sdsnanmeanors` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
1c42575
refactor: update `stats/base/sdsnanmean` native addon from C++ to C
vivekmaurya001 Jan 2, 2025
c22a02c
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
605cc35
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
b985c04
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
0d709e2
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
29af008
refactor: update `stats/base/snanvariance` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
b3d3e84
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
f63c78f
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
55a4c98
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 2, 2025
6fd7b4a
refactor: update `stats/base/sstdevtk` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
f4044b7
refactor: update `stats/base/snanstdevtk` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
3277593
refactor: update `stats/base/snanstdevpn` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
24e234a
refactor: update `stats/base/snanstdevyc` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
d8a7b76
refactor: update `stats/base/snanvariancech` native addon from C++ to C
DhruvArvindSingh Jan 2, 2025
018db3f
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 3, 2025
cc35a07
feat: add C ndarray interface and refactor implementation for `stats/…
aayush0325 Jan 3, 2025
9e04643
build: do not set custom GitHub token
Planeshifter Jan 3, 2025
258ca09
docs: add missing spaces
Planeshifter Jan 3, 2025
e6b17a5
chore: disable lint rule
Planeshifter Jan 3, 2025
4b68f15
refactor: explicitly return zero for non-integer x
Planeshifter Jan 3, 2025
c2d8f4e
feat: add C implementation for `stats/base/dists/cosine/skewness`
0PrashantYadav0 Jan 3, 2025
8473c05
feat: add C implementation for `stats/base/dists/cosine/median`
0PrashantYadav0 Jan 3, 2025
4138095
feat: add C implementation for `stats/base/dists/cosine/stdev`
0PrashantYadav0 Jan 3, 2025
c32954f
feat: add C implementation for `stats/base/dists/cosine/mode`
0PrashantYadav0 Jan 3, 2025
97f700b
feat: add C implementation for `stats/base/dists/triangular/pdf`
0PrashantYadav0 Jan 3, 2025
26ab606
feat: add C implementation for `stats/base/dists/geometric/entropy`
0PrashantYadav0 Jan 3, 2025
242de23
fix: update include paths and reorder includes
kgryte Jan 3, 2025
00d08a6
fix: update include paths and reorder includes
kgryte Jan 3, 2025
a7828ce
docs: fix include paths in examples
kgryte Jan 3, 2025
21675da
docs: fix include paths in examples
kgryte Jan 3, 2025
9a971dd
fix: update include paths and reorder includes
kgryte Jan 3, 2025
6438e40
style: update include order
kgryte Jan 3, 2025
3466505
fix: update include paths and refactor branching logic
kgryte Jan 3, 2025
32d751b
fix: update include paths and refactor branching logic
kgryte Jan 3, 2025
bea035b
docs: update note
kgryte Jan 3, 2025
5b712b9
docs: update note
kgryte Jan 3, 2025
28dcb1e
fix: update include paths and reorder includes
kgryte Jan 3, 2025
8a9b3bb
feat: add C implementation for `stats/base/dists/logistic/kurtosis`
0PrashantYadav0 Jan 3, 2025
4835445
docs: update related packages sections
stdlib-bot Jan 3, 2025
f919d21
docs: update REPL namespace documentation
stdlib-bot Jan 3, 2025
7195255
feat: update namespace TypeScript declarations
stdlib-bot Jan 3, 2025
04858fe
feat: add C implementation for `stats/base/dists/rayleigh/median`
0PrashantYadav0 Jan 3, 2025
a010d84
docs: update namespace table of contents
stdlib-bot Jan 3, 2025
0f2e956
docs: update list of contributors
stdlib-bot Jan 3, 2025
bde2d34
refactor: move variable declaration
kgryte Jan 3, 2025
81e8792
chore: update copyright years
kgryte Jan 3, 2025
5720377
chore: update copyright year
kgryte Jan 3, 2025
fb7b6fe
chore: update copyright year
kgryte Jan 3, 2025
519f7b3
chore: update mailmap
kgryte Jan 3, 2025
54130b1
chore: update mailmap
kgryte Jan 3, 2025
7ba862f
feat: add C `ndarray` interface and refactor implementation for `stat…
Neerajpathak07 Jan 3, 2025
d4e3a94
refactor: update `math/base/assert/is-even` to follow latest project …
vivekmaurya001 Jan 3, 2025
cee348a
chore: minor clean up
Neerajpathak07 Jan 3, 2025
b4c80be
Merge branch 'ndarray-dsnanmeanwd' of https://github.com/Neerajpathak…
Neerajpathak07 Jan 3, 2025
e3957a3
fix: C examples
Neerajpathak07 Jan 3, 2025
3e1531a
chore: markdown changes
Neerajpathak07 Jan 4, 2025
a9e5493
chore: minor clean up
Neerajpathak07 Jan 18, 2025
b26e94f
chore: update addon
Neerajpathak07 Jan 18, 2025
fbc24ef
chore: update retrun values
Neerajpathak07 Jan 19, 2025
dbbda7b
chore: minor changes in bench
Neerajpathak07 Feb 1, 2025
16ae203
Merge branch 'develop' into ndarray-dsnanmeanwd
Neerajpathak07 Feb 1, 2025
6add70f
chore: handling NaN elements
Neerajpathak07 Feb 1, 2025
04cf7a0
chore: update bench.c to handle NaN elements
Neerajpathak07 Feb 2, 2025
2c59a00
chore: changes from code review
Neerajpathak07 Feb 3, 2025
5423b58
refactor: update bench file
Neerajpathak07 Feb 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
144 changes: 120 additions & 24 deletions lib/node_modules/@stdlib/stats/base/dsnanmeanwd/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,84 +51,79 @@ The [arithmetic mean][arithmetic-mean] is defined as
var dsnanmeanwd = require( '@stdlib/stats/base/dsnanmeanwd' );
```

#### dsnanmeanwd( N, x, stride )
#### dsnanmeanwd( N, x, strideX )

Computes the [arithmetic mean][arithmetic-mean] of a single-precision floating-point strided array `x`, ignoring `NaN` values, using Welford's algorithm with extended accumulation, and returning an extended precision result.

```javascript
var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 1.0, -2.0, NaN, 2.0 ] );
var N = x.length;

var v = dsnanmeanwd( N, x, 1 );
var v = dsnanmeanwd( x.length, x, 1 );
// returns ~0.3333
```

The function has the following parameters:

- **N**: number of indexed elements.
- **x**: input [`Float32Array`][@stdlib/array/float32].
- **stride**: index increment for `x`.
- **strideX**: stride length for `x`.

The `N` and stride parameters determine which elements in `x` are accessed at runtime. For example, to compute the [arithmetic mean][arithmetic-mean] of every other element in `x`,

The `N` and `stride` parameters determine which elements in `x` are accessed at runtime. For example, to compute the [arithmetic mean][arithmetic-mean] of every other element in `x`,
<!-- eslint-disable max-len -->

```javascript
var Float32Array = require( '@stdlib/array/float32' );
var floor = require( '@stdlib/math/base/special/floor' );

var x = new Float32Array( [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0, NaN ] );
var N = floor( x.length / 2 );
var x = new Float32Array( [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0, NaN, NaN ] );

var v = dsnanmeanwd( N, x, 2 );
var v = dsnanmeanwd( 5, x, 2 );
// returns 1.25
```

Note that indexing is relative to the first index. To introduce an offset, use [`typed array`][mdn-typed-array] views.

<!-- eslint-disable stdlib/capitalized-comments -->
<!-- eslint-disable stdlib/capitalized-comments, max-len -->

```javascript
var Float32Array = require( '@stdlib/array/float32' );
var floor = require( '@stdlib/math/base/special/floor' );

var x0 = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN ] );
var x0 = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN, NaN ] );
var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element

var N = floor( x0.length / 2 );

var v = dsnanmeanwd( N, x1, 2 );
var v = dsnanmeanwd( 5, x1, 2 );
// returns 1.25
```

#### dsnanmeanwd.ndarray( N, x, stride, offset )
#### dsnanmeanwd.ndarray( N, x, strideX, offsetX )

Computes the [arithmetic mean][arithmetic-mean] of a single-precision floating-point strided array, ignoring `NaN` values and using Welford's algorithm with extended accumulation and alternative indexing semantics.

```javascript
var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 1.0, -2.0, NaN, 2.0 ] );
var N = x.length;

var v = dsnanmeanwd.ndarray( N, x, 1, 0 );
var v = dsnanmeanwd.ndarray( x.length, x, 1, 0 );
// returns ~0.33333
```

The function has the following additional parameters:

- **offset**: starting index for `x`.
- **offsetX**: starting index for `x`.

While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameter supports indexing semantics based on a starting index. For example, to calculate the [arithmetic mean][arithmetic-mean] for every other element in `x` starting from the second element

While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offset` parameter supports indexing semantics based on a starting index. For example, to calculate the [arithmetic mean][arithmetic-mean] for every other value in `x` starting from the second value
<!-- eslint-disable max-len -->

```javascript
var Float32Array = require( '@stdlib/array/float32' );
var floor = require( '@stdlib/math/base/special/floor' );

var x = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN ] );
var N = floor( x.length / 2 );
var x = new Float32Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN, NaN ] );

var v = dsnanmeanwd.ndarray( N, x, 2, 1 );
var v = dsnanmeanwd.ndarray( 5, x, 2, 1 );
// returns 1.25
```

Expand Down Expand Up @@ -181,6 +176,107 @@ console.log( v );

<!-- /.examples -->

<!-- C usage documentation. -->

<section class="usage">

### Usage

```c
#include "stdlib/stats/base/dsnanmeanwd.h"
```

#### stdlib_strided_dsnanmeanwd( N, \*X, strideX )

Computes the arithmetic mean of a single-precision floating-point strided array, ignoring `NaN` values, using Welford's algorithm with extended accumulation, and returning an extended precision result.

```c
const float x[] = { 1.0f, 2.0f, 0.0f/0.0f, 3.0f, 0.0f/0.0f, 4.0f, 5.0f, 6.0f, 0.0f/0.0f, 7.0f, 8.0f, 0.0f/0.0f };

double v = stdlib_strided_dsnanmeanwd( 6, x, 2 );
// returns ~4.6667
```

The function accepts the following arguments:

- **N**: `[in] CBLAS_INT` number of indexed elements.
- **X**: `[in] float*` input array.
- **strideX**: `[in] CBLAS_INT` stride length for `X`.

```c
double stdlib_strided_dsnanmeanwd( const CBLAS_INT N, const float *X, const CBLAS_INT strideX );
```

#### stdlib_strided_dsnanmeanwd_ndarray( N, \*X, strideX, offsetX )

Computes the arithmetic mean of a single-precision floating-point strided array, ignoring `NaN` values and using Welford's algorithm with extended accumulation and alternative indexing semantics.

```c
const float x[] = { 1.0f, 2.0f, 0.0f/0.0f, 3.0f, 0.0f/0.0f, 4.0f, 5.0f, 6.0f, 0.0f/0.0f, 7.0f, 8.0f, 0.0f/0.0f };

double v = stdlib_strided_dsnanmeanwd_ndarray( 6, x, 2, 0 );
// returns ~4.6667
```

The function accepts the following arguments:

- **N**: `[in] CBLAS_INT` number of indexed elements.
- **X**: `[in] float*` input array.
- **strideX**: `[in] CBLAS_INT` stride length for `X`.
- **offsetX**: `[in] CBLAS_INT` starting index for `X`.

```c
double stdlib_strided_dsnanmeanwd_ndarray( const CBLAS_INT N, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX );
```

</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/dsnanmeanwd.h"
#include <stdio.h>

int main( void ) {
// Create a strided array:
const float x[] = { 1.0f, 2.0f, 0.0f/0.0f, 3.0f, 0.0f/0.0f, 4.0f, 5.0f, 6.0f, 0.0f/0.0f, 7.0f, 8.0f, 0.0f/0.0f };

// Specify the number of elements:
const int N = 6;

// Specify the stride length:
const int strideX = 2;

// Compute the arithmetic mean:
double v = stdlib_strided_dsnanmeanwd( N, x, strideX );

// Print the result:
printf( "mean: %f\n", v );
}
```

</section>

<!-- /.examples -->

</section>

<!-- /.c -->

* * *

<section class="references">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,30 @@
// MODULES //

var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randu' );
var uniform = require( '@stdlib/random/base/uniform' );
var bernoulli = require( '@stdlib/random/base/bernoulli' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var pow = require( '@stdlib/math/base/special/pow' );
var Float32Array = require( '@stdlib/array/float32' );
var pkg = require( './../package.json' ).name;
var dsnanmeanwd = require( './../lib/dsnanmeanwd.js' );


// FUNCTIONS //

/**
* Returns a random number.
*
* @private
* @returns {number} random number
*/
function rand() {
if ( bernoulli( 0.8 ) < 1 ) {
return NaN;
}
return uniform( -10.0, 10.0 );
}

/**
* Creates a benchmark function.
*
Expand All @@ -39,17 +53,7 @@ var dsnanmeanwd = require( './../lib/dsnanmeanwd.js' );
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var x;
var i;

x = new Float32Array( len );
for ( i = 0; i < x.length; i++ ) {
if ( randu() < 0.2 ) {
x[ i ] = NaN;
} else {
x[ i ] = ( randu()*20.0 ) - 10.0;
}
}
var x = filledarrayBy( len, 'float32', rand );
return benchmark;

function benchmark( b ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,11 @@

var resolve = require( 'path' ).resolve;
var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randu' );
var uniform = require( '@stdlib/random/base/uniform' );
var bernoulli = require( '@stdlib/random/base/bernoulli' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var pow = require( '@stdlib/math/base/special/pow' );
var Float32Array = require( '@stdlib/array/float32' );
var tryRequire = require( '@stdlib/utils/try-require' );
var pkg = require( './../package.json' ).name;

Expand All @@ -40,6 +41,19 @@ var opts = {

// FUNCTIONS //

/**
* Returns a random number.
*
* @private
* @returns {number} random number
*/
function rand() {
if ( bernoulli( 0.8 ) < 1 ) {
return NaN;
}
return uniform( -10.0, 10.0 );
}

/**
* Creates a benchmark function.
*
Expand All @@ -48,17 +62,7 @@ var opts = {
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var x;
var i;

x = new Float32Array( len );
for ( i = 0; i < x.length; i++ ) {
if ( randu() < 0.2 ) {
x[ i ] = NaN;
} else {
x[ i ] = ( randu()*20.0 ) - 10.0;
}
}
var x = filledarrayBy( len, 'float32', rand );
return benchmark;

function benchmark( b ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,30 @@
// MODULES //

var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randu' );
var uniform = require( '@stdlib/random/base/uniform' );
var bernoulli = require( '@stdlib/random/base/bernoulli' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var pow = require( '@stdlib/math/base/special/pow' );
var Float32Array = require( '@stdlib/array/float32' );
var pkg = require( './../package.json' ).name;
var dsnanmeanwd = require( './../lib/ndarray.js' );


// FUNCTIONS //

/**
* Returns a random number.
*
* @private
* @returns {number} random number
*/
function rand() {
if ( bernoulli( 0.8 ) < 1 ) {
return NaN;
}
return uniform( -10.0, 10.0 );
}

/**
* Creates a benchmark function.
*
Expand All @@ -39,17 +53,7 @@ var dsnanmeanwd = require( './../lib/ndarray.js' );
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var x;
var i;

x = new Float32Array( len );
for ( i = 0; i < x.length; i++ ) {
if ( randu() < 0.2 ) {
x[ i ] = NaN;
} else {
x[ i ] = ( randu()*20.0 ) - 10.0;
}
}
var x = filledarrayBy( len, 'float32', rand );
return benchmark;

function benchmark( b ) {
Expand Down
Loading