Skip to content

Commit 2a15634

Browse files
Kaushikgtmkgrytegururaj1512stdlib-bot
authored
feat: refactor and add protocol support to stats/base/nanmskmin
PR-URL: #6103 Closes: #5663 Co-authored-by: Athan Reines <[email protected]> Reviewed-by: Athan Reines <[email protected]> Co-authored-by: Gururaj Gurram <[email protected]> Co-authored-by: stdlib-bot <[email protected]> Reviewed-by: Gururaj Gurram <[email protected]>
1 parent 3efb3a8 commit 2a15634

File tree

15 files changed

+955
-506
lines changed

15 files changed

+955
-506
lines changed

lib/node_modules/@stdlib/stats/base/nanmskmin/README.md

Lines changed: 29 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );
3838

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

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

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

5353
- **N**: number of indexed elements.
5454
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
55-
- **strideX**: index increment for `x`.
55+
- **strideX**: stride length for `x`.
5656
- **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.
57-
- **strideMask**: index increment for `mask`.
57+
- **strideMask**: stride length for `mask`.
5858

59-
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`,
59+
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`,
6060

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

64-
var x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, -5.0, -6.0 ];
65-
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
66-
var N = floor( x.length / 2 );
67-
68-
var v = nanmskmin( N, x, 2, mask, 2 );
65+
var v = nanmskmin( 5, x, 2, mask, 2 );
6966
// returns -7.0
7067
```
7168

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

74-
<!-- eslint-disable stdlib/capitalized-comments -->
71+
<!-- eslint-disable stdlib/capitalized-comments, max-len -->
7572

7673
```javascript
7774
var Float64Array = require( '@stdlib/array/float64' );
7875
var Uint8Array = require( '@stdlib/array/uint8' );
79-
var floor = require( '@stdlib/math/base/special/floor' );
8076

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

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

87-
var N = floor( x0.length / 2 );
88-
89-
var v = nanmskmin( N, x1, 2, mask1, 2 );
83+
var v = nanmskmin( 5, x1, 2, mask1, 2 );
9084
// returns -2.0
9185
```
9286

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

110-
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
104+
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
111105

112106
```javascript
113-
var floor = require( '@stdlib/math/base/special/floor' );
114-
115-
var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0 ];
116-
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
117-
var N = floor( x.length / 2 );
107+
var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0, NaN, NaN ];
108+
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 ];
118109

119-
var v = nanmskmin.ndarray( N, x, 2, 1, mask, 2, 1 );
110+
var v = nanmskmin.ndarray( 5, x, 2, 1, mask, 2, 1 );
120111
// returns -2.0
121112
```
122113

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

131122
- If `N <= 0`, both functions return `NaN`.
132123
- 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.
124+
- 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]).
133125

134126
</section>
135127

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

144136
```javascript
145-
var randu = require( '@stdlib/random/base/randu' );
146-
var round = require( '@stdlib/math/base/special/round' );
147-
var Float64Array = require( '@stdlib/array/float64' );
148-
var Uint8Array = require( '@stdlib/array/uint8' );
137+
var uniform = require( '@stdlib/random/base/uniform' );
138+
var bernoulli = require( '@stdlib/random/base/bernoulli' );
139+
var filledarrayBy = require( '@stdlib/array/filled-by' );
149140
var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );
150141

