Skip to content

Commit c089fa8

Browse files
committed
refactor and add protocol support to stats/base/nanmskmin
1 parent 5052304 commit c089fa8

File tree

11 files changed

+1287
-1024
lines changed

11 files changed

+1287
-1024
lines changed

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

Lines changed: 52 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -33,37 +33,36 @@ limitations under the License.
3333
## Usage
3434

3535
```javascript
36-
var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );
36+
var nanmskmin = require("@stdlib/stats/base/nanmskmin");
3737
```
3838

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

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

4343
```javascript
44-
var x = [ 1.0, -2.0, -4.0, 2.0, NaN ];
45-
var mask = [ 0, 0, 1, 0, 0 ];
44+
var x = [1.0, -2.0, -4.0, 2.0, NaN];
45+
var mask = [0, 0, 1, 0, 0];
4646

47-
var v = nanmskmin( x.length, x, 1, mask, 1 );
47+
var v = nanmskmin(x.length, x, 1, mask, 1);
4848
// returns -2.0
4949
```
5050

5151
The function has the following parameters:
5252

53-
- **N**: number of indexed elements.
54-
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
55-
- **strideX**: stride length for `x`.
56-
- **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**: stride length for `mask`.
53+
- **N**: number of indexed elements.
54+
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
55+
- **strideX**: stride length for `x`.
56+
- **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**: stride length for `mask`.
5858

5959
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 x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, -5.0, -6.0 ];
63-
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
62+
var x = [1.0, 2.0, -7.0, -2.0, 4.0, 3.0, -5.0, -6.0];
63+
var mask = [0, 0, 0, 0, 0, 0, 1, 1];
6464

65-
66-
var v = nanmskmin( 4, x, 2, mask, 2 );
65+
var v = nanmskmin(4, x, 2, mask, 2);
6766
// returns -7.0
6867
```
6968

@@ -72,18 +71,16 @@ Note that indexing is relative to the first index. To introduce offsets, use [`t
7271
<!-- eslint-disable stdlib/capitalized-comments -->
7372

7473
```javascript
75-
var Float64Array = require( '@stdlib/array/float64' );
76-
var Uint8Array = require( '@stdlib/array/uint8' );
77-
78-
79-
var x0 = new Float64Array( [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ] );
80-
var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
74+
var Float64Array = require("@stdlib/array/float64");
75+
var Uint8Array = require("@stdlib/array/uint8");
8176

82-
var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
83-
var mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
77+
var x0 = new Float64Array([2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0]);
78+
var x1 = new Float64Array(x0.buffer, x0.BYTES_PER_ELEMENT * 1); // start at 2nd element
8479

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

86-
var v = nanmskmin( 4, x1, 2, mask1, 2 );
83+
var v = nanmskmin(4, x1, 2, mask1, 2);
8784
// returns -2.0
8885
```
8986

@@ -92,27 +89,27 @@ var v = nanmskmin( 4, x1, 2, mask1, 2 );
9289
Computes the minimum value of a strided array according to a `mask`, ignoring `NaN` values and using alternative indexing semantics.
9390

9491
```javascript
95-
var x = [ 1.0, -2.0, -4.0, 2.0, NaN ];
96-
var mask = [ 0, 0, 1, 0, 0 ];
92+
var x = [1.0, -2.0, -4.0, 2.0, NaN];
93+
var mask = [0, 0, 1, 0, 0];
9794

98-
var v = nanmskmin.ndarray( x.length, x, 1, 0, mask, 1, 0 );
95+
var v = nanmskmin.ndarray(x.length, x, 1, 0, mask, 1, 0);
9996
// returns -2.0
10097
```
10198

10299
The function has the following additional parameters:
103100

104-
- **offsetX**: starting index for `x`.
105-
- **offsetMask**: starting index for `mask`.
101+
- **offsetX**: starting index for `x`.
102+
- **offsetMask**: starting index for `mask`.
106103

107104
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset
108105
indexing semantics based on
109106
starting indices. For example, to calculate the minimum value for every other value in `x` starting from the second value
110107

