@@ -32,7 +32,7 @@ <h1><a href="index.html">All files</a> main.js</h1>
3232 < div class ='fl pad1y space-right2 '>
3333 < span class ="strong "> 100% </ span >
3434 < span class ="quiet "> Branches</ span >
35- < span class ='fraction '> 20/20 </ span >
35+ < span class ='fraction '> 21/21 </ span >
3636 </ div >
3737
3838
@@ -270,86 +270,86 @@ <h1><a href="index.html">All files</a> main.js</h1>
270270< span class ="cline-any cline-yes "> 1x</ span >
271271< span class ="cline-any cline-yes "> 1x</ span >
272272< span class ="cline-any cline-yes "> 1x</ span >
273- < span class ="cline-any cline-yes "> 29x</ span >
274- < span class ="cline-any cline-yes "> 29x</ span >
275- < span class ="cline-any cline-yes "> 29x</ span >
276- < span class ="cline-any cline-yes "> 29x</ span >
277- < span class ="cline-any cline-yes "> 29x</ span >
278- < span class ="cline-any cline-yes "> 29x</ span >
279- < span class ="cline-any cline-yes "> 29x</ span >
280- < span class ="cline-any cline-yes "> 29x</ span >
281- < span class ="cline-any cline-yes "> 29x</ span >
282- < span class ="cline-any cline-yes "> 29x</ span >
283- < span class ="cline-any cline-yes "> 29x</ span >
284- < span class ="cline-any cline-yes "> 29x</ span >
285- < span class ="cline-any cline-yes "> 29x</ span >
286- < span class ="cline-any cline-yes "> 29x</ span >
287- < span class ="cline-any cline-yes "> 29x</ span >
288- < span class ="cline-any cline-yes "> 29x</ span >
289- < span class ="cline-any cline-yes "> 29x</ span >
290- < span class ="cline-any cline-yes "> 29x</ span >
291- < span class ="cline-any cline-yes "> 29x</ span >
292- < span class ="cline-any cline-yes "> 29x</ span >
293- < span class ="cline-any cline-yes "> 29x</ span >
294- < span class ="cline-any cline-yes "> 29x</ span >
295- < span class ="cline-any cline-yes "> 29x</ span >
296- < span class ="cline-any cline-yes "> 29x</ span >
297- < span class ="cline-any cline-yes "> 29x</ span >
298- < span class ="cline-any cline-yes "> 29x</ span >
299- < span class ="cline-any cline-yes "> 29x</ span >
300- < span class ="cline-any cline-yes "> 29x</ span >
301- < span class ="cline-any cline-yes "> 29x</ span >
302- < span class ="cline-any cline-yes "> 29x</ span >
303- < span class ="cline-any cline-yes "> 29x</ span >
304- < span class ="cline-any cline-yes "> 29x</ span >
305- < span class ="cline-any cline-yes "> 29x</ span >
306- < span class ="cline-any cline-yes "> 29x</ span >
307- < span class ="cline-any cline-yes "> 29x</ span >
308- < span class ="cline-any cline-yes "> 29x</ span >
309- < span class ="cline-any cline-yes "> 29x</ span >
310- < span class ="cline-any cline-yes "> 29x</ span >
311- < span class ="cline-any cline-yes "> 29x</ span >
312- < span class ="cline-any cline-yes "> 6x</ span >
313- < span class ="cline-any cline-yes "> 29x</ span >
314- < span class ="cline-any cline-yes "> 22x</ span >
315- < span class ="cline-any cline-yes "> 23x</ span >
316- < span class ="cline-any cline-yes "> 1x</ span >
317273< span class ="cline-any cline-yes "> 1x</ span >
318- < span class ="cline-any cline-yes "> 29x</ span >
319- < span class ="cline-any cline-yes "> 29x</ span >
320- < span class ="cline-any cline-yes "> 29x</ span >
321- < span class ="cline-any cline-yes "> 29x</ span >
322- < span class ="cline-any cline-yes "> 29x</ span >
323- < span class ="cline-any cline-yes "> 65x</ span >
324- < span class ="cline-any cline-yes "> 65x</ span >
325- < span class ="cline-any cline-yes "> 65x</ span >
326- < span class ="cline-any cline-yes "> 65x</ span >
327- < span class ="cline-any cline-yes "> 65x</ span >
328- < span class ="cline-any cline-yes "> 49x</ span >
329- < span class ="cline-any cline-yes "> 49x</ span >
330- < span class ="cline-any cline-yes "> 49x</ span >
331- < span class ="cline-any cline-yes "> 65x</ span >
332- < span class ="cline-any cline-yes "> 16x</ span >
274+ < span class ="cline-any cline-yes "> 28x</ span >
275+ < span class ="cline-any cline-yes "> 28x</ span >
276+ < span class ="cline-any cline-yes "> 28x</ span >
277+ < span class ="cline-any cline-yes "> 28x</ span >
278+ < span class ="cline-any cline-yes "> 28x</ span >
279+ < span class ="cline-any cline-yes "> 28x</ span >
280+ < span class ="cline-any cline-yes "> 28x</ span >
281+ < span class ="cline-any cline-yes "> 28x</ span >
282+ < span class ="cline-any cline-yes "> 28x</ span >
283+ < span class ="cline-any cline-yes "> 28x</ span >
284+ < span class ="cline-any cline-yes "> 28x</ span >
285+ < span class ="cline-any cline-yes "> 28x</ span >
286+ < span class ="cline-any cline-yes "> 28x</ span >
287+ < span class ="cline-any cline-yes "> 28x</ span >
288+ < span class ="cline-any cline-yes "> 28x</ span >
289+ < span class ="cline-any cline-yes "> 28x</ span >
290+ < span class ="cline-any cline-yes "> 28x</ span >
291+ < span class ="cline-any cline-yes "> 28x</ span >
292+ < span class ="cline-any cline-yes "> 28x</ span >
293+ < span class ="cline-any cline-yes "> 28x</ span >
294+ < span class ="cline-any cline-yes "> 28x</ span >
295+ < span class ="cline-any cline-yes "> 28x</ span >
296+ < span class ="cline-any cline-yes "> 28x</ span >
297+ < span class ="cline-any cline-yes "> 28x</ span >
298+ < span class ="cline-any cline-yes "> 28x</ span >
299+ < span class ="cline-any cline-yes "> 28x</ span >
300+ < span class ="cline-any cline-yes "> 28x</ span >
301+ < span class ="cline-any cline-yes "> 28x</ span >
302+ < span class ="cline-any cline-yes "> 28x</ span >
303+ < span class ="cline-any cline-yes "> 28x</ 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 "> 25x</ span >
307+ < span class ="cline-any cline-yes "> 25x</ span >
308+ < span class ="cline-any cline-yes "> 25x</ span >
309+ < span class ="cline-any cline-yes "> 25x</ span >
310+ < span class ="cline-any cline-yes "> 28x</ span >
311+ < span class ="cline-any cline-yes "> 9x</ span >
312+ < span class ="cline-any cline-yes "> 9x</ span >
313+ < span class ="cline-any cline-yes "> 28x</ span >
314+ < span class ="cline-any cline-yes "> 12x</ span >
333315< span class ="cline-any cline-yes "> 16x</ span >
334- < span class ="cline-any cline-yes "> 16x</ span >
335- < span class ="cline-any cline-yes "> 16x</ span >
336- < span class ="cline-any cline-yes "> 65x</ span >
337- < span class ="cline-any cline-yes "> 29x</ span >
338- < span class ="cline-any cline-yes "> 27x</ span >
339- < span class ="cline-any cline-yes "> 27x</ span >
340- < span class ="cline-any cline-yes "> 29x</ span >
316+ < span class ="cline-any cline-yes "> 4x</ span >
317+ < span class ="cline-any cline-yes "> 4x</ span >
318+ < span class ="cline-any cline-yes "> 25x</ span >
319+ < span class ="cline-any cline-yes "> 25x</ span >
320+ < span class ="cline-any cline-yes "> 25x</ span >
321+ < span class ="cline-any cline-yes "> 25x</ span >
322+ < span class ="cline-any cline-yes "> 28x</ span >
323+ < span class ="cline-any cline-yes "> 53x</ span >
324+ < span class ="cline-any cline-yes "> 53x</ span >
325+ < span class ="cline-any cline-yes "> 53x</ span >
326+ < span class ="cline-any cline-yes "> 53x</ span >
327+ < span class ="cline-any cline-yes "> 53x</ span >
328+ < span class ="cline-any cline-yes "> 43x</ span >
329+ < span class ="cline-any cline-yes "> 43x</ span >
330+ < span class ="cline-any cline-yes "> 43x</ span >
331+ < span class ="cline-any cline-yes "> 53x</ span >
332+ < span class ="cline-any cline-yes "> 10x</ span >
333+ < span class ="cline-any cline-yes "> 10x</ span >
334+ < span class ="cline-any cline-yes "> 10x</ span >
335+ < span class ="cline-any cline-yes "> 10x</ span >
336+ < span class ="cline-any cline-yes "> 53x</ span >
337+ < span class ="cline-any cline-yes "> 28x</ span >
338+ < span class ="cline-any cline-yes "> 23x</ span >
339+ < span class ="cline-any cline-yes "> 23x</ span >
340+ < span class ="cline-any cline-yes "> 28x</ span >
341341< span class ="cline-any cline-yes "> 2x</ span >
342342< span class ="cline-any cline-yes "> 2x</ span >
343343< span class ="cline-any cline-yes "> 2x</ span >
344- < span class ="cline-any cline-yes "> 29x </ span >
345- < span class ="cline-any cline-yes "> 29x </ span >
346- < span class ="cline-any cline-yes "> 29x </ span >
347- < span class ="cline-any cline-yes "> 29x </ span >
348- < span class ="cline-any cline-yes "> 29x </ span >
349- < span class ="cline-any cline-yes "> 29x </ span >
350- < span class ="cline-any cline-yes "> 29x </ span >
351- < span class ="cline-any cline-yes "> 29x </ span >
352- < span class ="cline-any cline-yes "> 29x </ span >
344+ < span class ="cline-any cline-yes "> 25x </ span >
345+ < span class ="cline-any cline-yes "> 25x </ span >
346+ < span class ="cline-any cline-yes "> 25x </ span >
347+ < span class ="cline-any cline-yes "> 25x </ span >
348+ < span class ="cline-any cline-yes "> 25x </ span >
349+ < span class ="cline-any cline-yes "> 25x </ span >
350+ < span class ="cline-any cline-yes "> 25x </ span >
351+ < span class ="cline-any cline-yes "> 25x </ span >
352+ < span class ="cline-any cline-yes "> 28x </ span >
353353< span class ="cline-any cline-yes "> 1x</ span >
354354< span class ="cline-any cline-yes "> 1x</ span >
355355< span class ="cline-any cline-yes "> 1x</ span >
@@ -389,6 +389,7 @@ <h1><a href="index.html">All files</a> main.js</h1>
389389var getOrder = require( '@stdlib/ndarray/base/order' );
390390var getDType = require( '@stdlib/ndarray/base/dtype' );
391391var getData = require( '@stdlib/ndarray/base/data-buffer' );
392+ var format = require( '@stdlib/string/format' );
392393var zeros = require( '@stdlib/array/base/zeros' );
393394
394395
@@ -399,12 +400,12 @@ <h1><a href="index.html">All files</a> main.js</h1>
399400*
400401* ## Notes
401402*
402- * - When the number of repetitions is less than the number of input dimensions, the number of repetitions is left-padded with ones until the number of repetitions matches the number of input dimensions. When the number of repetitions exceeds the number of input dimensions, the input array is treated as if singleton dimensions were prepended.
403- * - The output array has rank equal to the greater of the input array rank and the number of repetitions.
404- * - The function always returns a new ndarray having a newly allocated data buffer.
403+ * - The number of repetitions must have at least as many elements as the number of input dimensions. When the number of repetitions exceeds the number of input dimensions, the input array is treated as if singleton dimensions were prepended.
404+ * - The function always copies data to a new ndarray.
405405*
406406* @param {ndarray} x - input array
407407* @param {NonNegativeIntegerArray} reps - number of repetitions along each dimension
408+ * @throws {RangeError} second argument must have at least as many elements as the number of input dimensions
408409* @returns {ndarray} output array
409410*
410411* @example
@@ -423,64 +424,63 @@ <h1><a href="index.html">All files</a> main.js</h1>
423424 var sho;
424425 var shi;
425426 var sto;
426- var ord;
427427 var buf;
428428 var out;
429- var Dr;
430429 var Ds;
431430 var si;
432431 var sx;
433432 var v1;
434433 var v2;
435- var K;
436434 var L;
437435 var M;
438436 var N;
439- var r ;
437+ var o ;
440438 var s;
441439 var t;
442440 var i;
441+ var j;
443442
444443 shx = getShape( x, false );
445444 sx = getStrides( x, false );
446445 dtype = getDType( x );
447446 N = reps.length;
448447 M = shx.length;
449448
450- // Determine the output rank, which is the greater of the number of input dimensions and the number of repetitions. Compute the implicit left-padding amounts for the repetitions and input shape, respectively...
451- K = ( N > M ) ? N : M;
452- Dr = K - N;
453- Ds = K - M;
449+ if ( N < M ) {
450+ throw new RangeError( format( 'invalid argument. Second argument must have at least as many elements as the number of dimensions of the first argument. Number of input dimensions: `%u`. Number of repetitions: `%u`.', M, N ) );
451+ }
452+ // Compute the implicit left-padding amount for the input shape:
453+ Ds = N - M;
454454
455- // Infer the storage order from the input strides, falling back to the stated order when the input is non-contiguous...
456- ord = strides2order( sx );
457- if ( ord === 2 ) {
458- order = 'column-major' ;
459- } else if ( ord === 1 || ord === 3 ) {
455+ o = strides2order( sx );
456+ if ( o === 0 || o === 3 ) {
457+ // Fallback to stated layout when unable to infer the underlying physical layout:
458+ order = getOrder( x ) ;
459+ } else if ( o === 1 ) {
460460 order = 'row-major';
461461 } else {
462- order = getOrder( x ) ;
462+ order = 'column-major' ;
463463 }
464- // Compute an interleaved 2K -D shape and strides for broadcasting the input, along with the final K -D output shape. By inserting a repetition axis next to each original axis, a contiguous 2K -D buffer can be reinterpreted as the K -D tiled output without an additional copy...
465- shi = zeros( 2*K );
466- si = zeros( 2*K );
467- sho = zeros( K );
468- for ( i = 0; i < K ; i++ ) {
469- r = ( i < Dr ) ? 1 : reps[ i - Dr ] ;
470- s = ( i < Ds ) ? 1 : shx[ i - Ds ];
471- t = ( i < Ds ) ? 0 : sx[ i - Ds ];
472- sho[ i ] = r * s;
464+ // Compute an interleaved 2N -D shape and strides for broadcasting the input, along with the final N -D output shape. By inserting a repetition axis next to each original axis, a contiguous 2N -D buffer can be reinterpreted as the N -D tiled output without an additional copy...
465+ shi = zeros( 2*N );
466+ si = zeros( 2*N );
467+ sho = zeros( N );
468+ for ( i = 0; i < N ; i++ ) {
469+ j = i - Ds ;
470+ s = ( j < 0 ) ? 1 : shx[ j ];
471+ t = ( j < 0 ) ? 0 : sx[ j ];
472+ sho[ i ] = reps[ i ] * s;
473473 if ( order === 'row-major' ) {
474- shi[ 2*i ] = r ;
474+ shi[ 2*i ] = reps[ i ] ;
475475 shi[ (2*i)+1 ] = s;
476476 si[ (2*i)+1 ] = t;
477477 } else {
478478 shi[ 2*i ] = s;
479- shi[ (2*i)+1 ] = r ;
479+ shi[ (2*i)+1 ] = reps[ i ] ;
480480 si[ 2*i ] = t;
481481 }
482482 }
483- if ( K > 0 ) {
483+ if ( N > 0 ) {
484484 L = numel( sho );
485485 sto = shape2strides( sho, order );
486486 } else {
@@ -490,7 +490,7 @@ <h1><a href="index.html">All files</a> main.js</h1>
490490 buf = buffer( dtype, L );
491491 out = new x.constructor( dtype, buf, sho, sto, 0, order );
492492
493- // Assign the broadcasted input to a 2K -D view over the output data buffer...
493+ // Assign the broadcasted input to a 2N -D view over the output data buffer...
494494 v1 = ndarray( dtype, getData( x ), shi, si, getOffset( x ), order );
495495 v2 = ndarray( dtype, buf, shi, shape2strides( shi, order ), 0, order );
496496 assign( [ v1, v2 ] );
@@ -508,7 +508,7 @@ <h1><a href="index.html">All files</a> main.js</h1>
508508 < div class ='footer quiet pad2 space-top1 center small '>
509509 Code coverage generated by
510510 < a href ="https://istanbul.js.org/ " target ="_blank " rel ="noopener noreferrer "> istanbul</ a >
511- at 2026-04-17T08 :08:49.434Z
511+ at 2026-04-17T12 :08:53.002Z
512512 </ div >
513513 < script src ="prettify.js "> </ script >
514514 < script >
0 commit comments