All files main.js

100% Statements 107/107
100% Branches 10/10
100% Functions 1/1
100% Lines 107/107

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 1081x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 1x 1x 26x 3x 3x 22x 22x 22x 22x 26x 4x 4x 26x 4x 4x 14x 14x 14x 14x 14x 14x 14x 14x 26x 1x 1x 1x 1x 1x  
/**
* @license Apache-2.0
*
* Copyright (c) 2026 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
 
'use strict';
 
// MODULES //
 
var toUniqueNormalizedIndices = require( '@stdlib/ndarray/base/to-unique-normalized-indices' );
var getData = require( '@stdlib/ndarray/base/data-buffer' );
var getStrides = require( '@stdlib/ndarray/base/strides' );
var getOffset = require( '@stdlib/ndarray/base/offset' );
var take = require( '@stdlib/array/base/take-indexed' );
var getDType = require( '@stdlib/ndarray/base/dtype' );
var getShape = require( '@stdlib/ndarray/base/shape' );
var getOrder = require( '@stdlib/ndarray/base/order' );
var format = require( '@stdlib/string/format' );
var join = require( '@stdlib/array/base/join' );
 
 
// MAIN //
 
/**
* Permutes the dimensions of an input ndarray according to specified dimension indices.
*
* ## Notes
*
* -   Operating on views with permuted dimensions can result in performance degradation due to poor cache locality, especially for reductions and operations performed over one or more dimensions on larger arrays.
*
* @param {ndarray} x - input array
* @param {IntegerArray} dims - dimension indices defining the new dimension order
* @param {boolean} writable - boolean indicating whether the returned ndarray should be writable
* @throws {RangeError} input ndarray must have one or more dimensions
* @throws {RangeError} must provide dimension indices equal to the number of dimensions in the input ndarray
* @throws {RangeError} must provide valid dimension indices
* @throws {Error} must provide unique dimension indices
* @returns {ndarray} ndarray view
*
* @example
* var array = require( '@stdlib/ndarray/array' );
* var getData = require( '@stdlib/ndarray/data-buffer' );
* var permuteDimensions = require( '@stdlib/ndarray/base/permute-dimensions' );
*
* var x = array( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ] );
* // returns <ndarray>[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
*
* var y = permuteDimensions( x, [ 1, 0 ], false );
* // returns <ndarray>[ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ]
*
* var bool = ( getData( x ) === getData( y ) );
* // returns true
*/
function permuteDimensions( x, dims, writable ) {
	var st1;
	var sh1;
	var sh;
	var st;
	var d;
	var N;
 
	sh = getShape( x, true );
	N = sh.length;
 
	if ( N === 0 ) {
		throw new RangeError( format( 'invalid argument. First argument must be an ndarray having one or more dimensions. Number of dimensions: %d.', N ) );
	}
	if ( dims.length !== N ) {
		throw new RangeError( format( 'invalid argument. Must provide dimension indices equal to the number of dimensions in the input ndarray. Number of dimensions: %d. Number of dimension indices: %d.', N, dims.length ) );
	}
	st = getStrides( x, true );
 
	// Resolve and normalize dimension indices...
	d = toUniqueNormalizedIndices( dims, N-1 );
	if ( d === null ) {
		throw new RangeError( format( 'invalid argument. Specified dimension index is out-of-bounds. Must be on the interval: [-%u, %u]. Value: `[%s]`.', N, N-1, join( dims, ', ' ) ) );
	}
	if ( d.length !== dims.length ) {
		throw new Error( format( 'invalid argument. Must provide unique dimension indices. Value: `[%s]`.', join( dims, ', ' ) ) );
	}
 
	// Permute shape and strides...
	sh1 = take( sh, d );
	st1 = take( st, d );
 
	return new x.constructor( getDType( x ), getData( x ), sh1, st1, getOffset( x ), getOrder( x ), { // eslint-disable-line max-len
		'readonly': !writable
	});
}
 
 
// EXPORTS //
 
module.exports = permuteDimensions;