Skip to content

Commit 68e1c03

Browse files
committed
fix: fix implementation and add tests
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: na - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: na - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent 1959bfe commit 68e1c03

File tree

4 files changed

+153
-26
lines changed

4 files changed

+153
-26
lines changed

lib/node_modules/@stdlib/lapack/base/dlatrs/lib/base.js

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,6 @@ function dlatrs( uplo, trans, diag, normin, N, A, strideA1, strideA2, offsetA, X
303303

304304
if ( grow * tscal > smlnum ) {
305305
dtrsv( uplo, trans, diag, N, A, strideA1, strideA2, offsetA, X, strideX, offsetX );
306-
scale = 1.0;
307306
} else {
308307
if ( xmax > bignum ) {
309308
scale = bignum / xmax;
@@ -418,35 +417,35 @@ function dlatrs( uplo, trans, diag, normin, N, A, strideA1, strideA2, offsetA, X
418417
uscal /= tjjs;
419418
}
420419
if ( rec < 1.0 ) {
421-
dscal( N, rec, strideX, offsetX );
420+
dscal( N, rec, X, strideX, offsetX );
422421
scale *= rec;
423422
xmax *= rec;
424423
}
425-
sumj = 0.0;
424+
}
426425

427-
if ( uscal === 1.0 ) {
428-
if ( uplo === 'upper' ) {
429-
sumj = ddot( j, A, strideA1, ia1, X, strideX, offsetX );
430-
} else {
431-
sumj = ddot( N - ( j + 1 ), A, strideA1, ia + strideA1, X, strideX, ix + strideX );
426+
sumj = 0.0; // HERE
427+
if ( uscal === 1.0 ) {
428+
if ( uplo === 'upper' ) {
429+
sumj = ddot( j, A, strideA1, ia1, X, strideX, offsetX );
430+
} else {
431+
sumj = ddot( N - ( j + 1 ), A, strideA1, ia + strideA1, X, strideX, ix + strideX );
432+
}
433+
} else {
434+
if ( uplo === 'upper' ) {
435+
ia2 = 0;
436+
ix1 = offsetX;
437+
for ( i = 0; i < j; i++ ) {
438+
sumj += A[ ia1 + ia2 ] * uscal * X[ ix1 ];
439+
ia2 += strideA1;
440+
ix1 += strideX;
432441
}
433442
} else {
434-
if ( uplo === 'upper' ) {
435-
ia2 = 0;
436-
ix1 = offsetX;
437-
for ( i = 0; i < j; i++ ) {
438-
sumj += A[ ia1 + ia2 ] * uscal * X[ ix1 ];
439-
ia2 += strideA1;
440-
ix1 += strideX;
441-
}
442-
} else {
443-
ia2 = ( j + 1 ) * strideA1;
444-
ix1 = offsetX + ( ( j + 1 ) * strideX );
445-
for ( i = j + 1; i < N; i++ ) {
446-
sumj += A[ ia1 + ia2 ] * uscal * X[ ix1 ];
447-
ia2 += strideA1;
448-
ix1 += strideX;
449-
}
443+
ia2 = ( j + 1 ) * strideA1;
444+
ix1 = offsetX + ( ( j + 1 ) * strideX );
445+
for ( i = j + 1; i < N; i++ ) {
446+
sumj += A[ ia1 + ia2 ] * uscal * X[ ix1 ];
447+
ia2 += strideA1;
448+
ix1 += strideX;
450449
}
451450
}
452451
}
@@ -469,7 +468,7 @@ function dlatrs( uplo, trans, diag, normin, N, A, strideA1, strideA2, offsetA, X
469468
if ( tjj > smlnum ) {
470469
if ( tjj < 1.0 ) {
471470
if ( xj > tjj * bignum ) {
472-
rec /= xj;
471+
rec = 1.0 / xj;
473472
dscal( N, rec, X, strideX, offsetX );
474473
scale *= rec;
475474
xmax *= rec;
@@ -494,10 +493,13 @@ function dlatrs( uplo, trans, diag, normin, N, A, strideA1, strideA2, offsetA, X
494493
scale = 0.0;
495494
xmax = 0.0;
496495
}
497-
X[ ix ] = ( X[ ix ] / tjjs ) - sumj;
498496
}
497+
} else {
498+
X[ ix ] = ( X[ ix ] / tjjs ) - sumj;
499499
}
500500

501+
xmax = max( xmax, abs( X[ ix ] ) );
502+
501503
ix += jinc * strideX;
502504
ia += jinc * ( strideA1 + strideA2 );
503505
ia1 += jinc * strideA2;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"order": "column-major",
3+
4+
"uplo": "lower",
5+
"trans": "transpose",
6+
"diag": "non-unit",
7+
"normin": "no",
8+
9+
"N": 3,
10+
"LDA": 3,
11+
12+
"A": [ 1.0e-100, 1.0, 2.0, 0.0, 1.0e-120, 3.0, 0.0, 0.0, 1.0e-140 ],
13+
"strideA1": 1,
14+
"strideA2": 3,
15+
"offsetA": 0,
16+
17+
"A_mat": [
18+
[ 1.0e-100, 0.0, 0.0 ],
19+
[ 1.0, 1.0e-120, 0.0 ],
20+
[ 2.0, 3.0, 1.0e-140 ]
21+
],
22+
23+
"X": [ 1e100, 2e100, 3e100 ],
24+
"strideX": 1,
25+
"offsetX": 0,
26+
27+
"CNORM": [ 0.0, 0.0, 0.0 ],
28+
"strideCNORM": 1,
29+
"offsetCNORM": 0,
30+
31+
"expectedX": [ 9.99999999999999996E+219, -9.99999999999999980E+119, 3.33333333333333315E-001 ],
32+
"expectedCNORM": [ 3.0, 3.0, 0.0 ],
33+
"scale": 1.1111111111111112E-241
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"order": "row-major",
3+
4+
"uplo": "lower",
5+
"trans": "transpose",
6+
"diag": "non-unit",
7+
"normin": "no",
8+
9+
"N": 3,
10+
"LDA": 3,
11+
12+
"A": [ 1.0e-100, 0.0, 0.0, 1.0, 1.0e-120, 0.0, 2.0, 3.0, 1.0e-140 ],
13+
"strideA1": 3,
14+
"strideA2": 1,
15+
"offsetA": 0,
16+
17+
"A_mat": [
18+
[ 1.0e-100, 0.0, 0.0 ],
19+
[ 1.0, 1.0e-120, 0.0 ],
20+
[ 2.0, 3.0, 1.0e-140 ]
21+
],
22+
23+
"X": [ 1e100, 2e100, 3e100 ],
24+
"strideX": 1,
25+
"offsetX": 0,
26+
27+
"CNORM": [ 0.0, 0.0, 0.0 ],
28+
"strideCNORM": 1,
29+
"offsetCNORM": 0,
30+
31+
"expectedX": [ 9.99999999999999996E+219, -9.99999999999999980E+119, 3.33333333333333315E-001 ],
32+
"expectedCNORM": [ 3.0, 3.0, 0.0 ],
33+
"scale": 1.1111111111111112E-241
34+
}

lib/node_modules/@stdlib/lapack/base/dlatrs/test/test.dlatrs.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ var SCALED_NON_UNIT_NO_TRANS_LOWER_COL_MAJOR = require( './fixtures/scaled_non_u
5454
var SCALED_NON_UNIT_NO_TRANS_UPPER_ROW_MAJOR = require( './fixtures/scaled_non_unit_no_trans_upper_row_major.json' );
5555
var SCALED_NON_UNIT_NO_TRANS_UPPER_COL_MAJOR = require( './fixtures/scaled_non_unit_no_trans_upper_col_major.json' );
5656

57+
var SCALED_NON_UNIT_TRANS_LOWER_ROW_MAJOR = require( './fixtures/scaled_non_unit_trans_lower_row_major.json' );
58+
var SCALED_NON_UNIT_TRANS_LOWER_COL_MAJOR = require( './fixtures/scaled_non_unit_trans_lower_col_major.json' );
59+
5760

5861
// TESTS //
5962

@@ -876,3 +879,57 @@ tape( 'the function returns expected output for large values (column-major) (upp
876879

877880
t.end();
878881
});
882+
883+
tape( 'the function returns expected output for large values (row-major) (lower triangular) (transpose) (non-unit)', function test( t ) {
884+
var expectedCNORM;
885+
var expectedX;
886+
var scale;
887+
var CNORM;
888+
var data;
889+
var A;
890+
var X;
891+
892+
data = SCALED_NON_UNIT_TRANS_LOWER_ROW_MAJOR;
893+
894+
A = new Float64Array( data.A );
895+
CNORM = new Float64Array( data.CNORM );
896+
X = new Float64Array( data.X );
897+
898+
expectedCNORM = new Float64Array( data.expectedCNORM );
899+
expectedX = new Float64Array( data.expectedX );
900+
901+
scale = dlatrs( data.order, data.uplo, data.trans, data.diag, data.normin, data.N, A, data.LDA, X, CNORM );
902+
903+
t.strictEqual( scale, data.scale, 'returns expected value' );
904+
t.deepEqual( X, expectedX, 'returns expected value' );
905+
t.deepEqual( CNORM, expectedCNORM, 'returns expected value' );
906+
907+
t.end();
908+
});
909+
910+
tape( 'the function returns expected output for large values (column-major) (lower triangular) (transpose) (non-unit)', function test( t ) {
911+
var expectedCNORM;
912+
var expectedX;
913+
var scale;
914+
var CNORM;
915+
var data;
916+
var A;
917+
var X;
918+
919+
data = SCALED_NON_UNIT_TRANS_LOWER_COL_MAJOR;
920+
921+
A = new Float64Array( data.A );
922+
CNORM = new Float64Array( data.CNORM );
923+
X = new Float64Array( data.X );
924+
925+
expectedCNORM = new Float64Array( data.expectedCNORM );
926+
expectedX = new Float64Array( data.expectedX );
927+
928+
scale = dlatrs( data.order, data.uplo, data.trans, data.diag, data.normin, data.N, A, data.LDA, X, CNORM );
929+
930+
t.strictEqual( scale, data.scale, 'returns expected value' );
931+
t.deepEqual( X, expectedX, 'returns expected value' );
932+
t.deepEqual( CNORM, expectedCNORM, 'returns expected value' );
933+
934+
t.end();
935+
});

0 commit comments

Comments
 (0)