ext/nmatrix/nmatrix.h in nmatrix-0.0.1 vs ext/nmatrix/nmatrix.h in nmatrix-0.0.2

- old
+ new

@@ -21,892 +21,308 @@ // // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement // // == nmatrix.h // +// C and C++ API for NMatrix, and main header file. #ifndef NMATRIX_H #define NMATRIX_H -#include "nmatrix_config.h" +/* + * Standard Includes + */ -#include <cblas.h> - -#include <math.h> - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> #include <ruby.h> -#define RUBY_ZERO INT2FIX(0) -#ifdef BENCHMARK // SOURCE: http://stackoverflow.com/questions/2349776/how-can-i-benchmark-a-c-program-easily -# include <sys/time.h> -# include <sys/resource.h> +#ifdef __cplusplus + #include <cmath> + #include <cstring> +#else + #include <math.h> + #include <string.h> #endif -#include "dtypes.h" -#include <stddef.h> -#ifdef HAVE_STDINT_H -# include <stdint.h> + +#ifdef BENCHMARK + // SOURCE: http://stackoverflow.com/questions/2349776/how-can-i-benchmark-a-c-program-easily + #ifdef __cplusplus + #include <sys/ctime> + #include <sys/cresource> + #else + #include <sys/time.h> + #include <sys/resource.h> + #endif #endif /* - Data types used in NArray / NMatrix : - Please modify these types if your system has any different type. -*/ + * Project Includes + */ -/* NM_BYTE : unsigned 8-bit integer */ -#ifndef HAVE_U_INT8_T -# ifdef HAVE_UINT8_T -typedef uint8_t u_int8_t; -# else -typedef unsigned char u_int8_t; -# endif -#endif +/* + * Macros + */ -//#ifndef HAVE_INT8_T -//typedef char int8_t; -//#endif -#ifndef HAVE_INT16_T -# if SIZEOF_SHORT == 2 -typedef short int16_t; -# else ----->> Please define int16_t manually because sizeof(short) != 2. <<---- -# endif -#endif /* HAVE_INT16_T */ +#define RUBY_ZERO INT2FIX(0) -#ifndef HAVE_INT32_T -# if SIZEOF_LONG == 4 -typedef long int32_t; -# else -# if SIZEOF_INT == 4 -typedef int int32_t; -# else ----->> Please define int32_t manually because sizeof(long) != 4. <<---- -# endif -# endif -#endif /* HAVE_INT32_T */ - -/* unsigned 32-bit integer */ -#ifndef HAVE_U_INT32_T -# ifdef HAVE_UINT32_T -typedef uint32_t u_int32_t; -# else -# if SIZEOF_LONG == 4 -typedef unsigned long u_int32_t; -# else -# if SIZEOF_INT == 4 -typedef unsigned int u_int32_t; -# else ----->> Please define u_int32_t manually because sizeof(long) != 4. <<---- -# endif -# endif -# endif -#endif /* HAVE_U_INT32_T */ - -#ifndef HAVE_INT64_T -# if SIZEOF_QUAD == 8 -typedef quad int64_t; -# else -# if SIZEOF_LONG == 8 -typedef long int64_t; -# else ----->> Please define int64_t manually because sizeof(quad) != 8. <<---- -# endif -# endif -#endif /* HAVE_INT64_T */ - -/* unsigned 64-bit integer */ -#ifndef HAVE_U_INT64_T -# ifdef HAVE_UINT64_T -typedef uint64_t u_int64_t; -# else -# if SIZEOF_QUAD == 8 -typedef unsigned quad u_int64_t; -# else -# if SIZEOF_LONG == 8 -typedef unsigned long u_int64_t; -# else ----->> Please define u_int64_t manually because sizeof(quad) != 8. <<---- -# endif -# endif -# endif -#endif /* HAVE_U_INT64_T */ - - -#ifndef HAVE_SIZE_T /// If you modify this, make sure to modify the definition of y_size_t and Y_SIZE_T! -typedef u_int64_t size_t; -# define NM_SIZE_T NM_INT64 +#ifndef SIZEOF_INT + #error SIZEOF_INT undefined #else -# if SIZEOF_SIZE_T == 8 -# define NM_SIZE_T NM_INT64 -# else -# if SIZEOF_SIZE_T == 4 -# define NM_SIZE_T NM_INT32 -# else ----->> Please define size_t and y_size_t manually because sizeof(size_t) is neither 8 nor 4. <<---- -# endif -# endif + #if SIZEOF_INT == 8 + #define DEFAULT_DTYPE INT64 + #define SIZE_T INT64 + #else + #if SIZEOF_INT == 4 + #define DEFAULT_DTYPE INT32 + #define SIZE_T INT32 + #else + #if SIZEOF_INT == 2 + #define DEFAULT_DTYPE INT16 + #define SIZE_T INT16 + #else + #error Unhandled SIZEOF_INT -- please #define SIZE_T and DEFAULT_DTYPE manually. + #endif + #endif + #endif #endif -// for when we need to return array indices. -// This must never be larger than size_t -typedef uint32_t y_size_t; -#define Y_SIZE_T NM_INT32 - - -#ifdef HAVE_STDBOOL_H -# include <stdbool.h> -#else -typedef char bool; -# define true 1; -# define false 0; -#endif - - -typedef struct { float r,i; } complex64; -typedef struct { double r,i; } complex128; -typedef struct { int16_t n,d; } rational32; -typedef struct { int32_t n,d; } rational64; -typedef struct { int64_t n,d; } rational128; - - -#if SIZEOF_INT == 8 -# define DEFAULT_DTYPE NM_INT64 -#else -# if SIZEOF_INT == 4 -# define DEFAULT_DTYPE NM_INT32 -# else -# define DEFAULT_DTYPE NM_INT16 -# endif -#endif - - -#define YALE_GROWTH_CONSTANT 1.5 - - -enum NMatrix_STypes { - S_DENSE, - S_LIST, - S_YALE, - S_TYPES -}; - - -// Element-wise operations (see blas/elementwise.template.c) -enum NMatrix_Ops { - NM_OP_ADD = '+', - NM_OP_SUB = '-', - NM_OP_MUL = '*', - NM_OP_DIV = '/', - NM_OP_MOD = '%', - NM_OP_BANG = '!', - NM_OP_NEG, // unary minus - NM_OP_EQEQ, // == - NM_OP_NEQ, // != - NM_OP_GT = '>', // > - NM_OP_LT = '<', // < - NM_OP_GTE = ',', // >= - NM_OP_LTE = '.', // <= - NM_OP_NOT = '~', - NM_OP_AND = '&', - NM_OP_OR = '|', - NM_OP_XOR = '^', - NM_OP_LSH, // << - NM_OP_RSH // >> -}; - - -/* Singly-linked ordered list - * - holds keys and values - * - no duplicate keys - * - keys are ordered - * - values may be lists themselves +/* + * == Macros for Concurrent C and C++ Header Maintenance + * + * These macros look complicated, but they're really not so bad. They're also important: they ensure that whether our + * header file (nmatrix.h) is read by a C++ or a C compiler, all the same data structures and enumerators exist, albeit + * with slightly different names. + * + * "But wait," you say, "You use structs. Structs exist in C and C++. Why use a macro to set them up?" + * + * Well, in C, you have to be explicit about what a struct is. You can actually get around that requirement by using a + * typedef: + * + * typedef struct STORAGE { ... } STORAGE; + * + * Also, we use C++ inheritance, which is obviously not allowed in C. So we have to ensure that the base class's members + * are exposed properly to our child classes. + * + * The macros also allow us to put all of our C++ types into namespaces. For C, we prefix everything with either nm_ or + * NM_ to distinguish our declarations from those in other libraries. */ -typedef struct l_node { /* Linked list node */ - size_t key; - void* val; - struct l_node * next; // next -} NODE; -typedef struct l_list { - NODE* first; -} LIST; +#ifdef __cplusplus /* These are the C++ versions of the macros. */ -// two vectors and a capacity -typedef struct y_vector { - void* ija; - void* a; - size_t capacity; -} VECTOR; + #define NM_DECL_ENUM(enum_type, name) enum_type name; + #define NM_DECL_STRUCT(type, name) type name; + #define NM_DEF_STORAGE_ELEMENTS \ + NM_DECL_ENUM(dtype_t, dtype); \ + size_t dim; \ + size_t* shape; \ + size_t* offset; \ + int count; \ + STORAGE* src; -typedef struct common_s { // Common elements found in all _s types. - int8_t dtype; - size_t rank; - size_t* shape; -} STORAGE; + #define NM_DEF_STORAGE_CHILD_STRUCT_PRE(name) struct name : STORAGE { + #define NM_DEF_STORAGE_STRUCT_POST(name) }; + #define NM_DEF_STORAGE_STRUCT \ + struct STORAGE { \ + NM_DEF_STORAGE_ELEMENTS; \ + }; -typedef struct list_s { - int8_t dtype; - size_t rank; - size_t* shape; - void* default_val; - LIST* rows; -} LIST_STORAGE; + #define NM_DEF_STRUCT_PRE(name) struct name { + #define NM_DEF_STRUCT_POST(name) }; + #define NM_DEF_ENUM(name, ...) \ + enum name { \ + __VA_ARGS__ \ + }; -typedef struct dense_s { - int8_t dtype; - size_t rank; - size_t* shape; - void* elements; -} DENSE_STORAGE; +#else /* These are the C versions of the macros. */ + #define NM_DECL_ENUM(enum_type, name) nm_ ## enum_type name; + #define NM_DECL_STRUCT(type, name) NM_ ## type name; -typedef struct yale_s { - int8_t dtype; - size_t rank; - size_t* shape; - size_t ndnz; // strictly non-diagonal non-zero count! - size_t capacity; - int8_t index_dtype; - void* ija; - void* a; -} YALE_STORAGE; + #define NM_DEF_STORAGE_ELEMENTS \ + NM_DECL_ENUM(dtype_t, dtype); \ + size_t dim; \ + size_t* shape; \ + size_t* offset; \ + int count; \ + STORAGE* src; + #define NM_DEF_STORAGE_CHILD_STRUCT_PRE(name) typedef struct NM_ ## name { \ + NM_DEF_STORAGE_ELEMENTS; + #define NM_DEF_STORAGE_STRUCT_POST(name) } NM_ ## name; -typedef struct numeric_matrix { - int8_t stype; /* method of storage (csc, dense, etc) */ - STORAGE* storage; /* pointer to storage struct */ -} NMATRIX; + #define NM_DEF_STORAGE_STRUCT \ + typedef struct NM_STORAGE { \ + NM_DEF_STORAGE_ELEMENTS; \ + } NM_STORAGE; +>>>>>>> compile_point + #define NM_DEF_STRUCT_PRE(name) typedef struct NM_ ## name { + #define NM_DEF_STRUCT_POST(name) } NM_ ## name; -/* Local */ + #define NM_DEF_ENUM(name, ...) \ + typedef enum nm_ ## name { \ + __VA_ARGS__ \ + } nm_ ## name; -typedef union { - u_int8_t b[2]; - int16_t s; -} nm_size16_t; +#endif /* End of C/C++ Parallel Header Macro Definitions */ -typedef union { - u_int8_t b[4]; - int32_t i; - float f; -} nm_size32_t; -typedef union { - u_int8_t b[8]; - int64_t q; - float f[2]; - double d; - complex64 c; -} nm_size64_t; +/* + * Types + */ -typedef union { - u_int8_t b[16]; - int64_t i[2]; - double d[2]; - float f[4]; - complex64 c[2]; - complex128 z; - rational32 r[4]; - rational64 ra[2]; - rational128 rat; - VALUE v[2]; -} nm_size128_t; +#define NM_NUM_DTYPES 13 // data/data.h +#define NM_NUM_ITYPES 4 // data/data.h +#define NM_NUM_STYPES 3 // storage/storage.h +#ifndef __cplusplus +//namespace nm { +#else -// For calling cblas_gemm functions (see cblas.c) -typedef struct cblas_param_t { - int M, N, K, lda, ldb, ldc; - void *A, *B, *C; - nm_size128_t alpha, beta; -} DENSE_PARAM; +#endif +/* Storage Type -- Dense or Sparse */ +NM_DEF_ENUM(stype_t, DENSE_STORE = 0, + LIST_STORE = 1, + YALE_STORE = 2); -// Formerly in smmp.h: -typedef struct smmp_param_t { - void *ia, *ja, *a; - bool diag; -} YALE_PARAM; +/* Data Type */ +NM_DEF_ENUM(dtype_t, BYTE = 0, // unsigned char + INT8 = 1, // char + INT16 = 2, // short + INT32 = 3, // int + INT64 = 4, // long + FLOAT32 = 5, // float + FLOAT64 = 6, // double + COMPLEX64 = 7, // Complex64 class + COMPLEX128 = 8, // Complex128 class + RATIONAL32 = 9, // Rational32 class + RATIONAL64 = 10, // Rational64 class + RATIONAL128 = 11, // Rational128 class + RUBYOBJ = 12); // Ruby VALUE type -// Shouldn't be necessary, as they're defined in nmatrix.h: -// (Oddly, though, these fix the error.) -/*typedef uint8_t u_int8_t; -typedef uint16_t u_int16_t; -typedef uint32_t u_int32_t; -typedef uint64_t u_int64_t; */ +/* Index Type for Yale Matrices */ +NM_DEF_ENUM(itype_t, UINT8 = 0, + UINT16 = 1, + UINT32 = 2, + UINT64 = 3); +/* struct STORAGE */ +NM_DEF_STORAGE_STRUCT; -// rational.c -int64_t nmrb_gcd(int64_t x, int64_t y); +/* Dense Storage */ +NM_DEF_STORAGE_CHILD_STRUCT_PRE(DENSE_STORAGE); // struct DENSE_STORAGE : STORAGE { + size_t* stride; + void* elements; +NM_DEF_STORAGE_STRUCT_POST(DENSE_STORAGE); // }; -// BLAS functions -#define SMMP_MAX_THREE(a,b,c) ((a)>(b) ? ( (a)>(c) ? (a) : (c) ) : ( (b)>(c) ? (b) : (c) )) -#define SMMP_MIN(a,b) ((a)>(b) ? (b) : (a)) -#define SMMP_MAX(a,b) ((a)>(b) ? (a) : (b)) +/* Yale Storage */ +NM_DEF_STORAGE_CHILD_STRUCT_PRE(YALE_STORAGE); + void* a; // should go first + size_t ndnz; // Strictly non-diagonal non-zero count! + size_t capacity; + itype_t itype; + void* ija; +NM_DEF_STORAGE_STRUCT_POST(YALE_STORAGE); -void transp(y_size_t n, y_size_t m, void* ia, void* ja, bool diaga, void* a, void* ib, void* jb, void* b, bool move, int8_t itype, int8_t dtype); +// FIXME: NODE and LIST should be put in some kind of namespace or something, at least in C++. +NM_DEF_STRUCT_PRE(NODE); // struct NODE { + size_t key; + void* val; + NM_DECL_STRUCT(NODE*, next); // NODE* next; +NM_DEF_STRUCT_POST(NODE); // }; -void i8_symbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_symbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_symbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_symbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); +NM_DEF_STRUCT_PRE(LIST); // struct LIST { + NM_DECL_STRUCT(NODE*, first); // NODE* first; +NM_DEF_STRUCT_POST(LIST); // }; -void i8_b_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_b_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_b_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_b_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_i8_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_i8_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_i8_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_i8_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_i16_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_i16_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_i16_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_i16_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_i32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_i32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_i32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_i32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_i64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_i64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_i64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_i64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_f32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_f32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_f32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_f32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_f64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_f64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_f64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_f64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_c64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_c64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_c64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_c64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_c128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_c128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_c128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_c128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_r32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_r32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_r32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_r32_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_r64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_r64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_r64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_r64_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_r128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_r128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_r128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_r128_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i8_v_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i16_v_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i32_v_smmp_sort_columns_(y_size_t, YALE_PARAM); -void i64_v_smmp_sort_columns_(y_size_t, YALE_PARAM); +/* List-of-Lists Storage */ +NM_DEF_STORAGE_CHILD_STRUCT_PRE(LIST_STORAGE); // struct LIST_STORAGE : STORAGE { + // List storage specific elements. + void* default_val; + NM_DECL_STRUCT(LIST*, rows); // LIST* rows; +NM_DEF_STORAGE_STRUCT_POST(LIST_STORAGE); // }; -void i8_b_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_b_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_b_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_b_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i8_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i8_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i8_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i8_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i16_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i16_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i16_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i16_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_f32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_f32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_f32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_f32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_f64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_f64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_f64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_f64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_c64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_c64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_c64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_c64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_c128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_c128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_c128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_c128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r32_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r64_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r128_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_v_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_v_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_v_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_v_smmp(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_b_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_b_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_b_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_b_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i8_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i8_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i8_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i8_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i16_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i16_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i16_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i16_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_i64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_i64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_i64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_i64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_f32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_f32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_f32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_f32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_f64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_f64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_f64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_f64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_c64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_c64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_c64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_c64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_c128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_c128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_c128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_c128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r32_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r64_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_r128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_r128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_r128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_r128_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_v_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i16_v_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i32_v_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i64_v_numbmm_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, YALE_PARAM); -void i8_b_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_b_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_b_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_b_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_i8_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_i8_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_i8_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_i8_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_i16_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_i16_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_i16_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_i16_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_i32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_i32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_i32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_i32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_i64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_i64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_i64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_i64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_f32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_f32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_f32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_f32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_f64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_f64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_f64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_f64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_c64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_c64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_c64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_c64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_c128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_c128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_c128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_c128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_r32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_r32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_r32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_r32_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_r64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_r64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_r64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_r64_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_r128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_r128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_r128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_r128_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i8_v_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i16_v_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i32_v_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); -void i64_v_transp_(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); +/* NMATRIX Object */ +NM_DEF_STRUCT_PRE(NMATRIX); // struct NMATRIX { + NM_DECL_ENUM(stype_t, stype); // stype_t stype; // Method of storage (csc, dense, etc). + NM_DECL_STRUCT(STORAGE*, storage); // STORAGE* storage; // Pointer to storage struct. +NM_DEF_STRUCT_POST(NMATRIX); // }; +#define NM_MAX_RANK 15 +#define UnwrapNMatrix(obj,var) Data_Get_Struct(obj, NMATRIX, var) -// For binary operations involving matrices that need to be casted. -typedef struct storage_pair_t { - STORAGE* left; - STORAGE* right; -} STORAGE_PAIR; - - -#ifndef NMATRIX_C -extern VALUE cNMatrix; - -extern const int nm_sizeof[NM_TYPES+1]; +#define NM_STORAGE(val) (NM_STRUCT(val)->storage) +#ifdef __cplusplus + #define NM_STRUCT(val) ((NMATRIX*)(DATA_PTR(val))) + #define NM_STORAGE_LIST(val) ((LIST_STORAGE*)(NM_STORAGE(val))) + #define NM_STORAGE_YALE(val) ((YALE_STORAGE*)(NM_STORAGE(val))) + #define NM_STORAGE_DENSE(val) ((DENSE_STORAGE*)(NM_STORAGE(val))) +#else + #define NM_STRUCT(val) ((struct NM_NMATRIX*)(DATA_PTR(val))) + #define NM_STORAGE_LIST(val) ((struct NM_LIST_STORAGE*)(NM_STORAGE(val))) + #define NM_STORAGE_YALE(val) ((struct NM_YALE_STORAGE*)(NM_STORAGE(val))) + #define NM_STORAGE_DENSE(val) ((struct NM_DENSE_STORAGE*)(NM_STORAGE(val))) #endif +#define NM_DENSE_SRC(val) (NM_STORAGE_DENSE(val)->src) +#define NM_LIST_SRC(val) (NM_STORAGE_LIST(val)->src) +#define NM_DIM(val) (NM_STORAGE(val)->dim) +#define NM_DTYPE(val) (NM_STORAGE(val)->dtype) +#define NM_ITYPE(val) (NM_STORAGE_YALE(val)->itype) +#define NM_STYPE(val) (NM_STRUCT(val)->stype) +#define NM_SHAPE(val,i) (NM_STORAGE(val)->shape[(i)]) +#define NM_SHAPE0(val) (NM_STORAGE(val)->shape[0]) +#define NM_SHAPE1(val) (NM_STORAGE(val)->shape[1]) -#define NM_MAX_RANK 15 - -#define UnwrapNMatrix(obj,var) Data_Get_Struct(obj, struct numeric_matrix, var) -#define IsNMatrix(obj) (rb_obj_is_kind_of(obj, CNMatrix)==Qtrue) - -#define NM_STORAGE(val) (((struct numeric_matrix*)DATA_PTR(val))->storage) -//#define NM_PTR(a, p) ((a)->ptr+(p)*nm_sizeof[(a)->type]) -#define NM_STRUCT(val) ((struct numeric_matrix*)DATA_PTR(val)) -//#define NM_PTR_TYPE(val,type) (type)(((struct numeric_matrix*)DATA_PTR(val))->ptr) -#define NM_RANK(val) (((STORAGE*)(NM_STORAGE(val)))->rank) -#define NM_DTYPE(val) (((STORAGE*)(NM_STORAGE(val)))->dtype) -#define NM_STYPE(val) (((struct numeric_matrix*)DATA_PTR(val))->stype) -#define NM_SHAPE(val,i) (((STORAGE*)(NM_STORAGE(val)))->shape[(i)]) -#define NM_SHAPE0(val) (((struct numeric_matrix*)DATA_PTR(val))->shape[0]) -#define NM_SHAPE1(val) (((struct numeric_matrix*)DATA_PTR(val))->shape[1]) -#define NM_SIZEOF_DTYPE(val) (nm_sizeof[NM_DTYPE(val)]) -#define NM_REF(val,coords) (RefFuncs[NM_STYPE(val)]( NM_STORAGE(val), coords, NM_SIZEOF_DTYPE(val) )) - -#define NM_IsNMatrix(obj) (rb_obj_is_kind_of(obj, cNMatrix)==Qtrue) -#define NM_IsArray(obj) (TYPE(obj)==T_ARRAY || rb_obj_is_kind_of(obj,cNMatrix)==Qtrue) -#define NM_IsROBJ(d) ((d)->dtype==NM_ROBJ) -#define NM_IsINTEGER(a) \ - (NM_DTYPE(a)==NM_BYTE || NM_DTYPE(a)==NM_INT8 || NM_DTYPE(a)==NM_INT16 || NM_DTYPE(a)==NM_INT32 || NM_DTYPE(a)==NM_INT64) -#define NM_IsCOMPLEX(a) \ - (NM_DTYPE(a)==NM_COMPLEX32 || NM_DTYPE(a)==NM_COMPLEX64) +#define NM_DENSE_COUNT(val) (storage_count_max_elements(NM_STORAGE_DENSE(val))) +#define NM_SIZEOF_DTYPE(val) (DTYPE_SIZES[NM_DTYPE(val)]) +#define NM_REF(val,slice) (RefFuncs[NM_STYPE(val)]( NM_STORAGE(val), slice, NM_SIZEOF_DTYPE(val) )) + #define NM_MAX(a,b) (((a)>(b))?(a):(b)) +#define NM_MIN(a,b) (((a)>(b))?(b):(a)) #define NM_SWAP(a,b,tmp) {(tmp)=(a);(a)=(b);(b)=(tmp);} -//#define NUM2REAL(v) NUM2DBL( rb_funcall((v),nm_id_real,0) ) // deprecated -#define REAL2DBL(v) NUM2DBL( rb_funcall((v),nm_id_real,0) ) -//#define NUM2IMAG(v) NUM2DBL( rb_funcall((v),nm_id_imag,0) ) // deprecated -#define IMAG2DBL(v) NUM2DBL( rb_funcall((v),nm_id_imag,0) ) +#define NM_CHECK_ALLOC(x) if (!x) rb_raise(rb_eNoMemError, "insufficient memory"); -#define NUM2NUMER(v) NUM2INT( rb_funcall((v), nm_id_numer,0) ) // deprecated -#define NUMER2INT(v) NUM2INT( rb_funcall((v), nm_id_numer,0) ) -#define NUM2DENOM(v) NUM2INT( rb_funcall((v), nm_id_denom,0) ) // deprecated -#define DENOM2INT(v) NUM2INT( rb_funcall((v), nm_id_denom,0) ) +#define CheckNMatrixType(v) if (TYPE(v) != T_DATA || (RDATA(v)->dfree != (RUBY_DATA_FUNC)nm_delete && RDATA(v)->dfree != (RUBY_DATA_FUNC)nm_delete_ref)) rb_raise(rb_eTypeError, "expected NMatrix on left-hand side of operation"); -#define IS_NUMERIC(v) (FIXNUM_P(v) || TYPE(v) == T_FLOAT || TYPE(v) == T_COMPLEX || TYPE(v) == T_RATIONAL) -#define IS_STRING(v) (TYPE(v) == T_STRING) +#define NM_IsNMatrix(obj) \ + (rb_obj_is_kind_of(obj, cNMatrix) == Qtrue) -#define CheckNMatrixType(v) if (TYPE(v) != T_DATA || RDATA(v)->dfree != (RUBY_DATA_FUNC)nm_delete) rb_raise(rb_eTypeError, "expected NMatrix on left-hand side of operation"); +#define NM_IsNVector(obj) \ + (rb_obj_is_kind_of(obj, cNVector) == Qtrue) -//#define YALE_JA_START(sptr) (((YALE_STORAGE*)(sptr))->shape[0]+1) -#define YALE_IJA(sptr,elem_size,i) (void*)( (char*)(((YALE_STORAGE*)(sptr))->ija) + i * elem_size ) -//#define YALE_JA(sptr,dtype,j) ((((dtype)*)((YALE_STORAGE*)(sptr))->ija)[(YALE_JA_START(sptr))+j]) -#define YALE_ROW_LENGTH(sptr,elem_size,i) (*(size_t*)YALE_IA((sptr),(elem_size),(i)+1) - *(size_t*)YALE_IJA((sptr),(elem_size),(i))) -#define YALE_A(sptr,elem_size,i) (void*)((char*)(((YALE_STORAGE*)(sptr))->a) + elem_size * i) -#define YALE_DIAG(sptr, elem_size, i) ( YALE_A((sptr),(elem_size),(i)) ) -//#define YALE_LU(sptr,dtype,i,j) (((dtype)*)(((YALE_STORAGE*)(sptr))->a)[ YALE_JA_START(sptr) + ]) -#define YALE_MINIMUM(sptr) (((YALE_STORAGE*)(sptr))->shape[0]*2 + 1) // arbitrarily defined -#define YALE_SIZE_PTR(sptr,elem_size) (void*)((char*)((YALE_STORAGE*)(sptr))->ija + ((YALE_STORAGE*)(sptr))->shape[0]*elem_size ) -#define YALE_MAX_SIZE(sptr) (((YALE_STORAGE*)(sptr))->shape[0] * ((YALE_STORAGE*)(sptr))->shape[1] + 1) -#define YALE_IA_SIZE(sptr) ((YALE_STORAGE*)(sptr))->shape[0] -// None of these next three return anything. They set a reference directly. -#define YaleGetIJA(victim,s,i) (SetFuncs[Y_SIZE_T][(s)->index_dtype](1, &(victim), 0, YALE_IJA((s), nm_sizeof[s->index_dtype], (i)), 0)) -#define YaleSetIJA(i,s,from) (SetFuncs[s->index_dtype][Y_SIZE_T](1, YALE_IJA((s), nm_sizeof[s->index_dtype], (i)), 0, &(from), 0)) -#define YaleGetSize(sz,s) (SetFuncs[Y_SIZE_T][(s)->index_dtype](1, &sz, 0, (YALE_SIZE_PTR((s), nm_sizeof[(s)->index_dtype])), 0)) -//#define YALE_FIRST_NZ_ROW_ENTRY(sptr,elem_size,i) +typedef VALUE (*METHOD)(...); - -#if !defined RSTRING_LEN -#define RSTRING_LEN(a) RSTRING(a)->len +#ifdef __cplusplus +//}; // end of namespace nm #endif -#if !defined RSTRING_PTR -#define RSTRING_PTR(a) RSTRING(a)->ptr -#endif -#if !defined RARRAY_LEN -#define RARRAY_LEN(a) RARRAY(a)->len -#endif -#if !defined RARRAY_PTR -#define RARRAY_PTR(a) RARRAY(a)->ptr -#endif -#define NM_INDEX_TYPES NM_FLOAT32 +/* + * Data + */ +/* + * Functions + */ -typedef void (*nm_setfunc_t[NM_TYPES][NM_TYPES])(); // copy functions -typedef void (*nm_incfunc_t[NM_TYPES])(); // increment functions -typedef void* (*nm_stype_ref_t[S_TYPES])(STORAGE*, size_t*); // get/ref -typedef VALUE (*nm_stype_ins_t[S_TYPES])(STORAGE*, size_t*, VALUE); // insert -typedef STORAGE* (*nm_create_storage_t[S_TYPES])(); -typedef STORAGE* (*nm_cast_copy_storage_t[S_TYPES])(); -typedef STORAGE* (*nm_scast_copy_storage_t[S_TYPES][S_TYPES])(); -typedef NMATRIX* (*nm_matrix_multiply_op_t[S_TYPES])(); -typedef NMATRIX* (*nm_elementwise_binary_op_casted_t[S_TYPES])(); -typedef int (*nm_d_elementwise_binary_op_t[NM_TYPES])(); -typedef int (*nm_y_elementwise_binary_op_t[NM_TYPES][NM_INDEX_TYPES])(); -typedef bool (*nm_compare_t[S_TYPES])(); -typedef void (*nm_delete_t[S_TYPES])(); -typedef void (*nm_mark_t[S_TYPES])(void*); -typedef void (*nm_gemm_t[NM_TYPES])(); // general matrix/matrix multiply -typedef void (*nm_dense_transpose_t[NM_TYPES])(); // dense transpose -typedef void (*nm_gemv_t[NM_TYPES])(); // general matrix/vector multiply -typedef void (*nm_smmp_t[NM_TYPES][NM_INDEX_TYPES])(); // sparse (yale) multiply -typedef void (*nm_smmp_transpose_t[NM_TYPES][NM_INDEX_TYPES])(y_size_t, y_size_t, YALE_PARAM, YALE_PARAM, bool); // sparse (yale) transpose -//typedef void (*nm_setsf_t[S_TYPES][S_TYPES])(); -//typedef void (*nm_setdf_t[NM_DTYPES][NM_DTYPES])(); +extern "C" { + void Init_nmatrix(); + + // External API + VALUE rb_nmatrix_dense_create(dtype_t dtype, size_t* shape, size_t dim, void* elements, size_t length); + VALUE rb_nvector_dense_create(dtype_t dtype, void* elements, size_t length); +} -extern nm_setfunc_t SetFuncs; -extern nm_incfunc_t Increment; -extern ID nm_id_real, nm_id_imag; -extern ID nm_id_denom, nm_id_numer; -extern ID nm_id_mult, nm_id_multeq, nm_id_add; - -/* blas.c */ -int r32gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const rational32 alpha, const rational32* A, const int lda, const rational32* B, const int ldb, const rational32 beta, rational32* C, const int ldc); -int r32gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const rational32 alpha, const rational32* A, const size_t lda, const rational32* X, const int incX, const rational32 beta, rational32* Y, const int incY); -int r64gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const rational64 alpha, const rational64* A, const int lda, const rational64* B, const int ldb, const rational64 beta, rational64* C, const int ldc); -int r64gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const rational64 alpha, const rational64* A, const size_t lda, const rational64* X, const int incX, const rational64 beta, rational64* Y, const int incY); -int r128gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const rational128 alpha, const rational128* A, const int lda, const rational128* B, const int ldb, const rational128 beta, rational128* C, const int ldc); -int r128gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const rational128 alpha, const rational128* A, const size_t lda, const rational128* X, const int incX, const rational128 beta, rational128* Y, const int incY); -int bgemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const u_int8_t alpha, const u_int8_t* A, const int lda, const u_int8_t* B, const int ldb, const u_int8_t beta, u_int8_t* C, const int ldc); -int bgemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const u_int8_t alpha, const u_int8_t* A, const size_t lda, const u_int8_t* X, const int incX, const u_int8_t beta, u_int8_t* Y, const int incY); -int i8gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const int8_t alpha, const int8_t* A, const int lda, const int8_t* B, const int ldb, const int8_t beta, int8_t* C, const int ldc); -int i8gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const int8_t alpha, const int8_t* A, const size_t lda, const int8_t* X, const int incX, const int8_t beta, int8_t* Y, const int incY); -int i16gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const int16_t alpha, const int16_t* A, const int lda, const int16_t* B, const int ldb, const int16_t beta, int16_t* C, const int ldc); -int i16gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const int16_t alpha, const int16_t* A, const size_t lda, const int16_t* X, const int incX, const int16_t beta, int16_t* Y, const int incY); -int i32gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const int32_t alpha, const int32_t* A, const int lda, const int32_t* B, const int ldb, const int32_t beta, int32_t* C, const int ldc); -int i32gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const int32_t alpha, const int32_t* A, const size_t lda, const int32_t* X, const int incX, const int32_t beta, int32_t* Y, const int incY); -int i64gemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const int64_t alpha, const int64_t* A, const int lda, const int64_t* B, const int ldb, const int64_t beta, int64_t* C, const int ldc); -int i64gemv(enum CBLAS_TRANSPOSE Trans, const size_t M, const size_t N, const int64_t alpha, const int64_t* A, const size_t lda, const int64_t* X, const int incX, const int64_t beta, int64_t* Y, const int incY); -int vgemm(enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const VALUE alpha, const VALUE* A, const int lda, const VALUE* B, const int ldb, const VALUE beta, VALUE* C, const int ldc); - -// void %%TYPE_ABBREV%%transp(unsigned int M, unsigned int N, const %%TYPE%%* A, int lda, %%TYPE%%* B, int ldb); -void btransp(const unsigned int, const unsigned int, const u_int8_t*, const int, u_int8_t*, const int); -void i8transp(const unsigned int, const unsigned int, const int8_t*, const int, int8_t*, const int); -void i16transp(const unsigned int, const unsigned int, const int16_t*, const int, int16_t*, const int); -void i32transp(const unsigned int, const unsigned int, const int32_t*, const int, int32_t*, const int); -void i64transp(const unsigned int, const unsigned int, const int64_t*, const int, int64_t*, const int); -void f32transp(const unsigned int, const unsigned int, const float*, const int, float*, const int); -void f64transp(const unsigned int, const unsigned int, const double*, const int, double*, const int); -void c64transp(const unsigned int, const unsigned int, const complex64*, const int, complex64*, const int); -void c128transp(const unsigned int, const unsigned int, const complex128*, const int, complex128*, const int); -void r32transp(const unsigned int, const unsigned int, const rational32*, const int, rational32*, const int); -void r64transp(const unsigned int, const unsigned int, const rational64*, const int, rational64*, const int); -void r128transp(const unsigned int, const unsigned int, const rational128*, const int, rational128*, const int); -void vtransp(const unsigned int, const unsigned int, const VALUE*, const int, VALUE*, const int); - -int nm_d_b_elementwise(const u_int8_t* A, const u_int8_t* B, u_int8_t* C, size_t n, enum NMatrix_Ops op); -int nm_d_i8_elementwise(const int8_t* A, const int8_t* B, int8_t* C, size_t n, enum NMatrix_Ops op); -int nm_d_i16_elementwise(const int16_t* A, const int16_t* B, int16_t* C, size_t n, enum NMatrix_Ops op); -int nm_d_i32_elementwise(const int32_t* A, const int32_t* B, int32_t* C, size_t n, enum NMatrix_Ops op); -int nm_d_i64_elementwise(const int64_t* A, const int64_t* B, int64_t* C, size_t n, enum NMatrix_Ops op); -int nm_d_f32_elementwise(const float* A, const float* B, float* C, size_t n, enum NMatrix_Ops op); -int nm_d_f64_elementwise(const double* A, const double* B, double* C, size_t n, enum NMatrix_Ops op); -int nm_d_c64_elementwise(const complex64* A, const complex64* B, complex64* C, size_t n, enum NMatrix_Ops op); -int nm_d_c128_elementwise(const complex128* A, const complex128* B, complex128* C, size_t n, enum NMatrix_Ops op); -int nm_d_r32_elementwise(const rational32* A, const rational32* B, rational32* C, size_t n, enum NMatrix_Ops op); -int nm_d_r64_elementwise(const rational64* A, const rational64* B, rational64* C, size_t n, enum NMatrix_Ops op); -int nm_d_r128_elementwise(const rational128* A, const rational128* B, rational128* C, size_t n, enum NMatrix_Ops op); -int nm_d_v_elementwise(const VALUE* A, const VALUE* B, VALUE* C, size_t n, enum NMatrix_Ops op); - -// These are in blas.c but are needed by smmp2.c (the smmp template stuff) -rational128 r128_muldiv(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational128 r128_addsub(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational128 r128_mod(int64_t anum, int64_t aden, int64_t bnum, int64_t bden); -rational128 r128_bang(int64_t, int64_t); -rational128 r128_negate(int64_t, int64_t); -rational64 r64_muldiv(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational64 r64_addsub(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational64 r64_mod(int32_t anum, int32_t aden, int32_t bnum, int32_t bden); -rational64 r64_bang(int32_t, int32_t); -rational64 r64_negate(int32_t, int32_t); -rational32 r32_muldiv(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational32 r32_addsub(int64_t anum, int64_t aden, int64_t bnum, int64_t bden, char k); -rational32 r32_mod(int16_t anum, int16_t aden, int16_t bnum, int16_t bden); -rational32 r32_bang(int16_t, int16_t); -rational32 r32_negate(int16_t, int16_t); - -rational32 BOOL2R32(bool); -rational64 BOOL2R64(bool); -rational128 BOOL2R128(bool); - - -/* cblas.c */ -DENSE_PARAM init_cblas_params_for_nm_multiply_matrix(int8_t dtype); -void cblas_bgemm_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_bgemv_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_i8gemm_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_i8gemv_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_i16gemm_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_i16gemv_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_i32gemm_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_i32gemv_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_i64gemm_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_i64gemv_(enum CBLAS_ORDER Order, enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_sgemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_sgemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_dgemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_dgemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_cgemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_cgemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_zgemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_zgemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_r32gemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_r32gemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_r64gemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_r64gemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_r128gemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); -void cblas_r128gemv_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, DENSE_PARAM p); -void cblas_vgemm_(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, DENSE_PARAM p); - - -/* smmp2.c */ -int i8_b_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, u_int8_t* a, u_int8_t* b, u_int8_t* c); -int i16_b_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, u_int8_t* a, u_int8_t* b, u_int8_t* c); -int i32_b_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, u_int8_t* a, u_int8_t* b, u_int8_t* c); -int i64_b_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, u_int8_t* a, u_int8_t* b, u_int8_t* c); -int i8_i8_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, int8_t* a, int8_t* b, int8_t* c); -int i16_i8_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, int8_t* a, int8_t* b, int8_t* c); -int i32_i8_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, int8_t* a, int8_t* b, int8_t* c); -int i64_i8_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, int8_t* a, int8_t* b, int8_t* c); -int i8_i16_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, int16_t* a, int16_t* b, int16_t* c); -int i16_i16_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, int16_t* a, int16_t* b, int16_t* c); -int i32_i16_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, int16_t* a, int16_t* b, int16_t* c); -int i64_i16_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, int16_t* a, int16_t* b, int16_t* c); -int i8_i32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, int32_t* a, int32_t* b, int32_t* c); -int i16_i32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, int32_t* a, int32_t* b, int32_t* c); -int i32_i32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, int32_t* a, int32_t* b, int32_t* c); -int i64_i32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, int32_t* a, int32_t* b, int32_t* c); -int i8_i64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, int64_t* a, int64_t* b, int64_t* c); -int i16_i64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, int64_t* a, int64_t* b, int64_t* c); -int i32_i64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, int64_t* a, int64_t* b, int64_t* c); -int i64_i64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, int64_t* a, int64_t* b, int64_t* c); -int i8_f32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, float* a, float* b, float* c); -int i16_f32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, float* a, float* b, float* c); -int i32_f32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, float* a, float* b, float* c); -int i64_f32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, float* a, float* b, float* c); -int i8_f64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, double* a, double* b, double* c); -int i16_f64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, double* a, double* b, double* c); -int i32_f64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, double* a, double* b, double* c); -int i64_f64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, double* a, double* b, double* c); -int i8_c64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, complex64* a, complex64* b, complex64* c); -int i16_c64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, complex64* a, complex64* b, complex64* c); -int i32_c64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, complex64* a, complex64* b, complex64* c); -int i64_c64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, complex64* a, complex64* b, complex64* c); -int i8_c128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, complex128* a, complex128* b, complex128* c); -int i16_c128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, complex128* a, complex128* b, complex128* c); -int i32_c128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, complex128* a, complex128* b, complex128* c); -int i64_c128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, complex128* a, complex128* b, complex128* c); -int i8_r32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, rational32* a, rational32* b, rational32* c); -int i16_r32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, rational32* a, rational32* b, rational32* c); -int i32_r32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, rational32* a, rational32* b, rational32* c); -int i64_r32_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, rational32* a, rational32* b, rational32* c); -int i8_r64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, rational64* a, rational64* b, rational64* c); -int i16_r64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, rational64* a, rational64* b, rational64* c); -int i32_r64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, rational64* a, rational64* b, rational64* c); -int i64_r64_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, rational64* a, rational64* b, rational64* c); -int i8_r128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, rational128* a, rational128* b, rational128* c); -int i16_r128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, rational128* a, rational128* b, rational128* c); -int i32_r128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, rational128* a, rational128* b, rational128* c); -int i64_r128_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, rational128* a, rational128* b, rational128* c); -int i8_v_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int8_t* ija, const u_int8_t* ijb, const u_int8_t* ijc, VALUE* a, VALUE* b, VALUE* c); -int i16_v_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int16_t* ija, const u_int16_t* ijb, const u_int16_t* ijc, VALUE* a, VALUE* b, VALUE* c); -int i32_v_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int32_t* ija, const u_int32_t* ijb, const u_int32_t* ijc, VALUE* a, VALUE* b, VALUE* c); -int i64_v_ew(y_size_t n, y_size_t m, enum NMatrix_Ops op, const u_int64_t* ija, const u_int64_t* ijb, const u_int64_t* ijc, VALUE* a, VALUE* b, VALUE* c); - - -/* dense.c */ -DENSE_STORAGE* create_dense_storage(int8_t dtype, size_t* shape, size_t rank, void* elements, size_t elements_length); -void delete_dense_storage(DENSE_STORAGE* s); -void mark_dense_storage(void* s); -DENSE_STORAGE* cast_copy_dense_storage(DENSE_STORAGE* rhs, int8_t new_dtype); - -size_t count_dense_storage_elements(const DENSE_STORAGE* s); -bool dense_storage_eqeq(const DENSE_STORAGE*, const DENSE_STORAGE*); - -size_t dense_storage_pos(DENSE_STORAGE* s, size_t* coords); -void* dense_storage_get(DENSE_STORAGE* s, size_t* coords); -void dense_storage_set(DENSE_STORAGE* s, size_t* coords, void* val); - -/* list.c */ -LIST_STORAGE* create_list_storage(int8_t dtype, size_t* shape, size_t rank, void* init_val); -void delete_list_storage(LIST_STORAGE* s); -void mark_list_storage(void* s); -LIST_STORAGE* cast_copy_list_storage(LIST_STORAGE* rhs, int8_t new_dtype); -size_t count_storage_max_elements(const STORAGE*); - -void* list_storage_get(LIST_STORAGE* s, size_t* coords); -void* list_storage_insert(LIST_STORAGE* s, size_t* coords, void* val); -void* list_storage_remove(LIST_STORAGE* s, size_t* coords); -bool list_storage_eqeq(const LIST_STORAGE*, const LIST_STORAGE*); - -/* yale.c */ -void print_vectors(YALE_STORAGE* s); -YALE_STORAGE* create_yale_storage(int8_t dtype, size_t* shape, size_t rank, size_t init_capacity); -void init_yale_storage(YALE_STORAGE* s); -void delete_yale_storage(YALE_STORAGE* s); -void mark_yale_storage(void* s); -YALE_STORAGE* cast_copy_yale_storage(YALE_STORAGE* rhs, int8_t new_dtype); -bool yale_storage_eqeq(const YALE_STORAGE*, const YALE_STORAGE*); - -void* yale_storage_ref(YALE_STORAGE* s, size_t* coords); -char yale_storage_set(YALE_STORAGE* s, size_t* coords, void* v); - -YALE_STORAGE* create_merged_yale_storage(const YALE_STORAGE*, const YALE_STORAGE*); - -size_t count_list_storage_nd_elements(const LIST_STORAGE*); -size_t count_list_storage_elements(const LIST_STORAGE*); - - -/* stype casts */ -DENSE_STORAGE* scast_copy_dense_yale(const YALE_STORAGE* rhs, int8_t l_dtype); -DENSE_STORAGE* scast_copy_dense_list(const LIST_STORAGE* rhs, int8_t l_dtype); -YALE_STORAGE* scast_copy_yale_dense(const DENSE_STORAGE* rhs, int8_t l_dtype); -YALE_STORAGE* scast_copy_yale_list(const LIST_STORAGE* rhs, int8_t l_dtype); -LIST_STORAGE* scast_copy_list_yale(const YALE_STORAGE* rhs, int8_t l_dtype); -LIST_STORAGE* scast_copy_list_dense(const DENSE_STORAGE* rhs, int8_t l_dtype); - -/* nmatrix.c */ -void cast_copy_value_single(void* to, const void* from, int8_t l_dtype, int8_t r_dtype); -int8_t nm_dtypestring_to_dtype(VALUE str); -int8_t nm_dtypesymbol_to_dtype(VALUE sym); -int8_t nm_stypestring_to_stype(VALUE str); -int8_t nm_stypesymbol_to_stype(VALUE sym); -int8_t nm_guess_dtype(VALUE v); -size_t* nm_interpret_shape_arg(VALUE arg, size_t* rank); -NMATRIX* nm_create(int8_t stype, void* storage); -void Init_nmatrix(); - -#endif +#endif // NMATRIX_H