From 140bea72f8bbfb21ce88f379c34683b73cce4d09 Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Mon, 31 Mar 2025 23:04:40 +0530 Subject: [PATCH 01/11] refactor and add protocol support to stats/base/nanmax-by --- .../@stdlib/stats/base/nanmax-by/README.md | 29 +-- .../base/nanmax-by/benchmark/benchmark.js | 24 ++- .../nanmax-by/benchmark/benchmark.ndarray.js | 24 ++- .../stats/base/nanmax-by/docs/repl.txt | 14 +- .../base/nanmax-by/docs/types/index.d.ts | 30 +-- .../stats/base/nanmax-by/docs/types/test.ts | 11 +- .../stats/base/nanmax-by/examples/index.js | 14 +- .../stats/base/nanmax-by/lib/accessors.js | 101 ++++++++++ .../stats/base/nanmax-by/lib/nanmax_by.js | 53 +---- .../stats/base/nanmax-by/lib/ndarray.js | 23 ++- .../base/nanmax-by/test/test.nanmax_by.js | 184 +++++++++++++++++- .../stats/base/nanmax-by/test/test.ndarray.js | 176 ++++++++++++++++- 12 files changed, 554 insertions(+), 129 deletions(-) create mode 100644 lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md b/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md index 5e8ffb3e9671..cb0faeddca10 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md @@ -2,7 +2,7 @@ @license Apache-2.0 -Copyright (c) 2020 The Stdlib Authors. +Copyright (c) 2025 The Stdlib Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ limitations under the License. var nanmaxBy = require( '@stdlib/stats/base/nanmax-by' ); ``` -#### nanmaxBy( N, x, stride, clbk\[, thisArg] ) +#### nanmaxBy( N, x, strideX, clbk\[, thisArg] ) Calculates the maximum value of strided array `x` via a callback function, ignoring `NaN` values. @@ -49,7 +49,7 @@ The function has the following parameters: - **N**: number of indexed elements. - **x**: input [`Array`][mdn-array], [`typed array`][mdn-typed-array], or an array-like object (excluding strings and functions). -- **stride**: index increment. +- **strideX**: index increment. - **clbk**: callback function. - **thisArg**: execution context (_optional_). @@ -57,7 +57,7 @@ The invoked callback is provided four arguments: - **value**: array element. - **aidx**: array index. -- **sidx**: strided index (`offset + aidx*stride`). +- **sidx**: strided index (`offsetX + aidx*strideX`). - **array**: input array/collection. To set the callback execution context, provide a `thisArg`. @@ -81,7 +81,7 @@ var cnt = context.count; // returns 10 ``` -The `N` and `stride` parameters determine which elements in `x` are accessed at runtime. For example, to access every other element +The `N` and `strideX` parameters determine which elements in `x` are accessed at runtime. For example, to access every other element ```javascript var floor = require( '@stdlib/math/base/special/floor' ); @@ -119,7 +119,7 @@ var v = nanmaxBy( N, x1, 2, accessor ); // returns -4.0 ``` -#### nanmaxBy.ndarray( N, x, stride, offset, clbk\[, thisArg] ) +#### nanmaxBy.ndarray( N, x, strideX, offsetX, clbk\[, thisArg] ) Calculates the maximum value of strided array `x` via a callback function, ignoring `NaN` values and using alternative indexing semantics. @@ -136,9 +136,9 @@ var v = nanmaxBy.ndarray( x.length, x, 1, 0, accessor ); The function has the following additional parameters: -- **offset**: starting index. +- **offsetX**: starting index. -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 access only the last three elements of `x` +While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offsetX` parameter supports indexing semantics based on a starting index. For example, to access only the last three elements of `x` ```javascript function accessor( v ) { @@ -160,6 +160,7 @@ var v = nanmaxBy.ndarray( 3, x, 1, x.length-3, accessor ); ## Notes - If `N <= 0`, both functions return `NaN`. +- 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]). - A provided callback function should return a numeric value. - If a provided callback function returns `NaN`, the value is ignored. - If a provided callback function does not return any value (or equivalently, explicitly returns `undefined`), the value is ignored. @@ -176,23 +177,23 @@ var v = nanmaxBy.ndarray( 3, x, 1, x.length-3, accessor ); ```javascript -var discreteUniform = require( '@stdlib/random/base/discrete-uniform' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); var nanmaxBy = require( '@stdlib/stats/base/nanmax-by' ); -function fill() { - if ( randu() < 0.2 ) { +function rand() { + if ( bernoulli( 0.8 )< 0.2 ) { return NaN; } - return discreteUniform( -50, 50 ); + return uniform( -50, 50 ); } function accessor( v ) { return v * 2.0; } -var x = filledarrayBy( 10, 'float64', fill ); +var x = filledarrayBy( 10, 'float64', rand ); console.log( x ); var v = nanmaxBy( x.length, x, 1, accessor ); diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.js index d7f641b56dfe..94557d54f523 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,9 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); var pkg = require( './../package.json' ).name; @@ -37,6 +39,12 @@ var nanmaxBy = require( './../lib/nanmax_by.js' ); * @param {number} value - array element * @returns {number} accessed value */ +function rand() { + if( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -50.0, 50.0 ); +} function accessor( value ) { return value * 2.0; } @@ -49,17 +57,7 @@ function accessor( value ) { * @returns {Function} benchmark function */ function createBenchmark( len ) { - var x; - var i; - - x = []; - for ( i = 0; i < len; i++ ) { - if ( randu() < 0.2 ) { - x.push( NaN ); - } else { - x.push( ( randu()*20.0 ) - 10.0 ); - } - } + var x = filledarrayBy( len, "float64", rand ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.ndarray.js index cb4ba4704442..e264b52d3dba 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/benchmark/benchmark.ndarray.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,9 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); var pkg = require( './../package.json' ).name; @@ -37,6 +39,12 @@ var nanmaxBy = require( './../lib/ndarray.js' ); * @param {number} value - array element * @returns {number} accessed value */ +function rand() { + if( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -50.0, 50.0 ); +} function accessor( value ) { return value * 2.0; } @@ -49,17 +57,7 @@ function accessor( value ) { * @returns {Function} benchmark function */ function createBenchmark( len ) { - var x; - var i; - - x = []; - for ( i = 0; i < len; i++ ) { - if ( randu() < 0.2 ) { - x.push( NaN ); - } else { - x.push( ( randu()*20.0 ) - 10.0 ); - } - } + var x = filledarrayBy( len, "float64", rand ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt index 59166ac9c070..bf6eb19e8ea5 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt @@ -1,9 +1,9 @@ -{{alias}}( N, x, stride, clbk[, thisArg] ) +{{alias}}( N, x, strideX, clbk[, thisArg] ) Calculates the maximum value of a strided array via a callback function, ignoring `NaN` values. - The `N` and `stride` parameters determine which elements in `x` are accessed + The `N` and `strideX` parameters determine which elements in `x` are accessed at runtime. Indexing is relative to the first index. To introduce an offset, use typed @@ -34,7 +34,7 @@ Input array/collection. If provided an object, the object must be array- like (excluding strings and functions). - stride: integer + strideX: integer Index increment for `x`. clbk: Function @@ -69,12 +69,12 @@ > {{alias}}( N, x1, 2, accessor ) -4.0 -{{alias}}.ndarray( N, x, stride, offset, clbk[, thisArg] ) +{{alias}}.ndarray( N, x, strideX, offsetX, clbk[, thisArg] ) Calculates the maximum value of a strided array via a callback function, ignoring `NaN` values and using alternative indexing semantics. While typed array views mandate a view offset based on the underlying - buffer, the `offset` parameter supports indexing semantics based on a + buffer, the `offsetX` parameter supports indexing semantics based on a starting index. Parameters @@ -86,10 +86,10 @@ Input array/collection. If provided an object, the object must be array- like (excluding strings and functions). - stride: integer + strideX: integer Index increment for `x`. - offset: integer + offsetX: integer Starting index of `x`. clbk: Function diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/index.d.ts b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/index.d.ts index ed14a85bbb5b..e25598608f4d 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/index.d.ts @@ -1,7 +1,7 @@ /* * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,11 @@ /// -import { Collection } from '@stdlib/types/array'; +import { NumericArray, Collection, AccessorArrayLike } from '@stdlib/types/array'; +/** +* Input array. +*/ +type InputArray = NumericArray | Collection | AccessorArrayLike; /** * Returns an accessed value. @@ -51,7 +55,7 @@ type Binary = ( this: U, value: T, aidx: number ) => number | void; * * @param value - array element * @param aidx - array index -* @param sidx - strided index (offset + aidx*stride) +* @param sidx - strided index (offsetX + aidx*strideX) * @returns accessed value */ type Ternary = ( this: U, value: T, aidx: number, sidx: number ) => number | void; @@ -61,7 +65,7 @@ type Ternary = ( this: U, value: T, aidx: number, sidx: number ) => number * * @param value - array element * @param aidx - array index -* @param sidx - strided index (offset + aidx*stride) +* @param sidx - strided index (offsetX + aidx*strideX) * @param array - input array * @returns accessed value */ @@ -91,7 +95,7 @@ interface Routine { * * - `value`: array element * - `aidx`: array index - * - `sidx`: strided index (offset + aidx*stride) + * - `sidx`: strided index (offsetX + aidx*strideX) * - `array`: input array * * - The callback function should return a numeric value. @@ -102,7 +106,7 @@ interface Routine { * * @param N - number of indexed elements * @param x - input array - * @param stride - stride length + * @param strideX - stride length * @param clbk - callback * @param thisArg - execution context * @returns maximum value @@ -117,7 +121,7 @@ interface Routine { * var v = nanmaxBy( x.length, x, 1, accessor ); * // returns 8.0 */ - ( N: number, x: Collection, stride: number, clbk: Callback, thisArg?: ThisParameterType> ): number; + ( N: number, x: InputArray, strideX: number, clbk: Callback, thisArg?: ThisParameterType> ): number; /** * Calculates the maximum value of a strided array via a callback function, ignoring `NaN` values and using alternative indexing semantics. @@ -128,7 +132,7 @@ interface Routine { * * - `value`: array element * - `aidx`: array index - * - `sidx`: strided index (offset + aidx*stride) + * - `sidx`: strided index (offsetX + aidx*strideX) * - `array`: input array * * - The callback function should return a numeric value. @@ -139,8 +143,8 @@ interface Routine { * * @param N - number of indexed elements * @param x - input array - * @param stride - stride length - * @param offset - starting index + * @param strideX - stride length + * @param offsetX - starting index * @param clbk - callback * @param thisArg - execution context * @returns maximum value @@ -155,7 +159,7 @@ interface Routine { * var v = nanmaxBy.ndarray( x.length, x, 1, 0, accessor ); * // returns 8.0 */ - ndarray( N: number, x: Collection, stride: number, offset: number, clbk: Callback, thisArg?: ThisParameterType> ): number; + ndarray( N: number, x: InputArray, strideX: number, offsetX: number, clbk: Callback, thisArg?: ThisParameterType> ): number; } /** @@ -167,7 +171,7 @@ interface Routine { * * - `value`: array element * - `aidx`: array index -* - `sidx`: strided index (offset + aidx*stride) +* - `sidx`: strided index (offsetX + aidx*strideX) * - `array`: input array * * - The callback function should return a numeric value. @@ -178,7 +182,7 @@ interface Routine { * * @param N - number of indexed elements * @param x - input array -* @param stride - stride length +* @param strideX - stride length * @param clbk - callback * @param thisArg - execution context * @returns maximum value diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/test.ts b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/test.ts index 171fa67151bf..67f5775ab641 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/test.ts +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/types/test.ts @@ -1,7 +1,7 @@ /* * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ */ import nanmaxBy = require( './index' ); +import toAccessorArray from '@stdlib/array/base/to-accessor-array'; const accessor = (): number => { return 5.0; @@ -29,8 +30,8 @@ const accessor = (): number => { { const x = new Float64Array( 10 ); - nanmaxBy( x.length, x, 1, accessor ); // $ExpectType number - nanmaxBy( x.length, x, 1, accessor, {} ); // $ExpectType number + nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); // $ExpectType number + nanmaxBy( x.length, toAccessorArray( x ), 1, accessor, {} ); // $ExpectType number } // The compiler throws an error if the function is provided a first argument which is not a number... @@ -101,8 +102,8 @@ const accessor = (): number => { { const x = new Float64Array( 10 ); - nanmaxBy.ndarray( x.length, x, 1, 0, accessor ); // $ExpectType number - nanmaxBy.ndarray( x.length, x, 1, 0, accessor, {} ); // $ExpectType number + nanmaxBy.ndarray( x.length, toAccessorArray( x ), 1, 0, accessor ); // $ExpectType number + nanmaxBy.ndarray( x.length, toAccessorArray( x ), 1, 0, accessor, {} ); // $ExpectType number } // The compiler throws an error if the `ndarray` method is provided a first argument which is not a number... diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/examples/index.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/examples/index.js index d10496816b36..325623b4baeb 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/examples/index.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/examples/index.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,23 +18,23 @@ 'use strict'; -var discreteUniform = require( '@stdlib/random/base/discrete-uniform' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); var nanmaxBy = require( './../lib' ); -function fill() { - if ( randu() < 0.2 ) { +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { return NaN; } - return discreteUniform( -50, 50 ); + return uniform( -50, 50 ); } function accessor( v ) { return v * 2.0; } -var x = filledarrayBy( 10, 'float64', fill ); +var x = filledarrayBy( 10, 'float64', rand ); console.log( x ); var v = nanmaxBy( x.length, x, 1, accessor ); diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js new file mode 100644 index 000000000000..5b664fd243f3 --- /dev/null +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js @@ -0,0 +1,101 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2025 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); + + +// MAIN // + +/** +* Calculates the maximum value of a strided array via a callback function, ignoring `NaN` values. +* +* @param {PositiveInteger} N - number of indexed elements +* @param {Collection} x - input array/collection +* @param {integer} strideX - index increment +* @param {NonNegativeInteger} offsetX - starting index +* @param {Callback} clbk - callback +* @param {*} [thisArg] - execution context +* @returns {number} maximum value +* +* @example +* var x = [ -2.0, 1.0, 3.0, -5.0, 4.0, NaN, 0.0, -1.0, -3.0 ]; +* +* function accessor( v ) { +* return v * 2.0; +* } +* +* var v = nanmaxBy( x.length, x, 1, 0, accessor ); +* // returns 8.0 +*/ +function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { + var xbuf; + var get; + var max; + var ix; + var v; + var i; + + // Cache reference to array data: + xbuf = x.data; + + // Cache a reference to the element accessor: + get = x.accessors[0]; + if ( N <= 0 ) { + return NaN; + } + if ( N === 1 || strideX === 0 ) { + v = clbk.call( thisArg, get( xbuf, 0 ), 0, 0, x ); + if ( v === void 0 || isnan( v ) ) { + return NaN; + } + return v; + } + ix = offsetX; + for ( i = 0; i < N; i++ ) { + max = clbk.call( thisArg, get( xbuf, ix ), i, ix, x ); + if ( max === max && max !== void 0 ) { + break; + } + ix += strideX; + } + if ( i === N ) { + return NaN; + } + i += 1; + for( i ; i < N ; i++ ) { + ix += strideX; + v = clbk.call( thisArg, get( xbuf, ix ), i, ix, x ); + if ( v === void 0 || isnan( v ) ) { + continue; + } + if( v > max || ( v === max && isPositiveZero( v ) ) ) { + max = v; + } + } + return max; +} + + +// EXPORTS // + +module.exports = nanmaxBy; \ No newline at end of file diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js index 32c7988df13c..3aa219a9fbb5 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,8 @@ // MODULES // -var isnan = require( '@stdlib/math/base/assert/is-nan' ); -var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); +var ndarray = require( './ndarray.js' ); +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); // MAIN // @@ -31,7 +31,7 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * * @param {PositiveInteger} N - number of indexed elements * @param {Collection} x - input array/collection -* @param {integer} stride - index increment +* @param {integer} strideX - index increment * @param {Callback} clbk - callback * @param {*} [thisArg] - execution context * @returns {number} maximum value @@ -46,49 +46,8 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * var v = nanmaxBy( x.length, x, 1, accessor ); * // returns 8.0 */ -function nanmaxBy( N, x, stride, clbk, thisArg ) { - var max; - var ix; - var v; - var i; - - if ( N <= 0 ) { - return NaN; - } - if ( N === 1 || stride === 0 ) { - v = clbk.call( thisArg, x[ 0 ], 0, 0, x ); - if ( v === void 0 ) { - return NaN; - } - return v; - } - if ( stride < 0 ) { - ix = (1-N) * stride; - } else { - ix = 0; - } - for ( i = 0; i < N; i++ ) { - max = clbk.call( thisArg, x[ ix ], i, ix, x ); - if ( max === max && max !== void 0 ) { - break; - } - ix += stride; - } - if ( i === N ) { - return NaN; - } - i += 1; - for ( i; i < N; i++ ) { - ix += stride; - v = clbk.call( thisArg, x[ ix ], i, ix, x ); - if ( v === void 0 || isnan( v ) ) { - continue; - } - if ( v > max || ( v === max && isPositiveZero( v ) ) ) { - max = v; - } - } - return max; +function nanmaxBy( N, x, strideX, clbk, thisArg ) { + return ndarray( N, x, strideX, stride2offset( N, strideX ), clbk , thisArg ); } diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js index 1095598082f8..49239fa0be57 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,8 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); +var arraylike2object = require( '@stdlib/array/base/arraylike2object' ); +var accessors = require( './accessors.js' ); // MAIN // @@ -31,8 +33,8 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * * @param {PositiveInteger} N - number of indexed elements * @param {Collection} x - input array/collection -* @param {integer} stride - index increment -* @param {NonNegativeInteger} offset - starting index +* @param {integer} strideX - index increment +* @param {NonNegativeInteger} offsetX - starting index * @param {Callback} clbk - callback * @param {*} [thisArg] - execution context * @returns {number} maximum value @@ -47,36 +49,41 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * var v = nanmaxBy( x.length, x, 1, 0, accessor ); * // returns 8.0 */ -function nanmaxBy( N, x, stride, offset, clbk, thisArg ) { +function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { var max; var ix; + var o; var v; var i; if ( N <= 0 ) { return NaN; } - if ( N === 1 || stride === 0 ) { + o = arraylike2object( x ); + if( o.accessorProtocol ) { + return accessors( N, o, strideX, offsetX, clbk, thisArg ); + } + if ( N === 1 || strideX === 0 ) { v = clbk.call( thisArg, x[ 0 ], 0, 0, x ); if ( v === void 0 ) { return NaN; } return v; } - ix = offset; + ix = offsetX; for ( i = 0; i < N; i++ ) { max = clbk.call( thisArg, x[ ix ], i, ix, x ); if ( max === max && max !== void 0 ) { break; } - ix += stride; + ix += strideX; } if ( i === N ) { return NaN; } i += 1; for ( i; i < N; i++ ) { - ix += stride; + ix += strideX; v = clbk.call( thisArg, x[ ix ], i, ix, x ); if ( v === void 0 || isnan( v ) ) { continue; diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index 962b286baf67..cda5bb6d9c88 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ var tape = require( 'tape' ); var floor = require( '@stdlib/math/base/special/floor' ); +var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var Float64Array = require( '@stdlib/array/float64' ); @@ -87,6 +88,42 @@ tape( 'the function calculates the maximum value of a strided array via a callba t.end(); }); +tape( 'the function calculates the maximum value of a strided array via a callback function, ignoring NaN values (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, NaN, 5.0, 0.0, NaN, 3.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( v, 10.0, 'returns expected value' ); + + x = [ -4.0, NaN, -5.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( v, -8.0, 'returns expected value' ); + + x = [ -0.0, 0.0, NaN, -0.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isPositiveZero( v ), true, 'returns expected value' ); + + x = [ NaN ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = [ NaN, NaN ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = new Array( 5 ); // sparse array + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = new Array( 5 ); // sparse array + x[ 2 ] = 1.0; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + t.end(); +}); + tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `NaN`', function test( t ) { var x; var v; @@ -102,6 +139,21 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); +tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `NaN` (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( 0, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + v = nanmaxBy( -1, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'if provided an `N` parameter equal to `1`, the function returns the first accessed element', function test( t ) { var x; var v; @@ -118,6 +170,22 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first t.end(); }); +tape( 'if provided an `N` parameter equal to `1`, the function returns the first accessed element (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + x = new Array( 1 ); // sparse array + v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports a `stride` parameter', function test( t ) { var N; var x; @@ -143,6 +211,31 @@ tape( 'the function supports a `stride` parameter', function test( t ) { t.end(); }); +tape( 'the function supports a `stride` parameter (accessors)', function test( t ) { + var N; + var x; + var v; + + x = [ + 1.0, // 0 + 2.0, + 2.0, // 1 + -7.0, + -2.0, // 2 + 3.0, + 4.0, // 3 + 2.0, + NaN, // 4 + NaN + ]; + + N = floor( x.length / 2 ); + v = nanmaxBy( N, toAccessorArray( x ), 2, accessor ); + + t.strictEqual( v, 8.0, 'returns expected value' ); + t.end(); +}); + tape( 'the function supports a negative `stride` parameter', function test( t ) { var N; var x; @@ -168,6 +261,31 @@ tape( 'the function supports a negative `stride` parameter', function test( t ) t.end(); }); +tape( 'the function supports a negative `stride` parameter (accessors)', function test( t ) { + var N; + var x; + var v; + + x = [ + NaN, // 4 + NaN, + 1.0, // 3 + 2.0, + 2.0, // 2 + -7.0, + -2.0, // 1 + 3.0, + 4.0, // 0 + 2.0 + ]; + + N = floor( x.length / 2 ); + v = nanmaxBy( N, toAccessorArray( x ), -2, accessor ); + + t.strictEqual( v, 8.0, 'returns expected value' ); + t.end(); +}); + tape( 'if provided a `stride` parameter equal to `0`, the function returns the first accessed element', function test( t ) { var x; var v; @@ -184,6 +302,22 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f t.end(); }); +tape( 'if provided a `stride` parameter equal to `0`, the function returns the first accessed element (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( x.length, x, 0, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + x = new Array( 1 ); // sparse array + v = nanmaxBy( 1, toAccessorArray( x ), 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports view offsets', function test( t ) { var x0; var x1; @@ -213,6 +347,35 @@ tape( 'the function supports view offsets', function test( t ) { t.end(); }); +tape( 'the function supports view offsets (accessors)', function test( t ) { + var x0; + var x1; + var N; + var v; + + x0 = new Float64Array([ + 2.0, + 1.0, // 0 + 2.0, + -2.0, // 1 + -2.0, + 2.0, // 2 + 3.0, + 4.0, // 3 + 6.0, + NaN, // 4 + NaN + ]); + + x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element + N = floor(x1.length / 2); + + v = nanmaxBy( N, toAccessorArray( x1 ), 2, accessor ); + t.strictEqual( v, 8.0, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports providing a callback execution context', function test( t ) { var ctx; var x; @@ -231,3 +394,22 @@ tape( 'the function supports providing a callback execution context', function t return v * 2.0; } }); + +tape( 'the function supports providing a callback execution context (accessors)', function test( t ) { + var ctx; + var x; + + x = [ 1.0, 2.0, 3.0, NaN, 4.0, 5.0 ]; + ctx = { + 'count': 0 + }; + nanmaxBy( x.length, toAccessorArray( x ), 1, accessor, ctx ); + + t.strictEqual( ctx.count, x.length, 'returns expected value' ); + t.end(); + + function accessor( v ) { + this.count += 1; // eslint-disable-line no-invalid-this + return v * 2.0; + } +}); diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.ndarray.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.ndarray.js index 1979f76e115f..bd9265c48382 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.ndarray.js @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2020 The Stdlib Authors. +* Copyright (c) 2025 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ var tape = require( 'tape' ); var floor = require( '@stdlib/math/base/special/floor' ); +var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var nanmaxBy = require( './../lib/ndarray.js' ); @@ -86,6 +87,42 @@ tape( 'the function calculates the maximum value of a strided array via a callba t.end(); }); +tape( 'the function calculates the maximum value of a strided array via a callback function, ignoring NaN values (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, NaN, 5.0, 0.0, NaN, 3.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( v, 10.0, 'returns expected value' ); + + x = [ -4.0, NaN, -5.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( v, -8.0, 'returns expected value' ); + + x = [ -0.0, 0.0, NaN, -0.0 ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isPositiveZero( v ), true, 'returns expected value' ); + + x = [ NaN ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = [ NaN, NaN ]; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = new Array( 5 ); // sparse array + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + x = new Array( 5 ); // sparse array + x[ 2 ] = 1.0; + v = nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + t.end(); +}); + tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `NaN`', function test( t ) { var x; var v; @@ -101,6 +138,21 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); +tape( 'if provided an `N` parameter less than or equal to `0`, the function returns `NaN` (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( 0, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + v = nanmaxBy( -1, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'if provided an `N` parameter equal to `1`, the function returns the first accessed element', function test( t ) { var x; var v; @@ -117,6 +169,22 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first t.end(); }); +tape( 'if provided an `N` parameter equal to `1`, the function returns the first accessed element (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( 1, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + x = new Array( 1 ); // sparse array + v = nanmaxBy( 1, toAccessorArray( x ), 1, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports a `stride` parameter', function test( t ) { var N; var x; @@ -142,6 +210,31 @@ tape( 'the function supports a `stride` parameter', function test( t ) { t.end(); }); +tape( 'the function supports a `stride` parameter (accessors)', function test( t ) { + var N; + var x; + var v; + + x = [ + 1.0, // 0 + 2.0, + 2.0, // 1 + -7.0, + -2.0, // 2 + 3.0, + 4.0, // 3 + 2.0, + NaN, // 4 + NaN + ]; + + N = floor( x.length / 2 ); + v = nanmaxBy( N, toAccessorArray( x ), 2, 0, accessor ); + + t.strictEqual( v, 8.0, 'returns expected value' ); + t.end(); +}); + tape( 'the function supports a negative `stride` parameter', function test( t ) { var N; var x; @@ -167,6 +260,31 @@ tape( 'the function supports a negative `stride` parameter', function test( t ) t.end(); }); +tape( 'the function supports a negative `stride` parameter (accessors)', function test( t ) { + var N; + var x; + var v; + + x = [ + NaN, // 4 + NaN, + 1.0, // 3 + 2.0, + 2.0, // 2 + -7.0, + -2.0, // 1 + 3.0, + 4.0, // 0 + 2.0 + ]; + + N = floor( x.length / 2 ); + v = nanmaxBy( N, toAccessorArray( x ), -2, 8, accessor ); + + t.strictEqual( v, 8.0, 'returns expected value' ); + t.end(); +}); + tape( 'if provided a `stride` parameter equal to `0`, the function returns the first accessed element', function test( t ) { var x; var v; @@ -183,6 +301,22 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f t.end(); }); +tape( 'if provided a `stride` parameter equal to `0`, the function returns the first accessed element (accessors)', function test( t ) { + var x; + var v; + + x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + + v = nanmaxBy( x.length, toAccessorArray( x ), 0, 0, accessor ); + t.strictEqual( v, 2.0, 'returns expected value' ); + + x = new Array( 1 ); // sparse array + v = nanmaxBy( 1, toAccessorArray( x ), 0, 0, accessor ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports an offset parameter', function test( t ) { var x; var v; @@ -204,6 +338,27 @@ tape( 'the function supports an offset parameter', function test( t ) { t.end(); }); +tape( 'the function supports an offset parameter (accessors)', function test( t ) { + var x; + var v; + + x = [ + 1.0, + -2.0, // 0 + 3.0, + 4.0, // 1 + 5.0, + -6.0, // 2 + NaN, + NaN // 3 + ]; + + v = nanmaxBy( 4, toAccessorArray( x ), 2, 1, accessor ); + t.strictEqual( v, 8.0, 'returns expected value' ); + + t.end(); +}); + tape( 'the function supports providing a callback execution context', function test( t ) { var ctx; var x; @@ -222,3 +377,22 @@ tape( 'the function supports providing a callback execution context', function t return v * 2.0; } }); + +tape( 'the function supports providing a callback execution context (accessors)', function test( t ) { + var ctx; + var x; + + x = [ 1.0, 2.0, 3.0, NaN, 4.0, 5.0 ]; + ctx = { + 'count': 0 + }; + nanmaxBy( x.length, toAccessorArray( x ), 1, 0, accessor, ctx ); + + t.strictEqual( ctx.count, x.length, 'returns expected value' ); + t.end(); + + function accessor( v ) { + this.count += 1; // eslint-disable-line no-invalid-this + return v * 2.0; + } +}); From 8a8ffcdb72142a4e03ca61f8732a7cb3dc0f944d Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 01:01:49 +0530 Subject: [PATCH 02/11] fix linting error --- .../@stdlib/stats/base/nanmax-by/README.md | 3 +- .../stats/base/nanmax-by/lib/accessors.js | 43 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md b/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md index cb0faeddca10..da52c48fc0b1 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/README.md @@ -160,7 +160,6 @@ var v = nanmaxBy.ndarray( 3, x, 1, x.length-3, accessor ); ## Notes - If `N <= 0`, both functions return `NaN`. -- 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]). - A provided callback function should return a numeric value. - If a provided callback function returns `NaN`, the value is ignored. - If a provided callback function does not return any value (or equivalently, explicitly returns `undefined`), the value is ignored. @@ -183,7 +182,7 @@ var bernoulli = require( '@stdlib/random/base/bernoulli' ); var nanmaxBy = require( '@stdlib/stats/base/nanmax-by' ); function rand() { - if ( bernoulli( 0.8 )< 0.2 ) { + if ( bernoulli( 0.8 )< 0.2 ) { return NaN; } return uniform( -50, 50 ); diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js index 5b664fd243f3..6a910ac5b694 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js @@ -38,17 +38,20 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * @returns {number} maximum value * * @example -* var x = [ -2.0, 1.0, 3.0, -5.0, 4.0, NaN, 0.0, -1.0, -3.0 ]; +* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' ); +* var arraylike2object = require( '@stdlib/array/base/arraylike2object' ); +* +* var x = toAccessorArray( [ -2.0, 1.0, 3.0, -5.0, 4.0, NaN, 0.0, -1.0, -3.0 ] ); * * function accessor( v ) { * return v * 2.0; * } * -* var v = nanmaxBy( x.length, x, 1, 0, accessor ); +* var v = nanmaxBy( x.length, arraylike2object( x ), 1, 0, accessor ); * // returns 8.0 */ function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { - var xbuf; + var xbuf; var get; var max; var ix; @@ -61,38 +64,38 @@ function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { // Cache a reference to the element accessor: get = x.accessors[0]; if ( N <= 0 ) { - return NaN; + return NaN; } if ( N === 1 || strideX === 0 ) { - v = clbk.call( thisArg, get( xbuf, 0 ), 0, 0, x ); - if ( v === void 0 || isnan( v ) ) { - return NaN; - } - return v; + v = clbk.call( thisArg, get( xbuf, 0 ), 0, 0, x ); + if ( v === void 0 || isnan( v ) ) { + return NaN; + } + return v; } ix = offsetX; for ( i = 0; i < N; i++ ) { max = clbk.call( thisArg, get( xbuf, ix ), i, ix, x ); - if ( max === max && max !== void 0 ) { - break; - } - ix += strideX; + if ( max === max && max !== void 0 ) { + break; + } + ix += strideX; } if ( i === N ) { - return NaN; + return NaN; } i += 1; - for( i ; i < N ; i++ ) { + for ( i; i < N; i++ ) { ix += strideX; v = clbk.call( thisArg, get( xbuf, ix ), i, ix, x ); - if ( v === void 0 || isnan( v ) ) { - continue; - } - if( v > max || ( v === max && isPositiveZero( v ) ) ) { + if ( v === void 0 || isnan( v ) ) { + continue; + } + if ( v > max || ( v === max && isPositiveZero( v ) ) ) { max = v; } } - return max; + return max; } From baea46dc8566c9162534610c058ef4fe1ece6bce Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 01:06:55 +0530 Subject: [PATCH 03/11] Update accessors.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../@stdlib/stats/base/nanmax-by/lib/accessors.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js index 6a910ac5b694..8147d1b5f302 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/accessors.js @@ -51,7 +51,7 @@ var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); * // returns 8.0 */ function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { - var xbuf; + var xbuf; var get; var max; var ix; @@ -95,10 +95,10 @@ function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { max = v; } } - return max; + return max; } // EXPORTS // -module.exports = nanmaxBy; \ No newline at end of file +module.exports = nanmaxBy; From 27e92b1f15e3b03325bb83715a4a0f52d5e9f63d Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 22:53:44 +0530 Subject: [PATCH 04/11] Update nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../@stdlib/stats/base/nanmax-by/lib/nanmax_by.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js index 3aa219a9fbb5..2631869b3393 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/nanmax_by.js @@ -20,8 +20,8 @@ // MODULES // -var ndarray = require( './ndarray.js' ); var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var ndarray = require( './ndarray.js' ); // MAIN // @@ -47,7 +47,7 @@ var stride2offset = require( '@stdlib/strided/base/stride2offset' ); * // returns 8.0 */ function nanmaxBy( N, x, strideX, clbk, thisArg ) { - return ndarray( N, x, strideX, stride2offset( N, strideX ), clbk , thisArg ); + return ndarray( N, x, strideX, stride2offset( N, strideX ), clbk, thisArg ); } From e719cfdc78f2afcb312e48ad22edb453aa9ed9c0 Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 22:53:51 +0530 Subject: [PATCH 05/11] Update repl.txt Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt index bf6eb19e8ea5..902186f54ffa 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/docs/repl.txt @@ -3,8 +3,8 @@ Calculates the maximum value of a strided array via a callback function, ignoring `NaN` values. - The `N` and `strideX` parameters determine which elements in `x` are accessed - at runtime. + The `N` and `strideX` parameters determine which elements in `x` are, + accessed at runtime. Indexing is relative to the first index. To introduce an offset, use typed array views. @@ -111,6 +111,7 @@ > {{alias}}.ndarray( x.length, x, 1, 0, accessor ) 8.0 + // Using an index offset: > x = [ 1.0, -2.0, 3.0, -4.0, 5.0, -6.0 ]; > var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 ); From e0e8bb3cf42b223425a89bcfbd7e2d7bc7aa443e Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 22:56:58 +0530 Subject: [PATCH 06/11] Update ndarray.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js index 49239fa0be57..fbb61e197a54 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/lib/ndarray.js @@ -60,7 +60,7 @@ function nanmaxBy( N, x, strideX, offsetX, clbk, thisArg ) { return NaN; } o = arraylike2object( x ); - if( o.accessorProtocol ) { + if ( o.accessorProtocol ) { return accessors( N, o, strideX, offsetX, clbk, thisArg ); } if ( N === 1 || strideX === 0 ) { From 17549ddebbbf65f84789bf79ecb87732bece9515 Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:14:52 +0530 Subject: [PATCH 07/11] Update test.nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../stats/base/nanmax-by/test/test.nanmax_by.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index cda5bb6d9c88..cb507f9c1d40 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -76,11 +76,11 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ); // sparse array + x = Array( 5 ).fill( undefined ); // sparse array v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ); // sparse array + x = Array( 5 ).fill( undefined ); // sparse array x[ 2 ] = 1.0; v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); @@ -112,11 +112,11 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ); // sparse array + x = Array( 5 ).fill( undefined ); // sparse array v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ); // sparse array + x = Array( 5 ).fill( undefined ); // sparse array x[ 2 ] = 1.0; v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); @@ -163,7 +163,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ); // sparse array + x = Array( 5 ).fill( undefined ); // sparse array v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -179,7 +179,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ); // sparse array + x = Array( 1 ).fill( undefined ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -295,7 +295,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ); // sparse array + x = Array( ).fill( undefined ); // sparse array v = nanmaxBy( 1, x, 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -311,7 +311,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ); // sparse array + x = Array( 1 ).fill( undefined ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); From 759244ef3f9e0a6b047a90bbd244bd1cc343985b Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:20:23 +0530 Subject: [PATCH 08/11] Update test.nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../stats/base/nanmax-by/test/test.nanmax_by.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index cb507f9c1d40..60e594d7f2cc 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -76,7 +76,7 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = Array( 5 ).fill( undefined ); // sparse array + x = new Array( 5 ).fill( undefined ); // sparse array v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -116,7 +116,7 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = Array( 5 ).fill( undefined ); // sparse array + x = new Array( 5 ).fill( undefined ); // sparse array x[ 2 ] = 1.0; v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); @@ -163,7 +163,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = Array( 5 ).fill( undefined ); // sparse array + x = new Array( 5 ).fill( undefined ); // sparse array v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -179,7 +179,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = Array( 1 ).fill( undefined ); // sparse array + x = new Array( 1 ).fill( undefined ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -295,7 +295,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = Array( ).fill( undefined ); // sparse array + x = new Array( ).fill( undefined ); // sparse array v = nanmaxBy( 1, x, 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -311,7 +311,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = Array( 1 ).fill( undefined ); // sparse array + x = new Array( 1 ).fill( undefined ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); From 670cfe2ed9b248b3bd698ca7386408410f72269a Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:27:44 +0530 Subject: [PATCH 09/11] Update test.nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../stats/base/nanmax-by/test/test.nanmax_by.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index 60e594d7f2cc..2acef382fe70 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -76,7 +76,8 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ).fill( undefined ); // sparse array + x = []; + x.length = 5; // sparse array v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -112,7 +113,8 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = Array( 5 ).fill( undefined ); // sparse array + x = []; // Sparse array + x.length = 5; v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -163,7 +165,8 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 5 ).fill( undefined ); // sparse array + x = []; // Sparse array + x.length = 5; v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -179,7 +182,8 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ).fill( undefined ); // sparse array + x = []; // Sparse array + x.length = 5; v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -295,7 +299,8 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( ).fill( undefined ); // sparse array + x = []; // Sparse array + x.length = 5; v = nanmaxBy( 1, x, 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); From 27b7ac5ecbce5c9d32ee0c0cc85f600831d0d637 Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Wed, 2 Apr 2025 22:34:28 +0530 Subject: [PATCH 10/11] Update test.nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../stats/base/nanmax-by/test/test.nanmax_by.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index 2acef382fe70..6b0680de5f0d 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -76,8 +76,7 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = []; - x.length = 5; // sparse array + x = new Array( 5 ); // sparse array v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -113,12 +112,11 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = []; // Sparse array - x.length = 5; + x = new Array( 5 ); // sparse array v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = new Array( 5 ).fill( undefined ); // sparse array + x = new Array( 5 ); // sparse array x[ 2 ] = 1.0; v = nanmaxBy( x.length, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); @@ -165,8 +163,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = []; // Sparse array - x.length = 5; + x = new Array( 5 ); // sparse array; v = nanmaxBy( 1, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -182,8 +179,7 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns the first v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = []; // Sparse array - x.length = 5; + x = new Array( 5 ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); @@ -299,8 +295,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = []; // Sparse array - x.length = 5; + x = new Array( 5 ); // sparse array v = nanmaxBy( 1, x, 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); From 0297ff663c3c590d125a17ef496c7d952c57c022 Mon Sep 17 00:00:00 2001 From: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> Date: Thu, 3 Apr 2025 00:17:50 +0530 Subject: [PATCH 11/11] Update test.nanmax_by.js Signed-off-by: Kaushikgtm <162317291+Kaushikgtm@users.noreply.github.com> --- .../@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js index 6b0680de5f0d..15063d272b48 100644 --- a/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js +++ b/lib/node_modules/@stdlib/stats/base/nanmax-by/test/test.nanmax_by.js @@ -80,7 +80,7 @@ tape( 'the function calculates the maximum value of a strided array via a callba v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = Array( 5 ).fill( undefined ); // sparse array + x = new Array( 5 ); // sparse array x[ 2 ] = 1.0; v = nanmaxBy( x.length, x, 1, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); @@ -311,7 +311,7 @@ tape( 'if provided a `stride` parameter equal to `0`, the function returns the f v = nanmaxBy( x.length, x, 0, accessor ); t.strictEqual( v, 2.0, 'returns expected value' ); - x = new Array( 1 ).fill( undefined ); // sparse array + x = new Array( 5 ); // sparse array v = nanmaxBy( 1, toAccessorArray( x ), 0, accessor ); t.strictEqual( isnan( v ), true, 'returns expected value' );