Skip to content

Commit 59656ab

Browse files
authored
feat!: add fromIndex support to blas/ext/base/ndarray/slast-index-of-falsy
BREAKING CHANGE: add `fromIndex` support To maintain previous behavior, provide an additional zero-dimensional ndarray containing the index of the last element. PR-URL: #14653 Reviewed-by: Athan Reines <kgryte@gmail.com> Closes: stdlib-js/metr-issue-tracker#1198
1 parent 9ba74da commit 59656ab

9 files changed

Lines changed: 240 additions & 23 deletions

File tree

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/README.md‎

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,38 @@ Returns the index of the last falsy element in a one-dimensional single-precisio
4242

4343
```javascript
4444
var Float32Vector = require( '@stdlib/ndarray/vector/float32' );
45+
var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
4546

4647
var x = new Float32Vector( [ 1.0, 0.0, 3.0, 0.0 ] );
4748

48-
var idx = slastIndexOfFalsy( [ x ] );
49+
var fromIndex = scalar2ndarray( 3, {
50+
'dtype': 'generic'
51+
});
52+
53+
var idx = slastIndexOfFalsy( [ x, fromIndex ] );
4954
// returns 3
5055
```
5156

5257
The function has the following parameters:
5358

54-
- **arrays**: array-like object containing a one-dimensional input ndarray.
59+
- **arrays**: array-like object containing the following ndarrays:
60+
61+
- a one-dimensional input ndarray.
62+
- a zero-dimensional ndarray containing the index from which to begin searching.
5563

5664
If the function is unable to find a falsy element, the function returns `-1`.
5765

5866
```javascript
5967
var Float32Vector = require( '@stdlib/ndarray/vector/float32' );
68+
var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
6069

6170
var x = new Float32Vector( [ 1.0, 2.0, 3.0, 4.0 ] );
6271

63-
var idx = slastIndexOfFalsy( [ x ] );
72+
var fromIndex = scalar2ndarray( 3, {
73+
'dtype': 'generic'
74+
});
75+
76+
var idx = slastIndexOfFalsy( [ x, fromIndex ] );
6477
// returns -1
6578
```
6679

@@ -73,6 +86,7 @@ var idx = slastIndexOfFalsy( [ x ] );
7386
## Notes
7487

7588
- The function treats `NaN` values as falsy.
89+
- If a specified starting search index is negative, the function resolves the starting search index by counting backward from the last element (where `-1` refers to the last element).
7690

7791
</section>
7892

@@ -86,6 +100,7 @@ var idx = slastIndexOfFalsy( [ x ] );
86100

