|
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