Skip to content

Commit 1c40ca5

Browse files
committed
Auto-generated commit
1 parent 7616052 commit 1c40ca5

File tree

5 files changed

+243
-14
lines changed

5 files changed

+243
-14
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,8 @@
593593

594594
### Bug Fixes
595595

596+
- [`5795b39`](https://github.com/stdlib-js/stdlib/commit/5795b39e0f0f1d7ccae3ea1ed43809b7ff78b77d) - determine layout based on physical layout
597+
- [`c20c5d6`](https://github.com/stdlib-js/stdlib/commit/c20c5d602a0f897e86d7fbd83180fec84c535984) - determine layout based on physical layout
596598
- [`e47ee45`](https://github.com/stdlib-js/stdlib/commit/e47ee4551cf19ad584361fb80c9eed84ff9ea792) - resolve bugs, docs, and JSDoc type errors [(#11337)](https://github.com/stdlib-js/stdlib/pull/11337)
597599
- [`d4710cd`](https://github.com/stdlib-js/stdlib/commit/d4710cd4279abf2e1e8383ce0e1bfbfadf4b609a) - improve type specificity with overloads
598600
- [`762f410`](https://github.com/stdlib-js/stdlib/commit/762f410098b29afa3823ab1191553101db0dcead) - correct grammar in ndarray type test comments [(#11154)](https://github.com/stdlib-js/stdlib/pull/11154)
@@ -836,6 +838,8 @@ A total of 49 issues were closed in this release:
836838

837839
<details>
838840

841+
- [`5795b39`](https://github.com/stdlib-js/stdlib/commit/5795b39e0f0f1d7ccae3ea1ed43809b7ff78b77d) - **fix:** determine layout based on physical layout _(by Athan Reines)_
842+
- [`c20c5d6`](https://github.com/stdlib-js/stdlib/commit/c20c5d602a0f897e86d7fbd83180fec84c535984) - **fix:** determine layout based on physical layout _(by Athan Reines)_
839843
- [`ef49a3e`](https://github.com/stdlib-js/stdlib/commit/ef49a3e72514684846fcf77b42c084e080ad5902) - **feat:** add `removeSingletonDimensions` to namespace _(by Athan Reines)_
840844
- [`c7633e9`](https://github.com/stdlib-js/stdlib/commit/c7633e9c62c55e333ad23d7f240fcab45fd25d98) - **feat:** add `ndarray/remove-singleton-dimensions` [(#10807)](https://github.com/stdlib-js/stdlib/pull/10807) _(by Muhammad Haris, stdlib-bot)_
841845
- [`843db97`](https://github.com/stdlib-js/stdlib/commit/843db97a005833d8362c60da9a0326eca5aad1b8) - **docs:** update namespace table of contents [(#11358)](https://github.com/stdlib-js/stdlib/pull/11358) _(by stdlib-bot)_

base/expand-dimensions/lib/main.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
// MODULES //
2222

23-
var isRowMajor = require( './../../../base/assert/is-row-major-string' );
23+
var isRowMajorString = require( './../../../base/assert/is-row-major-string' );
2424
var normalizeIndex = require( './../../../base/normalize-index' );
25+
var strides2order = require( './../../../base/strides2order' );
2526
var getDType = require( './../../../base/dtype' );
2627
var getShape = require( './../../../base/shape' );
2728
var getStrides = require( './../../../base/strides' );
@@ -63,14 +64,21 @@ function expandDimensions( x, dim, writable ) {
6364
var sh;
6465
var st;
6566
var d;
67+
var o;
6668
var N;
6769
var i;
6870

6971
sh = getShape( x, false );
7072
st = getStrides( x, false );
7173
ord = getOrder( x );
7274

73-
isrm = isRowMajor( ord );
75+
o = strides2order( st );
76+
if ( o === 0 || o === 3 ) {
77+
// Fallback to stated layout when unable to infer the underlying physical layout:
78+
isrm = isRowMajorString( ord );
79+
} else {
80+
isrm = ( o === 1 );
81+
}
7482
N = sh.length;
7583

7684
strides = [];

base/expand-dimensions/test/test.js

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,30 @@ tape( 'the function throws an error if provided an invalid second argument', fun
6464
}
6565
});
6666

67-
tape( 'the function prepends singleton dimensions', function test( t ) {
67+
tape( 'the function prepends singleton dimensions (1d)', function test( t ) {
68+
var x;
69+
var y;
70+
71+
x = array( [ 1, 2, 3, 4 ] );
72+
73+
y = expandDimensions( x, 0, false );
74+
75+
t.notEqual( y, x, 'returns expected value' );
76+
t.deepEqual( getShape( y ), [ 1, 4 ], 'returns expected value' );
77+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
78+
t.strictEqual( isReadOnly( y ), true, 'returns expected value' );
79+
80+
y = expandDimensions( x, 0, true );
81+
82+
t.notEqual( y, x, 'returns expected value' );
83+
t.deepEqual( getShape( y ), [ 1, 4 ], 'returns expected value' );
84+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
85+
t.strictEqual( isReadOnly( y ), false, 'returns expected value' );
86+
87+
t.end();
88+
});
89+
90+
tape( 'the function prepends singleton dimensions (2d)', function test( t ) {
6891
var x;
6992
var y;
7093

@@ -110,7 +133,30 @@ tape( 'the function prepends singleton dimensions (negative index)', function te
110133
t.end();
111134
});
112135

113-
tape( 'the function appends singleton dimensions', function test( t ) {
136+
tape( 'the function appends singleton dimensions (1d)', function test( t ) {
137+
var x;
138+
var y;
139+
140+
x = array( [ 1, 2, 3, 4 ] );
141+
142+
y = expandDimensions( x, ndims( x ), false );
143+
144+
t.notEqual( y, x, 'returns expected value' );
145+
t.deepEqual( getShape( y ), [ 4, 1 ], 'returns expected value' );
146+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
147+
t.strictEqual( isReadOnly( y ), true, 'returns expected value' );
148+
149+
y = expandDimensions( x, ndims( x ), true );
150+
151+
t.notEqual( y, x, 'returns expected value' );
152+
t.deepEqual( getShape( y ), [ 4, 1 ], 'returns expected value' );
153+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
154+
t.strictEqual( isReadOnly( y ), false, 'returns expected value' );
155+
156+
t.end();
157+
});
158+
159+
tape( 'the function appends singleton dimensions (2d)', function test( t ) {
114160
var x;
115161
var y;
116162

@@ -214,6 +260,15 @@ tape( 'the function prepends singleton dimensions (base; row-major)', function t
214260
t.deepEqual( getStrides( y ), [ 4, 2, 1 ], 'returns expected value' );
215261
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
216262

263+
// Transposed:
264+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 1, 2 ], 0, 'row-major' );
265+
y = expandDimensions( x, 0, false );
266+
267+
t.notEqual( y, x, 'returns expected value' );
268+
t.deepEqual( getShape( y ), [ 1, 2, 2 ], 'returns expected value' );
269+
t.deepEqual( getStrides( y ), [ 1, 1, 2 ], 'returns expected value' );
270+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
271+
217272
t.end();
218273
});
219274

@@ -244,6 +299,15 @@ tape( 'the function prepends singleton dimensions (base; column-major)', functio
244299
t.deepEqual( getStrides( y ), [ 1, 1, 2 ], 'returns expected value' );
245300
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
246301

302+
// Transposed:
303+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 2, 1 ], 0, 'column-major' );
304+
y = expandDimensions( x, 0, false );
305+
306+
t.notEqual( y, x, 'returns expected value' );
307+
t.deepEqual( getShape( y ), [ 1, 2, 2 ], 'returns expected value' );
308+
t.deepEqual( getStrides( y ), [ 4, 2, 1 ], 'returns expected value' );
309+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
310+
247311
t.end();
248312
});
249313

@@ -274,6 +338,15 @@ tape( 'the function appends singleton dimensions (base; row-major)', function te
274338
t.deepEqual( getStrides( y ), [ 2, 1, 1 ], 'returns expected value' );
275339
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
276340

341+
// Transposed:
342+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 1, 2 ], 0, 'row-major' );
343+
y = expandDimensions( x, ndims( x ), false );
344+
345+
t.notEqual( y, x, 'returns expected value' );
346+
t.deepEqual( getShape( y ), [ 2, 2, 1 ], 'returns expected value' );
347+
t.deepEqual( getStrides( y ), [ 1, 2, 4 ], 'returns expected value' );
348+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
349+
277350
t.end();
278351
});
279352

@@ -304,6 +377,15 @@ tape( 'the function appends singleton dimensions (base; column-major)', function
304377
t.deepEqual( getStrides( y ), [ 1, 2, 4 ], 'returns expected value' );
305378
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
306379

380+
// Transposed:
381+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 2, 1 ], 0, 'column-major' );
382+
y = expandDimensions( x, ndims( x ), false );
383+
384+
t.notEqual( y, x, 'returns expected value' );
385+
t.deepEqual( getShape( y ), [ 2, 2, 1 ], 'returns expected value' );
386+
t.deepEqual( getStrides( y ), [ 2, 1, 1 ], 'returns expected value' );
387+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
388+
307389
t.end();
308390
});
309391

@@ -334,6 +416,15 @@ tape( 'the function inserts singleton dimensions (base; row-major)', function te
334416
t.deepEqual( getStrides( y ), [ 2, 2, 1 ], 'returns expected value' );
335417
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
336418

419+
// Transposed:
420+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 1, 2 ], 0, 'row-major' );
421+
y = expandDimensions( x, 1, false );
422+
423+
t.notEqual( y, x, 'returns expected value' );
424+
t.deepEqual( getShape( y ), [ 2, 1, 2 ], 'returns expected value' );
425+
t.deepEqual( getStrides( y ), [ 1, 2, 2 ], 'returns expected value' );
426+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
427+
337428
t.end();
338429
});
339430

@@ -364,6 +455,15 @@ tape( 'the function inserts singleton dimensions (base; column-major)', function
364455
t.deepEqual( getStrides( y ), [ 1, 2, 2 ], 'returns expected value' );
365456
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
366457

458+
// Transposed:
459+
x = ndarray( 'generic', [ 1, 2, 3, 4 ], [ 2, 2 ], [ 2, 1 ], 0, 'column-major' );
460+
y = expandDimensions( x, 1, false );
461+
462+
t.notEqual( y, x, 'returns expected value' );
463+
t.deepEqual( getShape( y ), [ 2, 1, 2 ], 'returns expected value' );
464+
t.deepEqual( getStrides( y ), [ 2, 2, 1 ], 'returns expected value' );
465+
t.strictEqual( getData( y ), getData( x ), 'returns expected value' );
466+
367467
t.end();
368468
});
369469

