diff --git a/lib/node_modules/@stdlib/blas/base/dsymv/lib/base.js b/lib/node_modules/@stdlib/blas/base/dsymv/lib/base.js new file mode 100644 index 000000000000..09b22d115bd2 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/dsymv/lib/base.js @@ -0,0 +1,142 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2025 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var dfill = require( '@stdlib/blas/ext/base/dfill' ).ndarray; +var dscal = require( '@stdlib/blas/base/dscal' ).ndarray; + + +// MAIN // + +/** +* Performs the matrix-vector operation `y = alpha*A*x + beta*y` where `alpha` and `beta` are scalars, `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 constant +* @param {Float64Array} A - matrix +* @param {PositiveInteger} LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) +* @param {Float64Array} x - first input array +* @param {integer} strideX - `x` stride length +* @param {NonNegativeInteger} offsetX - starting `x` index +* @param {number} beta - scalar constant +* @param {Float64Array} y - second input array +* @param {integer} strideY - `y` stride length +* @param {NonNegativeInteger} offsetY - starting `y` index +* @returns {Float64Array} `y` +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* +* var A = new Float64Array( [ 1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0 ] ); +* var x = new Float64Array( [ 1.0, 1.0, 1.0 ] ); +* var y = new Float64Array( [ 0.0, 0.0, 0.0 ] ); +* +* dsymv( 'row-major', 'lower', 3, 1.0, A, 3, x, 1, 0, 0.0, y, 1, 0 ); +* // y => [ 1.0, 2.0, 3.0 ] +*/ +function dsymv( order, uplo, N, alpha, A, LDA, x, strideX, offsetX, beta, y, strideY, offsetY ) { // eslint-disable-line max-params, max-len + var temp1; + var temp2; + var jmin; + var jmax; + var ix; + var iy; + var jx; + var jy; + var ox; + var oy; + var i; + var j; + var k; + + // Form: y = beta*y + if ( beta !== 1.0 ) { + if ( beta === 0.0 ) { + dfill( N, 0.0, y, strideY, offsetY ); + } else { + dscal( N, beta, y, strideY, offsetY ); + } + } + if ( alpha === 0.0 ) { + return y; + } + ox = offsetX; + oy = offsetY; + + // Form: y = alpha*A*x + y + if ( + ( order === 'row-major' && uplo === 'upper' ) || + ( order === 'column-major' && uplo === 'lower' ) + ) { + ix = ox; + iy = oy; + for ( i = 0; i < N; i++ ) { + temp1 = alpha * x[ ix ]; + temp2 = 0.0; + jmin = i + 1; + jmax = N; + jx = ox + ( jmin * strideX ); + jy = oy + ( jmin * strideY ); + y[ iy ] += temp1 * A[ ( LDA * i ) + i ]; + for ( j = jmin; j < jmax; j++ ) { + k = ( LDA * i ) + j; + y[ jy ] += temp1 * A[ k ]; + temp2 += x[ jx ] * A[ k ]; + jx += strideX; + jy += strideY; + } + y[ iy ] += alpha * temp2; + ix += strideX; + iy += strideY; + } + return y; + } + // ( order === 'row-major' && uplo === 'lower') || ( order === 'column-major' && uplo === 'upper' ) + ix = ox + ( ( N - 1 ) * strideX ); + iy = oy + ( ( N - 1 ) * strideY ); + for ( i = N - 1; i >= 0; i-- ) { + temp1 = alpha * x[ ix ]; + temp2 = 0.0; + jmin = 0; + jmax = i; + jx = ox + ( jmin * strideX ); + jy = oy + ( jmin * strideY ); + y[ iy ] += temp1 * A[ ( LDA * i ) + i ]; + for ( j = jmin; j < jmax; j++ ) { + k = ( LDA * i ) + j; + y[ jy ] += temp1 * A[ k ]; + temp2 += x[ jx ] * A[ k ]; + jx += strideX; + jy += strideY; + } + y[ iy ] += alpha * temp2; + ix -= strideX; + iy -= strideY; + } + return y; +} + + +// EXPORTS // + +module.exports = dsymv; diff --git a/lib/node_modules/@stdlib/blas/base/dsymv/lib/ndarray.js b/lib/node_modules/@stdlib/blas/base/dsymv/lib/ndarray.js index f44649171e3a..d5958c6241e5 100644 --- a/lib/node_modules/@stdlib/blas/base/dsymv/lib/ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/dsymv/lib/ndarray.js @@ -20,11 +20,10 @@ // MODULES // -var dfill = require( '@stdlib/blas/ext/base/dfill' ).ndarray; -var dscal = require( '@stdlib/blas/base/dscal' ).ndarray; var max = require( '@stdlib/math/base/special/max' ); var isLayout = require( '@stdlib/blas/base/assert/is-layout' ); var isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); +var base = require( './base.js' ); // MAIN // @@ -64,20 +63,6 @@ var isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); * // y => [ 1.0, 2.0, 3.0 ] */ function dsymv( order, uplo, N, alpha, A, LDA, x, strideX, offsetX, beta, y, strideY, offsetY ) { // eslint-disable-line max-params, max-len - var temp1; - var temp2; - var jmin; - var jmax; - var ix; - var iy; - var jx; - var jy; - var ox; - var oy; - var i; - var j; - var k; - if ( !isLayout( order ) ) { throw new TypeError( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ); } @@ -99,71 +84,7 @@ function dsymv( order, uplo, N, alpha, A, LDA, x, strideX, offsetX, beta, y, str if ( N === 0 || ( alpha === 0.0 && beta === 1.0 ) ) { return y; } - // Form: y = beta*y - if ( beta !== 1.0 ) { - if ( beta === 0.0 ) { - dfill( N, 0.0, y, strideY, offsetY ); - } else { - dscal( N, beta, y, strideY, offsetY ); - } - } - if ( alpha === 0.0 ) { - return y; - } - ox = offsetX; - oy = offsetY; - - // Form: y = alpha*A*x + y - if ( - ( order === 'row-major' && uplo === 'upper' ) || - ( order === 'column-major' && uplo === 'lower' ) - ) { - ix = ox; - iy = oy; - for ( i = 0; i < N; i++ ) { - temp1 = alpha * x[ ix ]; - temp2 = 0.0; - jmin = i + 1; - jmax = N; - jx = ox + ( jmin * strideX ); - jy = oy + ( jmin * strideY ); - y[ iy ] += temp1 * A[ ( LDA * i ) + i ]; - for ( j = jmin; j < jmax; j++ ) { - k = ( LDA * i ) + j; - y[ jy ] += temp1 * A[ k ]; - temp2 += x[ jx ] * A[ k ]; - jx += strideX; - jy += strideY; - } - y[ iy ] += alpha * temp2; - ix += strideX; - iy += strideY; - } - return y; - } - // ( order === 'row-major' && uplo === 'lower') || ( order === 'column-major' && uplo === 'upper' ) - ix = ox + ( ( N - 1 ) * strideX ); - iy = oy + ( ( N - 1 ) * strideY ); - for ( i = N - 1; i >= 0; i-- ) { - temp1 = alpha * x[ ix ]; - temp2 = 0.0; - jmin = 0; - jmax = i; - jx = ox + ( jmin * strideX ); - jy = oy + ( jmin * strideY ); - y[ iy ] += temp1 * A[ ( LDA * i ) + i ]; - for ( j = jmin; j < jmax; j++ ) { - k = ( LDA * i ) + j; - y[ jy ] += temp1 * A[ k ]; - temp2 += x[ jx ] * A[ k ]; - jx += strideX; - jy += strideY; - } - y[ iy ] += alpha * temp2; - ix -= strideX; - iy -= strideY; - } - return y; + return base( order, uplo, N, alpha, A, LDA, x, strideX, offsetX, beta, y, strideY, offsetY ); // eslint-disable-line max-len }