Skip to content

feat: add boolean dtype support to array/base/cuany #2446

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions lib/node_modules/@stdlib/array/base/cuany/lib/assign.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@

var isComplex128Array = require( '@stdlib/array/base/assert/is-complex128array' );
var isComplex64Array = require( '@stdlib/array/base/assert/is-complex64array' );
var isBooleanArray = require( '@stdlib/array/base/assert/is-booleanarray' );
var arraylike2object = require( '@stdlib/array/base/arraylike2object' );
var reinterpret128 = require( '@stdlib/strided/base/reinterpret-complex128' );
var reinterpret64 = require( '@stdlib/strided/base/reinterpret-complex64' );
var reinterpretBoolean = require( '@stdlib/strided/base/reinterpret-boolean' );


// FUNCTIONS //
Expand Down Expand Up @@ -181,6 +183,63 @@ function complex( x, y, stride, offset ) {
return ydata;
}

/**
* Cumulatively tests whether at least one element in a provided boolean array is truthy.
*
* @private
* @param {Collection} x - input array
* @param {Object} y - output array object
* @param {integer} stride - output array stride
* @param {NonNegativeInteger} offset - output array offset
* @returns {Collection} output array
*
* @example
* var Uint8Array = require( '@stdlib/array/uint8' );
* var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
* var arraylike2object = require( '@stdlib/array/base/arraylike2object' );
*
* var x = new Uint8Array( [ 0, 0, 1, 1, 0 ] );
* var y = toAccessorArray( [ false, null, false, null, false, null, false, null, false, null ] );
*
* var arr = boolean( x, arraylike2object( y ), 2, 0 );
*
* var v = y.get( 0 );
* // returns false
*
* v = y.get( 2 );
* // returns false
*
* v = y.get( 4 );
* // returns true
*
* v = y.get( 6 );
* // returns true
*
* v = y.get( 8 );
* // returns true
*/
function boolean( x, y, stride, offset ) {
var ydata;
var yset;
var flg;
var io;
var i;

yset = y.accessors[ 1 ];
ydata = y.data;

flg = false;
io = offset;
for ( i = 0; i < x.length; i++ ) {
if ( flg === false && x[ i ] ) {
flg = true;
}
yset( ydata, io, flg );
io += stride;
}
return ydata;
}


// MAIN //

Expand Down Expand Up @@ -215,6 +274,8 @@ function assign( x, y, stride, offset ) {
complex( reinterpret128( x, 0 ), yo, stride, offset );
} else if ( isComplex64Array( x ) ) {
complex( reinterpret64( x, 0 ), yo, stride, offset );
} else if ( isBooleanArray( x ) ) {
boolean( reinterpretBoolean( x, 0 ), yo, stride, offset );
} else {
accessors( xo, yo, stride, offset );
}
Expand Down
55 changes: 55 additions & 0 deletions lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
var tape = require( 'tape' );
var Complex128Array = require( '@stdlib/array/complex128' );
var Complex64Array = require( '@stdlib/array/complex64' );
var BooleanArray = require( '@stdlib/array/bool' );
var Float64Array = require( '@stdlib/array/float64' );
var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
var cuany = require( './../lib/assign.js' );
Expand Down Expand Up @@ -144,13 +145,67 @@
t.end();
});

tape( 'the function cumulatively tests whether at least one element is truthy (boolean)', function test( t ) {
var expected;
var actual;
var x;
var y;

x = new BooleanArray( [ true, true, true, true, true ] );
y = [ false, true, false, true, false ];

actual = cuany( x, y, 1, 0 );
expected = [ true, true, true, true, true ];

t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ false, false, true, false, false ] );
y = [ false, null, false, null, false, null, false, null, false, null ];

actual = cuany( x, y, 2, 0 );
expected = [ false, null, false, null, true, null, true, null, true, null ];

t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ false, false, true, false, false ] );
y = [ false, false, false, true, true, true ];

actual = cuany( x, y, 1, 1 );
expected = [ false, false, false, true, true, true ];

