Skip to content

Commit fae5a4e

Browse files
committed
feat: add accessor protocol and refactor stats/base/nanmskmax
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: passed - task: lint_package_json status: na - task: lint_repl_help status: passed - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: passed - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: passed - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: passed - task: lint_license_headers status: passed ---
1 parent a8f5e17 commit fae5a4e

File tree

12 files changed

+588
-196
lines changed

12 files changed

+588
-196
lines changed

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

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,25 @@ Computes the maximum value of a strided array `x` according to a `mask`, ignorin
4444
var x = [ 1.0, -2.0, 4.0, 2.0, NaN ];
4545
var mask = [ 0, 0, 1, 0, 0 ];
4646

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

5151
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 maximum value of every other element in `x`,
59+
The `N` and stride parameters determine which elements int the strided arrays are accessed at runtime. For example, to compute the maximum value of every other element in `x`,
6060

6161
```javascript
62-
var floor = require( '@stdlib/math/base/special/floor' );
63-
6462
var x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, 5.0, 6.0 ];
6563
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
66-
var N = floor( x.length / 2 );
6764

68-
var v = nanmskmax( N, x, 2, mask, 2 );
65+
var v = nanmskmax( 4, x, 2, mask, 2 );
6966
// returns 4.0
7067
```
7168

@@ -76,17 +73,14 @@ Note that indexing is relative to the first index. To introduce offsets, use [`t
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

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

8480
var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] );
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 = nanmskmax( N, x1, 2, mask1, 2 );
83+
var v = nanmskmax( 4, x1, 2, mask1, 2 );
9084
// returns 4.0
9185
```
9286

@@ -98,7 +92,7 @@ Computes the maximum value of a strided array according to a `mask`, ignoring `N
9892
var x = [ 1.0, -2.0, 4.0, 2.0, NaN ];
9993
var mask = [ 0, 0, 1, 0, 0 ];
10094

101-
var v = nanmskmax.ndarray( x.length, x, 1, 0, mask, 1, 0 );
95+
var v = nanmskmax.ndarray( 5, x, 1, 0, mask, 1, 0 );
10296
// returns 2.0
10397
```
10498

@@ -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 maximum 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 a starting indices. For example, to calculate the maximum value for every other value in `x` starting from the second value
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 = nanmskmax.ndarray( N, x, 2, 1, mask, 2, 1 );
110+
var v = nanmskmax.ndarray( 5, x, 2, 1, mask, 2, 1 );
120111
// returns 4.0
121112
```
122113

@@ -130,6 +121,7 @@ var v = nanmskmax.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 ([`dnanmskmax`][@stdlib/stats/base/dnanmskmax], [`snanmskmax`][@stdlib/stats/base/snanmskmax], 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,18 @@ var v = nanmskmax.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/array/uniform' );
138+
var bernoulli = require( '@stdlib/random/array/bernoulli' );
149139
var nanmskmax = require( '@stdlib/stats/base/nanmskmax' );
150140

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 );
167-
}
168-
}
141+
var x = uniform( 10, -50.0, 50.0, {
142+
'dtype': 'float64'
143+
});
169144
console.log( x );
145+
146+
var mask = bernoulli( x.length, 0.2, {
147+
'dtype': 'uint8'
148+
});
170149
console.log( mask );
171150

172151
var v = nanmskmax( x.length, x, 1, mask, 1 );
@@ -215,6 +194,8 @@ console.log( v );
215194

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

197+
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
198+
218199
<!-- </related-links> -->
219200

220201
</section>

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

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

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/array/uniform' );
25+
var bernoulli = require( '@stdlib/random/array/bernoulli' );
2526
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2627
var pow = require( '@stdlib/math/base/special/pow' );
2728
var pkg = require( './../package.json' ).name;
2829
var nanmskmax = require( './../lib/nanmskmax.js' );
2930

3031

32+
// VARIABLES //
33+
34+
var options = {
35+
'dtype': 'generic'
36+
};
37+
38+
3139
// FUNCTIONS //
3240

3341
/**
@@ -38,20 +46,8 @@ var nanmskmax = require( './../lib/nanmskmax.js' );
3846
* @returns {Function} benchmark function
3947
*/
4048
function createBenchmark( len ) {
41-
var mask;
42-
var x;
43-
var i;
44-
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-
}
49+
var mask = bernoulli( len, 0.2, options );
50+
var x = uniform( len, -10.0, 10.0, options );
5551
return benchmark;
5652

5753
function benchmark( b ) {

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

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

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/array/uniform' );
25+
var bernoulli = require( '@stdlib/random/array/bernoulli' );
2526
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2627
var pow = require( '@stdlib/math/base/special/pow' );
2728
var pkg = require( './../package.json' ).name;
2829
var nanmskmax = require( './../lib/ndarray.js' );
2930

3031

32+
// VARIABLES //
33+
34+
var options = {
35+
'dtype': 'generic'
36+
};
37+
38+
3139
// FUNCTIONS //
3240

3341
/**
@@ -38,20 +46,8 @@ var nanmskmax = require( './../lib/ndarray.js' );
3846
* @returns {Function} benchmark function
3947
*/
4048
function createBenchmark( len ) {
41-
var mask;
42-
var x;
43-
var i;
44-
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-
}
49+
var mask = bernoulli( len, 0.2, options );
50+
var x = uniform( len, -10.0, 10.0, options );
5551
return benchmark;
5652

5753
function benchmark( b ) {

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
Computes the maximum 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 arrays
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:
50+
// Using `N` and stride parameters:
5151
> x = [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0, 4.0 ];
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}}( 3, x, 2, mask, 2 )
5554
2.0
5655

5756
// Using view offsets:
5857
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, 4.0 ] );
5958
> var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
6059
> var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 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}}( 3, x1, 2, mask1, 2 )
6462
2.0
6563

64+
6665
{{alias}}.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask )
6766
Computes the maximum value of a strided array according to a mask,
6867
ignoring `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`.
@@ -104,14 +103,13 @@
104103
// Standard Usage:
105104
> var x = [ 1.0, -2.0, 2.0, 4.0, NaN ];
106105
> var mask = [ 0, 0, 0, 1, 0 ];
107-
> {{alias}}.ndarray( x.length, x, 1, 0, mask, 1, 0 )
106+
> {{alias}}.ndarray( 5, x, 1, 0, mask, 1, 0 )
108107
2.0
109108

110109
// Using offset parameter:
111110
> x = [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, 4.0 ];
112111
> 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 )
112+
> {{alias}}.ndarray( 3, x, 2, 1, mask, 2, 1 )
115113
2.0
116114

117115
See Also

lib/node_modules/@stdlib/stats/base/nanmskmax/docs/types/index.d.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@
2020

2121
/// <reference types="@stdlib/types"/>
2222

23-
import { NumericArray } from '@stdlib/types/array';
23+
import { NumericArray, Collection, AccessorArrayLike } from '@stdlib/types/array';
24+
25+
/**
26+
* Input array.
27+
*/
28+
type InputArray = NumericArray | Collection<number> | AccessorArrayLike<number>;
2429

2530
/**
2631
* Interface describing `nanmskmax`.
@@ -31,9 +36,9 @@ interface Routine {
3136
*
3237
* @param N - number of indexed elements
3338
* @param x - input array
34-
* @param strideX - `x` stride length
39+
* @param strideX - stride length for `x`
3540
* @param mask - mask array
36-
* @param strideMask - `mask` stride length
41+
* @param strideMask - stride length for `mask`
3742
* @returns maximum value
3843
*
3944
* @example
@@ -43,17 +48,17 @@ interface Routine {
4348
* var v = nanmskmax( x.length, x, 1, mask, 1 );
4449
* // returns 2.0
4550
*/
46-
( N: number, x: NumericArray, strideX: number, mask: NumericArray, strideMask: number ): number;
51+
( N: number, x: InputArray, strideX: number, mask: InputArray, strideMask: number ): number;
4752

4853
/**
4954
* Computes the maximum value of a strided array according to a mask, ignoring `NaN` values and using alternative indexing semantics.
5055
*
5156
* @param N - number of indexed elements
5257
* @param x - input array
53-
* @param strideX - `x` stride length
58+
* @param strideX - stride length for `x`
5459
* @param offsetX - `x` starting index
5560
* @param mask - mask array
56-
* @param strideMask - `mask` stride length
61+
* @param strideMask - stride length for `mask`
5762
* @param offsetMask - `mask` starting index
5863
* @returns maximum value
5964
*
@@ -64,17 +69,17 @@ interface Routine {
6469
* var v = nanmskmax.ndarray( x.length, x, 1, 0, mask, 1, 0 );
6570
* // returns 2.0
6671
*/
67-
ndarray( N: number, x: NumericArray, strideX: number, offsetX: number, mask: NumericArray, strideMask: number, offsetMask: number ): number;
72+
ndarray( N: number, x: InputArray, strideX: number, offsetX: number, mask: InputArray, strideMask: number, offsetMask: number ): number;
6873
}
6974

7075
/**
7176
* Computes the maximum value of a strided array according to a mask, ignoring `NaN` values.
7277
*
7378
* @param N - number of indexed elements
7479
* @param x - input array
75-
* @param strideX - `x` stride length
80+
* @param strideX - stride length for `x`
7681
* @param mask - mask array
77-
* @param strideMask - `mask` stride length
82+
* @param strideMask - stride length for `mask`
7883
* @returns maximum value
7984
*
8085
* @example

0 commit comments

Comments
 (0)