Skip to content

feat: refactor and add protocol support to stats/base/nanmskmin #6103

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

Merged
merged 74 commits into from
Jun 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
4d6af4e
Update benchmark.js
Kaushikgtm Mar 16, 2025
afdfd7e
Update benchmark.ndarray.js
Kaushikgtm Mar 16, 2025
fa2341c
Update index.d.ts
Kaushikgtm Mar 16, 2025
c52561c
Update test.ts
Kaushikgtm Mar 16, 2025
fe95245
Update index.js
Kaushikgtm Mar 16, 2025
7f0473a
Create accessors.js
Kaushikgtm Mar 16, 2025
044a04d
Update nanmskmin.js
Kaushikgtm Mar 16, 2025
18082c5
Update ndarray.js
Kaushikgtm Mar 16, 2025
f99d8d4
Update test.nanmskmin.js
Kaushikgtm Mar 16, 2025
9c887ff
Update test.ndarray.js
Kaushikgtm Mar 16, 2025
273ee7b
Update README.md
Kaushikgtm Mar 16, 2025
6e8aa14
Update repl.txt
Kaushikgtm Mar 16, 2025
fb8175b
Update ndarray.js
Kaushikgtm Mar 16, 2025
74ccbe2
Update accessors.js
Kaushikgtm Mar 16, 2025
c8c1dc5
Update accessors.js
Kaushikgtm Mar 16, 2025
e17e7c0
Update accessors.js
Kaushikgtm Mar 16, 2025
327c8c9
Update ndarray.js
Kaushikgtm Mar 16, 2025
89a9531
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
d89c05b
Update test.nanmskmin.js
Kaushikgtm Mar 17, 2025
0f1945b
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
3a0d34f
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
6326a62
Update ndarray.js
Kaushikgtm Mar 17, 2025
ecc6331
Update test.ts
Kaushikgtm Mar 17, 2025
8fa809d
Update accessors.js
Kaushikgtm Mar 17, 2025
33c2d14
Update ndarray.js
Kaushikgtm Mar 17, 2025
ebec3a1
Update test.nanmskmin.js
Kaushikgtm Mar 17, 2025
6889442
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
b9f3dd2
Update ndarray.js
Kaushikgtm Mar 17, 2025
c766eb8
Update ndarray.js
Kaushikgtm Mar 17, 2025
06801be
Update accessors.js
Kaushikgtm Mar 17, 2025
1467368
Update ndarray.js
Kaushikgtm Mar 17, 2025
6cee644
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
e05d710
Update ndarray.js
Kaushikgtm Mar 17, 2025
800bd9a
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
0112525
Update test.ndarray.js
Kaushikgtm Mar 17, 2025
bf57f65
Update test.nanmskmin.js
Kaushikgtm Mar 17, 2025
f83bf2a
Update test.nanmskmin.js
Kaushikgtm Mar 17, 2025
def19f2
Update accessors.js
Kaushikgtm Mar 17, 2025
9334754
Update accessors.js
Kaushikgtm Mar 17, 2025
9c7bf6d
Update accessors.js
Kaushikgtm Mar 17, 2025
87d53fb
Update nanmskmin.js
Kaushikgtm Mar 18, 2025
b6c98c8
Update nanmskmin.js
Kaushikgtm Mar 18, 2025
3f223fd
Update test.nanmskmin.js
Kaushikgtm Mar 18, 2025
91b1269
Update nanmskmin.js
Kaushikgtm Mar 18, 2025
b7cda67
Update nanmskmin.js
Kaushikgtm Mar 18, 2025
748ecec
Update nanmskmin.js
Kaushikgtm Mar 19, 2025
97c5fa2
Update ndarray.js
Kaushikgtm Mar 21, 2025
940d885
Update nanmskmin.js
Kaushikgtm Mar 21, 2025
898e502
Update nanmskmin.js
Kaushikgtm Mar 21, 2025
7a911c0
Update accessors.js
Kaushikgtm Mar 21, 2025
29f629e
Update nanmskmin.js
Kaushikgtm Mar 21, 2025
47f517c
Update accessors.js
Kaushikgtm Mar 21, 2025
80b13f6
Update accessors.js
Kaushikgtm Mar 21, 2025
06d52ec
Update accessors.js
Kaushikgtm Mar 21, 2025
8c19682
Update accessors.js
Kaushikgtm Mar 21, 2025
46f4814
Update accessors.js
Kaushikgtm Mar 21, 2025
9ff507d
Update test.ndarray.js
Kaushikgtm Mar 21, 2025
f32d1cf
Update test.nanmskmin.js
Kaushikgtm Mar 21, 2025
fc34720
Update test.nanmskmin.js
Kaushikgtm Mar 22, 2025
02d24c0
Update test.nanmskmin.js
Kaushikgtm Mar 22, 2025
cf6abb6
Update accessors.js
Kaushikgtm Mar 22, 2025
04c23eb
Update accessors.js
Kaushikgtm Mar 22, 2025
9f7dda4
Update README.md
Kaushikgtm Mar 22, 2025
fe56bf0
Update accessors.js
Kaushikgtm Mar 22, 2025
fba2aa7
Update accessors.js
Kaushikgtm Mar 22, 2025
7fa90d1
Update accessors.js
Kaushikgtm Mar 22, 2025
8f388ad
Update accessors.js
Kaushikgtm Mar 22, 2025
c52ccf8
Update accessors.js
Kaushikgtm Mar 22, 2025
35ccdc2
Merge branch 'develop' into Kaushikgtm-patch-nanmskmin
gururaj1512 Jun 24, 2025
1f899fe
refactor: refactor `stats/base/nanmskmin`
gururaj1512 Jun 24, 2025
abcc902
chore: update copyright years
stdlib-bot Jun 24, 2025
d3fc1a7
Update index.js
gururaj1512 Jun 24, 2025
df7bc43
style: remove decimals
kgryte Jun 25, 2025
0419e22
style: remove decimals
kgryte Jun 25, 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
73 changes: 29 additions & 44 deletions lib/node_modules/@stdlib/stats/base/nanmskmin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );

