Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
c1b0918
feat: add C implementation for blas/base/zaxpy
gururaj1512 Dec 25, 2024
4c6ca76
fix: benchmark file and examples
gururaj1512 Dec 25, 2024
b22557e
fix: zaxpy.f file
gururaj1512 Dec 25, 2024
ac41a23
fix: replace dcabs intrinsic function with abs
gururaj1512 Dec 29, 2024
f1213f8
fix: native files
gururaj1512 Dec 29, 2024
b18061b
fix: lint erros
gururaj1512 Dec 29, 2024
99d13a7
fix: c-benchmark files
gururaj1512 Dec 29, 2024
5847c8c
test: add testcases to complete 100% code coverage
gururaj1512 Dec 29, 2024
98aae2b
bench: change variable names
ShabiShett07 Jul 5, 2025
2bde17e
docs: improve jsdoc and variable naming
ShabiShett07 Jul 5, 2025
411c9b1
chore: update repl.txt
ShabiShett07 Jul 5, 2025
dd429e6
chore: update examples
ShabiShett07 Jul 5, 2025
1bdb760
chore: change variable naming
ShabiShett07 Jul 6, 2025
d0512ae
chore: change variable naming
ShabiShett07 Jul 6, 2025
f975b3f
refactor: add ndarray implementation
ShabiShett07 Jul 6, 2025
f658422
chore: indentation and naming changes
ShabiShett07 Jul 6, 2025
672626c
chore: change in variable naming
ShabiShett07 Jul 6, 2025
2590157
chore: add ndarray support in native addons
ShabiShett07 Jul 6, 2025
6099206
chore: update markdown file
ShabiShett07 Jul 6, 2025
491177f
Merge branch 'develop' into blas-base-zaxpy
ShabiShett07 Jul 6, 2025
fb78c05
chore: improve early returning checks
ShabiShett07 Jul 6, 2025
33796e8
chore: add ndarray support
ShabiShett07 Jul 6, 2025
33b9c76
chore: update copyright years
stdlib-bot Jul 6, 2025
2d26a8c
chore: add appropriate header files
ShabiShett07 Jul 6, 2025
84598e3
refactor: improve ndarray implementation and update manifest.json
ShabiShett07 Jul 6, 2025
2bd731d
fix: chore scabs1 to dcabs1
ShabiShett07 Jul 6, 2025
7584e80
chore: update fortran files
ShabiShett07 Jul 6, 2025
556c18b
chore: update repl output
ShabiShett07 Jul 6, 2025
6c2d942
chore: add appropriate line endings
ShabiShett07 Jul 6, 2025
e469466
fix: change parameter declaration
ShabiShett07 Jul 6, 2025
d9e3660
fix: change parameter declaration
ShabiShett07 Jul 6, 2025
02afa53
fix: update Makefile
ShabiShett07 Jul 6, 2025
0e9372f
bench: add correct file paths
ShabiShett07 Jul 6, 2025
e6a5aef
fix: revert stats/base changes
ShabiShett07 Jul 9, 2025
6a5b090
chore: revert unintended changes in stats/base
ShabiShett07 Jul 9, 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
161 changes: 158 additions & 3 deletions lib/node_modules/@stdlib/blas/base/zaxpy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ The function has the following parameters:
- **N**: number of indexed elements.
- **alpha**: scalar [`Complex128`][@stdlib/complex/float64/ctor] constant.
- **x**: first input [`Complex128Array`][@stdlib/array/complex128].
- **strideX**: index increment for `x`.
- **strideX**: stride length for `x`.
- **y**: second input [`Complex128Array`][@stdlib/array/complex128].
- **strideY**: index increment for `y`.
- **strideY**: stride length for `y`.

The `N` and stride parameters determine how values from `x` are scaled by `alpha` and added to `y`. For example, to scale every other value in `x` by `alpha` and add the result to every other value of `y`,

Expand Down Expand Up @@ -137,6 +137,7 @@ zaxpy.ndarray( 3, alpha, x, 1, 1, y, 1, 1 );
## Notes

- If `N <= 0`, both functions return `y` unchanged.
- If `alpha === 0`, both functions return `y` unchanged.
- `zaxpy()` corresponds to the [BLAS][blas] level 1 function [`zaxpy`][zaxpy].

</section>
Expand Down Expand Up @@ -171,6 +172,14 @@ var alpha = new Complex128( 2.0, 2.0 );
// Scale values from `x` by `alpha` and add the result to `y`:
zaxpy( x.length, alpha, x, 1, y, 1 );

// Print the results:
logEach( '(%s)*(%s) + (%s) = %s', alpha, x, yc, y );

yc = zcopy( y.length, y, 1, zeros( y.length, 'complex128' ), 1 );

// Scale values from `x` by `alpha` and add the result to `y` using alternative indexing semantics:
zaxpy.ndarray( x.length, alpha, x, 1, 0, y, 1, 0 );

