Skip to content

Commit dcfb648

Browse files
committed
refactor: use generalized utility for resolving loop data
--- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: passed - task: lint_package_json status: na - task: lint_repl_help status: na - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: passed - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: passed - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: na - task: lint_c_examples status: na - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: passed - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent d8fe0d8 commit dcfb648

File tree

8 files changed

+47
-198
lines changed

8 files changed

+47
-198
lines changed

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,23 @@ For all returned arrays, the first element corresponds to the innermost loop, an
9797

9898
## Examples
9999

100+
<!-- eslint-disable max-len -->
101+
100102
<!-- eslint no-undef: "error" -->
101103

102104
```javascript
103105
var array = require( '@stdlib/ndarray/array' );
104-
var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
106+
var getShape = require( '@stdlib/ndarray/shape' );
107+
var getStrides = require( '@stdlib/ndarray/strides' );
108+
var binaryLoopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
105109

106110
// Create ndarrays:
107111
var x = array( [ [ 1, 2 ], [ 3, 4 ] ] );
108112
var y = array( [ [ 5, 6 ], [ 7, 8 ] ] );
109113
var z = array( [ [ 0, 0 ], [ 0, 0 ] ] );
110114

111115
// Resolve loop interchange data:
112-
var o = loopOrder( x.shape, x.strides, y.strides, z.strides );
116+
var o = binaryLoopOrder( getShape( x ), getStrides( x ), getStrides( y ), getStrides( z ) );
113117
// returns {...}
114118

115119
console.log( o );

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/benchmark/benchmark.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,32 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
2524
var isArray = require( '@stdlib/assert/is-array' );
2625
var shape2strides = require( '@stdlib/ndarray/base/shape2strides' );
2726
var pkg = require( './../package.json' ).name;
28-
var loopOrder = require( './../lib' );
27+
var binaryLoopOrder = require( './../lib' );
2928

3029

3130
// MAIN //
3231

3332
bench( pkg+'::row-major', function benchmark( b ) {
3433
var strides;
34+
var factors;
3535
var shape;
3636
var out;
3737
var i;
3838

3939
shape = [ 10, 10, 10 ];
4040
strides = shape2strides( shape, 'row-major' );
41+
factors = [
42+
-1,
43+
1
44+
];
4145

4246
b.tic();
4347
for ( i = 0; i < b.iterations; i++ ) {
44-
strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1;
45-
out = loopOrder( shape, strides, strides, strides );
48+
strides[ i%shape.length ] *= factors[ i%factors.length ];
49+
out = binaryLoopOrder( shape, strides, strides, strides );
4650
if ( typeof out !== 'object' ) {
4751
b.fail( 'should return an object' );
4852
}
@@ -57,17 +61,22 @@ bench( pkg+'::row-major', function benchmark( b ) {
5761

5862
bench( pkg+'::column-major', function benchmark( b ) {
5963
var strides;
64+
var factors;
6065
var shape;
6166
var out;
6267
var i;
6368

6469
shape = [ 10, 10, 10 ];
6570
strides = shape2strides( shape, 'column-major' );
71+
factors = [
72+
-1,
73+
1
74+
];
6675

6776
b.tic();
6877
for ( i = 0; i < b.iterations; i++ ) {
69-
strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1;
70-
out = loopOrder( shape, strides, strides, strides );
78+
strides[ i%shape.length ] *= factors[ i%factors.length ];
79+
out = binaryLoopOrder( shape, strides, strides, strides );
7180
if ( typeof out !== 'object' ) {
7281
b.fail( 'should return an object' );
7382
}

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/docs/types/index.d.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ interface LoopOrderObject {
6767
*
6868
* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting.
6969
*
70-
* @param sh - array dimensions
71-
* @param sx - first input array stride lengths
72-
* @param sy - second input array stride lengths
73-
* @param sz - output array stride lengths
70+
* @param shape - array dimensions
71+
* @param stridesX - first input array stride lengths
72+
* @param stridesY - second input array stride lengths
73+
* @param stridesZ - output array stride lengths
7474
* @returns loop interchange data
7575
*
7676
* @example
@@ -80,7 +80,7 @@ interface LoopOrderObject {
8080
* var sy = [ 24, 8, 1 ]; // row-major
8181
* var sz = [ 1, -2, 6 ]; // column-major
8282
*
83-
* var o = loopOrder( sh, sx, sy, sz );
83+
* var o = binaryLoopOrder( sh, sx, sy, sz );
8484
* // returns {...}
8585
*
8686
* var ssh = o.sh;

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/examples/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
'use strict';
2020

2121
var array = require( '@stdlib/ndarray/array' );
22+
var getShape = require( '@stdlib/ndarray/shape' );
23+
var getStrides = require( '@stdlib/ndarray/strides' );
2224
var loopOrder = require( './../lib' );
2325

2426
// Create ndarrays:
@@ -27,7 +29,7 @@ var y = array( [ [ 5, 6 ], [ 7, 8 ] ] );
2729
var z = array( [ [ 0, 0 ], [ 0, 0 ] ] );
2830

2931
// Resolve loop interchange data:
30-
var o = loopOrder( x.shape, x.strides, y.strides, z.strides );
32+
var o = loopOrder( getShape( x ), getStrides( x ), getStrides( y ), getStrides( z ) ); // eslint-disable-line max-len
3133
// returns {...}
3234

3335
console.log( o );

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/lib/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
* var sy = [ 24, 8, 1 ]; // row-major
3333
* var sz = [ 1, -2, 6 ]; // column-major
3434
*
35-
* var o = loopOrder( sh, sx, sy, sz );
35+
* var o = binaryLoopOrder( sh, sx, sy, sz );
3636
* // returns {...}
3737
*
3838
* var ssh = o.sh;

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/lib/main.js

Lines changed: 9 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,7 @@
2020

2121
// MODULES //
2222

23-
var zeroTo = require( '@stdlib/array/base/zero-to' );
24-
var copy = require( '@stdlib/array/base/copy-indexed' );
25-
var take = require( '@stdlib/array/base/take-indexed' );
26-
var strides2order = require( '@stdlib/ndarray/base/strides2order' );
27-
var sort2ins = require( './sort2ins.js' );
28-
29-
30-
// VARIABLES //
31-
32-
// Number of arrays:
33-
var N = 3;
23+
var loopOrder = require( '@stdlib/ndarray/base/loop-interchange-order' );
3424

3525

3626
// MAIN //
@@ -60,7 +50,7 @@ var N = 3;
6050
* var sy = [ 24, 8, 1 ]; // row-major
6151
* var sz = [ 1, -2, 6 ]; // column-major
6252
*
63-
* var o = loopOrder( sh, sx, sy, sz );
53+
* var o = binaryLoopOrder( sh, sx, sy, sz );
6454
* // returns {...}
6555
*
6656
* var ssh = o.sh;
@@ -75,75 +65,17 @@ var N = 3;
7565
* var ssz = o.sz;
7666
* // returns [ 6, -2, 1 ]
7767
*/
78-
function loopOrder( sh, sx, sy, sz ) {
79-
var idx;
80-
var tmp;
81-
var max;
82-
var len;
83-
var arr;
84-
var ox;
85-
var oy;
86-
var oz;
87-
var i;
88-
var j;
89-
90-
// Initialize a loop interchange index array for generating a loop order permutation:
91-
idx = zeroTo( sh.length );
92-
93-
// Determine the order (layout) of each array:
94-
ox = strides2order( sx );
95-
oy = strides2order( sy );
96-
oz = strides2order( sz );
97-
98-
// Determine which array should be used to generate the loop order:
99-
tmp = [ [], [], [], [] ];
100-
tmp[ ox ].push( sx );
101-
tmp[ oy ].push( sy );
102-
tmp[ oz ].push( sz );
103-
max = tmp[ 0 ].length;
104-
if ( max === N ) {
105-
// If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:
106-
arr = sx;
107-
} else if ( max === N-1 ) {
108-
// If all but one array is "disorganized", find the "organized" array...
109-
for ( i = 1; i < 4; i++ ) {
110-
if ( tmp[ i ].length ) {
111-
arr = tmp[ i ][ 0 ];
112-
break;
113-
}
114-
}
115-
} else {
116-
// Find the layout which is most common...
117-
j = 0;
118-
for ( i = 1; i < 4; i++ ) {
119-
len = tmp[ i ].length;
120-
if ( len >= max ) {
121-
max = len;
122-
j = i;
123-
}
124-
}
125-
// Use the strides of the first array having the most common layout:
126-
arr = tmp[ j ][ 0 ];
127-
}
128-
// Sort array strides in increasing order (of magnitude):
129-
arr = copy( arr );
130-
sort2ins( arr, idx );
131-
132-
// Permute the shape and array strides based on the sorted strides:
133-
sh = take( sh, idx );
134-
sx = take( sx, idx );
135-
sy = take( sy, idx );
136-
sz = take( sz, idx );
137-
68+
function binaryLoopOrder( sh, sx, sy, sz ) {
69+
var tmp = loopOrder( sh, [ sx, sy, sz ] );
13870
return {
139-
'sh': sh,
140-
'sx': sx,
141-
'sy': sy,
142-
'sz': sz
71+
'sh': tmp[ 0 ],
72+
'sx': tmp[ 1 ],
73+
'sy': tmp[ 2 ],
74+
'sz': tmp[ 3 ]
14375
};
14476
}
14577

14678

14779
// EXPORTS //
14880

149-
module.exports = loopOrder;
81+
module.exports = binaryLoopOrder;

lib/node_modules/@stdlib/ndarray/base/binary-loop-interchange-order/lib/sort2ins.js

Lines changed: 0 additions & 98 deletions
This file was deleted.

0 commit comments

Comments
 (0)