#### nanmskmin( N, x, strideX, mask, strideMask )

Computes the minimum value of a strided array `x` according to a `mask`, ignoring `NaN` values.
Computes the minimum value of a strided array according to a `mask`, ignoring `NaN` values.

```javascript
var x = [ 1.0, -2.0, -4.0, 2.0, NaN ];
Expand All @@ -52,41 +52,35 @@ The function has the following parameters:

- **N**: number of indexed elements.
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
- **strideX**: index increment for `x`.
- **strideX**: stride length for `x`.
- **mask**: mask [`Array`][mdn-array] or [`typed array`][mdn-typed-array]. If a `mask` array element is `0`, the corresponding element in `x` is considered valid and **included** in computation. If a `mask` array element is `1`, the corresponding element in `x` is considered invalid/missing and **excluded** from computation.
- **strideMask**: index increment for `mask`.
- **strideMask**: stride length for `mask`.

The `N` and `stride` parameters determine which elements are accessed at runtime. For example, to compute the minimum value of every other element in `x`,
The `N` and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the minimum value of every other element in `x`,

```javascript
var floor = require( '@stdlib/math/base/special/floor' );
var x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, -5.0, -6.0, NaN, NaN ];
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ];

var x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, -5.0, -6.0 ];
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
var N = floor( x.length / 2 );

var v = nanmskmin( N, x, 2, mask, 2 );
var v = nanmskmin( 5, x, 2, mask, 2 );
// returns -7.0
```

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

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

```javascript
var Float64Array = require( '@stdlib/array/float64' );
var Uint8Array = require( '@stdlib/array/uint8' );
var floor = require( '@stdlib/math/base/special/floor' );

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

var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ] );
var mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element

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

var v = nanmskmin( N, x1, 2, mask1, 2 );
var v = nanmskmin( 5, x1, 2, mask1, 2 );
// returns -2.0
```

Expand All @@ -107,16 +101,13 @@ The function has the following additional parameters:
- **offsetX**: starting index for `x`.
- **offsetMask**: starting index for `mask`.

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 minimum value for every other value in `x` starting from the second value
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example, to calculate the minimum value for every other element in `x` starting from the second element

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

var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0 ];
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
var N = floor( x.length / 2 );
var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0, NaN, NaN ];
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ];

var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );
var v = nanmskmin.ndarray( 5, x, 2, 1, mask, 2, 1 );
// returns -2.0
```

Expand All @@ -130,6 +121,7 @@ var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );

- If `N <= 0`, both functions return `NaN`.
- Depending on the environment, the typed versions ([`dnanmskmin`][@stdlib/stats/strided/dnanmskmin], [`snanmskmin`][@stdlib/stats/strided/snanmskmin], etc.) are likely to be significantly more performant.
- Both functions support array-like objects having getter and setter accessors for array element access (e.g., [`@stdlib/array/base/accessor`][@stdlib/array/base/accessor]).

</section>

Expand All @@ -142,31 +134,22 @@ var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );
<!-- eslint no-undef: "error" -->

