Skip to content

Commit 4548d65

Browse files
rahulptl165kgryte
andauthored
feat: add accessor protocol and refactor stats/base/nanmskrange
PR-URL: #6295 Closes: #5664 Co-authored-by: Athan Reines <[email protected]> Reviewed-by: Athan Reines <[email protected]> Signed-off-by: Athan Reines <[email protected]>
1 parent 8fa89e3 commit 4548d65

File tree

12 files changed

+586
-195
lines changed

12 files changed

+586
-195
lines changed

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

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -43,52 +43,46 @@ var nanmskrange = require( '@stdlib/stats/base/nanmskrange' );
4343
Computes the [range][range] of a strided array `x` according to a `mask`, ignoring `NaN` values.
4444

4545
```javascript
46-
var x = [ 1.0, -2.0, 4.0, 2.0, NaN ];
47-
var mask = [ 0, 0, 1, 0, 0 ];
46+
var x = [ 1.0, -2.0, 4.0, 2.0, NaN, NaN ];
47+
var mask = [ 0, 0, 1, 0, 0, 0 ];
4848

49-
var v = nanmskrange( x.length, x, 1, mask, 1 );
49+
var v = nanmskrange( 6, x, 1, mask, 1 );
5050
// returns 4.0
5151
```
5252

5353
The function has the following parameters:
5454

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

61-
The `N` and `stride` parameters determine which elements are accessed at runtime. For example, to compute the [range][range] of every other element in `x`,
61+
The `N` and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the [range][range] of every other element in `x`,
6262

6363
```javascript
64-
var floor = require( '@stdlib/math/base/special/floor' );
65-
6664
var x = [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, 5.0, 6.0 ];
6765
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
68-
var N = floor( x.length / 2 );
6966

70-
var v = nanmskrange( N, x, 2, mask, 2 );
67+
var v = nanmskrange( 4, x, 2, mask, 2 );
7168
// returns 11.0
7269
```
7370

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

76-
<!-- eslint-disable stdlib/capitalized-comments -->
73+
<!-- eslint-disable stdlib/capitalized-comments, max-len -->
7774

7875
```javascript
7976
var Float64Array = require( '@stdlib/array/float64' );
8077
var Uint8Array = require( '@stdlib/array/uint8' );
81-
var floor = require( '@stdlib/math/base/special/floor' );
8278

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

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

89-
var N = floor( x0.length / 2 );
90-
91-
var v = nanmskrange( N, x1, 2, mask1, 2 );
85+
var v = nanmskrange( 5, x1, 2, mask1, 2 );
9286
// returns 6.0
9387
```
9488

@@ -97,10 +91,10 @@ var v = nanmskrange( N, x1, 2, mask1, 2 );
9791
Computes the [range][range] of a strided array according to a `mask`, ignoring `NaN` values and using alternative indexing semantics.
9892

9993
```javascript
100-
var x = [ 1.0, -2.0, 4.0, 2.0, NaN ];
101-
var mask = [ 0, 0, 1, 0, 0 ];
94+
var x = [ 1.0, -2.0, 4.0, 2.0, NaN, NaN ];
95+
var mask = [ 0, 0, 1, 0, 0, 0 ];
10296

103-
var v = nanmskrange.ndarray( x.length, x, 1, 0, mask, 1, 0 );
97+
var v = nanmskrange.ndarray( 6, x, 1, 0, mask, 1, 0 );
10498
// returns 4.0
10599
```
106100

@@ -109,16 +103,13 @@ The function has the following additional parameters:
109103
- **offsetX**: starting index for `x`.
110104
- **offsetMask**: starting index for `mask`.
111105

112-
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 [range][range] for every other value in `x` starting from the second value
106+
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 [range][range] for every other value in `x` starting from the second value
113107

114108
```javascript
115-
var floor = require( '@stdlib/math/base/special/floor' );
116-
117109
var x = [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ];
118110
var mask = [ 0, 0, 0, 0, 0, 0, 1, 1 ];
119-
var N = floor( x.length / 2 );
120111

121-
var v = nanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
112+
var v = nanmskrange.ndarray( 4, x, 2, 1, mask, 2, 1 );
122113
// returns 6.0
123114
```
124115

@@ -131,6 +122,7 @@ var v = nanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
131122
## Notes
132123

133124
- If `N <= 0`, both functions return `NaN`.
125+
- 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]).
134126
- Depending on the environment, the typed versions ([`dnanmskrange`][@stdlib/stats/base/dnanmskrange], [`snanmskrange`][@stdlib/stats/base/snanmskrange], etc.) are likely to be significantly more performant.
135127

136128
</section>
@@ -144,31 +136,18 @@ var v = nanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 );
144136
<!-- eslint no-undef: "error" -->
145137

146138
```javascript
147-
var randu = require( '@stdlib/random/base/randu' );
148-
var round = require( '@stdlib/math/base/special/round' );
149-
var Float64Array = require( '@stdlib/array/float64' );
150-
var Uint8Array = require( '@stdlib/array/uint8' );
139+
var uniform = require( '@stdlib/random/array/uniform' );
140+
var bernoulli = require( '@stdlib/random/array/bernoulli' );
151141
var nanmskrange = require( '@stdlib/stats/base/nanmskrange' );
152142

153-
var mask;
154-
var x;
155-
var i;
156-
157-
x = new Float64Array( 10 );
158-
mask = new Uint8Array( x.length );
159-
for ( i = 0; i < x.length; i++ ) {
160-
if ( randu() < 0.2 ) {
161-
mask[ i ] = 1;
162-
} else {
163-
mask[ i ] = 0;
164-
}
165-
if ( randu() < 0.1 ) {
166-
x[ i ] = NaN;
167-
} else {
168-
x[ i ] = round( (randu()*100.0) - 50.0 );
169-
}
170-
}
143+
var x = uniform( 10, -50.0, 50.0, {
144+
'dtype': 'float64'
145+
});
171146
console.log( x );
147+
148+
var mask = bernoulli( x.length, 0.2, {
149+
'dtype': 'uint8'
150+
});
172151
console.log( mask );
173152

174153
var v = nanmskrange( x.length, x, 1, mask, 1 );
@@ -222,6 +201,8 @@ console.log( v );
222201

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

204+
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
205+
225206
<!-- </related-links> -->
226207

227208
</section>

lib/node_modules/@stdlib/stats/base/nanmskrange/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 nanmskrange = require( './../lib/nanmskrange.js' );
2930

3031

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

3341
/**
@@ -38,20 +46,8 @@ var nanmskrange = require( './../lib/nanmskrange.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/nanmskrange/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 nanmskrange = 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 nanmskrange = 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/nanmskrange/docs/repl.txt

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
Computes the range of a strided array according to a mask and ignoring `NaN`
44
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
-------
@@ -44,25 +44,24 @@
4444
// Standard Usage:
4545
> var x = [ 1.0, -2.0, 4.0, 2.0, NaN ];
4646
> var mask = [ 0, 0, 1, 0, 0 ];
47-
> {{alias}}( x.length, x, 1, mask, 1 )
47+
> {{alias}}( 5, x, 1, mask, 1 )
4848
4.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
4.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
4.0
6563

64+
6665
{{alias}}.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask )
6766
Computes the range of a strided array according to a mask, ignoring `NaN`
6867
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
4.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
4.0
116114

117115
See Also

0 commit comments

Comments
 (0)