From a0195085108d28747fb1ff6ba2b39113a87f422d Mon Sep 17 00:00:00 2001 From: gururaj1512 Date: Mon, 2 Jun 2025 09:20:47 +0000 Subject: [PATCH 01/10] feat: add C ndarray interface and refactor implementation for `stats/base/dnanmskrange` --- type: pre_commit_static_analysis_report description: Results of running static analysis checks when committing changes. report: - task: lint_filenames status: passed - task: lint_editorconfig status: passed - task: lint_markdown status: na - task: lint_package_json status: na - task: lint_repl_help status: passed - task: lint_javascript_src status: passed - task: lint_javascript_cli status: na - task: lint_javascript_examples status: passed - task: lint_javascript_tests status: passed - task: lint_javascript_benchmarks status: passed - task: lint_python status: na - task: lint_r status: na - task: lint_c_src status: missing_dependencies - task: lint_c_examples status: missing_dependencies - task: lint_c_benchmarks status: na - task: lint_c_tests_fixtures status: na - task: lint_shell status: na - task: lint_typescript_declarations status: na - task: lint_typescript_tests status: na - task: lint_license_headers status: passed --- --- .../base/dnanmskrange/benchmark/benchmark.js | 40 +++++++++----- .../benchmark/benchmark.native.js | 36 +++++++----- .../benchmark/benchmark.ndarray.js | 40 +++++++++----- .../benchmark/benchmark.ndarray.native.js | 36 +++++++----- .../stats/base/dnanmskrange/docs/repl.txt | 24 ++++---- .../base/dnanmskrange/examples/c/example.c | 10 ++-- .../stats/base/dnanmskrange/examples/index.js | 31 +++++------ .../include/stdlib/stats/base/dnanmskrange.h | 9 ++- .../base/dnanmskrange/lib/dnanmskrange.js | 55 +------------------ .../stats/base/dnanmskrange/lib/index.js | 4 +- .../stats/base/dnanmskrange/lib/ndarray.js | 4 +- .../base/dnanmskrange/lib/ndarray.native.js | 20 +------ .../stats/base/dnanmskrange/manifest.json | 49 ++++++++++++----- .../stats/base/dnanmskrange/src/addon.c | 25 ++++++++- .../src/{dnanmskrange.c => main.c} | 41 +++++++++----- .../dnanmskrange/test/test.dnanmskrange.js | 13 +---- .../test/test.dnanmskrange.native.js | 13 +---- .../base/dnanmskrange/test/test.ndarray.js | 13 +---- .../dnanmskrange/test/test.ndarray.native.js | 15 ++--- 19 files changed, 238 insertions(+), 240 deletions(-) rename lib/node_modules/@stdlib/stats/base/dnanmskrange/src/{dnanmskrange.c => main.c} (56%) diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.js index 38fb6482cf01..e4d1dab89c64 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.js @@ -21,17 +21,38 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); var pkg = require( './../package.json' ).name; var dnanmskrange = require( './../lib/dnanmskrange.js' ); +// VARIABLES // + +var options = { + 'dtype': 'uint8' +}; + + // FUNCTIONS // +/** +* Returns a random value or `NaN`. +* +* @private +* @returns {number} random number or `NaN` +*/ +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -10.0, 10.0 ); +} + /** * Creates a benchmark function. * @@ -42,18 +63,9 @@ var dnanmskrange = require( './../lib/dnanmskrange.js' ); function createBenchmark( len ) { var mask; var x; - var i; - x = new Float64Array( len ); - mask = new Uint8Array( len ); - for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - x[ i ] = ( randu()*20.0 ) - 10.0; - } + x = filledarrayBy( len, 'float64', rand ); + mask = uint8Array( len, 0.2, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.native.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.native.js index f1b587fdea3b..790da108313d 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.native.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.native.js @@ -22,11 +22,12 @@ var resolve = require( 'path' ).resolve; var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); var tryRequire = require( '@stdlib/utils/try-require' ); var pkg = require( './../package.json' ).name; @@ -37,10 +38,26 @@ var dnanmskrange = tryRequire( resolve( __dirname, './../lib/dnanmskrange.native var opts = { 'skip': ( dnanmskrange instanceof Error ) }; +var options = { + 'dtype': 'uint8' +}; // FUNCTIONS // +/** +* Returns a random value or `NaN`. +* +* @private +* @returns {number} random number or `NaN` +*/ +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -10.0, 10.0 ); +} + /** * Creates a benchmark function. * @@ -51,18 +68,9 @@ var opts = { function createBenchmark( len ) { var mask; var x; - var i; - x = new Float64Array( len ); - mask = new Uint8Array( len ); - for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - x[ i ] = ( randu()*20.0 ) - 10.0; - } + x = filledarrayBy( len, 'float64', rand ); + mask = uint8Array( len, 0.2, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.js index 5a64d787db49..704a2a2b338a 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.js @@ -21,17 +21,38 @@ // MODULES // var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); var pkg = require( './../package.json' ).name; var dnanmskrange = require( './../lib/ndarray.js' ); +// VARIABLES // + +var options = { + 'dtype': 'uint8' +}; + + // FUNCTIONS // +/** +* Returns a random value or `NaN`. +* +* @private +* @returns {number} random number or `NaN` +*/ +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -10.0, 10.0 ); +} + /** * Creates a benchmark function. * @@ -42,18 +63,9 @@ var dnanmskrange = require( './../lib/ndarray.js' ); function createBenchmark( len ) { var mask; var x; - var i; - x = new Float64Array( len ); - mask = new Uint8Array( len ); - for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - x[ i ] = ( randu()*20.0 ) - 10.0; - } + x = filledarrayBy( len, 'float64', rand ); + mask = uint8Array( len, 0.2, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.native.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.native.js index f8b7d638f224..90d86704b73a 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.native.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/benchmark/benchmark.ndarray.native.js @@ -22,11 +22,12 @@ var resolve = require( 'path' ).resolve; var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random/base/randu' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var pow = require( '@stdlib/math/base/special/pow' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); var tryRequire = require( '@stdlib/utils/try-require' ); var pkg = require( './../package.json' ).name; @@ -37,10 +38,26 @@ var dnanmskrange = tryRequire( resolve( __dirname, './../lib/ndarray.native.js' var opts = { 'skip': ( dnanmskrange instanceof Error ) }; +var options = { + 'dtype': 'uint8' +}; // FUNCTIONS // +/** +* Returns a random value or `NaN`. +* +* @private +* @returns {number} random number or `NaN` +*/ +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; + } + return uniform( -10.0, 10.0 ); +} + /** * Creates a benchmark function. * @@ -51,18 +68,9 @@ var opts = { function createBenchmark( len ) { var mask; var x; - var i; - x = new Float64Array( len ); - mask = new Uint8Array( len ); - for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - x[ i ] = ( randu()*20.0 ) - 10.0; - } + x = filledarrayBy( len, 'float64', rand ); + mask = uint8Array( len, 0.2, options ); return benchmark; function benchmark( b ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/docs/repl.txt b/lib/node_modules/@stdlib/stats/base/dnanmskrange/docs/repl.txt index 54bbea316bda..d0eb779b9f98 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/docs/repl.txt +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/docs/repl.txt @@ -3,8 +3,8 @@ Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values. - The `N` and `stride` parameters determine which elements are accessed at - runtime. + The `N` and stride parameters determine which elements in the strided array + are accessed at runtime. Indexing is relative to the first index. To introduce offsets, use a typed array views. @@ -26,13 +26,13 @@ Input array. strideX: integer - Index increment for `x`. + Stride length for `x`. mask: Uint8Array Mask array. strideMask: integer - Index increment for `mask`. + Stride length for `mask`. Returns ------- @@ -47,11 +47,10 @@ > {{alias}}( x.length, x, 1, mask, 1 ) 4.0 - // Using `N` and `stride` parameters: + // Using `N` and stride parameters: > x = new {{alias:@stdlib/array/float64}}( [ -2.0, 1.0, 1.0, -5.0, 2.0, -1.0, 4.0 ] ); > mask = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] ); - > var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 ); - > {{alias}}( N, x, 2, mask, 2 ) + > {{alias}}( 3, x, 2, mask, 2 ) 4.0 // Using view offsets: @@ -59,10 +58,10 @@ > var x1 = new {{alias:@stdlib/array/float64}}( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); > var mask0 = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] ); > var mask1 = new {{alias:@stdlib/array/uint8}}( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); - > N = {{alias:@stdlib/math/base/special/floor}}( x0.length / 2 ); - > {{alias}}( N, x1, 2, mask1, 2 ) + > {{alias}}( 3, x1, 2, mask1, 2 ) 4.0 + {{alias}}.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask ) Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values and using alternative indexing @@ -81,7 +80,7 @@ Input array. strideX: integer - Index increment for `x`. + Stride length for `x`. offsetX: integer Starting index for `x`. @@ -90,7 +89,7 @@ Mask array. strideMask: integer - Index increment for `mask`. + Stride length for `mask`. offsetMask: integer Starting index for `mask`. @@ -111,8 +110,7 @@ // Using offset parameter: > x = new {{alias:@stdlib/array/float64}}( [ 1.0, -2.0, 3.0, 2.0, 5.0, -1.0, 4.0 ] ); > mask = new {{alias:@stdlib/array/uint8}}( [ 0, 0, 0, 0, 0, 0, 1 ] ); - > var N = {{alias:@stdlib/math/base/special/floor}}( x.length / 2 ); - > {{alias}}.ndarray( N, x, 2, 1, mask, 2, 1 ) + > {{alias}}.ndarray( 3, x, 2, 1, mask, 2, 1 ) 4.0 See Also diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/c/example.c b/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/c/example.c index 1f0f7ec85f17..177d418b119e 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/c/example.c +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/c/example.c @@ -22,17 +22,17 @@ int main( void ) { // Create a strided array: - double x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 }; + const double x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 0.0/0.0, 0.0/0.0 }; // Create a mask array: - uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; + const uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; // Specify the number of elements: - int64_t N = 5; + const int N = 5; // Specify the stride lengths: - int64_t strideX = 2; - int64_t strideMask = 2; + const int strideX = 2; + const int strideMask = 2; // Compute the range: double v = stdlib_strided_dnanmskrange( N, x, strideX, mask, strideMask ); diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/index.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/index.js index 59d016650ec0..a5b100256822 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/index.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/examples/index.js @@ -18,31 +18,28 @@ 'use strict'; -var randu = require( '@stdlib/random/base/randu' ); -var round = require( '@stdlib/math/base/special/round' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); var dnanmskrange = require( './../lib' ); var mask; var x; -var i; -x = new Float64Array( 10 ); -mask = new Uint8Array( x.length ); -for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - if ( randu() < 0.1 ) { - x[ i ] = NaN; - } else { - x[ i ] = round( (randu()*100.0) - 50.0 ); +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; } + return uniform( -50.0, 50.0 ); } + +x = filledarrayBy( 10, 'float64', rand ); console.log( x ); + +mask = uint8Array( x.length, 0.2, { + 'dtype': 'uint8' +}); console.log( mask ); var v = dnanmskrange( x.length, x, 1, mask, 1 ); diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/include/stdlib/stats/base/dnanmskrange.h b/lib/node_modules/@stdlib/stats/base/dnanmskrange/include/stdlib/stats/base/dnanmskrange.h index 40588d46c0e8..ed62045e721c 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/include/stdlib/stats/base/dnanmskrange.h +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/include/stdlib/stats/base/dnanmskrange.h @@ -19,7 +19,7 @@ #ifndef STDLIB_STATS_BASE_DNANMSKRANGE_H #define STDLIB_STATS_BASE_DNANMSKRANGE_H -#include +#include "stdlib/blas/base/shared.h" /* * If C++, prevent name mangling so that the compiler emits a binary file having undecorated names, thus mirroring the behavior of a C compiler. @@ -31,7 +31,12 @@ extern "C" { /** * Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values. */ -double stdlib_strided_dnanmskrange( const int64_t N, const double *X, const int64_t strideX, const uint8_t *Mask, const int64_t strideMask ); +double API_SUFFIX(stdlib_strided_dnanmskrange)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask ); + +/** +* Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values and using alternative indexing semantics. +*/ +double API_SUFFIX(stdlib_strided_dnanmskrange_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask ); #ifdef __cplusplus } diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/dnanmskrange.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/dnanmskrange.js index 54c22ff8ba2e..61ebe8ef876d 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/dnanmskrange.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/dnanmskrange.js @@ -20,7 +20,8 @@ // MODULES // -var isnan = require( '@stdlib/math/base/assert/is-nan' ); +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var ndarray = require( './ndarray.js' ); // MAIN // @@ -46,57 +47,7 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' ); * // returns 4.0 */ function dnanmskrange( N, x, strideX, mask, strideMask ) { - var max; - var min; - var ix; - var im; - var v; - var i; - - if ( N <= 0 ) { - return NaN; - } - if ( strideX < 0 ) { - ix = (1-N) * strideX; - } else { - ix = 0; - } - if ( strideMask < 0 ) { - im = (1-N) * strideMask; - } else { - im = 0; - } - for ( i = 0; i < N; i++ ) { - v = x[ ix ]; - if ( v === v && mask[ im ] === 0 ) { - break; - } - ix += strideX; - im += strideMask; - } - if ( i === N ) { - return NaN; - } - min = v; - max = min; - i += 1; - for ( i; i < N; i++ ) { - ix += strideX; - im += strideMask; - if ( mask[ im ] ) { - continue; - } - v = x[ ix ]; - if ( isnan( v ) ) { - continue; - } - if ( v < min ) { - min = v; - } else if ( v > max ) { - max = v; - } - } - return max - min; + return ndarray(N, x, strideX, stride2offset( N, strideX ), mask, strideMask, stride2offset( N, strideMask ) ); // eslint-disable-line max-len } diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/index.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/index.js index 10ad409cd605..2feade09358a 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/index.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/index.js @@ -37,14 +37,12 @@ * @example * var Float64Array = require( '@stdlib/array/float64' ); * var Uint8Array = require( '@stdlib/array/uint8' ); -* var floor = require( '@stdlib/math/base/special/floor' ); * var dnanmskrange = require( '@stdlib/stats/base/dnanmskrange' ); * * var x = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] ); -* var N = floor( x.length / 2 ); * -* var v = dnanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 ); +* var v = dnanmskrange.ndarray( 5, x, 2, 1, mask, 2, 1 ); * // returns 6.0 */ diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.js index aff6c9a3b850..6fc6eb205694 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.js @@ -40,13 +40,11 @@ var isnan = require( '@stdlib/math/base/assert/is-nan' ); * @example * var Float64Array = require( '@stdlib/array/float64' ); * var Uint8Array = require( '@stdlib/array/uint8' ); -* var floor = require( '@stdlib/math/base/special/floor' ); * * var x = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] ); -* var N = floor( x.length / 2 ); * -* var v = dnanmskrange( N, x, 2, 1, mask, 2, 1 ); +* var v = dnanmskrange( 5, x, 2, 1, mask, 2, 1 ); * // returns 6.0 */ function dnanmskrange( N, x, strideX, offsetX, mask, strideMask, offsetMask ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.native.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.native.js index 602a70cfadf3..4246fdcfd268 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.native.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/lib/ndarray.native.js @@ -20,9 +20,7 @@ // MODULES // -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); -var addon = require( './dnanmskrange.native.js' ); +var addon = require( './../src/addon.node' ); // MAIN // @@ -42,27 +40,15 @@ var addon = require( './dnanmskrange.native.js' ); * @example * var Float64Array = require( '@stdlib/array/float64' ); * var Uint8Array = require( '@stdlib/array/uint8' ); -* var floor = require( '@stdlib/math/base/special/floor' ); * * var x = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, 5.0, 6.0 ] ); * var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ] ); -* var N = floor( x.length / 2 ); * -* var v = dnanmskrange( N, x, 2, 1, mask, 2, 1 ); +* var v = dnanmskrange( 5, x, 2, 1, mask, 2, 1 ); * // returns 6.0 */ function dnanmskrange( N, x, strideX, offsetX, mask, strideMask, offsetMask ) { - var viewX; - var viewM; - if ( strideX < 0 ) { - offsetX += (N-1) * strideX; - } - if ( strideMask < 0 ) { - offsetMask += (N-1) * strideMask; - } - viewX = new Float64Array( x.buffer, x.byteOffset+(x.BYTES_PER_ELEMENT*offsetX), x.length-offsetX ); // eslint-disable-line max-len - viewM = new Uint8Array( mask.buffer, mask.byteOffset+(mask.BYTES_PER_ELEMENT*offsetMask), mask.length-offsetMask ); // eslint-disable-line max-len - return addon( N, viewX, strideX, viewM, strideMask ); + return addon.ndarray( N, x, strideX, offsetX, mask, strideMask, offsetMask ); // eslint-disable-line max-len } diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/manifest.json b/lib/node_modules/@stdlib/stats/base/dnanmskrange/manifest.json index d70d379255bb..dfd78650b94b 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/manifest.json +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/manifest.json @@ -1,6 +1,7 @@ { "options": { - "task": "build" + "task": "build", + "wasm": false }, "fields": [ { @@ -27,18 +28,19 @@ "confs": [ { "task": "build", + "wasm": false, "src": [ - "./src/dnanmskrange.c" + "./src/main.c" ], "include": [ "./include" ], - "libraries": [ - "-lm" - ], + "libraries": [], "libpath": [], "dependencies": [ + "@stdlib/blas/base/shared", "@stdlib/math/base/assert/is-nan", + "@stdlib/strided/base/stride2offset", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -49,34 +51,53 @@ }, { "task": "benchmark", + "wasm": false, "src": [ - "./src/dnanmskrange.c" + "./src/main.c" ], "include": [ "./include" ], - "libraries": [ - "-lm" - ], + "libraries": [], "libpath": [], "dependencies": [ - "@stdlib/math/base/assert/is-nan" + "@stdlib/blas/base/shared", + "@stdlib/math/base/assert/is-nan", + "@stdlib/strided/base/stride2offset" ] }, { "task": "examples", + "wasm": false, "src": [ - "./src/dnanmskrange.c" + "./src/main.c" ], "include": [ "./include" ], - "libraries": [ - "-lm" + "libraries": [], + "libpath": [], + "dependencies": [ + "@stdlib/blas/base/shared", + "@stdlib/math/base/assert/is-nan", + "@stdlib/strided/base/stride2offset" + ] + }, + { + "task": "", + "wasm": true, + "src": [ + "./src/main.c" + ], + "include": [ + "./include" ], + "libraries": [], "libpath": [], "dependencies": [ - "@stdlib/math/base/assert/is-nan" + "@stdlib/blas/base/shared", + "@stdlib/math/base/assert/is-nan", + "@stdlib/strided/base/stride2offset" ] } ] diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/addon.c b/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/addon.c index 56124e724c52..3a4f64c1e70f 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/addon.c +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/addon.c @@ -23,6 +23,7 @@ #include "stdlib/napi/argv_strided_float64array.h" #include "stdlib/napi/argv_strided_uint8array.h" #include "stdlib/napi/create_double.h" +#include "stdlib/blas/base/shared.h" #include /** @@ -39,8 +40,28 @@ static napi_value addon( napi_env env, napi_callback_info info ) { STDLIB_NAPI_ARGV_INT64( env, strideMask, argv, 4 ); STDLIB_NAPI_ARGV_STRIDED_FLOAT64ARRAY( env, X, N, strideX, argv, 1 ); STDLIB_NAPI_ARGV_STRIDED_UINT8ARRAY( env, Mask, N, strideMask, argv, 3 ); - STDLIB_NAPI_CREATE_DOUBLE( env, stdlib_strided_dnanmskrange( N, X, strideX, Mask, strideMask ), v ); + STDLIB_NAPI_CREATE_DOUBLE( env, API_SUFFIX(stdlib_strided_dnanmskrange)( N, X, strideX, Mask, strideMask ), v ); return v; } -STDLIB_NAPI_MODULE_EXPORT_FCN( addon ) +/** +* Receives JavaScript callback invocation data. +* +* @param env environment under which the function is invoked +* @param info callback data +* @return Node-API value +*/ +static napi_value addon_method( napi_env env, napi_callback_info info ) { + STDLIB_NAPI_ARGV( env, info, argv, argc, 7 ); + STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 ); + STDLIB_NAPI_ARGV_INT64( env, strideX, argv, 2 ); + STDLIB_NAPI_ARGV_INT64( env, offsetX, argv, 3 ); + STDLIB_NAPI_ARGV_INT64( env, strideMask, argv, 5 ); + STDLIB_NAPI_ARGV_INT64( env, offsetMask, argv, 6 ); + STDLIB_NAPI_ARGV_STRIDED_FLOAT64ARRAY( env, X, N, strideX, argv, 1 ); + STDLIB_NAPI_ARGV_STRIDED_UINT8ARRAY( env, Mask, N, strideMask, argv, 4 ); + STDLIB_NAPI_CREATE_DOUBLE( env, API_SUFFIX(stdlib_strided_dnanmskrange_ndarray)( N, X, strideX, offsetX, Mask, strideMask, offsetMask ), v ); + return v; +} + +STDLIB_NAPI_MODULE_EXPORT_FCN_WITH_METHOD( addon, "ndarray", addon_method ) diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/dnanmskrange.c b/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/main.c similarity index 56% rename from lib/node_modules/@stdlib/stats/base/dnanmskrange/src/dnanmskrange.c rename to lib/node_modules/@stdlib/stats/base/dnanmskrange/src/main.c index c05a239f7dd1..ab091a99be80 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/dnanmskrange.c +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/src/main.c @@ -18,7 +18,8 @@ #include "stdlib/stats/base/dnanmskrange.h" #include "stdlib/math/base/assert/is_nan.h" -#include +#include "stdlib/strided/base/stride2offset.h" +#include "stdlib/blas/base/shared.h" /** * Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values. @@ -30,27 +31,37 @@ * @param strideMask Mask stride length * @return output value */ -double stdlib_strided_dnanmskrange( const int64_t N, const double *X, const int64_t strideX, const uint8_t *Mask, const int64_t strideMask ) { +double API_SUFFIX(stdlib_strided_dnanmskrange)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask ) { + const CBLAS_INT ox = stdlib_strided_stride2offset( N, strideX ); + const CBLAS_INT om = stdlib_strided_stride2offset( N, strideMask ); + return API_SUFFIX(stdlib_strided_dnanmskrange_ndarray)( N, X, strideX, ox, Mask, strideMask, om ); +} + +/** +* Computes the range of a double-precision floating-point strided array according to a mask, ignoring `NaN` values and alternative indexing semantics. +* +* @param N number of indexed elements +* @param X input array +* @param strideX X stride length +* @param offsetX starting index for X +* @param Mask mask array +* @param strideMask Mask stride length +* @param offsetMask starting index for Mask +* @return output value +*/ +double API_SUFFIX(stdlib_strided_dnanmskrange_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask ) { + CBLAS_INT ix; + CBLAS_INT im; + CBLAS_INT i; double max; double min; - int64_t ix; - int64_t im; - int64_t i; double v; if ( N <= 0 ) { return 0.0 / 0.0; // NaN } - if ( strideX < 0 ) { - ix = (1-N) * strideX; - } else { - ix = 0; - } - if ( strideMask < 0 ) { - im = (1-N) * strideMask; - } else { - im = 0; - } + ix = offsetX; + im = offsetMask; for ( i = 0; i < N; i++ ) { v = X[ ix ]; if ( v == v && Mask[ im ] == 0 ) { diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.js index ac3d08c54d3b..030c808b8cf8 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.js @@ -21,7 +21,6 @@ // MODULES // var tape = require( 'tape' ); -var floor = require( '@stdlib/math/base/special/floor' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var Float64Array = require( '@stdlib/array/float64' ); @@ -133,7 +132,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', fun tape( 'the function supports `stride` parameters', function test( t ) { var mask; - var N; var x; var v; @@ -166,8 +164,7 @@ tape( 'the function supports `stride` parameters', function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, mask, 2 ); + v = dnanmskrange( 6, x, 2, mask, 2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -175,7 +172,6 @@ tape( 'the function supports `stride` parameters', function test( t ) { tape( 'the function supports negative `stride` parameters', function test( t ) { var mask; - var N; var x; var v; @@ -208,8 +204,7 @@ tape( 'the function supports negative `stride` parameters', function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, -2, mask, -2 ); + v = dnanmskrange( 6, x, -2, mask, -2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -220,7 +215,6 @@ tape( 'the function supports view offsets', function test( t ) { var mask1; var x0; var x1; - var N; var v; x0 = new Float64Array([ @@ -256,9 +250,8 @@ tape( 'the function supports view offsets', function test( t ) { x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element - N = floor( x1.length/2 ); - v = dnanmskrange( N, x1, 2, mask1, 2 ); + v = dnanmskrange( 6, x1, 2, mask1, 2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.native.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.native.js index 7496092bb968..3e6c22002d60 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.native.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.dnanmskrange.native.js @@ -22,7 +22,6 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); -var floor = require( '@stdlib/math/base/special/floor' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var Float64Array = require( '@stdlib/array/float64' ); @@ -142,7 +141,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', opt tape( 'the function supports `stride` parameters', opts, function test( t ) { var mask; - var N; var x; var v; @@ -175,8 +173,7 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, mask, 2 ); + v = dnanmskrange( 6, x, 2, mask, 2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -184,7 +181,6 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) { tape( 'the function supports negative `stride` parameters', opts, function test( t ) { var mask; - var N; var x; var v; @@ -217,8 +213,7 @@ tape( 'the function supports negative `stride` parameters', opts, function test( 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, -2, mask, -2 ); + v = dnanmskrange( 6, x, -2, mask, -2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -229,7 +224,6 @@ tape( 'the function supports view offsets', opts, function test( t ) { var mask1; var x0; var x1; - var N; var v; x0 = new Float64Array([ @@ -265,9 +259,8 @@ tape( 'the function supports view offsets', opts, function test( t ) { x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element - N = floor( x1.length/2 ); - v = dnanmskrange( N, x1, 2, mask1, 2 ); + v = dnanmskrange( 6, x1, 2, mask1, 2 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.js index 5d8b573aedcc..9ac4c5768323 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.js @@ -21,7 +21,6 @@ // MODULES // var tape = require( 'tape' ); -var floor = require( '@stdlib/math/base/special/floor' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var Float64Array = require( '@stdlib/array/float64' ); @@ -133,7 +132,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', fun tape( 'the function supports `stride` parameters', function test( t ) { var mask; - var N; var x; var v; @@ -166,8 +164,7 @@ tape( 'the function supports `stride` parameters', function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, 0, mask, 2, 0 ); + v = dnanmskrange( 6, x, 2, 0, mask, 2, 0 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -175,7 +172,6 @@ tape( 'the function supports `stride` parameters', function test( t ) { tape( 'the function supports negative `stride` parameters', function test( t ) { var mask; - var N; var x; var v; @@ -208,8 +204,7 @@ tape( 'the function supports negative `stride` parameters', function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, -2, 10, mask, -2, 10 ); + v = dnanmskrange( 6, x, -2, 10, mask, -2, 10 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -217,7 +212,6 @@ tape( 'the function supports negative `stride` parameters', function test( t ) { tape( 'the function supports `offset` parameters', function test( t ) { var mask; - var N; var x; var v; @@ -249,9 +243,8 @@ tape( 'the function supports `offset` parameters', function test( t ) { 0, 0 // 5 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, 1, mask, 2, 1 ); + v = dnanmskrange( 6, x, 2, 1, mask, 2, 1 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.native.js b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.native.js index 3514278794f7..3f31b0c55807 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.native.js +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/test/test.ndarray.native.js @@ -22,7 +22,6 @@ var resolve = require( 'path' ).resolve; var tape = require( 'tape' ); -var floor = require( '@stdlib/math/base/special/floor' ); var isnan = require( '@stdlib/math/base/assert/is-nan' ); var isPositiveZero = require( '@stdlib/math/base/assert/is-positive-zero' ); var Float64Array = require( '@stdlib/array/float64' ); @@ -120,7 +119,7 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu v = dnanmskrange( 0, x, 1, 0, mask, 1, 0 ); t.strictEqual( isnan( v ), true, 'returns expected value' ); - v = dnanmskrange( -1, x, 1, 0, mask, 1 ); + v = dnanmskrange( -1, x, 1, 0, mask, 1, 0 ); t.strictEqual( isnan( v ), true, 'returns expected value' ); t.end(); @@ -142,7 +141,6 @@ tape( 'if provided an `N` parameter equal to `1`, the function returns `0`', opt tape( 'the function supports `stride` parameters', opts, function test( t ) { var mask; - var N; var x; var v; @@ -175,8 +173,7 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) { 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, 0, mask, 2, 0 ); + v = dnanmskrange( 6, x, 2, 0, mask, 2, 0 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -184,7 +181,6 @@ tape( 'the function supports `stride` parameters', opts, function test( t ) { tape( 'the function supports negative `stride` parameters', opts, function test( t ) { var mask; - var N; var x; var v; @@ -217,8 +213,7 @@ tape( 'the function supports negative `stride` parameters', opts, function test( 0 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, -2, 10, mask, -2, 10 ); + v = dnanmskrange( 6, x, -2, 10, mask, -2, 10 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); @@ -226,7 +221,6 @@ tape( 'the function supports negative `stride` parameters', opts, function test( tape( 'the function supports `offset` parameters', opts, function test( t ) { var mask; - var N; var x; var v; @@ -258,9 +252,8 @@ tape( 'the function supports `offset` parameters', opts, function test( t ) { 0, 0 // 5 ]); - N = floor( x.length / 2 ); - v = dnanmskrange( N, x, 2, 1, mask, 2, 1 ); + v = dnanmskrange( 6, x, 2, 1, mask, 2, 1 ); t.strictEqual( v, 6.0, 'returns expected value' ); t.end(); From 5506e7f79d560d353c7e4cb9b0d55d3e14feed94 Mon Sep 17 00:00:00 2001 From: gururaj1512 Date: Mon, 2 Jun 2025 09:23:11 +0000 Subject: [PATCH 02/10] docs: update README --- .../@stdlib/stats/base/dnanmskrange/README.md | 191 +++++++++++++++--- 1 file changed, 159 insertions(+), 32 deletions(-) diff --git a/lib/node_modules/@stdlib/stats/base/dnanmskrange/README.md b/lib/node_modules/@stdlib/stats/base/dnanmskrange/README.md index f25aa31deac9..407ec48ca732 100644 --- a/lib/node_modules/@stdlib/stats/base/dnanmskrange/README.md +++ b/lib/node_modules/@stdlib/stats/base/dnanmskrange/README.md @@ -40,7 +40,7 @@ var dnanmskrange = require( '@stdlib/stats/base/dnanmskrange' ); #### dnanmskrange( N, x, strideX, mask, strideMask ) -Computes the [range][range] of a double-precision floating-point strided array `x` according to a `mask`, ignoring `NaN` values. +Computes the [range][range] of a double-precision floating-point strided array according to a `mask`, ignoring `NaN` values. ```javascript var Float64Array = require( '@stdlib/array/float64' ); @@ -57,22 +57,20 @@ The function has the following parameters: - **N**: number of indexed elements. - **x**: input [`Float64Array`][@stdlib/array/float64]. -- **strideX**: index increment for `x`. +- **strideX**: stride length for `x`. - **mask**: mask [`Uint8Array`][@stdlib/array/uint8]. If a `mask` array element is `0`, the corresponding element in `x` is considered valid and **included** in computation. If a `mask` array element is `1`, the corresponding element in `x` is considered invalid/missing and **excluded** from computation. - **strideMask**: index increment for `mask`. -The `N` and `stride` parameters determine which elements are accessed at runtime. For example, to compute the [range][range] of every other element in `x`, +The `N` and stride parameters determine which elements in the strided array are accessed at runtime. For example, to compute the [range][range] of every other element in `x`, ```javascript var Float64Array = require( '@stdlib/array/float64' ); var Uint8Array = require( '@stdlib/array/uint8' ); -var floor = require( '@stdlib/math/base/special/floor' ); var x = new Float64Array( [ 1.0, 2.0, -7.0, -2.0, 4.0, 3.0, 5.0, 6.0 ] ); var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] ); -var N = floor( x.length / 2 ); -var v = dnanmskrange( N, x, 2, mask, 2 ); +var v = dnanmskrange( 4, x, 2, mask, 2 ); // returns 11.0 ``` @@ -83,7 +81,6 @@ Note that indexing is relative to the first index. To introduce offsets, use [`t ```javascript var Float64Array = require( '@stdlib/array/float64' ); var Uint8Array = require( '@stdlib/array/uint8' ); -var floor = require( '@stdlib/math/base/special/floor' ); var x0 = new Float64Array( [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ] ); var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element @@ -91,9 +88,7 @@ var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd var mask0 = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] ); var mask1 = new Uint8Array( mask0.buffer, mask0.BYTES_PER_ELEMENT*1 ); // start at 2nd element -var N = floor( x0.length / 2 ); - -var v = dnanmskrange( N, x1, 2, mask1, 2 ); +var v = dnanmskrange( 4, x1, 2, mask1, 2 ); // returns 6.0 ``` @@ -117,18 +112,16 @@ The function has the following additional parameters: - **offsetX**: starting index for `x`. - **offsetMask**: starting index for `mask`. -While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offset` parameter supports indexing semantics based on a starting index. For example, to calculate the [range][range] for every other value in `x` starting from the second value +While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameter supports indexing semantics based on a starting index. For example, to calculate the [range][range] for every other element in `x` starting from the second element ```javascript var Float64Array = require( '@stdlib/array/float64' ); var Uint8Array = require( '@stdlib/array/uint8' ); -var floor = require( '@stdlib/math/base/special/floor' ); var x = new Float64Array( [ 2.0, 1.0, -2.0, -2.0, 3.0, 4.0, 5.0, 6.0 ] ); var mask = new Uint8Array( [ 0, 0, 0, 0, 0, 0, 1, 1 ] ); -var N = floor( x.length / 2 ); -var v = dnanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 ); +var v = dnanmskrange.ndarray( 4, x, 2, 1, mask, 2, 1 ); // returns 6.0 ``` @@ -153,31 +146,28 @@ var v = dnanmskrange.ndarray( N, x, 2, 1, mask, 2, 1 ); ```javascript -var randu = require( '@stdlib/random/base/randu' ); -var round = require( '@stdlib/math/base/special/round' ); -var Float64Array = require( '@stdlib/array/float64' ); -var Uint8Array = require( '@stdlib/array/uint8' ); +var uniform = require( '@stdlib/random/base/uniform' ); +var filledarrayBy = require( '@stdlib/array/filled-by' ); +var bernoulli = require( '@stdlib/random/base/bernoulli' ); +var uint8Array = require( '@stdlib/random/array/bernoulli' ); var dnanmskrange = require( '@stdlib/stats/base/dnanmskrange' ); var mask; var x; -var i; - -x = new Float64Array( 10 ); -mask = new Uint8Array( x.length ); -for ( i = 0; i < x.length; i++ ) { - if ( randu() < 0.2 ) { - mask[ i ] = 1; - } else { - mask[ i ] = 0; - } - if ( randu() < 0.1 ) { - x[ i ] = NaN; - } else { - x[ i ] = round( (randu()*100.0) - 50.0 ); + +function rand() { + if ( bernoulli( 0.8 ) < 1 ) { + return NaN; } + return uniform( -50.0, 50.0 ); } + +x = filledarrayBy( 10, 'float64', rand ); console.log( x ); + +mask = uint8Array( x.length, 0.2, { + 'dtype': 'uint8' +}); console.log( mask ); var v = dnanmskrange( x.length, x, 1, mask, 1 ); @@ -188,6 +178,143 @@ console.log( v ); + + +* * * + +
+ +## C APIs + + + +
+ +
+ + + + + +
+ +### Usage + +```c +#include "stdlib/stats/base/dnanmskrange.h" +``` + +#### stdlib_strided_dnanmskrange( N, \*X, strideX, \*Mask, strideMask ) + +Computes the [range][range] of a double-precision floating-point strided array according to a `mask`, ignoring `NaN` values. + +```c +#include + +const double x[] = { 1.0, -2.0, 4.0, 2.0, 0.0/0.0 }; +const uint8_t mask[] = { 0, 0, 1, 0, 0 }; + +double v = stdlib_strided_dnanmskrange( 5, x, 1, mask, 1 ); +// returns 4.0 +``` + +The function accepts the following arguments: + +- **N**: `[in] CBLAS_INT` number of indexed elements. +- **X**: `[in] double*` input array. +- **strideX**: `[in] CBLAS_INT` stride length for `X`. +- **Mask**: `[in] uint8_t*` mask array. If a `Mask` array element is `0`, the corresponding element in `X` is considered valid and included in computation. If a `Mask` array element is `1`, the corresponding element in `X` is considered invalid/missing and excluded from computation. +- **strideMask**: `[in] CBLAS_INT` stride length for `Mask`. + +```c +double stdlib_strided_dnanmskrange( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const uint8_t *Mask, const CBLAS_INT strideMask ); +``` + +#### stdlib_strided_dnanmskrange_ndarray( N, \*X, strideX, offsetX, \*Mask, strideMask, offsetMask ) + +Computes the [range][range] of a double-precision floating-point strided array according to a `mask`, ignoring `NaN` values and using alternative indexing semantics. + +```c +const double x[] = { 1.0, -2.0, 4.0, 2.0, 0.0/0.0 }; +const uint8_t mask[] = { 0, 0, 1, 0, 0 }; + +double v = stdlib_strided_dnanmskrange_ndarray( 5, x, 1, 0, mask, 1, 0 ); +// returns 4.0 +``` + +The function accepts the following arguments: + +- **N**: `[in] CBLAS_INT` number of indexed elements. +- **X**: `[in] double*` input array. +- **strideX**: `[in] CBLAS_INT` stride length for `X`. +- **offsetX**: `[in] CBLAS_INT` starting index for `X`. +- **Mask**: `[in] uint8_t*` mask array. If a `Mask` array element is `0`, the corresponding element in `X` is considered valid and included in computation. If a `Mask` array element is `1`, the corresponding element in `X` is considered invalid/missing and excluded from computation. +- **strideMask**: `[in] CBLAS_INT` stride length for `Mask`. +- **offsetMask**: `[in] CBLAS_INT` starting index for `Mask`. + +```c +double stdlib_strided_dnanmskrange_ndarray( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, const uint8_t *Mask, const CBLAS_INT strideMask, const CBLAS_INT offsetMask ); +``` + +
+ + + + + +
+ +
+ + + + + +
+ +### Examples + +```c +#include "stdlib/stats/base/dnanmskrange.h" +#include +#include + +int main( void ) { + // Create a strided array: + const double x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 0.0/0.0, 0.0/0.0 }; + + // Create a mask array: + const uint8_t mask[] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }; + + // Specify the number of elements: + const int N = 5; + + // Specify the stride lengths: + const int strideX = 2; + const int strideMask = 2; + + // Compute the range: + double v = stdlib_strided_dnanmskrange( N, x, strideX, mask, strideMask ); + + // Print the result: + printf( "range: %lf\n", v ); +} +``` + +
+ + + +
+ + + +
+ +
+ + +