151-
var mask;
152-
var x;
153-
var i;
154-
155-
x = new Float64Array( 10 );
156-
mask = new Uint8Array( x.length );
157-
for ( i = 0; i < x.length; i++ ) {
158-
if ( randu() < 0.2 ) {
159-
mask[ i ] = 1;
160-
} else {
161-
mask[ i ] = 0;
162-
}
163-
if ( randu() < 0.1 ) {
164-
x[ i ] = NaN;
165-
} else {
166-
x[ i ] = round( (randu()*100.0) - 50.0 );
142+
function rand() {
143+
if ( bernoulli( 0.8 ) < 1 ) {
144+
return NaN;
167145
}
146+
return uniform( -50.0, 50.0 );
168147
}
148+
149+
var x = filledarrayBy( 10, 'float64', rand );
169150
console.log( x );
151+
152+
var mask = filledarrayBy( x.length, 'uint8', bernoulli.factory( 0.2 ) );
170153
console.log( mask );
171154

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

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

189+
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
190+
206191
<!-- <related-links> -->
207192

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

lib/node_modules/@stdlib/stats/base/nanmskmin/benchmark/benchmark.js

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,30 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/base/uniform' );
25+
var bernoulli = require( '@stdlib/random/base/bernoulli' );
26+
var filledarrayBy = require( '@stdlib/array/filled-by' );
2527
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2628
var pow = require( '@stdlib/math/base/special/pow' );
2729
var pkg = require( './../package.json' ).name;
28-
var nanmskmin = require( './../lib/nanmskmin.js' );
30+
var nanmskmin = require( './../lib/main.js' );
2931

3032

3133
// FUNCTIONS //
3234

35+
/**
36+
* Returns a random value or `NaN`.
37+
*
38+
* @private
39+
* @returns {number} random number or `NaN`
40+
*/
41+
function rand() {
42+
if ( bernoulli( 0.8 ) < 1 ) {
43+
return NaN;
44+
}
45+
return uniform( -10.0, 10.0 );
46+
}
47+
3348
/**
3449
* Creates a benchmark function.
3550
*
@@ -40,18 +55,9 @@ var nanmskmin = require( './../lib/nanmskmin.js' );
4055
function createBenchmark( len ) {
4156
var mask;
4257
var x;
43-
var i;
4458

45-
x = [];
46-
mask = [];
47-
for ( i = 0; i < len; i++ ) {
48-
if ( randu() < 0.2 ) {
49-
mask.push( 1 );
50-
} else {
51-
mask.push( 0 );
52-
}
53-
x.push( ( randu()*20.0 ) - 10.0 );
54-
}
59+
x = filledarrayBy( len, 'generic', rand );
60+
mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
5561
return benchmark;
5662

5763
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/nanmskmin/benchmark/benchmark.ndarray.js

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

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/base/uniform' );
25+
var bernoulli = require( '@stdlib/random/base/bernoulli' );
26+
var filledarrayBy = require( '@stdlib/array/filled-by' );
2527
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2628
var pow = require( '@stdlib/math/base/special/pow' );
2729
var pkg = require( './../package.json' ).name;
@@ -30,6 +32,19 @@ var nanmskmin = require( './../lib/ndarray.js' );
3032

3133
// FUNCTIONS //
3234

35+
/**
36+
* Returns a random value or `NaN`.
37+
*
38+
* @private
39+
* @returns {number} random number or `NaN`
40+
*/
41+
function rand() {
42+
if ( bernoulli( 0.8 ) < 1 ) {
43+
return NaN;
44+
}
45+
return uniform( -10.0, 10.0 );
46+
}
47+
3348
/**
3449
* Creates a benchmark function.
3550
*
@@ -40,18 +55,9 @@ var nanmskmin = require( './../lib/ndarray.js' );
4055
function createBenchmark( len ) {
4156
var mask;
4257
var x;
43-
var i;
4458

45-
x = [];
46-
mask = [];
47-
for ( i = 0; i < len; i++ ) {
48-
if ( randu() < 0.2 ) {
49-
mask.push( 1 );
50-
} else {
51-
mask.push( 0 );
52-
}
53-
x.push( ( randu()*20.0 ) - 10.0 );
54-
}
59+
x = filledarrayBy( len, 'generic', rand );
60+
mask = filledarrayBy( len, 'uint8', bernoulli.factory( 0.2 ) );
5561
return benchmark;
5662

5763
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/nanmskmin/docs/repl.txt

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
Computes the minimum value of a strided array according to a mask and
44
ignoring `NaN` values.
55

6-
The `N` and `stride` parameters determine which elements are accessed at
7-
runtime.
6+
The `N` and stride parameters determine which elements in the strided array
7+
are accessed at runtime.
88

99
Indexing is relative to the first index. To introduce offsets, use a typed
1010
array views.
@@ -26,13 +26,13 @@
2626
Input array.
2727

2828
strideX: integer
29-
Index increment for `x`.
29+
Stride length for `x`.
3030

3131
mask: Array<number>|TypedArray
3232
Mask array.
3333

3434
strideMask: integer
35-
Index increment for `mask`.
35+
Stride length for `mask`.
3636

3737
Returns
3838
-------
@@ -47,22 +47,21 @@
4747
> {{alias}}( x.length, x, 1, mask, 1 )
4848
-2.0
4949

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

5756
// Using view offsets:
58-
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, -4.0 ] );
57+
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, NaN, NaN ] );
5958
> var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
60-
> var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] );
59+
> var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
6160
> var mask1 = new {{alias:@stdlib/array/uint8}}( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 );
62-
> N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 );
63-
> {{alias}}( N, x1, 2, mask1, 2 )
61+
> {{alias}}( 4, x1, 2, mask1, 2 )
6462
-2.0
6563

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

8281
strideX: integer
83-
Index increment for `x`.
82+
Stride length for `x`.
8483

8584
offsetX: integer
8685
Starting index for `x`.
@@ -89,7 +88,7 @@
8988
Mask array.
9089

9190
strideMask: integer
92-
Index increment for `mask`.
91+
Stride length for `mask`.
9392

9493
offsetMask: integer
9594
Starting index for `mask`.
@@ -108,10 +107,9 @@
108107
-2.0
109108

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

117115
See Also

0 commit comments

Comments
 (0)