87101
```javascript
88102
var bernoulli = require( '@stdlib/random/bernoulli' );
103+
var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
89104
var ndarray2array = require( '@stdlib/ndarray/to-array' );
90105
var slastIndexOfFalsy = require( '@stdlib/blas/ext/base/ndarray/slast-index-of-falsy' );
91106

@@ -96,7 +111,11 @@ var opts = {
96111
var x = bernoulli( [ 10 ], 0.7, opts );
97112
console.log( ndarray2array( x ) );
98113

99-
var idx = slastIndexOfFalsy( [ x ] );
114+
var fromIndex = scalar2ndarray( 9, {
115+
'dtype': 'generic'
116+
});
117+
118+
var idx = slastIndexOfFalsy( [ x, fromIndex ] );
100119
console.log( idx );
101120
```
102121

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/benchmark/benchmark.js‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
var bench = require( '@stdlib/bench' );
2424
var ones = require( '@stdlib/ndarray/ones' );
25+
var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
2526
var isInteger = require( '@stdlib/assert/is-integer' ).isPrimitive;
2627
var pow = require( '@stdlib/math/base/special/pow' );
2728
var format = require( '@stdlib/string/format' );
@@ -46,7 +47,13 @@ var options = {
4647
* @returns {Function} benchmark function
4748
*/
4849
function createBenchmark( len ) {
49-
var x = ones( [ len ], options );
50+
var fromIndex;
51+
var x;
52+
53+
x = ones( [ len ], options );
54+
fromIndex = scalar2ndarray( len - 1, {
55+
'dtype': 'generic'
56+
});
5057
return benchmark;
5158

5259
/**
@@ -61,7 +68,7 @@ function createBenchmark( len ) {
6168

6269
b.tic();
6370
for ( i = 0; i < b.iterations; i++ ) {
64-
out = slastIndexOfFalsy( [ x ] );
71+
out = slastIndexOfFalsy( [ x, fromIndex ] );
6572
if ( out !== out ) {
6673
b.fail( 'should return an integer' );
6774
}

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/docs/repl.txt‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
Returns the index of the last falsy element in a one-dimensional single-
44
precision floating-point ndarray.
55

6+
If a specified starting search index is negative, the function resolves the
7+
starting search index by counting backward from the last element (where `-1`
8+
refers to the last element).
9+
610
If unable to find a falsy element, the function returns `-1`.
711

812
Parameters
@@ -11,6 +15,8 @@
1115
Array-like object containing the following ndarrays:
1216

1317
- a one-dimensional input ndarray.
18+
- a zero-dimensional ndarray containing the index from which to begin
19+
searching.
1420

1521
Returns
1622
-------
@@ -20,7 +26,8 @@
2026
Examples
2127
--------
2228
> var x = new {{alias:@stdlib/ndarray/vector/float32}}( [ 1.0, 0.0, 0.0 ] );
23-
> {{alias}}( [ x ] )
29+
> var i = {{alias:@stdlib/ndarray/from-scalar}}( 2, { 'dtype': 'generic' } );
30+
> {{alias}}( [ x, i ] )
2431
2
2532

2633
See Also

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/docs/types/index.d.ts‎

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

2121
/// <reference types="@stdlib/types"/>
2222

23-
import { float32ndarray } from '@stdlib/types/ndarray';
23+
import { float32ndarray, typedndarray } from '@stdlib/types/ndarray';
2424

2525
/**
2626
* Returns the index of the last falsy element in a one-dimensional single-precision floating-point ndarray.
@@ -30,19 +30,25 @@ import { float32ndarray } from '@stdlib/types/ndarray';
3030
* - The function expects the following ndarrays:
3131
*
3232
* - a one-dimensional input ndarray.
33+
* - a zero-dimensional ndarray containing the index from which to begin searching.
3334
*
3435
* @param arrays - array-like object containing ndarrays
3536
* @returns index
3637
*
3738
* @example
3839
* var Float32Vector = require( '@stdlib/ndarray/vector/float32' );
40+
* var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
3941
*
4042
* var x = new Float32Vector( [ 1.0, 0.0, 3.0, 0.0 ] );
4143
*
42-
* var v = slastIndexOfFalsy( [ x ] );
44+
* var fromIndex = scalar2ndarray( 3, {
45+
* 'dtype': 'generic'
46+
* });
47+
*
48+
* var v = slastIndexOfFalsy( [ x, fromIndex ] );
4349
* // returns 3
4450
*/
45-
declare function slastIndexOfFalsy( arrays: [ float32ndarray ] ): number;
51+
declare function slastIndexOfFalsy( arrays: [ float32ndarray, typedndarray<number> ] ): number;
4652

4753

4854
// EXPORTS //

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/docs/types/test.ts‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
/* eslint-disable space-in-parens */
2020

2121
import zeros = require( '@stdlib/ndarray/zeros' );
22+
import scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
2223
import slastIndexOfFalsy = require( './index' );
2324

2425

@@ -29,8 +30,11 @@ import slastIndexOfFalsy = require( './index' );
2930
const x = zeros( [ 10 ], {
3031
'dtype': 'float32'
3132
});
33+
const fromIndex = scalar2ndarray( 0, {
34+
'dtype': 'generic'
35+
});
3236

33-
slastIndexOfFalsy( [ x ] ); // $ExpectType number
37+
slastIndexOfFalsy( [ x, fromIndex ] ); // $ExpectType number
3438
}
3539

3640
// The compiler throws an error if the function is provided a first argument which is not an array of ndarrays...
@@ -51,7 +55,10 @@ import slastIndexOfFalsy = require( './index' );
5155
const x = zeros( [ 10 ], {
5256
'dtype': 'float32'
5357
});
58+
const fromIndex = scalar2ndarray( 0, {
59+
'dtype': 'generic'
60+
});
5461

5562
slastIndexOfFalsy(); // $ExpectError
56-
slastIndexOfFalsy( [ x ], {} ); // $ExpectError
63+
slastIndexOfFalsy( [ x, fromIndex ], {} ); // $ExpectError
5764
}

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/examples/index.js‎

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

