SCM Repository
Annotation of /pkg/Matrix/src/Mutils.h
Parent Directory
|
Revision Log
Revision 951 -
(view)
(download)
(as text)
Original Path: pkg/src/Mutils.h
1 : | bates | 10 | #ifndef MATRIX_MUTILS_H |
2 : | #define MATRIX_MUTILS_H | ||
3 : | |||
4 : | bates | 582 | #ifdef __cplusplus |
5 : | extern "C" { | ||
6 : | #endif | ||
7 : | maechler | 890 | |
8 : | bates | 10 | #include <Rdefines.h> |
9 : | bates | 268 | #include <Rconfig.h> |
10 : | bates | 582 | #include <R.h> /* to include Rconfig.h */ |
11 : | maechler | 890 | |
12 : | bates | 582 | #ifdef ENABLE_NLS |
13 : | #include <libintl.h> | ||
14 : | #define _(String) dgettext ("Matrix", String) | ||
15 : | #else | ||
16 : | #define _(String) (String) | ||
17 : | #endif | ||
18 : | maechler | 890 | |
19 : | SEXP triangularMatrix_validate(SEXP obj); | ||
20 : | SEXP symmetricMatrix_validate(SEXP obj); | ||
21 : | |||
22 : | bates | 582 | /* enum constants from cblas.h and some short forms */ |
23 : | enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102}; | ||
24 : | enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113}; | ||
25 : | enum CBLAS_UPLO {CblasUpper=121, CblasLower=122}; | ||
26 : | enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132}; | ||
27 : | enum CBLAS_SIDE {CblasLeft=141, CblasRight=142}; | ||
28 : | bates | 447 | #define RMJ CblasRowMajor |
29 : | #define CMJ CblasColMajor | ||
30 : | #define NTR CblasNoTrans | ||
31 : | #define TRN CblasTrans | ||
32 : | #define CTR CblasConjTrans | ||
33 : | #define UPP CblasUpper | ||
34 : | #define LOW CblasLower | ||
35 : | #define NUN CblasNonUnit | ||
36 : | #define UNT CblasUnit | ||
37 : | #define LFT CblasLeft | ||
38 : | #define RGT CblasRight | ||
39 : | |||
40 : | bates | 10 | char norm_type(char *typstr); |
41 : | char rcond_type(char *typstr); | ||
42 : | double get_double_by_name(SEXP obj, char *nm); | ||
43 : | SEXP set_double_by_name(SEXP obj, double val, char *nm); | ||
44 : | SEXP as_det_obj(double val, int log, int sign); | ||
45 : | bates | 476 | SEXP get_factors(SEXP obj, char *nm); |
46 : | SEXP set_factors(SEXP obj, SEXP val, char *nm); | ||
47 : | bates | 478 | SEXP dgCMatrix_set_Dim(SEXP x, int nrow); |
48 : | maechler | 943 | char uplo_value(SEXP x); |
49 : | char diag_value(SEXP x); | ||
50 : | |||
51 : | bates | 10 | int csc_unsorted_columns(int ncol, const int p[], const int i[]); |
52 : | void csc_sort_columns(int ncol, const int p[], int i[], double x[]); | ||
53 : | SEXP triple_as_SEXP(int nrow, int ncol, int nz, | ||
54 : | const int Ti [], const int Tj [], const double Tx [], | ||
55 : | char *Rclass); | ||
56 : | SEXP csc_check_column_sorting(SEXP A); | ||
57 : | bates | 588 | void csc_compTr(int m, int n, int nnz, |
58 : | const int xp[], const int xi[], const double xx[], | ||
59 : | int ap[], int ai[], double ax[]); | ||
60 : | bates | 10 | void ssc_symbolic_permute(int n, int upper, const int perm[], |
61 : | int Ap[], int Ai[]); | ||
62 : | bates | 493 | SEXP Matrix_make_named(int TYP, char **names); |
63 : | bates | 592 | SEXP check_scalar_string(SEXP sP, char *vals, char *nm); |
64 : | double *packed_to_full(double *dest, const double *src, int n, | ||
65 : | enum CBLAS_UPLO uplo); | ||
66 : | double *full_to_packed(double *dest, const double *src, int n, | ||
67 : | enum CBLAS_UPLO uplo, enum CBLAS_DIAG diag); | ||
68 : | bates | 597 | double *packed_getDiag(double *dest, SEXP x); |
69 : | bates | 862 | SEXP Matrix_getElement(SEXP list, char *nm); |
70 : | bates | 592 | |
71 : | bates | 738 | |
72 : | bates | 592 | extern /* stored pointers to symbols initialized in R_init_Matrix */ |
73 : | bates | 329 | #include "Syms.h" |
74 : | bates | 10 | |
75 : | bates | 432 | /* zero an array */ |
76 : | bates | 441 | #define AZERO(x, n) {int _I_, _SZ_ = (n); for(_I_ = 0; _I_ < _SZ_; _I_++) (x)[_I_] = 0;} |
77 : | bates | 432 | |
78 : | bates | 597 | /* number of elements in one triangle of a square matrix of order n */ |
79 : | #define PACKED_LENGTH(n) ((n) * ((n) + 1))/2 | ||
80 : | |||
81 : | bates | 738 | /* duplicate the slot with name given by sym from src to dest */ |
82 : | #define slot_dup(dest, src, sym) SET_SLOT(dest, sym, duplicate(GET_SLOT(src, sym))) | ||
83 : | |||
84 : | maechler | 951 | #define uplo_P(_x_) CHAR(STRING_ELT(GET_SLOT(_x_, Matrix_uploSym), 0)) |
85 : | #define diag_P(_x_) CHAR(STRING_ELT(GET_SLOT(_x_, Matrix_diagSym), 0)) | ||
86 : | |||
87 : | |||
88 : | maechler | 890 | /** |
89 : | bates | 597 | * Check for valid length of a packed triangular array and return the |
90 : | * corresponding number of columns | ||
91 : | maechler | 890 | * |
92 : | bates | 597 | * @param len length of a packed triangular array |
93 : | maechler | 890 | * |
94 : | bates | 597 | * @return number of columns |
95 : | */ | ||
96 : | static R_INLINE | ||
97 : | maechler | 890 | int packed_ncol(int len) |
98 : | bates | 597 | { |
99 : | int disc = 8 * len + 1; /* discriminant */ | ||
100 : | int sqrtd = (int) sqrt((double) disc); | ||
101 : | |||
102 : | if (len < 0 || disc != sqrtd * sqrtd) | ||
103 : | error(_("invalid 'len' = %d in packed_ncol")); | ||
104 : | return (sqrtd - 1)/2; | ||
105 : | } | ||
106 : | |||
107 : | maechler | 890 | /** |
108 : | bates | 536 | * Allocate an SEXP of given type and length, assign it as slot nm in |
109 : | * the object, and return the SEXP. The validity of this function | ||
110 : | * depends on SET_SLOT not duplicating val when NAMED(val) == 0. If | ||
111 : | * this behavior changes then ALLOC_SLOT must use SET_SLOT followed by | ||
112 : | * GET_SLOT to ensure that the value returned is indeed the SEXP in | ||
113 : | * the slot. | ||
114 : | maechler | 890 | * |
115 : | bates | 536 | * @param obj object in which to assign the slot |
116 : | * @param nm name of the slot, as an R name object | ||
117 : | * @param type type of SEXP to allocate | ||
118 : | * @param length length of SEXP to allocate | ||
119 : | maechler | 890 | * |
120 : | bates | 536 | * @return SEXP of given type and length assigned as slot nm in obj |
121 : | */ | ||
122 : | static R_INLINE | ||
123 : | SEXP ALLOC_SLOT(SEXP obj, SEXP nm, SEXPTYPE type, int length) | ||
124 : | { | ||
125 : | SEXP val = allocVector(type, length); | ||
126 : | bates | 441 | |
127 : | bates | 536 | SET_SLOT(obj, nm, val); |
128 : | return val; | ||
129 : | } | ||
130 : | |||
131 : | maechler | 890 | /** |
132 : | bates | 679 | * Expand compressed pointers in the array mp into a full set of indices |
133 : | bates | 536 | * in the array mj. |
134 : | maechler | 890 | * |
135 : | bates | 679 | * @param ncol number of columns (or rows) |
136 : | bates | 536 | * @param mp column pointer vector of length ncol + 1 |
137 : | bates | 679 | * @param mj vector of length mp[ncol] to hold the result |
138 : | maechler | 890 | * |
139 : | bates | 536 | * @return mj |
140 : | */ | ||
141 : | static R_INLINE | ||
142 : | bates | 679 | int* expand_cmprPt(int ncol, const int mp[], int mj[]) |
143 : | bates | 536 | { |
144 : | int j; | ||
145 : | for (j = 0; j < ncol; j++) { | ||
146 : | int j2 = mp[j+1], jj; | ||
147 : | for (jj = mp[j]; jj < j2; jj++) mj[jj] = j; | ||
148 : | } | ||
149 : | return mj; | ||
150 : | } | ||
151 : | |||
152 : | |||
153 : | maechler | 890 | /** |
154 : | bates | 536 | * Return the linear index of the (row, col) entry in a csc structure. |
155 : | * If the entry is not found and missing is 0 an error is signaled; | ||
156 : | * otherwise the missing value is returned. | ||
157 : | maechler | 890 | * |
158 : | bates | 536 | * @param p vector of column pointers |
159 : | * @param i vector of row indices | ||
160 : | * @param row row index | ||
161 : | * @param col column index | ||
162 : | * @param missing the value to return is the row, col entry does not | ||
163 : | * exist. If this is zero and the row, col entry does not exist an | ||
164 : | * error is signaled. | ||
165 : | maechler | 890 | * |
166 : | bates | 536 | * @return index of element at (row, col) if it exists, otherwise missing |
167 : | */ | ||
168 : | static R_INLINE int | ||
169 : | check_csc_index(const int p[], const int i[], int row, int col, int missing) | ||
170 : | { | ||
171 : | int k, k2 = p[col + 1]; | ||
172 : | /* linear search - perhaps replace by bsearch */ | ||
173 : | for (k = p[col]; k < k2; k++) if (i[k] == row) return k; | ||
174 : | if (!missing) | ||
175 : | error("row %d and column %d not defined in rowind and colptr", | ||
176 : | row, col); | ||
177 : | return missing; | ||
178 : | } | ||
179 : | |||
180 : | SEXP alloc3Darray(SEXPTYPE mode, int nrow, int ncol, int nface); | ||
181 : | |||
182 : | /** | ||
183 : | * Calculate the zero-based index in a row-wise packed lower triangular matrix. | ||
184 : | * This is used for the arrays of blocked sparse matrices. | ||
185 : | * | ||
186 : | * @param i column number (zero-based) | ||
187 : | * @param k row number (zero-based) | ||
188 : | * | ||
189 : | * @return The index of the (k,i) element of a packed lower triangular matrix | ||
190 : | */ | ||
191 : | static R_INLINE | ||
192 : | int Lind(int k, int i) | ||
193 : | { | ||
194 : | if (k < i) error("Lind(k = %d, i = %d) must have k >= i", k, i); | ||
195 : | return (k * (k + 1))/2 + i; | ||
196 : | } | ||
197 : | |||
198 : | maechler | 890 | /** |
199 : | bates | 536 | * Check for a complete match on matrix dimensions |
200 : | maechler | 890 | * |
201 : | bates | 536 | * @param xd dimensions of first matrix |
202 : | * @param yd dimensions of second matrix | ||
203 : | maechler | 890 | * |
204 : | bates | 536 | * @return 1 if dimensions match, otherwise 0 |
205 : | */ | ||
206 : | static R_INLINE | ||
207 : | int match_mat_dims(const int xd[], const int yd[]) | ||
208 : | { | ||
209 : | return xd[0] == yd[0] && xd[1] == yd[1]; | ||
210 : | } | ||
211 : | |||
212 : | double *expand_csc_column(double *dest, int m, int j, | ||
213 : | const int Ap[], const int Ai[], const double Ax[]); | ||
214 : | |||
215 : | maechler | 890 | /** |
216 : | bates | 565 | * Apply a permutation to an integer vector |
217 : | maechler | 890 | * |
218 : | bates | 565 | * @param i vector of 0-based indices |
219 : | * @param n length of vector i | ||
220 : | * @param perm 0-based permutation vector of length max(i) + 1 | ||
221 : | */ | ||
222 : | static R_INLINE void | ||
223 : | int_permute(int i[], int n, const int perm[]) | ||
224 : | { | ||
225 : | int j; | ||
226 : | for (j = 0; j < n; j++) i[j] = perm[i[j]]; | ||
227 : | } | ||
228 : | |||
229 : | maechler | 890 | /** |
230 : | bates | 565 | * Force index pairs to be in the upper triangle of a matrix |
231 : | maechler | 890 | * |
232 : | bates | 565 | * @param i vector of 0-based row indices |
233 : | * @param j vector of 0-based column indices | ||
234 : | * @param nnz length of index vectors | ||
235 : | */ | ||
236 : | static R_INLINE void | ||
237 : | make_upper_triangular(int i[], int j[], int nnz) | ||
238 : | { | ||
239 : | int k; | ||
240 : | for (k = 0; k < nnz; k++) { | ||
241 : | if (i[k] > j[k]) { | ||
242 : | int tmp = i[k]; | ||
243 : | i[k] = j[k]; | ||
244 : | j[k] = tmp; | ||
245 : | } | ||
246 : | } | ||
247 : | } | ||
248 : | bates | 572 | |
249 : | bates | 582 | void make_array_triangular(double *x, SEXP from); |
250 : | |||
251 : | bates | 738 | SEXP Matrix_expand_pointers(SEXP pP); |
252 : | |||
253 : | bates | 796 | |
254 : | maechler | 890 | /** |
255 : | bates | 796 | * Elementwise increment dest by src |
256 : | maechler | 890 | * |
257 : | bates | 796 | * @param dest vector to be incremented |
258 : | * @param src vector to be added to dest | ||
259 : | * @param n length of vectors | ||
260 : | maechler | 890 | * |
261 : | bates | 796 | * @return dest |
262 : | */ | ||
263 : | static R_INLINE double* | ||
264 : | vecIncrement(double dest[], const double src[], int n) { | ||
265 : | int i; | ||
266 : | for (i = 0; i < n; i++) dest[i] += src[i]; | ||
267 : | return dest; | ||
268 : | } | ||
269 : | |||
270 : | maechler | 890 | /** |
271 : | bates | 796 | * Elementwise sum of src1 and src2 into dest |
272 : | maechler | 890 | * |
273 : | bates | 796 | * @param dest vector to be incremented |
274 : | * @param src1 vector to be added | ||
275 : | * @param src1 second vector to be added | ||
276 : | * @param n length of vectors | ||
277 : | maechler | 890 | * |
278 : | bates | 796 | * @return dest |
279 : | */ | ||
280 : | static R_INLINE double* | ||
281 : | vecSum(double dest[], const double src1[], const double src2[], | ||
282 : | int n) { | ||
283 : | int i; | ||
284 : | for (i = 0; i < n; i++) dest[i] = src1[i] + src2[i]; | ||
285 : | return dest; | ||
286 : | } | ||
287 : | |||
288 : | bates | 582 | #ifdef __cplusplus |
289 : | } | ||
290 : | bates | 572 | #endif |
291 : | bates | 582 | |
292 : | #endif /* MATRIX_MUTILS_H_ */ |
root@r-forge.r-project.org | ViewVC Help |
Powered by ViewVC 1.0.0 |