From 9ac43d224e09e0cf3c9be9ba8f3bbbaca2dcbbc9 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Fri, 2 Oct 2026 13:13:31 +0200 Subject: [PATCH] feat: add C implementation for blas/ext/base/ndarray/dcartesian-product Add the ndarray C adapter, Node-API bridge and Fortran-aware native build metadata. Preserve the JavaScript fallback and cover Cartesian ordering, column-major layouts, strides, offsets and special values in native parity tests. Assisted-by: OpenAI Codex --- .../base/ndarray/dcartesian-product/README.md | 120 ++++ .../benchmark/benchmark.native.js | 116 ++++ .../dcartesian-product/benchmark/c/Makefile | 146 +++++ .../benchmark/c/benchmark.length.c | 231 ++++++++ .../ndarray/dcartesian-product/binding.gyp | 265 +++++++++ .../dcartesian-product/examples/c/Makefile | 146 +++++ .../dcartesian-product/examples/c/example.c | 78 +++ .../ndarray/dcartesian-product/include.gypi | 53 ++ .../ext/base/ndarray/dcartesian_product.h | 40 ++ .../ndarray/dcartesian-product/lib/index.js | 16 +- .../ndarray/dcartesian-product/lib/native.js | 76 +++ .../ndarray/dcartesian-product/manifest.json | 110 ++++ .../ndarray/dcartesian-product/package.json | 4 + .../ndarray/dcartesian-product/src/Makefile | 70 +++ .../ndarray/dcartesian-product/src/addon.c | 70 +++ .../ndarray/dcartesian-product/src/main.c | 53 ++ .../ndarray/dcartesian-product/test/test.js | 230 +++++++- .../dcartesian-product/test/test.main.js | 511 +++++++++++++++++ .../dcartesian-product/test/test.native.js | 520 ++++++++++++++++++ 19 files changed, 2852 insertions(+), 3 deletions(-) create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/benchmark/benchmark.native.js create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/benchmark/c/Makefile create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/benchmark/c/benchmark.length.c create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/binding.gyp create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/examples/c/Makefile create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/examples/c/example.c create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/include.gypi create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/include/stdlib/blas/ext/base/ndarray/dcartesian_product.h create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/lib/native.js create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/manifest.json create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/src/Makefile create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/src/addon.c create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/src/main.c create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/test/test.main.js create mode 100644 lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/test/test.native.js diff --git a/lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/README.md b/lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/README.md index f6a6f9b254df..006c77a3bb83 100644 --- a/lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/README.md +++ b/lib/node_modules/@stdlib/blas/ext/base/ndarray/dcartesian-product/README.md @@ -113,6 +113,126 @@ console.log( ndarray2array( v ) ); + + +* * * + +
+ +## C APIs + +
+ +### Usage + +```c +#include "stdlib/blas/ext/base/ndarray/dcartesian_product.h" +``` + +#### stdlib_blas_ext_dcartesian_product( arrays ) + +Computes the Cartesian product for two double-precision floating-point ndarrays and stores each pair in a row of a two-dimensional output ndarray. + +The function accepts the following arguments: + +- **arrays**: `[in] struct ndarray**` list containing two one-dimensional input ndarrays and a two-dimensional output ndarray. + +```c +void stdlib_blas_ext_dcartesian_product( const struct ndarray *arrays[] ); +``` + +
+ + + +
+ +### Notes + +- For inputs of lengths `M` and `N`, the output ndarray should have shape `[M*N, 2]`. +- The first column contains elements from the first input and the second column contains elements from the second input. +- If `M <= 0` or `N <= 0`, the output ndarray is unchanged. +- C ndarray strides and offsets are specified in bytes. The function supports independently strided input and output views. + +
+ + + +
+ +### Examples + +```c +#include "stdlib/blas/ext/base/ndarray/dcartesian_product.h" +#include "stdlib/ndarray/ctor.h" +#include "stdlib/ndarray/dtypes.h" +#include "stdlib/ndarray/index_modes.h" +#include "stdlib/ndarray/orders.h" +#include "stdlib/ndarray/base/bytes_per_element.h" +#include +#include +#include + +int main( void ) { + // Create data buffers: + const double dataX[] = { 1.0, 2.0 }; + const double dataY[] = { 3.0, 4.0, 5.0 }; + double dataOut[ 12 ]; + + // Specify input and output shapes: + int64_t shapeX[] = { 2 }; + int64_t shapeY[] = { 3 }; + int64_t shapeOut[] = { 6, 2 }; + + // Specify byte strides: + int64_t strides[] = { STDLIB_NDARRAY_FLOAT64_BYTES_PER_ELEMENT }; + int64_t stridesOut[] = { + 2 * STDLIB_NDARRAY_FLOAT64_BYTES_PER_ELEMENT, + STDLIB_NDARRAY_FLOAT64_BYTES_PER_ELEMENT + }; + + const enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; + const enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; + int8_t submodes[] = { STDLIB_NDARRAY_INDEX_ERROR }; + + // Create input and output ndarrays: + // cppcheck-suppress invalidPointerCast + struct ndarray *x = stdlib_ndarray_allocate( STDLIB_NDARRAY_FLOAT64, (uint8_t *)dataX, 1, shapeX, strides, 0, order, imode, 1, submodes ); + + // cppcheck-suppress invalidPointerCast + struct ndarray *y = stdlib_ndarray_allocate( STDLIB_NDARRAY_FLOAT64, (uint8_t *)dataY, 1, shapeY, strides, 0, order, imode, 1, submodes ); + + // cppcheck-suppress invalidPointerCast + struct ndarray *out = stdlib_ndarray_allocate( STDLIB_NDARRAY_FLOAT64, (uint8_t *)dataOut, 2, shapeOut, stridesOut, 0, order, imode, 1, submodes ); + if ( x == NULL || y == NULL || out == NULL ) { + stdlib_ndarray_free( x ); + stdlib_ndarray_free( y ); + stdlib_ndarray_free( out ); + fprintf( stderr, "Error allocating memory.\n" ); + exit( 1 ); + } + + const struct ndarray *arrays[] = { x, y, out }; + stdlib_blas_ext_dcartesian_product( arrays ); + + // Print the resulting pairs: + for ( int i = 0; i < 6; i++ ) { + printf( "out[ %i ] = ( %lf, %lf )\n", i, dataOut[ i*2 ], dataOut[ (i*2)+1 ] ); + } + stdlib_ndarray_free( x ); + stdlib_ndarray_free( y ); + stdlib_ndarray_free( out ); +} +``` + +
+ + + +
+ + +