2121
var bernoulli = require( '@stdlib/random/bernoulli' );
22+
var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
2223
var ndarray2array = require( '@stdlib/ndarray/to-array' );
2324
var slastIndexOfFalsy = require( './../lib' );
2425

@@ -29,5 +30,9 @@ var opts = {
2930
var x = bernoulli( [ 10 ], 0.7, opts );
3031
console.log( ndarray2array( x ) );
3132

32-
var idx = slastIndexOfFalsy( [ x ] );
33+
var fromIndex = scalar2ndarray( 9, {
34+
'dtype': 'generic'
35+
});
36+
37+
var idx = slastIndexOfFalsy( [ x, fromIndex ] );
3338
console.log( idx );

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/lib/index.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,16 @@
2525
*
2626
* @example
2727
* var Float32Vector = require( '@stdlib/ndarray/vector/float32' );
28+
* var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
2829
* var slastIndexOfFalsy = require( '@stdlib/blas/ext/base/ndarray/slast-index-of-falsy' );
2930
*
3031
* var x = new Float32Vector( [ 1.0, 0.0, 3.0, 0.0 ] );
3132
*
32-
* var v = slastIndexOfFalsy( [ x ] );
33+
* var fromIndex = scalar2ndarray( 3, {
34+
* 'dtype': 'generic'
35+
* });
36+
*
37+
* var v = slastIndexOfFalsy( [ x, fromIndex ] );
3338
* // returns 3
3439
*/
3540

‎lib/node_modules/@stdlib/blas/ext/base/ndarray/slast-index-of-falsy/lib/main.js‎

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

2121
// MODULES //
2222

23+
var ndarraylike2scalar = require( '@stdlib/ndarray/base/ndarraylike2scalar' );
2324
var numelDimension = require( '@stdlib/ndarray/base/numel-dimension' );
25+
var clipUpperIndex = require( '@stdlib/ndarray/base/clip-upper-index' );
2426
var getStride = require( '@stdlib/ndarray/base/stride' );
2527
var getOffset = require( '@stdlib/ndarray/base/offset' );
2628
var getData = require( '@stdlib/ndarray/base/data-buffer' );
@@ -37,21 +39,38 @@ var strided = require( '@stdlib/blas/ext/base/slast-index-of-falsy' ).ndarray;
3739
* - The function expects the following ndarrays:
3840
*
3941
* - a one-dimensional input ndarray.
42+
* - a zero-dimensional ndarray containing the index from which to begin searching.
4043
*
4144
* @param {ArrayLikeObject<Object>} arrays - array-like object containing ndarrays
4245
* @returns {integer} index
4346
*
4447
* @example
4548
* var Float32Vector = require( '@stdlib/ndarray/vector/float32' );
49+
* var scalar2ndarray = require( '@stdlib/ndarray/from-scalar' );
4650
*
4751
* var x = new Float32Vector( [ 1.0, 0.0, 3.0, 0.0 ] );
4852
*
49-
* var v = slastIndexOfFalsy( [ x ] );
53+
* var fromIndex = scalar2ndarray( 3, {
54+
* 'dtype': 'generic'
55+
* });
56+
*
57+
* var v = slastIndexOfFalsy( [ x, fromIndex ] );
5058
* // returns 3
5159
*/
5260
function slastIndexOfFalsy( arrays ) {
53-
var x = arrays[ 0 ];
54-
return strided( numelDimension( x, 0 ), getData( x ), getStride( x, 0 ), getOffset( x ) );
61+
var fromIndex;
62+
var N;
63+
var x;
64+
65+
x = arrays[ 0 ];
66+
fromIndex = ndarraylike2scalar( arrays[ 1 ] );
67+
68+
N = numelDimension( x, 0 );
69+
fromIndex = clipUpperIndex( fromIndex, ( fromIndex < 0 ) ? N : N-1 );
70+
if ( fromIndex < 0 ) {
71+
return -1;
72+
}
73+
return strided( fromIndex+1, getData( x ), getStride( x, 0 ), getOffset( x ) );
5574
}
5675

5776

0 commit comments

Comments
 (0)