diff --git a/lib/node_modules/@stdlib/blas/base/ssyr/README.md b/lib/node_modules/@stdlib/blas/base/ssyr/README.md index 46f70bb33083..961d2c5581f6 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr/README.md +++ b/lib/node_modules/@stdlib/blas/base/ssyr/README.md @@ -47,7 +47,7 @@ ssyr( 'row-major', 'upper', 3, 1.0, x, 1, A, 3 ); 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. +- **uplo**: specifies whether the upper or lower triangular part of the symmetric matrix `A` is supplied. - **N**: number of elements along each dimension of `A`. - **α**: scalar constant. - **x**: input [`Float32Array`][mdn-float32array]. @@ -196,13 +196,13 @@ Performs the symmetric rank 1 operation `A = α*x*x^T + A`. float A[] = { 1.0f, 0.0f, 0.0f, 2.0f, 1.0f, 0.0f, 3.0f, 2.0f, 1.0f }; const float x[] = { 1.0f, 2.0f, 3.0f }; -c_ssyr( CblasColMajor, CblasUpper, 3, 1.0f, x, 1, A, 3 ); +c_ssyr( CblasRowMajor, CblasUpper, 3, 1.0f, x, 1, A, 3 ); ``` The function accepts the following arguments: - **order**: `[in] CBLAS_LAYOUT` storage layout. -- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced. +- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` is supplied. - **N**: `[in] CBLAS_INT` number of elements along each dimension of `A`. - **alpha**: `[in] float` scalar. - **X**: `[in] float*` input array. @@ -229,7 +229,7 @@ c_ssyr_ndarray( CblasUpper, 3, 1.0f, x, 1, 0, A, 3, 1, 0 ); The function accepts the following arguments: -- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced. +- **uplo**: `[in] CBLAS_UPLO` specifies whether the upper or lower triangular part of the symmetric matrix `A` is supplied. - **N**: `[in] CBLAS_INT` number of elements along each dimension of `A`. - **alpha**: `[in] float` scalar. - **X**: `[in] float*` input array. @@ -276,7 +276,7 @@ int main( void ) { const int N = 3; // Perform the symmetric rank 1 operation `A = α*x*x^T + A`: - c_ssyr( CblasColMajor, CblasUpper, N, 1.0f, x, 1, A, N ); + c_ssyr( CblasRowMajor, CblasUpper, N, 1.0f, x, 1, A, N ); // Print the result: for ( int i = 0; i < N*N; i++ ) { diff --git a/lib/node_modules/@stdlib/blas/base/ssyr/manifest.json b/lib/node_modules/@stdlib/blas/base/ssyr/manifest.json index 82ff44ce9dc7..8047a60ac851 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr/manifest.json +++ b/lib/node_modules/@stdlib/blas/base/ssyr/manifest.json @@ -30,7 +30,76 @@ "confs": [ { "task": "build", - "os": "win", + "os": "linux", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major", + "@stdlib/napi/export", + "@stdlib/napi/argv", + "@stdlib/napi/argv-int64", + "@stdlib/napi/argv-int32", + "@stdlib/napi/argv-float", + "@stdlib/napi/argv-strided-float32array", + "@stdlib/napi/argv-strided-float32array2d" + ] + }, + { + "task": "benchmark", + "os": "linux", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major", + "@stdlib/blas/ext/base/sfill" + ] + }, + { + "task": "examples", + "os": "linux", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major" + ] + }, + + { + "task": "build", + "os": "linux", "blas": "openblas", "wasm": false, "src": [ @@ -46,18 +115,20 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", "@stdlib/napi/argv-int32", + "@stdlib/napi/argv-float", "@stdlib/napi/argv-strided-float32array", - "@stdlib/napi/argv-strided-float32array2d", - "@stdlib/napi/argv-float" + "@stdlib/napi/argv-strided-float32array2d" ] }, { "task": "benchmark", - "os": "win", + "os": "linux", "blas": "openblas", "wasm": false, "src": [ @@ -72,12 +143,15 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", + "@stdlib/blas/ext/base/sfill" ] }, { "task": "examples", - "os": "win", + "os": "linux", "blas": "openblas", "wasm": false, "src": [ @@ -92,7 +166,78 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index" + ] + }, + + { + "task": "build", + "os": "mac", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major", + "@stdlib/napi/export", + "@stdlib/napi/argv", + "@stdlib/napi/argv-int64", + "@stdlib/napi/argv-int32", + "@stdlib/napi/argv-float", + "@stdlib/napi/argv-strided-float32array", + "@stdlib/napi/argv-strided-float32array2d" + ] + }, + { + "task": "benchmark", + "os": "mac", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major", + "@stdlib/blas/ext/base/sfill" + ] + }, + { + "task": "examples", + "os": "mac", + "blas": "", + "wasm": false, + "src": [ + "./src/ssyr.c", + "./src/ssyr_ndarray.c" + ], + "include": [ + "./include" + ], + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major" ] }, @@ -113,13 +258,15 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", "@stdlib/napi/argv-int32", + "@stdlib/napi/argv-float", "@stdlib/napi/argv-strided-float32array", - "@stdlib/napi/argv-strided-float32array2d", - "@stdlib/napi/argv-float" + "@stdlib/napi/argv-strided-float32array2d" ] }, { @@ -138,7 +285,10 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", + "@stdlib/blas/ext/base/sfill" ] }, { @@ -157,7 +307,9 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index" ] }, @@ -179,13 +331,15 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", "@stdlib/napi/argv-int32", + "@stdlib/napi/argv-float", "@stdlib/napi/argv-strided-float32array", - "@stdlib/napi/argv-strided-float32array2d", - "@stdlib/napi/argv-float" + "@stdlib/napi/argv-strided-float32array2d" ] }, { @@ -205,7 +359,10 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index", + "@stdlib/blas/ext/base/sfill" ] }, { @@ -225,17 +382,20 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", + "@stdlib/ndarray/base/min-view-buffer-index" ] }, { "task": "build", - "os": "linux", + "os": "win", "blas": "", "wasm": false, "src": [ - "./src/ssyr.c" + "./src/ssyr.c", + "./src/ssyr_ndarray.c" ], "include": [ "./include" @@ -244,24 +404,25 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/ndarray/base/assert/is-row-major", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", "@stdlib/napi/argv-int32", - "@stdlib/napi/argv-strided-float32array", - "@stdlib/napi/argv-strided-float32array2d", "@stdlib/napi/argv-float", - "@stdlib/strided/base/stride2offset", - "@stdlib/ndarray/base/assert/is-row-major" + "@stdlib/napi/argv-strided-float32array", + "@stdlib/napi/argv-strided-float32array2d" ] }, { "task": "benchmark", - "os": "linux", + "os": "win", "blas": "", "wasm": false, "src": [ - "./src/ssyr.c" + "./src/ssyr.c", + "./src/ssyr_ndarray.c" ], "include": [ "./include" @@ -270,19 +431,19 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", - "@stdlib/blas/ext/base/sfill", - "@stdlib/math/base/special/floorf", "@stdlib/strided/base/stride2offset", - "@stdlib/ndarray/base/assert/is-row-major" + "@stdlib/ndarray/base/assert/is-row-major", + "@stdlib/blas/ext/base/sfill" ] }, { "task": "examples", - "os": "linux", + "os": "win", "blas": "", "wasm": false, "src": [ - "./src/ssyr.c" + "./src/ssyr.c", + "./src/ssyr_ndarray.c" ], "include": [ "./include" @@ -302,7 +463,8 @@ "blas": "", "wasm": true, "src": [ - "./src/ssyr.c" + "./src/ssyr.c", + "./src/ssyr_ndarray.c" ], "include": [ "./include" diff --git a/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr.c b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr.c index 67a2bd63d1f2..9267177e6e19 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr.c +++ b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr.c @@ -19,7 +19,6 @@ #include "stdlib/blas/base/ssyr.h" #include "stdlib/blas/base/shared.h" #include "stdlib/strided/base/stride2offset.h" -#include "stdlib/ndarray/base/assert/is_row_major.h" /** * Performs the symmetric rank 1 operation `A = α*x*x^T + A`. @@ -48,84 +47,7 @@ void API_SUFFIX(c_ssyr)( const CBLAS_LAYOUT order, const CBLAS_UPLO uplo, const sa1 = LDA; sa2 = 1; } - ox = STDLIB_BLAS_BASE_STRIDE2OFFSET( N, strideX ); + ox = stdlib_strided_stride2offset( N, strideX ); API_SUFFIX(c_ssyr_ndarray)( uplo, N, alpha, X, strideX, ox, A, sa1, sa2, 0 ); return; } - -/** -* Performs the symmetric rank 1 operation `A = α*x*x^T + A` using alternative indexing semantics. -* -* @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 of `A` -* @param alpha scalar -* @param X input vector -* @param strideX `X` stride length -* @param offsetX starting index of `X` -* @param A input matrix -* @param strideA1 stride of the first dimension of `A` -* @param strideA2 stride of the second dimension of `A` -* @param offsetA starting index of `A` -*/ -void API_SUFFIX(c_ssyr_ndarray)( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, float *A, const CBLAS_INT strideA1, const CBLAS_INT strideA2, const CBLAS_INT offsetA ) { - CBLAS_INT isrm; - CBLAS_INT ix0; - CBLAS_INT ix1; - CBLAS_INT sa0; - CBLAS_INT sa1; - CBLAS_INT i0; - CBLAS_INT i1; - CBLAS_INT oa; - CBLAS_INT ox; - float tmp; - - int64_t strides[] = { strideA1, strideA2 }; - if ( N == 0 || alpha == 0.0f ) { - return; - } - isrm = stdlib_ndarray_is_row_major( 2, strides ); - if ( isrm ) { - // 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 { // isColMajor - // 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; - if ( - ( isrm && uplo == CblasLower ) || - ( !isrm && uplo == CblasUpper ) - ) { - ix1 = ox; - for ( i1 = 0; i1 < N; i1++ ) { - if ( X[ ix1 ] != 0.0f ) { - tmp = alpha * X[ ix1 ]; - oa = offsetA + (sa1*i1); - ix0 = ox; - for ( i0 = 0; i0 <= i1; i0++ ) { - A[ oa+(sa0*i0) ] += X[ ix0 ] * tmp; - ix0 += strideX; - } - } - ix1 += strideX; - } - return; - } - // ( isrm && uplo == 'CblasUpper' ) || ( !isrm && uplo === 'CblasLower' ) - ix1 = ox; - for ( i1 = 0; i1 < N; i1++ ) { - if ( X[ ix1 ] != 0.0f ) { - tmp = alpha * X[ ix1 ]; - oa = offsetA + (sa1*i1); - ix0 = ix1; - for ( i0 = i1; i0 < N; i0++ ) { - A[ oa+(sa0*i0) ] += X[ ix0 ] * tmp; - ix0 += strideX; - } - } - ix1 += strideX; - } - return; -} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_cblas.c b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_cblas.c index de11f791c556..313bb6575717 100644 --- a/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_cblas.c +++ b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_cblas.c @@ -19,6 +19,8 @@ #include "stdlib/blas/base/ssyr.h" #include "stdlib/blas/base/ssyr_cblas.h" #include "stdlib/blas/base/shared.h" +#include "stdlib/strided/base/min_view_buffer_index.h" +#include "stdlib/ndarray/base/min_view_buffer_index.h" /** * Performs the symmetric rank 1 operation `A = α*x*x^T + A`. @@ -34,4 +36,35 @@ */ void API_SUFFIX(c_ssyr)( const CBLAS_LAYOUT order, const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, float *A, const CBLAS_INT LDA ) { API_SUFFIX(cblas_ssyr)( order, uplo, N, alpha, X, strideX, A, LDA ); + CBLAS_INT sx = strideX; + if ( sx < 0 ) { + sx = -sx; + } + API_SUFFIX(cblas_ssyr)( order, uplo, N, alpha, X, sx, A, LDA ); +} + +/** +* Performs the symmetric rank 1 operation `A = α*x*x^T + A` using alternative indexing semantics. +* +* @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 of `A` +* @param alpha scalar +* @param X input vector +* @param strideX `X` stride length +* @param offsetX starting index of `X` +* @param A input matrix +* @param strideA1 stride of the first dimension of `A` +* @param strideA2 stride of the second dimension of `A` +* @param offsetA starting index of `A` +*/ +void API_SUFFIX(c_ssyr_ndarray)( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, float *A, const CBLAS_INT strideA1, const CBLAS_INT strideA2, const CBLAS_INT offsetA ) { + CBLAS_INT sx = strideX; + X += stdlib_strided_min_view_buffer_index( N, strideX, offsetX ); // adjust array pointer + const int64_t shape[] = { N, N }; + const int64_t strides[] = { strideA1, strideA2 }; + A += stdlib_ndarray_min_view_buffer_index( 2, shape, strides, offsetA ); // adjust array pointer + if ( sx < 0 ) { + sx = -sx; + } + API_SUFFIX(cblas_ssyr)( order, uplo, N, alpha, X, sx, A, LDA ); } diff --git a/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_ndarray.c b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_ndarray.c new file mode 100644 index 000000000000..b664ce187d26 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr/src/ssyr_ndarray.c @@ -0,0 +1,98 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2025 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "stdlib/blas/base/ssyr.h" +#include "stdlib/blas/base/shared.h" +#include "stdlib/ndarray/base/assert/is_row_major.h" + +/** +* Performs the symmetric rank 1 operation `A = α*x*x^T + A` using alternative indexing semantics. +* +* @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 of `A` +* @param alpha scalar +* @param X input vector +* @param strideX `X` stride length +* @param offsetX starting index of `X` +* @param A input matrix +* @param strideA1 stride of the first dimension of `A` +* @param strideA2 stride of the second dimension of `A` +* @param offsetA starting index of `A` +*/ +void API_SUFFIX(c_ssyr_ndarray)( const CBLAS_UPLO uplo, const CBLAS_INT N, const float alpha, const float *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, float *A, const CBLAS_INT strideA1, const CBLAS_INT strideA2, const CBLAS_INT offsetA ) { + CBLAS_INT isrm; + CBLAS_INT ix0; + CBLAS_INT ix1; + CBLAS_INT sa0; + CBLAS_INT sa1; + CBLAS_INT i0; + CBLAS_INT i1; + CBLAS_INT oa; + CBLAS_INT ox; + float tmp; + + int64_t strides[] = { strideA1, strideA2 }; + if ( N == 0 || alpha == 0.0f ) { + return; + } + isrm = stdlib_ndarray_is_row_major( 2, strides ); + if ( isrm ) { + // 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 { // isColMajor + // 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; + if ( + ( isrm && uplo == CblasLower ) || + ( !isrm && uplo == CblasUpper ) + ) { + ix1 = ox; + for ( i1 = 0; i1 < N; i1++ ) { + if ( X[ ix1 ] != 0.0f ) { + tmp = alpha * X[ ix1 ]; + oa = offsetA + (sa1*i1); + ix0 = ox; + for ( i0 = 0; i0 <= i1; i0++ ) { + A[ oa+(sa0*i0) ] += X[ ix0 ] * tmp; + ix0 += strideX; + } + } + ix1 += strideX; + } + return; + } + // ( isrm && uplo == 'CblasUpper' ) || ( !isrm && uplo === 'CblasLower' ) + ix1 = ox; + for ( i1 = 0; i1 < N; i1++ ) { + if ( X[ ix1 ] != 0.0f ) { + tmp = alpha * X[ ix1 ]; + oa = offsetA + (sa1*i1); + ix0 = ix1; + for ( i0 = i1; i0 < N; i0++ ) { + A[ oa+(sa0*i0) ] += X[ ix0 ] * tmp; + ix0 += strideX; + } + } + ix1 += strideX; + } + return; +}