111108
```javascript
112-
var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0 ];
113-
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
109+
var x = [2.0, 1.0, -2.0, -2.0, 3.0, 4.0, -5.0, -6.0];
110+
var mask = [0, 0, 0, 0, 0, 0, 1, 1];
114111

115-
var v = nanmskmin.ndarray( 4, x, 2, 1, mask, 2, 1 );
112+
var v = nanmskmin.ndarray(4, x, 2, 1, mask, 2, 1);
116113
// returns -2.0
117114
```
118115

@@ -124,10 +121,9 @@ var v = nanmskmin.ndarray( 4, x, 2, 1, mask, 2, 1 );
124121

125122
## Notes
126123

127-
- If `N <= 0`, both functions return `NaN`.
128-
- 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.
129-
- 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]).
130-
124+
- If `N <= 0`, both functions return `NaN`.
125+
- 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.
126+
- 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]).
131127

132128
</section>
133129

@@ -140,22 +136,22 @@ var v = nanmskmin.ndarray( 4, x, 2, 1, mask, 2, 1 );
140136
<!-- eslint no-undef: "error" -->
141137

142138
```javascript
143-
var uniform = require( '@stdlib/random/array/uniform' );
144-
var bernoulli = require( '@stdlib/random/array/bernoulli' );
145-
var nanmskmin = require( '@stdlib/stats/base/nanmskmin' );
146-
147-
var x = uniform( 10, -50.0, 50.0, {
148-
'dtype': 'float64'
149-
});
150-
console.log( x );
151-
152-
var mask = bernoulli( x.length, 0.2, {
153-
'dtype': 'uint8'
154-
});
155-
console.log( mask );
156-
157-
var v = nanmskmin( x.length, x, 1, mask, 1 );
158-
console.log( v );
139+
var uniform = require("@stdlib/random/array/uniform");
140+
var bernoulli = require("@stdlib/random/array/bernoulli");
141+
var nanmskmin = require("@stdlib/stats/base/nanmskmin");
142+
143+
var x = uniform(10, -50.0, 50.0, {
144+
dtype: "float64",
145+
});
146+
console.log(x);
147+
148+
var mask = bernoulli(x.length, 0.2, {
149+
dtype: "uint8",
150+
});
151+
console.log(mask);
152+
153+
var v = nanmskmin(x.length, x, 1, mask, 1);
154+
console.log(v);
159155
```
160156

161157
</section>
@@ -166,15 +162,15 @@ console.log( v );
166162

167163
<section class="related">
168164

169-
* * *
165+
---
170166

171167
## See Also
172168

173-
- <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>
174-
- <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>
175-
- <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>
176-
- <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>
177-
- <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>
169+
- <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>
170+
- <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>
171+
- <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>
172+
- <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>
173+
- <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>
178174

179175
</section>
180176

@@ -185,23 +181,15 @@ console.log( v );
185181
<section class="links">
186182

