Skip to content

Commit

Permalink
feat: add support for accessor arrays and refactor stats/base/cumax
Browse files Browse the repository at this point in the history
Co-authored-by: stdlib-bot <[email protected]>
  • Loading branch information
vivekmaurya001 and stdlib-bot authored Feb 18, 2025
1 parent 9e74579 commit 11f1341
Show file tree
Hide file tree
Showing 12 changed files with 735 additions and 145 deletions.
27 changes: 12 additions & 15 deletions lib/node_modules/@stdlib/stats/base/cumax/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ The function has the following parameters:

- **N**: number of indexed elements.
- **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
- **strideX**: index increment for `x`.
- **strideX**: stride length for `x`.
- **y**: output [`Array`][mdn-array] or [`typed array`][mdn-typed-array].
- **strideY**: index increment for `y`.
- **strideY**: stride length for `y`.

The `N` and `stride` parameters determine which elements in `x` and `y` are accessed at runtime. For example, to compute the cumulative maximum of every other element in `x`,
The `N` and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the cumulative maximum of every other element in `x`,

```javascript
var x = [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0 ];
Expand Down Expand Up @@ -102,7 +102,7 @@ The function has the following additional parameters:
- **offsetX**: starting index for `x`.
- **offsetY**: starting index for `y`.

While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, `offsetX` and `offsetY` parameters support indexing semantics based on a starting indices. For example, to calculate the cumulative maximum of every other value in `x` starting from the second value and to store in the last `N` elements of `y` starting from the last element
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, offset parameters support indexing semantics based on a starting indices. For example, to calculate the cumulative maximum of every other value in `x` starting from the second value and to store in the last `N` elements of `y` starting from the last element

```javascript
var x = [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0 ];
Expand All @@ -122,6 +122,7 @@ cumax.ndarray( 4, x, 2, 1, y, -1, y.length-1 );

- If `N <= 0`, both functions return `y` unchanged.
- Depending on the environment, the typed versions ([`dcumax`][@stdlib/stats/strided/dcumax], [`scumax`][@stdlib/stats/base/scumax], etc.) are likely to be significantly more performant.
- 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]).

</section>

Expand All @@ -134,20 +135,14 @@ cumax.ndarray( 4, x, 2, 1, y, -1, y.length-1 );
<!-- eslint no-undef: "error" -->

