1#ifndef MATRIX_MDEFINES_H
2#define MATRIX_MDEFINES_H
6#define Matrix_Domain "Matrix"
7#define Matrix_CallocThreshold 8192
8#define Matrix_ErrorBufferSize 4096
14# define _POSIX_C_SOURCE 200809L
24# define MATRIX_INT_FAST64_MIN INT_FAST64_MIN
25# define MATRIX_INT_FAST64_MAX INT_FAST64_MAX
28# define MATRIX_INT_FAST64_MIN LLONG_MIN
29# define MATRIX_INT_FAST64_MAX LLONG_MAX
32#ifndef STRICT_R_HEADERS
33# define STRICT_R_HEADERS
37#include <Rinternals.h>
42# define _(String) dgettext(Matrix_Domain, String)
44# define _(String) (String)
45# define dngettext(Domain, String, StringP, N) ((N == 1) ? String : StringP)
54# define alloca(x) __builtin_alloca((x))
66#define Matrix_Calloc(_VAR_, _N_, _CTYPE_) \
68 if (_N_ >= Matrix_CallocThreshold) \
69 _VAR_ = R_Calloc(_N_, _CTYPE_); \
71 _VAR_ = (_CTYPE_ *) alloca((size_t) (_N_) * sizeof(_CTYPE_)); \
73 memset(_VAR_, 0, (size_t) (_N_) * sizeof(_CTYPE_)); \
77#define Matrix_Free(_VAR_, _N_) \
79 if (_N_ >= Matrix_CallocThreshold) \
85# define GET_SLOT(x, what) R_do_slot(x, what)
86# define SET_SLOT(x, what, value) R_do_slot_assign(x, what, value)
97#define MINOF(x, y) ((x < y) ? x : y)
98#define MAXOF(x, y) ((x < y) ? y : x)
99#define FIRSTOF(x, y) (x)
100#define SECONDOF(x, y) (y)
102#define ISNA_PATTERN(_X_) (0)
103#define ISNA_LOGICAL(_X_) ((_X_) == NA_LOGICAL)
104#define ISNA_INTEGER(_X_) ((_X_) == NA_INTEGER)
105#define ISNA_REAL(_X_) (ISNAN(_X_))
106#define ISNA_COMPLEX(_X_) (ISNAN((_X_).r) || ISNAN((_X_).i))
108#define ISNZ_PATTERN(_X_) ((_X_) != 0)
109#define ISNZ_LOGICAL(_X_) ((_X_) != 0)
110#define ISNZ_INTEGER(_X_) ((_X_) != 0)
111#define ISNZ_REAL(_X_) ((_X_) != 0.0)
112#define ISNZ_COMPLEX(_X_) ((_X_).r != 0.0 || (_X_).i != 0.0)
114#define STRICTLY_ISNZ_PATTERN(_X_) \
116#define STRICTLY_ISNZ_LOGICAL(_X_) \
117 (!ISNA_LOGICAL(_X_) && ISNZ_LOGICAL(_X_))
118#define STRICTLY_ISNZ_INTEGER(_X_) \
119 (!ISNA_INTEGER(_X_) && ISNZ_INTEGER(_X_))
120#define STRICTLY_ISNZ_REAL(_X_) \
121 (!ISNA_REAL( _X_) && ISNZ_REAL( _X_))
122#define STRICTLY_ISNZ_COMPLEX(_X_) \
123 (!ISNA_COMPLEX(_X_) && ISNZ_COMPLEX(_X_))
125#define NOTREAL_PATTERN(_X_) 0
126#define NOTREAL_LOGICAL(_X_) 0
127#define NOTREAL_INTEGER(_X_) 0
128#define NOTREAL_REAL(_X_) 0
129#define NOTREAL_COMPLEX(_X_) (_X_.i != 0.0)
131#define NOTCONJ_PATTERN(_X_, _Y_) \
132 ((_X_ != 0) != (_Y_ != 0))
133#define NOTCONJ_LOGICAL(_X_, _Y_) \
135#define NOTCONJ_INTEGER(_X_, _Y_) \
137#define NOTCONJ_REAL(_X_, _Y_) \
138 ((ISNAN(_X_)) ? !ISNAN(_Y_) : ISNAN(_Y_) || _X_ != _Y_)
139#define NOTCONJ_COMPLEX(_X_, _Y_) \
140 (((ISNAN(_X_.r)) ? !ISNAN(_Y_.r) : ISNAN(_Y_.r) || _X_.r != _Y_.r) || \
141 ((ISNAN(_X_.i)) ? !ISNAN(_Y_.i) : ISNAN(_Y_.i) || _X_.r != -_Y_.r))
143#define INCREMENT_PATTERN(_X_, _Y_) \
147#define INCREMENT_LOGICAL(_X_, _Y_) \
149 if (_Y_ == NA_LOGICAL) { \
152 } else if (_Y_ != 0) \
155#define INCREMENT_INTEGER(_X_, _Y_) \
157 if (_X_ != NA_INTEGER) { \
158 if (_Y_ == NA_INTEGER) \
161 ? (_X_ <= INT_MIN - _Y_) \
162 : (_X_ > INT_MAX - _Y_)) { \
163 warning(_("NAs produced by integer overflow")); \
169#define INCREMENT_REAL(_X_, _Y_) \
173#define INCREMENT_COMPLEX(_X_, _Y_) \
179#define ASSIGN_REAL(_X_, _Y_) \
180 do { _X_ = _Y_ ; } while (0)
181#define ASSIGN_COMPLEX(_X_, _Y_) \
182 do { _X_.r = _Y_.r; _X_.i = _Y_.i; } while (0)
184#define SCALE1_REAL(_X_, _A_) \
185 do { _X_ *= _A_; } while (0)
186#define SCALE1_COMPLEX(_X_, _A_) \
187 do { _X_.r *= _A_; _X_.i *= _A_; } while (0)
189#define SCALE2_REAL(_X_, _A_) \
190 do { _X_ /= _A_; } while (0)
191#define SCALE2_COMPLEX(_X_, _A_) \
192 do { _X_.r /= _A_; _X_.i /= _A_; } while (0)
194#define PACKED_AR21_UP(i, j) \
195 ((R_xlen_t) ((i) + ((Matrix_int_fast64_t) (j) * ( (j) + 1)) / 2))
196#define PACKED_AR21_LO(i, j, m2) \
197 ((R_xlen_t) ((i) + ((Matrix_int_fast64_t) (j) * ((m2) - (j) - 1)) / 2))
198#define PACKED_LENGTH(m) \
199 ((R_xlen_t) ((m) + ((Matrix_int_fast64_t) (m) * ( (m) - 1)) / 2))
201#define SHOW(...) __VA_ARGS__
204#define ERROR_INVALID_TYPE(_X_, _FUNC_) \
205 error(_("invalid type \"%s\" in '%s'"), \
206 type2char(TYPEOF(_X_)), _FUNC_)
208#define ERROR_INVALID_CLASS(_X_, _FUNC_) \
211 ERROR_INVALID_TYPE(_X_, _FUNC_); \
213 SEXP class = PROTECT(getAttrib(_X_, R_ClassSymbol)); \
214 error(_("invalid class \"%s\" in '%s'"), \
215 CHAR(STRING_ELT(class, 0)), _FUNC_); \
220#define VALID_NONVIRTUAL_MATRIX \
221 "dpoMatrix", "dppMatrix", \
222 "corMatrix", "copMatrix", \
223 "pMatrix", "indMatrix", \
224 "ngCMatrix", "ngRMatrix", "ngTMatrix", "ngeMatrix", "ndiMatrix", \
225 "nsCMatrix", "nsRMatrix", "nsTMatrix", "nsyMatrix", "nspMatrix", \
226 "ntCMatrix", "ntRMatrix", "ntTMatrix", "ntrMatrix", "ntpMatrix", \
227 "lgCMatrix", "lgRMatrix", "lgTMatrix", "lgeMatrix", "ldiMatrix", \
228 "lsCMatrix", "lsRMatrix", "lsTMatrix", "lsyMatrix", "lspMatrix", \
229 "ltCMatrix", "ltRMatrix", "ltTMatrix", "ltrMatrix", "ltpMatrix", \
230 "igCMatrix", "igRMatrix", "igTMatrix", "igeMatrix", "idiMatrix", \
231 "isCMatrix", "isRMatrix", "isTMatrix", "isyMatrix", "ispMatrix", \
232 "itCMatrix", "itRMatrix", "itTMatrix", "itrMatrix", "itpMatrix", \
233 "dgCMatrix", "dgRMatrix", "dgTMatrix", "dgeMatrix", "ddiMatrix", \
234 "dsCMatrix", "dsRMatrix", "dsTMatrix", "dsyMatrix", "dspMatrix", \
235 "dtCMatrix", "dtRMatrix", "dtTMatrix", "dtrMatrix", "dtpMatrix", \
236 "zgCMatrix", "zgRMatrix", "zgTMatrix", "zgeMatrix", "zdiMatrix", \
237 "zsCMatrix", "zsRMatrix", "zsTMatrix", "zsyMatrix", "zspMatrix", \
238 "ztCMatrix", "ztRMatrix", "ztTMatrix", "ztrMatrix", "ztpMatrix"
240#define VALID_NONVIRTUAL_VECTOR \
241 "nsparseVector", "lsparseVector", "isparseVector", \
242 "dsparseVector", "zsparseVector"
244#define VALID_NONVIRTUAL VALID_NONVIRTUAL_MATRIX, VALID_NONVIRTUAL_VECTOR
247#define VALID_NONVIRTUAL_SHIFT(i, pToInd) \
248 ((i >= 5) ? 0 : ((i >= 4) ? pToInd != 0 : ((i >= 2) ? 57 : 59)))
251"ngeMatrix", "nsyMatrix", "nspMatrix", "ntrMatrix", "ntpMatrix", \
252"lgeMatrix", "lsyMatrix", "lspMatrix", "ltrMatrix", "ltpMatrix", \
253"igeMatrix", "isyMatrix", "ispMatrix", "itrMatrix", "itpMatrix", \
254"dgeMatrix", "dsyMatrix", "dspMatrix", "dtrMatrix", "dtpMatrix", \
255"zgeMatrix", "zsyMatrix", "zspMatrix", "ztrMatrix", "ztpMatrix"
257#define VALID_CSPARSE \
258"ngCMatrix", "nsCMatrix", "ntCMatrix", \
259"lgCMatrix", "lsCMatrix", "ltCMatrix", \
260"igCMatrix", "isCMatrix", "itCMatrix", \
261"dgCMatrix", "dsCMatrix", "dtCMatrix", \
262"zgCMatrix", "zsCMatrix", "ztCMatrix"
264#define VALID_RSPARSE \
265"ngRMatrix", "nsRMatrix", "ntRMatrix", \
266"lgRMatrix", "lsRMatrix", "ltRMatrix", \
267"igRMatrix", "isRMatrix", "itRMatrix", \
268"dgRMatrix", "dsRMatrix", "dtRMatrix", \
269"zgRMatrix", "zsRMatrix", "ztRMatrix"
271#define VALID_TSPARSE \
272"ngTMatrix", "nsTMatrix", "ntTMatrix", \
273"lgTMatrix", "lsTMatrix", "ltTMatrix", \
274"igTMatrix", "isTMatrix", "itTMatrix", \
275"dgTMatrix", "dsTMatrix", "dtTMatrix", \
276"zgTMatrix", "zsTMatrix", "ztTMatrix"
278#define VALID_DIAGONAL \
279"ndiMatrix", "ldiMatrix", "idiMatrix", "ddiMatrix", "zdiMatrix"
296void symDN(SEXP, SEXP,
int);
297void revDN(SEXP, SEXP);
long long Matrix_int_fast64_t
void symDN(SEXP, SEXP, int)
char typeToKind(SEXPTYPE)
void set_reversed_DimNames(SEXP, SEXP)
SEXPTYPE kindToType(char)
int DimNames_is_symmetric(SEXP)
void set_symmetrized_DimNames(SEXP, SEXP, int)
SEXP get_reversed_DimNames(SEXP)
int DimNames_is_trivial(SEXP)
void validObject(SEXP, const char *)
SEXP newObject(const char *)
SEXP get_symmetrized_DimNames(SEXP, int)