Skip to content

Commit 065f865

Browse files
feat: add support for accessor arrays and refactor stats/base/mediansorted
PR-URL: #5344 Co-authored-by: Athan Reines <[email protected]> Reviewed-by: Athan Reines <[email protected]>
1 parent 6d9ed10 commit 065f865

File tree

12 files changed

+408
-123
lines changed

12 files changed

+408
-123
lines changed

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/README.md

+14-26
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ limitations under the License.
3636
var mediansorted = require( '@stdlib/stats/base/mediansorted' );
3737
```
3838

39-
#### mediansorted( N, x, stride )
39+
#### mediansorted( N, x, strideX )
4040

4141
Computes the median value of a sorted strided array `x`.
4242

@@ -54,17 +54,14 @@ 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-
- **stride**: index increment for `x`.
57+
- **strideX**: stride length for `x`.
5858

59-
The `N` and `stride` parameters determine which elements in `x` are accessed at runtime. For example, to compute the median value of every other element in `x`,
59+
The `N` and stride parameters determine which elements in the strided array are accessed at runtime. For example, to compute the median 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, 2.0, -7.0, 3.0, 3.0, 4.0, 2.0 ];
65-
var N = floor( x.length / 2 );
6663

67-
var v = mediansorted( N, x, 2 );
64+
var v = mediansorted( 4, x, 2 );
6865
// returns 2.5
6966
```
7067

@@ -74,18 +71,15 @@ Note that indexing is relative to the first index. To introduce an offset, use [
7471

7572
```javascript
7673
var Float64Array = require( '@stdlib/array/float64' );
77-
var floor = require( '@stdlib/math/base/special/floor' );
7874

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

82-
var N = floor( x0.length / 2 );
83-
84-
var v = mediansorted( N, x1, 2 );
78+
var v = mediansorted( 4, x1, 2 );
8579
// returns 2.0
8680
```
8781

88-
#### mediansorted.ndarray( N, x, stride, offset )
82+
#### mediansorted.ndarray( N, x, strideX, offsetX )
8983

9084
Computes the median value of a sorted strided array using alternative indexing semantics.
9185

@@ -98,17 +92,14 @@ var v = mediansorted.ndarray( x.length, x, 1, 0 );
9892

9993
The function has the following additional parameters:
10094

101-
- **offset**: starting index for `x`.
95+
- **offsetX**: starting index for `x`.
10296

103-
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 median value for every other value in `x` starting from the second value
97+
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 median value for every other value in `x` starting from the second value
10498

10599
```javascript
106-
var floor = require( '@stdlib/math/base/special/floor' );
107-
108100
var x = [ 2.0, 1.0, 2.0, 2.0, -2.0, 2.0, 3.0, 4.0 ];
109-
var N = floor( x.length / 2 );
110101

111-
var v = mediansorted.ndarray( N, x, 2, 1 );
102+
var v = mediansorted.ndarray( 4, x, 2, 1 );
112103
// returns 2.0
113104
```
114105

@@ -122,6 +113,7 @@ var v = mediansorted.ndarray( N, x, 2, 1 );
122113

123114
- If `N <= 0`, both functions return `NaN`.
124115
- The input strided array must be sorted in either **strictly** ascending or descending order.
116+
- 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]).
125117

126118
</section>
127119

@@ -134,16 +126,10 @@ var v = mediansorted.ndarray( N, x, 2, 1 );
134126
<!-- eslint no-undef: "error" -->
135127

