Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
55ae65f
feat: add C ndarray interface and refactor implementation
aayush0325 Jan 15, 2025
483045f
fix: use CBLAS_INT instead of int32_t
aayush0325 Jan 15, 2025
35c57c4
refactor: update js implementation and tests
aayush0325 Jan 16, 2025
e49f048
fix: fix bugs
aayush0325 Jan 16, 2025
76732c8
refactor: update benchmarks, docs, examples
aayush0325 Jan 16, 2025
5352d04
docs: update readme
aayush0325 Jan 16, 2025
89874b2
chore: code review
aayush0325 Jan 17, 2025
29e4d14
docs: update examples
aayush0325 Jan 17, 2025
6905209
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
d628f06
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
8d9eb1f
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
7ce536f
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
3286c79
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
a2f5a64
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/README.md
aayush0325 Jan 17, 2025
2e6e724
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/lib/ndarray.js
aayush0325 Jan 17, 2025
696c3f2
Update lib/node_modules/@stdlib/stats/base/dnanmeanpw/src/main.c
aayush0325 Jan 17, 2025
473ceb6
chore: fix readme tests
aayush0325 Jan 18, 2025
756db93
docs: update examples
aayush0325 Jan 18, 2025
21b4bf0
style: enable lint rule
kgryte Jan 19, 2025
821d72b
style: disable ESLint rules
kgryte Jan 19, 2025
bc9fea3
refactor: avoid repeated temporary array allocation
kgryte Jan 19, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#ifndef STDLIB_STATS_BASE_DNANMEANPW_H
#define STDLIB_STATS_BASE_DNANMEANPW_H

#include <stdint.h>
#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.
Expand All @@ -31,7 +31,12 @@ extern "C" {
/**
* Computes the arithmetic mean of a double-precision floating-point strided array, ignoring `NaN` values and using pairwise summation.
*/
double stdlib_strided_dnanmeanpw( const int64_t N, const double *X, const int64_t stride );
double API_SUFFIX(stdlib_strided_dnanmeanpw)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX );

/**
* Computes the arithmetic mean of a double-precision floating-point strided array, ignoring `NaN` values and using pairwise summation and alternative indexing semantics.
*/
double API_SUFFIX(stdlib_strided_dnanmeanpw_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT strideX, const CBLAS_INT offsetX );

#ifdef __cplusplus
}
Expand Down
46 changes: 6 additions & 40 deletions lib/node_modules/@stdlib/stats/base/dnanmeanpw/lib/dnanmeanpw.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@

// MODULES //

var mean = require( './ndarray.js' );
var stride2offset = require( '@stdlib/strided/base/stride2offset' );
var ndarray = require( './ndarray.js' );


