8cholmod_factor *
M2CHF(SEXP obj,
int values)
10 cholmod_factor *L = (cholmod_factor *) R_alloc(1,
sizeof(cholmod_factor));
11 memset(L, 0,
sizeof(cholmod_factor));
13 type = PROTECT(
GET_SLOT(obj, install(
"type"))),
15 colcount = PROTECT(
GET_SLOT(obj, install(
"colcount"))),
17 L->n = INTEGER(dim)[0];
19 L->ordering = INTEGER(type)[0];
20 if (L->ordering != CHOLMOD_NATURAL)
21 L->Perm = INTEGER(perm);
26 int n = (int) L->n, *Perm = (
int *) R_alloc(L->n,
sizeof(
int));
27 for (
int j = 0; j < n; ++j)
31 L->ColCount = INTEGER(colcount);
32 L->is_super = INTEGER(type)[2];
36 SEXP super = PROTECT(
GET_SLOT(obj, install(
"super"))),
37 pi = PROTECT(
GET_SLOT(obj, install(
"pi"))),
38 px = PROTECT(
GET_SLOT(obj, install(
"px"))),
39 s = PROTECT(
GET_SLOT(obj, install(
"s")));
40 L->super = INTEGER(super);
44 L->nsuper = LENGTH(super) - 1;
45 L->ssize = ((
int *) L->pi)[L->nsuper];
46 L->xsize = ((
int *) L->px)[L->nsuper];
47 L->maxcsize = INTEGER(type)[4];
48 L->maxesize = INTEGER(type)[5];
51 L->is_ll = INTEGER(type)[1];
52 L->is_monotonic = INTEGER(type)[3];
53 if (values && x != R_NilValue) {
56 nz = PROTECT(
GET_SLOT(obj, install(
"nz"))),
57 nxt = PROTECT(
GET_SLOT(obj, install(
"nxt"))),
58 prv = PROTECT(
GET_SLOT(obj, install(
"prv")));
62 L->next = INTEGER(nxt);
63 L->prev = INTEGER(prv);
64 L->nzmax = ((
int *) L->p)[L->n];
68 L->itype = CHOLMOD_INT;
69 L->dtype = CHOLMOD_DOUBLE;
70 if (values && x != R_NilValue) {
74 L->xtype = CHOLMOD_COMPLEX;
78 L->xtype = CHOLMOD_REAL;
129 cholmod_dense *A = (cholmod_dense *) R_alloc(1,
sizeof(cholmod_dense));
130 memset(A, 0,
sizeof(cholmod_dense));
133 int m = INTEGER(dim)[0], n = INTEGER(dim)[1];
134 A->nrow = ((
trans) ? n : m);
135 A->ncol = ((
trans) ? m : n);
136 A->nzmax = A->nrow * A->ncol;
138 A->dtype = CHOLMOD_DOUBLE;
142 Rcomplex *px = COMPLEX(x);
146 Rcomplex *py = R_Calloc(A->nzmax, Rcomplex);
147 ztranspose2(py, px, m, n);
150 A->xtype = CHOLMOD_COMPLEX;
155 double *px = REAL(x);
159 double *py = R_Calloc(A->nzmax,
double);
160 dtranspose2(py, px, m, n);
163 A->xtype = CHOLMOD_REAL;
174SEXP
CHF2M(cholmod_factor *L,
int values)
176 if (L->itype != CHOLMOD_INT)
177 error(
_(
"wrong '%s'"),
"itype");
178 if (values && L->xtype != CHOLMOD_REAL && L->xtype != CHOLMOD_COMPLEX)
179 error(
_(
"wrong '%s'"),
"xtype");
180 if (values && L->dtype != CHOLMOD_DOUBLE)
181 error(
_(
"wrong '%s'"),
"dtype");
183 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
185 if (L->maxcsize > INT_MAX)
186 error(
_(
"'%s' would overflow type \"%s\""),
187 "maxcsize",
"integer");
190 error(
_(
"n+1 would overflow type \"%s\""),
193 if (L->minor < L->n) {
195 error(
_(
"leading principal minor of order %d is not positive"),
198 error(
_(
"leading principal minor of order %d is zero"),
201 char cl[] =
".CHM.....";
202 cl[0] = (!values) ?
'n' : ((L->xtype == CHOLMOD_COMPLEX) ?
'z' :
'd');
203 memcpy(
cl + 4, (L->is_super) ?
"super" :
"simpl", 5);
206 INTEGER(dim)[0] = INTEGER(dim)[1] = (int) L->n;
207 if (L->ordering != CHOLMOD_NATURAL) {
208 SEXP perm = PROTECT(allocVector(INTSXP, L->n));
213 SEXP type = PROTECT(allocVector(INTSXP, 6)),
214 colcount = PROTECT(allocVector(INTSXP, L->n));
215 INTEGER(type)[0] = L->ordering;
216 INTEGER(type)[1] = (L->is_super) ? 1 : L->is_ll;
217 INTEGER(type)[2] = (L->is_super) ? 1 : 0;
218 INTEGER(type)[3] = (L->is_super) ? 1 : L->is_monotonic;
219 INTEGER(type)[4] = (L->is_super) ? (
int) L->maxcsize : 0;
220 INTEGER(type)[5] = (L->is_super) ? (
int) L->maxesize : 0;
221 Matrix_memcpy(INTEGER(colcount), L->ColCount, L->n,
sizeof(
int));
222 SET_SLOT(obj, install(
"type"), type);
223 SET_SLOT(obj, install(
"colcount"), colcount);
225 SEXP super = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
226 pi = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
227 px = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
228 s = PROTECT(allocVector(INTSXP, L->ssize));
229 Matrix_memcpy(INTEGER(super), L->super, L->nsuper + 1,
sizeof(
int));
230 Matrix_memcpy(INTEGER(pi), L->pi, L->nsuper + 1,
sizeof(
int));
231 Matrix_memcpy(INTEGER(px), L->px, L->nsuper + 1,
sizeof(
int));
233 SET_SLOT(obj, install(
"super"), super);
239 SEXP p = PROTECT(allocVector(INTSXP, L->n + 1)),
240 i = PROTECT(allocVector(INTSXP, L->nzmax)),
241 nz = PROTECT(allocVector(INTSXP, L->n)),
242 nxt = PROTECT(allocVector(INTSXP, L->n + 2)),
243 prv = PROTECT(allocVector(INTSXP, L->n + 2));
258 R_xlen_t nx = (R_xlen_t) ((L->is_super) ? L->xsize : L->nzmax);
259 if (L->xtype == CHOLMOD_COMPLEX) {
260 PROTECT(x = allocVector(CPLXSXP, nx));
263 PROTECT(x = allocVector(REALSXP, nx));
273SEXP
CHS2M(cholmod_sparse *A,
int values,
char shape)
275 cholmod_sparse *A_ = A;
276 if (A->itype != CHOLMOD_INT)
277 error(
_(
"wrong '%s'"),
"itype");
278 if (values && A->xtype != CHOLMOD_REAL && A->xtype != CHOLMOD_COMPLEX)
279 error(
_(
"wrong '%s'"),
"xtype");
280 if (values && A->dtype != CHOLMOD_DOUBLE)
281 error(
_(
"wrong '%s'"),
"dtype");
282 if (A->nrow > INT_MAX || A->ncol > INT_MAX)
283 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
286 if (!A->packed || A->stype != 0)
287 A = cholmod_copy(A, A->stype, 1, &
c);
288 char cl[] =
"..CMatrix";
289 cl[0] = (!values) ?
'n' : ((A->xtype == CHOLMOD_COMPLEX) ?
'z' :
'd');
291 int m = (int) A->nrow, n = (
int) A->ncol, nnz = ((
int *) A->p)[A->ncol];
292 R_xlen_t n1a = (R_xlen_t) n + 1;
295 p = PROTECT(allocVector(INTSXP, n1a)),
296 i = PROTECT(allocVector(INTSXP, nnz));
305 if (A->xtype == CHOLMOD_COMPLEX) {
306 PROTECT(x = allocVector(CPLXSXP, nnz));
309 PROTECT(x = allocVector(REALSXP, nnz));
316 cholmod_free_sparse(&A, &
c);
323 if (A->xtype != CHOLMOD_REAL && A->xtype != CHOLMOD_COMPLEX)
324 error(
_(
"wrong '%s'"),
"xtype");
325 if (A->dtype != CHOLMOD_DOUBLE)
326 error(
_(
"wrong '%s'"),
"dtype");
328 error(
_(
"leading dimension not equal to number of rows"));
329 if (A->nrow > INT_MAX || A->ncol > INT_MAX)
330 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
331 int m = (int) A->nrow, n = (
int) A->ncol;
333 error(
_(
"attempt to allocate vector of length exceeding %s"),
335 char cl[] =
"...Matrix";
336 cl[0] = (A->xtype == CHOLMOD_COMPLEX) ?
'z' :
'd';
338 cl[2] = (shape ==
'g')
339 ?
'e' : ((shape ==
's') ?
'y' : ((shape ==
'p') ?
'o' :
'r'));
342 INTEGER(dim)[0] = (
trans) ? n : m;
343 INTEGER(dim)[1] = (
trans) ? m : n;
345 if (A->xtype == CHOLMOD_COMPLEX) {
346 PROTECT(x = allocVector(CPLXSXP, (R_xlen_t) m * n));
347 Rcomplex *px = COMPLEX(x), *py = (Rcomplex *) A->x;
351 ztranspose2(px, py, m, n);
353 PROTECT(x = allocVector(REALSXP, (R_xlen_t) m * n));
354 double *px = REAL(x), *py = (
double *) A->x;
358 dtranspose2(px, py, m, n);