136128
```javascript
137-
var Float64Array = require( '@stdlib/array/float64' );
129+
var linspace = require( '@stdlib/array/base/linspace' );
138130
var mediansorted = require( '@stdlib/stats/base/mediansorted' );
139131

140-
var x;
141-
var i;
142-
143-
x = new Float64Array( 10 );
144-
for ( i = 0; i < x.length; i++ ) {
145-
x[ i ] = i - 5.0;
146-
}
132+
var x = linspace( -5.0, 5.0, 10 );
147133
console.log( x );
148134

149135
var v = mediansorted( x.length, x, 1 );
@@ -178,6 +164,8 @@ console.log( v );
178164

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

167+
[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor
168+
181169
<!-- <related-links> -->
182170

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

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/benchmark/benchmark.js

+2-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var bench = require( '@stdlib/bench' );
2424
var isnan = require( '@stdlib/math/base/assert/is-nan' );
25+
var linspace = require( '@stdlib/array/base/linspace' );
2526
var pow = require( '@stdlib/math/base/special/pow' );
2627
var pkg = require( './../package.json' ).name;
2728
var mediansorted = require( './../lib/mediansorted.js' );
@@ -37,13 +38,7 @@ var mediansorted = require( './../lib/mediansorted.js' );
3738
* @returns {Function} benchmark function
3839
*/
3940
function createBenchmark( len ) {
40-
var x;
41-
var i;
42-
43-
x = [];
44-
for ( i = 0; i < len; i++ ) {
45-
x.push( i );
46-
}
41+
var x = linspace( 0.0, len, len );
4742
return benchmark;
4843

4944
function benchmark( b ) {

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/benchmark/benchmark.ndarray.js

+2-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var bench = require( '@stdlib/bench' );
2424
var isnan = require( '@stdlib/math/base/assert/is-nan' );
25+
var linspace = require( '@stdlib/array/base/linspace' );
2526
var pow = require( '@stdlib/math/base/special/pow' );
2627
var pkg = require( './../package.json' ).name;
2728
var mediansorted = require( './../lib/ndarray.js' );
@@ -37,13 +38,7 @@ var mediansorted = require( './../lib/ndarray.js' );
3738
* @returns {Function} benchmark function
3839
*/
3940
function createBenchmark( len ) {
40-
var x;
41-
var i;
42-
43-
x = [];
44-
for ( i = 0; i < len; i++ ) {
45-
x.push( i );
46-
}
41+
var x = linspace( 0.0, len, len );
4742
return benchmark;
4843

4944
function benchmark( b ) {

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/docs/repl.txt

+14-16
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11

2-
{{alias}}( N, x, stride )
2+
{{alias}}( N, x, strideX )
33
Computes the median value of a sorted strided array.
44

55
The input strided array must be sorted in either strictly ascending or
66
descending order.
77

8-
The `N` and `stride` parameters determine which elements in `x` are accessed
9-
at runtime.
8+
The `N` and stride parameters determine which elements in the strided array
9+
are accessed at runtime.
1010

1111
Indexing is relative to the first index. To introduce an offset, use a typed
1212
array view.
@@ -21,8 +21,8 @@
2121
x: Array<number>|TypedArray
2222
Sorted input array.
2323

24-
stride: integer
25-
Index increment.
24+
strideX: integer
25+
Stride length.
2626

2727
Returns
2828
-------
@@ -36,20 +36,19 @@
3636
> {{alias}}( x.length, x, 1 )
3737
2.0
3838

39-
// Using `N` and `stride` parameters:
39+
// Using `N` and stride parameters:
4040
> x = [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0 ];
41-
> var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
42-
> {{alias}}( N, x, 2 )
41+
> {{alias}}( 3, x, 2 )
4342
1.0
4443

4544
// Using view offsets:
4645
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, 3.0 ] );
4746
> var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
48-
> N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 );
49-
> {{alias}}( N, x1, 2 )
47+
> {{alias}}( 3, x1, 2 )
5048
2.0
5149

52-
{{alias}}.ndarray( N, x, stride, offset )
50+
51+
{{alias}}.ndarray( N, x, strideX, offsetX )
5352
Computes the median value of a sorted strided array using alternative
5453
indexing semantics.
5554

@@ -65,10 +64,10 @@
6564
x: Array<number>|TypedArray
6665
Sorted input array.
6766

68-
stride: integer
69-
Index increment.
67+
strideX: integer
68+
Stride length.
7069

71-
offset: integer
70+
offsetX: integer
7271
Starting index.
7372

7473
Returns
@@ -85,8 +84,7 @@
8584

8685
// Using offset parameter:
8786
> var x = [ 1.0, -2.0, 3.0, 2.0, 5.0, 3.0 ];
88-
> var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
89-
> {{alias}}.ndarray( N, x, 2, 1 )
87+
> {{alias}}.ndarray( 3, x, 2, 1 )
9088
2.0
9189

9290
See Also

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/docs/types/index.d.ts

+12-7
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 `mediansorted`.
@@ -31,7 +36,7 @@ interface Routine {
3136
*
3237
* @param N - number of indexed elements
3338
* @param x - sorted input array
34-
* @param stride - stride length
39+
* @param strideX - stride length
3540
* @returns median value
3641
*
3742
* @example
@@ -40,15 +45,15 @@ interface Routine {
4045
* var v = mediansorted( x.length, x, 1 );
4146
* // returns 2.0
4247
*/
43-
( N: number, x: NumericArray, stride: number ): number;
48+
( N: number, x: InputArray, strideX: number ): number;
4449

4550
/**
4651
* Computes the median value of a sorted strided array using alternative indexing semantics.
4752
*
4853
* @param N - number of indexed elements
4954
* @param x - sorted input array
50-
* @param stride - stride length
51-
* @param offset - starting index
55+
* @param strideX - stride length
56+
* @param offsetX - starting index
5257
* @returns median value
5358
*
5459
* @example
@@ -57,15 +62,15 @@ interface Routine {
5762
* var v = mediansorted.ndarray( x.length, x, 1, 0 );
5863
* // returns 2.0
5964
*/
60-
ndarray( N: number, x: NumericArray, stride: number, offset: number ): number;
65+
ndarray( N: number, x: InputArray, strideX: number, offsetX: number ): number;
6166
}
6267

6368
/**
6469
* Computes the median value of a sorted strided array.
6570
*
6671
* @param N - number of indexed elements
6772
* @param x - sorted input array
68-
* @param stride - stride length
73+
* @param strideX - stride length
6974
* @returns median value
7075
*
7176
* @example

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/docs/types/test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
* limitations under the License.
1717
*/
1818

19+
import AccessorArray = require( '@stdlib/array/base/accessor' );
1920
import mediansorted = require( './index' );
2021

2122

@@ -26,6 +27,7 @@ import mediansorted = require( './index' );
2627
const x = new Float64Array( 10 );
2728

2829
mediansorted( x.length, x, 1 ); // $ExpectType number
30+
mediansorted( x.length, new AccessorArray( x ), 1 ); // $ExpectType number
2931
}
3032

3133
// The compiler throws an error if the function is provided a first argument which is not a number...
@@ -86,6 +88,7 @@ import mediansorted = require( './index' );
8688
const x = new Float64Array( 10 );
8789

8890
mediansorted.ndarray( x.length, x, 1, 0 ); // $ExpectType number
91+
mediansorted.ndarray( x.length, new AccessorArray( x ), 1, 0 ); // $ExpectType number
8992
}
9093

9194
// The compiler throws an error if the `ndarray` method is provided a first argument which is not a number...

Diff for: lib/node_modules/@stdlib/stats/base/mediansorted/examples/index.js

+2-8
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,10 @@
1818

1919
'use strict';
2020

21-
var Float64Array = require( '@stdlib/array/float64' );
21+
var linspace = require( '@stdlib/array/base/linspace' );
2222
var mediansorted = require( './../lib' );
2323

24-
var x;
25-
var i;
26-
27-
x = new Float64Array( 10 );
28-
for ( i = 0; i < x.length; i++ ) {
29-
x[ i ] = i - 5.0;
30-
}
24+
var x = linspace( -5.0, 5.0, 10 );
3125
console.log( x );
3226

3327
var v = mediansorted( x.length, x, 1 );

0 commit comments

Comments
 (0)