Skip to content

feat: add blas/base/scnrm2 #2270

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 29 commits into from
Jun 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c3aab4b
feat: add BLAS Level 1 routine for scnrm2
aman-095 May 27, 2024
5453d22
chore: apply review changes
aman-095 May 27, 2024
9bb083a
bench: ensure arrays are of intended length
kgryte Jun 11, 2024
e50fcda
docs: update descriptions
kgryte Jun 11, 2024
4b7d1d8
bench: inline expression to avoid unnecessary reassignment
kgryte Jun 11, 2024
ef90a7c
refactor: update implementation
aman-095 Jun 19, 2024
ee25669
docs: update variable type description
aman-095 Jun 19, 2024
90bafad
chore: apply emulation of float32 arithmetic
aman-095 Jun 19, 2024
5ea715a
Merge branch 'stdlib-js:develop' into scnrm2
aman-095 Jun 19, 2024
0d073d4
feat: add C / Fortran implementation for scnrm2
aman-095 Jun 20, 2024
35e62a7
chore: apply review changes
aman-095 Jun 20, 2024
76f52c8
chore: resolve lint error
aman-095 Jun 20, 2024
9793d8a
chore: apply review changes
aman-095 Jun 21, 2024
10f1444
Merge branch 'develop' of https://github.com/stdlib-js/stdlib into pr…
kgryte Jun 22, 2024
fe7b972
docs: fix examples
kgryte Jun 22, 2024
90f1d59
docs: ensure examples are not completely trivial
kgryte Jun 22, 2024
99cd863
docs: convey input array is not mutated
kgryte Jun 22, 2024
00e3745
docs: update comment
kgryte Jun 22, 2024
7e69dc0
fix: ensure float32 emulation and add source comments
kgryte Jun 22, 2024
a7e989c
refactor: simplify implementation by using `abs2f`
kgryte Jun 22, 2024
42e6982
refactor: defer to ndarray implementation
kgryte Jun 22, 2024
d46acc9
docs: fix description
kgryte Jun 22, 2024
0ec88e7
refactor: update and clean-up implementation
kgryte Jun 22, 2024
4a684f6
refactor: clean-up implementation and update leading comment with cor…
kgryte Jun 22, 2024
5a53655
test: remove duplicate test file
kgryte Jun 22, 2024
5deb528
fix: use correct alias and update dependencies
kgryte Jun 22, 2024
5f09584
docs: update copy and examples
kgryte Jun 22, 2024
aa2833e
test: clean-up
kgryte Jun 22, 2024
3af24f4
fix: use correct macro name
kgryte Jun 22, 2024
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
267 changes: 267 additions & 0 deletions lib/node_modules/@stdlib/blas/base/scnrm2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,267 @@
<!--

@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.

-->

# scnrm2

> Compute the L2-norm of a complex single-precision floating-point vector.

<section class="usage">

## Usage

```javascript
var scnrm2 = require( '@stdlib/blas/base/scnrm2' );
```

#### scnrm2( N, cx, strideX )

Computes the L2-norm of a complex single-precision floating-point vector.

```javascript
var Complex64Array = require( '@stdlib/array/complex64' );

var cx = new Complex64Array( [ 0.3, 0.1, 0.5, 0.0, 0.0, 0.5, 0.0, 0.2 ] );

var norm = scnrm2( 4, cx, 1 );
// returns ~0.8
```

The function has the following parameters:

- **N**: number of indexed elements.
- **cx**: input [`Complex64Array`][@stdlib/array/complex64].
- **strideX**: index increment for `cx`.

The `N` and stride parameters determine which elements in the strided array are accessed at runtime. For example, to traverse every other value,

```javascript
var Complex64Array = require( '@stdlib/array/complex64' );

var cx = new Complex64Array( [ -2.0, 1.0, 3.0, -5.0, 4.0, 0.0, -1.0, -3.0 ] );

var norm = scnrm2( 2, cx, 2 );
// returns ~4.6
```

Note that indexing is relative to the first index. To introduce an offset, use [`typed array`][mdn-typed-array] views.

```javascript
var Complex64Array = require( '@stdlib/array/complex64' );

// Initial array:
var cx0 = new Complex64Array( [ 1.0, -2.0, 3.0, -4.0, 5.0, -6.0 ] );

// Create an offset view:
var cx1 = new Complex64Array( cx0.buffer, cx0.BYTES_PER_ELEMENT*1 ); // start at 2nd element

// Compute the L2-norm:
var norm = scnrm2( 2, cx1, 1 );
// returns ~9.3
```

#### scnrm2.ndarray( N, cx, strideX, offset )

