diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/README.md b/lib/node_modules/@stdlib/stats/base/nanminabs/README.md index cdced0c3fcde..aacc11c98ca5 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/README.md +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/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. @@ -36,7 +36,7 @@ limitations under the License. var nanminabs = require( '@stdlib/stats/base/nanminabs' ); ``` -#### nanminabs( N, x, stride ) +#### nanminabs( N, x, strideX ) Computes the minimum absolute value of a strided array `x`, ignoring `NaN` values. @@ -54,7 +54,7 @@ The function has the following parameters: - **x**: input [`Array`][mdn-array] or [`typed array`][mdn-typed-array]. - **stride**: index increment for `x`. -The `N` and `stride` parameters determine which elements in `x` are accessed at runtime. For example, to compute the minimum absolute value of every other element in `x`, +The `N` and `strideX` parameters determine which elements in `x` are accessed at runtime. For example, to compute the minimum absolute value of every other element in `x`, ```javascript var floor = require( '@stdlib/math/base/special/floor' ); @@ -83,7 +83,7 @@ var v = nanminabs( N, x1, 2 ); // returns 1.0 ``` -#### nanminabs.ndarray( N, x, stride, offset ) +#### nanminabs.ndarray( N, x, strideX, offsetX ) Computes the minimum absolute value of a strided array, ignoring `NaN` values and using alternative indexing semantics. @@ -97,9 +97,9 @@ var v = nanminabs.ndarray( N, x, 1, 0 ); The function has the following additional parameters: -- **offset**: starting index for `x`. +- **offsetX**: starting index for `x`. -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 minimum absolute value for every other value in `x` starting from the second value +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 calculate the minimum absolute value for every other value in `x` starting from the second value ```javascript var floor = require( '@stdlib/math/base/special/floor' ); diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.js b/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.js index d79514ceffbe..731d2e2edc2c 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/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,13 +21,16 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/array/uniform' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); var pkg = require( './../package.json' ).name; var nanminabs = require( './../lib/nanminabs.js' ); - +// VARIABLES // +var options = { + 'dtype': 'generic' +}; // FUNCTIONS // /** @@ -38,17 +41,7 @@ var nanminabs = require( './../lib/nanminabs.js' ); * @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 = uniform( len, -10, 10, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.ndarray.js index 9513c718b3ad..67342d333021 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/benchmark/benchmark.ndarray.js @@ -21,12 +21,16 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/array/uniform' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); var pkg = require( './../package.json' ).name; var nanminabs = require( './../lib/ndarray.js' ); +// VARIABLES // +var options = { + 'dtype': 'generic' +}; // FUNCTIONS // @@ -38,17 +42,7 @@ var nanminabs = require( './../lib/ndarray.js' ); * @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 = uniform( len, -10, 10, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/accessors.js b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/accessors.js new file mode 100644 index 000000000000..0679d7f06794 --- /dev/null +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/accessors.js @@ -0,0 +1,95 @@ +/** +* @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 abs = require( '@stdlib/math/base/special/abs' ); + + +// MAIN // + +/** +* Computes the minimum absolute value of a strided array, ignoring `NaN` values. +* Supports accessor protocol. +* +* @param {PositiveInteger} N - number of indexed elements +* @param {Object} x - input array object +* @param {Collection} x.data - input array data +* @param {Array} x.accessors - array element accessors +* @param {integer} strideX - stride length for `x` +* @param {NonNegativeInteger} offsetX - starting index for `x` +* @returns {Object} output array object +* +* @example +* var x = { data: [ -3.0, NaN, 2.0, -1.0 ], accessors: [ ( arr, i ) => arr[ i ] ] }; +* var minAbs = nanminabs( 4, x, 1, 0 ); +* // returns 1.0 +*/ +function nanminabs( N, x, strideX, offsetX ) { + var xbuf; + var get; + var min; + 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 === 1 || strideX === 0 ) { + return ((get) ? + abs( get( xbuf, offsetX) ) : + abs( xbuf[offsetX] ) ); + } + + ix = offsetX; + for ( i = 0; i < N; i++ ) { + v = ((get) ? get(xbuf, ix) : xbuf[ix]); + if ( v === v ) { + break; + } + ix += strideX; + } + if ( i === N ) { + return NaN; + } + min = abs( v ); + + for ( i += 1; i < N; i++ ) { + ix += strideX; + v = ((get) ? get(xbuf, ix) : xbuf[ix]); + v = abs( v ); + if ( isnan( v ) ) { + continue; + } + if ( v < min ) { + min = v; + } + } + return min; +} + + +// EXPORTS // + +module.exports = nanminabs; diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/main.js b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/main.js index e32d9255d6b5..7fb06b469308 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/main.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/main.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,15 +20,31 @@ // MODULES // -var setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' ); var nanminabs = require( './nanminabs.js' ); var ndarray = require( './ndarray.js' ); - +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var setReadOnly = require( '@stdlib/utils/define-read-only-property' ); // MAIN // - +/** + * Computes the minimum absolute value of a strided array. + * + * @param {PositiveInteger} N - number of indexed elements + * @param {NumericArray} x - input array + * @param {integer} strideX - stride length + * @returns {number} minimum absolute value + * + * @example + * var x = [ 1.0, -2.0, 2.0 ]; + * var N = x.length; + * + * var v = min( N, x, 1 ); + * // returns -2.0 + */ setReadOnly( nanminabs, 'ndarray', ndarray ); - +function nanminabs( N, x, strideX ) { + return ndarray( N, x, strideX, stride2offset( N, strideX ) ); +} // EXPORTS // diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/nanminabs.js b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/nanminabs.js index 6f8e046568dd..2e79f40e30dc 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/nanminabs.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/nanminabs.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 abs = require( '@stdlib/math/base/special/abs' ); +var arraylike2object = require( '@stdlib/array/base/arraylike2object' ); +var accessors = require( './accessors.js' ); // MAIN // @@ -31,7 +33,8 @@ var abs = require( '@stdlib/math/base/special/abs' ); * * @param {PositiveInteger} N - number of indexed elements * @param {NumericArray} x - input array -* @param {integer} stride - stride length +* @param {integer} strideX - stride length +* @param {NonNegativeInteger} offsetX - starting index for `x` * @returns {number} minimum absolute value * * @example @@ -41,8 +44,9 @@ var abs = require( '@stdlib/math/base/special/abs' ); * var v = nanminabs( N, x, 1 ); * // returns 1.0 */ -function nanminabs( N, x, stride ) { +function nanminabs( N, x, strideX, offsetX ) { var min; + var o; var ix; var v; var i; @@ -50,32 +54,46 @@ function nanminabs( N, x, stride ) { if ( N <= 0 ) { return NaN; } - if ( N === 1 || stride === 0 ) { - return abs( x[ 0 ] ); + o = arraylike2object( x ); + if ( o.accessorProtocol ) { + return accessors( N, o, strideX, offsetX ); } - if ( stride < 0 ) { - ix = (1-N) * stride; + + if ( N === 1 || strideX === 0 ) { + v = x[ offsetX ]; + return isnan( v ) ? NaN : abs( v ); + } + + if ( strideX < 0 ) { + ix = offsetX + (N-1) * strideX; } else { - ix = 0; + ix = offsetX; } + + // Find the first non-NaN value: for ( i = 0; i < N; i++ ) { v = x[ ix ]; - if ( v === v ) { + if ( !isnan( v ) ) { break; } - ix += stride; + ix += strideX; } if ( i === N ) { return NaN; } + + // Initialize min with the first non-NaN value: min = abs( v ); i += 1; - for ( i; i < N; i++ ) { - ix += stride; - v = abs( x[ ix ] ); + + // Iterate through the remaining elements: + for ( ; i < N; i++ ) { + ix += strideX; + v = x[ ix ]; if ( isnan( v ) ) { continue; } + v = abs( v ); if ( v < min ) { min = v; } diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/ndarray.js b/lib/node_modules/@stdlib/stats/base/nanminabs/lib/ndarray.js index fc9d8ff6065d..9df0af552c5f 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/lib/ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/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 abs = require( '@stdlib/math/base/special/abs' ); +var arraylike2object = require( '@stdlib/array/base/arraylike2object' ); +var accessors = require( './accessors.js' ); // MAIN // @@ -31,8 +33,8 @@ var abs = require( '@stdlib/math/base/special/abs' ); * * @param {PositiveInteger} N - number of indexed elements * @param {NumericArray} x - input array -* @param {integer} stride - stride length -* @param {NonNegativeInteger} offset - starting index +* @param {integer} strideX - stride length +* @param {NonNegativeInteger} offsetX - starting index * @returns {number} minimum absolute value * * @example @@ -44,42 +46,65 @@ var abs = require( '@stdlib/math/base/special/abs' ); * var v = nanminabs( N, x, 2, 1 ); * // returns 1.0 */ -function nanminabs( N, x, stride, offset ) { - var min; - var ix; - var v; - var i; - - if ( N <= 0 ) { - return NaN; - } - if ( N === 1 || stride === 0 ) { - return x[ offset ]; - } - ix = offset; - for ( i = 0; i < N; i++ ) { - v = x[ ix ]; - if ( v === v ) { - break; - } - ix += stride; - } - if ( i === N ) { - return NaN; - } - min = abs( v ); - i += 1; - for ( i; i < N; i++ ) { - ix += stride; - v = abs( x[ ix ] ); - if ( isnan( v ) ) { - continue; - } - if ( v < min ) { - min = v; - } - } - return min; +function nanminabs(N, x, strideX, offsetX) { + var min; + var o; + var ix; + var v; + var i; + + if (N <= 0) { + return NaN; + } + + o = arraylike2object(x); + if (o.accessorProtocol) { + return accessors(N, o, strideX, offsetX); + } + + if (N === 1 || strideX === 0) { + v = x[offsetX]; + return isnan(v) ? NaN : abs(v); + } + + // Initialize the starting index based on the stride: + if (strideX < 0) { + ix = offsetX + (N - 1) * strideX; // Start from the end for negative strides + } else { + ix = offsetX; // Start from the beginning for positive strides + } + + // Find the first non-NaN value: + for (i = 0; i < N; i++) { + v = x[ix]; + if (!isnan(v)) { + break; + } + ix += strideX; + } + + if (i === N) { + return NaN; // All elements are NaN + } + + // Initialize min with the first non-NaN value: + min = abs(v); + i += 1; + + // Iterate through the remaining elements: + for (; i < N; i++) { + ix += strideX; + v = x[ix]; + if (isnan(v)) { + continue; + } + v = abs(v); + if (v < min) { + min = v; + } + } + + return min; } diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.nanminabs.js b/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.nanminabs.js index c16643bfa1d5..ab4e5be00774 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.nanminabs.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.nanminabs.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,167 +21,151 @@ // MODULES // var tape = require( 'tape' ); -var floor = require( '@stdlib/math/base/special/floor' ); 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' ); var nanminabs = require( './../lib/nanminabs.js' ); - +var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' ); // TESTS // -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof nanminabs, 'function', 'main export is a function' ); +tape('main export is a function', function test(t) { + t.ok(true, __filename); + t.strictEqual(typeof nanminabs, 'function', 'main export is a function'); t.end(); }); -tape( 'the function has an arity of 3', function test( t ) { - t.strictEqual( nanminabs.length, 3, 'has expected arity' ); - t.end(); -}); +tape('the function calculates the minimum absolute value of a strided array (with accessor support)', function test(t) { + var x, v; -tape( 'the function calculates the minimum absolute value of a strided array', function test( t ) { - var x; - var v; + x = toAccessorArray([1.0, -2.0, -4.0, 5.0, 0.0, 3.0, NaN, NaN]); + v = nanminabs(x.length, x, 1, 0); + t.strictEqual(v, 0.0, 'returns expected value'); - x = [ 1.0, -2.0, -4.0, 5.0, 0.0, 3.0, NaN, NaN ]; - v = nanminabs( x.length, x, 1 ); - t.strictEqual( v, 0.0, 'returns expected value' ); + x = toAccessorArray([-4.0, NaN, -5.0]); + v = nanminabs(x.length, x, 1, 0); + t.strictEqual(v, 4.0, 'returns expected value'); - x = [ -4.0, NaN, -5.0 ]; - v = nanminabs( x.length, x, 1 ); - t.strictEqual( v, 4.0, 'returns expected value' ); + x = toAccessorArray([0.0, NaN, -0.0, 0.0]); + v = nanminabs(x.length, x, 1, 0); + t.strictEqual(isPositiveZero(v), true, 'returns expected value'); - x = [ 0.0, NaN, -0.0, 0.0 ]; - v = nanminabs( x.length, x, 1 ); - t.strictEqual( isPositiveZero( v ), true, 'returns expected value' ); + x = toAccessorArray([NaN]); + v = nanminabs(x.length, x, 1, 0); + t.strictEqual(isnan(v), true, 'returns expected value'); - x = [ NaN ]; - v = nanminabs( x.length, x, 1 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); - - x = [ NaN, NaN ]; - v = nanminabs( x.length, x, 1 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + x = toAccessorArray([NaN, NaN]); + v = nanminabs(x.length, x, 1, 0); + t.strictEqual(isnan(v), true, '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; +tape('if provided an `N` parameter less than or equal to `0`, the function returns `NaN`', function test(t) { + var x, v; - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + x = toAccessorArray([1.0, -2.0, -4.0, 5.0, 3.0]); - v = nanminabs( 0, x, 1 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + v = nanminabs(0, x, 1, 0); + t.strictEqual(isnan(v), true, 'returns expected value'); - v = nanminabs( -1, x, 1 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + v = nanminabs(-1, x, 1, 0); + t.strictEqual(isnan(v), true, 'returns expected value'); t.end(); }); -tape( 'if provided an `N` parameter equal to `1`, the function returns the first element', function test( t ) { - var x; - var v; +tape('if provided an `N` parameter equal to `1`, the function returns the first element', function test(t) { + var x, v; - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + x = toAccessorArray([1.0, -2.0, -4.0, 5.0, 3.0]); - v = nanminabs( 1, x, 1 ); - t.strictEqual( v, 1.0, 'returns expected value' ); + v = nanminabs(1, x, 1, 0); + t.strictEqual(v, 1.0, 'returns expected value'); t.end(); }); -tape( 'the function supports a `stride` parameter', 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 = nanminabs( N, x, 2 ); - - t.strictEqual( v, 1.0, 'returns expected value' ); +tape('the function supports a `stride` parameter', function test(t) { + var N, x, v; + + x = toAccessorArray([ + 1.0, + 2.0, + 2.0, + -7.0, + -2.0, + 3.0, + 4.0, + 2.0, + NaN, + NaN + ]); + + N = Math.floor(x.length / 2); + v = nanminabs(N, x, 2, 0); + + t.strictEqual(v, 1.0, 'returns expected value'); t.end(); }); -tape( 'the function supports a negative `stride` parameter', 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 = nanminabs( N, x, -2 ); - - t.strictEqual( v, 1.0, 'returns expected value' ); +tape('the function supports a negative `stride` parameter', function test(t) { + var N, x, v; + + x = toAccessorArray([ + NaN, + NaN, + 1.0, + 2.0, + 2.0, + -7.0, + -2.0, + 3.0, + 4.0, + 2.0 + ]); + + N = Math.floor(x.length / 2); + v = nanminabs(N, x, -2, 6); + + t.strictEqual(v, 1.0, 'returns expected value'); t.end(); }); -tape( 'if provided a `stride` parameter equal to `0`, the function returns the first element', function test( t ) { - var x; - var v; +tape('if provided a `stride` parameter equal to `0`, the function returns the first element', function test(t) { + var x, v; - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + x = toAccessorArray([1.0, -2.0, -4.0, 5.0, 3.0]); - v = nanminabs( x.length, x, 0 ); - t.strictEqual( v, 1.0, 'returns expected value' ); + v = nanminabs(x.length, x, 0, 0); + t.strictEqual(v, 1.0, 'returns expected value'); t.end(); }); -tape( 'the function supports view offsets', function test( t ) { - var x0; - var x1; - var N; - var v; +tape('the function supports view offsets', function test(t) { + var x0, x1, N, 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 + 2.0, + 1.0, + 2.0, + -2.0, + -2.0, + 2.0, + 3.0, + 4.0, + 6.0, + NaN, + NaN ]); - x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element - N = floor(x1.length / 2); + x1 = new Float64Array(x0.buffer, x0.BYTES_PER_ELEMENT * 1); // start at 2nd element + N = Math.floor(x1.length / 2); - v = nanminabs( N, x1, 2 ); - t.strictEqual( v, 1.0, 'returns expected value' ); + x1 = toAccessorArray(x1); + v = nanminabs(N, x1, 2, 0); + t.strictEqual(v, 1.0, 'returns expected value'); t.end(); }); diff --git a/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.ndarray.js b/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.ndarray.js index 7b909841c5fa..fc51b8ac9baa 100644 --- a/lib/node_modules/@stdlib/stats/base/nanminabs/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/nanminabs/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. @@ -26,157 +26,95 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var nanminabs = require( './../lib/ndarray.js' ); - // TESTS // tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof nanminabs, 'function', 'main export is a function' ); - t.end(); + t.ok( true, __filename ); + t.strictEqual( typeof nanminabs, 'function', 'main export is a function' ); + t.end(); }); tape( 'the function has an arity of 4', function test( t ) { - t.strictEqual( nanminabs.length, 4, 'has expected arity' ); - t.end(); + t.strictEqual( nanminabs.length, 4, 'has expected arity' ); + t.end(); }); tape( 'the function calculates the minimum absolute value of a strided array', function test( t ) { - var x; - var v; + var x, v; - x = [ 1.0, -2.0, -4.0, 5.0, NaN, 0.0, 3.0 ]; - v = nanminabs( x.length, x, 1, 0 ); - t.strictEqual( v, 0.0, 'returns expected value' ); + x = [ 1.0, -2.0, -4.0, 5.0, NaN, 0.0, 3.0 ]; + v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( v, 0.0, 'returns expected value' ); - x = [ -4.0, NaN, -5.0 ]; - v = nanminabs( x.length, x, 1, 0 ); - t.strictEqual( v, 4.0, 'returns expected value' ); + x = [ -4.0, NaN, -5.0 ]; + v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( v, 4.0, 'returns expected value' ); - x = [ 0.0, -0.0, NaN, 0.0 ]; - v = nanminabs( x.length, x, 1, 0 ); - t.strictEqual( isPositiveZero( v ), true, 'returns expected value' ); + x = [ 0.0, -0.0, NaN, 0.0 ]; + v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( isPositiveZero( v ), true, 'returns expected value' ); - x = [ NaN ]; - v = nanminabs( x.length, x, 1, 0 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + x = [ NaN ]; + v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); - x = [ NaN, NaN ]; - v = nanminabs( x.length, x, 1, 0 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + x = [ NaN, NaN ]; + v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( isnan( v ), true, 'returns expected value' ); - t.end(); + 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; - - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; - - v = nanminabs( 0, x, 1, 0 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); +tape( 'if N <= 0, the function returns NaN', function test( t ) { + var x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; - v = nanminabs( -1, x, 1, 0 ); - t.strictEqual( isnan( v ), true, 'returns expected value' ); + t.strictEqual( isnan( nanminabs( 0, x, 1, 0 ) ), true, 'returns NaN' ); + t.strictEqual( isnan( nanminabs( -1, x, 1, 0 ) ), true, 'returns NaN' ); - t.end(); + t.end(); }); -tape( 'if provided an `N` parameter equal to `1`, the function returns the first indexed element', function test( t ) { - var x; - var v; - - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; - - v = nanminabs( 1, x, 1, 0 ); - t.strictEqual( v, 1.0, 'returns expected value' ); - - t.end(); +tape( 'if N = 1, the function returns the first indexed element', function test( t ) { + var x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + t.strictEqual( nanminabs( 1, x, 1, 0 ), 1.0, 'returns expected value' ); + t.end(); }); -tape( 'the function supports a `stride` parameter', 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 = nanminabs( N, x, 2, 0 ); - - t.strictEqual( v, 1.0, 'returns expected value' ); - t.end(); +tape( 'the function supports a stride parameter', function test( t ) { + var x = [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0, NaN, NaN ]; + var N = floor( x.length / 2 ); + var v = nanminabs( N, x, 2, 0 ); + t.strictEqual( v, 1.0, 'returns expected value' ); + t.end(); }); -tape( 'the function supports a negative `stride` parameter', 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 = nanminabs( N, x, -2, 8 ); - - t.strictEqual( v, 1.0, 'returns expected value' ); - t.end(); +tape( 'the function supports a negative stride parameter', function test( t ) { + var x = [ NaN, NaN, 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0 ]; + var N = floor( x.length / 2 ); + var v = nanminabs( N, x, -2, 8 ); + t.strictEqual( v, 1.0, 'returns expected value' ); + t.end(); }); -tape( 'if provided a `stride` parameter equal to `0`, the function returns the first indexed element', function test( t ) { - var x; - var v; - - x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; - - v = nanminabs( x.length, x, 0, 0 ); - t.strictEqual( v, 1.0, 'returns expected value' ); +tape( 'if stride = 0, the function returns the first indexed element', function test( t ) { + var x = [ 1.0, -2.0, -4.0, 5.0, 3.0 ]; + t.strictEqual( nanminabs( x.length, x, 0, 0 ), 1.0, 'returns expected value' ); + t.end(); +}); - t.end(); +tape( 'the function supports an offset parameter', function test( t ) { + var x = [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN, NaN ]; + var N = floor( x.length / 2 ); + var v = nanminabs( N, x, 2, 1 ); + t.strictEqual( v, 1.0, 'returns expected value' ); + t.end(); }); -tape( 'the function supports an `offset` parameter', function test( t ) { - var N; - var x; - var v; - - x = [ - 2.0, - 1.0, // 0 - 2.0, - -2.0, // 1 - -2.0, - 2.0, // 2 - 3.0, - 4.0, // 3 - NaN, - NaN // 4 - ]; - N = floor( x.length / 2 ); - - v = nanminabs( N, x, 2, 1 ); - t.strictEqual( v, 1.0, 'returns expected value' ); - - t.end(); +tape( 'the function handles large arrays efficiently', function test( t ) { + var x = new Array( 1e6 ).fill( NaN ); + x[500] = -3.0; + x[750000] = 2.0; + var v = nanminabs( x.length, x, 1, 0 ); + t.strictEqual( v, 2.0, 'returns expected value' ); + t.end(); });