// MAIN //
Expand All @@ -30,54 +31,19 @@ var mean = require( './ndarray.js' );
*
* @param {PositiveInteger} N - number of indexed elements
* @param {Float64Array} x - input array
* @param {integer} stride - stride length
* @param {integer} strideX - stride length
* @returns {number} arithmetic mean
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
*
* var x = new Float64Array( [ 1.0, -2.0, NaN, 2.0 ] );
* var N = x.length;
*
* var v = dnanmeanpw( N, x, 1 );
* var v = dnanmeanpw( x.length, x, 1 );
* // returns ~0.3333
*/
function dnanmeanpw( N, x, stride ) {
var ix;
var v;
var s;
var n;
var i;

if ( N <= 0 ) {
return NaN;
}
if ( N === 1 || stride === 0 ) {
return x[ 0 ];
}
if ( stride < 0 ) {
ix = (1-N) * stride;
} else {
ix = 0;
}
if ( N < 8 ) {
// Use simple summation...
s = 0.0;
n = 0;
for ( i = 0; i < N; i++ ) {
v = x[ ix ];
if ( v === v ) {
s += v;
n += 1;
}
ix += stride;
}
if ( n === 0 ) {
return NaN;
}
return s / n;
}
return mean( N, x, stride, ix );
function dnanmeanpw( N, x, strideX ) {
return ndarray( N, x, strideX, stride2offset( N, strideX ) );
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,19 @@ var addon = require( './../src/addon.node' );
*
* @param {PositiveInteger} N - number of indexed elements
* @param {Float64Array} x - input array
* @param {integer} stride - stride length
* @param {integer} strideX - stride length
* @returns {number} arithmetic mean
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
*
* var x = new Float64Array( [ 1.0, -2.0, NaN, 2.0 ] );
* var N = x.length;
*
* var v = dnanmeanpw( N, x, 1 );
* var v = dnanmeanpw( x.length, x, 1 );
* // returns ~0.3333
*/
function dnanmeanpw( N, x, stride ) {
return addon( N, x, stride );
function dnanmeanpw( N, x, strideX ) {
return addon( N, x, strideX );
}


Expand Down
197 changes: 0 additions & 197 deletions lib/node_modules/@stdlib/stats/base/dnanmeanpw/lib/dnansumpw.js

This file was deleted.

7 changes: 2 additions & 5 deletions lib/node_modules/@stdlib/stats/base/dnanmeanpw/lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,17 @@
* var dnanmeanpw = require( '@stdlib/stats/base/dnanmeanpw' );
*
* var x = new Float64Array( [ 1.0, -2.0, NaN, 2.0 ] );
* var N = 3;
*
* var v = dnanmeanpw( N, x, 1 );
* var v = dnanmeanpw( x.length, x, 1 );
* // returns ~0.3333
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
* var floor = require( '@stdlib/math/base/special/floor' );
* var dnanmeanpw = require( '@stdlib/stats/base/dnanmeanpw' );
*
* var x = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0, NaN ] );
* var N = floor( x.length / 2 );
*
* var v = dnanmeanpw.ndarray( N, x, 2, 1 );
* var v = dnanmeanpw.ndarray( 4, x, 2, 1 );
* // returns 1.25
*/

Expand Down
25 changes: 9 additions & 16 deletions lib/node_modules/@stdlib/stats/base/dnanmeanpw/lib/ndarray.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,8 @@

// MODULES //

var dnansumpw = require( './dnansumpw.js' );


// VARIABLES //

var WORKSPACE = [ 0.0, 0 ];
var dnannsumpw = require( '@stdlib/blas/ext/base/dnannsumpw' ).ndarray;
var Float64Array = require( '@stdlib/array/float64' );


// MAIN //
Expand All @@ -35,25 +31,22 @@ var WORKSPACE = [ 0.0, 0 ];
*
* @param {PositiveInteger} N - number of indexed elements
* @param {Float64Array} x - input array
* @param {integer} stride - stride length
* @param {NonNegativeInteger} offset - starting index
* @param {integer} strideX - stride length
* @param {NonNegativeInteger} offsetX - starting index
* @returns {number} arithmetic mean
*
* @example
* var Float64Array = require( '@stdlib/array/float64' );
* 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, NaN ] );
* var N = floor( x.length / 2 );
*
* var v = dnanmeanpw( N, x, 2, 1 );
* var v = dnanmeanpw( 4, x, 2, 1 );
* // returns 1.25
*/
function dnanmeanpw( N, x, stride, offset ) {
WORKSPACE[ 0 ] = 0.0;
WORKSPACE[ 1 ] = 0;
dnansumpw( N, WORKSPACE, x, stride, offset );
return WORKSPACE[ 0 ] / WORKSPACE[ 1 ];
function dnanmeanpw( N, x, strideX, offsetX ) {
var out = new Float64Array( 2 );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aayush0325 The WORKSPACE idea is still valid here. Namely, we can avoid allocating a new out array for each call to dnanmeanpw and just reuse the same workspace each time. While not thread safe in C, this is perfectly fine in JS.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'll keep this in mind!

var v = dnannsumpw( N, x, strideX, offsetX, out, 1, 0 );
return v[0] / v[1];
}


Expand Down
Loading
Loading