@@ -25,14 +25,14 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
2525 < div class ='fl pad1y space-right2 '>
2626 < span class ="strong "> 100% </ span >
2727 < span class ="quiet "> Statements</ span >
28- < span class ='fraction '> 286/286 </ span >
28+ < span class ='fraction '> 293/293 </ span >
2929 </ div >
3030
3131
3232 < div class ='fl pad1y space-right2 '>
3333 < span class ="strong "> 100% </ span >
3434 < span class ="quiet "> Branches</ span >
35- < span class ='fraction '> 17/17 </ span >
35+ < span class ='fraction '> 11/11 </ span >
3636 </ div >
3737
3838
@@ -46,7 +46,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
4646 < div class ='fl pad1y space-right2 '>
4747 < span class ="strong "> 100% </ span >
4848 < span class ="quiet "> Lines</ span >
49- < span class ='fraction '> 286/286 </ span >
49+ < span class ='fraction '> 293/293 </ span >
5050 </ div >
5151
5252
@@ -349,7 +349,14 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
349349< a name ='L284 '> </ a > < a href ='#L284 '> 284</ a >
350350< a name ='L285 '> </ a > < a href ='#L285 '> 285</ a >
351351< 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 >
353360< span class ="cline-any cline-yes "> 3x</ span >
354361< span class ="cline-any cline-yes "> 3x</ span >
355362< 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/
566573< span class ="cline-any cline-yes "> 34x</ span >
567574< span class ="cline-any cline-yes "> 34x</ span >
568575< 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 >
569579< 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 >
584584< span class ="cline-any cline-yes "> 26x</ span >
585585< span class ="cline-any cline-yes "> 26x</ span >
586586< 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 >
587595< span class ="cline-any cline-yes "> 26x</ span >
588596< span class ="cline-any cline-yes "> 34x</ span >
589597< 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/
627635< span class ="cline-any cline-yes "> 34x</ span >
628636< span class ="cline-any cline-yes "> 34x</ span >
629637< 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 >
630644< span class ="cline-any cline-yes "> 26x</ span >
631645< span class ="cline-any cline-yes "> 34x</ span >
632646< 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/
835849 var full;
836850 var nobs;
837851 var sa1;
838- var sa2 ;
852+ var sa0 ;
839853 var sb1;
840- var sb2 ;
854+ var sb0 ;
841855 var sb;
842856 var oa;
843857 var om;
@@ -850,36 +864,37 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
850864 // Determine the memory layouts of `B`:
851865 isrmb = isRowMajor( [ strideB1, strideB2 ] );
852866
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;
859871 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;
866875 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`...
870878 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+ }
873888 }
874889 // Resolve loop variables...
875890 if ( orient === 'rows' ) {
891+ sa0 = strideA2;
876892 sa1 = strideA1;
877- sa2 = strideA2;
878893 nsamples = M;
879894 nobs = N;
880895 } else { // orient === 'columns'
896+ sa0 = strideA1;
881897 sa1 = strideA2;
882- sa2 = strideA1;
883898 nsamples = N;
884899 nobs = M;
885900 }
@@ -889,7 +904,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
889904 ib = offsetB;
890905 im = offsetM;
891906 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 );
893908 ia += sa1;
894909 ib += sb;
895910 im += strideM;
@@ -898,21 +913,27 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
898913 oa = offsetA;
899914 om = offsetM;
900915 for ( i1 = 0; i1 < nsamples-1; i1++ ) {
901- ib = offsetB + ( sb1*i1 ) + ( sb2 *i1 );
916+ ib = offsetB + ( sb1*i1 ) + ( sb0 *i1 );
902917 ia = oa;
903918 im = om;
904919 for ( i0 = i1+1; i0 < nsamples; i0++ ) {
905920 im += strideM;
906921 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 );
909924 }
910925 oa += sa1;
911926 om += strideM;
912927 }
913928 // Copy the covariances to the other triangular part if the full covariance matrix is desired...
914929 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+ }
916937 }
917938 return B;
918939}
@@ -928,7 +949,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">stats/
928949 < div class ='footer quiet pad2 space-top1 center small '>
929950 Code coverage generated by
930951 < 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
932953 </ div >
933954 < script src ="../../../../prettify.js "> </ script >
934955 < script >
0 commit comments