@@ -25,14 +25,14 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
25
25
< div class ='fl pad1y space-right2 '>
26
26
< span class ="strong "> 100% </ span >
27
27
< span class ="quiet "> Statements</ span >
28
- < span class ='fraction '> 286/286 </ span >
28
+ < span class ='fraction '> 293/293 </ span >
29
29
</ div >
30
30
31
31
32
32
< div class ='fl pad1y space-right2 '>
33
33
< span class ="strong "> 100% </ span >
34
34
< span class ="quiet "> Branches</ span >
35
- < span class ='fraction '> 17/17 </ span >
35
+ < span class ='fraction '> 11/11 </ span >
36
36
</ div >
37
37
38
38
@@ -46,7 +46,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
46
46
< div class ='fl pad1y space-right2 '>
47
47
< span class ="strong "> 100% </ span >
48
48
< span class ="quiet "> Lines</ span >
49
- < span class ='fraction '> 286/286 </ span >
49
+ < span class ='fraction '> 293/293 </ span >
50
50
</ div >
51
51
52
52
@@ -349,7 +349,14 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
349
349
< a name ='L284 '> </ a > < a href ='#L284 '> 284</ a >
350
350
< a name ='L285 '> </ a > < a href ='#L285 '> 285</ a >
351
351
< a name ='L286 '> </ a > < a href ='#L286 '> 286</ a >
352
- < a name ='L287 '> </ a > < a href ='#L287 '> 287</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 3x</ span >
352
+ < a name ='L287 '> </ a > < a href ='#L287 '> 287</ a >
353
+ < a name ='L288 '> </ a > < a href ='#L288 '> 288</ a >
354
+ < a name ='L289 '> </ a > < a href ='#L289 '> 289</ a >
355
+ < a name ='L290 '> </ a > < a href ='#L290 '> 290</ a >
356
+ < a name ='L291 '> </ a > < a href ='#L291 '> 291</ a >
357
+ < a name ='L292 '> </ a > < a href ='#L292 '> 292</ a >
358
+ < a name ='L293 '> </ a > < a href ='#L293 '> 293</ a >
359
+ < a name ='L294 '> </ a > < a href ='#L294 '> 294</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 3x</ span >
353
360
< span class ="cline-any cline-yes "> 3x</ span >
354
361
< span class ="cline-any cline-yes "> 3x</ span >
355
362
< span class ="cline-any cline-yes "> 3x</ span >
@@ -566,24 +573,25 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
566
573
< span class ="cline-any cline-yes "> 34x</ span >
567
574
< span class ="cline-any cline-yes "> 34x</ span >
568
575
< span class ="cline-any cline-yes "> 34x</ span >
576
+ < span class ="cline-any cline-yes "> 4x</ span >
577
+ < span class ="cline-any cline-yes "> 4x</ span >
578
+ < span class ="cline-any cline-yes "> 4x</ span >
569
579
< span class ="cline-any cline-yes "> 34x</ span >
570
- < span class ="cline-any cline-yes "> 31x</ span >
571
- < span class ="cline-any cline-yes "> 34x</ span >
572
- < span class ="cline-any cline-yes "> 5x</ span >
573
- < span class ="cline-any cline-yes "> 5x</ span >
574
- < span class ="cline-any cline-yes "> 5x</ span >
575
- < span class ="cline-any cline-yes "> 34x</ span >
576
- < span class ="cline-any cline-yes "> 29x</ span >
577
- < span class ="cline-any cline-yes "> 27x</ span >
578
- < span class ="cline-any cline-yes "> 29x</ span >
579
- < span class ="cline-any cline-yes "> 3x</ span >
580
- < span class ="cline-any cline-yes "> 3x</ span >
581
- < span class ="cline-any cline-yes "> 3x</ span >
582
- < span class ="cline-any cline-yes "> 29x</ span >
583
- < span class ="cline-any cline-yes "> 26x</ span >
580
+ < span class ="cline-any cline-yes "> 4x</ span >
581
+ < span class ="cline-any cline-yes "> 4x</ span >
582
+ < span class ="cline-any cline-yes "> 4x</ span >
583
+ < span class ="cline-any cline-yes "> 30x</ span >
584
584
< span class ="cline-any cline-yes "> 26x</ span >
585
585
< span class ="cline-any cline-yes "> 26x</ span >
586
586
< span class ="cline-any cline-yes "> 26x</ span >
587
+ < span class ="cline-any cline-yes "> 13x</ span >
588
+ < span class ="cline-any cline-yes "> 13x</ span >
589
+ < span class ="cline-any cline-yes "> 13x</ span >
590
+ < span class ="cline-any cline-yes "> 13x</ span >
591
+ < span class ="cline-any cline-yes "> 13x</ span >
592
+ < span class ="cline-any cline-yes "> 13x</ span >
593
+ < span class ="cline-any cline-yes "> 13x</ span >
594
+ < span class ="cline-any cline-yes "> 13x</ span >
587
595
< span class ="cline-any cline-yes "> 26x</ span >
588
596
< span class ="cline-any cline-yes "> 34x</ span >
589
597
< span class ="cline-any cline-yes "> 34x</ span >
@@ -627,6 +635,12 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
627
635
< span class ="cline-any cline-yes "> 34x</ span >
628
636
< span class ="cline-any cline-yes "> 34x</ span >
629
637
< span class ="cline-any cline-yes "> 26x</ span >
638
+ < span class ="cline-any cline-yes "> 13x</ span >
639
+ < span class ="cline-any cline-yes "> 13x</ span >
640
+ < span class ="cline-any cline-yes "> 13x</ span >
641
+ < span class ="cline-any cline-yes "> 13x</ span >
642
+ < span class ="cline-any cline-yes "> 13x</ span >
643
+ < span class ="cline-any cline-yes "> 13x</ span >
630
644
< span class ="cline-any cline-yes "> 26x</ span >
631
645
< span class ="cline-any cline-yes "> 34x</ span >
632
646
< span class ="cline-any cline-yes "> 34x</ span >
@@ -835,9 +849,9 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
835
849
var full;
836
850
var nobs;
837
851
var sa1;
838
- var sa2 ;
852
+ var sa0 ;
839
853
var sb1;
840
- var sb2 ;
854
+ var sb0 ;
841
855
var sb;
842
856
var oa;
843
857
var om;
@@ -850,36 +864,37 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
850
864
// Determine the memory layouts of `B`:
851
865
isrmb = isRowMajor( [ strideB1, strideB2 ] );
852
866
853
- // Check whether we need to swap the strides of `B` when writing to the upper or lower triangular part of `B`...
854
- if (
855
- ( isrmb && uplo === 'upper' ) ||
856
- ( !isrmb && uplo === 'lower' )
857
- ) {
858
- // Triangular part is aligned with (i.e., cache optimal for) the layout of `B`, so no need to transpose the strides...
867
+ // Determine the outer and inner loop strides when writing to the upper or lower triangular part of `B`...
868
+ if ( uplo === 'upper') {
869
+ // Writing to the upper triangular part is cache optimal for a row-major `B`, but not for a column-major `B`...
870
+ sb0 = strideB2;
859
871
sb1 = strideB1;
860
- sb2 = strideB2;
861
- } else if (
862
- ( isrmb && uplo === 'lower' ) ||
863
- ( !isrmb && uplo === 'upper' )
864
- ) {
865
- // When writing to a triangular part which is not aligned with the layout of `B`, transpose the strides...
872
+ } else if ( uplo === 'lower' ) {
873
+ // Writing to the lower triangular part is cache optimal for a column-major `B`, but not for a row-major `B`...
874
+ sb0 = strideB1;
866
875
sb1 = strideB2;
867
- sb2 = strideB1;
868
- } else { // uplo !== 'lower' && uplo !== 'upper'
869
- // When computing the full covariance matrix, write initial covariances according to the layout of `B`...
876
+ } else {
877
+ // When computing the full covariance matrix, write covariances in a manner which is cache optimal for the layout of `B`...
870
878
full = true;
871
- sb1 = strideB1;
872
- sb2 = strideB2;
879
+ if ( isrmb ) {
880
+ // For row-major matrices, the last dimension has the fastest changing index...
881
+ sb0 = strideB2;
882
+ sb1 = strideB1;
883
+ } else {
884
+ // For column-major matrices, the first dimension has the fastest changing index...
885
+ sb0 = strideB1;
886
+ sb1 = strideB2;
887
+ }
873
888
}
874
889
// Resolve loop variables...
875
890
if ( orient === 'rows' ) {
891
+ sa0 = strideA2;
876
892
sa1 = strideA1;
877
- sa2 = strideA2;
878
893
nsamples = M;
879
894
nobs = N;
880
895
} else { // orient === 'columns'
896
+ sa0 = strideA1;
881
897
sa1 = strideA2;
882
- sa2 = strideA1;
883
898
nsamples = N;
884
899
nobs = M;
885
900
}
@@ -889,7 +904,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
889
904
ib = offsetB;
890
905
im = offsetM;
891
906
for ( i0 = 0; i0 < nsamples; i0++ ) {
892
- B[ ib ] = dvarmtk( nobs, correction, means[ im ], A, sa2 , ia );
907
+ B[ ib ] = dvarmtk( nobs, correction, means[ im ], A, sa0 , ia );
893
908
ia += sa1;
894
909
ib += sb;
895
910
im += strideM;
@@ -898,21 +913,27 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
898
913
oa = offsetA;
899
914
om = offsetM;
900
915
for ( i1 = 0; i1 < nsamples-1; i1++ ) {
901
- ib = offsetB + ( sb1*i1 ) + ( sb2 *i1 );
916
+ ib = offsetB + ( sb1*i1 ) + ( sb0 *i1 );
902
917
ia = oa;
903
918
im = om;
904
919
for ( i0 = i1+1; i0 < nsamples; i0++ ) {
905
920
im += strideM;
906
921
ia += sa1;
907
- ib += sb2 ;
908
- B[ ib ] = dcovarmtk( nobs, correction, means[ om ], A, sa2 , oa, means[ im ], A, sa2 , ia );
922
+ ib += sb0 ;
923
+ B[ ib ] = dcovarmtk( nobs, correction, means[ om ], A, sa0 , oa, means[ im ], A, sa0 , ia );
909
924
}
910
925
oa += sa1;
911
926
om += strideM;
912
927
}
913
928
// Copy the covariances to the other triangular part if the full covariance matrix is desired...
914
929
if ( full ) {
915
- dlacpy( ( isrmb ) ? 'upper' : 'lower', nsamples, nsamples, B, sb1, sb2, offsetB, B, sb2, sb1, offsetB );
930
+ if ( isrmb ) {
931
+ // Copy the upper triangular part to the lower triangular part:
932
+ dlacpy( 'upper', nsamples, nsamples, B, sb1, sb0, offsetB, B, sb0, sb1, offsetB );
933
+ } else {
934
+ // Copy the lower triangular part to the upper triangular part:
935
+ dlacpy( 'lower', nsamples, nsamples, B, sb0, sb1, offsetB, B, sb1, sb0, offsetB );
936
+ }
916
937
}
917
938
return B;
918
939
}
@@ -928,7 +949,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
928
949
< div class ='footer quiet pad2 space-top1 center small '>
929
950
Code coverage generated by
930
951
< a href ="https://istanbul.js.org/ " target ="_blank " rel ="noopener noreferrer "> istanbul</ a >
931
- at 2025-07-15T03:22:25.930Z
952
+ at 2025-07-15T10:09:10.785Z
932
953
</ div >
933
954
< script src ="../../../../prettify.js "> </ script >
934
955
< script >
0 commit comments