Matrix r4655
Loading...
Searching...
No Matches
vector.c
Go to the documentation of this file.
1#include "Mdefines.h"
2#include "vector.h"
3
4SEXP v2spV(SEXP from)
5{
6 SEXP to = NULL, length = NULL, i = NULL, x = NULL;
7 R_xlen_t n_ = XLENGTH(from);
8
9#define V2SPV(_KIND_, _NZ_, \
10 _CTYPE1_, _SEXPTYPE1_, _PTR1_, \
11 _CTYPE2_, _SEXPTYPE2_, _PTR2_) \
12 do { \
13 PROTECT(to = newObject(#_KIND_ "sparseVector")); \
14 _CTYPE1_ *py = _PTR1_(from); \
15 for (k = 0; k < n; ++k) \
16 if (_NZ_(py[k])) \
17 ++nnz; \
18 PROTECT(i = allocVector(_SEXPTYPE2_, nnz)); \
19 PROTECT(x = allocVector(_SEXPTYPE1_, nnz)); \
20 _CTYPE2_ *pi = _PTR2_(i); \
21 _CTYPE1_ *px = _PTR1_(x); \
22 for (k = 0; k < n; ++k) { \
23 if (_NZ_(py[k])) { \
24 *(pi++) = (_CTYPE2_) (k + 1); \
25 *(px++) = py[k]; \
26 } \
27 } \
28 } while (0)
29
30#define V2SPV_CASES(_CTYPE2_, _SEXPTYPE2_, _PTR2_) \
31 do { \
32 switch (TYPEOF(from)) { \
33 case LGLSXP: \
34 V2SPV(l, ISNZ_LOGICAL, int, LGLSXP, LOGICAL, \
35 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
36 break; \
37 case INTSXP: \
38 V2SPV(i, ISNZ_INTEGER, int, INTSXP, INTEGER, \
39 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
40 break; \
41 case REALSXP: \
42 V2SPV(d, ISNZ_REAL, double, REALSXP, REAL, \
43 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
44 break; \
45 case CPLXSXP: \
46 V2SPV(z, ISNZ_COMPLEX, Rcomplex, CPLXSXP, COMPLEX, \
47 _CTYPE2_, _SEXPTYPE2_, _PTR2_); \
48 break; \
49 default: \
50 ERROR_INVALID_TYPE(from, __func__); \
51 break; \
52 } \
53 } while (0)
54
55 if (n_ <= INT_MAX) {
56 int k, n = (int) n_, nnz = 0;
57 PROTECT(length = ScalarInteger(n));
58 V2SPV_CASES(int, INTSXP, INTEGER);
59 } else {
60 R_xlen_t k, n = n_, nnz = 0;
61 PROTECT(length = ScalarReal((double) n));
62 V2SPV_CASES(double, REALSXP, REAL);
63 }
64
65#undef V2SPV_CASES
66#undef V2SPV
67
68 SET_SLOT(to, Matrix_lengthSym, length);
69 SET_SLOT(to, Matrix_iSym, i);
70 SET_SLOT(to, Matrix_xSym, x);
71
72 UNPROTECT(4); /* x, i, length, to */
73 return to;
74}
75
76SEXP CR2spV(SEXP from)
77{
78 static const char *valid[] = { VALID_CSPARSE, VALID_RSPARSE, "" };
79 int ivalid = R_check_class_etc(from, valid);
80 if (ivalid < 0)
81 ERROR_INVALID_CLASS(from, __func__);
82 const char *cl = valid[ivalid];
83
84 SEXP dim = PROTECT(GET_SLOT(from, Matrix_DimSym));
85 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
87 UNPROTECT(1); /* dim */
88
89 if (mn > 0x1.0p+53)
90 error(_("%s length cannot exceed %s"), "sparseVector", "2^53");
91
92 /* defined in ./coerce.c : */
93 SEXP sparse_as_general(SEXP, const char *);
94 PROTECT(from = sparse_as_general(from, cl));
95
96 char vcl[] = ".sparseVector";
97 vcl[0] = cl[0];
98 SEXP to = PROTECT(newObject(vcl));
99
100 SEXP p = PROTECT(GET_SLOT(from, Matrix_pSym));
101 int *pp = INTEGER(p), nnz = (cl[2] == 'C') ? pp[n] : pp[m];
102
103 SEXP vlength, vi;
104 if (mn <= INT_MAX) {
105 PROTECT(vlength = ScalarInteger(m * n));
106 PROTECT(vi = allocVector(INTSXP, nnz));
107 } else {
108 PROTECT(vlength = ScalarReal((double) m * n));
109 PROTECT(vi = allocVector(REALSXP, nnz));
110 }
111 SET_SLOT(to, Matrix_lengthSym, vlength);
112 SET_SLOT(to, Matrix_iSym, vi);
113
114 if (cl[2] == 'C') {
115 SEXP i = PROTECT(GET_SLOT(from, Matrix_iSym));
116 int *pi = INTEGER(i), k, kend, j;
117 if (TYPEOF(vi) == INTSXP) {
118 int *pvi = INTEGER(vi), mj1a = 1;
119 for (j = 0, k = 0; j < n; ++j) {
120 kend = *(++pp);
121 while (k < kend) {
122 *(pvi++) = mj1a + *(pi++);
123 ++k;
124 }
125 mj1a += m;
126 }
127 } else {
128 double *pvi = REAL(vi), mj1a = 1.0, m_ = (double) m;
129 for (j = 0, k = 0; j < n; ++j) {
130 kend = *(++pp);
131 while (k < kend) {
132 *(pvi++) = mj1a + (double) *(pi++);
133 ++k;
134 }
135 mj1a += m_;
136 }
137 }
138 if (cl[0] != 'n') {
139 SEXP vx = PROTECT(GET_SLOT(from, Matrix_xSym));
140 SET_SLOT(to, Matrix_xSym, vx);
141 UNPROTECT(1); /* vx */
142 }
143 UNPROTECT(1); /* i */
144 } else {
145 SEXP j = PROTECT(GET_SLOT(from, Matrix_jSym));
146 int *pj = INTEGER(j), k, kend, tmp, *work;
147 Matrix_Calloc(work, n, int);
148 for (k = 0; k < nnz; ++k)
149 work[pj[k]]++;
150 nnz = 0;
151 for (k = 0; k < n; ++k) {
152 tmp = work[k];
153 work[k] = nnz;
154 nnz += tmp;
155 }
156
157#define R2SPV(_CTYPE_, _PTR_, _MASK_) \
158 do { \
159 _MASK_(_CTYPE_ *px = _PTR_(x )); \
160 _MASK_(_CTYPE_ *pvx = _PTR_(vx)); \
161 if (TYPEOF(vi) == INTSXP) { \
162 int *pvi = INTEGER(vi), i; \
163 k = 0; \
164 for (i = 1; i <= m; i += 1) { \
165 kend = *(++pp); \
166 while (k < kend) { \
167 pvi[work[pj[k]]] = m * pj[k] + i; \
168 _MASK_(pvx[work[pj[k]]] = px[k]); \
169 work[pj[k++]]++; \
170 } \
171 } \
172 } else { \
173 double *pvi = REAL(vi), i_, m_ = (double) m; \
174 k = 0; \
175 for (i_ = 1.0; i_ <= m_; i_ += 1.0) { \
176 kend = *(++pp); \
177 while (k < kend) { \
178 pvi[work[pj[k]]] = m_ * pj[k] + i_; \
179 _MASK_(pvx[work[pj[k]]] = px[k]); \
180 work[pj[k++]]++; \
181 } \
182 } \
183 } \
184 } while (0)
185
186 if (cl[0] == 'n')
187 R2SPV(, , HIDE);
188 else {
189 SEXP x = PROTECT(GET_SLOT(from, Matrix_xSym)),
190 vx = PROTECT(allocVector(TYPEOF(x), XLENGTH(x)));
191 switch (TYPEOF(x)) {
192 case LGLSXP:
193 R2SPV(int, LOGICAL, SHOW);
194 break;
195 case INTSXP:
196 R2SPV(int, INTEGER, SHOW);
197 break;
198 case REALSXP:
199 R2SPV(double, REAL, SHOW);
200 break;
201 case CPLXSXP:
202 R2SPV(Rcomplex, COMPLEX, SHOW);
203 break;
204 default:
205 break;
206 }
207 SET_SLOT(to, Matrix_xSym, vx);
208 UNPROTECT(2); /* vx, x */
209 }
210
211#undef R2SV
212
213 UNPROTECT(1); /* j */
214 Matrix_Free(work, n);
215 }
216
217 UNPROTECT(5); /* vi, vlength, p, to, from */
218 return to;
219}
#define VALID_RSPARSE
Definition Mdefines.h:264
long long Matrix_int_fast64_t
Definition Mdefines.h:27
#define ERROR_INVALID_CLASS(_X_, _FUNC_)
Definition Mdefines.h:208
#define _(String)
Definition Mdefines.h:44
#define HIDE(...)
Definition Mdefines.h:202
#define SHOW(...)
Definition Mdefines.h:201
#define VALID_CSPARSE
Definition Mdefines.h:257
#define Matrix_Free(_VAR_, _N_)
Definition Mdefines.h:77
#define SET_SLOT(x, what, value)
Definition Mdefines.h:86
#define GET_SLOT(x, what)
Definition Mdefines.h:85
#define Matrix_Calloc(_VAR_, _N_, _CTYPE_)
Definition Mdefines.h:66
SEXP newObject(const char *)
Definition objects.c:4
SEXP Matrix_DimSym
Definition Msymbols.h:3
SEXP Matrix_xSym
Definition Msymbols.h:22
SEXP Matrix_lengthSym
Definition Msymbols.h:15
SEXP Matrix_iSym
Definition Msymbols.h:13
SEXP Matrix_jSym
Definition Msymbols.h:14
SEXP Matrix_pSym
Definition Msymbols.h:17
static const char * valid[]
Definition bind.c:5
cholmod_common cl
Definition cholmod-etc.c:6
SEXP sparse_as_general(SEXP from, const char *class)
Definition coerce.c:2831
SEXP v2spV(SEXP from)
Definition vector.c:4
#define V2SPV_CASES(_CTYPE2_, _SEXPTYPE2_, _PTR2_)
SEXP CR2spV(SEXP from)
Definition vector.c:76
#define R2SPV(_CTYPE_, _PTR_, _MASK_)