diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/lib/base.js b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/base.js new file mode 100644 index 000000000000..3eb0daec7511 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/base.js @@ -0,0 +1,125 @@ +/** +* @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 sqrt = require( '@stdlib/math/base/special/sqrt' ); +var max = require( '@stdlib/math/base/special/max' ); +var min = require( '@stdlib/math/base/special/min' ); + + +// MAIN // + +/** +* Computes the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage and reduce it's condition number (with respect to the two-norm). +* +* @param {string} order - specifies whether `AP` is packed in row-major or column-major order +* @param {string} uplo - 'Upper' or 'Lower' triangle of `A` is stored +* @param {NonNegativeInteger} N - order of the matrix `A` +* @param {Float64Array} AP - array containing the upper or lower triangle of `A` in packed form +* @param {integer} strideAP - stride length for `AP` +* @param {integer} offsetAP - starting index for `AP` +* @param {Float64Array} S - array to store the scale factors of `A` +* @param {integer} strideS - stride length for `S` +* @param {integer} offsetS - starting index for `S` +* @param {Float64Array} out - array to store the output +* @param {integer} strideOut - stride length for `out` +* @param {integer} offsetOut - starting index for `out` +* @returns {integer} status code +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* +* var AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); +* var S = new Float64Array( 3 ); +* var out = new Float64Array( 2 ); +* +* dppequ( 'row-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); +* // S => [ 1, ~0.58, ~0.33 ] +* // out => [ ~0.33, 9 ] +*/ +function dppequ( order, uplo, N, AP, strideAP, offsetAP, S, strideS, offsetS, out, strideOut, offsetOut ) { // eslint-disable-line max-len, max-params + var info; + var smin; + var amax; + var jj; + var i; + + if ( N === 0 ) { + out[ offsetOut ] = 1.0; // scond + out[ offsetOut + strideOut ] = 0.0; // amax + return 0; // info + } + + S[ offsetAP ] = AP[ offsetAP ]; + smin = S[ offsetAP ]; + amax = S[ offsetAP ]; + + if ( uplo === 'U' ) { + jj = 0; + for ( i = 1; i < N; i++ ) { + if ( order === 'row-major' ) { + jj += N - i + 1; + } else { // order === 'column-major' + jj += i + 1; + } + S[ offsetS + (i * strideS) ] = AP[ offsetAP + (jj * strideAP) ]; + smin = min( smin, S[ offsetS + (i * strideS) ] ); + amax = max( amax, S[ offsetS + (i * strideS) ] ); + } + } else { // uplo === 'L' + jj = 0; + for ( i = 1; i < N; i++ ) { + if ( order === 'row-major' ) { + jj += i + 1; + } else { // order === 'column-major' + jj += N - i + 1; + } + S[ offsetS + (i * strideS) ] = AP[ offsetAP + (jj * strideAP) ]; + smin = min( smin, S[ offsetS + (i * strideS) ] ); + amax = max( amax, S[ offsetS + (i * strideS) ] ); + } + } + + if ( smin <= 0.0 ) { + for ( i = 0; i < N; i++ ) { + if ( S[ offsetS + (i * strideS) ] <= 0.0 ) { + // Leave first element of `out` unchanged + out[ offsetOut + strideOut ] = amax; // amax + info = i; + return info; + } + } + } else { + for ( i = 0; i < N; i++ ) { + S[ offsetS + (i * strideS) ] = 1.0 / sqrt( S[ offsetS + (i * strideS) ] ); // eslint-disable-line max-len + } + } + + out[ offsetOut ] = sqrt( smin ) / sqrt( amax ); // scond + out[ offsetOut + strideOut ] = amax; // amax + info = 0; + return info; +} + + +// EXPORTS // + +module.exports = dppequ; diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/lib/dppequ.js b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/dppequ.js new file mode 100644 index 000000000000..947507c94276 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/dppequ.js @@ -0,0 +1,67 @@ +/** +* @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 isLayout = require( '@stdlib/blas/base/assert/is-layout' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Computes the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage and reduce it's condition number (with respect to the two-norm). +* +* @param {string} order - specifies whether `AP` is packed in row-major or column-major order +* @param {string} uplo - 'Upper' or 'Lower' triangle of `A` is stored +* @param {NonNegativeInteger} N - order of the matrix `A` +* @param {Float64Array} AP - array containing the upper or lower triangle of `A` in packed form +* @param {Float64Array} S - array to store the scale factors of `A` +* @param {Float64Array} out - array to store the output +* @throws {TypeError} first argument must be a valid order +* @throws {RangeError} third argument must be a nonnegative integer +* @returns {integer} status code +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* +* var AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); +* var S = new Float64Array( 3 ); +* var out = new Float64Array( 2 ); +* +* dppequ( 'row-major', 'L', 3, AP, S, out ); +* // S => [ 1, ~0.58, ~0.33 ] +* // out => [ ~0.33, 9 ] +*/ +function dppequ( order, uplo, N, AP, S, out ) { + if ( !isLayout( order ) ) { + throw new TypeError( format( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. First argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + return base( order, uplo, N, AP, 1, 0, S, 1, 0, out, 1, 0 ); +} + + +// EXPORTS // + +module.exports = dppequ; diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/lib/index.js b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/index.js new file mode 100644 index 000000000000..40790ac7c266 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/index.js @@ -0,0 +1,72 @@ +/** +* @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'; + +/** +* LAPACK routine to compute the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage and reduce it's condition number (with respect to the two-norm). +* +* @module @stdlib/lapack/base/dppequ +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var dppequ = require( '@stdlib/lapack/base/dppequ' ); +* +* var AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); +* var S = new Float64Array( 3 ); +* var out = new Float64Array( 2 ); +* +* dppequ( 'row-major', 'L', 3, AP, S, out ); +* // S => [ 1, ~0.58, ~0.33 ] +* // out => [ ~0.33, 9 ] +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var dppequ = require( '@stdlib/lapack/base/dppequ' ); +* +* var AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); +* var S = new Float64Array( 3 ); +* var out = new Float64Array( 2 ); +* +* dppequ.ndarray( 'row-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); +* // S => [ 1, ~0.58, ~0.33 ] +* // out => [ ~0.33, 9 ] +*/ + +// MODULES // + +var join = require( 'path' ).join; +var tryRequire = require( '@stdlib/utils/try-require' ); +var isError = require( '@stdlib/assert/is-error' ); +var main = require( './main.js' ); + + +// MAIN // + +var dppequ; +var tmp = tryRequire( join( __dirname, './native.js' ) ); +if ( isError( tmp ) ) { + dppequ = main; +} else { + dppequ = tmp; +} + + +// EXPORTS // + +module.exports = dppequ; diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/lib/main.js b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/main.js new file mode 100644 index 000000000000..7b6ee1e50424 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/main.js @@ -0,0 +1,35 @@ +/** +* @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 setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' ); +var dppequ = require( './dppequ.js' ); +var ndarray = require( './ndarray.js' ); + + +// MAIN // + +setReadOnly( dppequ, 'ndarray', ndarray ); + + +// EXPORTS // + +module.exports = dppequ; diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/lib/ndarray.js b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/ndarray.js new file mode 100644 index 000000000000..8c264abd01f4 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/lib/ndarray.js @@ -0,0 +1,73 @@ +/** +* @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 isLayout = require( '@stdlib/blas/base/assert/is-layout' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Computes the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage and reduce it's condition number (with respect to the two-norm) using alternative indexing semantics. +* +* @param {string} order - specifies whether `AP` is packed in row-major or column-major order +* @param {string} uplo - 'Upper' or 'Lower' triangle of `A` is stored +* @param {NonNegativeInteger} N - order of the matrix `A` +* @param {Float64Array} AP - array containing the upper or lower triangle of `A` in packed form +* @param {integer} strideAP - stride length for `AP` +* @param {integer} offsetAP - starting index for `AP` +* @param {Float64Array} S - array to store the scale factors of `A` +* @param {integer} strideS - stride length for `S` +* @param {integer} offsetS - starting index for `S` +* @param {Float64Array} out - array to store the output +* @param {integer} strideOut - stride length for `out` +* @param {integer} offsetOut - starting index for `out` +* @throws {TypeError} first argument must be a valid order +* @throws {RangeError} third argument must be a nonnegative integer +* @returns {integer} status code +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* +* var AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); +* var S = new Float64Array( 3 ); +* var out = new Float64Array( 2 ); +* +* dppequ( 'row-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); +* // S => [ 1, ~0.58, ~0.33 ] +* // out => [ ~0.33, 9 ] +*/ +function dppequ( order, uplo, N, AP, strideAP, offsetAP, S, strideS, offsetS, out, strideOut, offsetOut ) { // eslint-disable-line max-len, max-params + if ( !isLayout( order ) ) { + throw new TypeError( format( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. First argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + return base( order, uplo, N, AP, strideAP, offsetAP, S, strideS, offsetS, out, strideOut, offsetOut ); // eslint-disable-line max-len +} + + +// EXPORTS // + +module.exports = dppequ; diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.dppequ.js b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.dppequ.js new file mode 100644 index 000000000000..8476e0085adc --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.dppequ.js @@ -0,0 +1,318 @@ +/** +* @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'; + +/* eslint-disable max-len */ + +// MODULES // + +var tape = require( 'tape' ); +var Float64Array = require( '@stdlib/array/float64' ); +var dppequ = require( './../lib/dppequ.js' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof dppequ, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 6', function test( t ) { + t.strictEqual( dppequ.length, 6, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid third argument', function test( t ) { + var values; + var out; + var AP; + var S; + var i; + + values = [ + -1, + -2, + -3, + -4, + -5 + ]; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + dppequ( 'row-major', 'L', value, AP, S, out ); + }; + } +}); + +tape( 'the function throws an error if provided a first argument which is not a valid order', function test( t ) { + var values; + var out; + var AP; + var S; + var i; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop', + -5, + NaN, + true, + false, + null, + void 0, + [], + {}, + function noop() {} + ]; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), TypeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + dppequ( value, 'L', 3, AP, S, out ); + }; + } +}); + +tape( 'the function leaves the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage unchanged if N is equal to 0', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 0, AP, S, out ); + + expectedOut = new Float64Array( [ 1.0, 0.0 ] ); + expectedS = new Float64Array( 3 ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (lower-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.57735026918962584, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (lower-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 5.0, 3.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'L', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.57735026918962584, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (upper-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'U', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.44721359549995793, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (upper-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 5.0, 3.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'U', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.44721359549995793, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (upper-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, -1.0, 0.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'U', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, -1.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (upper-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, 0.0, -1.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'U', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, -1.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (lower-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, -1.0, 0.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'L', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (lower-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, 0.0, -1.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 3, AP, S, out ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.js b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.js new file mode 100644 index 000000000000..96853273fab0 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.js @@ -0,0 +1,82 @@ +/** +* @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 tape = require( 'tape' ); +var proxyquire = require( 'proxyquire' ); +var IS_BROWSER = require( '@stdlib/assert/is-browser' ); +var dppequ = require( './../lib' ); + + +// VARIABLES // + +var opts = { + 'skip': IS_BROWSER +}; + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof dppequ, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'attached to the main export is a method providing an ndarray interface', function test( t ) { + t.strictEqual( typeof dppequ.ndarray, 'function', 'method is a function' ); + t.end(); +}); + +tape( 'if a native implementation is available, the main export is the native implementation', opts, function test( t ) { + var dppequ = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( dppequ, mock, 'returns expected value' ); + t.end(); + + function tryRequire() { + return mock; + } + + function mock() { + // Mock... + } +}); + +tape( 'if a native implementation is not available, the main export is a JavaScript implementation', opts, function test( t ) { + var dppequ; + var main; + + main = require( './../lib/dppequ.js' ); + + dppequ = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( dppequ, main, 'returns expected value' ); + t.end(); + + function tryRequire() { + return new Error( 'Cannot find module' ); + } +}); diff --git a/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.ndarray.js b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.ndarray.js new file mode 100644 index 000000000000..9baeb9f25394 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dppequ/test/test.ndarray.js @@ -0,0 +1,318 @@ +/** +* @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'; + +/* eslint-disable max-len */ + +// MODULES // + +var tape = require( 'tape' ); +var Float64Array = require( '@stdlib/array/float64' ); +var dppequ = require( './../lib/ndarray.js' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof dppequ, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 12', function test( t ) { + t.strictEqual( dppequ.length, 12, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid third argument', function test( t ) { + var values; + var out; + var AP; + var S; + var i; + + values = [ + -1, + -2, + -3, + -4, + -5 + ]; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + dppequ( 'row-major', 'L', value, AP, 1, 0, S, 1, 0, out, 1, 0 ); + }; + } +}); + +tape( 'the function throws an error if provided a first argument which is not a valid order', function test( t ) { + var values; + var out; + var AP; + var S; + var i; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop', + -5, + NaN, + true, + false, + null, + void 0, + [], + {}, + function noop() {} + ]; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), TypeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + dppequ( value, 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + }; + } +}); + +tape( 'the function leaves the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage unchanged if N is equal to 0', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 0, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 1.0, 0.0 ] ); + expectedS = new Float64Array( 3 ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (lower-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.57735026918962584, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (lower-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 5.0, 3.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.57735026918962584, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (upper-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 3.0, 5.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'U', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.44721359549995793, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function calculates the row and column scaling factors intended to equilibrate a symmetric positive definite matrix `A` in packed storage (upper-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 2.0, 5.0, 3.0, 6.0, 9.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'U', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.33333333333333331, 9.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.44721359549995793, 0.33333333333333331 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 0, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (upper-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, -1.0, 0.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'U', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, -1.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (upper-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, 0.0, -1.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'U', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, -1.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (lower-triangular) (column-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, -1.0, 0.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'column-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function finds the first non-positive diagonal element and returns (lower-triangular) (row-major)', function test( t ) { + var expectedOut; + var expectedS; + var info; + var out; + var AP; + var S; + + AP = new Float64Array( [ 1.0, 0.0, 0.0, -1.0, 0.0, 1.0 ] ); + S = new Float64Array( 3 ); + out = new Float64Array( 2 ); + + info = dppequ( 'row-major', 'L', 3, AP, 1, 0, S, 1, 0, out, 1, 0 ); + + expectedOut = new Float64Array( [ 0.0, 1.0 ] ); + expectedS = new Float64Array( [ 1.0, 0.0, 1.0 ] ); + t.deepEqual( S, expectedS, 'returns expected value' ); + t.deepEqual( out, expectedOut, 'returns expected value' ); + t.deepEqual( info, 1, 'returns expected value' ); + + t.end(); +});