Computes the L2-norm of a complex single-precision floating-point vector using alternative indexing semantics.

```javascript
var Complex64Array = require( '@stdlib/array/complex64' );

var cx = new Complex64Array( [ 0.3, 0.1, 0.5, 0.0, 0.0, 0.5, 0.0, 0.2 ] );

var norm = scnrm2.ndarray( 4, cx, 1, 0 );
// returns ~0.8
```

The function has the following additional parameters:

- **offsetX**: starting index.

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 start from the second index,

```javascript
var Complex64Array = require( '@stdlib/array/complex64' );

var cx = new Complex64Array( [ 1.0, -2.0, 3.0, -4.0, 5.0, -6.0 ] );

var norm = scnrm2.ndarray( 2, cx, 1, 1 );
// returns ~9.3
```

</section>

<!-- /.usage -->

<section class="notes">

## Notes

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

</section>

<!-- /.notes -->

<section class="examples">

## Examples

<!-- eslint no-undef: "error" -->

```javascript
var discreteUniform = require( '@stdlib/random/base/discrete-uniform' );
var filledarrayBy = require( '@stdlib/array/filled-by' );
var Complex64 = require( '@stdlib/complex/float32' );
var scnrm2 = require( '@stdlib/blas/base/scnrm2' );

function rand() {
return new Complex64( discreteUniform( 0, 10 ), discreteUniform( -5, 5 ) );
}

var cx = filledarrayBy( 10, 'complex64', rand );
console.log( cx.toString() );

// Compute the L2-norm:
var norm = scnrm2( cx.length, cx, 1 );
console.log( norm );
```

</section>

<!-- /.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/scnrm2.h"
```

#### c_scnrm2( N, \*CX, strideX )

Computes the L2-norm of a complex single-precision floating-point vector.

```c
const float cx[] = { 0.3f, 0.1f, 0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.2f };

float norm = c_scnrm2( 4, (void *)cx, 1 );
// returns 0.8
```

The function accepts the following arguments:

- **N**: `[in] CBLAS_INT` number of indexed elements.
- **CX**: `[in] void*` input array.
- **strideX**: `[in] CBLAS_INT` index increment for `CX`.

```c
float c_scnrm2( const CBLAS_INT N, const void *CX, const CBLAS_INT strideX );
```

</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/scnrm2.h"
#include <stdio.h>

int main( void ) {
// Create a strided array of interleaved real and imaginary components:
const float cx[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f };

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

// Specify stride length:
const int strideX = 1;

// Compute the L2-norm:
c_scnrm2( N, (void *)cx, strideX );

// Print the result:
printf( "L2-norm: %f\n", norm );
}
```

</section>

<!-- /.examples -->

</section>

<!-- /.c -->

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

<section class="related">

</section>

<!-- /.related -->

<!-- Section for all links. Make sure to keep an empty line after the `section` element and another before the `/section` close. -->

<section class="links">

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

[scnrm2]: https://www.netlib.org/lapack/explore-html/d1/d2a/group__nrm2_gaee5779d5d216a7cd8cf83488fb6bb175.html#gaee5779d5d216a7cd8cf83488fb6bb175

[@stdlib/array/complex64]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/array/complex64

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

</section>

<!-- /.links -->
92 changes: 92 additions & 0 deletions lib/node_modules/@stdlib/blas/base/scnrm2/benchmark/benchmark.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/**
* @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.
*/

'use strict';

// MODULES //

var bench = require( '@stdlib/bench' );
var uniform = require( '@stdlib/random/array/uniform' );
var isnanf = require( '@stdlib/math/base/assert/is-nanf' );
var pow = require( '@stdlib/math/base/special/pow' );
var Complex64Array = require( '@stdlib/array/complex64' );
var pkg = require( './../package.json' ).name;
var scnrm2 = require( './../lib/scnrm2.js' );


// VARIABLES //

var options = {
'dtype': 'float32'
};


// FUNCTIONS //

/**
* Create a benchmark function.
*
* @private
* @param {PositiveInteger} len - array length
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var cx = new Complex64Array( uniform( len*2, -10.0, 10.0, options ) );
return benchmark;

function benchmark( b ) {
var norm;
var i;

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
norm = scnrm2( cx.length, cx, 1 );
if ( isnanf( norm ) ) {
b.fail( 'should not return NaN' );
}
}
b.toc();
if ( isnanf( norm ) ) {
b.fail( 'should not return NaN' );
}
b.pass( 'benchmark finished' );
b.end();
}
}


// MAIN //

function main() {
var len;
var min;
var max;
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 );
}
}

main();
Loading
Loading