Skip to content

feat: refactor and add protocol support to stats/base/nanmskmin #5663 #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

Open
wants to merge 68 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 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
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
158 changes: 47 additions & 111 deletions lib/node_modules/@stdlib/stats/base/nanmskmin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

@license Apache-2.0

Copyright (c) 2020 The Stdlib Authors.
Copyright (c) 2025 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.
Expand Down Expand Up @@ -33,90 +33,52 @@ limitations under the License.
## Usage

```javascript
var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );
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.

```javascript
var x = [ 1.0, -2.0, -4.0, 2.0, NaN ];
var mask = [ 0, 0, 1, 0, 0 ];
var x = [1.0, -2.0, -4.0, 2.0, NaN];
var mask = [0, 0, 1, 0, 0];

var v = nanmskmin( x.length, x, 1, mask, 1 );
var v = nanmskmin(x.length, x, 1, mask, 1);
// returns -2.0
```

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`.
- **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`.
- **N**: number of indexed elements.
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
- **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**: 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];
var mask = [0, 0, 0, 0, 0, 0, 1, 1];

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(4, 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 -->

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

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

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

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

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

#### nanmskmin.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.

```javascript
var x = [ 1.0, -2.0, -4.0, 2.0, NaN ];
var mask = [ 0, 0, 1, 0, 0 ];

var v = nanmskmin.ndarray( x.length, x, 1, 0, mask, 1, 0 );
// returns -2.0
```

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

```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 v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );
var v = nanmskmin(4, x1, 2, mask1, 2);
// returns -2.0
```

Expand All @@ -128,8 +90,9 @@ var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );

## Notes

- If `N <= 0`, both functions return `NaN`.
- Depending on the environment, the typed versions ([`dnanmskmin`][@stdlib/stats/base/dnanmskmin], [`snanmskmin`][@stdlib/stats/base/snanmskmin], etc.) are likely to be significantly more performant.
- If `N <= 0`, both functions return `NaN`.
- Depending on the environment, the typed versions ([`dnanmskmin`][@stdlib/stats/base/dnanmskmin], [`snanmskmin`][@stdlib/stats/base/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 @@ -139,84 +102,57 @@ var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );

## Examples

<!-- 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 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 );
}
}
console.log( x );
console.log( mask );

var v = nanmskmin( x.length, x, 1, mask, 1 );
console.log( v );
var uniform = require("@stdlib/random/array/uniform");
var bernoulli = require("@stdlib/random/array/bernoulli");
var nanmskmin = require("@stdlib/stats/base/nanmskmin");

var x = uniform(10, -50.0, 50.0, {
dtype: "float64",
});
console.log(x);

var mask = bernoulli(x.length, 0.2, {
dtype: "uint8",
});
console.log(mask);

var v = nanmskmin(x.length, x, 1, mask, 1);
console.log(v);
```

</section>

<!-- /.examples -->

<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->

<section class="related">

* * *
---

## See Also

- <span class="package-name">[`@stdlib/stats/base/dnanmskmin`][@stdlib/stats/base/dnanmskmin]</span><span class="delimiter">: </span><span class="description">calculate the minimum value of a double-precision floating-point strided array according to a mask, ignoring NaN values.</span>
- <span class="package-name">[`@stdlib/stats/base/mskmin`][@stdlib/stats/base/mskmin]</span><span class="delimiter">: </span><span class="description">calculate the minimum value of a strided array according to a mask.</span>
- <span class="package-name">[`@stdlib/stats/base/nanmin`][@stdlib/stats/base/nanmin]</span><span class="delimiter">: </span><span class="description">calculate the minimum value of a strided array, ignoring NaN values.</span>
- <span class="package-name">[`@stdlib/stats/base/nanmskmax`][@stdlib/stats/base/nanmskmax]</span><span class="delimiter">: </span><span class="description">calculate the maximum value of a strided array according to a mask, ignoring NaN values.</span>
- <span class="package-name">[`@stdlib/stats/base/snanmskmin`][@stdlib/stats/base/snanmskmin]</span><span class="delimiter">: </span><span class="description">calculate the minimum value of a single-precision floating-point strided array according to a mask, ignoring NaN values.</span>
- [`@stdlib/stats/base/dnanmskmin`][@stdlib/stats/base/dnanmskmin]
- [`@stdlib/stats/base/mskmin`][@stdlib/stats/base/mskmin]
- [`@stdlib/stats/base/nanmin`][@stdlib/stats/base/nanmin]
- [`@stdlib/stats/base/nanmskmax`][@stdlib/stats/base/nanmskmax]
- [`@stdlib/stats/base/snanmskmin`][@stdlib/stats/base/snanmskmin]

</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">

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

[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
[mdn-typed-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

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

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

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

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

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

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

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

</section>

<!-- /.links -->
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2020 The Stdlib Authors.
* Copyright (c) 2025 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.
Expand All @@ -21,13 +21,21 @@
// MODULES //

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


// VARIABLES //

var options = {
'dtype': 'generic'
};


// FUNCTIONS //

/**
Expand All @@ -38,20 +46,8 @@ var nanmskmin = require( './../lib/nanmskmin.js' );
* @returns {Function} benchmark function
*/
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 );
}
var mask = bernoulli( len, 0.2, options );
var x = uniform( len, -10.0, 10.0, options );
return benchmark;

function benchmark( b ) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2020 The Stdlib Authors.
* Copyright (c) 2025 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.
Expand All @@ -21,13 +21,21 @@
// MODULES //

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


// VARIABLES //

var options = {
'dtype': 'generic'
};


// FUNCTIONS //

/**
Expand All @@ -38,20 +46,8 @@ var nanmskmin = require( './../lib/ndarray.js' );
* @returns {Function} benchmark function
*/
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 );
}
var mask = bernoulli( len, 0.2, options );
var x = uniform( len, -10.0, 10.0, options );
return benchmark;

function benchmark( b ) {
Expand Down
Loading
Loading