t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [] );
y = [ false, false, false, false, false ];

actual = cuany( x, y, 1, 0 );
expected = [ false, false, false, false, false ];

t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ true ] );
y = [ false, false ];

actual = cuany( x, y, 1, 1 );
expected = [ false, true ];

t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

t.end();
});

tape( 'the function cumulatively tests whether at least one element is truthy (complex128)', function test( t ) {
var expected;
var actual;
var x;
var y;

x = new Complex128Array( [ 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0 ] );

Check warning on line 208 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
y = [ false, true, false, true, false ];

actual = cuany( x, y, 1, 0 );
Expand All @@ -159,7 +214,7 @@
t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 217 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
y = [ false, null, false, null, false, null, false, null, false, null ];

actual = cuany( x, y, 2, 0 );
Expand All @@ -168,7 +223,7 @@
t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 226 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
y = [ false, false, false, true, true, true ];

actual = cuany( x, y, 1, 1 );
Expand Down Expand Up @@ -204,7 +259,7 @@
var x;
var y;

x = new Complex64Array( [ 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0 ] );

Check warning on line 262 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 83. Maximum allowed is 80
y = [ false, true, false, true, false ];

actual = cuany( x, y, 1, 0 );
Expand All @@ -213,7 +268,7 @@
t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex64Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 271 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 83. Maximum allowed is 80
y = [ false, null, false, null, false, null, false, null, false, null ];

actual = cuany( x, y, 2, 0 );
Expand All @@ -222,7 +277,7 @@
t.strictEqual( actual, y, 'returns expected value' );
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex64Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 280 in lib/node_modules/@stdlib/array/base/cuany/test/test.assign.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 83. Maximum allowed is 80
y = [ false, false, false, true, true, true ];

actual = cuany( x, y, 1, 1 );
Expand Down
34 changes: 34 additions & 0 deletions lib/node_modules/@stdlib/array/base/cuany/test/test.main.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
var tape = require( 'tape' );
var Complex128Array = require( '@stdlib/array/complex128' );
var Complex64Array = require( '@stdlib/array/complex64' );
var BooleanArray = require( '@stdlib/array/bool' );
var Float64Array = require( '@stdlib/array/float64' );
var toAccessorArray = require( '@stdlib/array/base/to-accessor-array' );
var cuany = require( './../lib' );
Expand Down Expand Up @@ -102,22 +103,55 @@
t.end();
});

tape( 'the function cumulatively tests whether at least one element is truthy (boolean)', function test( t ) {
var expected;
var actual;
var x;

x = new BooleanArray( [ false, false, true, false, false ] );
actual = cuany( x );
expected = [ false, false, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ false, false, false, false, false ] );
actual = cuany( x );
expected = [ false, false, false, false, false ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ true, true, true, true, true ] );
actual = cuany( x );
expected = [ true, true, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ false, true, true ] );
actual = cuany( x );
expected = [ false, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new BooleanArray( [ true, false, true, false, false ] );
actual = cuany( x );
expected = [ true, true, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

t.end();
});

tape( 'the function cumulatively tests whether at least one element is truthy (complex128)', function test( t ) {
var expected;
var actual;
var x;

x = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 144 in lib/node_modules/@stdlib/array/base/cuany/test/test.main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
actual = cuany( x );
expected = [ false, false, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex128Array( [ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 149 in lib/node_modules/@stdlib/array/base/cuany/test/test.main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
actual = cuany( x );
expected = [ false, false, false, false, false ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex128Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] );

Check warning on line 154 in lib/node_modules/@stdlib/array/base/cuany/test/test.main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
actual = cuany( x );
expected = [ true, true, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );
Expand All @@ -127,7 +161,7 @@
expected = [ false, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );

x = new Complex128Array( [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0 ] );

Check warning on line 164 in lib/node_modules/@stdlib/array/base/cuany/test/test.main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

This line has a length of 84. Maximum allowed is 80
actual = cuany( x );
expected = [ true, true, true, true, true ];
t.deepEqual( actual, expected, 'returns expected value' );
Expand Down
Loading