| 
 | 1 | +/**  | 
 | 2 | +* @license Apache-2.0  | 
 | 3 | +*  | 
 | 4 | +* Copyright (c) 2025 The Stdlib Authors.  | 
 | 5 | +*  | 
 | 6 | +* Licensed under the Apache License, Version 2.0 (the "License");  | 
 | 7 | +* you may not use this file except in compliance with the License.  | 
 | 8 | +* You may obtain a copy of the License at  | 
 | 9 | +*  | 
 | 10 | +*    http://www.apache.org/licenses/LICENSE-2.0  | 
 | 11 | +*  | 
 | 12 | +* Unless required by applicable law or agreed to in writing, software  | 
 | 13 | +* distributed under the License is distributed on an "AS IS" BASIS,  | 
 | 14 | +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | 
 | 15 | +* See the License for the specific language governing permissions and  | 
 | 16 | +* limitations under the License.  | 
 | 17 | +*/  | 
 | 18 | + | 
 | 19 | +/* eslint-disable max-depth */  | 
 | 20 | + | 
 | 21 | +'use strict';  | 
 | 22 | + | 
 | 23 | +// MODULES //  | 
 | 24 | + | 
 | 25 | +var strides2order = require( '@stdlib/ndarray/base/strides2order' );  | 
 | 26 | +var zeroTo = require( '@stdlib/array/base/zero-to' );  | 
 | 27 | +var reverse = require( '@stdlib/array/base/reverse' );  | 
 | 28 | +var take = require( '@stdlib/array/base/take-indexed' );  | 
 | 29 | + | 
 | 30 | + | 
 | 31 | +// MAIN //  | 
 | 32 | + | 
 | 33 | +/**  | 
 | 34 | +* Returns the first element in an ndarray which passes a test implemented by a predicate function.  | 
 | 35 | +*  | 
 | 36 | +* @private  | 
 | 37 | +* @param {Object} x - object containing ndarray meta data  | 
 | 38 | +* @param {ndarrayLike} x.ref - reference to the original ndarray-like object  | 
 | 39 | +* @param {string} x.dtype - data type  | 
 | 40 | +* @param {Collection} x.data - data buffer  | 
 | 41 | +* @param {NonNegativeIntegerArray} x.shape - dimensions  | 
 | 42 | +* @param {IntegerArray} x.strides - stride lengths  | 
 | 43 | +* @param {NonNegativeInteger} x.offset - index offset  | 
 | 44 | +* @param {string} x.order - specifies whether `x` is row-major (C-style) or column-major (Fortran-style)  | 
 | 45 | +* @param {*} sentinelValue - sentinel value  | 
 | 46 | +* @param {Function} predicate - predicate function  | 
 | 47 | +* @param {*} thisArg - predicate function execution context  | 
 | 48 | +* @returns {*} result  | 
 | 49 | +*  | 
 | 50 | +* @example  | 
 | 51 | +* var Float64Array = require( '@stdlib/array/float64' );  | 
 | 52 | +*  | 
 | 53 | +* function predicate( value ) {  | 
 | 54 | +*    return value % 2.0 === 0.0;  | 
 | 55 | +* }  | 
 | 56 | +*  | 
 | 57 | +* // Create a data buffer:  | 
 | 58 | +* 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 ] );  | 
 | 59 | +*  | 
 | 60 | +* // Define the shape of the input array:  | 
 | 61 | +* var shape = [ 1, 1, 1, 1, 1, 1, 3, 1, 2 ];  | 
 | 62 | +*  | 
 | 63 | +* // Define the array strides:  | 
 | 64 | +* var sx = [ 12, 12, 12, 12, 12, 12, 4, 4, 1 ];  | 
 | 65 | +*  | 
 | 66 | +* // Define the index offset:  | 
 | 67 | +* var ox = 1;  | 
 | 68 | +*  | 
 | 69 | +* // Create the input ndarray-like object:  | 
 | 70 | +* var x = {  | 
 | 71 | +*     'ref': null,  | 
 | 72 | +*     'dtype': 'float64',  | 
 | 73 | +*     'data': xbuf,  | 
 | 74 | +*     'shape': shape,  | 
 | 75 | +*     'strides': sx,  | 
 | 76 | +*     'offset': ox,  | 
 | 77 | +*     'order': 'row-major'  | 
 | 78 | +* };  | 
 | 79 | +*  | 
 | 80 | +* // Test elements:  | 
 | 81 | +* var out = find9d( x, NaN, predicate );  | 
 | 82 | +* // returns 2.0  | 
 | 83 | +*/  | 
 | 84 | +function find9d( x, sentinelValue, predicate, thisArg ) {  | 
 | 85 | +	var xbuf;  | 
 | 86 | +	var idx;  | 
 | 87 | +	var dx0;  | 
 | 88 | +	var dx1;  | 
 | 89 | +	var dx2;  | 
 | 90 | +	var dx3;  | 
 | 91 | +	var dx4;  | 
 | 92 | +	var dx5;  | 
 | 93 | +	var dx6;  | 
 | 94 | +	var dx7;  | 
 | 95 | +	var dx8;  | 
 | 96 | +	var sh;  | 
 | 97 | +	var S0;  | 
 | 98 | +	var S1;  | 
 | 99 | +	var S2;  | 
 | 100 | +	var S3;  | 
 | 101 | +	var S4;  | 
 | 102 | +	var S5;  | 
 | 103 | +	var S6;  | 
 | 104 | +	var S7;  | 
 | 105 | +	var S8;  | 
 | 106 | +	var sx;  | 
 | 107 | +	var ix;  | 
 | 108 | +	var i0;  | 
 | 109 | +	var i1;  | 
 | 110 | +	var i2;  | 
 | 111 | +	var i3;  | 
 | 112 | +	var i4;  | 
 | 113 | +	var i5;  | 
 | 114 | +	var i6;  | 
 | 115 | +	var i7;  | 
 | 116 | +	var i8;  | 
 | 117 | + | 
 | 118 | +	// Note on variable naming convention: S#, dx#, i# where # corresponds to the loop number, with `0` being the innermost loop...  | 
 | 119 | + | 
 | 120 | +	// Extract loop variables for purposes of loop interchange: dimensions and loop offset (pointer) increments...  | 
 | 121 | +	sh = x.shape;  | 
 | 122 | +	sx = x.strides;  | 
 | 123 | +	idx = zeroTo( sh.length );  | 
 | 124 | +	if ( strides2order( sx ) === 1 ) {  | 
 | 125 | +		// For row-major ndarrays, the last dimensions have the fastest changing indices...  | 
 | 126 | +		S0 = sh[ 8 ];  | 
 | 127 | +		S1 = sh[ 7 ];  | 
 | 128 | +		S2 = sh[ 6 ];  | 
 | 129 | +		S3 = sh[ 5 ];  | 
 | 130 | +		S4 = sh[ 4 ];  | 
 | 131 | +		S5 = sh[ 3 ];  | 
 | 132 | +		S6 = sh[ 2 ];  | 
 | 133 | +		S7 = sh[ 1 ];  | 
 | 134 | +		S8 = sh[ 0 ];  | 
 | 135 | +		dx0 = sx[ 8 ];                // offset increment for innermost loop  | 
 | 136 | +		dx1 = sx[ 7 ] - ( S0*sx[8] );  | 
 | 137 | +		dx2 = sx[ 6 ] - ( S1*sx[7] );  | 
 | 138 | +		dx3 = sx[ 5 ] - ( S2*sx[6] );  | 
 | 139 | +		dx4 = sx[ 4 ] - ( S3*sx[5] );  | 
 | 140 | +		dx5 = sx[ 3 ] - ( S4*sx[4] );  | 
 | 141 | +		dx6 = sx[ 2 ] - ( S5*sx[3] );  | 
 | 142 | +		dx7 = sx[ 1 ] - ( S6*sx[2] );  | 
 | 143 | +		dx8 = sx[ 0 ] - ( S7*sx[1] ); // offset increment for outermost loop  | 
 | 144 | +	} else { // order === 'column-major'  | 
 | 145 | +		// For column-major ndarrays, the first dimensions have the fastest changing indices...  | 
 | 146 | +		S0 = sh[ 0 ];  | 
 | 147 | +		S1 = sh[ 1 ];  | 
 | 148 | +		S2 = sh[ 2 ];  | 
 | 149 | +		S3 = sh[ 3 ];  | 
 | 150 | +		S4 = sh[ 4 ];  | 
 | 151 | +		S5 = sh[ 5 ];  | 
 | 152 | +		S6 = sh[ 6 ];  | 
 | 153 | +		S7 = sh[ 7 ];  | 
 | 154 | +		S8 = sh[ 8 ];  | 
 | 155 | +		dx0 = sx[ 0 ];                // offset increment for innermost loop  | 
 | 156 | +		dx1 = sx[ 1 ] - ( S0*sx[0] );  | 
 | 157 | +		dx2 = sx[ 2 ] - ( S1*sx[1] );  | 
 | 158 | +		dx3 = sx[ 3 ] - ( S2*sx[2] );  | 
 | 159 | +		dx4 = sx[ 4 ] - ( S3*sx[3] );  | 
 | 160 | +		dx5 = sx[ 5 ] - ( S4*sx[4] );  | 
 | 161 | +		dx6 = sx[ 6 ] - ( S5*sx[5] );  | 
 | 162 | +		dx7 = sx[ 7 ] - ( S6*sx[6] );  | 
 | 163 | +		dx8 = sx[ 8 ] - ( S7*sx[7] ); // offset increment for outermost loop  | 
 | 164 | +		idx = reverse( idx );  | 
 | 165 | +	}  | 
 | 166 | +	// Set a pointer to the first indexed element:  | 
 | 167 | +	ix = x.offset;  | 
 | 168 | + | 
 | 169 | +	// Cache a reference to the input ndarray buffer:  | 
 | 170 | +	xbuf = x.data;  | 
 | 171 | + | 
 | 172 | +	// Iterate over the ndarray dimensions...  | 
 | 173 | +	for ( i8 = 0; i8 < S8; i8++ ) {  | 
 | 174 | +		for ( i7 = 0; i7 < S7; i7++ ) {  | 
 | 175 | +			for ( i6 = 0; i6 < S6; i6++ ) {  | 
 | 176 | +				for ( i5 = 0; i5 < S5; i5++ ) {  | 
 | 177 | +					for ( i4 = 0; i4 < S4; i4++ ) {  | 
 | 178 | +						for ( i3 = 0; i3 < S3; i3++ ) {  | 
 | 179 | +							for ( i2 = 0; i2 < S2; i2++ ) {  | 
 | 180 | +								for ( i1 = 0; i1 < S1; i1++ ) {  | 
 | 181 | +									for ( i0 = 0; i0 < S0; i0++ ) {  | 
 | 182 | +										if ( predicate.call( thisArg, xbuf[ ix ], take( [ i8, i7, i6, i5, i4, i3, i2, i1, i0 ], idx ), x.ref ) ) { // eslint-disable-line max-len  | 
 | 183 | +											return xbuf[ ix ];  | 
 | 184 | +										}  | 
 | 185 | +										ix += dx0;  | 
 | 186 | +									}  | 
 | 187 | +									ix += dx1;  | 
 | 188 | +								}  | 
 | 189 | +								ix += dx2;  | 
 | 190 | +							}  | 
 | 191 | +							ix += dx3;  | 
 | 192 | +						}  | 
 | 193 | +						ix += dx4;  | 
 | 194 | +					}  | 
 | 195 | +					ix += dx5;  | 
 | 196 | +				}  | 
 | 197 | +				ix += dx6;  | 
 | 198 | +			}  | 
 | 199 | +			ix += dx7;  | 
 | 200 | +		}  | 
 | 201 | +		ix += dx8;  | 
 | 202 | +	}  | 
 | 203 | +	return sentinelValue;  | 
 | 204 | +}  | 
 | 205 | + | 
 | 206 | + | 
 | 207 | +// EXPORTS //  | 
 | 208 | + | 
 | 209 | +module.exports = find9d;  | 
0 commit comments