From 9816dece59ddf974693cf1626f3b5823d652e3c4 Mon Sep 17 00:00:00 2001 From: Gunj Joshi Date: Tue, 30 Jul 2024 14:52:24 +0530 Subject: [PATCH 01/25] bench: fix description PR-URL: https://github.com/stdlib-js/stdlib/pull/2709 Reviewed-by: Athan Reines Signed-off-by: Gunj Joshi --- .../@stdlib/math/base/special/gcd/benchmark/benchmark.native.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js b/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js index 59242f690a1..3805c8dd285 100644 --- a/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js +++ b/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js @@ -38,7 +38,7 @@ var opts = { // MAIN // -bench( pkg, opts, function benchmark( b ) { +bench( pkg+'::native', opts, function benchmark( b ) { var x; var y; var z; From af15420d508303989931981427d6b52c49af7554 Mon Sep 17 00:00:00 2001 From: Aman Bhansali <92033532+aman-095@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:39:08 +0530 Subject: [PATCH 02/25] feat: add `blas/base/ssyr2` PR-URL: https://github.com/stdlib-js/stdlib/pull/2708 Ref: https://github.com/stdlib-js/stdlib/issues/2039 Co-authored-by: Athan Reines Reviewed-by: Athan Reines --- .../@stdlib/blas/base/ssyr2/README.md | 265 ++++++ .../blas/base/ssyr2/benchmark/benchmark.js | 105 +++ .../base/ssyr2/benchmark/benchmark.ndarray.js | 105 +++ .../@stdlib/blas/base/ssyr2/docs/repl.txt | 127 +++ .../blas/base/ssyr2/docs/types/index.d.ts | 127 +++ .../blas/base/ssyr2/docs/types/test.ts | 450 ++++++++++ .../@stdlib/blas/base/ssyr2/examples/index.js | 36 + .../@stdlib/blas/base/ssyr2/lib/base.js | 133 +++ .../@stdlib/blas/base/ssyr2/lib/index.js | 72 ++ .../@stdlib/blas/base/ssyr2/lib/main.js | 35 + .../@stdlib/blas/base/ssyr2/lib/ndarray.js | 84 ++ .../@stdlib/blas/base/ssyr2/lib/ssyr2.js | 105 +++ .../@stdlib/blas/base/ssyr2/package.json | 68 ++ .../column_major_complex_access_pattern.json | 17 + .../ssyr2/test/fixtures/column_major_l.json | 18 + .../ssyr2/test/fixtures/column_major_oa.json | 17 + .../test/fixtures/column_major_sa1_sa2.json | 17 + .../test/fixtures/column_major_sa1_sa2n.json | 17 + .../test/fixtures/column_major_sa1n_sa2.json | 17 + .../test/fixtures/column_major_sa1n_sa2n.json | 17 + .../ssyr2/test/fixtures/column_major_u.json | 18 + .../test/fixtures/column_major_xnyn.json | 18 + .../test/fixtures/column_major_xnyp.json | 18 + .../test/fixtures/column_major_xpyn.json | 18 + .../test/fixtures/column_major_xpyp.json | 18 + .../row_major_complex_access_pattern.json | 17 + .../base/ssyr2/test/fixtures/row_major_l.json | 18 + .../ssyr2/test/fixtures/row_major_oa.json | 17 + .../test/fixtures/row_major_sa1_sa2.json | 17 + .../test/fixtures/row_major_sa1_sa2n.json | 17 + .../test/fixtures/row_major_sa1n_sa2.json | 17 + .../test/fixtures/row_major_sa1n_sa2n.json | 17 + .../base/ssyr2/test/fixtures/row_major_u.json | 18 + .../ssyr2/test/fixtures/row_major_xnyn.json | 18 + .../ssyr2/test/fixtures/row_major_xnyp.json | 18 + .../ssyr2/test/fixtures/row_major_xpyn.json | 18 + .../ssyr2/test/fixtures/row_major_xpyp.json | 18 + .../@stdlib/blas/base/ssyr2/test/test.js | 82 ++ .../blas/base/ssyr2/test/test.ndarray.js | 823 ++++++++++++++++++ .../blas/base/ssyr2/test/test.ssyr2.js | 589 +++++++++++++ 40 files changed, 3626 insertions(+) create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/README.md create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/package.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js create mode 100644 lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/README.md b/lib/node_modules/@stdlib/blas/base/ssyr2/README.md new file mode 100644 index 00000000000..1901c5737ee --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/README.md @@ -0,0 +1,265 @@ + + +# ssyr2 + +> Perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`. + +
+ +## Usage + +```javascript +var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +``` + +#### ssyr2( order, uplo, N, α, x, sx, y, sy, A, LDA ) + +Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +// A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +``` + +The function has the following parameters: + +- **order**: storage layout. +- **uplo**: specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced. +- **N**: number of elements along each dimension of `A`. +- **α**: scalar constant. +- **x**: first input [`Float32Array`][mdn-float32array]. +- **sx**: index increment for `x`. +- **y**: second input [`Float32Array`][mdn-float32array]. +- **sy**: index increment for `y`. +- **A**: input matrix stored in linear memory as a [`Float32Array`][mdn-float32array]. +- **lda**: stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`). + +The stride parameters determine how elements in the input arrays are accessed at runtime. For example, to iterate over every other element of `x`, + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 2, y, 1, A, 3 ); +// A => [ 3.0, 7.0, 11.0, 0.0, 13.0, 21.0, 0.0, 0.0, 31.0 ] +``` + +Note that indexing is relative to the first index. To introduce an offset, use [`typed array`][mdn-typed-array] views. + + + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +// Initial arrays... +var x0 = new Float32Array( [ 0.0, 1.0, 1.0, 1.0 ] ); +var y0 = new Float32Array( [ 0.0, 1.0, 2.0, 3.0 ] ); +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); + +// Create offset views... +var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element +var y1 = new Float32Array( y0.buffer, y0.BYTES_PER_ELEMENT*1 ); // start at 2nd element + +ssyr2( 'row-major', 'upper', 3, 1.0, x1, 1, y1, 1, A, 3 ); +// A => [ 3.0, 5.0, 7.0, 0.0, 5.0, 7.0, 0.0, 0.0, 7.0 ] +``` + +#### ssyr2.ndarray( uplo, N, α, x, sx, ox, y, sy, oy, A, sa1, sa2, oa ) + +Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using alternative indexing semantics and where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +// A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +``` + +The function has the following additional parameters: + +- **ox**: starting index for `x`. +- **oy**: starting index for `y`. +- **sa1**: stride of the first dimension of `A`. +- **sa2**: stride of the second dimension of `A`. +- **oa**: starting index for `A`. + +While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example, + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2.ndarray( 'upper', 3, 1.0, x, -2, 4, y, 1, 0, A, 3, 1, 0 ); +// A => [ 11.0, 15.0, 19.0, 0.0, 13.0, 13.0, 0.0, 0.0, 7.0 ] +``` + +
+ + + +
+ +## Notes + +- `ssyr2()` corresponds to the [BLAS][blas] level 2 function [`ssyr2`][blas-ssyr2]. + +
+ + + +
+ +## Examples + + + +```javascript +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var ones = require( '@stdlib/array/ones' ); +var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); + +var opts = { + 'dtype': 'float32' +}; + +var N = 3; + +var A = ones( N*N, opts.dtype ); +var x = discreteUniform( N, -10.0, 10.0, opts ); +var y = discreteUniform( N, -10.0, 10.0, opts ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +console.log( A ); +``` + +
+ + + + + +* * * + +
+ +## C APIs + + + +
+ +
+ + + + + +
+ +### Usage + +```c +TODO +``` + +#### TODO + +TODO. + +```c +TODO +``` + +TODO + +```c +TODO +``` + +
+ + + + + +
+ +
+ + + + + +
+ +### Examples + +```c +TODO +``` + +
+ + + +
+ + + + + + + + + + + + + + diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js new file mode 100644 index 00000000000..265f486ca84 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 bench = require( '@stdlib/bench' ); +var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); +var ones = require( '@stdlib/array/ones' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var pkg = require( './../package.json' ).name; +var ssyr2 = require( './../lib/ssyr2.js' ); + + +// VARIABLES // + +var options = { + 'dtype': 'float32' +}; + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} N - number of elements along each dimension +* @returns {Function} benchmark function +*/ +function createBenchmark( N ) { + var x = ones( N, options.dtype ); + var y = ones( N, options.dtype ); + var A = ones( N*N, options.dtype ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var z; + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + z = ssyr2( 'row-major', 'upper', N, 1.0, x, 1, y, 1, A, N ); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var min; + var max; + var N; + var f; + var i; + + min = 1; // 10^min + max = 6; // 10^max + + for ( i = min; i <= max; i++ ) { + N = floor( pow( pow( 10, i ), 1.0/2.0 ) ); + f = createBenchmark( N ); + bench( pkg+':size='+(N*N), f ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js new file mode 100644 index 00000000000..3ad7c35d797 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 bench = require( '@stdlib/bench' ); +var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); +var ones = require( '@stdlib/array/ones' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var pkg = require( './../package.json' ).name; +var ssyr2 = require( './../lib/ndarray.js' ); + + +// VARIABLES // + +var options = { + 'dtype': 'float32' +}; + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} N - number of elements along each dimension +* @returns {Function} benchmark function +*/ +function createBenchmark( N ) { + var x = ones( N, options.dtype ); + var y = ones( N, options.dtype ); + var A = ones( N*N, options.dtype ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var z; + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + z = ssyr2( 'upper', N, 1.0, x, 1, 0, y, 1, 0, A, N, 1, 0 ); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var min; + var max; + var N; + var f; + var i; + + min = 1; // 10^min + max = 6; // 10^max + + for ( i = min; i <= max; i++ ) { + N = floor( pow( pow( 10, i ), 1.0/2.0 ) ); + f = createBenchmark( N ); + bench( pkg+':ndarray:size='+(N*N), f ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt new file mode 100644 index 00000000000..d1191871895 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt @@ -0,0 +1,127 @@ + +{{alias}}( order, uplo, N, α, x, sx, y, sy, A, lda ) + Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where + `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by + `N` symmetric matrix. + + Indexing is relative to the first index. To introduce an offset, use typed + array views. + + If `N` is equal to `0` or `α` is equal to `0`, the function returns `A` + unchanged. + + Parameters + ---------- + order: string + Row-major (C-style) or column-major (Fortran-style) order. Must be + either 'row-major' or 'column-major'. + + uplo: string + Specifies whether to reference the upper or lower triangular part of + `A`. Must be either 'upper' or 'lower'. + + N: integer + Number of elements along each dimension of `A`. + + α: number + Scalar constant. + + x: Float32Array + First input vector. + + sx: integer + Index increment for `x`. + + y: Float32Array + Second input vector. + + sy: integer + Index increment for `y`. + + A: Float32Array + Matrix. + + lda: integer + Stride of the first dimension of `A` (a.k.a., leading dimension of the + matrix `A`). + + Returns + ------- + A: Float32Array + Input matrix. + + Examples + -------- + > var x = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var y = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var A = new {{alias:@stdlib/array/float32}}( [ 1.0, 2.0, 0.0, 2.0 ] ); + > {{alias}}( 'row-major', 'upper', 2, 1.0, x, 1, y, 1, A, 2 ) + [ 3.0, 4.0, 0.0, 4.0 ] + + +{{alias}}.ndarray( uplo, N, α, x, sx, ox, y, sy, oy, A, sa1, sa2, oa ) + Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using + alternative indexing semantics and where `α` is a scalar, `x` and `y` are + `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + + While typed array views mandate a view offset based on the underlying + buffer, the offset parameters support indexing semantics based on starting + indices. + + Parameters + ---------- + uplo: string + Specifies whether to reference the upper or lower triangular part of + `A`. Must be either 'upper' or 'lower'. + + N: integer + Number of elements along each dimension of `A`. + + α: number + Scalar constant. + + x: Float32Array + First input vector. + + sx: integer + Index increment for `x`. + + ox: integer + Starting index for `x`. + + y: Float32Array + Second input vector. + + sy: integer + Index increment for `y`. + + oy: integer + Starting index for `y`. + + A: Float32Array + Matrix. + + sa1: integer + Stride of the first dimension of `A`. + + sa2: integer + Stride of the second dimension of `A`. + + oa: integer + Starting index for `A`. + + Returns + ------- + A: Float32Array + Input matrix. + + Examples + -------- + > var x = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var y = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var A = new {{alias:@stdlib/array/float32}}( [ 1.0, 2.0, 0.0, 2.0 ] ); + > {{alias}}.ndarray( 'upper', 2, 1.0, x, 1, 0, y, 1, 0, A, 2, 1, 0 ) + [ 3.0, 4.0, 0.0, 4.0 ] + + See Also + -------- diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts new file mode 100644 index 00000000000..78911e139f0 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts @@ -0,0 +1,127 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2024 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. +*/ + +// TypeScript Version: 4.1 + +/// + +import { Layout, MatrixTriangle } from '@stdlib/types/blas'; + +/** +* Interface describing `ssyr2`. +*/ +interface Routine { + /** + * Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + * + * @param order - storage layout + * @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced + * @param N - number of elements along each dimension in the matrix `A` + * @param alpha - scalar constant + * @param x - first input array + * @param strideX - `x` stride length + * @param y - second input array + * @param strideY - `y` stride length + * @param A - matrix + * @param LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) + * @returns `A` + * + * @example + * var Float32Array = require( '@stdlib/array/float32' ); + * + * var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] + * var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * + * ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); + * // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] + */ + ( order: Layout, uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, y: Float32Array, strideY: number, A: Float32Array, LDA: number ): Float32Array; + + /** + * Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using alternative indexing semantics and where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + * + * @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced + * @param N - number of elements along each dimension in the matrix `A` + * @param alpha - scalar constant + * @param x - first input array + * @param strideX - `x` stride length + * @param offsetX - starting index for `x` + * @param y - second input array + * @param strideY - `y` stride length + * @param offsetY - starting index for `y` + * @param A - matrix + * @param strideA1 - stride of the first dimension of `A` + * @param strideA2 - stride of the second dimension of `A` + * @param offsetA - starting index for `A` + * @returns `A` + * + * @example + * var Float32Array = require( '@stdlib/array/float32' ); + * + * var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] + * var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * + * ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); + * // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] + */ + ndarray( uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, offsetX: number, A: Float32Array, strideA1: number, strideA2: number, offsetA: number ): Float32Array; +} + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param order - storage layout +* @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param N - number of elements along each dimension in the matrix `A` +* @param alpha - scalar constant +* @param x - first input array +* @param strideX - `x` stride length +* @param y - second input array +* @param strideY - `y` stride length +* @param A - matrix +* @param LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) +* @returns `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ] ); +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'column-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 1.0, 1.0, 0.0, 2.0, 2.0, 0.0, 0.0, 3.0 ] ); +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 1, 3, 0 ); +* // A => [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +*/ +declare var ssyr2: Routine; + + +// EXPORTS // + +export = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts new file mode 100644 index 00000000000..bd160723ebc --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts @@ -0,0 +1,450 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2024 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. +*/ + +import ssyr2 = require( './index' ); + + +// TESTS // + +// The function returns a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectType Float32Array +} + +// The compiler throws an error if the function is provided a first argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 10, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( true, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( false, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( null, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( undefined, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( [], 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( {}, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( ( x: number ): number => x, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 10, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', true, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', false, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', null, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', undefined, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', [ '1' ], 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', {}, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', ( x: number ): number => x, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', '10', 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', true, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', false, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', null, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', undefined, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', [], 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', {}, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', ( x: number ): number => x, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, '10', x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, true, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, false, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, null, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, undefined, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, [], x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, {}, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, ( x: number ): number => x, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fifth argument which is not a Float32Array... +{ + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, 10, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, '10', 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, true, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, false, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, null, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, undefined, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, [ '1' ], 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, {}, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, ( x: number ): number => x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a sixth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, '10', y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, true, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, false, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, null, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, undefined, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, [], y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, {}, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, ( x: number ): number => x, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a seventh argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, 10, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, '10', 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, true, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, false, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, null, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, undefined, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, [ '1' ], 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, {}, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, ( x: number ): number => x, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eighth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, '10', A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, true, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, false, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, null, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, undefined, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, [], A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, {}, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, ( x: number ): number => x, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a ninth argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, 10, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, '10', 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, true, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, false, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, null, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, undefined, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, [ '1' ], 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, {}, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, ( x: number ): number => x, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a tenth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, '10' ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, true ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, false ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, null ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, undefined ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, [] ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, {} ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the function is provided an unsupported number of arguments... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2(); // $ExpectError + ssyr2( 'row-major' ); // $ExpectError + ssyr2( 'row-major', 'upper' ); // $ExpectError + ssyr2( 'row-major', 'upper', 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, 10, 1 ); // $ExpectError +} + +// Attached to main export is an `ndarray` method which returns a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectType Float32Array +} + +// The compiler throws an error if the function is provided a first argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 10, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( true, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( false, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( null, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( undefined, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( [ '1' ], 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( {}, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( ( x: number ): number => x, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', '10', 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', true, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', false, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', null, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', undefined, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', [], 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', {}, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', ( x: number ): number => x, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, '10', x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, true, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, false, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, null, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, undefined, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, [], x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, {}, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, ( x: number ): number => x, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a Float32Array... +{ + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, 10, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, '10', 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, true, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, false, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, null, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, undefined, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, [ '1' ], 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, {}, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, ( x: number ): number => x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fifth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, '10', 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, true, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, false, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, null, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, undefined, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, [], 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, {}, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, ( x: number ): number => x, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a sixth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, '10', y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, true, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, false, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, null, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, undefined, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, [], y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, {}, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, ( x: number ): number => x, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a seventh argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, 10, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, '10', 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, true, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, false, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, null, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, undefined, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, [ '1' ], 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, {}, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, ( x: number ): number => x, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eighth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, '10', 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, true, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, false, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, null, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, undefined, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, [], 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, {}, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, ( x: number ): number => x, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a ninth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, '10', A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, true, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, false, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, null, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, undefined, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, [], A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, {}, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, ( x: number ): number => x, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a tenth argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, 10, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, '10', 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, true, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, false, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, null, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, undefined, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, [ '1' ], 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, {}, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, ( x: number ): number => x, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eleventh argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, '10', 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, true, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, false, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, null, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, undefined, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, [], 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, {}, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, ( x: number ): number => x, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a twelfth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, '10', 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, true, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, false, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, null, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, undefined, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, [], 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, {}, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, ( x: number ): number => x, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a thirteenth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, '10' ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, true ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, false ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, null ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, undefined ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, [] ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, {} ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the `ndarray` method is provided an unsupported number of arguments... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray(); // $ExpectError + ssyr2.ndarray(); // $ExpectError + ssyr2.ndarray( 'upper' ); // $ExpectError + ssyr2.ndarray( 'upper', 10 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0, 10 ); // $ExpectError +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js b/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js new file mode 100644 index 00000000000..107de2f608e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js @@ -0,0 +1,36 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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'; + +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var ones = require( '@stdlib/array/ones' ); +var ssyr2 = require( './../lib' ); + +var opts = { + 'dtype': 'float32' +}; + +var N = 3; + +var A = ones( N*N, opts.dtype ); +var x = discreteUniform( N, -10.0, 10.0, opts ); +var y = discreteUniform( N, -10.0, 10.0, opts ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +console.log( A ); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js new file mode 100644 index 00000000000..ff990d7755c --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js @@ -0,0 +1,133 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 isRowMajor = require( '@stdlib/ndarray/base/assert/is-row-major' ); +var f32 = require( '@stdlib/number/float64/base/to-float32' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @private +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - first input vector +* @param {integer} strideX - `x` stride length +* @param {NonNegativeInteger} offsetX - starting index for `x` +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {NonNegativeInteger} offsetY - starting index for `y` +* @param {Float32Array} A - input matrix +* @param {integer} strideA1 - stride of the first dimension of `A` +* @param {integer} strideA2 - stride of the second dimension of `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ) { // eslint-disable-line max-len, max-params + var tmp1; + var tmp2; + var isrm; + var ix0; + var ix1; + var iy0; + var iy1; + var sa0; + var sa1; + var i0; + var i1; + var oa; + var ox; + var oy; + + isrm = isRowMajor( [ strideA1, strideA2 ] ); + if ( isrm ) { // row-major + // For row-major matrices, the last dimension has the fastest changing index... + sa0 = strideA2; // stride for innermost loop + sa1 = strideA1; // stride for outermost loop + } else { // column-major + // For column-major matrices, the first dimension has the fastest changing index... + sa0 = strideA1; // stride for innermost loop + sa1 = strideA2; // stride for outermost loop + } + ox = offsetX; + oy = offsetY; + ix1 = ox; + iy1 = oy; + if ( + ( isrm && uplo === 'lower' ) || + ( !isrm && uplo === 'upper' ) + ) { + for ( i1 = 0; i1 < N; i1++ ) { + if ( ( x[ ix1 ] !== 0.0 ) || ( y[ iy1 ] !== 0.0 ) ) { + tmp1 = f32( alpha * y[ iy1 ] ); + tmp2 = f32( alpha * x[ ix1 ] ); + oa = offsetA + (sa1*i1); + ix0 = ox; + iy0 = oy; + for ( i0 = 0; i0 <= i1; i0++ ) { + A[ oa+(sa0*i0) ] += f32( f32( x[ ix0 ] * tmp1 ) + f32( y[ iy0 ] * tmp2 ) ); // eslint-disable-line max-len + ix0 += strideX; + iy0 += strideY; + } + } + ix1 += strideX; + iy1 += strideY; + } + return A; + } + // ( isrm && uplo === 'upper' ) || ( !isrm && uplo === 'lower' ) + for ( i1 = 0; i1 < N; i1++ ) { + if ( ( x[ ix1 ] !== 0.0 ) || ( y[ iy1 ] !== 0.0 ) ) { + tmp1 = f32( alpha * y[ iy1 ] ); + tmp2 = f32( alpha * x[ ix1 ] ); + oa = offsetA + (sa1*i1); + ix0 = ix1; + iy0 = iy1; + for ( i0 = i1; i0 < N; i0++ ) { + A[ oa+(sa0*i0) ] += f32( f32( x[ ix0 ] * tmp1 ) + f32( y[ iy0 ] * tmp2 ) ); // eslint-disable-line max-len + ix0 += strideX; + iy0 += strideY; + } + } + ix1 += strideX; + iy1 += strideY; + } + return A; +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js new file mode 100644 index 00000000000..d7c735e345f --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js @@ -0,0 +1,72 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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'; + +/** +* BLAS level 2 routine to perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @module @stdlib/blas/base/ssyr2 +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ + +// 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 ssyr2; +var tmp = tryRequire( join( __dirname, './native.js' ) ); +if ( isError( tmp ) ) { + ssyr2 = main; +} else { + ssyr2 = tmp; +} + + +// EXPORTS // + +module.exports = ssyr2; + +// exports: { "ndarray": "ssyr2.ndarray" } diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js new file mode 100644 index 00000000000..514776b5252 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js @@ -0,0 +1,35 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 ssyr2 = require( './ssyr2.js' ); +var ndarray = require( './ndarray.js' ); + + +// MAIN // + +setReadOnly( ssyr2, 'ndarray', ndarray ); + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js new file mode 100644 index 00000000000..bd593f06a18 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js @@ -0,0 +1,84 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - input vector +* @param {integer} strideX - `x` stride length +* @param {NonNegativeInteger} offsetX - starting index for `x` +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {NonNegativeInteger} offsetY - starting index for `y` +* @param {Float32Array} A - input matrix +* @param {integer} strideA1 - stride of the first dimension of `A` +* @param {integer} strideA2 - stride of the second dimension of `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` +* @throws {TypeError} first argument must specify whether to reference the lower or upper triangular matrix +* @throws {RangeError} second argument must be a nonnegative integer +* @throws {RangeError} fifth argument must be non-zero +* @throws {RangeError} eighth argument must be non-zero +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ) { // eslint-disable-line max-len, max-params + if ( !isMatrixTriangle( uplo ) ) { + throw new TypeError( format( 'invalid argument. First argument must specify whether the reference the lower or upper triangular matrix. Value: `%s`.', uplo ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. Second argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + if ( strideX === 0 ) { + throw new RangeError( format( 'invalid argument. Fifth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( strideY === 0 ) { + throw new RangeError( format( 'invalid argument. Eighth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( N === 0 || alpha === 0.0 ) { + return A; + } + return base( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ); // eslint-disable-line max-len +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js new file mode 100644 index 00000000000..87adeb40c64 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 max = require( '@stdlib/math/base/special/fast/max' ); +var isLayout = require( '@stdlib/blas/base/assert/is-layout' ); +var isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param {string} order - storage layout +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - first input vector +* @param {integer} strideX - `x` stride length +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {Float32Array} A - input matrix +* @param {integer} LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) +* @throws {TypeError} first argument must be a valid order +* @throws {TypeError} second argument must specify whether to reference the lower or upper triangular matrix +* @throws {RangeError} third argument must be a nonnegative integer +* @throws {RangeError} sixth argument must be non-zero +* @throws {RangeError} eighth argument must be greater than or equal to max(1,N) +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( order, uplo, N, alpha, x, strideX, y, strideY, A, LDA ) { + var sa1; + var sa2; + var ox; + var oy; + + if ( !isLayout( order ) ) { + throw new TypeError( format( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ) ); + } + if ( !isMatrixTriangle( uplo ) ) { + throw new TypeError( format( 'invalid argument. Second argument must specify whether to reference the lower or upper triangular matrix. Value: `%s`.', uplo ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. Third argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + if ( strideX === 0 ) { + throw new RangeError( format( 'invalid argument. Sixth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( strideY === 0 ) { + throw new RangeError( format( 'invalid argument. Eighth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( LDA < max( 1, N ) ) { + throw new RangeError( format( 'invalid argument. Tenth argument must be greater than or equal to max(1,%d). Value: `%d`.', N, LDA ) ); + } + if ( N === 0 || alpha === 0.0 ) { + return A; + } + if ( order === 'column-major' ) { + sa1 = 1; + sa2 = LDA; + } else { // order === 'row-major' + sa1 = LDA; + sa2 = 1; + } + ox = stride2offset( N, strideX ); + oy = stride2offset( N, strideY ); + return base( uplo, N, alpha, x, strideX, ox, y, strideY, oy, A, sa1, sa2, 0 ); // eslint-disable-line max-len +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/package.json b/lib/node_modules/@stdlib/blas/base/ssyr2/package.json new file mode 100644 index 00000000000..cf7b13d10bb --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/package.json @@ -0,0 +1,68 @@ +{ + "name": "@stdlib/blas/base/ssyr2", + "version": "0.0.0", + "description": "Perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`.", + "license": "Apache-2.0", + "author": { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + }, + "contributors": [ + { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + } + ], + "main": "./lib", + "directories": { + "benchmark": "./benchmark", + "doc": "./docs", + "example": "./examples", + "lib": "./lib", + "test": "./test" + }, + "types": "./docs/types", + "scripts": {}, + "homepage": "https://github.com/stdlib-js/stdlib", + "repository": { + "type": "git", + "url": "git://github.com/stdlib-js/stdlib.git" + }, + "bugs": { + "url": "https://github.com/stdlib-js/stdlib/issues" + }, + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=0.10.0", + "npm": ">2.7.0" + }, + "os": [ + "aix", + "darwin", + "freebsd", + "linux", + "macos", + "openbsd", + "sunos", + "win32", + "windows" + ], + "keywords": [ + "stdlib", + "stdmath", + "mathematics", + "math", + "blas", + "level 2", + "ssyr2", + "linear", + "algebra", + "subroutines", + "array", + "ndarray", + "float32", + "float", + "float32array" + ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json new file mode 100644 index 00000000000..f6257986814 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": -1, + "offsetX": 2, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0 ], + "strideA1": -2, + "strideA2": -10, + "offsetA": 29, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json new file mode 100644 index 00000000000..781a5a56fc1 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 1.0, 1.0, 0.0, 2.0, 2.0, 0.0, 0.0, 3.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 5.0, 9.0, 13.0, 0.0, 18.0, 26.0, 0.0, 0.0, 39.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json new file mode 100644 index 00000000000..b01a1efbe2a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 1.0, 1.0, 999.0, 999.0, 0.0, 2.0, 2.0, 999.0, 999.0, 0.0, 0.0, 3.0, 999.0 ], + "strideA1": 1, + "strideA2": 5, + "offsetA": 1, + "A_out": [ 999.0, 5.0, 9.0, 13.0, 999.0, 999.0, 0.0, 18.0, 26.0, 999.0, 999.0, 0.0, 0.0, 39.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json new file mode 100644 index 00000000000..62cdc5b269d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0 ], + "strideA1": 2, + "strideA2": 10, + "offsetA": 5, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json new file mode 100644 index 00000000000..d77b0e2955d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0 ], + "strideA1": 2, + "strideA2": -10, + "offsetA": 25, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 0.0, 999.0, 0.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json new file mode 100644 index 00000000000..bd1fea14ca2 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0 ], + "strideA1": -2, + "strideA2": 10, + "offsetA": 9, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 6.0, 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 14.0, 999.0, 9.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json new file mode 100644 index 00000000000..32e3298705a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0 ], + "strideA1": -2, + "strideA2": -10, + "offsetA": 29, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 14.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 6.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json new file mode 100644 index 00000000000..fac00d3bf1c --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json new file mode 100644 index 00000000000..790473bbd53 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 31.0, 0.0, 0.0, 21.0, 13.0, 0.0, 11.0, 7.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json new file mode 100644 index 00000000000..3cbe3d71e9a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 11.0, 0.0, 0.0, 15.0, 13.0, 0.0, 19.0, 13.0, 7.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json new file mode 100644 index 00000000000..072dcef02fc --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 7.0, 0.0, 0.0, 13.0, 13.0, 0.0, 19.0, 15.0, 11.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json new file mode 100644 index 00000000000..d8685725d61 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 3.0, 0.0, 0.0, 7.0, 13.0, 0.0, 11.0, 21.0, 31.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json new file mode 100644 index 00000000000..5f837f8085e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": -1, + "offsetX": 2, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0 ], + "strideA1": -14, + "strideA2": -2, + "offsetA": 33, + "A_out": [ 999.0, 3.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json new file mode 100644 index 00000000000..c012cf3c408 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 5.0, 0.0, 0.0, 9.0, 18.0, 0.0, 13.0, 26.0, 39.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json new file mode 100644 index 00000000000..719ee5a0d02 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 1.0, 0.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0, 999.0, 999.0, 999.0 ], + "strideA1": 3, + "strideA2": 1, + "offsetA": 3, + "A_out": [ 999.0, 999.0, 999.0, 5.0, 0.0, 0.0, 9.0, 18.0, 0.0, 13.0, 26.0, 39.0, 999.0, 999.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json new file mode 100644 index 00000000000..fca54b56fe4 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0 ], + "strideA1": 14, + "strideA2": 2, + "offsetA": 1, + "A_out": [ 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 19.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json new file mode 100644 index 00000000000..b61992d216b --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0 ], + "strideA1": 14, + "strideA2": -2, + "offsetA": 5, + "A_out": [ 999.0, 9.0, 999.0, 6.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 14.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 0.0, 999.0, 0.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json new file mode 100644 index 00000000000..d57c31d8449 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0 ], + "strideA1": -14, + "strideA2": 2, + "offsetA": 29, + "A_out": [ 999.0, 0.0, 999.0, 0.0, 999.0, 19.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json new file mode 100644 index 00000000000..7233e480e28 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0 ], + "strideA1": -14, + "strideA2": -2, + "offsetA": 33, + "A_out": [ 999.0, 19.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 14.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 6.0, 999.0, 3.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json new file mode 100644 index 00000000000..b499e7cb6e5 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json new file mode 100644 index 00000000000..95d3b0a50dd --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 31.0, 21.0, 11.0, 0.0, 13.0, 7.0, 0.0, 0.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json new file mode 100644 index 00000000000..68d29ef3823 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 11.0, 15.0, 19.0, 0.0, 13.0, 13.0, 0.0, 0.0, 7.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json new file mode 100644 index 00000000000..b1bf41bbbff --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 7.0, 13.0, 19.0, 0.0, 13.0, 15.0, 0.0, 0.0, 11.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json new file mode 100644 index 00000000000..f9a3880cb2e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 3.0, 7.0, 11.0, 0.0, 13.0, 21.0, 0.0, 0.0, 31.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js new file mode 100644 index 00000000000..334ed8b828f --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js @@ -0,0 +1,82 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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 ssyr2 = 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 ssyr2, '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 ssyr2.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 ssyr2 = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( ssyr2, 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 ssyr2; + var main; + + main = require( './../lib/ssyr2.js' ); + + ssyr2 = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( ssyr2, main, 'returns expected value' ); + t.end(); + + function tryRequire() { + return new Error( 'Cannot find module' ); + } +}); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js new file mode 100644 index 00000000000..8bb9e87e537 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js @@ -0,0 +1,823 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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. +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float32Array = require( '@stdlib/array/float32' ); +var EPS = require( '@stdlib/constants/float32/eps' ); +var abs = require( '@stdlib/math/base/special/abs' ); +var ssyr2 = require( './../lib/ndarray.js' ); + + +// FIXTURES // + +var ru = require( './fixtures/row_major_u.json' ); +var rl = require( './fixtures/row_major_l.json' ); +var rxpyp = require( './fixtures/row_major_xpyp.json' ); +var rxnyp = require( './fixtures/row_major_xnyp.json' ); +var rxpyn = require( './fixtures/row_major_xpyn.json' ); +var rxnyn = require( './fixtures/row_major_xnyn.json' ); +var roa = require( './fixtures/row_major_oa.json' ); +var rsa1sa2 = require( './fixtures/row_major_sa1_sa2.json' ); +var rsa1nsa2 = require( './fixtures/row_major_sa1n_sa2.json' ); +var rsa1sa2n = require( './fixtures/row_major_sa1_sa2n.json' ); +var rsa1nsa2n = require( './fixtures/row_major_sa1n_sa2n.json' ); +var rcap = require( './fixtures/row_major_complex_access_pattern.json' ); + +var cu = require( './fixtures/column_major_u.json' ); +var cl = require( './fixtures/column_major_l.json' ); +var cxpyp = require( './fixtures/column_major_xpyp.json' ); +var cxnyp = require( './fixtures/column_major_xnyp.json' ); +var cxpyn = require( './fixtures/column_major_xpyn.json' ); +var cxnyn = require( './fixtures/column_major_xnyn.json' ); +var coa = require( './fixtures/column_major_oa.json' ); +var csa1sa2 = require( './fixtures/column_major_sa1_sa2.json' ); +var csa1nsa2 = require( './fixtures/column_major_sa1n_sa2.json' ); +var csa1sa2n = require( './fixtures/column_major_sa1_sa2n.json' ); +var csa1nsa2n = require( './fixtures/column_major_sa1n_sa2n.json' ); +var ccap = require( './fixtures/column_major_complex_access_pattern.json' ); + + +// FUNCTIONS // + +/** +* Tests for element-wise approximate equality. +* +* @private +* @param {Object} t - test object +* @param {Collection} actual - actual values +* @param {Collection} expected - expected values +* @param {number} rtol - relative tolerance +*/ +function isApprox( t, actual, expected, rtol ) { + var delta; + var tol; + 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+'.' ); + } + } +} + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof ssyr2, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 13', function test( t ) { + t.strictEqual( ssyr2.length, 13, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid first argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + 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() { + ssyr2( value, data.N, data.alpha, new Float32Array( data.x ), data.strideX, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid second argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + -1, + -2, + -3 + ]; + + 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() { + ssyr2( data.uplo, value, data.alpha, new Float32Array( data.x ), data.strideX, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid fifth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + 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() { + ssyr2( data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid eighth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + 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() { + ssyr2( data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cu; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function returns a reference to the input matrix `A`', function test( t ) { + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.uplo, 0, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.uplo, data.N, 0.0, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.uplo, 0, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.uplo, data.N, 0.0, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function supports specifying the strides for the first and the second dimensions of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1sa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying the strides for the first and the second dimensions of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1sa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the first dimension of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1nsa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the first dimension of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1nsa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the second dimension of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1sa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the second dimension of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1sa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports negative strides for `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1nsa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports negative strides for `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1nsa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying an `A` offset (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = roa; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying an `A` offset (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = coa; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying `x` and `y` strides (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying `x` and `y` strides (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying negative strides for `x` and `y` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying negative strides for `x` and `y` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rcap; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ccap; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js new file mode 100644 index 00000000000..9c5bbe8e65d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js @@ -0,0 +1,589 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 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. +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float32Array = require( '@stdlib/array/float32' ); +var EPS = require( '@stdlib/constants/float32/eps' ); +var abs = require( '@stdlib/math/base/special/abs' ); +var ssyr2 = require( './../lib/ssyr2.js' ); + + +// FIXTURES // + +var ru = require( './fixtures/row_major_u.json' ); +var rl = require( './fixtures/row_major_l.json' ); +var rxpyp = require( './fixtures/row_major_xpyp.json' ); +var rxnyp = require( './fixtures/row_major_xnyp.json' ); +var rxpyn = require( './fixtures/row_major_xpyn.json' ); +var rxnyn = require( './fixtures/row_major_xnyn.json' ); + +var cu = require( './fixtures/column_major_u.json' ); +var cl = require( './fixtures/column_major_l.json' ); +var cxpyp = require( './fixtures/column_major_xpyp.json' ); +var cxnyp = require( './fixtures/column_major_xnyp.json' ); +var cxpyn = require( './fixtures/column_major_xpyn.json' ); +var cxnyn = require( './fixtures/column_major_xnyn.json' ); + + +// FUNCTIONS // + +/** +* Tests for element-wise approximate equality. +* +* @private +* @param {Object} t - test object +* @param {Collection} actual - actual values +* @param {Collection} expected - expected values +* @param {number} rtol - relative tolerance +*/ +function isApprox( t, actual, expected, rtol ) { + var delta; + var tol; + 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+'.' ); + } + } +} + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof ssyr2, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 10', function test( t ) { + t.strictEqual( ssyr2.length, 10, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid first argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + 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() { + ssyr2( value, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid second argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + 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() { + ssyr2( data.order, value, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid third argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + -1, + -2, + -3 + ]; + + 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() { + ssyr2( data.order, data.uplo, value, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid sixth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + 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() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid eighth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + 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() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), value, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid tenth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 2, + 1, + 0, + -1, + -2, + -3 + ]; + + 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() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), value ); + }; + } +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cu; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function returns a reference to the input matrix `A`', function test( t ) { + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.order, data.uplo, 0, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.order, data.uplo, data.N, 0.0, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.order, data.uplo, 0, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.order, data.uplo, data.N, 0.0, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function supports specifying strides (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying strides (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); From c832f7e4303d3c12421e10e06b6c1136ff12fca3 Mon Sep 17 00:00:00 2001 From: stdlib-bot <82920195+stdlib-bot@users.noreply.github.com> Date: Tue, 30 Jul 2024 03:10:28 -0700 Subject: [PATCH 03/25] docs: update namespace table of contents PR-URL: https://github.com/stdlib-js/stdlib/pull/2698 Co-authored-by: Athan Reines Reviewed-by: Athan Reines Signed-off-by: stdlib-bot <82920195+stdlib-bot@users.noreply.github.com> --- lib/node_modules/@stdlib/lapack/base/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/node_modules/@stdlib/lapack/base/README.md b/lib/node_modules/@stdlib/lapack/base/README.md index bb196bd19aa..79e59692499 100644 --- a/lib/node_modules/@stdlib/lapack/base/README.md +++ b/lib/node_modules/@stdlib/lapack/base/README.md @@ -46,6 +46,7 @@ The namespace contains the following:
- [`dlacpy( order, uplo, M, N, A, LDA, B, LDB )`][@stdlib/lapack/base/dlacpy]: copy all or part of a matrix `A` to another matrix `B`. +- [`dlassq( N, X, strideX, scale, sumsq )`][@stdlib/lapack/base/dlassq]: return an updated sum of squares represented in scaled form. - [`dlaswp( N, A, LDA, k1, k2, IPIV, incx )`][@stdlib/lapack/base/dlaswp]: perform a series of row interchanges on an input matrix. - [`dpttrf( N, D, E )`][@stdlib/lapack/base/dpttrf]: compute the `L * D * L^T` factorization of a real symmetric positive definite tridiagonal matrix `A`. @@ -92,6 +93,8 @@ console.log( objectKeys( lapack ) ); [@stdlib/lapack/base/dlacpy]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlacpy +[@stdlib/lapack/base/dlassq]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlassq + [@stdlib/lapack/base/dlaswp]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlaswp [@stdlib/lapack/base/dpttrf]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dpttrf From 0b89aa1ac2df073fcf9dd05960881f352d8920e5 Mon Sep 17 00:00:00 2001 From: stdlib-bot <82920195+stdlib-bot@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:57:49 -0700 Subject: [PATCH 04/25] feat: update namespace TypeScript declarations PR-URL: https://github.com/stdlib-js/stdlib/pull/2710 Co-authored-by: Athan Reines Reviewed-by: Athan Reines Signed-off-by: stdlib-bot <82920195+stdlib-bot@users.noreply.github.com> --- .../@stdlib/lapack/base/docs/types/index.d.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts b/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts index 4d5311c65a7..31df21c8eac 100644 --- a/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts @@ -21,6 +21,7 @@ /* eslint-disable max-lines */ import dlacpy = require( '@stdlib/lapack/base/dlacpy' ); +import dlassq = require( '@stdlib/lapack/base/dlassq' ); import dlaswp = require( '@stdlib/lapack/base/dlaswp' ); import dpttrf = require( '@stdlib/lapack/base/dpttrf' ); @@ -61,6 +62,35 @@ interface Namespace { */ dlacpy: typeof dlacpy; + /** + * Returns an updated sum of squares represented in scaled form. + * + * @param N - number of indexed elements + * @param X - input array + * @param strideX - stride length for `X` + * @param scale - scaling factor + * @param sumsq - basic sum of squares from which output is factored out + * @returns output array + * + * @example + * var Float64Array = require( '@stdlib/array/float64' ); + * + * var X = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + * + * var out = ns.dlassq( 4, X, 1, 1.0, 0.0, out ); + * // returns [ 1.0, 30.0 ] + * + * @example + * var Float64Array = require( '@stdlib/array/float64' ); + * + * var X = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + * var out = new Float64Array( [ 0.0, 0.0 ] ); + * + * ns.dlassq.ndarray( 4, X, 1, 0, 1.0, 0.0, out, 1, 0 ); + * // out => [ 1.0, 30.0 ] + */ + dlassq: typeof dlassq; + /** * Performs a series of row interchanges on a matrix `A` using pivot indices stored in `IPIV`. * From ca4c95c877aecca7160f64269df1fb614b9cb493 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 15:52:49 -0700 Subject: [PATCH 05/25] build: add workflow to prevent a PR being merged --- .github/workflows/do_not_merge.yml | 55 ++++++++++++++++++++++++++++++ .github/workflows/labeler.yml | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/do_not_merge.yml diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml new file mode 100644 index 00000000000..b2d727ae931 --- /dev/null +++ b/.github/workflows/do_not_merge.yml @@ -0,0 +1,55 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 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. +#/ + +# Workflow name: +name: do_not_merge + +# Workflow triggers: +on: + pull_request: + types: [ synchronize, opened, reopened, labeled, unlabeled ] + +# Workflow jobs: +jobs: + + # Define a job which fails a pull request if the pull request has a "Do Not Merge" label: + do_not_merge: + + # Define job name: + name: 'Check for label' + + # Only run this job if the pull request has a "Do Not Merge" label: + if: ${{ contains(github.event.*.labels.*.name, 'Do Not Merge') }} + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Fail the pull request: + - name: 'Prevent merge' + run: | + echo "Pull request is labeled as 'Do Not Merge'." + echo "This workflow fails so that the pull request cannot be merged." + exit 1 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 94e11706f07..4b4e5e3d41b 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -17,7 +17,7 @@ #/ # Workflow name: -name: 'labeler' +name: labeler # Workflow triggers: on: From 459317b414d16383c905f148439f729663242c05 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 16:01:00 -0700 Subject: [PATCH 06/25] build: update trigger --- .github/workflows/do_not_merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml index b2d727ae931..948c07ce633 100644 --- a/.github/workflows/do_not_merge.yml +++ b/.github/workflows/do_not_merge.yml @@ -21,7 +21,7 @@ name: do_not_merge # Workflow triggers: on: - pull_request: + pull_request_target: types: [ synchronize, opened, reopened, labeled, unlabeled ] # Workflow jobs: From c2543a46041debfbac38e77efd1184f8ec7f2b96 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 16:25:23 -0700 Subject: [PATCH 07/25] build: add autoclose workflow --- .github/workflows/autoclose.yml | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/autoclose.yml diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml new file mode 100644 index 00000000000..091714700ef --- /dev/null +++ b/.github/workflows/autoclose.yml @@ -0,0 +1,60 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 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. +#/ + +# Workflow name: +name: autclose + +# Workflow triggers: +on: + pull_request_target: + types: [ labeled ] + +# Workflow jobs: +jobs: + + # Define a job which closes a pull request if a contributor failed to setup EditorConfig: + editorconfig: + + # Define job name: + name: 'Check for label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: EditorConfig' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: > + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. From 98dc25a930530f72bd07c4f7b2e8d77d3cef1246 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 16:29:22 -0700 Subject: [PATCH 08/25] build: fix formatting --- .github/workflows/autoclose.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml index 091714700ef..a1fb4391a49 100644 --- a/.github/workflows/autoclose.yml +++ b/.github/workflows/autoclose.yml @@ -54,7 +54,9 @@ jobs: GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} NUMBER: ${{ github.event.pull_request.number }} - BODY: > - Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). + + Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. From 1fde962b77faff072bd6296e1fbde207ad02cbe6 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Tue, 30 Jul 2024 22:39:13 -0400 Subject: [PATCH 09/25] fix: use correct dependencies in manifest file --- .../@stdlib/blas/ext/base/sapxsum/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json index b47a3000a77..c4a950608ab 100644 --- a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json +++ b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json @@ -41,9 +41,9 @@ "@stdlib/blas/ext/base/sapxsumkbn", "@stdlib/napi/export", "@stdlib/napi/argv", - "@stdlib/napi/argv_int64", - "@stdlib/napi/argv_strided_float32array", - "@stdlib/napi/argv_float" + "@stdlib/napi/argv-int64", + "@stdlib/napi/argv-strided-float32array", + "@stdlib/napi/argv-float" ] }, { From 1fce730e287d8688956b801feb547ebb6a237756 Mon Sep 17 00:00:00 2001 From: Philipp Burckhardt Date: Tue, 30 Jul 2024 22:44:12 -0400 Subject: [PATCH 10/25] fix: use correct include path --- lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c index adc8eccf26c..70d6754c744 100644 --- a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c +++ b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c @@ -16,7 +16,7 @@ * limitations under the License. */ -#include "stdlib/blas/base/sapxsum.h" +#include "stdlib/blas/ext/base/sapxsum.h" #include "stdlib/napi/export.h" #include "stdlib/napi/argv.h" #include "stdlib/napi/argv_float.h" From dcbd949957ea6bcace460d8e6984a6509ac69467 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 20:49:13 -0700 Subject: [PATCH 11/25] build: add autoclose jobs --- .github/workflows/autoclose.yml | 116 +++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml index a1fb4391a49..a422097b013 100644 --- a/.github/workflows/autoclose.yml +++ b/.github/workflows/autoclose.yml @@ -31,7 +31,7 @@ jobs: editorconfig: # Define job name: - name: 'Check for label' + name: 'Check for EditorConfig label' # Only run this job if the pull request has a specific label: if: "${{ github.event.label.name == 'autoclose: EditorConfig' }}" @@ -60,3 +60,117 @@ jobs: Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a contributor failed to follow contributing guidelines: + contributor_guidelines: + + # Define job name: + name: 'Check for contributor guidelines label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Contributor Guidelines' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). + + Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should have setup your local development environment such that automated development processes for linting, license verification, and unit testing can run prior to authoring commits and pushing changes. We encourage you to refer to that guide **before** continuing to work on this pull request. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a contributor failed to follow project conventions: + project_conventions: + + # Define job name: + name: 'Check for project conventions label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Project Conventions' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow project conventions. + + We place a high value on consistency throughout the stdlib codebase, and this pull request was found to significantly deviate from stdlib conventions. We encourage you to closely examine other packages in stdlib and attempt to emulate the practices and conventions found therein. + + - If you are attempting to contribute a new package, sometimes the best approach is to simply copy the contents of an existing package and then modify the minimum amount necessary to implement the feature (e.g., changing descriptions, parameter names, and implementation). + - If you are contributing tests, find a package implementing a similar feature and emulate the tests of that package. + - If you are updating documentation, examine several similar packages and emulate the tests, style, and prose of those packages. + + In short, the more effort you put in to ensure that your contribution looks and feels like stdlib--including variables names, bracket spacing, line breaks, etc--the more likely that your contribution will be reviewed and ultimately accepted. We encourage you to study the codebase **before** continuing to work on this pull request. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a pull request is considered spam: + spam: + + # Define job name: + name: 'Check for spam label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Spam' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not meet the standards of this project. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Lock pull request conversation: + - name: 'Lock conversation' + run: gh pr lock "$NUMBER" --reason spam + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} From 996540f38551bcdc0f8075f6ec00d58a619ffa82 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 20:54:59 -0700 Subject: [PATCH 12/25] build: update copy --- .github/workflows/autoclose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml index a422097b013..594b28f575e 100644 --- a/.github/workflows/autoclose.yml +++ b/.github/workflows/autoclose.yml @@ -129,9 +129,9 @@ jobs: - If you are attempting to contribute a new package, sometimes the best approach is to simply copy the contents of an existing package and then modify the minimum amount necessary to implement the feature (e.g., changing descriptions, parameter names, and implementation). - If you are contributing tests, find a package implementing a similar feature and emulate the tests of that package. - - If you are updating documentation, examine several similar packages and emulate the tests, style, and prose of those packages. + - If you are updating documentation, examine several similar packages and emulate the content, style, and prose of those packages. - In short, the more effort you put in to ensure that your contribution looks and feels like stdlib--including variables names, bracket spacing, line breaks, etc--the more likely that your contribution will be reviewed and ultimately accepted. We encourage you to study the codebase **before** continuing to work on this pull request. + In short, the more effort you put in to ensure that your contribution looks and feels like stdlib—including variables names, bracket spacing, line breaks, etc—the more likely that your contribution will be reviewed and ultimately accepted. We encourage you to closely study the codebase **before** continuing to work on this pull request. Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. From 5af1578cc3e81996cbb08a37893d9511e4c77e02 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Tue, 30 Jul 2024 21:02:43 -0700 Subject: [PATCH 13/25] build: update job name --- .github/workflows/do_not_merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml index 948c07ce633..7b4bbd6e5c3 100644 --- a/.github/workflows/do_not_merge.yml +++ b/.github/workflows/do_not_merge.yml @@ -31,7 +31,7 @@ jobs: do_not_merge: # Define job name: - name: 'Check for label' + name: 'Check for Do Not Merge label' # Only run this job if the pull request has a "Do Not Merge" label: if: ${{ contains(github.event.*.labels.*.name, 'Do Not Merge') }} From 44f7338da5f2136fcecb15e597e33c407cef46a5 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:14:39 -0700 Subject: [PATCH 14/25] build: update format --- .github/workflows/autoclose.yml | 3 ++- .github/workflows/do_not_merge.yml | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml index 594b28f575e..5adc857df57 100644 --- a/.github/workflows/autoclose.yml +++ b/.github/workflows/autoclose.yml @@ -22,7 +22,8 @@ name: autclose # Workflow triggers: on: pull_request_target: - types: [ labeled ] + types: + - labeled # Workflow jobs: jobs: diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml index 7b4bbd6e5c3..3fa8746c790 100644 --- a/.github/workflows/do_not_merge.yml +++ b/.github/workflows/do_not_merge.yml @@ -22,7 +22,12 @@ name: do_not_merge # Workflow triggers: on: pull_request_target: - types: [ synchronize, opened, reopened, labeled, unlabeled ] + types: + - synchronize + - opened + - reopened + - labeled + - unlabeled # Workflow jobs: jobs: From 73ca2b0e60df458764f52f0ee70487cd4003a2f7 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:16:31 -0700 Subject: [PATCH 15/25] build: add LAPACK to auto-labeler --- .github/labeler.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index 8b9a45c415a..1408cbda313 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -20,6 +20,10 @@ BLAS: - changed-files: - any-glob-to-all-files: '**/blas/**/*' +LAPACK: +- changed-files: + - any-glob-to-all-files: '**/lapack/**/*' + Math: - changed-files: - any-glob-to-all-files: '**/math/**/*' From ad0392934e4936a910a2a76e612140e63accd39b Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:21:26 -0700 Subject: [PATCH 16/25] build: update format --- .../workflows/check_contributing_guidelines_acceptance.yml | 4 +++- .github/workflows/check_licenses.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check_contributing_guidelines_acceptance.yml b/.github/workflows/check_contributing_guidelines_acceptance.yml index 53b3ad594bc..8ab5ec614e1 100755 --- a/.github/workflows/check_contributing_guidelines_acceptance.yml +++ b/.github/workflows/check_contributing_guidelines_acceptance.yml @@ -40,7 +40,9 @@ on: # Trigger on pull request events: pull_request_target: - types: [opened, reopened] + types: + - opened + - reopened # Global permissions: permissions: diff --git a/.github/workflows/check_licenses.yml b/.github/workflows/check_licenses.yml index 81fb2ccd78e..27b84d46300 100644 --- a/.github/workflows/check_licenses.yml +++ b/.github/workflows/check_licenses.yml @@ -20,7 +20,7 @@ name: check_licenses # Workflow triggers: -on: [pull_request] +on: [ pull_request ] # Global permissions: permissions: From 4c6b89f4be191fe7f01f0962a4e4df46b4d0b941 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:21:38 -0700 Subject: [PATCH 17/25] build: remove unused workflows --- .github/workflows/discussion_bot_response.yml | 55 ------------------- .../discussion_comment_bot_response.yml | 55 ------------------- 2 files changed, 110 deletions(-) delete mode 100644 .github/workflows/discussion_bot_response.yml delete mode 100644 .github/workflows/discussion_comment_bot_response.yml diff --git a/.github/workflows/discussion_bot_response.yml b/.github/workflows/discussion_bot_response.yml deleted file mode 100644 index 99ca489c71b..00000000000 --- a/.github/workflows/discussion_bot_response.yml +++ /dev/null @@ -1,55 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2023 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. -#/ - -# Workflow name: -name: discussion_bot_response - -# Workflow triggers: -on: - discussion: - types: [created] - -# Global permissions: -permissions: - # Allow read-only access to the repository contents: - contents: read - -# Workflow jobs: -jobs: - respond: - # FIXME: disabled until determination whether enabling this bot is desirable/helpful - if: false - - # Define a display name: - name: 'Respond to question' - - # Define the conditions under which the job should run: FIXME: un-comment if and when re-enabled - # if: github.event.discussion.category.name == 'stdlib-bot Q&A' - - # Define the type of virtual host machine: - runs-on: ubuntu-latest - - # Define the sequence of job steps: - steps: - # Run the chatbot action: - - name: 'Run chatbot action' - # Pin action to full length commit SHA - uses: stdlib-js/stdlib-chat-bot@aaa9ebbeb4f4ec750bba5df5c152725bb84ee825 # v0.0.2 - with: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GITHUB_TOKEN: ${{ secrets.CHATBOT_GITHUB_TOKEN }} diff --git a/.github/workflows/discussion_comment_bot_response.yml b/.github/workflows/discussion_comment_bot_response.yml deleted file mode 100644 index d554b961f49..00000000000 --- a/.github/workflows/discussion_comment_bot_response.yml +++ /dev/null @@ -1,55 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2023 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. -#/ - -# Workflow name: -name: discussion_comment_bot_response - -# Workflow triggers: -on: - discussion_comment: - types: [created] - -# Global permissions: -permissions: - # Allow read-only access to the repository contents: - contents: read - -# Workflow jobs: -jobs: - respond: - # FIXME: disabled until determination whether enabling this bot is desirable/helpful - if: false - - # Define a display name: - name: 'Respond to question' - - # Define the conditions under which the job should run: FIXME: un-comment if and when re-enabled - # if: github.event.comment.body && startsWith( github.event.comment.body, '/ask ' ) - - # Define the type of virtual host machine: - runs-on: ubuntu-latest - - # Define the sequence of job steps: - steps: - # Run the chatbot action: - - name: 'Run chatbot action' - # Pin action to full length commit SHA - uses: stdlib-js/stdlib-chat-bot@aaa9ebbeb4f4ec750bba5df5c152725bb84ee825 # v0.0.2 - with: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GITHUB_TOKEN: ${{ secrets.CHATBOT_GITHUB_TOKEN }} From 7b6d5cd9036e6b4d04f85f82a8afa5da1d51f8f1 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:28:34 -0700 Subject: [PATCH 18/25] build: update message copy --- .github/workflows/autoclose.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml index 5adc857df57..fe76d616251 100644 --- a/.github/workflows/autoclose.yml +++ b/.github/workflows/autoclose.yml @@ -60,6 +60,8 @@ jobs: Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. + If you would prefer to avoid manual setup, you could also consider using a pre-configured [development container](https://github.com/stdlib-js/stdlib/tree/develop/.devcontainer) for use locally or in GitHub Codespaces. + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. # Define a job which closes a pull request if a contributor failed to follow contributing guidelines: @@ -94,6 +96,8 @@ jobs: Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should have setup your local development environment such that automated development processes for linting, license verification, and unit testing can run prior to authoring commits and pushing changes. We encourage you to refer to that guide **before** continuing to work on this pull request. + If you would prefer to avoid manual setup, you could also consider using a pre-configured [development container](https://github.com/stdlib-js/stdlib/tree/develop/.devcontainer) for use locally or in GitHub Codespaces. + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. # Define a job which closes a pull request if a contributor failed to follow project conventions: From 8dd1bc2668a7985fb7deb1433e749b0b804ec770 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:42:57 -0700 Subject: [PATCH 19/25] build: add workflow to lint PR titles --- .github/workflows/check_required_files.yml | 1 + .github/workflows/do_not_merge.yml | 2 +- .github/workflows/lint_pr_title.yml | 91 ++++++++++++++++++++++ .github/workflows/slash_commands.yml | 4 +- 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/lint_pr_title.yml diff --git a/.github/workflows/check_required_files.yml b/.github/workflows/check_required_files.yml index 5e4d2f4d6f6..bd04a98adb6 100644 --- a/.github/workflows/check_required_files.yml +++ b/.github/workflows/check_required_files.yml @@ -32,6 +32,7 @@ on: user: required: true type: string + # Define the secrets accessible by the workflow: secrets: STDLIB_BOT_GITHUB_TOKEN: diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml index 3fa8746c790..4f8154e8115 100644 --- a/.github/workflows/do_not_merge.yml +++ b/.github/workflows/do_not_merge.yml @@ -21,7 +21,7 @@ name: do_not_merge # Workflow triggers: on: - pull_request_target: + pull_request: types: - synchronize - opened diff --git a/.github/workflows/lint_pr_title.yml b/.github/workflows/lint_pr_title.yml new file mode 100644 index 00000000000..fe6b0bb65b7 --- /dev/null +++ b/.github/workflows/lint_pr_title.yml @@ -0,0 +1,91 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 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. +#/ + +# Workflow name: +name: lint_pr_title + +# Workflow triggers: +on: + pull_request: + types: + - synchronize + - opened + - reopened + +# Global permissions: +permissions: + # Allow read-only access to the repository contents: + contents: read + +# Workflow jobs: +jobs: + + # Define a job for linting PR titles... + lint_pr_title: + + # Define a display name: + name: 'Lint PR title' + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Set defaults: + defaults: + run: + # Set the default shell to `bash`: + shell: bash --noprofile --norc -eo pipefail {0} + + # Define the sequence of job steps... + steps: + + # Checkout the repository: + - name: 'Checkout repository' + # Pin action to full length commit SHA + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + # Specify whether to remove untracked files before checking out the repository: + clean: false + + # Limit clone depth to the most recent 100 commits: + fetch-depth: 100 + + # Specify whether to download Git-LFS files: + lfs: false + timeout-minutes: 10 + + # Install Node.js: + - name: 'Install Node.js' + # Pin action to full length commit SHA + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + with: + node-version: '20' # 'lts/*' + timeout-minutes: 5 + + # Perform install sequence (accounting for possible network failures, etc, when installing node module dependencies): + - name: 'Perform install sequence' + run: | + make install-node-modules || make install-node-modules || make install-node-modules + timeout-minutes: 30 + + # Perform linting: + - name: 'Perform linting' + run: | + echo "Pull request titles should follow stdlib's Git commit message conventions." + echo "Linting pull request title..." + make lint-commit-message GIT_COMMIT_MESSAGE="${{ github.event.pull_request.title }}" + timeout-minutes: 5 diff --git a/.github/workflows/slash_commands.yml b/.github/workflows/slash_commands.yml index c7724977892..8dc6c330990 100644 --- a/.github/workflows/slash_commands.yml +++ b/.github/workflows/slash_commands.yml @@ -22,7 +22,9 @@ name: slash_commands # Workflow triggers: on: issue_comment: - types: [created, edited] + types: + - created + - edited # Workflow jobs: jobs: From 170b5d68d9ff35e4ac07cf40ee622b8d4b53f9a3 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 02:44:42 -0700 Subject: [PATCH 20/25] docs: update example --- tools/make/lib/lint/git/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make/lib/lint/git/Makefile b/tools/make/lib/lint/git/Makefile index d7e3d069ade..78bc1b9fc17 100644 --- a/tools/make/lib/lint/git/Makefile +++ b/tools/make/lib/lint/git/Makefile @@ -43,7 +43,7 @@ endif # @param {string} GIT_COMMIT_MESSAGE - Git commit message text # # @example -# make lint-commit-message +# make lint-commit-message GIT_COMMIT_MESSAGE="feat: add `foo/bar`" #/ lint-commit-message: ifeq ($(GIT_COMMIT_LINTER), commitlint) From b5de10702d2b6ecc6c843d61f755b429bfe3c78d Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 03:10:46 -0700 Subject: [PATCH 21/25] fix: add missing parameters and update description --- lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts | 2 +- lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts index 78911e139f0..e83667158e2 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts @@ -81,7 +81,7 @@ interface Routine { * ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); * // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] */ - ndarray( uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, offsetX: number, A: Float32Array, strideA1: number, strideA2: number, offsetA: number ): Float32Array; + ndarray( uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, offsetX: number, y: Float32Array, strideY: number, offsetY: number, A: Float32Array, strideA1: number, strideA2: number, offsetA: number ): Float32Array; } /** diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js index bd593f06a18..baba2433b76 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js @@ -33,7 +33,7 @@ var base = require( './base.js' ); * @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced * @param {NonNegativeInteger} N - number of elements along each dimension of `A` * @param {number} alpha - scalar -* @param {Float32Array} x - input vector +* @param {Float32Array} x - first input vector * @param {integer} strideX - `x` stride length * @param {NonNegativeInteger} offsetX - starting index for `x` * @param {Float32Array} y - second input vector From 4bae57045526e4f1d1f1f5d516a31ef96e92059f Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 03:13:52 -0700 Subject: [PATCH 22/25] build: prevent interpolation --- .github/workflows/lint_pr_title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint_pr_title.yml b/.github/workflows/lint_pr_title.yml index fe6b0bb65b7..14762164c4b 100644 --- a/.github/workflows/lint_pr_title.yml +++ b/.github/workflows/lint_pr_title.yml @@ -87,5 +87,5 @@ jobs: run: | echo "Pull request titles should follow stdlib's Git commit message conventions." echo "Linting pull request title..." - make lint-commit-message GIT_COMMIT_MESSAGE="${{ github.event.pull_request.title }}" + make lint-commit-message GIT_COMMIT_MESSAGE='${{ github.event.pull_request.title }}' timeout-minutes: 5 From f5a50ce09ce1cbe4a8a6871d977a7ea177e892a1 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 13:41:34 -0700 Subject: [PATCH 23/25] build: fix handling of special bash characters --- .github/workflows/lint_pr_title.yml | 2 +- tools/make/lib/lint/git/Makefile | 4 ++-- tools/make/lib/lint/git/commitlint.mk | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint_pr_title.yml b/.github/workflows/lint_pr_title.yml index 14762164c4b..8304d42ae78 100644 --- a/.github/workflows/lint_pr_title.yml +++ b/.github/workflows/lint_pr_title.yml @@ -87,5 +87,5 @@ jobs: run: | echo "Pull request titles should follow stdlib's Git commit message conventions." echo "Linting pull request title..." - make lint-commit-message GIT_COMMIT_MESSAGE='${{ github.event.pull_request.title }}' + make lint-commit-message GIT_COMMIT_MESSAGE="'${{ github.event.pull_request.title }}'" timeout-minutes: 5 diff --git a/tools/make/lib/lint/git/Makefile b/tools/make/lib/lint/git/Makefile index 78bc1b9fc17..e6880432b0e 100644 --- a/tools/make/lib/lint/git/Makefile +++ b/tools/make/lib/lint/git/Makefile @@ -43,11 +43,11 @@ endif # @param {string} GIT_COMMIT_MESSAGE - Git commit message text # # @example -# make lint-commit-message GIT_COMMIT_MESSAGE="feat: add `foo/bar`" +# make lint-commit-message GIT_COMMIT_MESSAGE='feat: add `foo/bar`' #/ lint-commit-message: ifeq ($(GIT_COMMIT_LINTER), commitlint) - $(QUIET) NODE_ENV="$(NODE_ENV)" NODE_PATH="$(NODE_PATH)" GIT_COMMIT_MESSAGE="$(GIT_COMMIT_MESSAGE)" $(MAKE) -f $(this_file) commitlint-message + $(QUIET) NODE_ENV="$(NODE_ENV)" NODE_PATH="$(NODE_PATH)" GIT_COMMIT_MESSAGE='$(GIT_COMMIT_MESSAGE)' $(MAKE) -f $(this_file) commitlint-message endif .PHONY: lint-commit-message diff --git a/tools/make/lib/lint/git/commitlint.mk b/tools/make/lib/lint/git/commitlint.mk index 5ab2f11f57f..18fa769c46d 100644 --- a/tools/make/lib/lint/git/commitlint.mk +++ b/tools/make/lib/lint/git/commitlint.mk @@ -92,10 +92,10 @@ commitlint: $(NODE_MODULES) commitlint-init # @private # # @example -# make commitlint-message +# make commitlint-message GIT_COMMIT_MESSAGE='feat: add `foo/bar`' #/ commitlint-message: $(NODE_MODULES) commitlint-init - $(QUIET) ( printf "$(GIT_COMMIT_MESSAGE)" | "$(COMMITLINT)" $(COMMITLINT_FLAGS) ) || ( $(MAKE) -f $(this_file) commitlint-cleanup && exit 1 ) + $(QUIET) ( printf '$(GIT_COMMIT_MESSAGE)' | "$(COMMITLINT)" $(COMMITLINT_FLAGS) ) || ( $(MAKE) -f $(this_file) commitlint-cleanup && exit 1 ) $(QUIET) $(MAKE) -f $(this_file) commitlint-cleanup .PHONY: commitlint-message From 6ab8f8022a3a8c7abd5e3cd993ebc9fd61241aac Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 13:48:32 -0700 Subject: [PATCH 24/25] build: fix quoting --- .github/workflows/lint_pr_title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint_pr_title.yml b/.github/workflows/lint_pr_title.yml index 8304d42ae78..14762164c4b 100644 --- a/.github/workflows/lint_pr_title.yml +++ b/.github/workflows/lint_pr_title.yml @@ -87,5 +87,5 @@ jobs: run: | echo "Pull request titles should follow stdlib's Git commit message conventions." echo "Linting pull request title..." - make lint-commit-message GIT_COMMIT_MESSAGE="'${{ github.event.pull_request.title }}'" + make lint-commit-message GIT_COMMIT_MESSAGE='${{ github.event.pull_request.title }}' timeout-minutes: 5 From e71264067123dab80b4f387574583d3c176523d9 Mon Sep 17 00:00:00 2001 From: Athan Reines Date: Wed, 31 Jul 2024 14:21:38 -0700 Subject: [PATCH 25/25] docs: fix offset types --- .../@stdlib/lapack/base/dlacpy/lib/base.js | 16 ++++++++-------- .../@stdlib/lapack/base/dlacpy/lib/ndarray.js | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js index 183fb4f6802..6eda3d563cc 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js +++ b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js @@ -38,11 +38,11 @@ var min = require( '@stdlib/math/base/special/fast/min' ); * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -173,11 +173,11 @@ function copyAll( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, o * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -289,11 +289,11 @@ function copyUpper( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -409,11 +409,11 @@ function copyLower( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example diff --git a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js index a4aee3e1018..66b722fcd1d 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js +++ b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js @@ -34,11 +34,11 @@ var base = require( './base.js' ); * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example