187183
[mdn-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
188-
189-
190184
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
191-
192-
193185
[mdn-typed-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray
194186

195187
<!-- <related-links> -->
196188

197189
[@stdlib/stats/base/dnanmskmin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/dnanmskmin
198-
199190
[@stdlib/stats/base/mskmin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/mskmin
200-
201191
[@stdlib/stats/base/nanmin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/nanmin
202-
203192
[@stdlib/stats/base/nanmskmax]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/nanmskmax
204-
205193
[@stdlib/stats/base/snanmskmin]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/stats/base/snanmskmin
206194

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

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

Lines changed: 53 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,80 @@
11
/**
2-
* @license Apache-2.0
3-
*
4-
* Copyright (c) 2025 The Stdlib Authors.
5-
*
6-
* Licensed under the Apache License, Version 2.0 (the "License");
7-
* you may not use this file except in compliance with the License.
8-
* You may obtain a copy of the License at
9-
*
10-
* http://www.apache.org/licenses/LICENSE-2.0
11-
*
12-
* Unless required by applicable law or agreed to in writing, software
13-
* distributed under the License is distributed on an "AS IS" BASIS,
14-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15-
* See the License for the specific language governing permissions and
16-
* limitations under the License.
17-
*/
2+
* @license Apache-2.0
3+
*
4+
* Copyright (c) 2025 The Stdlib Authors.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
1818

19-
'use strict';
19+
"use strict";
2020

2121
// MODULES //
2222

23-
var bench = require( '@stdlib/bench' );
24-
var isnan = require( '@stdlib/math/base/assert/is-nan' );
25-
var uniform = require( '@stdlib/random/array/uniform' );
26-
var bernoulli = require( '@stdlib/random/array/bernoulli' );
27-
var pow = require( '@stdlib/math/base/special/pow' );
28-
var pkg = require( './../package.json' ).name;
29-
var nanmskmin = require( './../lib/nanmskmin.js' );
30-
23+
var bench = require("@stdlib/bench");
24+
var isnan = require("@stdlib/math/base/assert/is-nan");
25+
var uniform = require("@stdlib/random/array/uniform");
26+
var bernoulli = require("@stdlib/random/array/bernoulli");
27+
var pow = require("@stdlib/math/base/special/pow");
28+
var pkg = require("./../package.json").name;
29+
var nanmskmin = require("./../lib/nanmskmin.js");
3130

3231
// VARIABLES //
33-
34-
var options = {
35-
'dtype': 'generic'
36-
};
37-
32+
33+
var options = {
34+
dtype: "generic",
35+
};
3836

3937
// FUNCTIONS //
4038

4139
/**
42-
* Creates a benchmark function.
43-
*
44-
* @private
45-
* @param {PositiveInteger} len - array length
46-
* @returns {Function} benchmark function
47-
*/
48-
function createBenchmark( len ) {
49-
var mask = bernoulli( len, 0.2, options );
50-
var x = uniform( len, -10.0, 10.0, options );
40+
* Creates a benchmark function.
41+
*
42+
* @private
43+
* @param {PositiveInteger} len - array length
44+
* @returns {Function} benchmark function
45+
*/
46+
function createBenchmark(len) {
47+
var mask = bernoulli(len, 0.2, options);
48+
var x = uniform(len, -10.0, 10.0, options);
5149
return benchmark;
5250

53-
function benchmark( b ) {
51+
function benchmark(b) {
5452
var v;
5553
var i;
5654

5755
b.tic();
58-
for ( i = 0; i < b.iterations; i++ ) {
59-
v = nanmskmin( x.length, x, 1, mask, 1 );
60-
if ( isnan( v ) ) {
61-
b.fail( 'should not return NaN' );
56+
for (i = 0; i < b.iterations; i++) {
57+
v = nanmskmin(x.length, x, 1, mask, 1);
58+
if (isnan(v)) {
59+
b.fail("should not return NaN");
6260
}
6361
}
6462
b.toc();
65-
if ( isnan( v ) ) {
66-
b.fail( 'should not return NaN' );
63+
if (isnan(v)) {
64+
b.fail("should not return NaN");
6765
}
68-
b.pass( 'benchmark finished' );
66+
b.pass("benchmark finished");
6967
b.end();
7068
}
7169
}
7270

73-
7471
// MAIN //
7572

7673
/**
77-
* Main execution sequence.
78-
*
79-
* @private
80-
*/
74+
* Main execution sequence.
75+
*
76+
* @private
77+
*/
8178
function main() {
8279
var len;
8380
var min;
@@ -88,10 +85,10 @@ function main() {
8885
min = 1; // 10^min
8986
max = 6; // 10^max
9087

91-
for ( i = min; i <= max; i++ ) {
92-
len = pow( 10, i );
93-
f = createBenchmark( len );
94-
bench( pkg+':len='+len, f );
88+
for (i = min; i <= max; i++) {
89+
len = pow(10, i);
90+
f = createBenchmark(len);
91+
bench(pkg + ":len=" + len, f);
9592
}
9693
}
9794

0 commit comments

Comments
 (0)