// Print the results:
logEach( '(%s)*(%s) + (%s) = %s', alpha, x, yc, y );
```
Expand All @@ -179,6 +188,152 @@ logEach( '(%s)*(%s) + (%s) = %s', alpha, x, yc, y );

<!-- /.examples -->

<!-- C interface documentation. -->

* * *

<section class="c">

## C APIs

<!-- Section to include introductory text. Make sure to keep an empty line after the intro `section` element and another before the `/section` close. -->

<section class="intro">

</section>

<!-- /.intro -->

<!-- C usage documentation. -->

<section class="usage">

### Usage

```c
#include "stdlib/blas/base/caxpy.h"
```

#### c_caxpy( N, alpha, \*X, strideX, \*Y, strideY )

Scales values from `X` by `alpha` and adds the result to `Y`.

```c
#include "stdlib/complex/float32/ctor.h"

float x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 };
float y[] = { -1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0 };
const stdlib_complex128_t alpha = stdlib_complex128( 2.0, 2.0 );

c_caxpy( 4, alpha, (void *)x, 1, (void *)y, 1 );
```

The function accepts the following arguments:

- **N**: `[in] CBLAS_INT` number of indexed elements.
- **alpha**: `[in] stdlib_complex128_t` scalar constant.
- **X**: `[in] void*` input array.
- **strideX**: `[in] CBLAS_INT` stride length for `X`.
- **Y**: `[inout] void*` output array.
- **strideY**: `[in] CBLAS_INT` stride length for `Y`.

```c
void c_caxpy( const CBLAS_INT N, const stdlib_complex128_t alpha, const void *x, const CBLAS_INT strideX, void *y, const CBLAS_INT strideY );
```

#### c_caxpy_ndarray( N, alpha, \*X, strideX, offsetX, \*Y, strideY, offsetY )

Scales values from `X` by `alpha` and adds the result to `Y` using alternative indexing semantics.

```c
#include "stdlib/complex/float32/ctor.h"

float x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 };
float y[] = { -1.0, -2.0, -3.0, -4.0, -5.0, -6.0, -7.0, -8.0 };
const stdlib_complex128_t alpha = stdlib_complex128( 2.0, 2.0 );

c_caxpy_ndarray( 4, alpha, (void *)x, 1, 0, (void *)y, 1, 0 );
```

The function accepts the following arguments:

- **N**: `[in] CBLAS_INT` number of indexed elements.
- **alpha**: `[in] stdlib_complex128_t` scalar constant.
- **X**: `[in] void*` input array.
- **strideX**: `[in] CBLAS_INT` stride length for `X`.
- **offsetX**: `[in] CBLAS_INT` starting index for `X`.
- **Y**: `[inout] void*` output array.
- **strideY**: `[in] CBLAS_INT` stride length for `Y`.
- **offsetY**: `[in] CBLAS_INT` starting index for `Y`.

```c
void c_caxpy_ndarray( const CBLAS_INT N, const stdlib_complex128_t alpha, const void *x, const CBLAS_INT strideX, const CBLAS_INT offsetX, void *y, const CBLAS_INT strideY, const CBLAS_INT offsetY );
```

</section>

<!-- /.usage -->

<!-- C API usage notes. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="notes">

</section>

<!-- /.notes -->

<!-- C API usage examples. -->

<section class="examples">

### Examples

```c
#include "stdlib/blas/base/caxpy.h"
#include "stdlib/complex/float32/ctor.h"
#include <stdio.h>

