diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/README.md b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/README.md
new file mode 100644
index 000000000000..7ee85301c9e7
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/README.md
@@ -0,0 +1,216 @@
+
+
+# binaryReduceStrided1d
+
+> Perform a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assign results to a provided output ndarray.
+
+
+
+
+
+
+
+## Usage
+
+```javascript
+var binaryReduceStrided1d = require( '@stdlib/ndarray/base/binary-reduce-strided1d' );
+```
+
+#### binaryReduceStrided1d( fcn, arrays, dims\[, options] )
+
+Performs a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assigns results to a provided output ndarray.
+
+
+
+```javascript
+var Float64Array = require( '@stdlib/array/float64' );
+var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+
+// Create data buffers:
+var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+
+// Define the array shapes:
+var xsh = [ 1, 3, 2, 2 ];
+var ysh = [ 1, 3, 2, 2 ];
+var zsh = [ 1, 3 ];
+
+// Define the array strides:
+var sx = [ 12, 4, 2, 1 ];
+var sy = [ 12, 4, 2, 1 ];
+var sz = [ 3, 1 ];
+
+// Define the index offsets:
+var ox = 0;
+var oy = 0;
+var oz = 0;
+
+// Create input ndarray-like objects:
+var x = {
+ 'dtype': 'float64',
+ 'data': xbuf,
+ 'shape': xsh,
+ 'strides': sx,
+ 'offset': ox,
+ 'order': 'row-major'
+};
+var y = {
+ 'dtype': 'float64',
+ 'data': ybuf,
+ 'shape': ysh,
+ 'strides': sy,
+ 'offset': oy,
+ 'order': 'row-major'
+};
+
+// Create an output ndarray-like object:
+var z = {
+ 'dtype': 'float64',
+ 'data': zbuf,
+ 'shape': zsh,
+ 'strides': sz,
+ 'offset': oz,
+ 'order': 'row-major'
+};
+
+// Perform a reduction:
+binaryReduceStrided1d( gdot, [ x, y, z ], [ 2, 3 ] );
+
+var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+// returns [ [ 30.0, 174.0, 446.0 ] ]
+```
+
+The function accepts the following arguments:
+
+- **fcn**: function which will be applied to two one-dimensional subarrays and should reduce them to a single scalar value.
+- **arrays**: array-like object containing two input ndarrays and one output ndarray, followed by any additional ndarray arguments.
+- **dims**: list of dimensions over which to perform a reduction.
+- **options**: function options which are passed through to `fcn` (_optional_).
+
+Each provided ndarray should be an object with the following properties:
+
+- **dtype**: data type.
+- **data**: data buffer.
+- **shape**: dimensions.
+- **strides**: stride lengths.
+- **offset**: index offset.
+- **order**: specifies whether an ndarray is row-major (C-style) or column major (Fortran-style).
+
+#### TODO: document factory method
+
+
+
+
+
+
+
+## Notes
+
+- The output ndarray and any additional ndarray arguments are expected to have the same dimensions as the non-reduced dimensions of the input ndarrays. When calling the reduction function, any additional ndarray arguments are provided as zero-dimensional ndarray-like objects.
+
+- The reduction function is expected to have the following signature:
+
+ ```text
+ fcn( arrays[, options] )
+ ```
+
+ where
+
+ - **arrays**: array containing two one-dimensional subarrays from the input ndarrays and any additional ndarray arguments as zero-dimensional ndarrays.
+ - **options**: function options (_optional_).
+
+- For very high-dimensional ndarrays which are non-contiguous, one should consider copying the underlying data to contiguous memory before performing a reduction in order to achieve better performance.
+
+
+
+
+
+
+
+## Examples
+
+
+
+```javascript
+var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+var binaryReduceStrided1d = require( '@stdlib/ndarray/base/binary-reduce-strided1d' );
+
+var N = 10;
+var x = {
+ 'dtype': 'generic',
+ 'data': discreteUniform( N, -5, 5, {
+ 'dtype': 'generic'
+ }),
+ 'shape': [ 1, 5, 2 ],
+ 'strides': [ 10, 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+var y = {
+ 'dtype': 'generic',
+ 'data': discreteUniform( N, -5, 5, {
+ 'dtype': 'generic'
+ }),
+ 'shape': [ 1, 5, 2 ],
+ 'strides': [ 10, 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+var z = {
+ 'dtype': 'generic',
+ 'data': zeros( 2 ),
+ 'shape': [ 1, 2 ],
+ 'strides': [ 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+
+binaryReduceStrided1d( gdot, [ x, y, z ], [ 1 ] );
+
+console.log( ndarray2array( x.data, x.shape, x.strides, x.offset, x.order ) );
+console.log( ndarray2array( y.data, y.shape, y.strides, y.offset, y.order ) );
+console.log( ndarray2array( z.data, z.shape, z.strides, z.offset, z.order ) );
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/docs/repl.txt b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/docs/repl.txt
new file mode 100644
index 000000000000..6c7ae9427de4
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/docs/repl.txt
@@ -0,0 +1,98 @@
+
+{{alias}}( fcn, arrays, dims[, options] )
+ Performs a reduction over a list of specified dimensions in two input
+ ndarrays via a one-dimensional strided array binary reduction function
+ and assigns results to a provided output ndarray.
+
+ Each provided "ndarray" should be an object with the following properties:
+
+ - dtype: data type.
+ - data: data buffer.
+ - shape: dimensions.
+ - strides: stride lengths.
+ - offset: index offset.
+ - order: specifies whether an ndarray is row-major (C-style) or column-major
+ (Fortran-style).
+
+ The output ndarray and any additional ndarray arguments are expected to have
+ the same dimensions as the non-reduced dimensions of the input ndarray. When
+ calling the reduction function, any additional ndarray arguments are
+ provided as zero-dimensional ndarray-like objects.
+
+ Parameters
+ ----------
+ fcn: Function
+ Binary reduction function which will be applied to two one-dimensional
+ subarrays and should reduce them to a single scalar value. The function
+ should have the following signature:
+
+ fcn( arrays[, options] )
+
+ where
+
+ - arrays: array containing two one-dimensional subarrays of the input
+ ndarrays and any additional ndarray arguments as zero-dimensional
+ ndarrays.
+ - options: function options.
+
+ arrays: ArrayLikeObject
+ Array-like object containing two input ndarrays and one output ndarray,
+ followed by any additional ndarray arguments.
+
+ dims: Array
+ List of dimensions over which to perform a reduction.
+
+ options: Object (optional)
+ Function options.
+
+ Examples
+ --------
+ // Define ndarray data and meta data...
+ > var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+ > var xbuf = new {{alias:@stdlib/array/float64}}( [ 1.0, 2.0, 3.0, 4.0 ] );
+ > var ybuf = new {{alias:@stdlib/array/float64}}( [ 1.0, 2.0, 3.0, 4.0 ] );
+ > var zbuf = new {{alias:@stdlib/array/float64}}( [ 0.0 ] );
+ > var dtype = 'float64';
+ > var shx = [ 2, 2 ];
+ > var shy = [ 2, 2 ];
+ > var shz = [];
+ > var sx = [ 2, 1 ];
+ > var sy = [ 2, 1 ];
+ > var sz = [ 0 ];
+ > var ox = 0;
+ > var oy = 0;
+ > var oz = 0;
+ > var order = 'row-major';
+
+ // Create ndarray objects...
+ > var x = {
+ ... 'dtype': dtype,
+ ... 'data': xbuf,
+ ... 'shape': shx,
+ ... 'strides': sx,
+ ... 'offset': ox,
+ ... 'order': order
+ ... };
+ > var y = {
+ ... 'dtype': dtype,
+ ... 'data': ybuf,
+ ... 'shape': shy,
+ ... 'strides': sy,
+ ... 'offset': oy,
+ ... 'order': order
+ ... };
+ > var z = {
+ ... 'dtype': dtype,
+ ... 'data': zbuf,
+ ... 'shape': shz,
+ ... 'strides': sz,
+ ... 'offset': oz,
+ ... 'order': order
+ ... };
+ > {{alias}}( gdot, [ x, y, z ], [ 0, 1 ] );
+ > z.data
+ [ 30.0 ]
+
+ See Also
+ --------
+
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/examples/index.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/examples/index.js
new file mode 100644
index 000000000000..59880b6621d4
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/examples/index.js
@@ -0,0 +1,61 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+var binaryReduceStrided1d = require( './../lib' );
+
+var N = 10;
+var x = {
+ 'dtype': 'generic',
+ 'data': discreteUniform( N, -5, 5, {
+ 'dtype': 'generic'
+ }),
+ 'shape': [ 1, 5, 2 ],
+ 'strides': [ 10, 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+var y = {
+ 'dtype': 'generic',
+ 'data': discreteUniform( N, -5, 5, {
+ 'dtype': 'generic'
+ }),
+ 'shape': [ 1, 5, 2 ],
+ 'strides': [ 10, 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+var z = {
+ 'dtype': 'generic',
+ 'data': zeros( 2 ),
+ 'shape': [ 1, 2 ],
+ 'strides': [ 2, 1 ],
+ 'offset': 0,
+ 'order': 'row-major'
+};
+
+binaryReduceStrided1d( gdot, [ x, y, z ], [ 1 ] );
+
+console.log( ndarray2array( x.data, x.shape, x.strides, x.offset, x.order ) );
+console.log( ndarray2array( y.data, y.shape, y.strides, y.offset, y.order ) );
+console.log( ndarray2array( z.data, z.shape, z.strides, z.offset, z.order ) );
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d.js
new file mode 100644
index 000000000000..067dd9820357
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d.js
@@ -0,0 +1,118 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 without = require( '@stdlib/array/base/without' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] );
+* var zbuf = new Float64Array( [ 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 2, 2 ];
+* var ysh = [ 2, 2 ];
+* var zsh = [];
+*
+* // Define the array strides:
+* var sx = [ 2, 1 ];
+* var sy = [ 2, 1 ];
+* var sz = [ 0 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary0d( gdot, [ x, y, z ], strategy, strategy, {} );
+*
+* var v = z.data;
+* // returns [ 30.0 ]
+*/
+function binary0d( fcn, arrays, strategy1, strategy2, opts ) {
+ arrays[ 0 ] = strategy1( arrays[ 0 ] );
+ arrays[ 1 ] = strategy2( arrays[ 1 ] );
+ arrays[ 2 ].data[ arrays[ 2 ].offset ] = fcn( without( arrays, 2 ), opts );
+}
+
+
+// EXPORTS //
+
+module.exports = binary0d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d_accessors.js
new file mode 100644
index 000000000000..6c6df8c6cd02
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/0d_accessors.js
@@ -0,0 +1,124 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 without = require( '@stdlib/array/base/without' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 2, 2 ];
+* var ysh = [ 2, 2 ];
+* var zsh = [];
+*
+* // Define the array strides:
+* var sx = [ 2, 1 ];
+* var sy = [ 2, 1 ];
+* var sz = [ 0 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary0d( gdot, [ x, y, z ], strategy, strategy, {} );
+*
+* var v = z.data.get( 0 );
+* // returns 30.0
+*/
+function binary0d( fcn, arrays, strategy1, strategy2, opts ) {
+ var z = arrays[ 2 ];
+ arrays[ 0 ] = strategy1( arrays[ 0 ] );
+ arrays[ 1 ] = strategy2( arrays[ 1 ] );
+ z.accessors[ 1 ]( z.data, z.offset, fcn( without( arrays, 2 ), opts ) );
+}
+
+
+// EXPORTS //
+
+module.exports = binary0d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d.js
new file mode 100644
index 000000000000..591aabebad87
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d.js
@@ -0,0 +1,305 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary10d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ] ]
+*/
+function binary10d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var dv9;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var S8;
+ var S9;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var i8;
+ var i9;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 9 ];
+ S1 = sh[ 8 ];
+ S2 = sh[ 7 ];
+ S3 = sh[ 6 ];
+ S4 = sh[ 5 ];
+ S5 = sh[ 4 ];
+ S6 = sh[ 3 ];
+ S7 = sh[ 2 ];
+ S8 = sh[ 1 ];
+ S9 = sh[ 0 ];
+ dv0 = [ strideX[9], strideY[9] ]; // offset increment for innermost loop
+ dv1 = [ strideX[8] - ( S0*strideX[9] ), strideY[8] - ( S0*strideY[9] ) ];
+ dv2 = [ strideX[7] - ( S1*strideX[8] ), strideY[7] - ( S1*strideY[8] ) ];
+ dv3 = [ strideX[6] - ( S2*strideX[7] ), strideY[6] - ( S2*strideY[7] ) ];
+ dv4 = [ strideX[5] - ( S3*strideX[6] ), strideY[5] - ( S3*strideY[6] ) ];
+ dv5 = [ strideX[4] - ( S4*strideX[5] ), strideY[4] - ( S4*strideY[5] ) ];
+ dv6 = [ strideX[3] - ( S5*strideX[4] ), strideY[3] - ( S5*strideY[4] ) ];
+ dv7 = [ strideX[2] - ( S6*strideX[3] ), strideY[2] - ( S6*strideY[3] ) ];
+ dv8 = [ strideX[1] - ( S7*strideX[2] ), strideY[1] - ( S7*strideY[2] ) ];
+ dv9 = [ strideX[0] - ( S8*strideX[1] ), strideY[0] - ( S8*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[9] );
+ dv1.push( sv[8] - ( S0*sv[9] ) );
+ dv2.push( sv[7] - ( S1*sv[8] ) );
+ dv3.push( sv[6] - ( S2*sv[7] ) );
+ dv4.push( sv[5] - ( S3*sv[6] ) );
+ dv5.push( sv[4] - ( S4*sv[5] ) );
+ dv6.push( sv[3] - ( S5*sv[4] ) );
+ dv7.push( sv[2] - ( S6*sv[3] ) );
+ dv8.push( sv[1] - ( S7*sv[2] ) );
+ dv9.push( sv[0] - ( S8*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ S8 = sh[ 8 ];
+ S9 = sh[ 9 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ];
+ dv8 = [ strideX[8] - ( S7*strideX[7] ), strideY[8] - ( S7*strideY[7] ) ];
+ dv9 = [ strideX[9] - ( S8*strideX[8] ), strideY[9] - ( S8*strideY[8] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ dv8.push( sv[8] - ( S7*sv[7] ) );
+ dv9.push( sv[9] - ( S8*sv[8] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ incrementOffsets( iv, dv9 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary10d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_accessors.js
new file mode 100644
index 000000000000..3aae646afa95
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_accessors.js
@@ -0,0 +1,314 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary10d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ] ]
+*/
+function binary10d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var dv9;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var S8;
+ var S9;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var i8;
+ var i9;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 9 ];
+ S1 = sh[ 8 ];
+ S2 = sh[ 7 ];
+ S3 = sh[ 6 ];
+ S4 = sh[ 5 ];
+ S5 = sh[ 4 ];
+ S6 = sh[ 3 ];
+ S7 = sh[ 2 ];
+ S8 = sh[ 1 ];
+ S9 = sh[ 0 ];
+ dv0 = [ strideX[9], strideY[9] ]; // offset increment for innermost loop
+ dv1 = [ strideX[8] - ( S0*strideX[9] ), strideY[8] - ( S0*strideY[9] ) ];
+ dv2 = [ strideX[7] - ( S1*strideX[8] ), strideY[7] - ( S1*strideY[8] ) ];
+ dv3 = [ strideX[6] - ( S2*strideX[7] ), strideY[6] - ( S2*strideY[7] ) ];
+ dv4 = [ strideX[5] - ( S3*strideX[6] ), strideY[5] - ( S3*strideY[6] ) ];
+ dv5 = [ strideX[4] - ( S4*strideX[5] ), strideY[4] - ( S4*strideY[5] ) ];
+ dv6 = [ strideX[3] - ( S5*strideX[4] ), strideY[3] - ( S5*strideY[4] ) ];
+ dv7 = [ strideX[2] - ( S6*strideX[3] ), strideY[2] - ( S6*strideY[3] ) ];
+ dv8 = [ strideX[1] - ( S7*strideX[2] ), strideY[1] - ( S7*strideY[2] ) ];
+ dv9 = [ strideX[0] - ( S8*strideX[1] ), strideY[0] - ( S8*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[9] );
+ dv1.push( sv[8] - ( S0*sv[9] ) );
+ dv2.push( sv[7] - ( S1*sv[8] ) );
+ dv3.push( sv[6] - ( S2*sv[7] ) );
+ dv4.push( sv[5] - ( S3*sv[6] ) );
+ dv5.push( sv[4] - ( S4*sv[5] ) );
+ dv6.push( sv[3] - ( S5*sv[4] ) );
+ dv7.push( sv[2] - ( S6*sv[3] ) );
+ dv8.push( sv[1] - ( S7*sv[2] ) );
+ dv9.push( sv[0] - ( S8*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ S8 = sh[ 8 ];
+ S9 = sh[ 9 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ];
+ dv8 = [ strideX[8] - ( S7*strideX[7] ), strideY[8] - ( S7*strideY[7] ) ];
+ dv9 = [ strideX[9] - ( S8*strideX[8] ), strideY[9] - ( S8*strideY[8] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ dv8.push( sv[8] - ( S7*sv[7] ) );
+ dv9.push( sv[9] - ( S8*sv[8] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ incrementOffsets( iv, dv9 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary10d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked.js
new file mode 100644
index 000000000000..45e81662ec9b
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked.js
@@ -0,0 +1,429 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary10d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ] ]
+*/
+function blockedbinary10d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var dv9;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var ov8;
+ var ov9;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var s8;
+ var s9;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ ov8 = zeros( N );
+ ov9 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ dv8 = zeros( N );
+ dv9 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j9 = sh[9]; j9 > 0; ) {
+ if ( j9 < bsize ) {
+ s9 = j9;
+ j9 = 0;
+ } else {
+ s9 = bsize;
+ j9 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov9[ k ] = ov[k] + ( j9*sv[k][9] );
+ }
+ for ( j8 = sh[8]; j8 > 0; ) {
+ if ( j8 < bsize ) {
+ s8 = j8;
+ j8 = 0;
+ } else {
+ s8 = bsize;
+ j8 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv9 = sv[k][9] - ( s8*sv[k][8] );
+ ov8[ k ] = ov9[k] + ( j8*sv[k][8] );
+ }
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv8 = sv[k][8] - ( s7*sv[k][7] );
+ ov7[ k ] = ov8[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ incrementOffsets( iv, dv9 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary10d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked_accessors.js
new file mode 100644
index 000000000000..23c2a6830014
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/10d_blocked_accessors.js
@@ -0,0 +1,438 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary10d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ] ]
+*/
+function blockedbinary10d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var dv9;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var ov8;
+ var ov9;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var s8;
+ var s9;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ ov8 = zeros( N );
+ ov9 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ dv8 = zeros( N );
+ dv9 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j9 = sh[9]; j9 > 0; ) {
+ if ( j9 < bsize ) {
+ s9 = j9;
+ j9 = 0;
+ } else {
+ s9 = bsize;
+ j9 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov9[ k ] = ov[k] + ( j9*sv[k][9] );
+ }
+ for ( j8 = sh[8]; j8 > 0; ) {
+ if ( j8 < bsize ) {
+ s8 = j8;
+ j8 = 0;
+ } else {
+ s8 = bsize;
+ j8 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv9 = sv[k][9] - ( s8*sv[k][8] );
+ ov8[ k ] = ov9[k] + ( j8*sv[k][8] );
+ }
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv8 = sv[k][8] - ( s7*sv[k][7] );
+ ov7[ k ] = ov8[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ incrementOffsets( iv, dv9 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary10d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d.js
new file mode 100644
index 000000000000..e9d92c46a70c
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d.js
@@ -0,0 +1,183 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 3, 2, 2 ];
+* var ysh = [ 3, 2, 2 ];
+* var zsh = [ 3 ];
+*
+* // Define the array strides:
+* var sx = [ 4, 2, 1 ];
+* var sy = [ 4, 2, 1 ];
+* var sz = [ 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary1d( gdot, [ x, y, z ], views, [ 4 ], [ 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ 30.0, 174.0, 446.0 ]
+*/
+function binary1d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var sh;
+ var S0;
+ var iv;
+ var i0;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ S0 = sh[ 0 ];
+ dv0 = [ strideX[0], strideY[0] ];
+ for ( i = 2; i < arrays.length; i++ ) {
+ dv0.push( arrays[i].strides[0] );
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary1d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d_accessors.js
new file mode 100644
index 000000000000..dd9910f3d211
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/1d_accessors.js
@@ -0,0 +1,192 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 3, 2, 2 ];
+* var ysh = [ 3, 2, 2 ];
+* var zsh = [ 3 ];
+*
+* // Define the array strides:
+* var sx = [ 4, 2, 1 ];
+* var sy = [ 4, 2, 1 ];
+* var sz = [ 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary1d( gdot, [ x, y, z ], views, [ 4 ], [ 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ 30.0, 174.0, 446.0 ]
+*/
+function binary1d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var sh;
+ var S0;
+ var iv;
+ var i0;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables: dimensions and loop offset (pointer) increments...
+ S0 = sh[ 0 ];
+ dv0 = [ strideX[0], strideY[0] ];
+ for ( i = 2; i < arrays.length; i++ ) {
+ dv0.push( arrays[i].strides[0] );
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[2], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary1d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d.js
new file mode 100644
index 000000000000..a7450314b8b3
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d.js
@@ -0,0 +1,209 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary2d( gdot, [ x, y, z ], views, [ 12, 4 ], [ 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+function binary2d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var sh;
+ var S0;
+ var S1;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 1 ];
+ S1 = sh[ 0 ];
+ dv0 = [ strideX[1], strideY[1] ]; // offset increment for innermost loop
+ dv1 = [ strideX[0] - ( S0*strideX[1] ), strideY[0] - ( S0*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[1] );
+ dv1.push( sv[0] - ( S0*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i1 = 0; i1 < S1; i1++ ) {
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary2d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_accessors.js
new file mode 100644
index 000000000000..8859e72f98ef
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_accessors.js
@@ -0,0 +1,218 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary2d( gdot, [ x, y, z ], views, [ 12, 4 ], [ 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+function binary2d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var sh;
+ var S0;
+ var S1;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 1 ];
+ S1 = sh[ 0 ];
+ dv0 = [ strideX[1], strideY[1] ]; // offset increment for innermost loop
+ dv1 = [ strideX[0] - ( S0*strideX[1] ), strideY[0] - ( S0*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[1] );
+ dv1.push( sv[0] - ( S0*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];// offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i1 = 0; i1 < S1; i1++ ) {
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary2d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked.js
new file mode 100644
index 000000000000..48532e1c11a1
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked.js
@@ -0,0 +1,245 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary2d( gdot, [ x, y, z ], views, [ 12, 4 ], [ 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+function blockedbinary2d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var ov1;
+ var sh;
+ var s0;
+ var s1;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var j0;
+ var j1;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ dv1 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i1 = 0; i1 < s1; i1++ ) {
+ for ( i0 = 0; i0 < s0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary2d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked_accessors.js
new file mode 100644
index 000000000000..acbd5df0a324
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/2d_blocked_accessors.js
@@ -0,0 +1,254 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary2d( gdot, [ x, y, z ], views, [ 12, 4 ], [ 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+function blockedbinary2d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var ov1;
+ var sh;
+ var s0;
+ var s1;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var j0;
+ var j1;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[1];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ dv1 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i1 = 0; i1 < s1; i1++ ) {
+ for ( i0 = 0; i0 < s0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary2d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d.js
new file mode 100644
index 000000000000..34dd573e5b02
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d.js
@@ -0,0 +1,221 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary3d( gdot, [ x, y, z ], views, [ 12, 12, 4 ], [ 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ 30.0, 174.0, 446.0 ] ] ]
+*/
+function binary3d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 2 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 0 ];
+ dv0 = [ strideX[2], strideY[2] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[2] ), strideY[1] - ( S0*strideY[2] ) ];
+ dv2 = [ strideX[0] - ( S1*strideX[1] ), strideY[0] - ( S1*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[2] );
+ dv1.push( sv[1] - ( S0*sv[2] ) );
+ dv2.push( sv[0] - ( S1*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i2 = 0; i2 < S2; i2++ ) {
+ for ( i1 = 0; i1 < S1; i1++ ) {
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary3d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_accessors.js
new file mode 100644
index 000000000000..58f5dc38a0d8
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_accessors.js
@@ -0,0 +1,230 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary3d( gdot, [ x, y, z ], views, [ 12, 12, 4 ], [ 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ 30.0, 174.0, 446.0 ] ] ]
+*/
+function binary3d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 2 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 0 ];
+ dv0 = [ strideX[2], strideY[2] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[2] ), strideY[1] - ( S0*strideY[2] ) ];
+ dv2 = [ strideX[0] - ( S1*strideX[1] ), strideY[0] - ( S1*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[2] );
+ dv1.push( sv[1] - ( S0*sv[2] ) );
+ dv2.push( sv[0] - ( S1*sv[1] ) );
+ }
+ } else {
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i2 = 0; i2 < S2; i2++ ) {
+ for ( i1 = 0; i1 < S1; i1++ ) {
+ for ( i0 = 0; i0 < S0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary3d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked.js
new file mode 100644
index 000000000000..b9a489c50956
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked.js
@@ -0,0 +1,268 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary3d( gdot, [ x, y, z ], views, [ 12, 12, 4 ], [ 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ 30.0, 174.0, 446.0 ] ] ]
+*/
+function blockedbinary3d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var ov1;
+ var ov2;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var j0;
+ var j1;
+ var j2;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov2[ k ] = ov[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i2 = 0; i2 < s2; i2++ ) {
+ for ( i1 = 0; i1 < s1; i1++ ) {
+ for ( i0 = 0; i0 < s0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary3d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked_accessors.js
new file mode 100644
index 000000000000..c2c30b1ad661
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/3d_blocked_accessors.js
@@ -0,0 +1,277 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary3d( gdot, [ x, y, z ], views, [ 12, 12, 4 ], [ 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ 30.0, 174.0, 446.0 ] ] ]
+*/
+function blockedbinary3d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var ov1;
+ var ov2;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var j0;
+ var j1;
+ var j2;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[1];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov2[ k ] = ov[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced ndarray dimensions...
+ for ( i2 = 0; i2 < s2; i2++ ) {
+ for ( i1 = 0; i1 < s1; i1++ ) {
+ for ( i0 = 0; i0 < s0; i0++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary3d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d.js
new file mode 100644
index 000000000000..64250948e873
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d.js
@@ -0,0 +1,233 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary4d( gdot, [ x, y, z ], views, [ 12, 12, 12, 4 ], [ 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ]
+*/
+function binary4d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 3 ];
+ S1 = sh[ 2 ];
+ S2 = sh[ 1 ];
+ S3 = sh[ 0 ];
+ dv0 = [ strideX[3], strideY[3] ]; // offset increment for innermost loop
+ dv1 = [ strideX[2] - ( S0*strideX[3] ), strideY[2] - ( S0*strideY[3] ) ];
+ dv2 = [ strideX[1] - ( S1*strideX[2] ), strideY[1] - ( S1*strideY[2] ) ];
+ dv3 = [ strideX[0] - ( S2*strideX[1] ), strideY[0] - ( S2*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[3] );
+ dv1.push( sv[2] - ( S0*sv[3] ) );
+ dv2.push( sv[1] - ( S1*sv[2] ) );
+ dv3.push( sv[0] - ( S2*sv[1]) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary4d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_accessors.js
new file mode 100644
index 000000000000..659a9bb60686
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_accessors.js
@@ -0,0 +1,242 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary4d( gdot, [ x, y, z ], views, [ 12, 12, 12, 4 ], [ 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ]
+*/
+function binary4d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 3 ];
+ S1 = sh[ 2 ];
+ S2 = sh[ 1 ];
+ S3 = sh[ 0 ];
+ dv0 = [ strideX[3], strideY[3] ]; // offset increment for innermost loop
+ dv1 = [ strideX[2] - ( S0*strideX[3] ), strideY[2] - ( S0*strideY[3] ) ];
+ dv2 = [ strideX[1] - ( S1*strideX[2] ), strideY[1] - ( S1*strideY[2] ) ];
+ dv3 = [ strideX[0] - ( S2*strideX[1] ), strideY[0] - ( S2*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[3] );
+ dv1.push( sv[2] - ( S0*sv[3] ) );
+ dv2.push( sv[1] - ( S1*sv[2] ) );
+ dv3.push( sv[0] - ( S2*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ]; // offset increment for outermost loop
+ for ( i = 1; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary4d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked.js
new file mode 100644
index 000000000000..a7d6ec46a86e
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked.js
@@ -0,0 +1,291 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary4d( gdot, [ x, y, z ], views, [ 12, 12, 12, 4 ], [ 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ]
+*/
+function blockedbinary4d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var ov1;
+ var ov2;
+ var ov3;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var j0;
+ var j1;
+ var j2;
+ var j3;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov3[ k ] = ov[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary4d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked_accessors.js
new file mode 100644
index 000000000000..4389ea660a17
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/4d_blocked_accessors.js
@@ -0,0 +1,300 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary4d( gdot, [ x, y, z ], views, [ 12, 12, 12, 4 ], [ 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ]
+*/
+function blockedbinary4d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var ov1;
+ var ov2;
+ var ov3;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var j0;
+ var j1;
+ var j2;
+ var j3;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[1];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov3[ k ] = ov[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary4d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d.js
new file mode 100644
index 000000000000..67174cd2deaf
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d.js
@@ -0,0 +1,245 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary5d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ]
+*/
+function binary5d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 4 ];
+ S1 = sh[ 3 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 1 ];
+ S4 = sh[ 0 ];
+ dv0 = [ strideX[4], strideY[4] ]; // offset increment for innermost loop
+ dv1 = [ strideX[3] - ( S0*strideX[4] ), strideY[3] - ( S0*strideY[4] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[3] ), strideY[2] - ( S1*strideY[3] ) ];
+ dv3 = [ strideX[1] - ( S2*strideX[2] ), strideY[1] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[0] - ( S3*strideX[1] ), strideY[0] - ( S3*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[4] );
+ dv1.push( sv[3] - ( S0*sv[4] ) );
+ dv2.push( sv[2] - ( S1*sv[3] ) );
+ dv3.push( sv[1] - ( S2*sv[2] ) );
+ dv4.push( sv[0] - ( S3*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary5d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_accessors.js
new file mode 100644
index 000000000000..42d0bcfb0763
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_accessors.js
@@ -0,0 +1,254 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary5d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ]
+*/
+function binary5d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 4 ];
+ S1 = sh[ 3 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 1 ];
+ S4 = sh[ 0 ];
+ dv0 = [ strideX[4], strideY[4] ]; // offset increment for innermost loop
+ dv1 = [ strideX[3] - ( S0*strideX[4] ), strideY[3] - ( S0*strideY[4] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[3] ), strideY[2] - ( S1*strideY[3] ) ];
+ dv3 = [ strideX[1] - ( S2*strideX[2] ), strideY[1] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[0] - ( S3*strideX[1] ), strideY[0] - ( S3*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[4] );
+ dv1.push( sv[3] - ( S0*sv[4] ) );
+ dv2.push( sv[2] - ( S1*sv[3] ) );
+ dv3.push( sv[1] - ( S2*sv[2] ) );
+ dv4.push( sv[0] - ( S3*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary5d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked.js
new file mode 100644
index 000000000000..840581111f0c
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked.js
@@ -0,0 +1,314 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary5d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ]
+*/
+function blockedbinary5d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var j0;
+ var j1;
+ var j2;
+ var j3;
+ var j4;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov4[ k ] = ov[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary5d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked_accessors.js
new file mode 100644
index 000000000000..7c2226e3d1ca
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/5d_blocked_accessors.js
@@ -0,0 +1,323 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary5d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ]
+*/
+function blockedbinary5d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var sv;
+ var ov;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var j0;
+ var j1;
+ var j2;
+ var j3;
+ var j4;
+ var N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[1];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov4[ k ] = ov[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary5d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d.js
new file mode 100644
index 000000000000..6bc4a7f241ec
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d.js
@@ -0,0 +1,257 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary6d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ]
+*/
+function binary6d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 5 ];
+ S1 = sh[ 4 ];
+ S2 = sh[ 3 ];
+ S3 = sh[ 2 ];
+ S4 = sh[ 1 ];
+ S5 = sh[ 0 ];
+ dv0 = [ strideX[5], strideY[5] ]; // offset increment for innermost loop
+ dv1 = [ strideX[4] - ( S0*strideX[5] ), strideY[4] - ( S0*strideY[5] ) ];
+ dv2 = [ strideX[3] - ( S1*strideX[4] ), strideY[3] - ( S1*strideY[4] ) ];
+ dv3 = [ strideX[2] - ( S2*strideX[3] ), strideY[2] - ( S2*strideY[3] ) ];
+ dv4 = [ strideX[1] - ( S3*strideX[2] ), strideY[1] - ( S3*strideY[2] ) ];
+ dv5 = [ strideX[0] - ( S4*strideX[1] ), strideY[0] - ( S4*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[5] );
+ dv1.push( sv[4] - ( S0*sv[5] ) );
+ dv2.push( sv[3] - ( S1*sv[4] ) );
+ dv3.push( sv[2] - ( S2*sv[3] ) );
+ dv4.push( sv[1] - ( S3*sv[2] ) );
+ dv5.push( sv[0] - ( S4*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary6d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_accessors.js
new file mode 100644
index 000000000000..575f570c4f23
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_accessors.js
@@ -0,0 +1,266 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary6d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ]
+*/
+function binary6d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 5 ];
+ S1 = sh[ 4 ];
+ S2 = sh[ 3 ];
+ S3 = sh[ 2 ];
+ S4 = sh[ 1 ];
+ S5 = sh[ 0 ];
+ dv0 = [ strideX[5], strideY[5] ]; // offset increment for innermost loop
+ dv1 = [ strideX[4] - ( S0*strideX[5] ), strideY[4] - ( S0*strideY[5] ) ];
+ dv2 = [ strideX[3] - ( S1*strideX[4] ), strideY[3] - ( S1*strideY[4] ) ];
+ dv3 = [ strideX[2] - ( S2*strideX[3] ), strideY[2] - ( S2*strideY[3] ) ];
+ dv4 = [ strideX[1] - ( S3*strideX[2] ), strideY[1] - ( S3*strideY[2] ) ];
+ dv5 = [ strideX[0] - ( S4*strideX[1] ), strideY[0] - ( S4*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[5] );
+ dv1.push( sv[4] - ( S0*sv[5] ) );
+ dv2.push( sv[3] - ( S1*sv[4] ) );
+ dv3.push( sv[2] - ( S2*sv[3] ) );
+ dv4.push( sv[1] - ( S3*sv[2] ) );
+ dv5.push( sv[0] - ( S4*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary6d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked.js
new file mode 100644
index 000000000000..4b44c6348dc0
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked.js
@@ -0,0 +1,337 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary6d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ]
+*/
+function blockedbinary6d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov5[ k ] = ov[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary6d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked_accessors.js
new file mode 100644
index 000000000000..680c190dc218
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/6d_blocked_accessors.js
@@ -0,0 +1,346 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary6d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ]
+*/
+function blockedbinary6d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[1];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov5[ k ] = ov[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary6d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d.js
new file mode 100644
index 000000000000..c26add8d72d7
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d.js
@@ -0,0 +1,269 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary7d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ]
+*/
+function binary7d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 6 ];
+ S1 = sh[ 5 ];
+ S2 = sh[ 4 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 2 ];
+ S5 = sh[ 1 ];
+ S6 = sh[ 0 ];
+ dv0 = [ strideX[6], strideY[6] ]; // offset increment for innermost loop
+ dv1 = [ strideX[5] - ( S0*strideX[6] ), strideY[5] - ( S0*strideY[6] ) ];
+ dv2 = [ strideX[4] - ( S1*strideX[5] ), strideY[4] - ( S1*strideY[5] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[4] ), strideY[3] - ( S2*strideY[4] ) ];
+ dv4 = [ strideX[2] - ( S3*strideX[3] ), strideY[2] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[1] - ( S4*strideX[2] ), strideY[1] - ( S4*strideY[2] ) ];
+ dv6 = [ strideX[0] - ( S5*strideX[1] ), strideY[0] - ( S5*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[6] );
+ dv1.push( sv[5] - ( S0*sv[6] ) );
+ dv2.push( sv[4] - ( S1*sv[5] ) );
+ dv3.push( sv[3] - ( S2*sv[4] ) );
+ dv4.push( sv[2] - ( S3*sv[3] ) );
+ dv5.push( sv[1] - ( S4*sv[2] ) );
+ dv6.push( sv[0] - ( S5*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary7d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_accessors.js
new file mode 100644
index 000000000000..bfb9a46f84c3
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_accessors.js
@@ -0,0 +1,278 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary7d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ]
+*/
+function binary7d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 6 ];
+ S1 = sh[ 5 ];
+ S2 = sh[ 4 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 2 ];
+ S5 = sh[ 1 ];
+ S6 = sh[ 0 ];
+ dv0 = [ strideX[6], strideY[6] ]; // offset increment for innermost loop
+ dv1 = [ strideX[5] - ( S0*strideX[6] ), strideY[5] - ( S0*strideY[6] ) ];
+ dv2 = [ strideX[4] - ( S1*strideX[5] ), strideY[4] - ( S1*strideY[5] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[4] ), strideY[3] - ( S2*strideY[4] ) ];
+ dv4 = [ strideX[2] - ( S3*strideX[3] ), strideY[2] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[1] - ( S4*strideX[2] ), strideY[1] - ( S4*strideY[2] ) ];
+ dv6 = [ strideX[0] - ( S5*strideX[1] ), strideY[0] - ( S5*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[6] );
+ dv1.push( sv[5] - ( S0*sv[6] ) );
+ dv2.push( sv[4] - ( S1*sv[5] ) );
+ dv3.push( sv[3] - ( S2*sv[4] ) );
+ dv4.push( sv[2] - ( S3*sv[3] ) );
+ dv5.push( sv[1] - ( S4*sv[2] ) );
+ dv6.push( sv[0] - ( S5*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary7d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked.js
new file mode 100644
index 000000000000..87e67b757276
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked.js
@@ -0,0 +1,360 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary7d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ]
+*/
+function blockedbinary7d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov6[ k ] = ov[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary7d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked_accessors.js
new file mode 100644
index 000000000000..dc9954ac1d00
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/7d_blocked_accessors.js
@@ -0,0 +1,369 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary7d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ]
+*/
+function blockedbinary7d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov6[ k ] = ov[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary7d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d.js
new file mode 100644
index 000000000000..313f0bca88ba
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d.js
@@ -0,0 +1,281 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary8d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ]
+*/
+function binary8d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 7 ];
+ S1 = sh[ 6 ];
+ S2 = sh[ 5 ];
+ S3 = sh[ 4 ];
+ S4 = sh[ 3 ];
+ S5 = sh[ 2 ];
+ S6 = sh[ 1 ];
+ S7 = sh[ 0 ];
+ dv0 = [ strideX[7], strideY[7] ]; // offset increment for innermost loop
+ dv1 = [ strideX[6] - ( S0*strideX[7] ), strideY[6] - ( S0*strideY[7] ) ];
+ dv2 = [ strideX[5] - ( S1*strideX[6] ), strideY[5] - ( S1*strideY[6] ) ];
+ dv3 = [ strideX[4] - ( S2*strideX[5] ), strideY[4] - ( S2*strideY[5] ) ];
+ dv4 = [ strideX[3] - ( S3*strideX[4] ), strideY[3] - ( S3*strideY[4] ) ];
+ dv5 = [ strideX[2] - ( S4*strideX[3] ), strideY[2] - ( S4*strideY[3] ) ];
+ dv6 = [ strideX[1] - ( S5*strideX[2] ), strideY[1] - ( S5*strideY[2] ) ];
+ dv7 = [ strideX[0] - ( S6*strideX[1] ), strideY[0] - ( S6*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[7] );
+ dv1.push( sv[6] - ( S0*sv[7] ) );
+ dv2.push( sv[5] - ( S1*sv[6] ) );
+ dv3.push( sv[4] - ( S2*sv[5] ) );
+ dv4.push( sv[3] - ( S3*sv[4] ) );
+ dv5.push( sv[2] - ( S4*sv[3] ) );
+ dv6.push( sv[1] - ( S5*sv[2] ) );
+ dv7.push( sv[0] - ( S6*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary8d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_accessors.js
new file mode 100644
index 000000000000..0dd1493e1b5b
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_accessors.js
@@ -0,0 +1,290 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary8d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ]
+*/
+function binary8d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 7 ];
+ S1 = sh[ 6 ];
+ S2 = sh[ 5 ];
+ S3 = sh[ 4 ];
+ S4 = sh[ 3 ];
+ S5 = sh[ 2 ];
+ S6 = sh[ 1 ];
+ S7 = sh[ 0 ];
+ dv0 = [ strideX[7], strideY[7] ]; // offset increment for innermost loop
+ dv1 = [ strideX[6] - ( S0*strideX[7] ), strideY[6] - ( S0*strideY[7] ) ];
+ dv2 = [ strideX[5] - ( S1*strideX[6] ), strideY[5] - ( S1*strideY[6] ) ];
+ dv3 = [ strideX[4] - ( S2*strideX[5] ), strideY[4] - ( S2*strideY[5] ) ];
+ dv4 = [ strideX[3] - ( S3*strideX[4] ), strideY[3] - ( S3*strideY[4] ) ];
+ dv5 = [ strideX[2] - ( S4*strideX[3] ), strideY[2] - ( S4*strideY[3] ) ];
+ dv6 = [ strideX[1] - ( S5*strideX[2] ), strideY[1] - ( S5*strideY[2] ) ];
+ dv7 = [ strideX[0] - ( S6*strideX[1] ), strideY[0] - ( S6*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[7] );
+ dv1.push( sv[6] - ( S0*sv[7] ) );
+ dv2.push( sv[5] - ( S1*sv[6] ) );
+ dv3.push( sv[4] - ( S2*sv[5] ) );
+ dv4.push( sv[3] - ( S3*sv[4] ) );
+ dv5.push( sv[2] - ( S4*sv[3] ) );
+ dv6.push( sv[1] - ( S5*sv[2] ) );
+ dv7.push( sv[0] - ( S6*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary8d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked.js
new file mode 100644
index 000000000000..2a3abefba559
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked.js
@@ -0,0 +1,383 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary8d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ]
+*/
+function blockedbinary8d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov7[ k ] = ov[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary8d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked_accessors.js
new file mode 100644
index 000000000000..57c82455c7cf
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/8d_blocked_accessors.js
@@ -0,0 +1,392 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary8d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ]
+*/
+function blockedbinary8d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov7[ k ] = ov[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary8d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d.js
new file mode 100644
index 000000000000..bd1e28d76756
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d.js
@@ -0,0 +1,293 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary9d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ]
+*/
+function binary9d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var S8;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var i8;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 8 ];
+ S1 = sh[ 7 ];
+ S2 = sh[ 6 ];
+ S3 = sh[ 5 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 3 ];
+ S6 = sh[ 2 ];
+ S7 = sh[ 1 ];
+ S8 = sh[ 0 ];
+ dv0 = [ strideX[8], strideY[8] ]; // offset increment for innermost loop
+ dv1 = [ strideX[7] - ( S0*strideX[8] ), strideY[7] - ( S0*strideY[8] ) ];
+ dv2 = [ strideX[6] - ( S1*strideX[7] ), strideY[6] - ( S1*strideY[7] ) ];
+ dv3 = [ strideX[5] - ( S2*strideX[6] ), strideY[5] - ( S2*strideY[6] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[5] ), strideY[4] - ( S3*strideY[5] ) ];
+ dv5 = [ strideX[3] - ( S4*strideX[4] ), strideY[3] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[2] - ( S5*strideX[3] ), strideY[2] - ( S5*strideY[3] ) ];
+ dv7 = [ strideX[1] - ( S6*strideX[2] ), strideY[1] - ( S6*strideY[2] ) ];
+ dv8 = [ strideX[0] - ( S7*strideX[1] ), strideY[0] - ( S7*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[8] );
+ dv1.push( sv[7] - ( S0*sv[8] ) );
+ dv2.push( sv[6] - ( S1*sv[7] ) );
+ dv3.push( sv[5] - ( S2*sv[6] ) );
+ dv4.push( sv[4] - ( S3*sv[5] ) );
+ dv5.push( sv[3] - ( S4*sv[4] ) );
+ dv6.push( sv[2] - ( S5*sv[3] ) );
+ dv7.push( sv[1] - ( S6*sv[2] ) );
+ dv8.push( sv[0] - ( S7*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ S8 = sh[ 8 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ];
+ dv8 = [ strideX[8] - ( S7*strideX[7] ), strideY[8] - ( S7*strideY[7] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ dv8.push( sv[8] - ( S7*sv[7] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary9d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_accessors.js
new file mode 100644
index 000000000000..907c597e617f
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_accessors.js
@@ -0,0 +1,302 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements */
+
+'use strict';
+
+// MODULES //
+
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {boolean} isRowMajor - boolean indicating if provided arrays are in row-major order
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binary9d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], true, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ]
+*/
+function binary9d( fcn, arrays, views, strideX, strideY, isRowMajor, strategy1, strategy2, opts ) {
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var sh;
+ var S0;
+ var S1;
+ var S2;
+ var S3;
+ var S4;
+ var S5;
+ var S6;
+ var S7;
+ var S8;
+ var sv;
+ var iv;
+ var i0;
+ var i1;
+ var i2;
+ var i3;
+ var i4;
+ var i5;
+ var i6;
+ var i7;
+ var i8;
+ var z;
+ var v;
+ var i;
+
+ // Note on variable naming convention: S#, dv#, i# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...
+ if ( isRowMajor ) {
+ // For row-major ndarrays, the last dimensions have the fastest changing indices...
+ S0 = sh[ 8 ];
+ S1 = sh[ 7 ];
+ S2 = sh[ 6 ];
+ S3 = sh[ 5 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 3 ];
+ S6 = sh[ 2 ];
+ S7 = sh[ 1 ];
+ S8 = sh[ 0 ];
+ dv0 = [ strideX[8], strideY[8] ]; // offset increment for innermost loop
+ dv1 = [ strideX[7] - ( S0*strideX[8] ), strideY[7] - ( S0*strideY[8] ) ];
+ dv2 = [ strideX[6] - ( S1*strideX[7] ), strideY[6] - ( S1*strideY[7] ) ];
+ dv3 = [ strideX[5] - ( S2*strideX[6] ), strideY[5] - ( S2*strideY[6] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[5] ), strideY[4] - ( S3*strideY[5] ) ];
+ dv5 = [ strideX[3] - ( S4*strideX[4] ), strideY[3] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[2] - ( S5*strideX[3] ), strideY[2] - ( S5*strideY[3] ) ];
+ dv7 = [ strideX[1] - ( S6*strideX[2] ), strideY[1] - ( S6*strideY[2] ) ];
+ dv8 = [ strideX[0] - ( S7*strideX[1] ), strideY[0] - ( S7*strideY[1] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[8] );
+ dv1.push( sv[7] - ( S0*sv[8] ) );
+ dv2.push( sv[6] - ( S1*sv[7] ) );
+ dv3.push( sv[5] - ( S2*sv[6] ) );
+ dv4.push( sv[4] - ( S3*sv[5] ) );
+ dv5.push( sv[3] - ( S4*sv[4] ) );
+ dv6.push( sv[2] - ( S5*sv[3] ) );
+ dv7.push( sv[1] - ( S6*sv[2] ) );
+ dv8.push( sv[0] - ( S7*sv[1] ) );
+ }
+ } else { // order === 'column-major'
+ // For column-major ndarrays, the first dimensions have the fastest changing indices...
+ S0 = sh[ 0 ];
+ S1 = sh[ 1 ];
+ S2 = sh[ 2 ];
+ S3 = sh[ 3 ];
+ S4 = sh[ 4 ];
+ S5 = sh[ 5 ];
+ S6 = sh[ 6 ];
+ S7 = sh[ 7 ];
+ S8 = sh[ 8 ];
+ dv0 = [ strideX[0], strideY[0] ]; // offset increment for innermost loop
+ dv1 = [ strideX[1] - ( S0*strideX[0] ), strideY[1] - ( S0*strideY[0] ) ];
+ dv2 = [ strideX[2] - ( S1*strideX[1] ), strideY[2] - ( S1*strideY[1] ) ];
+ dv3 = [ strideX[3] - ( S2*strideX[2] ), strideY[3] - ( S2*strideY[2] ) ];
+ dv4 = [ strideX[4] - ( S3*strideX[3] ), strideY[4] - ( S3*strideY[3] ) ];
+ dv5 = [ strideX[5] - ( S4*strideX[4] ), strideY[5] - ( S4*strideY[4] ) ];
+ dv6 = [ strideX[6] - ( S5*strideX[5] ), strideY[6] - ( S5*strideY[5] ) ];
+ dv7 = [ strideX[7] - ( S6*strideX[6] ), strideY[7] - ( S6*strideY[6] ) ];
+ dv8 = [ strideX[8] - ( S7*strideX[7] ), strideY[8] - ( S7*strideY[7] ) ]; // offset increment for outermost loop
+ for ( i = 2; i < arrays.length; i++ ) {
+ sv = arrays[ i ].strides;
+ dv0.push( sv[0] );
+ dv1.push( sv[1] - ( S0*sv[0] ) );
+ dv2.push( sv[2] - ( S1*sv[1] ) );
+ dv3.push( sv[3] - ( S2*sv[2] ) );
+ dv4.push( sv[4] - ( S3*sv[3] ) );
+ dv5.push( sv[5] - ( S4*sv[4] ) );
+ dv6.push( sv[6] - ( S5*sv[5] ) );
+ dv7.push( sv[7] - ( S6*sv[6] ) );
+ dv8.push( sv[8] - ( S7*sv[7] ) );
+ }
+ }
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binary9d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked.js
new file mode 100644
index 000000000000..3b05287709ed
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked.js
@@ -0,0 +1,406 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary9d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ]
+*/
+function blockedbinary9d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var ov8;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var s8;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ ov8 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ dv8 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j8 = sh[8]; j8 > 0; ) {
+ if ( j8 < bsize ) {
+ s8 = j8;
+ j8 = 0;
+ } else {
+ s8 = bsize;
+ j8 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov8[ k ] = ov[k] + ( j8*sv[k][8] );
+ }
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv8 = sv[k][8] - ( s7*sv[k][7] );
+ ov7[ k ] = ov8[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ iv[2] ] = fcn( v, opts );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary9d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked_accessors.js
new file mode 100644
index 000000000000..189cfc549ae3
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/9d_blocked_accessors.js
@@ -0,0 +1,415 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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-len, max-statements, max-lines-per-function */
+
+'use strict';
+
+// MODULES //
+
+var loopOrder = require( '@stdlib/ndarray/base/binary-loop-interchange-order' );
+var blockSize = require( '@stdlib/ndarray/base/binary-tiling-block-size' );
+var takeIndexed = require( '@stdlib/array/base/take-indexed' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var incrementOffsets = require( './increment_offsets.js' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays and assigns results to a provided output ndarray via loop blocking.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {IntegerArray} strideX - loop dimension strides for the first input ndarray
+* @param {IntegerArray} strideY - loop dimension strides for the second input ndarray
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var ysh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2 ];
+* var zsh = [ 1, 1, 1, 1, 1, 1, 1, 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sy = [ 12, 12, 12, 12, 12, 12, 12, 12, 4, 2, 1 ];
+* var sz = [ 3, 3, 3, 3, 3, 3, 3, 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* blockedbinary9d( gdot, [ x, y, z ], views, [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], [ 12, 12, 12, 12, 12, 12, 12, 12, 4 ], strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ [ [ [ [ [ [ 30.0, 174.0, 446.0 ] ] ] ] ] ] ] ] ]
+*/
+function blockedbinary9d( fcn, arrays, views, strideX, strideY, strategy1, strategy2, opts ) {
+ var bsize;
+ var zbuf;
+ var set;
+ var dv0;
+ var dv1;
+ var dv2;
+ var dv3;
+ var dv4;
+ var dv5;
+ var dv6;
+ var dv7;
+ var dv8;
+ var ov1;
+ var ov2;
+ var ov3;
+ var ov4;
+ var ov5;
+ var ov6;
+ var ov7;
+ var ov8;
+ var sh;
+ var s0;
+ var s1;
+ var s2;
+ var s3;
+ var s4;
+ var s5;
+ var s6;
+ var s7;
+ var s8;
+ var sv;
+ var ov;
+ var iv;
+ 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 N;
+ var o;
+ var x;
+ var y;
+ var z;
+ var v;
+ var k;
+
+ // Note on variable naming convention: S#, dv#, i#, j# where # corresponds to the loop number, with `0` being the innermost loop...
+
+ N = arrays.length;
+ x = arrays[ 0 ];
+ y = arrays[ 1 ];
+ z = arrays[ 2 ];
+
+ // Resolve the loop interchange order:
+ o = loopOrder( z.shape, strideX, strideY, z.strides );
+ sh = o.sh;
+ sv = [ o.sx, o.sy, o.sz ];
+ for ( k = 3; k < N; k++ ) {
+ sv.push( takeIndexed( arrays[k].strides, o.idx ) );
+ }
+ // Determine the block size:
+ bsize = blockSize( x.dtype, y.dtype, z.dtype );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ ov = offsets( arrays );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Cache offset increments for the innermost loop...
+ dv0 = [];
+ for ( k = 0; k < N; k++ ) {
+ dv0.push( sv[k][0] );
+ }
+ // Initialize loop variables...
+ ov1 = zeros( N );
+ ov2 = zeros( N );
+ ov3 = zeros( N );
+ ov4 = zeros( N );
+ ov5 = zeros( N );
+ ov6 = zeros( N );
+ ov7 = zeros( N );
+ ov8 = zeros( N );
+ dv1 = zeros( N );
+ dv2 = zeros( N );
+ dv3 = zeros( N );
+ dv4 = zeros( N );
+ dv5 = zeros( N );
+ dv6 = zeros( N );
+ dv7 = zeros( N );
+ dv8 = zeros( N );
+ iv = zeros( N );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Iterate over blocks...
+ for ( j8 = sh[8]; j8 > 0; ) {
+ if ( j8 < bsize ) {
+ s8 = j8;
+ j8 = 0;
+ } else {
+ s8 = bsize;
+ j8 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ ov8[ k ] = ov[k] + ( j8*sv[k][8] );
+ }
+ for ( j7 = sh[7]; j7 > 0; ) {
+ if ( j7 < bsize ) {
+ s7 = j7;
+ j7 = 0;
+ } else {
+ s7 = bsize;
+ j7 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv8 = sv[k][8] - ( s7*sv[k][7] );
+ ov7[ k ] = ov8[k] + ( j7*sv[k][7] );
+ }
+ for ( j6 = sh[6]; j6 > 0; ) {
+ if ( j6 < bsize ) {
+ s6 = j6;
+ j6 = 0;
+ } else {
+ s6 = bsize;
+ j6 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv7 = sv[k][7] - ( s6*sv[k][6] );
+ ov6[ k ] = ov7[k] + ( j6*sv[k][6] );
+ }
+ for ( j5 = sh[5]; j5 > 0; ) {
+ if ( j5 < bsize ) {
+ s5 = j5;
+ j5 = 0;
+ } else {
+ s5 = bsize;
+ j5 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv6 = sv[k][6] - ( s5*sv[k][5] );
+ ov5[ k ] = ov6[k] + ( j5*sv[k][5] );
+ }
+ for ( j4 = sh[4]; j4 > 0; ) {
+ if ( j4 < bsize ) {
+ s4 = j4;
+ j4 = 0;
+ } else {
+ s4 = bsize;
+ j4 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv5 = sv[k][5] - ( s4*sv[k][4] );
+ ov4[ k ] = ov5[k] + ( j4*sv[k][4] );
+ }
+ for ( j3 = sh[3]; j3 > 0; ) {
+ if ( j3 < bsize ) {
+ s3 = j3;
+ j3 = 0;
+ } else {
+ s3 = bsize;
+ j3 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv4[ k ] = sv[k][4] - ( s3*sv[k][3] );
+ ov3[ k ] = ov4[k] + ( j3*sv[k][3] );
+ }
+ for ( j2 = sh[2]; j2 > 0; ) {
+ if ( j2 < bsize ) {
+ s2 = j2;
+ j2 = 0;
+ } else {
+ s2 = bsize;
+ j2 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv3[ k ] = sv[k][3] - ( s2*sv[k][2] );
+ ov2[ k ] = ov3[k] + ( j2*sv[k][2] );
+ }
+ for ( j1 = sh[1]; j1 > 0; ) {
+ if ( j1 < bsize ) {
+ s1 = j1;
+ j1 = 0;
+ } else {
+ s1 = bsize;
+ j1 -= bsize;
+ }
+ for ( k = 0; k < N; k++ ) {
+ dv2[ k ] = sv[k][2] - ( s1*sv[k][1] );
+ ov1[ k ] = ov2[k] + ( j1*sv[k][1] );
+ }
+ for ( j0 = sh[0]; j0 > 0; ) {
+ if ( j0 < bsize ) {
+ s0 = j0;
+ j0 = 0;
+ } else {
+ s0 = bsize;
+ j0 -= bsize;
+ }
+ // Compute index offsets and loop offset increments for the first ndarray elements in the current block...
+ for ( k = 0; k < N; k++ ) {
+ iv[ k ] = ov1[k] + ( j0*sv[k][0] );
+ dv1[ k ] = sv[k][1] - ( s0*sv[k][0] );
+ }
+ // Iterate over the non-reduced 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++ ) {
+ setViewOffsets( views, iv );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, iv[ 2 ], fcn( v, opts ) );
+ incrementOffsets( iv, dv0 );
+ }
+ incrementOffsets( iv, dv1 );
+ }
+ incrementOffsets( iv, dv2 );
+ }
+ incrementOffsets( iv, dv3 );
+ }
+ incrementOffsets( iv, dv4 );
+ }
+ incrementOffsets( iv, dv5 );
+ }
+ incrementOffsets( iv, dv6 );
+ }
+ incrementOffsets( iv, dv7 );
+ }
+ incrementOffsets( iv, dv8 );
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = blockedbinary9d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/factory.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/factory.js
new file mode 100644
index 000000000000..df990d5a9b6f
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/factory.js
@@ -0,0 +1,133 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 isFunction = require( '@stdlib/assert/is-function' );
+var format = require( '@stdlib/string/format' );
+var reduce = require( './main.js' );
+
+
+// MAIN //
+
+/**
+* Return a function for performing a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assigning results to a provided output ndarray.
+*
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @throws {TypeError} first argument must be a function
+* @returns {Function} function for performing a reduction
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Create a function for performing a reduction over subarrays:
+* var dot = factory( gdot );
+* // returns
+*
+* // Perform a reduction:
+* dot( [ x, y, z ], [ 2, 3 ] );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+function factory( fcn ) {
+ if ( !isFunction( fcn ) ) {
+ throw new TypeError( format( 'invalid argument. First argument must be a function. Value: `%s`.', fcn ) );
+ }
+ return reducer;
+
+ /**
+ * Performs a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assigns results to a provided output ndarray.
+ *
+ * @private
+ * @param {ArrayLikeObject} arrays - array-like object containing ndarrays
+ * @param {IntegerArray} dims - list of dimensions over which to perform a reduction
+ * @param {Options} [options] - function options
+ * @returns {void}
+ */
+ function reducer( arrays, dims, options ) {
+ var opts;
+ if ( arguments.length > 2 ) {
+ opts = options;
+ } else {
+ opts = {};
+ }
+ return reduce( fcn, arrays, dims, opts );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = factory;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/increment_offsets.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/increment_offsets.js
new file mode 100644
index 000000000000..7d525521b721
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/increment_offsets.js
@@ -0,0 +1,46 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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';
+
+// MAIN //
+
+/**
+* Increments index offsets according to a list of increments.
+*
+* ## Notes
+*
+* - This function mutates the list of index offsets.
+*
+* @private
+* @param {NonNegativeIntegerArray} offsets - list of index offsets
+* @param {NonNegativeIntegerArray} inc - list of increments
+* @returns {NonNegativeIntegerArray} updated offsets
+*/
+function incrementOffsets( offsets, inc ) {
+ var i;
+ for ( i = 0; i < offsets.length; i++ ) {
+ offsets[ i ] += inc[ i ];
+ }
+ return offsets;
+}
+
+
+// EXPORTS //
+
+module.exports = incrementOffsets;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/index.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/index.js
new file mode 100644
index 000000000000..66a25b064df5
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/index.js
@@ -0,0 +1,175 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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';
+
+/**
+* Perform a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assign results to a provided output ndarray.
+*
+* @module @stdlib/ndarray/base/binary-reduce-strided1d
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+* var binaryReduceStrided1d = require( '@stdlib/ndarray/base/binary-reduce-strided1d' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Perform a reduction:
+* binaryReduceStrided1d( gdot, [ x, y, z ], [ 2, 3 ] );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+* var binaryReduceStrided1d = require( '@stdlib/ndarray/base/binary-reduce-strided1d' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Create a function for performing a reduction over subarrays:
+* var dot = binaryReduceStrided1d.factory( gdot );
+* // returns
+*
+* // Perform a reduction:
+* dot( [ x, y, z ], [ 2, 3 ] );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*/
+
+// MODULES //
+
+var setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' );
+var main = require( './main.js' );
+var factory = require( './factory.js' );
+
+
+// MAIN //
+
+setReadOnly( main, 'factory', factory );
+
+
+// EXPORTS //
+
+module.exports = main;
+
+// exports: { "factory": "main.factory" }
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/initialize_array_views.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/initialize_array_views.js
new file mode 100644
index 000000000000..3e7eadf96e79
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/initialize_array_views.js
@@ -0,0 +1,57 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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';
+
+// MAIN //
+
+/**
+* Initialize ndarray-like objects for representing zero-dimensional sub-array views of ancillary ndarray arguments.
+*
+* ## Notes
+*
+* - This function ignores the first three ndarray-like objects, which are assumed to be two input ndarrays and one output ndarray, respectively.
+* - This function mutates the provided output array.
+*
+* @private
+* @param {ArrayLikeObject} arrays - list of ndarray-like objects
+* @param {Array} out - output array
+* @returns {Array} output array
+*/
+function initializeViews( arrays, out ) {
+ var v;
+ var i;
+
+ for ( i = 3; i < arrays.length; i++ ) {
+ v = arrays[ i ];
+ out.push({
+ 'dtype': v.dtype,
+ 'data': v.data,
+ 'shape': [],
+ 'strides': [ 0 ],
+ 'offset': v.offset,
+ 'order': v.order
+ });
+ }
+ return out;
+}
+
+
+// EXPORTS //
+
+module.exports = initializeViews;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/main.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/main.js
new file mode 100644
index 000000000000..2b7b2e7b2666
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/main.js
@@ -0,0 +1,571 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 ndarray2object = require( '@stdlib/ndarray/base/ndarraylike2object' );
+var normalizeIndices = require( '@stdlib/ndarray/base/to-unique-normalized-indices' );
+var indicesComplement = require( '@stdlib/array/base/indices-complement' );
+var takeIndexed2 = require( '@stdlib/array/base/take-indexed2' );
+var iterationOrder = require( '@stdlib/ndarray/base/iteration-order' );
+var strides2order = require( '@stdlib/ndarray/base/strides2order' );
+var anyIsEntryIn = require( '@stdlib/array/base/any-is-entry-in' );
+var numel = require( '@stdlib/ndarray/base/numel' );
+var join = require( '@stdlib/array/base/join' );
+var format = require( '@stdlib/string/format' );
+var initializeViews = require( './initialize_array_views.js' );
+var reshapeStrategy = require( './reshape_strategy.js' );
+var blockedaccessorbinary2d = require( './2d_blocked_accessors.js' );
+var blockedaccessorbinary3d = require( './3d_blocked_accessors.js' );
+var blockedaccessorbinary4d = require( './4d_blocked_accessors.js' );
+var blockedaccessorbinary5d = require( './5d_blocked_accessors.js' );
+var blockedaccessorbinary6d = require( './6d_blocked_accessors.js' );
+var blockedaccessorbinary7d = require( './7d_blocked_accessors.js' );
+var blockedaccessorbinary8d = require( './8d_blocked_accessors.js' );
+var blockedaccessorbinary9d = require( './9d_blocked_accessors.js' );
+var blockedaccessorbinary10d = require( './10d_blocked_accessors.js' );
+var blockedbinary2d = require( './2d_blocked.js' );
+var blockedbinary3d = require( './3d_blocked.js' );
+var blockedbinary4d = require( './4d_blocked.js' );
+var blockedbinary5d = require( './5d_blocked.js' );
+var blockedbinary6d = require( './6d_blocked.js' );
+var blockedbinary7d = require( './7d_blocked.js' );
+var blockedbinary8d = require( './8d_blocked.js' );
+var blockedbinary9d = require( './9d_blocked.js' );
+var blockedbinary10d = require( './10d_blocked.js' );
+var accessorbinary0d = require( './0d_accessors.js' );
+var accessorbinary1d = require( './1d_accessors.js' );
+var accessorbinary2d = require( './2d_accessors.js' );
+var accessorbinary3d = require( './3d_accessors.js' );
+var accessorbinary4d = require( './4d_accessors.js' );
+var accessorbinary5d = require( './5d_accessors.js' );
+var accessorbinary6d = require( './6d_accessors.js' );
+var accessorbinary7d = require( './7d_accessors.js' );
+var accessorbinary8d = require( './8d_accessors.js' );
+var accessorbinary9d = require( './9d_accessors.js' );
+var accessorbinary10d = require( './10d_accessors.js' );
+var accessorbinarynd = require( './nd_accessors.js' );
+var binary0d = require( './0d.js' );
+var binary1d = require( './1d.js' );
+var binary2d = require( './2d.js' );
+var binary3d = require( './3d.js' );
+var binary4d = require( './4d.js' );
+var binary5d = require( './5d.js' );
+var binary6d = require( './6d.js' );
+var binary7d = require( './7d.js' );
+var binary8d = require( './8d.js' );
+var binary9d = require( './9d.js' );
+var binary10d = require( './10d.js' );
+var binarynd = require( './nd.js' );
+
+
+// VARIABLES //
+
+var BINARY = [
+ binary0d,
+ binary1d,
+ binary2d,
+ binary3d,
+ binary4d,
+ binary5d,
+ binary6d,
+ binary7d,
+ binary8d,
+ binary9d,
+ binary10d
+];
+var ACCESSOR_BINARY = [
+ accessorbinary0d,
+ accessorbinary1d,
+ accessorbinary2d,
+ accessorbinary3d,
+ accessorbinary4d,
+ accessorbinary5d,
+ accessorbinary6d,
+ accessorbinary7d,
+ accessorbinary8d,
+ accessorbinary9d,
+ accessorbinary10d
+];
+var BLOCKED_BINARY = [
+ blockedbinary2d, // 0
+ blockedbinary3d,
+ blockedbinary4d,
+ blockedbinary5d,
+ blockedbinary6d,
+ blockedbinary7d,
+ blockedbinary8d,
+ blockedbinary9d,
+ blockedbinary10d // 8
+];
+var BLOCKED_ACCESSOR_BINARY = [
+ blockedaccessorbinary2d, // 0
+ blockedaccessorbinary3d,
+ blockedaccessorbinary4d,
+ blockedaccessorbinary5d,
+ blockedaccessorbinary6d,
+ blockedaccessorbinary7d,
+ blockedaccessorbinary8d,
+ blockedaccessorbinary9d,
+ blockedaccessorbinary10d // 8
+];
+var MAX_DIMS = BINARY.length - 1;
+
+
+// FUNCTIONS //
+
+/**
+* Returns a boolean indicating if at least one ndarray data buffer implements the accessor protocol.
+*
+* @private
+* @param {ndarrayLike} x - first ndarray
+* @param {ndarrayLike} y - second ndarray
+* @param {ndarrayLike} z - third ndarray
+* @returns {boolean} boolean indicating whether an ndarray data buffer implements the accessor protocol
+*/
+function hasAccessors( x, y, z ) {
+ return anyIsEntryIn( [ x, y, z ], 'accessorProtocol', true );
+}
+
+
+// MAIN //
+
+/**
+* Performs a reduction over a list of specified dimensions in two input ndarrays via a one-dimensional strided array binary reduction function and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {ArrayLikeObject} arrays - array-like object containing ndarrays
+* @param {IntegerArray} dims - list of dimensions over which to perform a reduction
+* @param {Options} [options] - function options
+* @throws {Error} arrays must have the expected number of dimensions
+* @throws {RangeError} dimension indices must not exceed input ndarray bounds
+* @throws {RangeError} number of dimension indices must not exceed the number of input ndarray dimensions
+* @throws {Error} must provide unique dimension indices
+* @throws {Error} arrays must have the same loop dimension sizes
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [ 1, 3 ];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 3, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Perform a reduction:
+* binaryReduceStrided1d( gdot, [ x, y, z ], [ 2, 3 ] );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ 30.0, 174.0, 446.0 ] ]
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 1, 3, 2, 2 ];
+* var ysh = [ 1, 3, 2, 2 ];
+* var zsh = [];
+*
+* // Define the array strides:
+* var sx = [ 12, 4, 2, 1 ];
+* var sy = [ 12, 4, 2, 1 ];
+* var sz = [ 0 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Perform a reduction:
+* binaryReduceStrided1d( gdot, [ x, y, z ], [ 0, 1, 2, 3 ] );
+*
+* var v = z.data;
+* // returns [ 650.0 ]
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var getStride = require( '@stdlib/ndarray/base/stride' );
+* var getOffset = require( '@stdlib/ndarray/base/offset' );
+* var getData = require( '@stdlib/ndarray/base/data-buffer' );
+* var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 3, 2, 2 ];
+* var ysh = [ 3, 2, 2 ];
+* var zsh = [ 3, 2, 2 ];
+*
+* // Define the array strides:
+* var sx = [ 4, 2, 1 ];
+* var sy = [ 4, 2, 1 ];
+* var sz = [ 4, 2, 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Perform a reduction:
+* binaryReduceStrided1d( gdot, [ x, y, z ], [] );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ [ [ 1.0, 4.0 ], [ 9.0, 16.0 ] ], [ [ 25.0, 36.0 ], [ 49.0, 64.0 ] ], [ [ 81.0, 100.0 ], [ 121.0, 144.0 ] ] ]
+*/
+function binaryReduceStrided1d( fcn, arrays, dims, options ) { // eslint-disable-line max-statements
+ var strategy1;
+ var strategy2;
+ var views;
+ var ndims;
+ var ldims;
+ var opts;
+ var ordx;
+ var ordy;
+ var tmpx;
+ var tmpy;
+ var arr;
+ var len;
+ var shx;
+ var shy;
+ var shc;
+ var shl;
+ var iox;
+ var ioy;
+ var ioz;
+ var scx;
+ var scy;
+ var slx;
+ var sly;
+ var sz;
+ var ns;
+ var d;
+ var s;
+ var N;
+ var M;
+ var K;
+ var x;
+ var y;
+ var z;
+ var i;
+ var j;
+
+ if ( arguments.length > 3 ) {
+ opts = options;
+ } else {
+ opts = {};
+ }
+ // Standardize ndarray meta data...
+ N = arrays.length;
+ arr = [];
+ for ( i = 0; i < N; i++ ) {
+ arr.push( ndarray2object( arrays[ i ] ) );
+ }
+ // Cache references to the input and output arrays:
+ x = arr[ 0 ];
+ y = arr[ 1 ];
+ z = arr[ 2 ];
+
+ // Resolve the number of input array dimensions:
+ shx = x.shape;
+ shy = y.shape;
+ ndims = shx.length;
+
+ // Verify that both input arrays have the same shape:
+ if ( shx.length !== shy.length ) {
+ throw new Error( format( 'invalid argument. Input arrays must have the same number of dimensions. First array dimensions: %d. Second array dimensions: %d.', shx.length, shy.length ) );
+ }
+ for ( i = 0; i < ndims; i++ ) {
+ if ( shx[ i ] !== shy[ i ] ) {
+ throw new Error( format( 'invalid argument. Input arrays must have the same shape. First array shape: [%s]. Second array shape: [%s].', join( shx, ',' ), join( shy, ',' ) ) );
+ }
+ }
+
+ // Verify that we've been provided a list of unique dimension indices...
+ M = dims.length;
+ d = normalizeIndices( dims, ndims-1 );
+ if ( d === null ) {
+ throw new RangeError( format( 'invalid argument. Third argument contains an out-of-bounds dimension index. Value: [%s].', join( dims, ',' ) ) );
+ }
+ d.sort();
+ if ( d.length !== M ) {
+ throw new Error( format( 'invalid argument. Third argument must contain a list of unique dimension indices. Value: [%s].', join( dims, ',' ) ) );
+ }
+ // Check whether we've been provided a valid number of dimensions to reduce...
+ if ( M > ndims ) {
+ throw new RangeError( format( 'invalid argument. Number of specified dimensions cannot exceed the number of dimensions in the input array. Number of dimensions: %d. Value: [%s].', ndims, join( dims, ',' ) ) );
+ }
+ // Verify that provided ndarrays have the expected number of dimensions...
+ K = ndims - M;
+ if ( z.shape.length !== K ) {
+ throw new Error( format( 'invalid argument. Output array must have the same number of non-reduced dimensions as input arrays. Input array shape: [%s]. Number of non-reduced dimensions: %d. Output array shape: [%s].', join( shx, ',' ), K, join( z.shape, ',' ) ) );
+ }
+
+ // Resolve the non-reduced ("loop") dimensions and associated strides:
+ ldims = indicesComplement( shx.length, d );
+ tmpx = takeIndexed2( shx, x.strides, ldims );
+ tmpy = takeIndexed2( shy, y.strides, ldims );
+ shl = tmpx[ 0 ]; // tmpx[ 0 ] == tmpy[ 0 ]
+ slx = tmpx[ 1 ];
+ sly = tmpy[ 1 ];
+
+ // Resolve the reduced ("core") dimensions and associated strides:
+ tmpx = takeIndexed2( shx, x.strides, d );
+ tmpy = takeIndexed2( shy, y.strides, d );
+ shc = tmpx[ 0 ]; // tmpx[ 0 ] == tmpy[ 0 ]
+ scx = tmpx[ 1 ];
+ scy = tmpy[ 1 ];
+
+ // Verify that the provided arrays have the same loop dimensions...
+ len = 1; // number of elements
+ ns = 0; // number of singleton dimensions
+ for ( i = 0; i < K; i++ ) {
+ s = shl[ i ];
+ for ( j = 2; j < N; j++ ) {
+ if ( s !== arr[ j ].shape[ i ] ) {
+ throw new Error( format( 'invalid argument. Non-reduced dimensions must be consistent across all provided arrays. Input array shape: [%s]. Non-reduced dimension indices: [%s]. Non-reduced dimensions: [%s]. Array shape: [%s] (index: %d).', join( shx, ',' ), join( ldims, ',' ), join( shl, ',' ), join( arr[ j ].shape, ',' ), j ) );
+ }
+ }
+ // Note that, if one of the dimensions is `0`, the length will be `0`...
+ len *= s;
+
+ // Check whether the current dimension is a singleton dimension...
+ if ( s === 1 ) {
+ ns += 1;
+ }
+ }
+ // Check whether we were provided empty ndarrays...
+ if ( len === 0 || ( shc.length && numel( shc ) === 0 ) ) {
+ return;
+ }
+ // Initialize ndarray-like objects for representing sub-array views...
+ views = [
+ {
+ 'dtype': x.dtype,
+ 'data': x.data,
+ 'shape': shc,
+ 'strides': scx,
+ 'offset': x.offset,
+ 'order': x.order
+ },
+ {
+ 'dtype': y.dtype,
+ 'data': y.data,
+ 'shape': shc,
+ 'strides': scy,
+ 'offset': y.offset,
+ 'order': y.order
+ }
+ ];
+ initializeViews( arr, views );
+
+ // Determine the strategy for reshaping sub-array views of the input array prior to performing a reduction:
+ strategy1 = reshapeStrategy( views[ 0 ] );
+ strategy2 = reshapeStrategy( views[ 1 ] );
+
+ // Determine whether we can avoid iteration altogether...
+ if ( K === 0 ) {
+ if ( hasAccessors( x, y, z ) ) {
+ return ACCESSOR_BINARY[ K ]( fcn, arr, strategy1, strategy2, opts );
+ }
+ return BINARY[ K ]( fcn, arr, strategy1, strategy2, opts );
+ }
+ // Determine whether we only have one loop dimension and can thus readily perform one-dimensional iteration...
+ if ( K === 1 ) {
+ if ( hasAccessors( x, y, z ) ) {
+ return ACCESSOR_BINARY[ K ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ return BINARY[ K ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ sz = z.strides;
+
+ // Determine whether the loop dimensions have only **one** non-singleton dimension (e.g., shape=[10,1,1,1]) so that we can treat loop iteration as being equivalent to one-dimensional iteration...
+ if ( ns === K-1 ) {
+ // Get the index of the non-singleton dimension...
+ for ( i = 0; i < K; i++ ) {
+ if ( shl[ i ] !== 1 ) {
+ break;
+ }
+ }
+ z.shape = [ shl[i] ];
+ for ( j = 0; j < N; j++ ) {
+ arr[ j ].strides = [ arr[j].strides[i] ];
+ }
+ slx = [ slx[i] ];
+ sly = [ sly[i] ];
+ if ( hasAccessors( x, y, z ) ) {
+ return ACCESSOR_BINARY[ 1 ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ return BINARY[ 1 ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ iox = iterationOrder( slx ); // +/-1
+ ioy = iterationOrder( sly ); // +/-1
+ ioz = iterationOrder( sz ); // +/-1
+
+ // Determine whether we can avoid blocked iteration...
+ ordx = strides2order( slx );
+ ordy = strides2order( sly );
+ if ( iox !== 0 && ioy !== 0 && ioz !== 0 && ordx === strides2order( sz ) && ordy === strides2order( sz ) && K <= MAX_DIMS ) { // eslint-disable-line max-len
+ // So long as iteration for each respective array always moves in the same direction (i.e., no mixed sign strides) and the memory layouts are the same, we can leverage cache-optimal (i.e., normal) nested loops without resorting to blocked iteration...
+ if ( hasAccessors( x, y, z ) ) {
+ return ACCESSOR_BINARY[ K ]( fcn, arr, views, slx, sly, ordx === 1, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ return BINARY[ K ]( fcn, arr, views, slx, sly, ordx === 1, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ // At this point, we're either dealing with non-contiguous n-dimensional arrays, high dimensional n-dimensional arrays, and/or arrays having differing memory layouts, so our only hope is that we can still perform blocked iteration...
+
+ // Determine whether we can perform blocked iteration...
+ if ( K <= MAX_DIMS ) {
+ if ( hasAccessors( x, y, z ) ) {
+ return BLOCKED_ACCESSOR_BINARY[ K-2 ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ return BLOCKED_BINARY[ K-2 ]( fcn, arr, views, slx, sly, strategy1, strategy2, opts ); // eslint-disable-line max-len
+ }
+ // Fall-through to linear view iteration without regard for how data is stored in memory (i.e., take the slow path)...
+ if ( hasAccessors( x, y, z ) ) {
+ return accessorbinarynd( fcn, arr, views, strategy1, strategy2, opts );
+ }
+ binarynd( fcn, arr, views, strategy1, strategy2, opts );
+}
+
+
+// EXPORTS //
+
+module.exports = binaryReduceStrided1d;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd.js
new file mode 100644
index 000000000000..bc9f2be9a12b
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd.js
@@ -0,0 +1,189 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 numel = require( '@stdlib/ndarray/base/numel' );
+var vind2bind = require( '@stdlib/ndarray/base/vind2bind' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// VARIABLES //
+
+var MODE = 'throw';
+
+
+// MAIN //
+
+/**
+* Performs a reduction over two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var ybuf = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] );
+* var zbuf = new Float64Array( [ 0.0, 0.0, 0.0 ] );
+*
+* // Define the array shapes:
+* var xsh = [ 3, 2, 2 ];
+* var ysh = [ 3, 2, 2 ];
+* var zsh = [ 3 ];
+*
+* // Define the array strides:
+* var sx = [ 4, 2, 1 ];
+* var sy = [ 4, 2, 1 ];
+* var sz = [ 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major'
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major'
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major'
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binarynd( gdot, [ x, y, z ], views, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ 30.0, 174.0, 446.0 ]
+*/
+function binarynd( fcn, arrays, views, strategy1, strategy2, opts ) {
+ var zbuf;
+ var len;
+ var arr;
+ var sh;
+ var iv;
+ var io;
+ var N;
+ var z;
+ var v;
+ var i;
+ var j;
+
+ N = arrays.length;
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Compute the total number of elements over which to iterate:
+ len = numel( sh );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Iterate based on the linear **view** index, regardless as to how the data is stored in memory...
+ io = zeros( N );
+ for ( i = 0; i < len; i++ ) {
+ for ( j = 0; j < N; j++ ) {
+ arr = arrays[ j ];
+ io[ j ] = vind2bind( sh, arr.strides, iv[ j ], arr.order, i, MODE );
+ }
+ setViewOffsets( views, io );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ zbuf[ io[2] ] = fcn( v, opts );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binarynd;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd_accessors.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd_accessors.js
new file mode 100644
index 000000000000..547f3cf529b0
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/nd_accessors.js
@@ -0,0 +1,198 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 numel = require( '@stdlib/ndarray/base/numel' );
+var vind2bind = require( '@stdlib/ndarray/base/vind2bind' );
+var copyIndexed = require( '@stdlib/array/base/copy-indexed' );
+var zeros = require( '@stdlib/array/base/zeros' );
+var setViewOffsets = require( './set_view_offsets.js' );
+var offsets = require( './offsets.js' );
+
+
+// VARIABLES //
+
+var MODE = 'throw';
+
+
+// MAIN //
+
+/**
+* Performs a reduction over two input ndarrays and assigns results to a provided output ndarray.
+*
+* @private
+* @param {Function} fcn - wrapper for a one-dimensional strided array reduction function
+* @param {Array} arrays - ndarrays
+* @param {Array} views - initialized ndarray-like objects representing sub-array views
+* @param {Function} strategy1 - first input ndarray reshape strategy
+* @param {Function} strategy2 - second input ndarray reshape strategy
+* @param {Options} opts - function options
+* @returns {void}
+*
+* @example
+* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
+* var accessors = require( '@stdlib/array/base/accessors' );
+* var Float64Array = require( '@stdlib/array/float64' );
+* var ndarray2array = require( '@stdlib/ndarray/base/to-array' );
+* var gdot = require( '@stdlib/blas/base/ndarray/gdot' );
+*
+* // Create data buffers:
+* var xbuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var ybuf = toAccessorArray( new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 ] ) );
+* var zbuf = toAccessorArray( new Float64Array( [ 0.0, 0.0, 0.0 ] ) );
+*
+* // Define the array shapes:
+* var xsh = [ 3, 2, 2 ];
+* var ysh = [ 3, 2, 2 ];
+* var zsh = [ 3 ];
+*
+* // Define the array strides:
+* var sx = [ 4, 2, 1 ];
+* var sy = [ 4, 2, 1 ];
+* var sz = [ 1 ];
+*
+* // Define the index offsets:
+* var ox = 0;
+* var oy = 0;
+* var oz = 0;
+*
+* // Create input ndarray-like objects:
+* var x = {
+* 'dtype': 'float64',
+* 'data': xbuf,
+* 'shape': xsh,
+* 'strides': sx,
+* 'offset': ox,
+* 'order': 'row-major',
+* 'accessors': accessors( xbuf ).accessors
+* };
+* var y = {
+* 'dtype': 'float64',
+* 'data': ybuf,
+* 'shape': ysh,
+* 'strides': sy,
+* 'offset': oy,
+* 'order': 'row-major',
+* 'accessors': accessors( ybuf ).accessors
+* };
+*
+* // Create an output ndarray-like object:
+* var z = {
+* 'dtype': 'float64',
+* 'data': zbuf,
+* 'shape': zsh,
+* 'strides': sz,
+* 'offset': oz,
+* 'order': 'row-major',
+* 'accessors': accessors( zbuf ).accessors
+* };
+*
+* // Initialize ndarray-like objects representing sub-array views:
+* var views = [
+* {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* },
+* {
+* 'dtype': y.dtype,
+* 'data': y.data,
+* 'shape': [ 2, 2 ],
+* 'strides': [ 2, 1 ],
+* 'offset': y.offset,
+* 'order': y.order
+* }
+* ];
+*
+* // Define a reshape strategy:
+* function strategy( x ) {
+* return {
+* 'dtype': x.dtype,
+* 'data': x.data,
+* 'shape': [ 4 ],
+* 'strides': [ 1 ],
+* 'offset': x.offset,
+* 'order': x.order
+* };
+* }
+*
+* // Perform a reduction:
+* binarynd( gdot, [ x, y, z ], views, strategy, strategy, {} );
+*
+* var arr = ndarray2array( z.data, z.shape, z.strides, z.offset, z.order );
+* // returns [ 30.0, 174.0, 446.0 ]
+*/
+function binarynd( fcn, arrays, views, strategy1, strategy2, opts ) {
+ var zbuf;
+ var len;
+ var arr;
+ var set;
+ var sh;
+ var iv;
+ var io;
+ var N;
+ var z;
+ var v;
+ var i;
+ var j;
+
+ N = arrays.length;
+
+ // Resolve the output ndarray and associated shape:
+ z = arrays[ 2 ];
+ sh = z.shape;
+
+ // Compute the total number of elements over which to iterate:
+ len = numel( sh );
+
+ // Resolve a list of pointers to the first indexed elements in the respective ndarrays:
+ iv = offsets( arrays );
+
+ // Shallow copy the list of views to an internal array so that we can update with reshaped views without impacting the original list of views:
+ v = copyIndexed( views );
+
+ // Cache a reference to the output ndarray buffer:
+ zbuf = z.data;
+
+ // Cache accessors:
+ set = z.accessors[ 1 ];
+
+ // Iterate based on the linear **view** index, regardless as to how the data is stored in memory...
+ io = zeros( N );
+ for ( i = 0; i < len; i++ ) {
+ for ( j = 0; j < N; j++ ) {
+ arr = arrays[ j ];
+ io[ j ] = vind2bind( sh, arr.strides, iv[ j ], arr.order, i, MODE );
+ }
+ setViewOffsets( views, io );
+ v[ 0 ] = strategy1( views[ 0 ] );
+ v[ 1 ] = strategy2( views[ 1 ] );
+ set( zbuf, io[2], fcn( v, opts ) );
+ }
+}
+
+
+// EXPORTS //
+
+module.exports = binarynd;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/offsets.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/offsets.js
new file mode 100644
index 000000000000..a606628f5f3d
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/offsets.js
@@ -0,0 +1,42 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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';
+
+// MAIN //
+
+/**
+* Resolves index offsets from a list of ndarray-like objects.
+*
+* @private
+* @param {ArrayLikeObject} arrays - list of ndarray-like objects
+* @returns {NonNegativeIntegerArray} list of offsets
+*/
+function offsets( arrays ) {
+ var out = [];
+ var i;
+ for ( i = 0; i < arrays.length; i++ ) {
+ out.push( arrays[ i ].offset );
+ }
+ return out;
+}
+
+
+// EXPORTS //
+
+module.exports = offsets;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/reshape_strategy.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/reshape_strategy.js
new file mode 100644
index 000000000000..aa8118f8f85a
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/reshape_strategy.js
@@ -0,0 +1,260 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 iterationOrder = require( '@stdlib/ndarray/base/iteration-order' );
+var minmaxViewBufferIndex = require( '@stdlib/ndarray/base/minmax-view-buffer-index' ).assign;
+var ndarraylike2object = require( '@stdlib/ndarray/base/ndarraylike2object' );
+var assign = require( '@stdlib/ndarray/base/assign' );
+var ndarraylike2ndarray = require( '@stdlib/ndarray/base/ndarraylike2ndarray' );
+var emptyLike = require( '@stdlib/ndarray/base/empty-like' );
+
+
+// FUNCTIONS //
+
+/**
+* Returns an input ndarray.
+*
+* @private
+* @param {ndarrayLike} x - input ndarray
+* @returns {ndarrayLike} input ndarray
+*/
+function identity( x ) {
+ return x;
+}
+
+/**
+* Broadcasts a zero-dimensional ndarray to a one-dimensional ndarray view containing a single element.
+*
+* @private
+* @param {ndarrayLike} x - input ndarray
+* @returns {ndarrayLike} broadcasted ndarray view
+*/
+function broadcast( x ) {
+ // NOTE: the following properties must be set in the exact same order as in `x` in order to ensure that the returned object has the same hidden shape as the input ndarray-like object...
+ return {
+ 'dtype': x.dtype,
+ 'data': x.data,
+ 'shape': [ 1 ],
+ 'strides': [ 0 ],
+ 'offset': x.offset,
+ 'order': x.order
+ };
+}
+
+/**
+* Returns a function which returns an ndarray view in which the singleton dimensions are removed from an input ndarray having only a single non-singleton dimension.
+*
+* @private
+* @param {ndarrayLike} arr - original ndarray
+* @param {NonNegativeInteger} index - index of the non-singleton dimension
+* @returns {Function} function for returning an ndarray view
+*/
+function squeeze( arr, index ) {
+ var sh = [ arr.shape[ index ] ];
+ var sx = [ arr.strides[ index ] ];
+ return reshape;
+
+ /**
+ * Returns an ndarray view in which the singleton dimensions are removed from an input ndarray having only a single non-singleton dimension.
+ *
+ * @private
+ * @param {ndarrayLike} x - input ndarray
+ * @returns {ndarrayLike} a squeezed ndarray view
+ */
+ function reshape( x ) {
+ // NOTE: the following properties must be set in the exact same order as in `arr` in order to ensure that the returned object has the same hidden shape as the input ndarray-like object...
+ return {
+ 'dtype': x.dtype,
+ 'data': x.data,
+ 'shape': sh,
+ 'strides': sx,
+ 'offset': x.offset,
+ 'order': x.order
+ };
+ }
+}
+
+/**
+* Returns a function which returns a one-dimensional ndarray view of a contiguous input ndarray having more than one dimension.
+*
+* @private
+* @param {NonNegativeInteger} len - number of elements in an ndarray
+* @param {integer} iox - iteration order
+* @returns {Function} function for returning a one-dimensional ndarray view
+*/
+function contiguous( len, iox ) {
+ var xmmv;
+ var ind;
+ var sh;
+ var sx;
+
+ // Resolve the index of the min/max view buffer element which is the first indexed element...
+ if ( iox === 1 ) {
+ ind = 0;
+ } else {
+ ind = 1;
+ }
+ // Initialize an array for storing the min/max view buffer elements:
+ xmmv = [ 0, 0 ]; // [ min, max ]
+
+ // Initialize the output one-dimensional view's shape and strides:
+ sh = [ len ];
+ sx = [ iox ];
+
+ return reshape;
+
+ /**
+ * Returns a one-dimensional ndarray view of a contiguous input ndarray having more than one dimension.
+ *
+ * @private
+ * @param {ndarrayLike} x - input ndarray
+ * @returns {ndarrayLike} a one-dimensional ndarray view
+ */
+ function reshape( x ) {
+ // Resolve the minimum and maximum linear indices in the underlying data buffer which are accessible to the input ndarray view:
+ minmaxViewBufferIndex( x.shape, x.strides, x.offset, xmmv );
+
+ // NOTE: the following properties must be set in the exact same order as in `x` in order to ensure that the returned object has the same hidden shape as the input ndarray-like object...
+ return {
+ 'dtype': x.dtype,
+ 'data': x.data,
+ 'shape': sh,
+ 'strides': sx,
+ 'offset': xmmv[ ind ], // the index of the first indexed element
+ 'order': x.order
+ };
+ }
+}
+
+/**
+* Returns a function which copies an input ndarray to a contiguous ndarray workspace.
+*
+* @private
+* @param {NonNegativeInteger} len - number of elements in an ndarray
+* @param {ndarrayLike} workspace - ndarray workspace
+* @returns {Function} function which copies an input ndarray to a contiguous ndarray workspace
+*/
+function copy( len, workspace ) {
+ // NOTE: the following properties must be set in the exact same order as in the input ndarray-like object in order to ensure that the returned object has the same hidden shape...
+ var view = {
+ 'dtype': workspace.dtype,
+ 'data': workspace.data,
+ 'shape': [ len ],
+ 'strides': [ 1 ],
+ 'offset': workspace.offset,
+ 'order': workspace.order
+ };
+ return reshape;
+
+ /**
+ * Copies an input ndarray to a contiguous ndarray workspace and returns a one-dimensional workspace view.
+ *
+ * @private
+ * @param {ndarrayLike} x - input ndarray
+ * @returns {ndarrayLike} one-dimensional workspace view
+ */
+ function reshape( x ) {
+ assign( [ x, workspace ] );
+ return view;
+ }
+}
+
+
+// MAIN //
+
+/**
+* Returns a function for reshaping input ndarrays which have the same data type, shape, and strides as a provided ndarray.
+*
+* @private
+* @param {ndarrayLike} x - input ndarray
+* @param {string} x.dtype - input ndarray data type
+* @param {Collection} x.data - input ndarray data buffer
+* @param {NonNegativeIntegerArray} x.shape - input ndarray shape
+* @param {IntegerArray} x.strides - input ndarray strides
+* @param {NonNegativeInteger} x.offset - input ndarray index offset
+* @param {string} x.order - input ndarray memory layout
+* @returns {Function} function implementing a reshape strategy
+*/
+function strategy( x ) {
+ var ndims;
+ var xmmv;
+ var len;
+ var iox;
+ var sh;
+ var ns;
+ var i;
+
+ // Resolve the number of array dimensions:
+ sh = x.shape;
+ ndims = sh.length;
+
+ // Check whether the ndarray is zero-dimensional...
+ if ( ndims === 0 ) {
+ return broadcast;
+ }
+ // Check whether the ndarray is already one-dimensional...
+ if ( ndims === 1 ) {
+ return identity;
+ }
+ // Determine the number of singleton dimensions...
+ len = 1; // number of elements
+ ns = 0; // number of singleton dimensions
+ for ( i = 0; i < ndims; i++ ) {
+ // Check whether the current dimension is a singleton dimension...
+ if ( sh[ i ] === 1 ) {
+ ns += 1;
+ }
+ len *= sh[ i ];
+ }
+ // Determine whether the ndarray has only **one** non-singleton dimension (e.g., ndims=4, shape=[10,1,1,1]) so that we can simply create an ndarray view without the singleton dimensions...
+ if ( ns === ndims-1 ) {
+ // Get the index of the non-singleton dimension...
+ for ( i = 0; i < ndims; i++ ) {
+ if ( sh[ i ] !== 1 ) {
+ break;
+ }
+ }
+ return squeeze( x, i );
+ }
+ iox = iterationOrder( x.strides ); // +/-1
+
+ // Determine whether we can avoid copying data...
+ if ( iox !== 0 ) {
+ // Determine the minimum and maximum linear indices which are accessible by the ndarray view:
+ xmmv = minmaxViewBufferIndex( sh, x.strides, x.offset, [ 0, 0 ] );
+
+ // Determine whether we can ignore shape (and strides) and create a new one-dimensional ndarray view...
+ if ( len === ( xmmv[1]-xmmv[0]+1 ) ) {
+ return contiguous( len, iox );
+ }
+ // The ndarray is non-contiguous, so we cannot directly interpret as a one-dimensional ndarray...
+
+ // Fall-through to copying to a workspace ndarray...
+ }
+ // At this point, we're dealing with a non-contiguous multi-dimensional ndarray, so we need to copy to a contiguous workspace:
+ return copy( len, ndarraylike2object( emptyLike( ndarraylike2ndarray( x ) ) ) ); // eslint-disable-line max-len
+}
+
+
+// EXPORTS //
+
+module.exports = strategy;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/set_view_offsets.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/set_view_offsets.js
new file mode 100644
index 000000000000..3a1f6d443481
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/lib/set_view_offsets.js
@@ -0,0 +1,52 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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';
+
+// MAIN //
+
+/**
+* Sets view offsets according to a list of index offsets.
+*
+* ## Notes
+*
+* - This function skips the second element in the list of index offsets, as that is assumed to correspond to the output ndarray which does not have a corresponding view. Meaning, the list of views is expected to have `N` elements, and the list of index offsets is expected to have `N+1` elements.
+* - This function mutates the provides view objects.
+*
+* @private
+* @param {Array} views - list of ndarray-like objects representing ndarray views
+* @param {NonNegativeIntegerArray} offsets - list of index offsets
+* @returns {Array} updated views
+*/
+function setViewOffsets( views, offsets ) {
+ var i;
+ var j;
+ for ( i = 0, j = 0; i < offsets.length; i++ ) {
+ if ( i === 2 ) { // note: expected to correspond to the output ndarray which does not have a corresponding view
+ continue;
+ }
+ views[ j ].offset = offsets[ i ];
+ j += 1;
+ }
+ return views;
+}
+
+
+// EXPORTS //
+
+module.exports = setViewOffsets;
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/package.json b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/package.json
new file mode 100644
index 000000000000..5f175b3bc34b
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/package.json
@@ -0,0 +1,64 @@
+{
+ "name": "@stdlib/ndarray/base/binary-reduce-strided1d",
+ "version": "0.0.0",
+ "description": "Perform a reduction over a list of specified dimensions in an input ndarray via a one-dimensional strided array reduction function and assign results to a provided output ndarray.",
+ "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": {
+ "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",
+ "strided",
+ "array",
+ "ndarray",
+ "unary",
+ "reduce",
+ "reduction",
+ "accumulate",
+ "accumulation",
+ "vector"
+ ],
+ "__stdlib__": {}
+}
diff --git a/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/test/test.js b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/test/test.js
new file mode 100644
index 000000000000..d42430daf096
--- /dev/null
+++ b/lib/node_modules/@stdlib/ndarray/base/binary-reduce-strided1d/test/test.js
@@ -0,0 +1,35 @@
+/**
+* @license Apache-2.0
+*
+* Copyright (c) 2025 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 binaryReduceStrided1d = require( './../lib' );
+
+
+// TESTS //
+
+tape( 'main export is a function', function test( t ) {
+ t.ok( true, __filename );
+ t.strictEqual( typeof binaryReduceStrided1d, 'function', 'main export is a function' );
+ t.end();
+});
+
+// FIXME: add tests