```javascript
var randu = require( '@stdlib/random/base/randu' );
var round = require( '@stdlib/math/base/special/round' );
var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var Float64Array = require( '@stdlib/array/float64' );
var cumax = require( '@stdlib/stats/base/cumax' );

var y;
var x;
var i;

x = new Float64Array( 10 );
y = new Float64Array( x.length );
for ( i = 0; i < x.length; i++ ) {
x[ i ] = round( randu()*100.0 );
}
var x = discreteUniform( 10, 0, 100, {
'dtype': 'float64'
});
var y = new Float64Array( x.length );
console.log( x );
console.log( y );

Expand Down Expand Up @@ -187,6 +182,8 @@ console.log( y );

[mdn-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

[@stdlib/array/base/accessor]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/base/accessor

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

<!-- <related-links> -->
Expand Down
32 changes: 16 additions & 16 deletions lib/node_modules/@stdlib/stats/base/cumax/benchmark/benchmark.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,22 @@
// MODULES //

var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randu' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var uniform = require( '@stdlib/random/array/uniform' );
var zeros = require( '@stdlib/array/zeros' );
var gfill = require( '@stdlib/blas/ext/base/gfill' );
var pow = require( '@stdlib/math/base/special/pow' );
var pkg = require( './../package.json' ).name;
var cumax = require( './../lib/cumax.js' );


// VARIABLES //

var options = {
'dtype': 'generic'
};


// FUNCTIONS //

/**
Expand All @@ -38,35 +47,26 @@ var cumax = require( './../lib/cumax.js' );
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var y;
var x;
var i;

x = [];
y = [];
for ( i = 0; i < len; i++ ) {
x.push( ( randu()*20.0 ) - 10.0 );
y.push( 0.0 );
}
var x = uniform( len, -10, 10, options );
var y = zeros( len, options.dtype );
return benchmark;

function benchmark( b ) {
var v;
var i;

for ( i = 0; i < len; i++ ) {
y[ i ] = 0.0;
}
gfill( len, 0.0, y, 1 );

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
x[ 0 ] += 1.0;
v = cumax( x.length, x, 1, y, 1 );
if ( isnan( v[ i%len ] ) ) {
if ( isnan( v[ i % len ] ) ) {
b.fail( 'should not return NaN' );
}
}
b.toc();
if ( isnan( v[ i%len ] ) ) {
if ( isnan( v[ i % len ] ) ) {
b.fail( 'should not return NaN' );
}
b.pass( 'benchmark finished' );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,22 @@
// MODULES //

var bench = require( '@stdlib/bench' );
var randu = require( '@stdlib/random/base/randu' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var uniform = require( '@stdlib/random/array/uniform' );
var zeros = require( '@stdlib/array/zeros' );
var gfill = require( '@stdlib/blas/ext/base/gfill' );
var pow = require( '@stdlib/math/base/special/pow' );
var pkg = require( './../package.json' ).name;
var cumax = require( './../lib/ndarray.js' );


// VARIABLES //

var options = {
'dtype': 'generic'
};


// FUNCTIONS //

/**
Expand All @@ -38,35 +47,26 @@ var cumax = require( './../lib/ndarray.js' );
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var x;
var y;
var i;

x = [];
y = [];
for ( i = 0; i < len; i++ ) {
x.push( ( randu()*20.0 ) - 10.0 );
y.push( 0.0 );
}
var x = uniform( len, -10, 10, options );
var y = zeros( len, options.dtype );
return benchmark;

function benchmark( b ) {
var v;
var i;

for ( i = 0; i < len; i++ ) {
y[ i ] = 0.0;
}
gfill( len, 0.0, y, 1 );

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
x[ 0 ] += 1.0;
v = cumax( x.length, x, 1, 0, y, 1, 0 );
if ( isnan( v[ i%len ] ) ) {
if ( isnan( v[ i % len ] ) ) {
b.fail( 'should not return NaN' );
}
}
b.toc();
if ( isnan( v[ i%len ] ) ) {
if ( isnan( v[ i % len ] ) ) {
b.fail( 'should not return NaN' );
}
b.pass( 'benchmark finished' );
Expand Down
21 changes: 10 additions & 11 deletions lib/node_modules/@stdlib/stats/base/cumax/docs/repl.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
{{alias}}( N, x, strideX, y, strideY )
Computes the cumulative maximum of a strided array.

The `N` and `stride` parameters determine which elements in `x` and `y` are
accessed at runtime.
The `N` and stride parameters determine which elements in the strided arrays
are accessed at runtime.

Indexing is relative to the first index. To introduce an offset, use a typed
array view.
Expand All @@ -19,13 +19,13 @@
Input array.

strideX: integer
Index increment for `x`.
Stride length for `x`.

y: Array<number>|TypedArray
Output array.

strideY: integer
Index increment for `y`.
Stride length for `y`.

Returns
-------
Expand All @@ -40,24 +40,23 @@
> {{alias}}( x.length, x, 1, y, 1 )
[ 1.0, 1.0, 2.0 ]

// Using `N` and `stride` parameters:
// Using `N` and stride parameters:
> x = [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0 ];
> y = [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ];
> var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 );
> {{alias}}( N, x, 2, y, 2 )
> {{alias}}( 3, x, 2, y, 2 )
[ -2.0, 0.0, 1.0, 0.0, 2.0, 0.0 ]

// Using view offsets:
> var x0 = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0 ] );
> var y0 = new {{alias:@stdlib/array/float64}}( x0.length );
> var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 );
> var y1 = new {{alias:@stdlib/array/float64}}( y0.buffer, y0.BYTES_PER_ELEMENT*3 );
> N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 );
> {{alias}}( N, x1, 2, y1, 1 )
> {{alias}}( 3, x1, 2, y1, 1 )
<Float64Array>[ -2.0, 2.0, 2.0 ]
> y0
<Float64Array>[ 0.0, 0.0, 0.0, -2.0, 2.0, 2.0 ]


{{alias}}.ndarray( N, x, strideX, offsetX, y, strideY, offsetY )
Computes the cumulative maximum of a strided array using alternative
indexing semantics.
Expand All @@ -75,7 +74,7 @@
Input array.

strideX: integer
Index increment for `x`.
Stride length for `x`.

offsetX: integer
Starting index for `x`.
Expand All @@ -84,7 +83,7 @@
Output array.

strideY: integer
Index increment for `y`.
Stride length for `y`.

offsetY: integer
Starting index for `y`.
Expand Down
28 changes: 19 additions & 9 deletions lib/node_modules/@stdlib/stats/base/cumax/docs/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,17 @@

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

import { NumericArray } from '@stdlib/types/array';
import { NumericArray, Collection, AccessorArrayLike } from '@stdlib/types/array';

/**
* Input array.
*/
type InputArray = NumericArray | Collection<number> | AccessorArrayLike<number>;

/**
* Output array.
*/
type OutputArray = NumericArray | Collection<number> | AccessorArrayLike<number>;

/**
* Interface describing `cumax`.
Expand All @@ -31,9 +41,9 @@ interface Routine {
*
* @param N - number of indexed elements
* @param x - input array
* @param strideX - `x` stride length
* @param strideX - stride length for `x`
* @param y - output array
* @param strideY - `y` stride length
* @param strideY - stride length for `y`
* @returns output array
*
* @example
Expand All @@ -43,17 +53,17 @@ interface Routine {
* cumax( x.length, x, 1, y, 1 );
* // y => [ 1.0, 1.0, 2.0 ]
*/
( N: number, x: NumericArray, strideX: number, y: NumericArray, strideY: number ): NumericArray;
<T extends OutputArray>( N: number, x: InputArray, strideX: number, y: T, strideY: number ): T;

/**
* Computes the cumulative maximum of a strided array using alternative indexing semantics.
*
* @param N - number of indexed elements
* @param x - input array
* @param strideX - `x` stride length
* @param strideX - stride length for `x`
* @param offsetX - starting index for `x`
* @param y - output array
* @param strideY - `y` stride length
* @param strideY - stride length for `y`
* @param offsetY - starting index for `y`
* @returns output array
*
Expand All @@ -64,17 +74,17 @@ interface Routine {
* cumax.ndarray( x.length, x, 1, 0, y, 1, 0 );
* // y => [ 1.0, 1.0, 2.0 ]
*/
ndarray( N: number, x: NumericArray, strideX: number, offsetX: number, y: NumericArray, strideY: number, offsetY: number ): NumericArray;
ndarray<T extends OutputArray>( N: number, x: InputArray, strideX: number, offsetX: number, y: T, strideY: number, offsetY: number ): T;
}

/**
* Computes the cumulative maximum of a strided array.
*
* @param N - number of indexed elements
* @param x - input array
* @param strideX - `x` stride length
* @param strideX - stride length for `x`
* @param y - output array
* @param strideY - `y` stride length
* @param strideY - stride length for `y`
* @returns output array
*
* @example
Expand Down
3 changes: 3 additions & 0 deletions lib/node_modules/@stdlib/stats/base/cumax/docs/types/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* limitations under the License.
*/

import AccessorArray = require( '@stdlib/array/base/accessor' );
import cumax = require( './index' );


Expand All @@ -27,6 +28,7 @@ import cumax = require( './index' );
const y = new Float64Array( 10 );

cumax( x.length, x, 1, y, 1 ); // $ExpectType NumericArray
cumax( x.length, new AccessorArray( x ), 1, new AccessorArray( y ), 1 ); // $ExpectType AccessorArray<number>
}

// The compiler throws an error if the function is provided a first argument which is not a number...
Expand Down Expand Up @@ -124,6 +126,7 @@ import cumax = require( './index' );
const y = new Float64Array( 10 );

cumax.ndarray( x.length, x, 1, 0, y, 1, 0 ); // $ExpectType NumericArray
cumax.ndarray( x.length, new AccessorArray( x ), 1, 0, new AccessorArray( y ), 1, 0 ); // $ExpectType AccessorArray<number>
}

// The compiler throws an error if the `ndarray` method is provided a first argument which is not a number...
Expand Down
16 changes: 5 additions & 11 deletions lib/node_modules/@stdlib/stats/base/cumax/examples/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,14 @@

'use strict';

var randu = require( '@stdlib/random/base/randu' );
var round = require( '@stdlib/math/base/special/round' );
var Float64Array = require( '@stdlib/array/float64' );
var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var cumax = require( './../lib' );

var y;
var x;
var i;

x = new Float64Array( 10 );
y = new Float64Array( x.length );
for ( i = 0; i < x.length; i++ ) {
x[ i ] = round( randu()*100.0 );
}
var x = discreteUniform( 10, 0, 100, {
'dtype': 'float64'
});
var y = new Float64Array( x.length );
console.log( x );
console.log( y );

Expand Down
Loading

1 comment on commit 11f1341

@stdlib-bot
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage Report

Package Statements Branches Functions Lines
stats/base/cumax $\color{green}361/361$
$\color{green}+100.00\%$
$\color{green}34/34$
$\color{green}+100.00\%$
$\color{green}3/3$
$\color{green}+100.00\%$
$\color{green}361/361$
$\color{green}+100.00\%$

The above coverage report was generated for the changes in this push.

Please sign in to comment.