Skip to content

Commit efd793a

Browse files
committed
feat: add C ndarray interface and refactor implementation
--- 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: passed - 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: passed - task: lint_c_examples status: passed - task: lint_c_benchmarks status: passed - 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 ---
1 parent 4bbd4bd commit efd793a

File tree

21 files changed

+230
-259
lines changed

21 files changed

+230
-259
lines changed

lib/node_modules/@stdlib/stats/base/dmeanvarpn/README.md

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,19 @@ The function has the following parameters:
122122
- **N**: number of indexed elements.
123123
- **correction**: degrees of freedom adjustment. Setting this parameter to a value other than `0` has the effect of adjusting the divisor during the calculation of the [variance][variance] according to `N-c` where `c` corresponds to the provided degrees of freedom adjustment. When computing the [variance][variance] of a population, setting this parameter to `0` is the standard choice (i.e., the provided array contains data constituting an entire population). When computing the unbiased sample [variance][variance], setting this parameter to `1` is the standard choice (i.e., the provided array contains data sampled from a larger population; this is commonly referred to as Bessel's correction).
124124
- **x**: input [`Float64Array`][@stdlib/array/float64].
125-
- **strideX**: index increment for `x`.
125+
- **strideX**: stride length for `x`.
126126
- **out**: output [`Float64Array`][@stdlib/array/float64] for storing results.
127-
- **strideOut**: index increment for `out`.
127+
- **strideOut**: stride length for `out`.
128128

129-
The `N` and `stride` parameters determine which elements are accessed at runtime. For example, to compute the [variance][variance] of every other element in `x`,
129+
The `N` and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the [variance][variance] of every other element in `x`,
130130

131131
```javascript
132132
var Float64Array = require( '@stdlib/array/float64' );
133-
var floor = require( '@stdlib/math/base/special/floor' );
134133

135134
var x = new Float64Array( [ 1.0, 2.0, 2.0, -7.0, -2.0, 3.0, 4.0, 2.0 ] );
136135
var out = new Float64Array( 2 );
137-
var N = floor( x.length / 2 );
138136

139-
var v = dmeanvarpn( N, 1, x, 2, out, 1 );
137+
var v = dmeanvarpn( 4, 1, x, 2, out, 1 );
140138
// returns <Float64Array>[ 1.25, 6.25 ]
141139
```
142140

@@ -146,17 +144,14 @@ Note that indexing is relative to the first index. To introduce an offset, use [
146144

147145
```javascript
148146
var Float64Array = require( '@stdlib/array/float64' );
149-
var floor = require( '@stdlib/math/base/special/floor' );
150147

151148
var x0 = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0 ] );
152149
var x1 = new Float64Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
153150

154151
var out0 = new Float64Array( 4 );
155152
var out1 = new Float64Array( out0.buffer, out0.BYTES_PER_ELEMENT*2 ); // start at 3rd element
156153

157-
var N = floor( x0.length / 2 );
158-
159-
var v = dmeanvarpn( N, 1, x1, 2, out1, 1 );
154+
var v = dmeanvarpn( 4, 1, x1, 2, out1, 1 );
160155
// returns <Float64Array>[ 1.25, 6.25 ]
161156
```
162157

@@ -179,17 +174,15 @@ The function has the following additional parameters:
179174
- **offsetX**: starting index for `x`.
180175
- **offsetOut**: starting index for `out`.
181176

182-
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying `buffer`, the `offset` parameters support indexing semantics based on a starting index. For example, to calculate the [mean][arithmetic-mean] and [variance][variance] for every other value in `x` starting from the second value
177+
While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on a starting index. For example, to calculate the [mean][arithmetic-mean] and [variance][variance] for every other element in `x` starting from the second element
183178

184179
```javascript
185180
var Float64Array = require( '@stdlib/array/float64' );
186-
var floor = require( '@stdlib/math/base/special/floor' );
187181

188182
var x = new Float64Array( [ 2.0, 1.0, 2.0, -2.0, -2.0, 2.0, 3.0, 4.0 ] );
189183
var out = new Float64Array( 4 );
190-
var N = floor( x.length / 2 );
191184

192-
var v = dmeanvarpn.ndarray( N, 1, x, 2, 1, out, 2, 1 );
185+
var v = dmeanvarpn.ndarray( 4, 1, x, 2, 1, out, 2, 1 );
193186
// returns <Float64Array>[ 0.0, 1.25, 0.0, 6.25 ]
194187
```
195188

@@ -215,22 +208,16 @@ var v = dmeanvarpn.ndarray( N, 1, x, 2, 1, out, 2, 1 );
215208
<!-- eslint no-undef: "error" -->
216209

217210
```javascript
218-
var randu = require( '@stdlib/random/base/randu' );
219-
var round = require( '@stdlib/math/base/special/round' );
211+
var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
220212
var Float64Array = require( '@stdlib/array/float64' );
221213
var dmeanvarpn = require( '@stdlib/stats/base/dmeanvarpn' );
222214

223-
var out;
224-
var x;
225-
var i;
226-
227-
x = new Float64Array( 10 );
228-
for ( i = 0; i < x.length; i++ ) {
229-
x[ i ] = round( (randu()*100.0) - 50.0 );
230-
}
215+
var x = discreteUniform( 10, -50, 50, {
216+
'dtype': 'float64'
217+
});
231218
console.log( x );
232219

233-
out = new Float64Array( 2 );
220+
var out = new Float64Array( 2 );
234221
dmeanvarpn( x.length, 1, x, 1, out, 1 );
235222
console.log( out );
236223
```

lib/node_modules/@stdlib/stats/base/dmeanvarpn/benchmark/benchmark.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,21 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/array/uniform' );
2525
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2626
var pow = require( '@stdlib/math/base/special/pow' );
2727
var Float64Array = require( '@stdlib/array/float64' );
2828
var pkg = require( './../package.json' ).name;
2929
var dmeanvarpn = require( './../lib/dmeanvarpn.js' );
3030

3131

32+
// VARIABLES //
33+
34+
var options = {
35+
'dtype': 'float64'
36+
};
37+
38+
3239
// FUNCTIONS //
3340

3441
/**
@@ -39,15 +46,8 @@ var dmeanvarpn = require( './../lib/dmeanvarpn.js' );
3946
* @returns {Function} benchmark function
4047
*/
4148
function createBenchmark( len ) {
42-
var out;
43-
var x;
44-
var i;
45-
46-
x = new Float64Array( len );
47-
for ( i = 0; i < x.length; i++ ) {
48-
x[ i ] = ( randu()*20.0 ) - 10.0;
49-
}
50-
out = new Float64Array( 2 );
49+
var out = new Float64Array( 2 );
50+
var x = uniform( len, -10.0, 10.0, options );
5151
return benchmark;
5252

5353
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/dmeanvarpn/benchmark/benchmark.native.js

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

2323
var resolve = require( 'path' ).resolve;
2424
var bench = require( '@stdlib/bench' );
25-
var randu = require( '@stdlib/random/base/randu' );
25+
var uniform = require( '@stdlib/random/array/uniform' );
2626
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2727
var pow = require( '@stdlib/math/base/special/pow' );
2828
var Float64Array = require( '@stdlib/array/float64' );
@@ -36,6 +36,9 @@ var dmeanvarpn = tryRequire( resolve( __dirname, './../lib/dmeanvarpn.native.js'
3636
var opts = {
3737
'skip': ( dmeanvarpn instanceof Error )
3838
};
39+
var options = {
40+
'dtype': 'float64'
41+
};
3942

4043

4144
// FUNCTIONS //
@@ -48,15 +51,8 @@ var opts = {
4851
* @returns {Function} benchmark function
4952
*/
5053
function createBenchmark( len ) {
51-
var out;
52-
var x;
53-
var i;
54-
55-
x = new Float64Array( len );
56-
for ( i = 0; i < x.length; i++ ) {
57-
x[ i ] = ( randu()*20.0 ) - 10.0;
58-
}
59-
out = new Float64Array( 2 );
54+
var out = new Float64Array( 2 );
55+
var x = uniform( len, -10.0, 10.0, options );
6056
return benchmark;
6157

6258
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/dmeanvarpn/benchmark/benchmark.ndarray.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,21 @@
2121
// MODULES //
2222

2323
var bench = require( '@stdlib/bench' );
24-
var randu = require( '@stdlib/random/base/randu' );
24+
var uniform = require( '@stdlib/random/array/uniform' );
2525
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2626
var pow = require( '@stdlib/math/base/special/pow' );
2727
var Float64Array = require( '@stdlib/array/float64' );
2828
var pkg = require( './../package.json' ).name;
2929
var dmeanvarpn = require( './../lib/ndarray.js' );
3030

3131

32+
// VARIABLES //
33+
34+
var options = {
35+
'dtype': 'float64'
36+
};
37+
38+
3239
// FUNCTIONS //
3340

3441
/**
@@ -39,15 +46,8 @@ var dmeanvarpn = require( './../lib/ndarray.js' );
3946
* @returns {Function} benchmark function
4047
*/
4148
function createBenchmark( len ) {
42-
var out;
43-
var x;
44-
var i;
45-
46-
x = new Float64Array( len );
47-
for ( i = 0; i < x.length; i++ ) {
48-
x[ i ] = ( randu()*20.0 ) - 10.0;
49-
}
50-
out = new Float64Array( 2 );
49+
var out = new Float64Array( 2 );
50+
var x = uniform( len, -10.0, 10.0, options );
5151
return benchmark;
5252

5353
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/dmeanvarpn/benchmark/benchmark.ndarray.native.js

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

2323
var resolve = require( 'path' ).resolve;
2424
var bench = require( '@stdlib/bench' );
25-
var randu = require( '@stdlib/random/base/randu' );
25+
var uniform = require( '@stdlib/random/array/uniform' );
2626
var isnan = require( '@stdlib/math/base/assert/is-nan' );
2727
var pow = require( '@stdlib/math/base/special/pow' );
2828
var Float64Array = require( '@stdlib/array/float64' );
@@ -36,6 +36,9 @@ var dmeanvarpn = tryRequire( resolve( __dirname, './../lib/ndarray.native.js' )
3636
var opts = {
3737
'skip': ( dmeanvarpn instanceof Error )
3838
};
39+
var options = {
40+
'dtype': 'float64'
41+
};
3942

4043

4144
// FUNCTIONS //
@@ -48,15 +51,8 @@ var opts = {
4851
* @returns {Function} benchmark function
4952
*/
5053
function createBenchmark( len ) {
51-
var out;
52-
var x;
53-
var i;
54-
55-
x = new Float64Array( len );
56-
for ( i = 0; i < x.length; i++ ) {
57-
x[ i ] = ( randu()*20.0 ) - 10.0;
58-
}
59-
out = new Float64Array( 2 );
54+
var out = new Float64Array( 2 );
55+
var x = uniform( len, -10.0, 10.0, options );
6056
return benchmark;
6157

6258
function benchmark( b ) {

lib/node_modules/@stdlib/stats/base/dmeanvarpn/benchmark/c/benchmark.length.c

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static double rand_double( void ) {
9494
* @param len array length
9595
* @return elapsed time in seconds
9696
*/
97-
static double benchmark( int iterations, int len ) {
97+
static double benchmark1( int iterations, int len ) {
9898
double elapsed;
9999
double out[ 2 ];
100100
double x[ len ];
@@ -109,6 +109,7 @@ static double benchmark( int iterations, int len ) {
109109

110110
t = tic();
111111
for ( i = 0; i < iterations; i++ ) {
112+
// cppcheck-suppress uninitvar
112113
stdlib_strided_dmeanvarpn( len, 1, x, 1, out, 1 );
113114
if ( out[ i%2 ] != out[ i%2 ] ) {
114115
printf( "should not return NaN\n" );
@@ -122,6 +123,42 @@ static double benchmark( int iterations, int len ) {
122123
return elapsed;
123124
}
124125

126+
/**
127+
* Runs a benchmark.
128+
*
129+
* @param iterations number of iterations
130+
* @param len array length
131+
* @return elapsed time in seconds
132+
*/
133+
static double benchmark2( int iterations, int len ) {
134+
double elapsed;
135+
double out[ 2 ];
136+
double x[ len ];
137+
double t;
138+
int i;
139+
140+
for ( i = 0; i < len; i++ ) {
141+
x[ i ] = ( rand_double() * 20000.0 ) - 10000.0;
142+
}
143+
out[ 0 ] = 0.0;
144+
out[ 1 ] = 0.0;
145+
146+
t = tic();
147+
for ( i = 0; i < iterations; i++ ) {
148+
// cppcheck-suppress uninitvar
149+
stdlib_strided_dmeanvarpn_ndarray( len, 1, x, 1, 0, out, 1, 0 );
150+
if ( out[ i%2 ] != out[ i%2 ] ) {
151+
printf( "should not return NaN\n" );
152+
break;
153+
}
154+
}
155+
elapsed = tic() - t;
156+
if ( out[ i%2 ] != out[ i%2 ] ) {
157+
printf( "should not return NaN\n" );
158+
}
159+
return elapsed;
160+
}
161+
125162
/**
126163
* Main execution sequence.
127164
*/
@@ -144,7 +181,14 @@ int main( void ) {
144181
for ( j = 0; j < REPEATS; j++ ) {
145182
count += 1;
146183
printf( "# c::%s:len=%d\n", NAME, len );
147-
elapsed = benchmark( iter, len );
184+
elapsed = benchmark1( iter, len );
185+
print_results( iter, elapsed );
186+
printf( "ok %d benchmark finished\n", count );
187+
}
188+
for ( j = 0; j < REPEATS; j++ ) {
189+
count += 1;
190+
printf( "# c::%s:ndarray:len=%d\n", NAME, len );
191+
elapsed = benchmark2( iter, len );
148192
print_results( iter, elapsed );
149193
printf( "ok %d benchmark finished\n", count );
150194
}

0 commit comments

Comments
 (0)