int main( void ) {
// Create strided arrays:
double x[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 };
double y[] = { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };

// Create a complex scalar:
const stdlib_complex128_t alpha = stdlib_complex128( 2.0, 2.0 );

// Specify the number of elements:
const int N = 4;

// Specify stride lengths:
const int strideX = 1;
const int strideY = 1;

// Scale values from `x` by `alpha` and add the result to `y`:
c_zaxpy( N, alpha, (void *)x, strideX, (void *)y, strideY );

// Print the result:
for ( int i = 0; i < N; i++ ) {
printf( "zaxpy[ %i ] = %lf + %lfj\n", i, y[ i * 2 ], y[ ( i * 2 ) + 1 ] );
}

// Scale values from `x` by `alpha` and add the result to `y` using alternative indexing semantics:
c_zaxpy_ndarray( N, alpha, (void *)x, strideX, 0, (void *)y, strideY, 0 );

// Print the result:
for ( int i = 0; i < N; i++ ) {
printf( "zaxpy[ %i ] = %lf + %lfj\n", i, y[ i * 2 ], y[ ( i * 2 ) + 1 ] );
}
}
```

</section>

<!-- /.examples -->

</section>

<!-- /.c -->

<!-- Section for related `stdlib` packages. Do not manually edit this section, as it is automatically populated. -->

<section class="related">
Expand All @@ -193,7 +348,7 @@ logEach( '(%s)*(%s) + (%s) = %s', alpha, x, yc, y );

[blas]: http://www.netlib.org/blas

[zaxpy]: https://www.netlib.org/lapack/explore-html/d5/d4b/group__axpy_ga0b7bac1f4d42514074a48f14f5f9caa0.html#ga0b7bac1f4d42514074a48f14f5f9caa0
[zaxpy]: https://www.netlib.org/lapack/explore-html/d5/d4b/group__axpy_gaf603daa00d5c723d0e409d9b2d011bf4.html

[mdn-typed-array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

Expand Down
20 changes: 10 additions & 10 deletions lib/node_modules/@stdlib/blas/base/zaxpy/benchmark/benchmark.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,17 @@ var options = {
* Creates a benchmark function.
*
* @private
* @param {PositiveInteger} len - array length
* @param {PositiveInteger} N - array length
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
function createBenchmark( N ) {
var viewY;
var alpha;
var x;
var y;

x = new Complex128Array( uniform( len*2, -100.0, 100.0, options ) );
y = new Complex128Array( uniform( len*2, -100.0, 100.0, options ) );
x = new Complex128Array( uniform( N*2, -100.0, 100.0, options ) );
y = new Complex128Array( uniform( N*2, -100.0, 100.0, options ) );

viewY = reinterpret( y, 0 );

Expand All @@ -74,12 +74,12 @@ function createBenchmark( len ) {
b.tic();
for ( i = 0; i < b.iterations; i++ ) {
zaxpy( x.length, alpha, x, 1, y, 1 );
if ( isnan( viewY[ i%(len*2) ] ) ) {
if ( isnan( viewY[ i%(N*2) ] ) ) {
b.fail( 'should not return NaN' );
}
}
b.toc();
if ( isnan( viewY[ i%(len*2) ] ) ) {
if ( isnan( viewY[ i%(N*2) ] ) ) {
b.fail( 'should not return NaN' );
}
b.pass( 'benchmark finished' );
Expand All @@ -96,19 +96,19 @@ function createBenchmark( len ) {
* @private
*/
function main() {
var len;
var min;
var max;
var N;
var f;
var i;

min = 1; // 10^min
max = 6; // 10^max

for ( i = min; i <= max; i++ ) {
len = pow( 10, i );
f = createBenchmark( len );
bench( pkg+':len='+len, f );
N = pow( 10, i );
f = createBenchmark( N );
bench( pkg+':size='+N, f );
}
}

Expand Down
120 changes: 120 additions & 0 deletions lib/node_modules/@stdlib/blas/base/zaxpy/benchmark/benchmark.native.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2025 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.
*/

'use strict';

// MODULES //

var resolve = require( 'path' ).resolve;
var bench = require( '@stdlib/bench' );
var uniform = require( '@stdlib/random/array/uniform' );
var isnan = require( '@stdlib/math/base/assert/is-nan' );
var pow = require( '@stdlib/math/base/special/pow' );
var Complex128Array = require( '@stdlib/array/complex128' );
var Complex128 = require( '@stdlib/complex/float64/ctor' );
var reinterpret = require( '@stdlib/strided/base/reinterpret-complex128' );
var tryRequire = require( '@stdlib/utils/try-require' );
var pkg = require( './../package.json' ).name;


// VARIABLES //

var zaxpy = tryRequire( resolve( __dirname, './../lib/zaxpy.native.js' ) );
var opts = {
'skip': ( zaxpy instanceof Error )
};
var options = {
'dtype': 'float64'
};


// FUNCTIONS //

/**
* Creates a benchmark function.
*
* @private
* @param {PositiveInteger} N - array length
* @returns {Function} benchmark function
*/
function createBenchmark( N ) {
var viewY;
var alpha;
var x;
var y;

x = new Complex128Array( uniform( N*2, -100.0, 100.0, options ) );
y = new Complex128Array( uniform( N*2, -100.0, 100.0, options ) );

viewY = reinterpret( y, 0 );

alpha = new Complex128( 1.0, 0.0 );

return benchmark;

/**
* Benchmark function.
*
* @private
* @param {Benchmark} b - benchmark instance
*/
function benchmark( b ) {
var i;

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
zaxpy( x.length, alpha, x, 1, y, 1 );
if ( isnan( viewY[ i%(N*2) ] ) ) {
b.fail( 'should not return NaN' );
}
}
b.toc();
if ( isnan( viewY[ i%(N*2) ] ) ) {
b.fail( 'should not return NaN' );
}
b.pass( 'benchmark finished' );
b.end();
}
}


// MAIN //

/**
* Main execution sequence.
*
* @private
*/
function main() {
var min;
var max;
var N;
var f;
var i;

min = 1; // 10^min
max = 6; // 10^max

for ( i = min; i <= max; i++ ) {
N = pow( 10, i );
f = createBenchmark( N );
bench( pkg+'::native:size='+N, opts, f );
}
}

main();
Loading
Loading