diff --git a/lib/node_modules/@stdlib/lapack/base/dlarf1f/lib/base.js b/lib/node_modules/@stdlib/lapack/base/dlarf1f/lib/base.js index 5ab4295edda4..08c8cd0e9540 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlarf1f/lib/base.js +++ b/lib/node_modules/@stdlib/lapack/base/dlarf1f/lib/base.js @@ -108,16 +108,17 @@ function dlarf1f( side, M, N, V, strideV, offsetV, tau, C, strideC1, strideC2, o i = offsetV + ( ( lastv-1 ) * strideV ); // Move `i` to the last non-zero element in `V`, where we assume that V[0] = 1, and it is not stored, so we shouldn't access it... - while ( lastv > 0 && V[ i ] === 0.0 ) { + while ( lastv > 1 && V[ i ] === 0.0 ) { // `lastv` should be greater than 1 as it represents the last one-based index with a zero value lastv -= 1; i -= strideV; } + if ( isLeftSide( side ) ) { // Scan for the last non-zero column in `C`: - lastc = iladlc( lastv + 1, N, C, strideC1, strideC2, offsetC ) + 1; // adjust by `+1` to account for the difference between zero-based and one-based indexing + lastc = iladlc( lastv, N, C, strideC1, strideC2, offsetC ) + 1; // adjust by `+1` to account for the difference between zero-based and one-based indexing } else { // Scan for the last non-zero row in `C`: - lastc = iladlr( M, lastv + 1, C, strideC1, strideC2, offsetC ) + 1; // // adjust by `+1` to account for the difference between zero-based and one-based indexing + lastc = iladlr( M, lastv, C, strideC1, strideC2, offsetC ) + 1; // // adjust by `+1` to account for the difference between zero-based and one-based indexing } // Return `C` unchanged if all elements in `C` are zero... if ( lastc === 0 ) { @@ -127,7 +128,7 @@ function dlarf1f( side, M, N, V, strideV, offsetV, tau, C, strideC1, strideC2, o // Form: H*C // If `lastv = 1`, this means `V = 1`, so we just need to compute `C = H*C = (1-tau)*C`... - if ( lastv === 0 ) { + if ( lastv === 1 ) { // C[0,0:lastc] = (1-tau)*C[0,0:lastc] dscal( lastc, 1.0-tau, C, strideC2, offsetC ); // scale the first row } else { @@ -154,7 +155,7 @@ function dlarf1f( side, M, N, V, strideV, offsetV, tau, C, strideC1, strideC2, o // Form: C*H // If `N = 1`, then `V = 1`, so we just need to compute `C = CH = C*(1-tau)`... - if ( lastv === 0 ) { + if ( lastv === 1 ) { // C[0:lastc,0] = ( 1-tau ) * C[0:lastc,0] dscal( lastc, 1.0-tau, C, strideC1, offsetC ); // scale the first column return C; diff --git a/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/fixtures/indexing.json b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/fixtures/indexing.json new file mode 100644 index 000000000000..aa3c3462c563 --- /dev/null +++ b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/fixtures/indexing.json @@ -0,0 +1,36 @@ + { + "order": "column-major", + + "side": "left", + + "M": 3, + "N": 1, + + "V": [ 1, 0, 0, 0, -1, 0 ], + "strideV": 1, + "offsetV": 0, + + "tau": 2, + + "C": [ 1, 0, 0, 0, -1, 0 ], + "strideC1": 1, + "strideC2": 3, + "offsetC": 0, + "LDC": 3, + "C_mat": [ + [ 1.0, 0.0 ], + [ 0.0, -1.0 ], + [ 0.0, 0.0 ] + ], + + "work": [ 64, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ], + "strideWork": 1, + "offsetWork": 0, + + "C_out": [ -1, 0, 0, -0, -1, -0 ], + "C_out_mat": [ + [ -1.0, 0.0 ], + [ 0.0, -1.0 ], + [ 0.0, 0.0 ] + ] +} diff --git a/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.dlarf1f.js b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.dlarf1f.js index 3ac015122405..77164fcfba76 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.dlarf1f.js +++ b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.dlarf1f.js @@ -38,6 +38,7 @@ var RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/right_lastv_eq_zero_row var RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/right_lastv_eq_zero_col_major.json' ); var RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/right_lastv_gt_zero_row_major.json' ); var RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/right_lastv_gt_zero_col_major.json' ); +var INDEXING = require( './fixtures/indexing.json' ); // TESTS // @@ -367,3 +368,24 @@ tape( 'the function applies an elementary refactor (side=right, lastv > 0, colum t.deepEqual( out, expectedC, 'returns expected value' ); t.end(); }); + +tape( 'the function follows consistent indexing with LAPACK', function test( t ) { + var expectedC; + var data; + var work; + var out; + var V; + var C; + + data = INDEXING; + + V = new Float64Array( data.V ); + C = new Float64Array( data.C ); + work = new Float64Array( data.work ); + + out = dlarf1f( data.order, data.side, data.M, data.N, V, data.strideV, data.tau, C, data.LDC, work ); + expectedC = new Float64Array( data.C_out ); + + t.deepEqual( out, expectedC, 'returns expected value' ); + t.end(); +}); diff --git a/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.ndarray.js b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.ndarray.js index 52b6148a923c..1635f21a6443 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/lapack/base/dlarf1f/test/test.ndarray.js @@ -38,46 +38,39 @@ var RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/right_lastv_eq_zero_row var RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/right_lastv_eq_zero_col_major.json' ); var RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/right_lastv_gt_zero_row_major.json' ); var RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/right_lastv_gt_zero_col_major.json' ); - var MIXED_STRIDES_RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/mixed_strides/right_lastv_gt_zero_row_major.json' ); var NEGATIVE_STRIDES_RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/negative_strides/right_lastv_gt_zero_row_major.json' ); var LARGE_STRIDES_RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/large_strides/right_lastv_gt_zero_row_major.json' ); var OFFSETS_RIGHT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/offsets/right_lastv_gt_zero_row_major.json' ); - var NEGATIVE_STRIDES_RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/negative_strides/right_lastv_gt_zero_col_major.json' ); var MIXED_STRIDES_RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/mixed_strides/right_lastv_gt_zero_col_major.json' ); var LARGE_STRIDES_RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/large_strides/right_lastv_gt_zero_col_major.json' ); var OFFSETS_RIGHT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/offsets/right_lastv_gt_zero_col_major.json' ); - var MIXED_STRIDES_RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/mixed_strides/right_lastv_eq_zero_row_major.json' ); var NEGATIVE_STRIDES_RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/negative_strides/right_lastv_eq_zero_row_major.json' ); var LARGE_STRIDES_RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/large_strides/right_lastv_eq_zero_row_major.json' ); var OFFSETS_RIGHT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/offsets/right_lastv_eq_zero_row_major.json' ); - var NEGATIVE_STRIDES_RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/negative_strides/right_lastv_eq_zero_col_major.json' ); var MIXED_STRIDES_RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/mixed_strides/right_lastv_eq_zero_col_major.json' ); var LARGE_STRIDES_RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/large_strides/right_lastv_eq_zero_col_major.json' ); var OFFSETS_RIGHT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/offsets/right_lastv_eq_zero_col_major.json' ); - var NEGATIVE_STRIDES_LEFT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/negative_strides/left_lastv_gt_zero_row_major.json' ); var MIXED_STRIDES_LEFT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/mixed_strides/left_lastv_gt_zero_row_major.json' ); var LARGE_STRIDES_LEFT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/large_strides/left_lastv_gt_zero_row_major.json' ); var OFFSETS_LEFT_LASTV_GT_ZERO_ROW_MAJOR = require( './fixtures/offsets/left_lastv_gt_zero_row_major.json' ); - var MIXED_STRIDES_LEFT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/mixed_strides/left_lastv_gt_zero_col_major.json' ); var LARGE_STRIDES_LEFT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/large_strides/left_lastv_gt_zero_col_major.json' ); var OFFSETS_LEFT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/offsets/left_lastv_gt_zero_col_major.json' ); var NEGATIVE_STRIDES_LEFT_LASTV_GT_ZERO_COL_MAJOR = require( './fixtures/negative_strides/left_lastv_gt_zero_col_major.json' ); - var MIXED_STRIDES_LEFT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/mixed_strides/left_lastv_eq_zero_row_major.json' ); var LARGE_STRIDES_LEFT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/large_strides/left_lastv_eq_zero_row_major.json' ); var OFFSETS_LEFT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/offsets/left_lastv_eq_zero_row_major.json' ); var NEGATIVE_STRIDES_LEFT_LASTV_EQ_ZERO_ROW_MAJOR = require( './fixtures/negative_strides/left_lastv_eq_zero_row_major.json' ); - var MIXED_STRIDES_LEFT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/mixed_strides/left_lastv_eq_zero_col_major.json' ); var LARGE_STRIDES_LEFT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/large_strides/left_lastv_eq_zero_col_major.json' ); var OFFSETS_LEFT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/offsets/left_lastv_eq_zero_col_major.json' ); var NEGATIVE_STRIDES_LEFT_LASTV_EQ_ZERO_COL_MAJOR = require( './fixtures/negative_strides/left_lastv_eq_zero_col_major.json' ); +var INDEXING = require( './fixtures/indexing.json' ); // TESTS // @@ -340,6 +333,27 @@ tape( 'the function applies an elementary reflector (side=right, lastv > 0, colu t.end(); }); +tape( 'the function follows indexing consistent with LAPACK', function test( t ) { + var expectedC; + var data; + var work; + var out; + var V; + var C; + + data = INDEXING; + + V = new Float64Array( data.V ); + C = new Float64Array( data.C ); + work = new Float64Array( data.work ); + + out = dlarf1f( data.side, data.M, data.N, V, data.strideV, data.offsetV, data.tau, C, data.strideC1, data.strideC2, data.offsetC, work, data.strideWork, data.offsetWork ); + expectedC = new Float64Array( data.C_out ); + + t.deepEqual( out, expectedC, 'returns expected value' ); + t.end(); +}); + tape( 'the function applies an elementary reflector (side=right, lastv > 0, row-major, mixed strides)', function test( t ) { var expectedC; var data;