Skip to content

Commit 4c5c84a

Browse files
committed
feat: add remaining kernels
--- 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: na - task: lint_javascript_tests status: na - task: lint_javascript_benchmarks status: na - 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: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed ---
1 parent d2680d3 commit 4c5c84a

File tree

15 files changed

+4361
-3
lines changed

15 files changed

+4361
-3
lines changed

lib/node_modules/@stdlib/ndarray/base/nullary-strided1d/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,14 @@ console.log( ndarray2array( x.data, x.shape, x.strides, x.offset, x.order ) );
183183
184184
var sortOrder = {
185185
'dtype': 'generic',
186-
'data': [ 0.0 ],
187-
'shape': [ 1, 2 ],
186+
'data': [ 1.0 ],
187+
'shape': [ 2 ],
188188
'strides': [ 0, 0 ],
189189
'offset': 0,
190190
'order': 'row-major'
191191
};
192192
193-
nullaryStrided1d( wrapper, [ x, sortOrder ], [ 1 ] );
193+
nullaryStrided1d( wrapper, [ x, sortOrder ], [ 0, 1 ] );
194194
195195
console.log( ndarray2array( x.data, x.shape, x.strides, x.offset, x.order ) );
196196
```
Lines changed: 327 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,327 @@
1+
/**
2+
* @license Apache-2.0
3+
*
4+
* Copyright (c) 2025 The Stdlib Authors.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
/* eslint-disable max-depth, max-len */
20+
21+
'use strict';
22+
23+
// MODULES //
24+
25+
var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
26+
var incrementOffsets = require( './increment_offsets.js' );
27+
var setViewOffsets = require( './set_view_offsets.js' );
28+
var offsets = require( './offsets.js' );
29+
30+
31+
// MAIN //
32+
33+
/**
34+
* Applies a one-dimensional strided array function to a list of specified dimensions in an input ndarray.
35+
*
36+
* @private
37+
* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
38+
* @param {Array<Object>} arrays - ndarrays
39+
* @param {Array<Object>} views - initialized ndarray-like objects representing sub-array views
40+
* @param {NonNegativeIntegerArray} shape - loop dimensions
41+
* @param {IntegerArray} stridesX - loop dimension strides for the input ndarray
42+
* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
43+
* @param {Object} strategyX - strategy for marshaling data to and from an input ndarray view
44+
* @param {Options} opts - function options
45+
* @returns {void}
46+
*
47+
* @example
48+
* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
49+
* var getStride = require( '@stdlib/ndarray/base/stride' );
50+
* var getOffset = require( '@stdlib/ndarray/base/offset' );
51+
* var getData = require( '@stdlib/ndarray/base/data-buffer' );
52+
* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
53+
* var ndarraylike2scalar = require( '@stdlib/ndarray/base/ndarraylike2scalar' );
54+
* var gsorthp = require( '@stdlib/blas/ext/base/gsorthp' ).ndarray;
55+
*
56+
* function wrapper( arrays ) {
57+
* var x = arrays[ 0 ];
58+
* var o = arrays[ 1 ];
59+
* return gsorthp( numelDimension( x, 0 ), ndarraylike2scalar( o ), getData( x ), getStride( x, 0 ), getOffset( x ) );
60+
* }
61+
*
62+
* // Create data buffers:
63+
* var xbuf = [ 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 ];
64+
*
65+
* // Define the array shapes:
66+
* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
67+
*
68+
* // Define the array strides:
69+
* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
70+
*
71+
* // Define the index offsets:
72+
* var ox = 0;
73+
*
74+
* // Create an input ndarray-like object:
75+
* var x = {
76+
* 'dtype': 'generic',
77+
* 'data': xbuf,
78+
* 'shape': xsh,
79+
* 'strides': sx,
80+
* 'offset': ox,
81+
* 'order': 'row-major'
82+
* };
83+
*
84+
* // Create an ndarray-like object for the sort order:
85+
* var sortOrder = {
86+
* 'dtype': 'generic',
87+
* 'data': [ 1.0 ],
88+
* 'shape': [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ],
89+
* 'strides': [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
90+
* 'offset': 0,
91+
* 'order': 'row-major'
92+
* };
93+
*
94+
* // Initialize ndarray-like objects representing sub-array views:
95+
* var views = [
96+
* {
97+
* 'dtype': x.dtype,
98+
* 'data': x.data,
99+
* 'shape': [ 2, 2 ],
100+
* 'strides': [ 2, 1 ],
101+
* 'offset': x.offset,
102+
* 'order': x.order
103+
* },
104+
* {
105+
* 'dtype': sortOrder.dtype,
106+
* 'data': sortOrder.data,
107+
* 'shape': [],
108+
* 'strides': [ 0 ],
109+
* 'offset': sortOrder.offset,
110+
* 'order': sortOrder.order
111+
* }
112+
* ];
113+
*
114+
* // Define an input strategy:
115+
* function strategy( x ) {
116+
* return {
117+
* 'dtype': x.dtype,
118+
* 'data': x.data,
119+
* 'shape': [ 4 ],
120+
* 'strides': [ 1 ],
121+
* 'offset': x.offset,
122+
* 'order': x.order
123+
* };
124+
* }
125+
*
126+
* // Apply strided function:
127+
* nullary10d( wrapper, [ x, sortOrder ], views, [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, {} );
128+
*
129+
* var arr = ndarray2array( x.data, x.shape, x.strides, x.offset, x.order );
130+
* // returns [ [ [ [ [ [ [ [ [ [ [ [ 9.0, 10.0 ], [ 11.0, 12.0 ] ], [ [ 5.0, 6.0 ], [ 7.0, 8.0 ] ], [ [ 1.0, 2.0 ], [ 3.0, 4.0 ] ] ] ] ] ] ] ] ] ] ] ]
131+
*/
132+
function nullary10d( fcn, arrays, views, shape, stridesX, isRowMajor, strategyX, opts ) { // eslint-disable-line max-statements
133+
var dv0;
134+
var dv1;
135+
var dv2;
136+
var dv3;
137+
var dv4;
138+
var dv5;
139+
var dv6;
140+
var dv7;
141+
var dv8;
142+
var dv9;
143+
var S0;
144+
var S1;
145+
var S2;
146+
var S3;
147+
var S4;
148+
var S5;
149+
var S6;
150+
var S7;
151+
var S8;
152+
var S9;
153+
var sv;
154+
var iv;
155+
var i0;
156+
var i1;
157+
var i2;
158+
var i3;
159+
var i4;
160+
var i5;
161+
var i6;
162+
var i7;
163+
var i8;
164+
var i9;
165+
var v;
166+
var i;
167+
168+
// Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
169+
170+
// Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
171+
if ( isRowMajor ) {
172+
// For row-major ndarrays, the last dimensions have the fastest changing indices...
173+
S0 = shape[ 9 ];
174+
S1 = shape[ 8 ];
175+
S2 = shape[ 7 ];
176+
S3 = shape[ 6 ];
177+
S4 = shape[ 5 ];
178+
S5 = shape[ 4 ];
179+
S6 = shape[ 3 ];
180+
S7 = shape[ 2 ];
181+
S8 = shape[ 1 ];
182+
S9 = shape[ 0 ];
183+
dv0 = [ // offset increment for innermost loop
184+
stridesX[9]
185+
];
186+
dv1 = [
187+
stridesX[8] - ( S0*stridesX[9] )
188+
];
189+
dv2 = [
190+
stridesX[7] - ( S1*stridesX[8] )
191+
];
192+
dv3 = [
193+
stridesX[6] - ( S2*stridesX[7] )
194+
];
195+
dv4 = [
196+
stridesX[5] - ( S3*stridesX[6] )
197+
];
198+
dv5 = [
199+
stridesX[4] - ( S4*stridesX[5] )
200+
];
201+
dv6 = [
202+
stridesX[3] - ( S5*stridesX[4] )
203+
];
204+
dv7 = [
205+
stridesX[2] - ( S6*stridesX[3] )
206+
];
207+
dv8 = [
208+
stridesX[1] - ( S7*stridesX[2] )
209+
];
210+
dv9 = [ // offset increment for outermost loop
211+
stridesX[0] - ( S8*stridesX[1] )
212+
];
213+
for ( i = 1; i < arrays.length; i++ ) {
214+
sv = arrays[ i ].strides;
215+
dv0.push( sv[9] );
216+
dv1.push( sv[8] - ( S0*sv[9] ) );
217+
dv2.push( sv[7] - ( S1*sv[8] ) );
218+
dv3.push( sv[6] - ( S2*sv[7] ) );
219+
dv4.push( sv[5] - ( S3*sv[6] ) );
220+
dv5.push( sv[4] - ( S4*sv[5] ) );
221+
dv6.push( sv[3] - ( S5*sv[4] ) );
222+
dv7.push( sv[2] - ( S6*sv[3] ) );
223+
dv8.push( sv[1] - ( S7*sv[2] ) );
224+
dv9.push( sv[0] - ( S8*sv[1] ) );
225+
}
226+
} else { // order === 'column-major'
227+
// For column-major ndarrays, the first dimensions have the fastest changing indices...
228+
S0 = shape[ 0 ];
229+
S1 = shape[ 1 ];
230+
S2 = shape[ 2 ];
231+
S3 = shape[ 3 ];
232+
S4 = shape[ 4 ];
233+
S5 = shape[ 5 ];
234+
S6 = shape[ 6 ];
235+
S7 = shape[ 7 ];
236+
S8 = shape[ 8 ];
237+
S9 = shape[ 9 ];
238+
dv0 = [ // offset increment for innermost loop
239+
stridesX[0]
240+
];
241+
dv1 = [
242+
stridesX[1] - ( S0*stridesX[0] )
243+
];
244+
dv2 = [
245+
stridesX[2] - ( S1*stridesX[1] )
246+
];
247+
dv3 = [
248+
stridesX[3] - ( S2*stridesX[2] )
249+
];
250+
dv4 = [
251+
stridesX[4] - ( S3*stridesX[3] )
252+
];
253+
dv5 = [
254+
stridesX[5] - ( S4*stridesX[4] )
255+
];
256+
dv6 = [
257+
stridesX[6] - ( S5*stridesX[5] )
258+
];
259+
dv7 = [
260+
stridesX[7] - ( S6*stridesX[6] )
261+
];
262+
dv8 = [
263+
stridesX[8] - ( S7*stridesX[7] )
264+
];
265+
dv9 = [ // offset increment for outermost loop
266+
stridesX[9] - ( S8*stridesX[8] )
267+
];
268+
for ( i = 1; i < arrays.length; i++ ) {
269+
sv = arrays[ i ].strides;
270+
dv0.push( sv[0] );
271+
dv1.push( sv[1] - ( S0*sv[0] ) );
272+
dv2.push( sv[2] - ( S1*sv[1] ) );
273+
dv3.push( sv[3] - ( S2*sv[2] ) );
274+
dv4.push( sv[4] - ( S3*sv[3] ) );
275+
dv5.push( sv[5] - ( S4*sv[4] ) );
276+
dv6.push( sv[6] - ( S5*sv[5] ) );
277+
dv7.push( sv[7] - ( S6*sv[6] ) );
278+
dv8.push( sv[8] - ( S7*sv[7] ) );
279+
dv9.push( sv[9] - ( S8*sv[8] ) );
280+
}
281+
}
282+
// Resolve a list of pointers to the first indexed elements in the respective ndarrays:
283+
iv = offsets( arrays );
284+
285+
// Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
286+
v = copyIndexed( views );
287+
288+
// Iterate over the loop dimensions...
289+
for ( i9 = 0; i9 < S9; i9++ ) {
290+
for ( i8 = 0; i8 < S8; i8++ ) {
291+
for ( i7 = 0; i7 < S7; i7++ ) {
292+
for ( i6 = 0; i6 < S6; i6++ ) {
293+
for ( i5 = 0; i5 < S5; i5++ ) {
294+
for ( i4 = 0; i4 < S4; i4++ ) {
295+
for ( i3 = 0; i3 < S3; i3++ ) {
296+
for ( i2 = 0; i2 < S2; i2++ ) {
297+
for ( i1 = 0; i1 < S1; i1++ ) {
298+
for ( i0 = 0; i0 < S0; i0++ ) {
299+
setViewOffsets( views, iv );
300+
v[ 0 ] = strategyX( views[ 0 ] );
301+
fcn( v, opts );
302+
incrementOffsets( iv, dv0 );
303+
}
304+
incrementOffsets( iv, dv1 );
305+
}
306+
incrementOffsets( iv, dv2 );
307+
}
308+
incrementOffsets( iv, dv3 );
309+
}
310+
incrementOffsets( iv, dv4 );
311+
}
312+
incrementOffsets( iv, dv5 );
313+
}
314+
incrementOffsets( iv, dv6 );
315+
}
316+
incrementOffsets( iv, dv7 );
317+
}
318+
incrementOffsets( iv, dv8 );
319+
}
320+
incrementOffsets( iv, dv9 );
321+
}
322+
}
323+
324+
325+
// EXPORTS //
326+
327+
module.exports = nullary10d;

0 commit comments

Comments
 (0)