diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/README.md b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/README.md new file mode 100644 index 000000000000..97b6d4401fa5 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/README.md @@ -0,0 +1,1026 @@ + + +# kernel + +> Return a kernel for applying a quaternary callback to elements in four input ndarrays and assigning results to elements in an output ndarray using loop blocking. + +
+ +
+ + + +
+ +## Usage + +```javascript +var kernel = require( '@stdlib/ndarray/base/kernels/generic/quaternary/blocked' ); +``` + +#### kernel( ndims ) + +Returns a kernel for applying a quaternary callback to elements in four input ndarrays and assigning results to elements in an output ndarray using loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +var ubuf = new Float64Array( 6 ); + +// Define the shape of the input and output arrays: +var shape = [ 3, 2 ]; + +// Define the array strides: +var sx = [ 2, 1 ]; +var sy = [ 2, 1 ]; +var sz = [ 2, 1 ]; +var sw = [ 2, 1 ]; +var su = [ 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Resolve a kernel: +var f = kernel( 2 ); + +// Apply the quaternary function: +f( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] +``` + +The function accepts the following arguments: + +- **ndims**: number of dimensions. + +If the function is provided an `ndims` value less than `2` or greater than the maximum number of supported dimensions, the function returns `null`. + +```javascript +var f = kernel( 1 ); +// returns null +``` + +The returned function accepts the following arguments: + +- **x**: first input ndarray descriptor (object with `dtype`, `data`, `shape`, `strides`, `offset`, `order`). +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback accepting four scalar values and returning one scalar value. + +#### kernel.kernel2d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in two-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +var ubuf = new Float64Array( 6 ); + +// Define the shape of the input and output arrays: +var shape = [ 3, 2 ]; + +// Define the array strides: +var sx = [ 2, 1 ]; +var sy = [ 2, 1 ]; +var sz = [ 2, 1 ]; +var sw = [ 2, 1 ]; +var su = [ 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel2d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel3d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in three-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 4, 2, 1 ]; +var sy = [ 4, 2, 1 ]; +var sz = [ 4, 2, 1 ]; +var sw = [ 4, 2, 1 ]; +var su = [ 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel3d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel4d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in four-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 4, 2, 1 ]; +var sy = [ 8, 4, 2, 1 ]; +var sz = [ 8, 4, 2, 1 ]; +var sw = [ 8, 4, 2, 1 ]; +var su = [ 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel4d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel5d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in five-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel5d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel6d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in six-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel6d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel7d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in seven-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel7d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel8d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in eight-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 1, 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel8d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel9d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in nine-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 1, 1, 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel9d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +#### kernel.kernel10d( x, y, z, w, u, fcn ) + +Applies a quaternary callback to elements in ten-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var ubuf = new Float64Array( 8 ); + +// Define the shape of the input and output arrays: +var shape = [ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 ]; + +// Define the array strides: +var sx = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sy = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sz = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var sw = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +var su = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': sx, + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': sy, + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': sz, + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': sw, + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': su, + 'offset': 0, + 'order': 'row-major' +}; + +// Apply the quaternary function: +kernel.kernel10d( x, y, z, w, u, add4 ); + +var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +// returns [ [ [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] ] ] +``` + +The function accepts the following arguments: + +- **x**: first input ndarray descriptor. +- **y**: second input ndarray descriptor. +- **z**: third input ndarray descriptor. +- **w**: fourth input ndarray descriptor. +- **u**: output ndarray descriptor. +- **fcn**: quaternary callback. + +
+ + + +
+ +## Notes + +- The quaternary callback is expected to have the following signature: + + ```text + fcn( v1, v2, v3, v4 ) + ``` + + where + + - **v1**: element from the first input ndarray. + - **v2**: element from the second input ndarray. + - **v3**: element from the third input ndarray. + - **v4**: element from the fourth input ndarray. + +
+ + + +
+ +## Examples + + + +```javascript +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); +var kernel = require( '@stdlib/ndarray/base/kernels/generic/quaternary/blocked' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +var ubuf = new Float64Array( 6 ); + +// Define the array shapes: +var shape = [ 3, 2 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; + +// Resolve a kernel: +var f = kernel( 2 ); + +// Apply the quaternary function: +f( x, y, z, w, u, add4 ); + +console.log( ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ) ); +// => [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] +``` + +
+ + + + + + + + + + + + diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.2d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.2d.js new file mode 100644 index 000000000000..a8554a463f0a --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.2d.js @@ -0,0 +1,162 @@ +/** +* @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 bench = require( '@stdlib/bench' ); +var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var sqrt = require( '@stdlib/math/base/special/sqrt' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var filledarray = require( '@stdlib/array/filled' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); +var shape2strides = require( '@stdlib/ndarray/base/shape2strides' ); +var strides2offset = require( '@stdlib/ndarray/base/strides2offset' ); +var descriptor = require( '@stdlib/ndarray/base/descriptor' ); +var orders = require( '@stdlib/ndarray/orders' ); +var format = require( '@stdlib/string/format' ); +var pkg = require( './../package.json' ).name; +var kernel = require( './../lib' ); + + +// VARIABLES // + +var TYPES = [ + 'float64' +]; +var ORDERS = orders(); + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} len - ndarray length +* @param {NonNegativeIntegerArray} shape - ndarray shape +* @param {string} xtype - input ndarray data type +* @param {string} utype - output ndarray data type +* @param {string} order - memory layout +* @returns {Function} benchmark function +*/ +function createBenchmark( len, shape, xtype, utype, order ) { + var opts; + var st; + var x; + var y; + var z; + var w; + var u; + var f; + + st = shape2strides( shape, order ); + opts = { + 'dtype': xtype + }; + x = discreteUniform( len, -100, 100, opts ); + y = discreteUniform( len, -100, 100, opts ); + z = discreteUniform( len, -100, 100, opts ); + w = discreteUniform( len, -100, 100, opts ); + u = filledarray( 0.0, len, utype ); + + x = descriptor( xtype, x, shape, st, strides2offset( shape, st ), order ); + y = descriptor( xtype, y, shape, st, strides2offset( shape, st ), order ); + z = descriptor( xtype, z, shape, st, strides2offset( shape, st ), order ); + w = descriptor( xtype, w, shape, st, strides2offset( shape, st ), order ); + u = descriptor( utype, u, shape, st, strides2offset( shape, st ), order ); + + f = kernel( shape.length ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + f( x, y, z, w, u, add4 ); + if ( isnan( u.data[ i%len ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnan( u.data[ i%len ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var len; + var min; + var max; + var ord; + var sh; + var t1; + var t2; + var f; + var i; + var j; + var k; + + min = 1; // 10^min + max = 6; // 10^max + + for ( k = 0; k < ORDERS.length; k++ ) { + ord = ORDERS[ k ]; + for ( j = 0; j < TYPES.length; j++ ) { + t1 = TYPES[ j ]; + t2 = TYPES[ j ]; + for ( i = min; i <= max; i++ ) { + len = pow( 10, i ); + + sh = [ len/2, 2 ]; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + + sh = [ 2, len/2 ]; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + + len = floor( sqrt( len ) ); + sh = [ len, len ]; + len *= len; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + } + } + } +} + +main(); diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.3d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.3d.js new file mode 100644 index 000000000000..07656da3f2ca --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/benchmark/benchmark.3d.js @@ -0,0 +1,162 @@ +/** +* @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 bench = require( '@stdlib/bench' ); +var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var cbrt = require( '@stdlib/math/base/special/cbrt' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var filledarray = require( '@stdlib/array/filled' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); +var shape2strides = require( '@stdlib/ndarray/base/shape2strides' ); +var strides2offset = require( '@stdlib/ndarray/base/strides2offset' ); +var descriptor = require( '@stdlib/ndarray/base/descriptor' ); +var orders = require( '@stdlib/ndarray/orders' ); +var format = require( '@stdlib/string/format' ); +var pkg = require( './../package.json' ).name; +var kernel = require( './../lib' ); + + +// VARIABLES // + +var TYPES = [ + 'float64' +]; +var ORDERS = orders(); + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} len - ndarray length +* @param {NonNegativeIntegerArray} shape - ndarray shape +* @param {string} xtype - input ndarray data type +* @param {string} utype - output ndarray data type +* @param {string} order - memory layout +* @returns {Function} benchmark function +*/ +function createBenchmark( len, shape, xtype, utype, order ) { + var opts; + var st; + var x; + var y; + var z; + var w; + var u; + var f; + + st = shape2strides( shape, order ); + opts = { + 'dtype': xtype + }; + x = discreteUniform( len, -100, 100, opts ); + y = discreteUniform( len, -100, 100, opts ); + z = discreteUniform( len, -100, 100, opts ); + w = discreteUniform( len, -100, 100, opts ); + u = filledarray( 0.0, len, utype ); + + x = descriptor( xtype, x, shape, st, strides2offset( shape, st ), order ); + y = descriptor( xtype, y, shape, st, strides2offset( shape, st ), order ); + z = descriptor( xtype, z, shape, st, strides2offset( shape, st ), order ); + w = descriptor( xtype, w, shape, st, strides2offset( shape, st ), order ); + u = descriptor( utype, u, shape, st, strides2offset( shape, st ), order ); + + f = kernel( shape.length ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + f( x, y, z, w, u, add4 ); + if ( isnan( u.data[ i%len ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnan( u.data[ i%len ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var len; + var min; + var max; + var ord; + var sh; + var t1; + var t2; + var f; + var i; + var j; + var k; + + min = 1; // 10^min + max = 6; // 10^max + + for ( k = 0; k < ORDERS.length; k++ ) { + ord = ORDERS[ k ]; + for ( j = 0; j < TYPES.length; j++ ) { + t1 = TYPES[ j ]; + t2 = TYPES[ j ]; + for ( i = min; i <= max; i++ ) { + len = pow( 10, i ); + + sh = [ len/2, 2, 1 ]; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + + sh = [ 1, 2, len/2 ]; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + + len = floor( cbrt( len ) ); + sh = [ len, len, len ]; + len *= len * len; + f = createBenchmark( len, sh, t1, t2, ord ); + bench( format( '%s:ndims=%d,len=%d,shape=[%s],xorder=%s,uorder=%s,xtype=%s,utype=%s', pkg, sh.length, len, sh.join(','), ord, ord, t1, t2 ), f ); + } + } + } +} + +main(); diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/docs/repl.txt b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/docs/repl.txt new file mode 100644 index 000000000000..c3e288d70c95 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/docs/repl.txt @@ -0,0 +1,271 @@ + +{{alias}}( ndims ) + Returns a kernel for applying a quaternary callback to elements in four + input ndarrays and assigning results to elements in an output ndarray using + loop blocking. + + The returned function has the following parameters: + + - x: first input ndarray descriptor (object with `dtype`, `data`, `shape`, + `strides`, `offset`, `order`). + - y: second input ndarray descriptor. + - z: third input ndarray descriptor. + - w: fourth input ndarray descriptor. + - u: output ndarray descriptor. + - fcn: quaternary callback accepting four scalar values and returning one + scalar value. + + If `ndims` is less than `2` or greater than the maximum number of supported + dimensions, the function returns `null`. + + Parameters + ---------- + ndims: integer + Number of dimensions. + + Returns + ------- + fcn: Function|null + Kernel function. + + Examples + -------- + > var f = {{alias}}( 2 ) + + + +{{alias}}.kernel2d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in two-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel3d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in three-dimensional input + ndarrays and assigns results to elements in an equivalently shaped output + ndarray via loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel4d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in four-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel5d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in five-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel6d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in six-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel7d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in seven-dimensional input + ndarrays and assigns results to elements in an equivalently shaped output + ndarray via loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel8d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in eight-dimensional input + ndarrays and assigns results to elements in an equivalently shaped output + ndarray via loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel9d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in nine-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + +{{alias}}.kernel10d( x, y, z, w, u, fcn ) + Applies a quaternary callback to elements in ten-dimensional input ndarrays + and assigns results to elements in an equivalently shaped output ndarray via + loop blocking. + + Parameters + ---------- + x: Object + First input ndarray descriptor. + + y: Object + Second input ndarray descriptor. + + z: Object + Third input ndarray descriptor. + + w: Object + Fourth input ndarray descriptor. + + u: Object + Output ndarray descriptor. + + fcn: Function + Quaternary callback. + + See Also + -------- diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/examples/index.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/examples/index.js new file mode 100644 index 000000000000..de504ac57524 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/examples/index.js @@ -0,0 +1,85 @@ +/** +* @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'; + +var Float64Array = require( '@stdlib/array/float64' ); +var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); +var kernel = require( './../lib' ); + +// Create data buffers: +var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +var ubuf = new Float64Array( 6 ); + +// Define the array shapes: +var shape = [ 3, 2 ]; + +// Create the input and output ndarray-like objects: +var x = { + 'dtype': 'float64', + 'data': xbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var y = { + 'dtype': 'float64', + 'data': ybuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var z = { + 'dtype': 'float64', + 'data': zbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var w = { + 'dtype': 'float64', + 'data': wbuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; +var u = { + 'dtype': 'float64', + 'data': ubuf, + 'shape': shape, + 'strides': [ 2, 1 ], + 'offset': 0, + 'order': 'row-major' +}; + +// Resolve a kernel: +var f = kernel( 2 ); + +// Apply the quaternary function: +f( x, y, z, w, u, add4 ); + +console.log( ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ) ); +// => [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/10d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/10d.js new file mode 100644 index 000000000000..0ebf8a44ec67 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/10d.js @@ -0,0 +1,601 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function, max-len */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in ten-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary10d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] ] ] +*/ +function blockedquaternary10d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dx5; + var dx6; + var dx7; + var dx8; + var dx9; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dy5; + var dy6; + var dy7; + var dy8; + var dy9; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dz5; + var dz6; + var dz7; + var dz8; + var dz9; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var dw5; + var dw6; + var dw7; + var dw8; + var dw9; + var du0; + var du1; + var du2; + var du3; + var du4; + var du5; + var du6; + var du7; + var du8; + var du9; + var ox1; + var ox2; + var ox3; + var ox4; + var ox5; + var ox6; + var ox7; + var ox8; + var ox9; + var oy1; + var oy2; + var oy3; + var oy4; + var oy5; + var oy6; + var oy7; + var oy8; + var oy9; + var oz1; + var oz2; + var oz3; + var oz4; + var oz5; + var oz6; + var oz7; + var oz8; + var oz9; + var ow1; + var ow2; + var ow3; + var ow4; + var ow5; + var ow6; + var ow7; + var ow8; + var ow9; + var ou1; + var ou2; + var ou3; + var ou4; + var ou5; + var ou6; + var ou7; + var ou8; + var ou9; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var s5; + var s6; + var s7; + var s8; + var s9; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var i5; + var i6; + var i7; + var i8; + var i9; + var j0; + var j1; + var j2; + var j3; + var j4; + var j5; + var j6; + var j7; + var j8; + var j9; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j9 = sh[9]; j9 > 0; ) { + if ( j9 < bsize ) { + s9 = j9; + j9 = 0; + } else { + s9 = bsize; + j9 -= bsize; + } + ox9 = ox + ( j9*sx[9] ); + oy9 = oy + ( j9*sy[9] ); + oz9 = oz + ( j9*sz[9] ); + ow9 = ow + ( j9*sw[9] ); + ou9 = ou + ( j9*su[9] ); + for ( j8 = sh[8]; j8 > 0; ) { + if ( j8 < bsize ) { + s8 = j8; + j8 = 0; + } else { + s8 = bsize; + j8 -= bsize; + } + dx9 = sx[9] - ( s8*sx[8] ); + dy9 = sy[9] - ( s8*sy[8] ); + dz9 = sz[9] - ( s8*sz[8] ); + dw9 = sw[9] - ( s8*sw[8] ); + du9 = su[9] - ( s8*su[8] ); + ox8 = ox9 + ( j8*sx[8] ); + oy8 = oy9 + ( j8*sy[8] ); + oz8 = oz9 + ( j8*sz[8] ); + ow8 = ow9 + ( j8*sw[8] ); + ou8 = ou9 + ( j8*su[8] ); + for ( j7 = sh[7]; j7 > 0; ) { + if ( j7 < bsize ) { + s7 = j7; + j7 = 0; + } else { + s7 = bsize; + j7 -= bsize; + } + dx8 = sx[8] - ( s7*sx[7] ); + dy8 = sy[8] - ( s7*sy[7] ); + dz8 = sz[8] - ( s7*sz[7] ); + dw8 = sw[8] - ( s7*sw[7] ); + du8 = su[8] - ( s7*su[7] ); + ox7 = ox8 + ( j7*sx[7] ); + oy7 = oy8 + ( j7*sy[7] ); + oz7 = oz8 + ( j7*sz[7] ); + ow7 = ow8 + ( j7*sw[7] ); + ou7 = ou8 + ( j7*su[7] ); + for ( j6 = sh[6]; j6 > 0; ) { + if ( j6 < bsize ) { + s6 = j6; + j6 = 0; + } else { + s6 = bsize; + j6 -= bsize; + } + dx7 = sx[7] - ( s6*sx[6] ); + dy7 = sy[7] - ( s6*sy[6] ); + dz7 = sz[7] - ( s6*sz[6] ); + dw7 = sw[7] - ( s6*sw[6] ); + du7 = su[7] - ( s6*su[6] ); + ox6 = ox7 + ( j6*sx[6] ); + oy6 = oy7 + ( j6*sy[6] ); + oz6 = oz7 + ( j6*sz[6] ); + ow6 = ow7 + ( j6*sw[6] ); + ou6 = ou7 + ( j6*su[6] ); + for ( j5 = sh[5]; j5 > 0; ) { + if ( j5 < bsize ) { + s5 = j5; + j5 = 0; + } else { + s5 = bsize; + j5 -= bsize; + } + dx6 = sx[6] - ( s5*sx[5] ); + dy6 = sy[6] - ( s5*sy[5] ); + dz6 = sz[6] - ( s5*sz[5] ); + dw6 = sw[6] - ( s5*sw[5] ); + du6 = su[6] - ( s5*su[5] ); + ox5 = ox6 + ( j5*sx[5] ); + oy5 = oy6 + ( j5*sy[5] ); + oz5 = oz6 + ( j5*sz[5] ); + ow5 = ow6 + ( j5*sw[5] ); + ou5 = ou6 + ( j5*su[5] ); + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + dx5 = sx[5] - ( s4*sx[4] ); + dy5 = sy[5] - ( s4*sy[4] ); + dz5 = sz[5] - ( s4*sz[4] ); + dw5 = sw[5] - ( s4*sw[4] ); + du5 = su[5] - ( s4*su[4] ); + ox4 = ox5 + ( j4*sx[4] ); + oy4 = oy5 + ( j4*sy[4] ); + oz4 = oz5 + ( j4*sz[4] ); + ow4 = ow5 + ( j4*sw[4] ); + ou4 = ou5 + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i9 = 0; i9 < s9; i9++ ) { + for ( i8 = 0; i8 < s8; i8++ ) { + for ( i7 = 0; i7 < s7; i7++ ) { + for ( i6 = 0; i6 < s6; i6++ ) { + for ( i5 = 0; i5 < s5; i5++ ) { + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + ix += dx5; + iy += dy5; + iz += dz5; + iw += dw5; + iu += du5; + } + ix += dx6; + iy += dy6; + iz += dz6; + iw += dw6; + iu += du6; + } + ix += dx7; + iy += dy7; + iz += dz7; + iw += dw7; + iu += du7; + } + ix += dx8; + iy += dy8; + iz += dz8; + iw += dw8; + iu += du8; + } + ix += dx9; + iy += dy9; + iz += dz9; + iw += dw9; + iu += du9; + } + } + } + } + } + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary10d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/2d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/2d.js new file mode 100644 index 000000000000..ef3c49cfae87 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/2d.js @@ -0,0 +1,289 @@ +/** +* @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. +*/ + +/* eslint-disable max-statements */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in two-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 4 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 2, 1 ]; +* var sy = [ 2, 1 ]; +* var sz = [ 2, 1 ]; +* var sw = [ 2, 1 ]; +* var su = [ 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary2d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ] +*/ +function blockedquaternary2d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dy0; + var dy1; + var dz0; + var dz1; + var dw0; + var dw1; + var du0; + var du1; + var ox1; + var oy1; + var oz1; + var ow1; + var ou1; + var sh; + var s0; + var s1; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var j0; + var j1; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); // eslint-disable-line max-len + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + ox1 = ox + ( j1*sx[1] ); + oy1 = oy + ( j1*sy[1] ); + oz1 = oz + ( j1*sz[1] ); + ow1 = ow + ( j1*sw[1] ); + ou1 = ou + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); // eslint-disable-line max-len + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary2d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/3d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/3d.js new file mode 100644 index 000000000000..d16ee7622d0b --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/3d.js @@ -0,0 +1,328 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in three-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 4, 2, 1 ]; +* var sy = [ 4, 2, 1 ]; +* var sz = [ 4, 2, 1 ]; +* var sw = [ 4, 2, 1 ]; +* var su = [ 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary3d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] +*/ +function blockedquaternary3d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dy0; + var dy1; + var dy2; + var dz0; + var dz1; + var dz2; + var dw0; + var dw1; + var dw2; + var du0; + var du1; + var du2; + var ox1; + var ox2; + var oy1; + var oy2; + var oz1; + var oz2; + var ow1; + var ow2; + var ou1; + var ou2; + var sh; + var s0; + var s1; + var s2; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var j0; + var j1; + var j2; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); // eslint-disable-line max-len + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + ox2 = ox + ( j2*sx[2] ); + oy2 = oy + ( j2*sy[2] ); + oz2 = oz + ( j2*sz[2] ); + ow2 = ow + ( j2*sw[2] ); + ou2 = ou + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); // eslint-disable-line max-len + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary3d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/4d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/4d.js new file mode 100644 index 000000000000..600e6260fe00 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/4d.js @@ -0,0 +1,367 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in four-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 4, 2, 1 ]; +* var sy = [ 8, 4, 2, 1 ]; +* var sz = [ 8, 4, 2, 1 ]; +* var sw = [ 8, 4, 2, 1 ]; +* var su = [ 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary4d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] +*/ +function blockedquaternary4d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dy0; + var dy1; + var dy2; + var dy3; + var dz0; + var dz1; + var dz2; + var dz3; + var dw0; + var dw1; + var dw2; + var dw3; + var du0; + var du1; + var du2; + var du3; + var ox1; + var ox2; + var ox3; + var oy1; + var oy2; + var oy3; + var oz1; + var oz2; + var oz3; + var ow1; + var ow2; + var ow3; + var ou1; + var ou2; + var ou3; + var sh; + var s0; + var s1; + var s2; + var s3; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var j0; + var j1; + var j2; + var j3; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); // eslint-disable-line max-len + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + ox3 = ox + ( j3*sx[3] ); + oy3 = oy + ( j3*sy[3] ); + oz3 = oz + ( j3*sz[3] ); + ow3 = ow + ( j3*sw[3] ); + ou3 = ou + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); // eslint-disable-line max-len + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary4d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/5d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/5d.js new file mode 100644 index 000000000000..b73a4f529e5a --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/5d.js @@ -0,0 +1,406 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in five-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary5d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] +*/ +function blockedquaternary5d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var du0; + var du1; + var du2; + var du3; + var du4; + var ox1; + var ox2; + var ox3; + var ox4; + var oy1; + var oy2; + var oy3; + var oy4; + var oz1; + var oz2; + var oz3; + var oz4; + var ow1; + var ow2; + var ow3; + var ow4; + var ou1; + var ou2; + var ou3; + var ou4; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var j0; + var j1; + var j2; + var j3; + var j4; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); // eslint-disable-line max-len + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + ox4 = ox + ( j4*sx[4] ); + oy4 = oy + ( j4*sy[4] ); + oz4 = oz + ( j4*sz[4] ); + ow4 = ow + ( j4*sw[4] ); + ou4 = ou + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); // eslint-disable-line max-len + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary5d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/6d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/6d.js new file mode 100644 index 000000000000..5a5f6f6d4553 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/6d.js @@ -0,0 +1,445 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in six-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary6d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] +*/ +function blockedquaternary6d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dx5; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dy5; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dz5; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var dw5; + var du0; + var du1; + var du2; + var du3; + var du4; + var du5; + var ox1; + var ox2; + var ox3; + var ox4; + var ox5; + var oy1; + var oy2; + var oy3; + var oy4; + var oy5; + var oz1; + var oz2; + var oz3; + var oz4; + var oz5; + var ow1; + var ow2; + var ow3; + var ow4; + var ow5; + var ou1; + var ou2; + var ou3; + var ou4; + var ou5; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var s5; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var i5; + var j0; + var j1; + var j2; + var j3; + var j4; + var j5; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); // eslint-disable-line max-len + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j5 = sh[5]; j5 > 0; ) { + if ( j5 < bsize ) { + s5 = j5; + j5 = 0; + } else { + s5 = bsize; + j5 -= bsize; + } + ox5 = ox + ( j5*sx[5] ); + oy5 = oy + ( j5*sy[5] ); + oz5 = oz + ( j5*sz[5] ); + ow5 = ow + ( j5*sw[5] ); + ou5 = ou + ( j5*su[5] ); + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + dx5 = sx[5] - ( s4*sx[4] ); + dy5 = sy[5] - ( s4*sy[4] ); + dz5 = sz[5] - ( s4*sz[4] ); + dw5 = sw[5] - ( s4*sw[4] ); + du5 = su[5] - ( s4*su[4] ); + ox4 = ox5 + ( j4*sx[4] ); + oy4 = oy5 + ( j4*sy[4] ); + oz4 = oz5 + ( j4*sz[4] ); + ow4 = ow5 + ( j4*sw[4] ); + ou4 = ou5 + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i5 = 0; i5 < s5; i5++ ) { + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); // eslint-disable-line max-len + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + ix += dx5; + iy += dy5; + iz += dz5; + iw += dw5; + iu += du5; + } + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary6d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/7d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/7d.js new file mode 100644 index 000000000000..173b1fbc77af --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/7d.js @@ -0,0 +1,484 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function, max-len */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in seven-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary7d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] +*/ +function blockedquaternary7d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dx5; + var dx6; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dy5; + var dy6; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dz5; + var dz6; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var dw5; + var dw6; + var du0; + var du1; + var du2; + var du3; + var du4; + var du5; + var du6; + var ox1; + var ox2; + var ox3; + var ox4; + var ox5; + var ox6; + var oy1; + var oy2; + var oy3; + var oy4; + var oy5; + var oy6; + var oz1; + var oz2; + var oz3; + var oz4; + var oz5; + var oz6; + var ow1; + var ow2; + var ow3; + var ow4; + var ow5; + var ow6; + var ou1; + var ou2; + var ou3; + var ou4; + var ou5; + var ou6; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var s5; + var s6; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var i5; + var i6; + var j0; + var j1; + var j2; + var j3; + var j4; + var j5; + var j6; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j6 = sh[6]; j6 > 0; ) { + if ( j6 < bsize ) { + s6 = j6; + j6 = 0; + } else { + s6 = bsize; + j6 -= bsize; + } + ox6 = ox + ( j6*sx[6] ); + oy6 = oy + ( j6*sy[6] ); + oz6 = oz + ( j6*sz[6] ); + ow6 = ow + ( j6*sw[6] ); + ou6 = ou + ( j6*su[6] ); + for ( j5 = sh[5]; j5 > 0; ) { + if ( j5 < bsize ) { + s5 = j5; + j5 = 0; + } else { + s5 = bsize; + j5 -= bsize; + } + dx6 = sx[6] - ( s5*sx[5] ); + dy6 = sy[6] - ( s5*sy[5] ); + dz6 = sz[6] - ( s5*sz[5] ); + dw6 = sw[6] - ( s5*sw[5] ); + du6 = su[6] - ( s5*su[5] ); + ox5 = ox6 + ( j5*sx[5] ); + oy5 = oy6 + ( j5*sy[5] ); + oz5 = oz6 + ( j5*sz[5] ); + ow5 = ow6 + ( j5*sw[5] ); + ou5 = ou6 + ( j5*su[5] ); + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + dx5 = sx[5] - ( s4*sx[4] ); + dy5 = sy[5] - ( s4*sy[4] ); + dz5 = sz[5] - ( s4*sz[4] ); + dw5 = sw[5] - ( s4*sw[4] ); + du5 = su[5] - ( s4*su[4] ); + ox4 = ox5 + ( j4*sx[4] ); + oy4 = oy5 + ( j4*sy[4] ); + oz4 = oz5 + ( j4*sz[4] ); + ow4 = ow5 + ( j4*sw[4] ); + ou4 = ou5 + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i6 = 0; i6 < s6; i6++ ) { + for ( i5 = 0; i5 < s5; i5++ ) { + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + ix += dx5; + iy += dy5; + iz += dz5; + iw += dw5; + iu += du5; + } + ix += dx6; + iy += dy6; + iz += dz6; + iw += dw6; + iu += du6; + } + } + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary7d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/8d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/8d.js new file mode 100644 index 000000000000..3c41ff7a5f5b --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/8d.js @@ -0,0 +1,523 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function, max-lines, max-len */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in eight-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 1, 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 8, 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary8d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] +*/ +function blockedquaternary8d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dx5; + var dx6; + var dx7; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dy5; + var dy6; + var dy7; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dz5; + var dz6; + var dz7; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var dw5; + var dw6; + var dw7; + var du0; + var du1; + var du2; + var du3; + var du4; + var du5; + var du6; + var du7; + var ox1; + var ox2; + var ox3; + var ox4; + var ox5; + var ox6; + var ox7; + var oy1; + var oy2; + var oy3; + var oy4; + var oy5; + var oy6; + var oy7; + var oz1; + var oz2; + var oz3; + var oz4; + var oz5; + var oz6; + var oz7; + var ow1; + var ow2; + var ow3; + var ow4; + var ow5; + var ow6; + var ow7; + var ou1; + var ou2; + var ou3; + var ou4; + var ou5; + var ou6; + var ou7; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var s5; + var s6; + var s7; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var i5; + var i6; + var i7; + var j0; + var j1; + var j2; + var j3; + var j4; + var j5; + var j6; + var j7; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j7 = sh[7]; j7 > 0; ) { + if ( j7 < bsize ) { + s7 = j7; + j7 = 0; + } else { + s7 = bsize; + j7 -= bsize; + } + ox7 = ox + ( j7*sx[7] ); + oy7 = oy + ( j7*sy[7] ); + oz7 = oz + ( j7*sz[7] ); + ow7 = ow + ( j7*sw[7] ); + ou7 = ou + ( j7*su[7] ); + for ( j6 = sh[6]; j6 > 0; ) { + if ( j6 < bsize ) { + s6 = j6; + j6 = 0; + } else { + s6 = bsize; + j6 -= bsize; + } + dx7 = sx[7] - ( s6*sx[6] ); + dy7 = sy[7] - ( s6*sy[6] ); + dz7 = sz[7] - ( s6*sz[6] ); + dw7 = sw[7] - ( s6*sw[6] ); + du7 = su[7] - ( s6*su[6] ); + ox6 = ox7 + ( j6*sx[6] ); + oy6 = oy7 + ( j6*sy[6] ); + oz6 = oz7 + ( j6*sz[6] ); + ow6 = ow7 + ( j6*sw[6] ); + ou6 = ou7 + ( j6*su[6] ); + for ( j5 = sh[5]; j5 > 0; ) { + if ( j5 < bsize ) { + s5 = j5; + j5 = 0; + } else { + s5 = bsize; + j5 -= bsize; + } + dx6 = sx[6] - ( s5*sx[5] ); + dy6 = sy[6] - ( s5*sy[5] ); + dz6 = sz[6] - ( s5*sz[5] ); + dw6 = sw[6] - ( s5*sw[5] ); + du6 = su[6] - ( s5*su[5] ); + ox5 = ox6 + ( j5*sx[5] ); + oy5 = oy6 + ( j5*sy[5] ); + oz5 = oz6 + ( j5*sz[5] ); + ow5 = ow6 + ( j5*sw[5] ); + ou5 = ou6 + ( j5*su[5] ); + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + dx5 = sx[5] - ( s4*sx[4] ); + dy5 = sy[5] - ( s4*sy[4] ); + dz5 = sz[5] - ( s4*sz[4] ); + dw5 = sw[5] - ( s4*sw[4] ); + du5 = su[5] - ( s4*su[4] ); + ox4 = ox5 + ( j4*sx[4] ); + oy4 = oy5 + ( j4*sy[4] ); + oz4 = oz5 + ( j4*sz[4] ); + ow4 = ow5 + ( j4*sw[4] ); + ou4 = ou5 + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i7 = 0; i7 < s7; i7++ ) { + for ( i6 = 0; i6 < s6; i6++ ) { + for ( i5 = 0; i5 < s5; i5++ ) { + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + ix += dx5; + iy += dy5; + iz += dz5; + iw += dw5; + iu += du5; + } + ix += dx6; + iy += dy6; + iz += dz6; + iw += dw6; + iu += du6; + } + ix += dx7; + iy += dy7; + iz += dz7; + iw += dw7; + iu += du7; + } + } + } + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary8d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/9d.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/9d.js new file mode 100644 index 000000000000..ef0c0131f465 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/9d.js @@ -0,0 +1,562 @@ +/** +* @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. +*/ + +/* eslint-disable max-depth, max-statements, max-lines-per-function, max-len, max-lines */ + +'use strict'; + +// MODULES // + +var loopOrder = require( '@stdlib/ndarray/base/quaternary-loop-interchange-order' ); +var blockSize = require( '@stdlib/ndarray/base/quaternary-tiling-block-size' ); + + +// MAIN // + +/** +* Applies a quaternary callback to elements in nine-dimensional input ndarrays and assigns results to elements in an equivalently shaped output ndarray via loop blocking. +* +* @private +* @param {Object} x - object containing input ndarray meta data +* @param {*} x.dtype - data type +* @param {Collection} x.data - data buffer +* @param {NonNegativeIntegerArray} x.shape - dimensions +* @param {IntegerArray} x.strides - stride lengths +* @param {NonNegativeInteger} x.offset - index offset +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} y - object containing input ndarray meta data +* @param {*} y.dtype - data type +* @param {Collection} y.data - data buffer +* @param {NonNegativeIntegerArray} y.shape - dimensions +* @param {IntegerArray} y.strides - stride lengths +* @param {NonNegativeInteger} y.offset - index offset +* @param {string} y.order - specifies whether `y` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} z - object containing input ndarray meta data +* @param {*} z.dtype - data type +* @param {Collection} z.data - data buffer +* @param {NonNegativeIntegerArray} z.shape - dimensions +* @param {IntegerArray} z.strides - stride lengths +* @param {NonNegativeInteger} z.offset - index offset +* @param {string} z.order - specifies whether `z` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} w - object containing input ndarray meta data +* @param {*} w.dtype - data type +* @param {Collection} w.data - data buffer +* @param {NonNegativeIntegerArray} w.shape - dimensions +* @param {IntegerArray} w.strides - stride lengths +* @param {NonNegativeInteger} w.offset - index offset +* @param {string} w.order - specifies whether `w` is row-major (C-style) or column-major (Fortran-style) +* @param {Object} u - object containing output ndarray meta data +* @param {*} u.dtype - data type +* @param {Collection} u.data - data buffer +* @param {NonNegativeIntegerArray} u.shape - dimensions +* @param {IntegerArray} u.strides - stride lengths +* @param {NonNegativeInteger} u.offset - index offset +* @param {string} u.order - specifies whether `u` is row-major (C-style) or column-major (Fortran-style) +* @param {Callback} fcn - quaternary callback +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var wbuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var ubuf = new Float64Array( 8 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 1, 1, 1, 1, 1, 1, 2, 2, 2 ]; +* +* // Define the array strides: +* var sx = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sy = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sz = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var sw = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* var su = [ 8, 8, 8, 8, 8, 8, 4, 2, 1 ]; +* +* // Define the index offsets: +* var ox = 0; +* var oy = 0; +* var oz = 0; +* var ow = 0; +* var ou = 0; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': ox, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': oy, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': oz, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': ow, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': ou, +* 'order': 'row-major' +* }; +* +* // Apply the quaternary function: +* blockedquaternary9d( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ [ [ [ [ [ [ [ 4.0, 5.0 ], [ 6.0, 7.0 ] ], [ [ 8.0, 9.0 ], [ 10.0, 11.0 ] ] ] ] ] ] ] ] ] +*/ +function blockedquaternary9d( x, y, z, w, u, fcn ) { + var bsize; + var xbuf; + var ybuf; + var zbuf; + var wbuf; + var ubuf; + var dx0; + var dx1; + var dx2; + var dx3; + var dx4; + var dx5; + var dx6; + var dx7; + var dx8; + var dy0; + var dy1; + var dy2; + var dy3; + var dy4; + var dy5; + var dy6; + var dy7; + var dy8; + var dz0; + var dz1; + var dz2; + var dz3; + var dz4; + var dz5; + var dz6; + var dz7; + var dz8; + var dw0; + var dw1; + var dw2; + var dw3; + var dw4; + var dw5; + var dw6; + var dw7; + var dw8; + var du0; + var du1; + var du2; + var du3; + var du4; + var du5; + var du6; + var du7; + var du8; + var ox1; + var ox2; + var ox3; + var ox4; + var ox5; + var ox6; + var ox7; + var ox8; + var oy1; + var oy2; + var oy3; + var oy4; + var oy5; + var oy6; + var oy7; + var oy8; + var oz1; + var oz2; + var oz3; + var oz4; + var oz5; + var oz6; + var oz7; + var oz8; + var ow1; + var ow2; + var ow3; + var ow4; + var ow5; + var ow6; + var ow7; + var ow8; + var ou1; + var ou2; + var ou3; + var ou4; + var ou5; + var ou6; + var ou7; + var ou8; + var sh; + var s0; + var s1; + var s2; + var s3; + var s4; + var s5; + var s6; + var s7; + var s8; + var sx; + var sy; + var sz; + var sw; + var su; + var ox; + var oy; + var oz; + var ow; + var ou; + var ix; + var iy; + var iz; + var iw; + var iu; + var i0; + var i1; + var i2; + var i3; + var i4; + var i5; + var i6; + var i7; + var i8; + var j0; + var j1; + var j2; + var j3; + var j4; + var j5; + var j6; + var j7; + var j8; + var o; + + // Note on variable naming convention: s#, dx#, dy#, dz#, dw#, du#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop... + + // Resolve the loop interchange order: + o = loopOrder( x.shape, x.strides, y.strides, z.strides, w.strides, u.strides ); + sh = o.sh; + sx = o.sx; + sy = o.sy; + sz = o.sz; + sw = o.sw; + su = o.su; + + // Determine the block size: + bsize = blockSize( x.dtype, y.dtype, z.dtype, w.dtype, u.dtype ); + + // Cache the indices of the first indexed elements in the respective ndarrays... + ox = x.offset; + oy = y.offset; + oz = z.offset; + ow = w.offset; + ou = u.offset; + + // Cache references to the input and output ndarray buffers... + xbuf = x.data; + ybuf = y.data; + zbuf = z.data; + wbuf = w.data; + ubuf = u.data; + + // Cache offset increments for the innermost loop... + dx0 = sx[0]; + dy0 = sy[0]; + dz0 = sz[0]; + dw0 = sw[0]; + du0 = su[0]; + + // Iterate over blocks... + for ( j8 = sh[8]; j8 > 0; ) { + if ( j8 < bsize ) { + s8 = j8; + j8 = 0; + } else { + s8 = bsize; + j8 -= bsize; + } + ox8 = ox + ( j8*sx[8] ); + oy8 = oy + ( j8*sy[8] ); + oz8 = oz + ( j8*sz[8] ); + ow8 = ow + ( j8*sw[8] ); + ou8 = ou + ( j8*su[8] ); + for ( j7 = sh[7]; j7 > 0; ) { + if ( j7 < bsize ) { + s7 = j7; + j7 = 0; + } else { + s7 = bsize; + j7 -= bsize; + } + dx8 = sx[8] - ( s7*sx[7] ); + dy8 = sy[8] - ( s7*sy[7] ); + dz8 = sz[8] - ( s7*sz[7] ); + dw8 = sw[8] - ( s7*sw[7] ); + du8 = su[8] - ( s7*su[7] ); + ox7 = ox8 + ( j7*sx[7] ); + oy7 = oy8 + ( j7*sy[7] ); + oz7 = oz8 + ( j7*sz[7] ); + ow7 = ow8 + ( j7*sw[7] ); + ou7 = ou8 + ( j7*su[7] ); + for ( j6 = sh[6]; j6 > 0; ) { + if ( j6 < bsize ) { + s6 = j6; + j6 = 0; + } else { + s6 = bsize; + j6 -= bsize; + } + dx7 = sx[7] - ( s6*sx[6] ); + dy7 = sy[7] - ( s6*sy[6] ); + dz7 = sz[7] - ( s6*sz[6] ); + dw7 = sw[7] - ( s6*sw[6] ); + du7 = su[7] - ( s6*su[6] ); + ox6 = ox7 + ( j6*sx[6] ); + oy6 = oy7 + ( j6*sy[6] ); + oz6 = oz7 + ( j6*sz[6] ); + ow6 = ow7 + ( j6*sw[6] ); + ou6 = ou7 + ( j6*su[6] ); + for ( j5 = sh[5]; j5 > 0; ) { + if ( j5 < bsize ) { + s5 = j5; + j5 = 0; + } else { + s5 = bsize; + j5 -= bsize; + } + dx6 = sx[6] - ( s5*sx[5] ); + dy6 = sy[6] - ( s5*sy[5] ); + dz6 = sz[6] - ( s5*sz[5] ); + dw6 = sw[6] - ( s5*sw[5] ); + du6 = su[6] - ( s5*su[5] ); + ox5 = ox6 + ( j5*sx[5] ); + oy5 = oy6 + ( j5*sy[5] ); + oz5 = oz6 + ( j5*sz[5] ); + ow5 = ow6 + ( j5*sw[5] ); + ou5 = ou6 + ( j5*su[5] ); + for ( j4 = sh[4]; j4 > 0; ) { + if ( j4 < bsize ) { + s4 = j4; + j4 = 0; + } else { + s4 = bsize; + j4 -= bsize; + } + dx5 = sx[5] - ( s4*sx[4] ); + dy5 = sy[5] - ( s4*sy[4] ); + dz5 = sz[5] - ( s4*sz[4] ); + dw5 = sw[5] - ( s4*sw[4] ); + du5 = su[5] - ( s4*su[4] ); + ox4 = ox5 + ( j4*sx[4] ); + oy4 = oy5 + ( j4*sy[4] ); + oz4 = oz5 + ( j4*sz[4] ); + ow4 = ow5 + ( j4*sw[4] ); + ou4 = ou5 + ( j4*su[4] ); + for ( j3 = sh[3]; j3 > 0; ) { + if ( j3 < bsize ) { + s3 = j3; + j3 = 0; + } else { + s3 = bsize; + j3 -= bsize; + } + dx4 = sx[4] - ( s3*sx[3] ); + dy4 = sy[4] - ( s3*sy[3] ); + dz4 = sz[4] - ( s3*sz[3] ); + dw4 = sw[4] - ( s3*sw[3] ); + du4 = su[4] - ( s3*su[3] ); + ox3 = ox4 + ( j3*sx[3] ); + oy3 = oy4 + ( j3*sy[3] ); + oz3 = oz4 + ( j3*sz[3] ); + ow3 = ow4 + ( j3*sw[3] ); + ou3 = ou4 + ( j3*su[3] ); + for ( j2 = sh[2]; j2 > 0; ) { + if ( j2 < bsize ) { + s2 = j2; + j2 = 0; + } else { + s2 = bsize; + j2 -= bsize; + } + dx3 = sx[3] - ( s2*sx[2] ); + dy3 = sy[3] - ( s2*sy[2] ); + dz3 = sz[3] - ( s2*sz[2] ); + dw3 = sw[3] - ( s2*sw[2] ); + du3 = su[3] - ( s2*su[2] ); + ox2 = ox3 + ( j2*sx[2] ); + oy2 = oy3 + ( j2*sy[2] ); + oz2 = oz3 + ( j2*sz[2] ); + ow2 = ow3 + ( j2*sw[2] ); + ou2 = ou3 + ( j2*su[2] ); + for ( j1 = sh[1]; j1 > 0; ) { + if ( j1 < bsize ) { + s1 = j1; + j1 = 0; + } else { + s1 = bsize; + j1 -= bsize; + } + dx2 = sx[2] - ( s1*sx[1] ); + dy2 = sy[2] - ( s1*sy[1] ); + dz2 = sz[2] - ( s1*sz[1] ); + dw2 = sw[2] - ( s1*sw[1] ); + du2 = su[2] - ( s1*su[1] ); + ox1 = ox2 + ( j1*sx[1] ); + oy1 = oy2 + ( j1*sy[1] ); + oz1 = oz2 + ( j1*sz[1] ); + ow1 = ow2 + ( j1*sw[1] ); + ou1 = ou2 + ( j1*su[1] ); + for ( j0 = sh[0]; j0 > 0; ) { + if ( j0 < bsize ) { + s0 = j0; + j0 = 0; + } else { + s0 = bsize; + j0 -= bsize; + } + // Compute index offsets for the first input and output ndarray elements in the current block... + ix = ox1 + ( j0*sx[0] ); + iy = oy1 + ( j0*sy[0] ); + iz = oz1 + ( j0*sz[0] ); + iw = ow1 + ( j0*sw[0] ); + iu = ou1 + ( j0*su[0] ); + + // Compute loop offset increments... + dx1 = sx[1] - ( s0*sx[0] ); + dy1 = sy[1] - ( s0*sy[0] ); + dz1 = sz[1] - ( s0*sz[0] ); + dw1 = sw[1] - ( s0*sw[0] ); + du1 = su[1] - ( s0*su[0] ); + + // Iterate over the ndarray dimensions... + for ( i8 = 0; i8 < s8; i8++ ) { + for ( i7 = 0; i7 < s7; i7++ ) { + for ( i6 = 0; i6 < s6; i6++ ) { + for ( i5 = 0; i5 < s5; i5++ ) { + for ( i4 = 0; i4 < s4; i4++ ) { + for ( i3 = 0; i3 < s3; i3++ ) { + for ( i2 = 0; i2 < s2; i2++ ) { + for ( i1 = 0; i1 < s1; i1++ ) { + for ( i0 = 0; i0 < s0; i0++ ) { + ubuf[ iu ] = fcn( xbuf[ ix ], ybuf[ iy ], zbuf[ iz ], wbuf[ iw ] ); + ix += dx0; + iy += dy0; + iz += dz0; + iw += dw0; + iu += du0; + } + ix += dx1; + iy += dy1; + iz += dz1; + iw += dw1; + iu += du1; + } + ix += dx2; + iy += dy2; + iz += dz2; + iw += dw2; + iu += du2; + } + ix += dx3; + iy += dy3; + iz += dz3; + iw += dw3; + iu += du3; + } + ix += dx4; + iy += dy4; + iz += dz4; + iw += dw4; + iu += du4; + } + ix += dx5; + iy += dy5; + iz += dz5; + iw += dw5; + iu += du5; + } + ix += dx6; + iy += dy6; + iz += dz6; + iw += dw6; + iu += du6; + } + ix += dx7; + iy += dy7; + iz += dz7; + iw += dw7; + iu += du7; + } + ix += dx8; + iy += dy8; + iz += dz8; + iw += dw8; + iu += du8; + } + } + } + } + } + } + } + } + } + } +} + + +// EXPORTS // + +module.exports = blockedquaternary9d; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/index.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/index.js new file mode 100644 index 000000000000..a1f4ca2cad46 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/index.js @@ -0,0 +1,131 @@ +/** +* @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'; + +/** +* Return a kernel for applying a quaternary callback to elements in four input ndarrays and assigning results to elements in an output ndarray using loop blocking. +* +* @module @stdlib/ndarray/base/kernels/generic/quaternary/blocked +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* var kernel = require( '@stdlib/ndarray/base/kernels/generic/quaternary/blocked' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +* var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +* var ubuf = new Float64Array( 6 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 3, 2 ]; +* +* // Define the array strides: +* var sx = [ 2, 1 ]; +* var sy = [ 2, 1 ]; +* var sz = [ 2, 1 ]; +* var sw = [ 2, 1 ]; +* var su = [ 2, 1 ]; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': 0, +* 'order': 'row-major' +* }; +* +* // Resolve a kernel: +* var f = kernel( 2 ); +* +* // Apply the quaternary function: +* f( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] +*/ + +// MODULES // + +var setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' ); +var kernel2d = require( './2d.js' ); +var kernel3d = require( './3d.js' ); +var kernel4d = require( './4d.js' ); +var kernel5d = require( './5d.js' ); +var kernel6d = require( './6d.js' ); +var kernel7d = require( './7d.js' ); +var kernel8d = require( './8d.js' ); +var kernel9d = require( './9d.js' ); +var kernel10d = require( './10d.js' ); +var main = require( './main.js' ); + + +// MAIN // + +setReadOnly( main, 'kernel2d', kernel2d ); +setReadOnly( main, 'kernel3d', kernel3d ); +setReadOnly( main, 'kernel4d', kernel4d ); +setReadOnly( main, 'kernel5d', kernel5d ); +setReadOnly( main, 'kernel6d', kernel6d ); +setReadOnly( main, 'kernel7d', kernel7d ); +setReadOnly( main, 'kernel8d', kernel8d ); +setReadOnly( main, 'kernel9d', kernel9d ); +setReadOnly( main, 'kernel10d', kernel10d ); + + +// EXPORTS // + +module.exports = main; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/main.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/main.js new file mode 100644 index 000000000000..349543ff37b1 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/lib/main.js @@ -0,0 +1,141 @@ +/** +* @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 kernel2d = require( './2d.js' ); +var kernel3d = require( './3d.js' ); +var kernel4d = require( './4d.js' ); +var kernel5d = require( './5d.js' ); +var kernel6d = require( './6d.js' ); +var kernel7d = require( './7d.js' ); +var kernel8d = require( './8d.js' ); +var kernel9d = require( './9d.js' ); +var kernel10d = require( './10d.js' ); + + +// VARIABLES // + +var KERNELS = [ + kernel2d, // 0 + kernel3d, + kernel4d, + kernel5d, + kernel6d, + kernel7d, + kernel8d, + kernel9d, + kernel10d // 8 +]; +var MAX_DIMS = KERNELS.length + 1; + + +// MAIN // + +/** +* Returns a kernel for applying a quaternary callback to elements in four input ndarrays and assigning results to elements in an output ndarray using loop blocking. +* +* @param {integer} ndims - number of dimensions +* @returns {(Function|null)} kernel function or null +* +* @example +* var Float64Array = require( '@stdlib/array/float64' ); +* var ndarray2array = require( '@stdlib/ndarray/base/to-array' ); +* var add4 = require( '@stdlib/number/float64/base/add4' ); +* +* // Create data buffers: +* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); +* var ybuf = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] ); +* var zbuf = new Float64Array( [ 2.0, 2.0, 2.0, 2.0, 2.0, 2.0 ] ); +* var wbuf = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] ); +* var ubuf = new Float64Array( 6 ); +* +* // Define the shape of the input and output arrays: +* var shape = [ 3, 2 ]; +* +* // Define the array strides: +* var sx = [ 2, 1 ]; +* var sy = [ 2, 1 ]; +* var sz = [ 2, 1 ]; +* var sw = [ 2, 1 ]; +* var su = [ 2, 1 ]; +* +* // Create the input and output ndarray-like objects: +* var x = { +* 'dtype': 'float64', +* 'data': xbuf, +* 'shape': shape, +* 'strides': sx, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var y = { +* 'dtype': 'float64', +* 'data': ybuf, +* 'shape': shape, +* 'strides': sy, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var z = { +* 'dtype': 'float64', +* 'data': zbuf, +* 'shape': shape, +* 'strides': sz, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var w = { +* 'dtype': 'float64', +* 'data': wbuf, +* 'shape': shape, +* 'strides': sw, +* 'offset': 0, +* 'order': 'row-major' +* }; +* var u = { +* 'dtype': 'float64', +* 'data': ubuf, +* 'shape': shape, +* 'strides': su, +* 'offset': 0, +* 'order': 'row-major' +* }; +* +* // Resolve a kernel: +* var f = kernel( 2 ); +* +* // Apply the quaternary function: +* f( x, y, z, w, u, add4 ); +* +* var arr = ndarray2array( u.data, u.shape, u.strides, u.offset, u.order ); +* // returns [ [ 7.0, 8.0 ], [ 9.0, 10.0 ], [ 11.0, 12.0 ] ] +*/ +function kernel( ndims ) { + if ( ndims < 2 || ndims > MAX_DIMS ) { + return null; + } + return KERNELS[ ndims-2 ]; +} + + +// EXPORTS // + +module.exports = kernel; diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/package.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/package.json new file mode 100644 index 000000000000..1c993bff3bea --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/package.json @@ -0,0 +1,64 @@ +{ + "name": "@stdlib/ndarray/base/kernels/generic/quaternary/blocked", + "version": "0.0.0", + "description": "Return a kernel for applying a quaternary callback to elements in four input ndarrays and assigning results to elements in an output ndarray using loop blocking.", + "license": "Apache-2.0", + "author": { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + }, + "contributors": [ + { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + } + ], + "main": "./lib", + "directories": { + "benchmark": "./benchmark", + "doc": "./docs", + "example": "./examples", + "lib": "./lib", + "test": "./test" + }, + "types": "./docs/types", + "scripts": {}, + "homepage": "https://github.com/stdlib-js/stdlib", + "repository": { + "type": "git", + "url": "git://github.com/stdlib-js/stdlib.git" + }, + "bugs": { + "url": "https://github.com/stdlib-js/stdlib/issues" + }, + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=0.10.0", + "npm": ">2.7.0" + }, + "os": [ + "aix", + "darwin", + "freebsd", + "linux", + "macos", + "openbsd", + "sunos", + "win32", + "windows" + ], + "keywords": [ + "stdlib", + "base", + "ndarray", + "quaternary", + "apply", + "element-wise", + "elementwise", + "callback", + "kernel", + "blocked" + ], + "__stdlib__": {} +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_10d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_10d.json new file mode 100644 index 000000000000..8bb1cd190ba8 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_10d.json @@ -0,0 +1,50 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 1, 1, 1, 1, 1, 2], + [1, 16, 1, 1, 1, 1, 1, 1, 1, 2], + [1, 1, 16, 1, 1, 1, 1, 1, 1, 2], + [1, 1, 1, 16, 1, 1, 1, 1, 1, 2], + [1, 1, 1, 1, 16, 1, 1, 1, 1, 2], + [1, 1, 1, 1, 1, 16, 1, 1, 1, 2], + [1, 1, 1, 1, 1, 1, 16, 1, 1, 2], + [1, 1, 1, 1, 1, 1, 1, 16, 1, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 16, 2], + [1, 1, 1, 1, 1, 1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, -4, -4, -4, -4, -4, 2], + [-64, -4, -4, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -4, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -64, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -64, -64, -4, 2], + [64, 64, 64, 64, 64, 64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 1, 1, 1, 1, 1, 16], + [2, 1, 1, 1, 1, 1, 1, 1, 16, 1], + [2, 1, 1, 1, 1, 1, 1, 16, 1, 1], + [2, 1, 1, 1, 1, 1, 16, 1, 1, 1], + [2, 1, 1, 1, 1, 16, 1, 1, 1, 1], + [2, 1, 1, 1, 16, 1, 1, 1, 1, 1], + [2, 1, 1, 16, 1, 1, 1, 1, 1, 1], + [2, 1, 16, 1, 1, 1, 1, 1, 1, 1], + [2, 16, 1, 1, 1, 1, 1, 1, 1, 1], + [16, 2, 1, 1, 1, 1, 1, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4, -4, -4, -4, -4, -4], + [2, -4, -4, -4, -4, -4, -4, -4, -4, -64], + [2, -4, -4, -4, -4, -4, -4, -4, -64, -64], + [2, -4, -4, -4, -4, -4, -4, -64, -64, -64], + [2, -4, -4, -4, -4, -4, -64, -64, -64, -64], + [2, -4, -4, -4, -4, -64, -64, -64, -64, -64], + [2, -4, -4, -4, -64, -64, -64, -64, -64, -64], + [2, -4, -4, -64, -64, -64, -64, -64, -64, -64], + [2, -4, -64, -64, -64, -64, -64, -64, -64, -64], + [-2, 32, 64, 64, 64, 64, 64, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_2d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_2d.json new file mode 100644 index 000000000000..37edb1d0d2ec --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_2d.json @@ -0,0 +1,18 @@ +{ + "row_major_shapes": [ + [16, 2], + [2, 16] + ], + "row_major_strides": [ + [-4, 2], + [32, -2] + ], + "column_major_shapes": [ + [2, 16], + [16, 2] + ], + "column_major_strides": [ + [2, -4], + [-2, 32] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_3d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_3d.json new file mode 100644 index 000000000000..07eaf71a41c5 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_3d.json @@ -0,0 +1,22 @@ +{ + "row_major_shapes": [ + [16, 1, 2], + [1, 16, 2], + [1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, 2], + [-64, -4, 2], + [64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 16], + [2, 16, 1], + [16, 2, 1] + ], + "column_major_strides": [ + [2, -4, -4], + [2, -4, -64], + [-2, 32, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_4d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_4d.json new file mode 100644 index 000000000000..b7a256735153 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_4d.json @@ -0,0 +1,26 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 2], + [1, 16, 1, 2], + [1, 1, 16, 2], + [1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, 2], + [-64, -4, -4, 2], + [-64, -64, -4, 2], + [64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 16], + [2, 1, 16, 1], + [2, 16, 1, 1], + [16, 2, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4], + [2, -4, -4, -64], + [2, -4, -64, -64], + [-2, 32, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_5d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_5d.json new file mode 100644 index 000000000000..27f3de836110 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_5d.json @@ -0,0 +1,30 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 2], + [1, 16, 1, 1, 2], + [1, 1, 16, 1, 2], + [1, 1, 1, 16, 2], + [1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, 2], + [-64, -4, -4, -4, 2], + [-64, -64, -4, -4, 2], + [-64, -64, -64, -4, 2], + [64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 16], + [2, 1, 1, 16, 1], + [2, 1, 16, 1, 1], + [2, 16, 1, 1, 1], + [16, 2, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4], + [2, -4, -4, -4, -64], + [2, -4, -4, -64, -64], + [2, -4, -64, -64, -64], + [-2, 32, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_6d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_6d.json new file mode 100644 index 000000000000..9fc75c38dc5b --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_6d.json @@ -0,0 +1,34 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 1, 2], + [1, 16, 1, 1, 1, 2], + [1, 1, 16, 1, 1, 2], + [1, 1, 1, 16, 1, 2], + [1, 1, 1, 1, 16, 2], + [1, 1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, -4, 2], + [-64, -4, -4, -4, -4, 2], + [-64, -64, -4, -4, -4, 2], + [-64, -64, -64, -4, -4, 2], + [-64, -64, -64, -64, -4, 2], + [64, 64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 1, 16], + [2, 1, 1, 1, 16, 1], + [2, 1, 1, 16, 1, 1], + [2, 1, 16, 1, 1, 1], + [2, 16, 1, 1, 1, 1], + [16, 2, 1, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4, -4], + [2, -4, -4, -4, -4, -64], + [2, -4, -4, -4, -64, -64], + [2, -4, -4, -64, -64, -64], + [2, -4, -64, -64, -64, -64], + [-2, 32, 64, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_7d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_7d.json new file mode 100644 index 000000000000..b970cac67aca --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_7d.json @@ -0,0 +1,38 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 1, 1, 2], + [1, 16, 1, 1, 1, 1, 2], + [1, 1, 16, 1, 1, 1, 2], + [1, 1, 1, 16, 1, 1, 2], + [1, 1, 1, 1, 16, 1, 2], + [1, 1, 1, 1, 1, 16, 2], + [1, 1, 1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, -4, -4, 2], + [-64, -4, -4, -4, -4, -4, 2], + [-64, -64, -4, -4, -4, -4, 2], + [-64, -64, -64, -4, -4, -4, 2], + [-64, -64, -64, -64, -4, -4, 2], + [-64, -64, -64, -64, -64, -4, 2], + [64, 64, 64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 1, 1, 16], + [2, 1, 1, 1, 1, 16, 1], + [2, 1, 1, 1, 16, 1, 1], + [2, 1, 1, 16, 1, 1, 1], + [2, 1, 16, 1, 1, 1, 1], + [2, 16, 1, 1, 1, 1, 1], + [16, 2, 1, 1, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4, -4, -4], + [2, -4, -4, -4, -4, -4, -64], + [2, -4, -4, -4, -4, -64, -64], + [2, -4, -4, -4, -64, -64, -64], + [2, -4, -4, -64, -64, -64, -64], + [2, -4, -64, -64, -64, -64, -64], + [-2, 32, 64, 64, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_8d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_8d.json new file mode 100644 index 000000000000..ef984d23d869 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_8d.json @@ -0,0 +1,42 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 1, 1, 1, 2], + [1, 16, 1, 1, 1, 1, 1, 2], + [1, 1, 16, 1, 1, 1, 1, 2], + [1, 1, 1, 16, 1, 1, 1, 2], + [1, 1, 1, 1, 16, 1, 1, 2], + [1, 1, 1, 1, 1, 16, 1, 2], + [1, 1, 1, 1, 1, 1, 16, 2], + [1, 1, 1, 1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, -4, -4, -4, 2], + [-64, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -4, 2], + [64, 64, 64, 64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 1, 1, 1, 16], + [2, 1, 1, 1, 1, 1, 16, 1], + [2, 1, 1, 1, 1, 16, 1, 1], + [2, 1, 1, 1, 16, 1, 1, 1], + [2, 1, 1, 16, 1, 1, 1, 1], + [2, 1, 16, 1, 1, 1, 1, 1], + [2, 16, 1, 1, 1, 1, 1, 1], + [16, 2, 1, 1, 1, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4, -4, -4, -4], + [2, -4, -4, -4, -4, -4, -4, -64], + [2, -4, -4, -4, -4, -4, -64, -64], + [2, -4, -4, -4, -4, -64, -64, -64], + [2, -4, -4, -4, -64, -64, -64, -64], + [2, -4, -4, -64, -64, -64, -64, -64], + [2, -4, -64, -64, -64, -64, -64, -64], + [-2, 32, 64, 64, 64, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_9d.json b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_9d.json new file mode 100644 index 000000000000..ca65a36d9beb --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/fixtures/large_9d.json @@ -0,0 +1,46 @@ +{ + "row_major_shapes": [ + [16, 1, 1, 1, 1, 1, 1, 1, 2], + [1, 16, 1, 1, 1, 1, 1, 1, 2], + [1, 1, 16, 1, 1, 1, 1, 1, 2], + [1, 1, 1, 16, 1, 1, 1, 1, 2], + [1, 1, 1, 1, 16, 1, 1, 1, 2], + [1, 1, 1, 1, 1, 16, 1, 1, 2], + [1, 1, 1, 1, 1, 1, 16, 1, 2], + [1, 1, 1, 1, 1, 1, 1, 16, 2], + [1, 1, 1, 1, 1, 1, 1, 2, 16] + ], + "row_major_strides": [ + [-4, -4, -4, -4, -4, -4, -4, -4, 2], + [-64, -4, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -4, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -4, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -4, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -4, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -4, -4, 2], + [-64, -64, -64, -64, -64, -64, -64, -4, 2], + [64, 64, 64, 64, 64, 64, 64, 32, -2] + ], + "column_major_shapes": [ + [2, 1, 1, 1, 1, 1, 1, 1, 16], + [2, 1, 1, 1, 1, 1, 1, 16, 1], + [2, 1, 1, 1, 1, 1, 16, 1, 1], + [2, 1, 1, 1, 1, 16, 1, 1, 1], + [2, 1, 1, 1, 16, 1, 1, 1, 1], + [2, 1, 1, 16, 1, 1, 1, 1, 1], + [2, 1, 16, 1, 1, 1, 1, 1, 1], + [2, 16, 1, 1, 1, 1, 1, 1, 1], + [16, 2, 1, 1, 1, 1, 1, 1, 1] + ], + "column_major_strides": [ + [2, -4, -4, -4, -4, -4, -4, -4, -4], + [2, -4, -4, -4, -4, -4, -4, -4, -64], + [2, -4, -4, -4, -4, -4, -4, -64, -64], + [2, -4, -4, -4, -4, -4, -64, -64, -64], + [2, -4, -4, -4, -4, -64, -64, -64, -64], + [2, -4, -4, -4, -64, -64, -64, -64, -64], + [2, -4, -4, -64, -64, -64, -64, -64, -64], + [2, -4, -64, -64, -64, -64, -64, -64, -64], + [-2, 32, 64, 64, 64, 64, 64, 64, 64] + ] +} diff --git a/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/test.js b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/test.js new file mode 100644 index 000000000000..9b74dcebafb2 --- /dev/null +++ b/lib/node_modules/@stdlib/ndarray/base/kernels/generic/quaternary/blocked/test/test.js @@ -0,0 +1,234 @@ +/** +* @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 tape = require( 'tape' ); +var isSameFloat64Array = require( '@stdlib/assert/is-same-float64array' ); +var Float64Array = require( '@stdlib/array/float64' ); +var oneTo = require( '@stdlib/array/one-to' ); +var zeros = require( '@stdlib/array/zeros' ); +var shape2strides = require( '@stdlib/ndarray/base/shape2strides' ); +var strides2offset = require( '@stdlib/ndarray/base/strides2offset' ); +var descriptor = require( '@stdlib/ndarray/base/descriptor' ); +var numel = require( '@stdlib/ndarray/base/numel' ); +var dfill = require( '@stdlib/blas/ext/base/dfill' ); +var ones = require( '@stdlib/array/ones' ); +var add4 = require( '@stdlib/number/float64/base/add4' ); +var kernel = require( './../lib' ); +var LARGE_2D = require( './fixtures/large_2d.json' ); +var LARGE_3D = require( './fixtures/large_3d.json' ); +var LARGE_4D = require( './fixtures/large_4d.json' ); +var LARGE_5D = require( './fixtures/large_5d.json' ); +var LARGE_6D = require( './fixtures/large_6d.json' ); +var LARGE_7D = require( './fixtures/large_7d.json' ); +var LARGE_8D = require( './fixtures/large_8d.json' ); +var LARGE_9D = require( './fixtures/large_9d.json' ); +var LARGE_10D = require( './fixtures/large_10d.json' ); + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof kernel, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function returns null if provided an unsupported number of dimensions', function test( t ) { + t.strictEqual( kernel( -1 ), null, 'returns expected value' ); + t.strictEqual( kernel( 0 ), null, 'returns expected value' ); + t.strictEqual( kernel( 1 ), null, 'returns expected value' ); + t.strictEqual( kernel( 11 ), null, 'returns expected value' ); + t.strictEqual( kernel( 100 ), null, 'returns expected value' ); + t.end(); +}); + +tape( 'the function returns a kernel for applying a quaternary callback (row-major)', function test( t ) { + var expected; + var shapes; + var sh; + var st; + var x; + var u; + var f; + var i; + + shapes = [ + [ 2, 3 ], + [ 2, 1, 3 ], + [ 1, 2, 1, 3 ], + [ 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 1, 1, 2, 1, 3 ] + ]; + expected = new Float64Array( [ 4.0, 8.0, 12.0, 16.0, 20.0, 24.0 ] ); + + for ( i = 0; i < shapes.length; i++ ) { + sh = shapes[ i ]; + st = shape2strides( sh, 'row-major' ); + + x = descriptor( 'float64', oneTo( numel( sh ), 'float64' ), sh, st, strides2offset( sh, st ), 'row-major' ); + u = descriptor( 'float64', zeros( numel( sh ), 'float64' ), sh, st, strides2offset( sh, st ), 'row-major' ); + + f = kernel( sh.length ); + f( x, x, x, x, u, add4 ); + t.strictEqual( isSameFloat64Array( u.data, expected ), true, 'returns expected value' ); + } + t.end(); +}); + +tape( 'the function returns a kernel for applying a quaternary callback (column-major)', function test( t ) { + var expected; + var shapes; + var sh; + var st; + var x; + var u; + var f; + var i; + + shapes = [ + [ 2, 3 ], + [ 2, 1, 3 ], + [ 1, 2, 1, 3 ], + [ 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 1, 2, 1, 3 ], + [ 1, 1, 1, 1, 1, 1, 1, 2, 1, 3 ] + ]; + expected = new Float64Array( [ 4.0, 8.0, 12.0, 16.0, 20.0, 24.0 ] ); + + for ( i = 0; i < shapes.length; i++ ) { + sh = shapes[ i ]; + st = shape2strides( sh, 'column-major' ); + + x = descriptor( 'float64', oneTo( numel( sh ), 'float64' ), sh, st, strides2offset( sh, st ), 'column-major' ); + u = descriptor( 'float64', zeros( numel( sh ), 'float64' ), sh, st, strides2offset( sh, st ), 'column-major' ); + + f = kernel( sh.length ); + f( x, x, x, x, u, add4 ); + t.strictEqual( isSameFloat64Array( u.data, expected ), true, 'returns expected value' ); + } + t.end(); +}); + +tape( 'the function returns a kernel for applying a quaternary callback (row-major, non-contiguous, large arrays)', function test( t ) { + var fixtures; + var expected; + var strides; + var shapes; + var len; + var sh; + var st; + var o; + var x; + var u; + var f; + var j; + var i; + + fixtures = [ + LARGE_2D, + LARGE_3D, + LARGE_4D, + LARGE_5D, + LARGE_6D, + LARGE_7D, + LARGE_8D, + LARGE_9D, + LARGE_10D + ]; + for ( j = 0; j < fixtures.length; j++ ) { + shapes = fixtures[ j ].row_major_shapes; + strides = fixtures[ j ].row_major_strides; + for ( i = 0; i < shapes.length; i++ ) { + sh = shapes[ i ]; + st = strides[ i ]; + o = strides2offset( sh, st ); + len = numel( sh ); + + x = descriptor( 'float64', ones( len*2, 'float64' ), sh, st, o, 'row-major' ); + u = descriptor( 'float64', zeros( len*2, 'float64' ), sh, st, o, 'row-major' ); + + f = kernel( sh.length ); + f( x, x, x, x, u, add4 ); + + expected = new Float64Array( len*2 ); + dfill( len, 4.0, expected, st[ sh.length-1 ] ); + t.strictEqual( isSameFloat64Array( u.data, expected ), true, 'returns expected value' ); + } + } + t.end(); +}); + +tape( 'the function returns a kernel for applying a quaternary callback (column-major, non-contiguous, large arrays)', function test( t ) { + var fixtures; + var expected; + var strides; + var shapes; + var len; + var sh; + var st; + var o; + var x; + var u; + var f; + var j; + var i; + + fixtures = [ + LARGE_2D, + LARGE_3D, + LARGE_4D, + LARGE_5D, + LARGE_6D, + LARGE_7D, + LARGE_8D, + LARGE_9D, + LARGE_10D + ]; + for ( j = 0; j < fixtures.length; j++ ) { + shapes = fixtures[ j ].column_major_shapes; + strides = fixtures[ j ].column_major_strides; + for ( i = 0; i < shapes.length; i++ ) { + sh = shapes[ i ]; + st = strides[ i ]; + o = strides2offset( sh, st ); + len = numel( sh ); + + x = descriptor( 'float64', ones( len*2, 'float64' ), sh, st, o, 'column-major' ); + u = descriptor( 'float64', zeros( len*2, 'float64' ), sh, st, o, 'column-major' ); + + f = kernel( sh.length ); + f( x, x, x, x, u, add4 ); + + expected = new Float64Array( len*2 ); + dfill( len, 4.0, expected, st[ 0 ] ); + t.strictEqual( isSameFloat64Array( u.data, expected ), true, 'returns expected value' ); + } + } + t.end(); +});