From c998803b5f950ac7200be1ef209d29bb75a9fde6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 14:27:47 +0000 Subject: [PATCH] test: migrate `blas/base/csrot` to ULP-based assertions Migrates the tests for `blas/base/csrot` from relative tolerance testing to ULP difference testing by replacing the computed `delta`/`tol` comparisons in the `isApprox` test helper with `@stdlib/number/float32/base/assert/is-almost-same-value`. The ULP bounds were tightened empirically to their measured minima: `0` for the `viewX` assertions (bit-exact) and `1` for the `viewY` assertions. Ref: https://github.com/stdlib-js/stdlib/issues/11352 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GM1tQCdB4tfVPW72Q5eaAo --- .../blas/base/csrot/test/test.csrot.js | 41 +++++++---------- .../blas/base/csrot/test/test.csrot.native.js | 41 +++++++---------- .../blas/base/csrot/test/test.ndarray.js | 45 ++++++++----------- .../base/csrot/test/test.ndarray.native.js | 45 ++++++++----------- 4 files changed, 68 insertions(+), 104 deletions(-) diff --git a/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.js b/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.js index 7a41e0ccb85e..0693f927f6ed 100644 --- a/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.js +++ b/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.js @@ -23,8 +23,7 @@ var tape = require( 'tape' ); var Float32Array = require( '@stdlib/array/float32' ); var Complex64Array = require( '@stdlib/array/complex64' ); -var EPS = require( '@stdlib/constants/float32/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValuef = require( '@stdlib/number/float32/base/assert/is-almost-same-value' ); var csrot = require( './../lib/csrot.js' ); @@ -37,22 +36,14 @@ var csrot = require( './../lib/csrot.js' ); * @param {Object} t - test object * @param {Collection} actual - actual values * @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance +* @param {NonNegativeInteger} ulp - maximum allowed ULP difference */ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; +function isApprox( t, actual, expected, ulp ) { var i; t.strictEqual( actual.length, expected.length, 'returns expected value' ); for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } + t.strictEqual( isAlmostSameValuef( actual[ i ], expected[ i ], ulp ), true, 'returns expected value' ); } } @@ -125,8 +116,8 @@ tape( 'the function applies a plane rotation', function test( t ) { ]); out = csrot( x.length, x, 1, y, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -186,8 +177,8 @@ tape( 'the function supports an `x` stride', function test( t ) { ]); out = csrot( 2, x, 2, y, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -247,8 +238,8 @@ tape( 'the function supports a `y` stride', function test( t ) { ]); out = csrot( 2, x, 1, y, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -350,8 +341,8 @@ tape( 'the function supports negative strides', function test( t ) { ]); out = csrot( 2, x, -1, y, -2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -411,8 +402,8 @@ tape( 'the function supports complex access patterns', function test( t ) { ]); out = csrot( 2, x, 2, y, -1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -479,8 +470,8 @@ tape( 'the function supports view offsets', function test( t ) { ]); out = csrot( 2, x1, -2, y1, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y1, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.native.js b/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.native.js index 7b2f7b7ba2b1..836aa92fd0e5 100644 --- a/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.native.js +++ b/lib/node_modules/@stdlib/blas/base/csrot/test/test.csrot.native.js @@ -24,8 +24,7 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); var Float32Array = require( '@stdlib/array/float32' ); var Complex64Array = require( '@stdlib/array/complex64' ); -var EPS = require( '@stdlib/constants/float32/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValuef = require( '@stdlib/number/float32/base/assert/is-almost-same-value' ); var tryRequire = require( '@stdlib/utils/try-require' ); @@ -46,22 +45,14 @@ var opts = { * @param {Object} t - test object * @param {Collection} actual - actual values * @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance +* @param {NonNegativeInteger} ulp - maximum allowed ULP difference */ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; +function isApprox( t, actual, expected, ulp ) { var i; t.strictEqual( actual.length, expected.length, 'returns expected value' ); for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } + t.strictEqual( isAlmostSameValuef( actual[ i ], expected[ i ], ulp ), true, 'returns expected value' ); } } @@ -134,8 +125,8 @@ tape( 'the function applies a plane rotation', opts, function test( t ) { ]); out = csrot( x.length, x, 1, y, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -195,8 +186,8 @@ tape( 'the function supports an `x` stride', opts, function test( t ) { ]); out = csrot( 2, x, 2, y, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -256,8 +247,8 @@ tape( 'the function supports a `y` stride', opts, function test( t ) { ]); out = csrot( 2, x, 1, y, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -359,8 +350,8 @@ tape( 'the function supports negative strides', opts, function test( t ) { ]); out = csrot( 2, x, -1, y, -2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -420,8 +411,8 @@ tape( 'the function supports complex access patterns', opts, function test( t ) ]); out = csrot( 2, x, 2, y, -1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -488,8 +479,8 @@ tape( 'the function supports view offsets', opts, function test( t ) { ]); out = csrot( 2, x1, -2, y1, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y1, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.js b/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.js index 20e738cae400..70d086644380 100644 --- a/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.js @@ -23,8 +23,7 @@ var tape = require( 'tape' ); var Float32Array = require( '@stdlib/array/float32' ); var Complex64Array = require( '@stdlib/array/complex64' ); -var EPS = require( '@stdlib/constants/float32/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValuef = require( '@stdlib/number/float32/base/assert/is-almost-same-value' ); var csrot = require( './../lib/ndarray.js' ); @@ -37,22 +36,14 @@ var csrot = require( './../lib/ndarray.js' ); * @param {Object} t - test object * @param {Collection} actual - actual values * @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance +* @param {NonNegativeInteger} ulp - maximum allowed ULP difference */ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; +function isApprox( t, actual, expected, ulp ) { var i; t.strictEqual( actual.length, expected.length, 'returns expected value' ); for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } + t.strictEqual( isAlmostSameValuef( actual[ i ], expected[ i ], ulp ), true, 'returns expected value' ); } } @@ -125,8 +116,8 @@ tape( 'the function applies a plane rotation', function test( t ) { ]); out = csrot( x.length, x, 1, 0, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -186,8 +177,8 @@ tape( 'the function supports an `x` stride', function test( t ) { ]); out = csrot( 2, x, 2, 0, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -247,8 +238,8 @@ tape( 'the function supports an `x` offset', function test( t ) { ]); out = csrot( 3, x, 1, 1, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -308,8 +299,8 @@ tape( 'the function supports a `y` stride', function test( t ) { ]); out = csrot( 2, x, 1, 0, y, 2, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -369,8 +360,8 @@ tape( 'the function supports a `y` offset', function test( t ) { ]); out = csrot( 2, x, 2, 0, y, -1, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -472,8 +463,8 @@ tape( 'the function supports negative strides', function test( t ) { ]); out = csrot( 2, x, -1, 1, y, -2, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -533,8 +524,8 @@ tape( 'the function supports complex access patterns', function test( t ) { ]); out = csrot( 2, x, 2, 1, y, 1, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.native.js b/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.native.js index 29be2090bf85..5f51ecdb23b0 100644 --- a/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.native.js +++ b/lib/node_modules/@stdlib/blas/base/csrot/test/test.ndarray.native.js @@ -24,8 +24,7 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); var Float32Array = require( '@stdlib/array/float32' ); var Complex64Array = require( '@stdlib/array/complex64' ); -var EPS = require( '@stdlib/constants/float32/eps' ); -var abs = require( '@stdlib/math/base/special/abs' ); +var isAlmostSameValuef = require( '@stdlib/number/float32/base/assert/is-almost-same-value' ); var tryRequire = require( '@stdlib/utils/try-require' ); @@ -46,22 +45,14 @@ var opts = { * @param {Object} t - test object * @param {Collection} actual - actual values * @param {Collection} expected - expected values -* @param {number} rtol - relative tolerance +* @param {NonNegativeInteger} ulp - maximum allowed ULP difference */ -function isApprox( t, actual, expected, rtol ) { - var delta; - var tol; +function isApprox( t, actual, expected, ulp ) { var i; t.strictEqual( actual.length, expected.length, 'returns expected value' ); for ( i = 0; i < expected.length; i++ ) { - if ( actual[ i ] === expected[ i ] ) { - t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); - } else { - delta = abs( actual[ i ] - expected[ i ] ); - tol = rtol * EPS * abs( expected[ i ] ); - t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); - } + t.strictEqual( isAlmostSameValuef( actual[ i ], expected[ i ], ulp ), true, 'returns expected value' ); } } @@ -134,8 +125,8 @@ tape( 'the function applies a plane rotation', opts, function test( t ) { ]); out = csrot( x.length, x, 1, 0, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -195,8 +186,8 @@ tape( 'the function supports an `x` stride', opts, function test( t ) { ]); out = csrot( 2, x, 2, 0, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -256,8 +247,8 @@ tape( 'the function supports an `x` offset', opts, function test( t ) { ]); out = csrot( 3, x, 1, 1, y, 1, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -317,8 +308,8 @@ tape( 'the function supports a `y` stride', opts, function test( t ) { ]); out = csrot( 2, x, 1, 0, y, 2, 0, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -378,8 +369,8 @@ tape( 'the function supports a `y` offset', opts, function test( t ) { ]); out = csrot( 2, x, 2, 0, y, -1, 1, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -481,8 +472,8 @@ tape( 'the function supports negative strides', opts, function test( t ) { ]); out = csrot( 2, x, -1, 1, y, -2, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); }); @@ -542,8 +533,8 @@ tape( 'the function supports complex access patterns', opts, function test( t ) ]); out = csrot( 2, x, 2, 1, y, 1, 2, 0.8, 0.6 ); - isApprox( t, viewX, xe, 2.0 ); - isApprox( t, viewY, ye, 2.0 ); + isApprox( t, viewX, xe, 0 ); + isApprox( t, viewY, ye, 1 ); t.strictEqual( out, y, 'returns expected value' ); t.end(); });