```javascript
var randu = require( '@stdlib/random/base/randu' );
var round = require( '@stdlib/math/base/special/round' );
var Float64Array = require( '@stdlib/array/float64' );
var Uint8Array = require( '@stdlib/array/uint8' );
var uniform = require( '@stdlib/random/base/uniform' );
var bernoulli = require( '@stdlib/random/base/bernoulli' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );

var mask;
var x;
var i;

x = new Float64Array( 10 );
mask = new Uint8Array( x.length );
for ( i = 0; i < x.length; i++ ) {
if ( randu() < 0.2 ) {
mask[ i ] = 1;
} else {
mask[ i ] = 0;
}
if ( randu() < 0.1 ) {
x[ i ] = NaN;
} else {
x[ i ] = round( (randu()*100.0) - 50.0 );
function rand() {
if ( bernoulli( 0.8 ) < 1 ) {
return NaN;
}
return uniform( -50.0, 50.0 );
}

var x = filledarrayBy( 10, 'float64', rand );
console.log( x );

var mask = filledarrayBy( x.length, 'uint8', bernoulli.factory( 0.2 ) );
console.log( mask );

var v = nanmskmin( x.length, x, 1, mask, 1 );
Expand Down Expand Up @@ -203,6 +186,8 @@ console.log( v );

[mdn-typed-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor

<!-- <related-links> -->

[@stdlib/stats/strided/dnanmskmin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/strided/dnanmskmin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +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 pkg = require( './../package.json' ).name;
var nanmskmin = require( './../lib/nanmskmin.js' );
var nanmskmin = require( './../lib/main.js' );


// FUNCTIONS //

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

/**
* Creates a benchmark function.
*
Expand All @@ -40,18 +55,9 @@ var nanmskmin = require( './../lib/nanmskmin.js' );
function createBenchmark( len ) {
var mask;
var x;
var i;

x = [];
mask = [];
for ( i = 0; i < len; i++ ) {
if ( randu() < 0.2 ) {
mask.push( 1 );
} else {
mask.push( 0 );
}
x.push( ( randu()*20.0 ) - 10.0 );
}
x = filledarrayBy( len, 'generic', rand );
mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
return benchmark;

function benchmark( b ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
// 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 pkg = require( './../package.json' ).name;
Expand All @@ -30,6 +32,19 @@ var nanmskmin = require( './../lib/ndarray.js' );

// FUNCTIONS //

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

/**
* Creates a benchmark function.
*
Expand All @@ -40,18 +55,9 @@ var nanmskmin = require( './../lib/ndarray.js' );
function createBenchmark( len ) {
var mask;
var x;
var i;

x = [];
mask = [];
for ( i = 0; i < len; i++ ) {
if ( randu() < 0.2 ) {
mask.push( 1 );
} else {
mask.push( 0 );
}
x.push( ( randu()*20.0 ) - 10.0 );
}
x = filledarrayBy( len, 'generic', rand );
mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
return benchmark;

function benchmark( b ) {
Expand Down
34 changes: 16 additions & 18 deletions lib/node_modules/@stdlib/stats/base/nanmskmin/docs/repl.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
Computes the minimum value of a strided array according to a mask and
ignoring `NaN` values.

The `N` and `stride` parameters determine which elements are accessed at
runtime.
The `N` and stride parameters determine which elements in the strided array
are accessed at runtime.

Indexing is relative to the first index. To introduce offsets, use a typed
array views.
Expand All @@ -26,13 +26,13 @@
Input array.

strideX: integer
Index increment for `x`.
Stride length for `x`.

mask: Array<number>|TypedArray
Mask array.

strideMask: integer
Index increment for `mask`.
Stride length for `mask`.

Returns
-------
Expand All @@ -47,22 +47,21 @@
> {{alias}}( x.length, x, 1, mask, 1 )
-2.0

// Using `N` and `stride` parameters:
> x = [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0, -4.0 ];
// Using `N` and stride parameters:
> x = [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0, NaN ];
> mask = [ 0, 0, 0, 0, 0, 0, 1 ];
> var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
> {{alias}}( N, x, 2, mask, 2 )
> {{alias}}( 4, x, 2, mask, 2 )
-2.0

// Using view offsets:
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, -4.0 ] );
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, NaN, NaN ] );
> var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
> var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] );
> var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
> var mask1 = new {{alias:@stdlib/array/uint8}}( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 );
> N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 );
> {{alias}}( N, x1, 2, mask1, 2 )
> {{alias}}( 4, x1, 2, mask1, 2 )
-2.0


{{alias}}.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask )
Computes the minimum value of a strided array according to a mask, ignoring
`NaN` values and using alternative indexing semantics.
Expand All @@ -80,7 +79,7 @@
Input array.

strideX: integer
Index increment for `x`.
Stride length for `x`.

offsetX: integer
Starting index for `x`.
Expand All @@ -89,7 +88,7 @@
Mask array.

strideMask: integer
Index increment for `mask`.
Stride length for `mask`.

offsetMask: integer
Starting index for `mask`.
Expand All @@ -108,10 +107,9 @@
-2.0

// Using offset parameter:
> x = [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, -4.0 ];
> mask = [ 0, 0, 0, 0, 0, 0, 1 ];
> var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
> {{alias}}.ndarray( N, x, 2, 1, mask, 2, 1 )
> x = [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, -4.0, NaN, NaN ];
> mask = [ 0, 0, 0, 0, 0, 0, 1, 0, 0 ];
> {{alias}}.ndarray( 4, x, 2, 1, mask, 2, 1 )
-2.0

See Also
Expand Down
Loading