/** * @license Apache-2.0 * * Copyright (c) {{YEAR}} {{COPYRIGHT}}. * * 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/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" #include "stdlib/ndarray/base/unary/typedefs.h" #include "stdlib/ndarray/base/unary/macros.h" #include "stdlib/ndarray/base/unary/dispatch_object.h" #include "stdlib/ndarray/base/unary/dispatch.h" #include "stdlib/ndarray/ctor.h" #include /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a zero-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a zero-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES_0D}} }; * uint8_t ybuf[] = { {{Y_BYTES_0D}} }; * * // Define the number of dimensions: * int64_t ndims = 0; * * // Define the array shapes: * int64_t shape[] = {}; * * // Define the strides: * int64_t sx[] = { 0 }; * int64_t sy[] = { 0 }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( xydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_0d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_0d( struct ndarray *arrays[], void *fcn ) { {{INPUT_DTYPE}} v; int8_t status = stdlib_ndarray_iget_{{X_NDARRAY_DTYPE_ALIAS}}( arrays[ 0 ], 0, &v ); if ( status != 0 ) { return -1; } typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; status = stdlib_ndarray_iset_{{X_NDARRAY_DTYPE_ALIAS}}( arrays[ 1 ], 0, {{CALLBACK_OUTPUT_CAST}}f( {{CALLBACK_INPUT_CAST}}v ) ); if ( status != 0 ) { return -1; } return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a one-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a one-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 1; * * // Define the array shapes: * int64_t shape[] = { 2 }; * * // Define the strides: * int64_t sx[] = { {{X_BYTES_PER_ELEMENT}} }; * int64_t sy[] = { {{Y_BYTES_PER_ELEMENT}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_1d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_1d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_1D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a two-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a two-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 2; * * // Define the array shapes: * int64_t shape[] = { 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_2D}} }; * int64_t sy[] = { {{Y_STRIDES_2D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_2D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a two-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a two-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 2; * * // Define the array shapes: * int64_t shape[] = { 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_2D}} }; * int64_t sy[] = { {{Y_STRIDES_2D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_2D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a three-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a three-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 3; * * // Define the array shapes: * int64_t shape[] = { 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_3D}} }; * int64_t sy[] = { {{Y_STRIDES_3D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_3D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a three-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a three-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 3; * * // Define the array shapes: * int64_t shape[] = { 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_3D}} }; * int64_t sy[] = { {{Y_STRIDES_3D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_3D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a four-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a four-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 4; * * // Define the array shapes: * int64_t shape[] = { 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_4D}} }; * int64_t sy[] = { {{Y_STRIDES_4D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_4D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a four-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a four-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 4; * * // Define the array shapes: * int64_t shape[] = { 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_4D}} }; * int64_t sy[] = { {{Y_STRIDES_4D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_4D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a five-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a five-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 5; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_5D}} }; * int64_t sy[] = { {{Y_STRIDES_5D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_5D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a five-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a five-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 5; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_5D}} }; * int64_t sy[] = { {{Y_STRIDES_5D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_5D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a six-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a six-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 6; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_6D}} }; * int64_t sy[] = { {{Y_STRIDES_6D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_6D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a six-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a six-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 6; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_6D}} }; * int64_t sy[] = { {{Y_STRIDES_6D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_6D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a seven-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a seven-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 7; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_7D}} }; * int64_t sy[] = { {{Y_STRIDES_7D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_7D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a seven-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a seven-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 7; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_7D}} }; * int64_t sy[] = { {{Y_STRIDES_7D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_7D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to an eight-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in an eight-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 8; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_8D}} }; * int64_t sy[] = { {{Y_STRIDES_8D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_8D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to an eight-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in an eight-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 8; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_8D}} }; * int64_t sy[] = { {{Y_STRIDES_8D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_8D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a nine-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a nine-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 9; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_9D}} }; * int64_t sy[] = { {{Y_STRIDES_9D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_9D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a nine-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a nine-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 9; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_9D}} }; * int64_t sy[] = { {{Y_STRIDES_9D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_9D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a ten-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a ten-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 10; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_10D}} }; * int64_t sy[] = { {{Y_STRIDES_10D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_10D_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to a ten-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in a ten-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 10; * * // Define the array shapes: * int64_t shape[] = { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_10D}} }; * int64_t sy[] = { {{Y_STRIDES_10D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d_blocked( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d_blocked( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_10D_BLOCKED_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to an n-dimensional {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in an n-dimensional {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 3; * * // Define the array shapes: * int64_t shape[] = { 2, 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_3D}} }; * int64_t sy[] = { {{Y_STRIDES_3D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}_nd( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}_nd( struct ndarray *arrays[], void *fcn ) { typedef {{CALLBACK_DTYPE}} func_type( const {{CALLBACK_DTYPE}} x ); func_type *f = (func_type *)fcn; STDLIB_NDARRAY_UNARY_ND_LOOP_CLBK( {{INPUT_DTYPE}}, {{OUTPUT_DTYPE}} ) return 0; } // Define a list of unary ndarray functions: static ndarrayUnaryFcn functions[] = { stdlib_ndarray_{{FUNCTION_SUFFIX}}_0d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_1d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d, stdlib_ndarray_{{FUNCTION_SUFFIX}}_nd }; // Define a list of unary ndarray functions implementing loop blocking... static ndarrayUnaryFcn blocked_functions[] = { stdlib_ndarray_{{FUNCTION_SUFFIX}}_2d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_3d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_4d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_5d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_6d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_7d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_8d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_9d_blocked, stdlib_ndarray_{{FUNCTION_SUFFIX}}_10d_blocked }; // Create a unary function dispatch object: static const struct ndarrayUnaryDispatchObject obj = { // Array containing unary ndarray functions: functions, // Number of unary ndarray functions: 12, // Array containing unary ndarray functions using loop blocking: blocked_functions, // Number of unary ndarray functions using loop blocking: 9 }; /** * Applies a unary callback accepting and returning {{DESCRIPTION_CALLBACK_DTYPE}} to an {{DESCRIPTION_INPUT_DTYPE}} input ndarray and assigns results to elements in an {{DESCRIPTION_OUTPUT_DTYPE}} output ndarray. * * ## Notes * * - If successful, the functions returns `0`; otherwise, the function returns an error code. * * @param arrays array whose first element is a pointer to an input ndarray and whose last element is a pointer to an output ndarray * @param fcn callback * @return status code * * @example * #include "stdlib/ndarray/base/unary/{{FUNCTION_SUFFIX}}.h" * #include "stdlib/ndarray/dtypes.h" * #include "stdlib/ndarray/index_modes.h" * #include "stdlib/ndarray/orders.h" * #include "stdlib/ndarray/ctor.h" * #include * #include * #include * * // Define the ndarray data types: * enum STDLIB_NDARRAY_DTYPE xdtype = STDLIB_NDARRAY_{{X_NDARRAY_DTYPE}}; * enum STDLIB_NDARRAY_DTYPE ydtype = STDLIB_NDARRAY_{{Y_NDARRAY_DTYPE}}; * * // Create underlying byte arrays: * uint8_t xbuf[] = { {{X_BYTES}} }; * uint8_t ybuf[] = { {{Y_BYTES}} }; * * // Define the number of dimensions: * int64_t ndims = 2; * * // Define the array shapes: * int64_t shape[] = { 2, 2 }; * * // Define the strides: * int64_t sx[] = { {{X_STRIDES_2D}} }; * int64_t sy[] = { {{Y_STRIDES_2D}} }; * * // Define the offsets: * int64_t ox = 0; * int64_t oy = 0; * * // Define the array order: * enum STDLIB_NDARRAY_ORDER order = STDLIB_NDARRAY_ROW_MAJOR; * * // Specify the index mode: * enum STDLIB_NDARRAY_INDEX_MODE imode = STDLIB_NDARRAY_INDEX_ERROR; * * // Specify the subscript index modes: * int8_t submodes[] = { imode }; * int64_t nsubmodes = 1; * * // Create an input ndarray: * struct ndarray *x = stdlib_ndarray_allocate( xdtype, xbuf, ndims, shape, sx, ox, order, imode, nsubmodes, submodes ); * if ( x == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an output ndarray: * struct ndarray *y = stdlib_ndarray_allocate( ydtype, ybuf, ndims, shape, sy, oy, order, imode, nsubmodes, submodes ); * if ( y == NULL ) { * fprintf( stderr, "Error allocating memory.\n" ); * exit( EXIT_FAILURE ); * } * * // Create an array containing the ndarrays: * struct ndarray *arrays[] = { x, y }; * * // Define a callback: * {{CALLBACK_DTYPE}} scale( const {{CALLBACK_DTYPE}} x ) { * return x + 10{{DTYPE_DECIMAL}}{{DTYPE_SUFFIX}}; * } * * // Apply the callback: * int8_t status = stdlib_ndarray_{{FUNCTION_SUFFIX}}( arrays, (void *)scale ); * if ( status != 0 ) { * fprintf( stderr, "Error during computation.\n" ); * exit( EXIT_FAILURE ); * } * * // ... * * // Free allocated memory: * stdlib_ndarray_free( x ); * stdlib_ndarray_free( y ); */ int8_t stdlib_ndarray_{{FUNCTION_SUFFIX}}( struct ndarray *arrays[], void *fcn ) { return stdlib_ndarray_unary_dispatch( &obj, arrays, fcn ); }