base/spread-dimensions/lib/main.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020

2121
// MODULES //
2222

23-
var isRowMajor = require( './../../../base/assert/is-row-major-string' );
23+
var isRowMajorString = require( './../../../base/assert/is-row-major-string' );
2424
var isSortedAscending = require( '@stdlib/array/base/assert/is-sorted-ascending' );
2525
var toNormalizedIndices = require( './../../../base/to-unique-normalized-indices' );
26+
var strides2order = require( './../../../base/strides2order' );
2627
var getDType = require( './../../../base/dtype' );
2728
var getShape = require( './../../../base/shape' );
2829
var getStrides = require( './../../../base/strides' );
@@ -91,19 +92,29 @@ function spreadDimensions( ndims, x, dims, writable ) {
9192
var ord;
9293
var sh;
9394
var st;
95+
var N;
9496
var d;
9597
var S;
9698
var s;
99+
var o;
97100
var i;
98101
var j;
99102

100103
sh = getShape( x, false );
101104
st = getStrides( x, false );
102105
ord = getOrder( x );
103-
isrm = isRowMajor( ord );
104106

105-
if ( sh.length > ndims ) {
106-
throw new RangeError( format( 'invalid argument. First argument must be greater than or equal to the number of dimensions in the input ndarray. Number of dimensions: %d. Value: `%d`.', sh.length, ndims ) );
107+
o = strides2order( st );
108+
if ( o === 0 || o === 3 ) {
109+
// Fallback to stated layout when unable to infer the underlying physical layout:
110+
isrm = isRowMajorString( ord );
111+
} else {
112+
isrm = ( o === 1 );
113+
}
114+
N = sh.length;
115+
116+
if ( N > ndims ) {
117+
throw new RangeError( format( 'invalid argument. First argument must be greater than or equal to the number of dimensions in the input ndarray. Number of dimensions: %d. Value: `%d`.', N, ndims ) );
107118
}
108119
// Resolve dimension indices...
109120
d = toNormalizedIndices( dims, ndims-1 );
@@ -113,14 +124,14 @@ function spreadDimensions( ndims, x, dims, writable ) {
113124
if ( d.length !== dims.length ) {
114125
throw new Error( format( 'invalid argument. Must provide unique dimension indices. Value: `[%s]`.', join( dims, ', ' ) ) );
115126
}
116-
if ( d.length !== sh.length ) {
117-
throw new RangeError( format( 'invalid argument. Must provide the same number of dimension indices as the number of dimensions in the input ndarray. Number of dimensions: %d. Value: `[%s]`.', sh.length, join( dims, ', ' ) ) );
127+
if ( d.length !== N ) {
128+
throw new RangeError( format( 'invalid argument. Must provide the same number of dimension indices as the number of dimensions in the input ndarray. Number of dimensions: %d. Value: `[%s]`.', N, join( dims, ', ' ) ) );
118129
}
119130
if ( d.length && !isSortedAscending( d ) ) {
120131
throw new Error( format( 'invalid argument. Must provide dimension indices which resolve to nonnegative indices arranged in ascending order. Value: `[%s]`.', join( dims, ', ' ) ) );
121132
}
122133
// When provided a zero-dimensional array, every expanded dimension is a singleton dimension having zero stride...
123-
if ( sh.length === 0 ) {
134+
if ( N === 0 ) {
124135
shape = ones( ndims );
125136
strides = zeros( ndims );
126137
} else {
@@ -134,7 +145,7 @@ function spreadDimensions( ndims, x, dims, writable ) {
134145
S = sh[ j ];
135146
s = st[ j ];
136147
j += 1;
137-
} else if ( j === sh.length ) { // append
148+
} else if ( j === N ) { // append
138149
// We should only get here after exhausting all the dimension indices...
139150
S = 1;
140151
s = st[ j-1 ];

0 commit comments

Comments
 (0)