|
20 | 20 |
|
21 | 21 | // MODULES // |
22 | 22 |
|
23 | | -var minViewBufferIndex = require( '@stdlib/strided/base/min-view-buffer-index' ); |
24 | | -var offsetView = require( '@stdlib/strided/base/offset-view' ); |
25 | | -var resolve = require( '@stdlib/blas/base/layout-resolve-enum' ); |
26 | 23 | var format = require( '@stdlib/string/format' ); |
27 | | -var addon = require( './dger.native.js' ); |
| 24 | +var addon = require( './../src/addon.node' ); |
28 | 25 |
|
29 | 26 |
|
30 | 27 | // MAIN // |
31 | 28 |
|
32 | 29 | /** |
33 | | -* Performs the rank 1 operation `A = alpha*x*y^T + A`. |
| 30 | +* Performs the rank 1 operation `A = alpha*x*y^T + A`, where `α` is a scalar, `x` is an `M` element vector, `y` is an `N` element vector, and `A` is an `M` by `N` matrix. |
34 | 31 | * |
35 | | -* @param {*} order - storage layout |
36 | 32 | * @param {NonNegativeInteger} M - number of rows in the matrix `A` |
37 | 33 | * @param {NonNegativeInteger} N - number of columns in the matrix `A` |
38 | 34 | * @param {number} alpha - scalar constant |
39 | | -* @param {Float64Array} x - an `M` element vector |
| 35 | +* @param {Float64Array} x - first input vector |
40 | 36 | * @param {integer} strideX - `x` stride length |
41 | 37 | * @param {NonNegativeInteger} offsetX - starting `x` index |
42 | | -* @param {Float64Array} y - an `N` element vector |
| 38 | +* @param {Float64Array} y - second input vector |
43 | 39 | * @param {integer} strideY - `y` stride length |
44 | 40 | * @param {NonNegativeInteger} offsetY - starting `y` index |
45 | | -* @param {Float64Array} A - matrix of coefficients |
46 | | -* @param {PositiveInteger} LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) |
47 | | -* @throws {TypeError} first argument must be a supported BLAS memory layout |
| 41 | +* @param {Float64Array} A - input matrix |
| 42 | +* @param {integer} strideA1 - stride of the first dimension of `A` |
| 43 | +* @param {integer} strideA2 - stride of the second dimension of `A` |
| 44 | +* @param {NonNegativeInteger} offsetA - starting index for `A |
| 45 | +* @throws {RangeError} first argument must be a nonnegative integer |
| 46 | +* @throws {RangeError} second argument must be a nonnegative integer |
| 47 | +* @throws {RangeError} fifth argument must be non-zero |
| 48 | +* @throws {RangeError} eighth argument must be non-zero |
48 | 49 | * @returns {Float64Array} `A` |
49 | 50 | * |
50 | 51 | * @example |
51 | 52 | * var Float64Array = require( '@stdlib/array/float64' ); |
52 | 53 | * |
53 | | -* var M = 4; |
54 | | -* var N = 3; |
| 54 | +* var A = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); |
| 55 | +* var x = new Float64Array( [ 1.0, 1.0 ] ); |
| 56 | +* var y = new Float64Array( [ 1.0, 1.0, 1.0 ] ); |
55 | 57 | * |
56 | | -* var B = new Float64Array( M*N ); |
57 | | -* |
58 | | -* var x = new Float64Array( [ 0.0, 1.0, 2.0, 3.0 ] ); |
59 | | -* var y = new Float64Array( [ 1.0, 4.0, 0.0 ] ); |
60 | | -* |
61 | | -* dger( 'row-major', N, M, 1.0, y, 1, 0, x, 1, 0, B, M ); |
62 | | -* // B => <Float64Array>[ 0.0, 1.0, 2.0, 3.0, 0.0, 4.0, 8.0, 12.0, 0.0, 0.0, 0.0, 0.0 ] |
| 58 | +* dger( 2, 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); |
| 59 | +* // A => <Float64Array>[ 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 ] |
63 | 60 | */ |
64 | | -function dger( order, M, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, LDA ) { // eslint-disable-line max-len, max-params |
65 | | - var viewX; |
66 | | - var viewY; |
67 | | - var ord; |
68 | | - |
69 | | - ord = resolve( order ); |
70 | | - if ( ord === null ) { |
71 | | - throw new TypeError( format( 'invalid argument. First argument must be a supported BLAS memory layout. Value: `%s`.', order ) ); |
| 61 | +function dger( M, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ) { // eslint-disable-line max-len, max-params |
| 62 | + if ( M < 0 ) { |
| 63 | + throw new RangeError( format( 'invalid argument. First argument must be a nonnegative integer. Value: `%d`.', M ) ); |
72 | 64 | } |
73 | | - offsetX = minViewBufferIndex( N, strideX, offsetX ); |
74 | | - offsetY = minViewBufferIndex( N, strideY, offsetY ); |
75 | | - |
76 | | - viewX = offsetView( x, offsetX ); |
77 | | - viewY = offsetView( y, offsetY ); |
78 | | - |
79 | | - addon( ord, M, N, alpha, viewX, strideX, viewY, strideY, A, LDA ); |
| 65 | + if ( N < 0 ) { |
| 66 | + throw new RangeError( format( 'invalid argument. Second argument must be a nonnegative integer. Value: `%d`.', N ) ); |
| 67 | + } |
| 68 | + if ( strideX === 0 ) { |
| 69 | + throw new RangeError( format( 'invalid argument. Fifth argument must be non-zero.' ) ); |
| 70 | + } |
| 71 | + if ( strideY === 0 ) { |
| 72 | + throw new RangeError( format( 'invalid argument. Eighth argument must be non-zero.' ) ); |
| 73 | + } |
| 74 | + // Check if we can early return... |
| 75 | + if ( M === 0 || N === 0 || alpha === 0.0 ) { |
| 76 | + return A; |
| 77 | + } |
| 78 | + addon.ndarray( M, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ); // eslint-disable-line max-len |
80 | 79 | return A; |
81 | 80 | } |
82 | 81 |
|
|
0 commit comments