Skip to content

Commit 7462db7

Browse files
aman-095kgrytestdlib-bot
authored
feat: add C ndarray implementation for blas/base/zdrot
PR-URL: #3069 Ref: #2039 Co-authored-by: Athan Reines <[email protected]> Reviewed-by: Athan Reines <[email protected]> Signed-off-by: Athan Reines <[email protected]> Co-authored-by: stdlib-bot <[email protected]>
1 parent 52e9aa8 commit 7462db7

File tree

11 files changed

+274
-76
lines changed

11 files changed

+274
-76
lines changed

lib/node_modules/@stdlib/blas/base/zdrot/README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,33 @@ The function accepts the following arguments:
312312
void c_zdrot( const CBLAS_INT N, void *X, const CBLAS_INT strideX, void *Y, const CBLAS_INT strideY, const double c, const double s );
313313
```
314314

315+
#### c_zdrot_ndarray( N, \*X, strideX, offsetX, \*Y, strideY, offsetY, c, s )
316+
317+
Applies a plane rotation using alternative indexing semantics.
318+
319+
```c
320+
double x[] = { 1.0, 2.0, 3.0, 4.0 }; // interleaved real and imaginary components
321+
double y[] = { 5.0, 6.0, 7.0, 8.0 };
322+
323+
c_zdrot_ndarray( 2, (void *)x, 1, 0, (void *)y, 1, 0, 0.8, 0.6 );
324+
```
325+
326+
The function accepts the following arguments:
327+
328+
- **N**: `[in] CBLAS_INT` number of indexed elements.
329+
- **zx**: `[inout] void*` first input array.
330+
- **strideX**: `[in] CBLAS_INT` index increment for `zx`.
331+
- **offsetX**: `[in] CBLAS_INT` starting index for `zx`.
332+
- **zy**: `[inout] void*` second input array.
333+
- **strideY**: `[in] CBLAS_INT` index increment for `zy`.
334+
- **offsetY**: `[in] CBLAS_INT` starting index for `zy`.
335+
- **c**: `[in] double` cosine of the angle of rotation.
336+
- **s**: `[in] double` sine of the angle of rotation.
337+
338+
```c
339+
void c_zdrot_ndarray( const CBLAS_INT N, void *X, const CBLAS_INT strideX, const CBLAS_INT offsetX, void *Y, const CBLAS_INT strideY, const CBLAS_INT offsetY, const double c, const double s );
340+
```
341+
315342
</section>
316343

317344
<!-- /.usage -->

lib/node_modules/@stdlib/blas/base/zdrot/benchmark/c/benchmark.length.c

Lines changed: 44 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 x[ len*2 ];
100100
double y[ len*2 ];
@@ -122,6 +122,41 @@ static double benchmark( int iterations, int len ) {
122122
return elapsed;
123123
}
124124

125+
/**
126+
* Runs a benchmark.
127+
*
128+
* @param iterations number of iterations
129+
* @param len array length
130+
* @return elapsed time in seconds
131+
*/
132+
static double benchmark2( int iterations, int len ) {
133+
double elapsed;
134+
double x[ len*2 ];
135+
double y[ len*2 ];
136+
double t;
137+
int i;
138+
139+
for ( i = 0; i < len; i++ ) {
140+
x[ i ] = ( rand_double()*10000.0 ) - 5000.0;
141+
x[ i+1 ] = ( rand_double()*10000.0 ) - 5000.0;
142+
y[ i ] = ( rand_double()*10000.0 ) - 5000.0;
143+
y[ i+1 ] = ( rand_double()*10000.0 ) - 5000.0;
144+
}
145+
t = tic();
146+
for ( i = 0; i < iterations; i++ ) {
147+
c_zdrot_ndarray( len, (void *)x, 1, 0, (void *)y, 1, 0, 0.8, 0.6 );
148+
if ( y[ 0 ] != y[ 0 ] ) {
149+
printf( "should not return NaN\n" );
150+
break;
151+
}
152+
}
153+
elapsed = tic() - t;
154+
if ( y[ 0 ] != y[ 0 ] ) {
155+
printf( "should not return NaN\n" );
156+
}
157+
return elapsed;
158+
}
159+
125160
/**
126161
* Main execution sequence.
127162
*/
@@ -144,7 +179,14 @@ int main( void ) {
144179
for ( j = 0; j < REPEATS; j++ ) {
145180
count += 1;
146181
printf( "# c::%s:len=%d\n", NAME, len );
147-
elapsed = benchmark( iter, len );
182+
elapsed = benchmark1( iter, len );
183+
print_results( iter, elapsed );
184+
printf( "ok %d benchmark finished\n", count );
185+
}
186+
for ( j = 0; j < REPEATS; j++ ) {
187+
count += 1;
188+
printf( "# c::%s:ndarray:len=%d\n", NAME, len );
189+
elapsed = benchmark2( iter, len );
148190
print_results( iter, elapsed );
149191
printf( "ok %d benchmark finished\n", count );
150192
}

lib/node_modules/@stdlib/blas/base/zdrot/examples/c/example.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,12 @@ int main( void ) {
3838
printf( "x[ %i ] = %lf + %lfj\n", i, x[ i*2 ], x[ (i*2)+1 ] );
3939
printf( "y[ %i ] = %lf + %lfj\n", i, y[ i*2 ], y[ (i*2)+1 ] );
4040
}
41+
42+
c_zdrot_ndarray( N, (void *)x, -strideX, N-1, (void *)y, strideY, N-1, 0.8, 0.6 );
43+
44+
// Print the result:
45+
for ( int i = 0; i < N; i++ ) {
46+
printf( "x[ %i ] = %lf + %lfj\n", i, x[ i*2 ], x[ (i*2)+1 ] );
47+
printf( "y[ %i ] = %lf + %lfj\n", i, y[ i*2 ], y[ (i*2)+1 ] );
48+
}
4149
}

lib/node_modules/@stdlib/blas/base/zdrot/include/stdlib/blas/base/zdrot.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ extern "C" {
3636
*/
3737
void API_SUFFIX(c_zdrot)( const CBLAS_INT N, void *ZX, const CBLAS_INT strideX, void *ZY, const CBLAS_INT strideY, const double c, const double s );
3838

39+
/**
40+
* Applies a plane rotation using alternative indexing semantics.
41+
*/
42+
void API_SUFFIX(c_zdrot_ndarray)( const CBLAS_INT N, void *ZX, const CBLAS_INT strideX, const CBLAS_INT offsetX, void *ZY, const CBLAS_INT strideY, const CBLAS_INT offsetY, const double c, const double s );
43+
3944
#ifdef __cplusplus
4045
}
4146
#endif

lib/node_modules/@stdlib/blas/base/zdrot/lib/ndarray.native.js

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
// MODULES //
2222

2323
var reinterpret = require( '@stdlib/strided/base/reinterpret-complex128' );
24-
var minViewBufferIndex = require( '@stdlib/strided/base/min-view-buffer-index' );
2524
var addon = require( './../src/addon.node' );
2625

2726

@@ -70,16 +69,9 @@ var addon = require( './../src/addon.node' );
7069
* // returns ~1.6
7170
*/
7271
function zdrot( N, zx, strideX, offsetX, zy, strideY, offsetY, c, s ) {
73-
var viewX;
74-
var viewY;
75-
76-
offsetX = minViewBufferIndex( N, strideX, offsetX );
77-
offsetY = minViewBufferIndex( N, strideY, offsetY );
78-
79-
viewX = reinterpret( zx, offsetX );
80-
viewY = reinterpret( zy, offsetY );
81-
82-
addon( N, viewX, strideX, viewY, strideY, c, s );
72+
var viewX = reinterpret( zx, 0 );
73+
var viewY = reinterpret( zy, 0 );
74+
addon.ndarray( N, viewX, strideX, offsetX, viewY, strideY, offsetY, c, s );
8375
return zy;
8476
}
8577

lib/node_modules/@stdlib/blas/base/zdrot/manifest.json

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,12 @@
4545
"dependencies": [
4646
"@stdlib/napi/export",
4747
"@stdlib/napi/argv",
48+
"@stdlib/strided/base/min-view-buffer-index",
4849
"@stdlib/napi/argv-int64",
4950
"@stdlib/napi/argv-double",
5051
"@stdlib/napi/argv-strided-complex128array",
51-
"@stdlib/blas/base/shared"
52+
"@stdlib/blas/base/shared",
53+
"@stdlib/complex/float64/ctor"
5254
]
5355
},
5456
{
@@ -57,7 +59,8 @@
5759
"blas": "",
5860
"wasm": false,
5961
"src": [
60-
"./src/zdrot.c"
62+
"./src/zdrot.c",
63+
"./src/zdrot_ndarray.c"
6164
],
6265
"include": [
6366
"./include"
@@ -75,7 +78,8 @@
7578
"blas": "",
7679
"wasm": false,
7780
"src": [
78-
"./src/zdrot.c"
81+
"./src/zdrot.c",
82+
"./src/zdrot_ndarray.c"
7983
],
8084
"include": [
8185
"./include"
@@ -107,10 +111,12 @@
107111
"dependencies": [
108112
"@stdlib/napi/export",
109113
"@stdlib/napi/argv",
114+
"@stdlib/strided/base/min-view-buffer-index",
110115
"@stdlib/napi/argv-int64",
111116
"@stdlib/napi/argv-double",
112117
"@stdlib/napi/argv-strided-complex128array",
113-
"@stdlib/blas/base/shared"
118+
"@stdlib/blas/base/shared",
119+
"@stdlib/complex/float64/ctor"
114120
]
115121
},
116122
{
@@ -130,7 +136,9 @@
130136
],
131137
"libpath": [],
132138
"dependencies": [
133-
"@stdlib/blas/base/shared"
139+
"@stdlib/blas/base/shared",
140+
"@stdlib/strided/base/min-view-buffer-index",
141+
"@stdlib/complex/float64/ctor"
134142
]
135143
},
136144
{
@@ -150,7 +158,9 @@
150158
],
151159
"libpath": [],
152160
"dependencies": [
153-
"@stdlib/blas/base/shared"
161+
"@stdlib/blas/base/shared",
162+
"@stdlib/strided/base/min-view-buffer-index",
163+
"@stdlib/complex/float64/ctor"
154164
]
155165
},
156166

@@ -171,10 +181,12 @@
171181
"dependencies": [
172182
"@stdlib/napi/export",
173183
"@stdlib/napi/argv",
184+
"@stdlib/strided/base/min-view-buffer-index",
174185
"@stdlib/napi/argv-int64",
175186
"@stdlib/napi/argv-double",
176187
"@stdlib/napi/argv-strided-complex128array",
177-
"@stdlib/blas/base/shared"
188+
"@stdlib/blas/base/shared",
189+
"@stdlib/complex/float64/ctor"
178190
]
179191
},
180192
{
@@ -183,7 +195,8 @@
183195
"blas": "",
184196
"wasm": false,
185197
"src": [
186-
"./src/zdrot.c"
198+
"./src/zdrot.c",
199+
"./src/zdrot_ndarray.c"
187200
],
188201
"include": [
189202
"./include"
@@ -201,7 +214,8 @@
201214
"blas": "",
202215
"wasm": false,
203216
"src": [
204-
"./src/zdrot.c"
217+
"./src/zdrot.c",
218+
"./src/zdrot_ndarray.c"
205219
],
206220
"include": [
207221
"./include"
@@ -232,10 +246,12 @@
232246
"dependencies": [
233247
"@stdlib/napi/export",
234248
"@stdlib/napi/argv",
249+
"@stdlib/strided/base/min-view-buffer-index",
235250
"@stdlib/napi/argv-int64",
236251
"@stdlib/napi/argv-double",
237252
"@stdlib/napi/argv-strided-complex128array",
238-
"@stdlib/blas/base/shared"
253+
"@stdlib/blas/base/shared",
254+
"@stdlib/complex/float64/ctor"
239255
]
240256
},
241257
{
@@ -254,7 +270,9 @@
254270
],
255271
"libpath": [],
256272
"dependencies": [
257-
"@stdlib/blas/base/shared"
273+
"@stdlib/blas/base/shared",
274+
"@stdlib/strided/base/min-view-buffer-index",
275+
"@stdlib/complex/float64/ctor"
258276
]
259277
},
260278
{
@@ -273,7 +291,9 @@
273291
],
274292
"libpath": [],
275293
"dependencies": [
276-
"@stdlib/blas/base/shared"
294+
"@stdlib/blas/base/shared",
295+
"@stdlib/strided/base/min-view-buffer-index",
296+
"@stdlib/complex/float64/ctor"
277297
]
278298
},
279299

@@ -296,10 +316,12 @@
296316
"dependencies": [
297317
"@stdlib/napi/export",
298318
"@stdlib/napi/argv",
319+
"@stdlib/strided/base/min-view-buffer-index",
299320
"@stdlib/napi/argv-int64",
300321
"@stdlib/napi/argv-double",
301322
"@stdlib/napi/argv-strided-complex128array",
302-
"@stdlib/blas/base/shared"
323+
"@stdlib/blas/base/shared",
324+
"@stdlib/complex/float64/ctor"
303325
]
304326
},
305327
{
@@ -319,7 +341,9 @@
319341
],
320342
"libpath": [],
321343
"dependencies": [
322-
"@stdlib/blas/base/shared"
344+
"@stdlib/blas/base/shared",
345+
"@stdlib/strided/base/min-view-buffer-index",
346+
"@stdlib/complex/float64/ctor"
323347
]
324348
},
325349
{
@@ -339,7 +363,9 @@
339363
],
340364
"libpath": [],
341365
"dependencies": [
342-
"@stdlib/blas/base/shared"
366+
"@stdlib/blas/base/shared",
367+
"@stdlib/strided/base/min-view-buffer-index",
368+
"@stdlib/complex/float64/ctor"
343369
]
344370
},
345371

@@ -349,7 +375,8 @@
349375
"blas": "",
350376
"wasm": false,
351377
"src": [
352-
"./src/zdrot.c"
378+
"./src/zdrot.c",
379+
"./src/zdrot_ndarray.c"
353380
],
354381
"include": [
355382
"./include"
@@ -372,7 +399,8 @@
372399
"blas": "",
373400
"wasm": false,
374401
"src": [
375-
"./src/zdrot.c"
402+
"./src/zdrot.c",
403+
"./src/zdrot_ndarray.c"
376404
],
377405
"include": [
378406
"./include"
@@ -390,7 +418,8 @@
390418
"blas": "",
391419
"wasm": false,
392420
"src": [
393-
"./src/zdrot.c"
421+
"./src/zdrot.c",
422+
"./src/zdrot_ndarray.c"
394423
],
395424
"include": [
396425
"./include"
@@ -409,7 +438,8 @@
409438
"blas": "",
410439
"wasm": true,
411440
"src": [
412-
"./src/zdrot.c"
441+
"./src/zdrot.c",
442+
"./src/zdrot_ndarray.c"
413443
],
414444
"include": [
415445
"./include"

lib/node_modules/@stdlib/blas/base/zdrot/src/addon.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,26 @@ static napi_value addon( napi_env env, napi_callback_info info ) {
4545
return NULL;
4646
}
4747

48-
STDLIB_NAPI_MODULE_EXPORT_FCN( addon )
48+
/**
49+
* Receives JavaScript callback invocation data.
50+
*
51+
* @param env environment under which the function is invoked
52+
* @param info callback data
53+
* @return Node-API value
54+
*/
55+
static napi_value addon_method( napi_env env, napi_callback_info info ) {
56+
STDLIB_NAPI_ARGV( env, info, argv, argc, 9 );
57+
STDLIB_NAPI_ARGV_INT64( env, N, argv, 0 );
58+
STDLIB_NAPI_ARGV_INT64( env, strideX, argv, 2 );
59+
STDLIB_NAPI_ARGV_INT64( env, offsetX, argv, 3 );
60+
STDLIB_NAPI_ARGV_INT64( env, strideY, argv, 5 );
61+
STDLIB_NAPI_ARGV_INT64( env, offsetY, argv, 6 );
62+
STDLIB_NAPI_ARGV_DOUBLE( env, c, argv, 7 );
63+
STDLIB_NAPI_ARGV_DOUBLE( env, s, argv, 8 );
64+
STDLIB_NAPI_ARGV_STRIDED_COMPLEX128ARRAY( env, X, N, strideX, argv, 1 );
65+
STDLIB_NAPI_ARGV_STRIDED_COMPLEX128ARRAY( env, Y, N, strideY, argv, 4 );
66+
API_SUFFIX(c_zdrot_ndarray)( N, (void *)X, strideX, offsetX, (void *)Y, strideY, offsetY, c, s );
67+
return NULL;
68+
}
69+
70+
STDLIB_NAPI_MODULE_EXPORT_FCN_WITH_METHOD( addon, "ndarray", addon_method )

0 commit comments

Comments
 (0)