From 9eb614f070c0bdee51dcf2462ce3a540c4305be1 Mon Sep 17 00:00:00 2001 From: aman-095 Date: Tue, 24 Sep 2024 12:16:11 +0530 Subject: [PATCH 1/3] feat: update Js implementation and add C ndarray implementation for dasum --- .../@stdlib/blas/base/dasum/README.md | 30 ++++++- .../base/dasum/benchmark/c/benchmark.length.c | 44 ++++++++- .../@stdlib/blas/base/dasum/docs/repl.txt | 2 +- .../blas/base/dasum/examples/c/example.c | 6 ++ .../dasum/include/stdlib/blas/base/dasum.h | 5 ++ .../@stdlib/blas/base/dasum/lib/dasum.js | 43 ++------- .../blas/base/dasum/lib/dasum.native.js | 2 +- .../@stdlib/blas/base/dasum/lib/ndarray.js | 29 +----- .../blas/base/dasum/lib/ndarray.native.js | 14 +-- .../@stdlib/blas/base/dasum/manifest.json | 90 ++++++++++++++----- .../@stdlib/blas/base/dasum/src/addon.c | 27 ++++-- .../@stdlib/blas/base/dasum/src/dasum.c | 38 ++------ .../@stdlib/blas/base/dasum/src/dasum_cblas.c | 27 +++++- .../@stdlib/blas/base/dasum/src/dasum_f.c | 35 +++++++- .../blas/base/dasum/src/dasum_ndarray.c | 71 +++++++++++++++ .../blas/base/dasum/test/test.dasum.js | 16 +++- .../blas/base/dasum/test/test.dasum.native.js | 16 +++- .../blas/base/dasum/test/test.ndarray.js | 2 +- .../base/dasum/test/test.ndarray.native.js | 2 +- 19 files changed, 340 insertions(+), 159 deletions(-) create mode 100644 lib/node_modules/@stdlib/blas/base/dasum/src/dasum_ndarray.c diff --git a/lib/node_modules/@stdlib/blas/base/dasum/README.md b/lib/node_modules/@stdlib/blas/base/dasum/README.md index 880c68d12d2a..985daee97205 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/README.md +++ b/lib/node_modules/@stdlib/blas/base/dasum/README.md @@ -97,7 +97,7 @@ var sum = dasum( 3, x1, 2 ); // returns 12.0 ``` -If either `N` or `stride` is less than or equal to `0`, the function returns `0`. +If `N` is less than or equal to `0`, the function returns `0`. #### dasum.ndarray( N, x, stride, offset ) @@ -217,6 +217,28 @@ The function accepts the following arguments: double c_dasum( const CBLAS_INT N, const double *X, const CBLAS_INT stride ); ``` +#### c_dasum_ndarray( N, \*X, stride, offset ) + +Computes the sum of absolute values using alternative indexing semantics. + +```c +const double x[] = { 1.0, 2.0, 3.0, 4.0 }; + +double v = c_dasum_ndarray( 4, x, -1, 3 ); +// returns 10.0 +``` + +The function accepts the following arguments: + +- **N**: `[in] CBLAS_INT` number of indexed elements. +- **X**: `[in] double*` input array. +- **stride**: `[in] CBLAS_INT` index increment for `X`. +- **offset**: `[in] CBLAS_INT` starting index for `X`. + +```c +double c_dasum_ndarray( const CBLAS_INT N, const double *X, const CBLAS_INT stride, const CBLAS_INT offset ); +``` + @@ -254,6 +276,12 @@ int main( void ) { // Print the result: printf( "sum: %lf\n", sum ); + + // Compute the sum of absolute values: + sum = c_dasum_ndarray( N, x, -strideX, N-1 ); + + // Print the result: + printf( "sum: %lf\n", sum ); } ``` diff --git a/lib/node_modules/@stdlib/blas/base/dasum/benchmark/c/benchmark.length.c b/lib/node_modules/@stdlib/blas/base/dasum/benchmark/c/benchmark.length.c index 4bf10dbcd96f..ec801fd3c089 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/benchmark/c/benchmark.length.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/benchmark/c/benchmark.length.c @@ -94,7 +94,7 @@ static double rand_double( void ) { * @param len array length * @return elapsed time in seconds */ -static double benchmark( int iterations, int len ) { +static double benchmark1( int iterations, int len ) { double elapsed; double x[ len ]; double y; @@ -120,6 +120,39 @@ static double benchmark( int iterations, int len ) { return elapsed; } +/** +* Runs a benchmark. +* +* @param iterations number of iterations +* @param len array length +* @return elapsed time in seconds +*/ +static double benchmark2( int iterations, int len ) { + double elapsed; + double x[ len ]; + double y; + double t; + int i; + + for ( i = 0; i < len; i++ ) { + x[ i ] = ( rand_double()*20000.0 ) - 10000.0; + } + y = 0.0; + t = tic(); + for ( i = 0; i < iterations; i++ ) { + y = c_dasum_ndarray( len, x, 1, 0 ); + if ( y != y ) { + printf( "should not return NaN\n" ); + break; + } + } + elapsed = tic() - t; + if ( y != y ) { + printf( "should not return NaN\n" ); + } + return elapsed; +} + /** * Main execution sequence. */ @@ -142,7 +175,14 @@ int main( void ) { for ( j = 0; j < REPEATS; j++ ) { count += 1; printf( "# c::%s:len=%d\n", NAME, len ); - elapsed = benchmark( iter, len ); + elapsed = benchmark1( iter, len ); + print_results( iter, elapsed ); + printf( "ok %d benchmark finished\n", count ); + } + for ( j = 0; j < REPEATS; j++ ) { + count += 1; + printf( "# c::%s:ndarray:len=%d\n", NAME, len ); + elapsed = benchmark2( iter, len ); print_results( iter, elapsed ); printf( "ok %d benchmark finished\n", count ); } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/docs/repl.txt b/lib/node_modules/@stdlib/blas/base/dasum/docs/repl.txt index 7074e9518cb3..a1dc7b889325 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/docs/repl.txt +++ b/lib/node_modules/@stdlib/blas/base/dasum/docs/repl.txt @@ -10,7 +10,7 @@ Indexing is relative to the first index. To introduce an offset, use typed array views. - If `N` or `stride` is less than or equal to `0`, the function returns `0`. + If `N` is less than or equal to `0`, the function returns `0`. Parameters ---------- diff --git a/lib/node_modules/@stdlib/blas/base/dasum/examples/c/example.c b/lib/node_modules/@stdlib/blas/base/dasum/examples/c/example.c index 490764e3238d..07ea8282b639 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/examples/c/example.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/examples/c/example.c @@ -34,4 +34,10 @@ int main( void ) { // Print the result: printf( "sum: %lf\n", sum ); + + // Compute the sum of absolute values: + sum = c_dasum_ndarray( N, x, -strideX, N-1 ); + + // Print the result: + printf( "sum: %lf\n", sum ); } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/include/stdlib/blas/base/dasum.h b/lib/node_modules/@stdlib/blas/base/dasum/include/stdlib/blas/base/dasum.h index 861d60095271..edb2a7cd520e 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/include/stdlib/blas/base/dasum.h +++ b/lib/node_modules/@stdlib/blas/base/dasum/include/stdlib/blas/base/dasum.h @@ -36,6 +36,11 @@ extern "C" { */ double API_SUFFIX(c_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT stride ); +/** +* Computes the sum of absolute values using alternative indexing semantics. +*/ +double API_SUFFIX(c_dasum_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT stride, const CBLAS_INT offset ); + #ifdef __cplusplus } #endif diff --git a/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.js b/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.js index 3cc1e021e5f6..767201cbf6eb 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.js @@ -20,12 +20,8 @@ // MODULES // -var abs = require( '@stdlib/math/base/special/abs' ); - - -// VARIABLES // - -var M = 6; +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var ndarray = require( './ndarray.js' ); // MAIN // @@ -35,7 +31,7 @@ var M = 6; * * @param {PositiveInteger} N - number of indexed elements * @param {Float64Array} x - input array -* @param {PositiveInteger} stride - `x` stride length +* @param {integer} stride - `x` stride length * @returns {number} sum * * @example @@ -47,37 +43,8 @@ var M = 6; * // returns 15.0 */ function dasum( N, x, stride ) { - var sum; - var m; - var i; - - sum = 0.0; - if ( N <= 0 || stride <= 0 ) { - return sum; - } - // Use unrolled loops if the stride is equal to `1`... - if ( stride === 1 ) { - m = N % M; - - // If we have a remainder, run a clean-up loop... - if ( m > 0 ) { - for ( i = 0; i < m; i++ ) { - sum += abs( x[i] ); - } - } - if ( N < M ) { - return sum; - } - for ( i = m; i < N; i += M ) { - sum += abs(x[i]) + abs(x[i+1]) + abs(x[i+2]) + abs(x[i+3]) + abs(x[i+4]) + abs(x[i+5]); // eslint-disable-line max-len - } - return sum; - } - N *= stride; - for ( i = 0; i < N; i += stride ) { - sum += abs( x[i] ); - } - return sum; + var ox = stride2offset( N, stride ); + return ndarray( N, x, stride, ox ); } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.native.js b/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.native.js index 20e82391cfae..5931c4422fbb 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.native.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/lib/dasum.native.js @@ -30,7 +30,7 @@ var addon = require( './../src/addon.node' ); * * @param {PositiveInteger} N - number of indexed elements * @param {Float64Array} x - input array -* @param {PositiveInteger} stride - `x` stride length +* @param {integer} stride - `x` stride length * @returns {number} sum * * @example diff --git a/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.js b/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.js index 3f5673049d69..412705ce0627 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.js @@ -23,11 +23,6 @@ var abs = require( '@stdlib/math/base/special/abs' ); -// VARIABLES // - -var M = 6; - - // MAIN // /** @@ -36,7 +31,7 @@ var M = 6; * @param {PositiveInteger} N - number of indexed elements * @param {Float64Array} x - input array * @param {integer} stride - `x` stride length -* @param {NonNegativeInteger} offset - starting `x` index +* @param {NonNegativeInteger} offset - starting index for `x` * @returns {number} sum * * @example @@ -50,7 +45,6 @@ var M = 6; function dasum( N, x, stride, offset ) { var sum; var ix; - var m; var i; sum = 0.0; @@ -58,27 +52,6 @@ function dasum( N, x, stride, offset ) { return sum; } ix = offset; - - // Use unrolled loops if the stride is equal to `1`... - if ( stride === 1 ) { - m = N % M; - - // If we have a remainder, run a clean-up loop... - if ( m > 0 ) { - for ( i = 0; i < m; i++ ) { - sum += abs( x[ix] ); - ix += stride; - } - } - if ( N < M ) { - return sum; - } - for ( i = m; i < N; i += M ) { - sum += abs( x[ix] ) + abs( x[ix+1] ) + abs( x[ix+2] ) + abs( x[ix+3] ) + abs( x[ix+4] ) + abs( x[ix+5] ); // eslint-disable-line max-len - ix += M; - } - return sum; - } for ( i = 0; i < N; i++ ) { sum += abs( x[ix] ); ix += stride; diff --git a/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.native.js b/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.native.js index 316d91ecd2d6..5a2fc11742e7 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.native.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/lib/ndarray.native.js @@ -20,9 +20,7 @@ // MODULES // -var minViewBufferIndex = require( '@stdlib/strided/base/min-view-buffer-index' ); -var offsetView = require( '@stdlib/strided/base/offset-view' ); -var addon = require( './dasum.native.js' ); +var addon = require( './../src/addon.node' ); // MAIN // @@ -33,7 +31,7 @@ var addon = require( './dasum.native.js' ); * @param {PositiveInteger} N - number of indexed elements * @param {Float64Array} x - input array * @param {integer} stride - `x` stride length -* @param {NonNegativeInteger} offset - starting `x` index +* @param {NonNegativeInteger} offset - starting index for `x` * @returns {number} sum * * @example @@ -45,13 +43,7 @@ var addon = require( './dasum.native.js' ); * // returns 15.0 */ function dasum( N, x, stride, offset ) { - var view; - offset = minViewBufferIndex( N, stride, offset ); - if ( stride < 0 ) { - stride *= -1; - } - view = offsetView( x, offset ); - return addon( N, view, stride ); + return addon.ndarray( N, x, stride, offset ); } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/manifest.json b/lib/node_modules/@stdlib/blas/base/dasum/manifest.json index d3bb868c81e3..981fd587d2d9 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/manifest.json +++ b/lib/node_modules/@stdlib/blas/base/dasum/manifest.json @@ -45,6 +45,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -58,15 +59,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -76,15 +81,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -107,6 +116,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -131,7 +141,8 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index" ] }, { @@ -151,7 +162,8 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index" ] }, @@ -172,6 +184,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -185,15 +198,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -203,15 +220,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -233,6 +254,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -256,7 +278,8 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index" ] }, { @@ -275,7 +298,8 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index" ] }, @@ -297,6 +321,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", @@ -321,7 +346,8 @@ ], "libpath": [], "dependencies": [ - "@stdlib/blas/base/shared" + "@stdlib/blas/base/shared", + "@stdlib/strided/base/min-view-buffer-index" ] }, { @@ -342,7 +368,7 @@ "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", - "@stdlib/math/base/special/abs" + "@stdlib/strided/base/min-view-buffer-index" ] }, @@ -352,21 +378,25 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", + "@stdlib/math/base/special/abs", "@stdlib/napi/export", "@stdlib/napi/argv", "@stdlib/napi/argv-int64", "@stdlib/napi/argv-strided-float64array", - "@stdlib/napi/create-double", - "@stdlib/math/base/special/abs" + "@stdlib/napi/create-double" ] }, { @@ -375,15 +405,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -393,15 +427,19 @@ "blas": "", "wasm": false, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] }, @@ -412,15 +450,19 @@ "blas": "", "wasm": true, "src": [ - "./src/dasum.c" + "./src/dasum.c", + "./src/dasum_ndarray.c" ], "include": [ "./include" ], - "libraries": [], + "libraries": [ + "-lm" + ], "libpath": [], "dependencies": [ "@stdlib/blas/base/shared", + "@stdlib/strided/base/stride2offset", "@stdlib/math/base/special/abs" ] } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/addon.c b/lib/node_modules/@stdlib/blas/base/dasum/src/addon.c index 6d9debae8ac9..0fd3632c7d64 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/src/addon.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/addon.c @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2018 The Stdlib Authors. +* Copyright (c) 2024 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,10 +35,27 @@ static napi_value addon( napi_env env, napi_callback_info info ) { STDLIB_NAPI_ARGV( env, info, argv, argc, 3 ); STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 ); - STDLIB_NAPI_ARGV_INT64( env, strideX, argv, 2 ); - STDLIB_NAPI_ARGV_STRIDED_FLOAT64ARRAY( env, X, N, strideX, argv, 1 ); - STDLIB_NAPI_CREATE_DOUBLE( env, API_SUFFIX(c_dasum)( N, X, strideX ), v ); + STDLIB_NAPI_ARGV_INT64( env, stride, argv, 2 ); + STDLIB_NAPI_ARGV_STRIDED_FLOAT64ARRAY( env, X, N, stride, argv, 1 ); + STDLIB_NAPI_CREATE_DOUBLE( env, API_SUFFIX(c_dasum)( N, X, stride ), 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, 4 ); + STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 ); + STDLIB_NAPI_ARGV_INT64( env, stride, argv, 2 ); + STDLIB_NAPI_ARGV_INT64( env, offset, argv, 3 ); + STDLIB_NAPI_ARGV_STRIDED_FLOAT64ARRAY( env, X, N, stride, argv, 1 ); + STDLIB_NAPI_CREATE_DOUBLE( env, API_SUFFIX(c_dasum_ndarray)( N, X, stride, offset ), v ); + return v; +} + +STDLIB_NAPI_MODULE_EXPORT_FCN_WITH_METHOD( addon, "ndarray", addon_method ) diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum.c b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum.c index e1056889d9ec..dd938991d26c 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum.c @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2018 The Stdlib Authors. +* Copyright (c) 2024 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ #include "stdlib/blas/base/dasum.h" #include "stdlib/blas/base/shared.h" -#include "stdlib/math/base/special/abs.h" +#include "stdlib/strided/base/stride2offset.h" /** * Computes the sum of absolute values. @@ -26,37 +26,9 @@ * @param N number of indexed elements * @param X input array * @param stride stride length -* @return sum of absolute values +* @return sum */ double API_SUFFIX(c_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT stride ) { - CBLAS_INT m; - CBLAS_INT i; - double sum; - - sum = 0.0; - if ( N <= 0 || stride <= 0 ) { - return sum; - } - // If the stride is equal to `1`, use unrolled loops... - if ( stride == 1 ) { - m = N % 6; - - // If we have a remainder, run a clean-up loop... - if ( m > 0 ) { - for ( i = 0; i < m; i++ ) { - sum += stdlib_base_abs( X[i] ); - } - } - if ( N < 6 ) { - return sum; - } - for ( i = m; i < N; i += 6 ) { - sum += stdlib_base_abs( X[i] ) + stdlib_base_abs( X[i+1] ) + stdlib_base_abs( X[i+2] ) + stdlib_base_abs( X[i+3] ) + stdlib_base_abs( X[i+4] ) + stdlib_base_abs( X[i+5] ); - } - return sum; - } - for ( i = 0; i < N*stride; i += stride ) { - sum += stdlib_base_abs( X[i] ); - } - return sum; + CBLAS_INT ox = stdlib_strided_stride2offset( N, stride ); + return API_SUFFIX(c_dasum_ndarray)( N, X, stride, ox ); } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c index 303cad6bd108..5698a336cd77 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2018 The Stdlib Authors. +* Copyright (c) 2024 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ #include "stdlib/blas/base/dasum.h" #include "stdlib/blas/base/dasum_cblas.h" #include "stdlib/blas/base/shared.h" +#include "stdlib/strided/base/min_view_buffer_index.h" /** * Computes the sum of absolute values. @@ -26,8 +27,30 @@ * @param N number of indexed elements * @param X input array * @param stride stride length -* @return sum of absolute values +* @return sum */ double API_SUFFIX(c_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT stride ) { + CBLAS_INT sx = stride; + if ( sx < 0 ) { + sx = -sx; + } return API_SUFFIX(cblas_dasum)( N, X, stride ); } + +/** +* Computes the sum of absolute values using alternative indexing semantics. +* +* @param N number of indexed elements +* @param X input array +* @param stride stride length +* @param offset starting index +* @return sum +*/ +double API_SUFFIX(c_dasum_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT stride, const CBLAS_INT offset ) { + CBLAS_INT sx = stride; + if ( sx < 0 ) { + sx = -sx; + } + X += stdlib_strided_min_view_buffer_index( N, stride, offset ); // adjust array pointer + return API_SUFFIX(cblas_dasum)( N, X, sx ); +} diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_f.c b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_f.c index a2f8f1c59047..dfd08c0566ed 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_f.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_f.c @@ -1,7 +1,7 @@ /** * @license Apache-2.0 * -* Copyright (c) 2018 The Stdlib Authors. +* Copyright (c) 2024 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ #include "stdlib/blas/base/dasum.h" #include "stdlib/blas/base/dasum_fortran.h" #include "stdlib/blas/base/shared.h" +#include "stdlib/strided/base/min_view_buffer_index.h" /** * Computes the sum of absolute values. @@ -26,10 +27,38 @@ * @param N number of indexed elements * @param X input array * @param stride stride length -* @return sum of absolute values +* @return sum */ double API_SUFFIX(c_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT stride ) { + CBLAS_INT sx; double sum; - dasumsub( &N, X, &stride, &sum ); + + sx = stride; + if ( sx < 0 ) { + sx = -sx; + } + dasumsub( &N, X, &sx, &sum ); + return sum; +} + +/** +* Computes the sum of absolute values using alternative indexing semantics. +* +* @param N number of indexed elements +* @param X input array +* @param stride stride length +* @param offset starting index +* @return sum +*/ +double API_SUFFIX(c_dasum_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT stride, const CBLAS_INT offset ) { + CBLAS_INT sx; + double sum; + + sx = stride; + X += stdlib_strided_min_view_buffer_index( N, stride, offset ); // adjust array pointer + if ( sx < 0 ) { + sx = -sx; + } + dasumsub( &N, X, &sx, &sum ); return sum; } diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_ndarray.c b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_ndarray.c new file mode 100644 index 000000000000..4b242766893d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_ndarray.c @@ -0,0 +1,71 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include "stdlib/blas/base/dasum.h" +#include "stdlib/blas/base/shared.h" +#include "stdlib/math/base/special/abs.h" + +static const CBLAS_INT M = 6; + +/** +* Computes the sum of absolute values using alternative indexing semantics. +* +* @param N number of indexed elements +* @param X input array +* @param stride stride length +* @param offset starting index +* @return sum +*/ +double API_SUFFIX(c_dasum_ndarray)( const CBLAS_INT N, const double *X, const CBLAS_INT stride, const CBLAS_INT offset ) { + CBLAS_INT ix; + CBLAS_INT i; + CBLAS_INT m; + double sum; + + sum = 0.0; + if ( N <= 0 ) { + return sum; + } + ix = offset; + + // If the stride is equal to `1`, use unrolled loops... + if ( stride == 1 ) { + m = N % M; + + // If we have a remainder, run a clean-up loop... + if ( m > 0 ) { + for ( i = 0; i < m; i++ ) { + sum += stdlib_base_abs( X[ ix ] ); + ix += stride; + } + } + if ( N < M ) { + return sum; + } + for ( i = m; i < N; i += M ) { + sum += stdlib_base_abs( X[ ix ] ) + stdlib_base_abs( X[ ix+1 ] ) + stdlib_base_abs( X[ ix+2 ] ) + stdlib_base_abs( X[ ix+3 ] ) + stdlib_base_abs( X[ ix+4 ] ) + stdlib_base_abs( X[ ix+5 ] ); + ix += M; + } + return sum; + } + for ( i = 0; i < N; i ++ ) { + sum += stdlib_base_abs( X[ ix ] ); + ix += stride; + } + return sum; +} diff --git a/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.js b/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.js index 6b61954ad073..fafae44e2c59 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.js @@ -82,15 +82,23 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); -tape( 'if provided a `stride` parameter less than or equal to `0`, the function returns `0`', function test( t ) { +tape( 'the function supports specifying a negative stride', function test( t ) { var x; var y; + var N; - x = new Float64Array( [ 1.0, -2.0, 3.0, -4.0, 5.0 ] ); + x = new Float64Array([ + 1.0, // 2 + -2.0, + 3.0, // 1 + -4.0, + 5.0 + ]); + N = 2; - y = dasum( x.length, x, -1 ); + y = dasum( N, x, -2 ); - t.strictEqual( y, 0.0, 'returns expected value' ); + t.strictEqual( y, 4.0, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.native.js b/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.native.js index a6650e397ac3..796df0bd3d5e 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.native.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/test/test.dasum.native.js @@ -86,15 +86,23 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); -tape( 'if provided a `stride` parameter less than or equal to `0`, the function returns `0`', opts, function test( t ) { +tape( 'the function supports specifying a negative stride', opts, function test( t ) { var x; var y; + var N; - x = new Float64Array( [ 1.0, -2.0, 3.0, -4.0, 5.0 ] ); + x = new Float64Array([ + 1.0, // 2 + -2.0, + 3.0, // 1 + -4.0, + 5.0 + ]); + N = 2; - y = dasum( x.length, x, -1 ); + y = dasum( N, x, -2 ); - t.strictEqual( y, 0.0, 'returns expected value' ); + t.strictEqual( y, 4.0, 'returns expected value' ); t.end(); }); diff --git a/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.js b/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.js index fe7ad3527290..b0275b65bf9f 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.js @@ -106,7 +106,7 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); -tape( 'the function supports negative strides', function test( t ) { +tape( 'the function supports specifying a negative stride', function test( t ) { var x; var y; var N; diff --git a/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.native.js b/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.native.js index 0f8867ae078d..36f5cb263a03 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.native.js +++ b/lib/node_modules/@stdlib/blas/base/dasum/test/test.ndarray.native.js @@ -115,7 +115,7 @@ tape( 'if provided an `N` parameter less than or equal to `0`, the function retu t.end(); }); -tape( 'the function supports negative strides', opts, function test( t ) { +tape( 'the function supports specifying a negative stride', opts, function test( t ) { var x; var y; var N; From e7ce3c358aa09166ef37d37f85a358ba1698889e Mon Sep 17 00:00:00 2001 From: aman-095 Date: Tue, 24 Sep 2024 12:33:56 +0530 Subject: [PATCH 2/3] chore: resolve lint error --- lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c index 5698a336cd77..52b25cb25a78 100644 --- a/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c +++ b/lib/node_modules/@stdlib/blas/base/dasum/src/dasum_cblas.c @@ -34,7 +34,7 @@ double API_SUFFIX(c_dasum)( const CBLAS_INT N, const double *X, const CBLAS_INT if ( sx < 0 ) { sx = -sx; } - return API_SUFFIX(cblas_dasum)( N, X, stride ); + return API_SUFFIX(cblas_dasum)( N, X, sx ); } /** From 602c7e12346e45a72a1bb1d14b82855f6b06764d Mon Sep 17 00:00:00 2001 From: aman-095 Date: Tue, 24 Sep 2024 12:43:45 +0530 Subject: [PATCH 3/3] chore: remove unnecessary import --- lib/node_modules/@stdlib/blas/base/sasum/src/sasum_ndarray.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/node_modules/@stdlib/blas/base/sasum/src/sasum_ndarray.c b/lib/node_modules/@stdlib/blas/base/sasum/src/sasum_ndarray.c index d1c51dac91c2..106fbb96477d 100644 --- a/lib/node_modules/@stdlib/blas/base/sasum/src/sasum_ndarray.c +++ b/lib/node_modules/@stdlib/blas/base/sasum/src/sasum_ndarray.c @@ -18,7 +18,6 @@ #include "stdlib/blas/base/sasum.h" #include "stdlib/blas/base/shared.h" -#include "stdlib/strided/base/stride2offset.h" #include "stdlib/math/base/special/absf.h" static const CBLAS_INT M = 6;