@@ -23,30 +23,30 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
2323 < div class ='clearfix '>
2424
2525 < div class ='fl pad1y space-right2 '>
26- < span class ="strong "> 100 % </ span >
26+ < span class ="strong "> 99.45 % </ span >
2727 < span class ="quiet "> Statements</ span >
28- < span class ='fraction '> 143/143 </ span >
28+ < span class ='fraction '> 183/184 </ span >
2929 </ div >
3030
3131
3232 < div class ='fl pad1y space-right2 '>
33- < span class ="strong "> 100 % </ span >
33+ < span class ="strong "> 95.83 % </ span >
3434 < span class ="quiet "> Branches</ span >
35- < span class ='fraction '> 18/18 </ span >
35+ < span class ='fraction '> 23/24 </ span >
3636 </ div >
3737
3838
3939 < div class ='fl pad1y space-right2 '>
4040 < span class ="strong "> 100% </ span >
4141 < span class ="quiet "> Functions</ span >
42- < span class ='fraction '> 1/1 </ span >
42+ < span class ='fraction '> 2/2 </ span >
4343 </ div >
4444
4545
4646 < div class ='fl pad1y space-right2 '>
47- < span class ="strong "> 100 % </ span >
47+ < span class ="strong "> 99.45 % </ span >
4848 < span class ="quiet "> Lines</ span >
49- < span class ='fraction '> 143/143 </ span >
49+ < span class ='fraction '> 183/184 </ span >
5050 </ div >
5151
5252
@@ -206,7 +206,48 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
206206< a name ='L141 '> </ a > < a href ='#L141 '> 141</ a >
207207< a name ='L142 '> </ a > < a href ='#L142 '> 142</ a >
208208< a name ='L143 '> </ a > < a href ='#L143 '> 143</ a >
209- < a name ='L144 '> </ a > < a href ='#L144 '> 144</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 3x</ span >
209+ < a name ='L144 '> </ a > < a href ='#L144 '> 144</ a >
210+ < a name ='L145 '> </ a > < a href ='#L145 '> 145</ a >
211+ < a name ='L146 '> </ a > < a href ='#L146 '> 146</ a >
212+ < a name ='L147 '> </ a > < a href ='#L147 '> 147</ a >
213+ < a name ='L148 '> </ a > < a href ='#L148 '> 148</ a >
214+ < a name ='L149 '> </ a > < a href ='#L149 '> 149</ a >
215+ < a name ='L150 '> </ a > < a href ='#L150 '> 150</ a >
216+ < a name ='L151 '> </ a > < a href ='#L151 '> 151</ a >
217+ < a name ='L152 '> </ a > < a href ='#L152 '> 152</ a >
218+ < a name ='L153 '> </ a > < a href ='#L153 '> 153</ a >
219+ < a name ='L154 '> </ a > < a href ='#L154 '> 154</ a >
220+ < a name ='L155 '> </ a > < a href ='#L155 '> 155</ a >
221+ < a name ='L156 '> </ a > < a href ='#L156 '> 156</ a >
222+ < a name ='L157 '> </ a > < a href ='#L157 '> 157</ a >
223+ < a name ='L158 '> </ a > < a href ='#L158 '> 158</ a >
224+ < a name ='L159 '> </ a > < a href ='#L159 '> 159</ a >
225+ < a name ='L160 '> </ a > < a href ='#L160 '> 160</ a >
226+ < a name ='L161 '> </ a > < a href ='#L161 '> 161</ a >
227+ < a name ='L162 '> </ a > < a href ='#L162 '> 162</ a >
228+ < a name ='L163 '> </ a > < a href ='#L163 '> 163</ a >
229+ < a name ='L164 '> </ a > < a href ='#L164 '> 164</ a >
230+ < a name ='L165 '> </ a > < a href ='#L165 '> 165</ a >
231+ < a name ='L166 '> </ a > < a href ='#L166 '> 166</ a >
232+ < a name ='L167 '> </ a > < a href ='#L167 '> 167</ a >
233+ < a name ='L168 '> </ a > < a href ='#L168 '> 168</ a >
234+ < a name ='L169 '> </ a > < a href ='#L169 '> 169</ a >
235+ < a name ='L170 '> </ a > < a href ='#L170 '> 170</ a >
236+ < a name ='L171 '> </ a > < a href ='#L171 '> 171</ a >
237+ < a name ='L172 '> </ a > < a href ='#L172 '> 172</ a >
238+ < a name ='L173 '> </ a > < a href ='#L173 '> 173</ a >
239+ < a name ='L174 '> </ a > < a href ='#L174 '> 174</ a >
240+ < a name ='L175 '> </ a > < a href ='#L175 '> 175</ a >
241+ < a name ='L176 '> </ a > < a href ='#L176 '> 176</ a >
242+ < a name ='L177 '> </ a > < a href ='#L177 '> 177</ a >
243+ < a name ='L178 '> </ a > < a href ='#L178 '> 178</ a >
244+ < a name ='L179 '> </ a > < a href ='#L179 '> 179</ a >
245+ < a name ='L180 '> </ a > < a href ='#L180 '> 180</ a >
246+ < a name ='L181 '> </ a > < a href ='#L181 '> 181</ a >
247+ < a name ='L182 '> </ a > < a href ='#L182 '> 182</ a >
248+ < a name ='L183 '> </ a > < a href ='#L183 '> 183</ a >
249+ < a name ='L184 '> </ a > < a href ='#L184 '> 184</ a >
250+ < a name ='L185 '> </ a > < a href ='#L185 '> 185</ a > </ td > < td class ="line-coverage quiet "> < span class ="cline-any cline-yes "> 3x</ span >
210251< span class ="cline-any cline-yes "> 3x</ span >
211252< span class ="cline-any cline-yes "> 3x</ span >
212253< span class ="cline-any cline-yes "> 3x</ span >
@@ -254,6 +295,32 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
254295< span class ="cline-any cline-yes "> 3x</ span >
255296< span class ="cline-any cline-yes "> 3x</ span >
256297< span class ="cline-any cline-yes "> 3x</ span >
298+ < span class ="cline-any cline-yes "> 84x</ span >
299+ < span class ="cline-any cline-yes "> 84x</ span >
300+ < span class ="cline-any cline-yes "> 84x</ span >
301+ < span class ="cline-any cline-yes "> 3x</ span >
302+ < span class ="cline-any cline-yes "> 3x</ span >
303+ < span class ="cline-any cline-yes "> 3x</ span >
304+ < span class ="cline-any cline-yes "> 3x</ span >
305+ < span class ="cline-any cline-yes "> 3x</ span >
306+ < span class ="cline-any cline-yes "> 3x</ span >
307+ < span class ="cline-any cline-yes "> 3x</ span >
308+ < span class ="cline-any cline-yes "> 3x</ span >
309+ < span class ="cline-any cline-yes "> 3x</ span >
310+ < span class ="cline-any cline-yes "> 3x</ span >
311+ < span class ="cline-any cline-yes "> 3x</ span >
312+ < span class ="cline-any cline-yes "> 3x</ span >
313+ < span class ="cline-any cline-yes "> 3x</ span >
314+ < span class ="cline-any cline-yes "> 3x</ span >
315+ < span class ="cline-any cline-yes "> 3x</ span >
316+ < span class ="cline-any cline-yes "> 3x</ span >
317+ < span class ="cline-any cline-yes "> 3x</ span >
318+ < span class ="cline-any cline-yes "> 3x</ span >
319+ < span class ="cline-any cline-yes "> 3x</ span >
320+ < span class ="cline-any cline-yes "> 3x</ span >
321+ < span class ="cline-any cline-yes "> 3x</ span >
322+ < span class ="cline-any cline-yes "> 3x</ span >
323+ < span class ="cline-any cline-yes "> 3x</ span >
257324< span class ="cline-any cline-yes "> 3x</ span >
258325< span class ="cline-any cline-yes "> 3x</ span >
259326< span class ="cline-any cline-yes "> 3x</ span >
@@ -283,30 +350,19 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
283350< span class ="cline-any cline-yes "> 44x</ span >
284351< span class ="cline-any cline-yes "> 44x</ span >
285352< span class ="cline-any cline-yes "> 44x</ span >
286- < span class ="cline-any cline-yes "> 22x</ span >
287- < span class ="cline-any cline-yes "> 22x</ span >
288- < span class ="cline-any cline-yes "> 22x</ span >
289- < span class ="cline-any cline-yes "> 22x</ span >
290- < span class ="cline-any cline-yes "> 22x</ span >
291- < span class ="cline-any cline-yes "> 22x</ span >
292- < span class ="cline-any cline-yes "> 22x</ span >
293- < span class ="cline-any cline-yes "> 22x</ span >
294- < span class ="cline-any cline-yes "> 44x</ span >
295- < span class ="cline-any cline-yes "> 32x</ span >
296- < span class ="cline-any cline-yes "> 32x</ span >
297- < span class ="cline-any cline-yes "> 44x</ span >
298- < span class ="cline-any cline-yes "> 12x</ span >
299353< span class ="cline-any cline-yes "> 12x</ span >
300354< span class ="cline-any cline-yes "> 12x</ span >
301355< span class ="cline-any cline-yes "> 44x</ span >
356+ < span class ="cline-any cline-yes "> 32x</ span >
357+ < span class ="cline-any cline-yes "> 32x</ span >
358+ < span class ="cline-any cline-yes "> 32x</ span >
302359< span class ="cline-any cline-yes "> 44x</ span >
303360< span class ="cline-any cline-yes "> 44x</ span >
304361< span class ="cline-any cline-yes "> 4x</ span >
305362< span class ="cline-any cline-yes "> 44x</ span >
306363< span class ="cline-any cline-yes "> 40x</ span >
307364< span class ="cline-any cline-yes "> 40x</ span >
308365< span class ="cline-any cline-yes "> 44x</ span >
309- < span class ="cline-any cline-yes "> 44x</ span >
310366< span class ="cline-any cline-yes "> 4x</ span >
311367< span class ="cline-any cline-yes "> 4x</ span >
312368< span class ="cline-any cline-yes "> 40x</ span >
@@ -315,30 +371,56 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
315371< span class ="cline-any cline-yes "> 24x</ span >
316372< span class ="cline-any cline-yes "> 44x</ span >
317373< span class ="cline-any cline-yes "> 20x</ span >
374+ < span class ="cline-any cline-yes "> 4x</ span >
375+ < span class ="cline-any cline-yes "> 4x</ span >
376+ < span class ="cline-any cline-yes "> 4x</ span >
377+ < span class ="cline-any cline-yes "> 20x</ span >
378+ < span class ="cline-any cline-yes "> 16x</ span >
379+ < span class ="cline-any cline-yes "> 16x</ span >
380+ < span class ="cline-any cline-yes "> 16x</ span >
381+ < span class ="cline-any cline-yes "> 16x</ span >
318382< span class ="cline-any cline-yes "> 20x</ span >
383+ < span class ="cline-any cline-yes "> 20x</ span >
384+ < span class ="cline-any cline-yes "> 20x</ span >
385+ < span class ="cline-any cline-yes "> 49x</ span >
319386< span class ="cline-any cline-yes "> 49x</ span >
387+ < span class ="cline-any cline-no "> </ span >
320388< span class ="cline-any cline-yes "> 49x</ span >
321389< span class ="cline-any cline-yes "> 49x</ span >
322390< span class ="cline-any cline-yes "> 49x</ span >
323391< span class ="cline-any cline-yes "> 151x</ span >
324392< span class ="cline-any cline-yes "> 151x</ span >
325393< span class ="cline-any cline-yes "> 151x</ span >
394+ < span class ="cline-any cline-yes "> 151x</ span >
395+ < span class ="cline-any cline-yes "> 49x</ span >
396+ < span class ="cline-any cline-yes "> 49x</ span >
326397< span class ="cline-any cline-yes "> 49x</ span >
327398< span class ="cline-any cline-yes "> 49x</ span >
328399< span class ="cline-any cline-yes "> 20x</ span >
329400< span class ="cline-any cline-yes "> 20x</ span >
330401< span class ="cline-any cline-yes "> 20x</ span >
331402< span class ="cline-any cline-yes "> 20x</ span >
332403< span class ="cline-any cline-yes "> 20x</ span >
404+ < span class ="cline-any cline-yes "> 44x</ span >
405+ < span class ="cline-any cline-yes "> 16x</ span >
406+ < span class ="cline-any cline-yes "> 16x</ span >
407+ < span class ="cline-any cline-yes "> 16x</ span >
408+ < span class ="cline-any cline-yes "> 44x</ span >
409+ < span class ="cline-any cline-yes "> 4x</ span >
410+ < span class ="cline-any cline-yes "> 4x</ span >
411+ < span class ="cline-any cline-yes "> 4x</ span >
412+ < span class ="cline-any cline-yes "> 4x</ span >
413+ < span class ="cline-any cline-yes "> 20x</ span >
333414< span class ="cline-any cline-yes "> 20x</ span >
334415< span class ="cline-any cline-yes "> 44x</ span >
335416< span class ="cline-any cline-yes "> 66x</ span >
336417< span class ="cline-any cline-yes "> 66x</ span >
337418< span class ="cline-any cline-yes "> 66x</ span >
338- < span class ="cline-any cline-yes "> 66x</ span >
339419< span class ="cline-any cline-yes "> 151x</ span >
340420< span class ="cline-any cline-yes "> 151x</ span >
341421< span class ="cline-any cline-yes "> 151x</ span >
422+ < span class ="cline-any cline-yes "> 151x</ span >
423+ < span class ="cline-any cline-yes "> 66x</ span >
342424< span class ="cline-any cline-yes "> 66x</ span >
343425< span class ="cline-any cline-yes "> 66x</ span >
344426< span class ="cline-any cline-yes "> 66x</ span >
@@ -376,6 +458,32 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
376458var dscal = require( '@stdlib/blas/base/dscal' ).ndarray;
377459
378460
461+ // FUNCTIONS //
462+
463+ /**
464+ * Tests whether a provided string indicates to transpose a matrix.
465+ *
466+ * @private
467+ * @param {string} str - input string
468+ * @returns {boolean} boolean indicating whether to transpose a matrix
469+ *
470+ * @example
471+ * var bool = isTransposed( 'transpose' );
472+ * // returns true
473+ *
474+ * @example
475+ * var bool = isTransposed( 'conjugate-transpose' );
476+ * // returns true
477+ *
478+ * @example
479+ * var bool = isTransposed( 'no-transpose' );
480+ * // returns false
481+ */
482+ function isTransposed( str ) { // TODO: consider moving to a separate helper utility package
483+ return ( str !== 'no-transpose' );
484+ }
485+
486+
379487// MAIN //
380488
381489/**
@@ -414,76 +522,91 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
414522 var xlen;
415523 var ylen;
416524 var tmp;
417- var ix1;
418- var iy1;
419- var sa0;
420- var sa1;
525+ var da0;
526+ var da1;
527+ var ix;
528+ var iy;
529+ var ia;
421530 var i1;
422531 var i0;
423- var oa;
424532
425- // Note on variable naming convention: sa#, ix #, i# where # corresponds to the loop number, with `0` being the innermost loop...
533+ // Note on variable naming convention: da #, i# where # corresponds to the loop number, with `0` being the innermost loop...
426534
427535 isrm = isRowMajor( [ strideA1, strideA2 ] );
428- if ( isrm ) {
429- // For row-major matrices, the last dimension has the fastest changing index...
430- sa0 = strideA2; // stride for innermost loop
431- sa1 = strideA1; // stride for outermost loop
432- } else { // isColMajor
433- // For column-major matrices, the first dimension has the fastest changing index...
434- sa0 = strideA1; // stride for innermost loop
435- sa1 = strideA2; // stride for outermost loop
436- }
437- if ( trans === 'no-transpose' ) {
438- xlen = N;
439- ylen = M;
440- } else {
536+ if ( isTransposed( trans ) ) {
441537 xlen = M;
442538 ylen = N;
539+ } else {
540+ xlen = N;
541+ ylen = M;
443542 }
444543 // y = beta*y
445- if ( beta !== 1.0 ) {
446- if ( beta === 0.0 ) {
447- dfill( ylen, 0.0, y, strideY, offsetY );
448- } else {
449- dscal( ylen, beta, y, strideY, offsetY );
450- }
544+ if ( beta === 0.0 ) {
545+ dfill( ylen, 0.0, y, strideY, offsetY );
546+ } else if ( beta !== 1.0 ) {
547+ dscal( ylen, beta, y, strideY, offsetY );
451548 }
452549 if ( alpha === 0.0 ) {
453550 return y;
454551 }
455552 // Form: y = α*A*x + y
456553 if (
457- ( !isrm && trans === 'no-transpose' ) ||
458- ( isrm && trans !== 'no-transpose' )
554+ ( !isrm && !isTransposed( trans ) ) ||
555+ ( isrm && isTransposed( trans ) )
459556 ) {
460- ix1 = offsetX;
557+ if ( isrm ) {
558+ // For row-major matrices, the last dimension has the fastest changing index...
559+ da0 = strideA2; // offset increment for innermost loop
560+ da1 = strideA1 - ( ylen*strideA2 ); // offset increment for outermost loop
561+ } else { // isColMajor
562+ // For column-major matrices, the first dimension has the fastest changing index...
563+ da0 = strideA1; // offset increment for innermost loop
564+ da1 = strideA2 - ( ylen*strideA1 ); // offset increment for outermost loop
565+ }
566+ ia = offsetA;
567+ ix = offsetX;
461568 for ( i1 = 0; i1 < xlen; i1++ ) {
462- tmp = alpha * x[ ix1 ];
463- oa = offsetA + (sa1*i1);
464- iy1 = offsetY;
465- for ( i0 = 0; i0 < ylen; i0++ ) {
466- y[ iy1 ] += A[ oa+(sa0*i0) ] * tmp;
467- iy1 += strideY;
569+ tmp = alpha * x[ ix ];
570+ if ( tmp === 0.0 ) < span class ="branch-0 cbranch-no " title ="branch not covered " > {</ span >
571+ < span class ="cstat-no " title ="statement not covered " > ia += da0 * ylen;</ span >
572+ } else {
573+ iy = offsetY;
574+ for ( i0 = 0; i0 < ylen; i0++ ) {
575+ y[ iy ] += A[ ia ] * tmp;
576+ iy += strideY;
577+ ia += da0;
578+ }
468579 }
469- ix1 += strideX;
580+ ix += strideX;
581+ ia += da1;
470582 }
471583 return y;
472584 }
473585 // Form: y = α*A^T*x + y
474586
475- // ( !isrm && trans !== 'no-transpose' ) || ( isrm && trans === 'no-transpose' )
476- iy1 = offsetY;
587+ // ( !isrm && isTransposed( trans ) ) || ( isrm && !isTransposed( trans ) )
588+ if ( isrm ) {
589+ // For row-major matrices, the last dimension has the fastest changing index...
590+ da0 = strideA2; // offset increment for innermost loop
591+ da1 = strideA1 - ( xlen*strideA2 ); // offset increment for outermost loop
592+ } else { // isColMajor
593+ // For column-major matrices, the first dimension has the fastest changing index...
594+ da0 = strideA1; // offset increment for innermost loop
595+ da1 = strideA2 - ( xlen*strideA1 ); // offset increment for outermost loop
596+ }
597+ ia = offsetA;
598+ iy = offsetY;
477599 for ( i1 = 0; i1 < ylen; i1++ ) {
478600 tmp = 0.0;
479- ix1 = offsetX;
480- oa = offsetA + (sa1*i1);
601+ ix = offsetX;
481602 for ( i0 = 0; i0 < xlen; i0++ ) {
482- tmp += A[ oa+(sa0*i0) ] * x[ ix1 ];
483- ix1 += strideX;
603+ tmp += A[ ia ] * x[ ix ];
604+ ix += strideX;
605+ ia += da0;
484606 }
485- y[ iy1 ] += alpha * tmp;
486- iy1 += strideY;
607+ y[ iy ] += alpha * tmp;
608+ iy += strideY;
609+ ia += da1;
487610 }
488611 return y;
489612}
@@ -499,7 +622,7 @@ <h1><a href="../../../../index.html">All files</a> / <a href="index.html">blas/b
499622 < div class ='footer quiet pad2 space-top1 center small '>
500623 Code coverage generated by
501624 < a href ="https://istanbul.js.org/ " target ="_blank " rel ="noopener noreferrer "> istanbul</ a >
502- at 2025-06-28T16:28:10.574Z
625+ at 2025-06-29T10:49:20.753Z
503626 </ div >
504627 < script src ="../../../../prettify.js "> </ script >
505628 < script >
0 commit comments