Matrix r4655
Loading...
Searching...
No Matches
cholmod-common.c
Go to the documentation of this file.
1#include "Mdefines.h"
2#include "cholmod-common.h"
3
4/* NB: mostly parallel to CsparseMatrix_validate in ./validity.c */
5SEXP checkpi(SEXP p, SEXP i, int m, int n)
6{
7
8#define MKMS(_FORMAT_, ...) mkString(Matrix_sprintf(_FORMAT_, __VA_ARGS__))
9
10 if (TYPEOF(p) != INTSXP)
11 return MKMS(_("'%s' slot is not of type \"%s\""),
12 "p", "integer");
13 if (XLENGTH(p) - 1 != n)
14 return MKMS(_("'%s' slot does not have length %s"),
15 "p", "Dim[2]+1");
16 int *pp = INTEGER(p);
17 if (pp[0] != 0)
18 return MKMS(_("first element of '%s' slot is not 0"),
19 "p");
20 int j;
21 for (j = 1; j <= n; ++j) {
22 if (pp[j] == NA_INTEGER)
23 return MKMS(_("'%s' slot contains NA"),
24 "p");
25 if (pp[j] < pp[j - 1])
26 return MKMS(_("'%s' slot is not nondecreasing"),
27 "p");
28 if (pp[j] - pp[j - 1] > m)
29 return MKMS(_("first differences of '%s' slot exceed %s"),
30 "p", "Dim[1]");
31 }
32
33 if (TYPEOF(i) != INTSXP)
34 return MKMS(_("'%s' slot is not of type \"%s\""),
35 "i", "integer");
36 if (XLENGTH(i) < pp[n])
37 return MKMS(_("'%s' slot has length less than %s"),
38 "i", "p[length(p)]");
39 int *pi = INTEGER(i), k, kend, ik, i0, sorted = 1;
40 for (j = 1, k = 0; j <= n; ++j) {
41 kend = pp[j];
42 i0 = -1;
43 while (k < kend) {
44 ik = pi[k];
45 if (ik == NA_INTEGER)
46 return MKMS(_("'%s' slot contains NA"),
47 "i");
48 if (ik < 0 || ik >= m)
49 return MKMS(_("'%s' slot has elements not in {%s}"),
50 "i", "0,...,Dim[1]-1");
51 if (ik < i0)
52 sorted = 0;
53 else if (ik == i0)
54 return MKMS(_("'%s' slot is not increasing within columns after sorting"),
55 "i");
56 i0 = ik;
57 ++k;
58 }
59 }
60
61 SEXP ans = allocVector(LGLSXP, 1);
62 LOGICAL(ans)[0] = sorted;
63 return ans;
64}
65
79/* NB: mostly parallel to M2CHF in ./cholmod-etc.c */
80cholmod_factor *sexp_as_cholmod_factor(cholmod_factor *L, SEXP from)
81{
82 static const char *valid[] = {
83 "dCHMsuper", "dCHMsimpl", "nCHMsuper", "nCHMsimpl", "" };
84 int ivalid = R_check_class_etc(from, valid);
85 if (ivalid < 0)
86 ERROR_INVALID_CLASS(from, __func__);
87 const char *class = valid[ivalid];
88 memset(L, 0, sizeof(cholmod_factor));
89
90 SEXP dim = PROTECT(GET_SLOT(from, Matrix_DimSym)),
91 type = PROTECT(GET_SLOT(from, install("type"))),
92 perm = PROTECT(GET_SLOT(from, Matrix_permSym)),
93 colcount = PROTECT(GET_SLOT(from, install("colcount")));
94 L->n = INTEGER(dim)[0];
95 L->minor = L->n; /* FIXME: could be wrong for from <- new(...) */
96 L->ordering = INTEGER(type)[0];
97 if (L->ordering != CHOLMOD_NATURAL)
98 L->Perm = INTEGER(perm);
99 else {
100 /* cholmod_check_factor allows L->Perm == NULL,
101 but cholmod_copy_factor does not test, so it segfaults ...
102 */
103 int n = (int) L->n, *Perm = (int *) R_alloc(L->n, sizeof(int));
104 for (int j = 0; j < n; ++j)
105 Perm[j] = j;
106 L->Perm = Perm;
107 }
108 L->ColCount = INTEGER(colcount);
109 L->is_super = INTEGER(type)[2];
110 if (L->is_super) {
111 L->is_ll = 1;
112 L->is_monotonic = 1;
113 SEXP super = PROTECT(GET_SLOT(from, install("super"))),
114 pi = PROTECT(GET_SLOT(from, install("pi"))),
115 px = PROTECT(GET_SLOT(from, install("px"))),
116 s = PROTECT(GET_SLOT(from, install("s")));
117 L->super = INTEGER(super);
118 L->pi = INTEGER(pi);
119 L->px = INTEGER(px);
120 L->s = INTEGER(s);
121 L->nsuper = LENGTH(super) - 1;
122 L->ssize = ((int *) L->pi)[L->nsuper];
123 L->xsize = ((int *) L->px)[L->nsuper];
124 L->maxcsize = INTEGER(type)[4];
125 L->maxesize = INTEGER(type)[5];
126 UNPROTECT(4);
127 } else {
128 L->is_ll = INTEGER(type)[1];
129 L->is_monotonic = INTEGER(type)[3];
130 if (class[0] != 'n') {
131 SEXP p = PROTECT(GET_SLOT(from, Matrix_pSym)),
132 i = PROTECT(GET_SLOT(from, Matrix_iSym)),
133 nz = PROTECT(GET_SLOT(from, install("nz"))),
134 nxt = PROTECT(GET_SLOT(from, install("nxt"))),
135 prv = PROTECT(GET_SLOT(from, install("prv")));
136 L->p = INTEGER(p);
137 L->i = INTEGER(i);
138 L->nz = INTEGER(nz);
139 L->next = INTEGER(nxt);
140 L->prev = INTEGER(prv);
141 L->nzmax = ((int *) L->p)[L->n];
142 UNPROTECT(5);
143 }
144 }
145 L->itype = CHOLMOD_INT;
146 L->dtype = CHOLMOD_DOUBLE;
147 if (class[0] != 'n') {
148 SEXP x = GET_SLOT(from, Matrix_xSym);
149 switch (TYPEOF(x)) {
150 case CPLXSXP:
151 L->x = COMPLEX(x);
152 L->xtype = CHOLMOD_COMPLEX;
153 break;
154 case REALSXP:
155 L->x = REAL(x);
156 L->xtype = CHOLMOD_REAL;
157 break;
158 default:
159 ERROR_INVALID_TYPE(x, __func__);
160 break;
161 }
162 }
163
164 if (!cholmod_check_factor(L, &c))
165 error(_("'%s' failed in '%s'"), "cholmod_check_factor", __func__);
166 UNPROTECT(4);
167 return L;
168}
169
187/* NB: mostly parallel to M2CHS in ./cholmod-etc.c */
188cholmod_sparse *sexp_as_cholmod_sparse(cholmod_sparse *A, SEXP from,
189 Rboolean checkUnit, Rboolean sortInPlace)
190{
191 /* MJ: Do users really ever pass invalid 'from' ... ?
192 If not, then the code here could be simplified tremendously ...
193 */
194
195 static const char *valid[] = {
196 "dgCMatrix", "dsCMatrix", "dtCMatrix",
197 "lgCMatrix", "lsCMatrix", "ltCMatrix",
198 "ngCMatrix", "nsCMatrix", "ntCMatrix", "" };
199 int ivalid = R_check_class_etc(from, valid);
200 if (ivalid < 0)
201 ERROR_INVALID_CLASS(from, __func__);
202 const char *class = valid[ivalid];
203 memset(A, 0, sizeof(cholmod_sparse));
204
205 SEXP dim = GET_SLOT(from, Matrix_DimSym);
206 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
207
208 SEXP p = PROTECT(GET_SLOT(from, Matrix_pSym)),
209 i = PROTECT(GET_SLOT(from, Matrix_iSym)),
210 cpi = PROTECT(checkpi(p, i, m, n));
211 if (TYPEOF(cpi) != LGLSXP)
212 error(_("'%s' failed in '%s': %s"),
213 "checkpi", __func__, CHAR(STRING_ELT(cpi, 0)));
214 int *pp = INTEGER(p), *pi = INTEGER(i), sorted = LOGICAL(cpi)[0];
215 size_t np = (size_t) XLENGTH(p), ni = (size_t) XLENGTH(i);
216 if (!sorted && !sortInPlace) {
217 int *tmp;
218 tmp = (int *) R_alloc(np, sizeof(int));
219 memcpy(tmp, pp, np * sizeof(int));
220 pp = tmp;
221 tmp = (int *) R_alloc(ni, sizeof(int));
222 memcpy(tmp, pi, ni * sizeof(int));
223 pi = tmp;
224 }
225
226 A->nrow = m;
227 A->ncol = n;
228 A->p = pp;
229 A->i = pi;
230 A->nzmax = ni;
231 A->stype = 0;
232 A->itype = CHOLMOD_INT;
233 A->xtype = CHOLMOD_PATTERN;
234 A->dtype = CHOLMOD_DOUBLE;
235 A->sorted = LOGICAL(cpi)[0];
236 A->packed = 1;
237
238 if (ni > pp[n]) { /* overallocated */
239 A->packed = 0;
240 int *tmp = (int *) R_alloc(n, sizeof(int));
241 for (int j = 0; j < n; ++j)
242 tmp[j] = pp[j + 1] - pp[j];
243 A->nz = tmp;
244 }
245 if (class[1] == 's') {
246 SEXP uplo = GET_SLOT(from, Matrix_uploSym);
247 char ul = *CHAR(STRING_ELT(uplo, 0));
248 A->stype = (ul == 'U') ? 1 : -1;
249 }
250 if (class[0] != 'n') {
251 SEXP x = PROTECT(GET_SLOT(from, Matrix_xSym));
252 size_t nx = (size_t) XLENGTH(x);
253 switch (class[0]) {
254 case 'l':
255 case 'i':
256 {
257 int *px = (TYPEOF(x) == LGLSXP) ? LOGICAL(x) : INTEGER(x);
258 double *rtmp = (double *) R_alloc(nx, sizeof(double));
259 for (size_t ix = 0; ix < nx; ++ix)
260 rtmp[ix] = (px[ix] == NA_INTEGER)
261 ? NA_REAL : (double) px[ix];
262 A->x = rtmp;
263 A->xtype = CHOLMOD_REAL;
264 break;
265 }
266 case 'd':
267 {
268 double *px = REAL(x);
269 if (!sorted && !sortInPlace) {
270 double *rtmp = (double *) R_alloc(nx, sizeof(double));
271 memcpy(rtmp, px, nx * sizeof(double));
272 px = rtmp;
273 }
274 A->x = px;
275 A->xtype = CHOLMOD_REAL;
276 break;
277 }
278 case 'z':
279 {
280 Rcomplex *px = COMPLEX(x);
281 if (!sorted && !sortInPlace) {
282 Rcomplex *rtmp = (Rcomplex *) R_alloc(nx, sizeof(Rcomplex));
283 memcpy(rtmp, px, nx * sizeof(Rcomplex));
284 px = rtmp;
285 }
286 A->x = px;
287 A->xtype = CHOLMOD_COMPLEX;
288 break;
289 }
290 default:
291 break;
292 }
293 UNPROTECT(1); /* x */
294 }
295 if (!sorted && !cholmod_sort(A, &c))
296 error(_("'%s' failed in '%s'"), "cholmod_sort", __func__);
297 if (checkUnit && class[1] == 't' && n > 0) {
298 SEXP diag = GET_SLOT(from, Matrix_diagSym);
299 char di = *CHAR(STRING_ELT(diag, 0));
300 if (di != 'N') {
301 double one[] = { 1.0, 0.0 };
302 cholmod_sparse
303 *eye = cholmod_speye(n, n, A->xtype, &c),
304 *A1a = cholmod_add(A, eye, one, one, 1, 1, &c);
305 memcpy(A, A1a, sizeof(cholmod_sparse));
306 A->p = (int *) R_alloc(A1a->ncol + 1, sizeof(int));
307 memcpy(A->p, A1a->p, (A1a->ncol + 1) * sizeof(int));
308 A->i = (int *) R_alloc(A1a->nzmax, sizeof(int));
309 memcpy(A->i, A1a->i, A1a->nzmax * sizeof(int));
310 if (A1a->xtype != CHOLMOD_PATTERN) {
311 size_t size = (A1a->xtype == CHOLMOD_REAL)
312 ? sizeof(double) : sizeof(Rcomplex);
313 A->x = R_alloc(A1a->nzmax, size);
314 memcpy(A->x, A1a->x, A1a->nzmax * size);
315 }
316 cholmod_free_sparse(&eye, &c);
317 cholmod_free_sparse(&A1a, &c);
318 }
319 }
320
321 UNPROTECT(3); /* cpi, i, p */
322 return A;
323}
324
340cholmod_triplet *sexp_as_cholmod_triplet(cholmod_triplet *A, SEXP from,
341 Rboolean checkUnit)
342{
343 static const char *valid[] = {
344 "dgTMatrix", "dsTMatrix", "dtTMatrix",
345 "lgTMatrix", "lsTMatrix", "ltTMatrix",
346 "ngTMatrix", "nsTMatrix", "ntTMatrix", "" };
347 int ivalid = R_check_class_etc(from, valid);
348 if (ivalid < 0)
349 ERROR_INVALID_CLASS(from, __func__);
350 const char *class = valid[ivalid];
351 memset(A, 0, sizeof(cholmod_triplet));
352
353 SEXP dim = GET_SLOT(from, Matrix_DimSym);
354 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
355
356 SEXP i = PROTECT(GET_SLOT(from, Matrix_pSym)),
357 j = PROTECT(GET_SLOT(from, Matrix_iSym));
358 int *pi = INTEGER(i), *pj = INTEGER(j);
359 size_t nnz0 = (size_t) XLENGTH(i), nnz1 = nnz0;
360
361 if (checkUnit && class[1] == 't') {
362 SEXP diag = GET_SLOT(from, Matrix_diagSym);
363 char di = *CHAR(STRING_ELT(diag, 0));
364 if (di != 'N')
365 nnz1 += n;
366 }
367
368 if (nnz0 < nnz1) {
369 int *tmp;
370 tmp = (int *) R_alloc(nnz1, sizeof(int));
371 memcpy(tmp, pi, nnz1 * sizeof(int));
372 pi = tmp;
373 tmp = (int *) R_alloc(nnz1, sizeof(int));
374 memcpy(tmp, pj, nnz1 * sizeof(int));
375 pj = tmp;
376
377 pi += nnz0; pj += nnz0;
378 for (int d = 0; d < n; ++d)
379 *(pi++) = *(pj++) = d;
380 pi -= nnz1; pj -= nnz1;
381 }
382
383 A->nrow = m;
384 A->ncol = n;
385 A->i = pi;
386 A->j = pj;
387 A->nzmax = nnz1;
388 A->nnz = nnz1;
389 A->stype = 0;
390 A->itype = CHOLMOD_INT;
391 A->xtype = CHOLMOD_PATTERN;
392 A->dtype = CHOLMOD_DOUBLE;
393
394 if (class[1] == 's') {
395 SEXP uplo = GET_SLOT(from, Matrix_uploSym);
396 char ul = *CHAR(STRING_ELT(uplo, 0));
397 A->stype = (ul == 'U') ? 1 : -1;
398 }
399 if (class[0] != 'n') {
400 SEXP x = PROTECT(GET_SLOT(from, Matrix_xSym));
401 switch (class[0]) {
402 case 'l':
403 case 'i':
404 {
405 int *px = (TYPEOF(x) == LGLSXP) ? LOGICAL(x) : INTEGER(x);
406 double *rtmp = (double *) R_alloc(nnz1, sizeof(double));
407 for (size_t k = 0; k < nnz0; ++k)
408 rtmp[k] = (px[k] == NA_INTEGER)
409 ? NA_REAL : (double) px[k];
410 for (size_t k = nnz0; k < nnz1; ++k)
411 rtmp[k] = 1.0;
412 A->x = rtmp;
413 A->xtype = CHOLMOD_REAL;
414 break;
415 }
416 case 'd':
417 {
418 double *px = REAL(x);
419 if (nnz0 < nnz1) {
420 double *rtmp = (double *) R_alloc(nnz1, sizeof(double));
421 memcpy(rtmp, px, nnz0 * sizeof(double));
422 for (size_t k = nnz0; k < nnz1; ++k)
423 rtmp[k] = 1.0;
424 px = rtmp;
425 }
426 A->x = px;
427 A->xtype = CHOLMOD_REAL;
428 break;
429 }
430 case 'z':
431 {
432 Rcomplex *px = COMPLEX(x);
433 if (nnz0 < nnz1) {
434 Rcomplex *rtmp = (Rcomplex *) R_alloc(nnz1, sizeof(Rcomplex));
435 memcpy(rtmp, px, nnz0 * sizeof(Rcomplex));
436 for (size_t k = nnz0; k < nnz1; ++k)
437 rtmp[k] = Matrix_zone;
438 px = rtmp;
439 }
440 A->x = px;
441 A->xtype = CHOLMOD_COMPLEX;
442 break;
443 }
444 default:
445 break;
446 }
447 UNPROTECT(1); /* x */
448 }
449
450 UNPROTECT(2); /* j, i */
451 return A;
452}
453
469/* NB: mostly parallel to M2CHD in ./cholmod-etc.c */
470cholmod_dense *sexp_as_cholmod_dense(cholmod_dense *A, SEXP from)
471{
472 static const char *valid[] = {
473 "dgeMatrix", "lgeMatrix", "ngeMatrix", "" };
474 int ivalid = R_check_class_etc(from, valid);
475 memset(A, 0, sizeof(cholmod_dense));
476
477 int m, n;
478 if (ivalid < 0) {
479 switch (TYPEOF(from)) {
480 case LGLSXP:
481 case INTSXP:
482 case REALSXP:
483 case CPLXSXP:
484 break;
485 default:
486 ERROR_INVALID_TYPE(from, __func__);
487 break;
488 }
489 SEXP dim = getAttrib(from, R_DimSymbol);
490 if (TYPEOF(dim) == INTSXP && LENGTH(dim) == 2) {
491 m = INTEGER(dim)[0];
492 n = INTEGER(dim)[1];
493 } else {
494 m = LENGTH(from);
495 n = 1;
496 }
497 } else {
498 SEXP dim = GET_SLOT(from, Matrix_DimSym);
499 m = INTEGER(dim)[0];
500 n = INTEGER(dim)[1];
501 from = GET_SLOT(from, Matrix_xSym);
502 }
503
504 A->nrow = m;
505 A->ncol = n;
506 A->nzmax = A->nrow * A->ncol;
507 A->d = A->nrow;
508 A->dtype = CHOLMOD_DOUBLE;
509
510 size_t nx = (size_t) XLENGTH(from);
511 switch (TYPEOF(from)) {
512 case LGLSXP:
513 case INTSXP:
514 {
515 int *px = (TYPEOF(from) == LGLSXP) ? LOGICAL(from) : INTEGER(from),
516 pattern = ivalid == 2;
517 double *rtmp = (double *) R_alloc(nx + 1, sizeof(double));
518 for (size_t ix = 0; ix < nx; ++ix)
519 rtmp[ix] = (px[ix] == NA_INTEGER)
520 ? ((pattern) ? 1.0 : NA_REAL) : (double) px[ix];
521 A->x = rtmp;
522 A->xtype = CHOLMOD_REAL;
523 break;
524 }
525 case REALSXP:
526 A->x = REAL(from);
527 A->xtype = CHOLMOD_REAL;
528 break;
529 case CPLXSXP:
530 A->x = COMPLEX(from);
531 A->xtype = CHOLMOD_COMPLEX;
532 break;
533 default:
534 ERROR_INVALID_TYPE(from, __func__);
535 break;
536 }
537
538 return A;
539}
540
554cholmod_dense *numeric_as_cholmod_dense(cholmod_dense *A,
555 double *data, int nrow, int ncol)
556{
557 memset(A, 0, sizeof(cholmod_dense));
558 A->nrow = nrow;
559 A->ncol = ncol;
560 A->nzmax = A->nrow * A->ncol;
561 A->d = A->nrow;
562 A->x = data;
563 A->xtype = CHOLMOD_REAL;
564 A->dtype = CHOLMOD_DOUBLE;
565 return A;
566}
567
583/* NB: mostly parallel to CHF2M in ./cholmod-etc.c */
584SEXP cholmod_factor_as_sexp(cholmod_factor *L, int doFree)
585{
586
587#define FREE_THEN(_EXPR_) \
588 do { \
589 if (doFree != 0) { \
590 if (doFree < 0) \
591 R_Free(L); \
592 else if (L->itype == CHOLMOD_INT) \
593 cholmod_free_factor(&L, &c); \
594 else \
595 cholmod_l_free_factor(&L, &cl); \
596 _EXPR_; \
597 } \
598 } while (0)
599
600 if (L->itype != CHOLMOD_INT)
601 FREE_THEN(error(_("wrong '%s'"), "itype"));
602 if (L->xtype != CHOLMOD_PATTERN &&
603 L->xtype != CHOLMOD_REAL && L->xtype != CHOLMOD_COMPLEX)
604 FREE_THEN(error(_("wrong '%s'"), "xtype"));
605 if (L->dtype != CHOLMOD_DOUBLE)
606 FREE_THEN(error(_("wrong '%s'"), "dtype"));
607 if (L->n > INT_MAX)
608 FREE_THEN(error(_("dimensions cannot exceed %s"), "2^31-1"));
609 if (L->super) {
610 if (L->maxcsize > INT_MAX)
611 FREE_THEN(error(_("'%s' would overflow type \"%s\""),
612 "maxcsize", "integer"));
613 } else {
614 if (L->n == INT_MAX)
615 FREE_THEN(error(_("n+1 would overflow type \"%s\""),
616 "integer"));
617 }
618 if (L->minor < L->n) {
619 if (L->is_ll)
620 FREE_THEN(error(_("leading principal minor of order %d is not positive"),
621 (int) L->minor + 1));
622 else
623 FREE_THEN(error(_("leading principal minor of order %d is zero"),
624 (int) L->minor + 1));
625 }
626 char class[] = ".CHM.....";
627 class[0] = (L->xtype == CHOLMOD_PATTERN)
628 ? 'n' : ((L->xtype == CHOLMOD_COMPLEX) ? 'z' : 'd');
629 memcpy(class + 4, (L->is_super) ? "super" : "simpl", 5);
630 SEXP to = PROTECT(newObject(class)),
631 dim = PROTECT(GET_SLOT(to, Matrix_DimSym));
632 INTEGER(dim)[0] = INTEGER(dim)[1] = (int) L->n;
633 if (L->ordering != CHOLMOD_NATURAL) {
634 SEXP perm = PROTECT(allocVector(INTSXP, L->n));
635 memcpy(INTEGER(perm), L->Perm, L->n * sizeof(int));
636 SET_SLOT(to, Matrix_permSym, perm);
637 UNPROTECT(1);
638 }
639 SEXP type = PROTECT(allocVector(INTSXP, 6)),
640 colcount = PROTECT(allocVector(INTSXP, L->n));
641 INTEGER(type)[0] = L->ordering;
642 INTEGER(type)[1] = (L->is_super) ? 1 : L->is_ll;
643 INTEGER(type)[2] = (L->is_super) ? 1 : 0;
644 INTEGER(type)[3] = (L->is_super) ? 1 : L->is_monotonic;
645 INTEGER(type)[4] = (L->is_super) ? (int) L->maxcsize : 0;
646 INTEGER(type)[5] = (L->is_super) ? (int) L->maxesize : 0;
647 memcpy(INTEGER(colcount), L->ColCount, L->n * sizeof(int));
648 SET_SLOT(to, install("type"), type);
649 SET_SLOT(to, install("colcount"), colcount);
650 if (L->is_super) {
651 SEXP super = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
652 pi = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
653 px = PROTECT(allocVector(INTSXP, L->nsuper + 1)),
654 s = PROTECT(allocVector(INTSXP, L->ssize));
655 memcpy(INTEGER(super), L->super, (L->nsuper + 1) * sizeof(int));
656 memcpy(INTEGER(pi), L->pi, (L->nsuper + 1) * sizeof(int));
657 memcpy(INTEGER(px), L->px, (L->nsuper + 1) * sizeof(int));
658 memcpy(INTEGER(s), L->s, L->ssize * sizeof(int));
659 SET_SLOT(to, install("super"), super);
660 SET_SLOT(to, install("pi"), pi);
661 SET_SLOT(to, install("px"), px);
662 SET_SLOT(to, install("s"), s);
663 UNPROTECT(4);
664 } else if (L->xtype != CHOLMOD_PATTERN) {
665 SEXP p = PROTECT(allocVector(INTSXP, L->n + 1)),
666 i = PROTECT(allocVector(INTSXP, L->nzmax)),
667 nz = PROTECT(allocVector(INTSXP, L->n)),
668 nxt = PROTECT(allocVector(INTSXP, L->n + 2)),
669 prv = PROTECT(allocVector(INTSXP, L->n + 2));
670 memcpy(INTEGER(p), L->p, (L->n + 1) * sizeof(int));
671 memcpy(INTEGER(i), L->i, L->nzmax * sizeof(int));
672 memcpy(INTEGER(nz), L->nz, L->n * sizeof(int));
673 memcpy(INTEGER(nxt), L->next, (L->n + 2) * sizeof(int));
674 memcpy(INTEGER(prv), L->prev, (L->n + 2) * sizeof(int));
675 SET_SLOT(to, Matrix_pSym, p);
676 SET_SLOT(to, Matrix_iSym, i);
677 SET_SLOT(to, install("nz"), nz);
678 SET_SLOT(to, install("nxt"), nxt);
679 SET_SLOT(to, install("prv"), prv);
680 UNPROTECT(5);
681 }
682 if (L->xtype != CHOLMOD_PATTERN) {
683 SEXP x;
684 R_xlen_t nx = (R_xlen_t) ((L->is_super) ? L->xsize : L->nzmax);
685 if (L->xtype == CHOLMOD_COMPLEX) {
686 PROTECT(x = allocVector(CPLXSXP, nx));
687 memcpy(COMPLEX(x), L->x, (size_t) nx * sizeof(Rcomplex));
688 } else {
689 PROTECT(x = allocVector(REALSXP, nx));
690 memcpy(REAL(x), L->x, (size_t) nx * sizeof(double));
691 }
692 SET_SLOT(to, Matrix_xSym, x);
693 UNPROTECT(1);
694 }
695
696 FREE_THEN();
697
698#undef FREE_THEN
699
700 UNPROTECT(4);
701 return to;
702}
703
731/* NB: mostly parallel to CHS2M in ./cholmod-etc.c */
732SEXP cholmod_sparse_as_sexp(cholmod_sparse *A, int doFree,
733 int ttype, int doLogic, const char *diagString,
734 SEXP dimnames)
735{
736
737#define FREE_THEN(_EXPR_) \
738 do { \
739 if (doFree != 0) { \
740 if (doFree < 0) \
741 R_Free(A_); \
742 else if (A_->itype == CHOLMOD_INT) \
743 cholmod_free_sparse(&A_, &c); \
744 else \
745 cholmod_l_free_sparse(&A_, &cl); \
746 _EXPR_; \
747 } \
748 } while (0)
749
750 cholmod_sparse *A_ = A;
751 if (A->itype != CHOLMOD_INT)
752 FREE_THEN(error(_("wrong '%s'"), "itype"));
753 if (A->xtype != CHOLMOD_PATTERN &&
754 A->xtype != CHOLMOD_REAL && A->xtype != CHOLMOD_COMPLEX)
755 FREE_THEN(error(_("wrong '%s'"), "xtype"));
756 if (A->dtype != CHOLMOD_DOUBLE)
757 FREE_THEN(error(_("wrong '%s'"), "dtype"));
758 if (A->nrow > INT_MAX || A->ncol > INT_MAX)
759 FREE_THEN(error(_("dimensions cannot exceed %s"), "2^31-1"));
760 if (!A->sorted)
761 cholmod_sort(A, &c);
762 if (!A->packed || A->stype != 0)
763 A = cholmod_copy(A, A->stype, 1, &c);
764 int m = (int) A->nrow, n = (int) A->ncol, nnz = ((int *) A->p)[A->ncol];
765 R_xlen_t n1a = (R_xlen_t) n + 1;
766 char class[] = "..CMatrix";
767 class[0] = (A->xtype == CHOLMOD_PATTERN)
768 ? 'n' : ((A->xtype == CHOLMOD_COMPLEX) ? 'z' : ((doLogic) ? 'l' : 'd'));
769 class[1] = (ttype != 0) ? 't' : ((A->stype != 0) ? 's' : 'g');
770 SEXP to = PROTECT(newObject(class)),
771 dim = PROTECT(GET_SLOT(to, Matrix_DimSym)),
772 p = PROTECT(allocVector(INTSXP, n1a)),
773 i = PROTECT(allocVector(INTSXP, nnz));
774 INTEGER(dim)[0] = m;
775 INTEGER(dim)[1] = n;
776 memcpy(INTEGER(p), A->p, (size_t) n1a * sizeof(int));
777 memcpy(INTEGER(i), A->i, (size_t) nnz * sizeof(int));
778 SET_SLOT(to, Matrix_pSym, p);
779 SET_SLOT(to, Matrix_iSym, i);
780 if (A->xtype != CHOLMOD_PATTERN) {
781 SEXP x;
782 if (A->xtype == CHOLMOD_COMPLEX) {
783 PROTECT(x = allocVector(CPLXSXP, nnz));
784 memcpy(COMPLEX(x), A->x, (size_t) nnz * sizeof(Rcomplex));
785 } else if (!doLogic) {
786 PROTECT(x = allocVector(REALSXP, nnz));
787 memcpy(REAL(x), A->x, (size_t) nnz * sizeof(double));
788 } else {
789 PROTECT(x = allocVector(LGLSXP, nnz));
790 int *px = LOGICAL(x);
791 double *py = (double *) A->x;
792 for (int k = 0; k < nnz; ++k)
793 px[k] = (ISNAN(py[k])) ? NA_LOGICAL : (py[k] != 0.0);
794 }
795 SET_SLOT(to, Matrix_xSym, x);
796 UNPROTECT(1);
797 }
798 if (ttype < 0 || A->stype < 0) {
799 SEXP uplo = PROTECT(mkString("L"));
800 SET_SLOT(to, Matrix_uploSym, uplo);
801 UNPROTECT(1);
802 }
803 if (ttype != 0 && diagString && diagString[0] != 'N') {
804 SEXP diag = PROTECT(mkString("U"));
805 SET_SLOT(to, Matrix_diagSym, diag);
806 UNPROTECT(1);
807 }
808 if (TYPEOF(dimnames) == VECSXP && LENGTH(dimnames) == 2)
809 SET_SLOT(to, Matrix_DimNamesSym, dimnames);
810
811 if (A != A_)
812 cholmod_free_sparse(&A, &c);
813 FREE_THEN();
814
815#undef FREE_THEN
816
817 UNPROTECT(4);
818 return to;
819}
820
848SEXP cholmod_triplet_as_sexp(cholmod_triplet *A, int doFree,
849 int ttype, int doLogic, const char *diagString,
850 SEXP dimnames)
851{
852
853#define FREE_THEN(_EXPR_) \
854 do { \
855 if (doFree != 0) { \
856 if (doFree < 0) \
857 R_Free(A); \
858 else if (A->itype == CHOLMOD_INT) \
859 cholmod_free_triplet(&A, &c); \
860 else \
861 cholmod_l_free_triplet(&A, &cl); \
862 _EXPR_; \
863 } \
864 } while (0)
865
866 if (A->itype != CHOLMOD_INT)
867 FREE_THEN(error(_("wrong '%s'"), "itype"));
868 if (A->xtype != CHOLMOD_PATTERN &&
869 A->xtype != CHOLMOD_REAL && A->xtype != CHOLMOD_COMPLEX)
870 FREE_THEN(error(_("wrong '%s'"), "xtype"));
871 if (A->dtype != CHOLMOD_DOUBLE)
872 FREE_THEN(error(_("wrong '%s'"), "dtype"));
873 if (A->nrow > INT_MAX || A->ncol > INT_MAX)
874 FREE_THEN(error(_("dimensions cannot exceed %s"), "2^31-1"));
875 int m = (int) A->nrow, n = (int) A->ncol;
876 R_xlen_t nnz = (R_xlen_t) A->nnz;
877 char class[] = "..TMatrix";
878 class[0] = (A->xtype == CHOLMOD_PATTERN)
879 ? 'n' : ((A->xtype == CHOLMOD_COMPLEX) ? 'z' : ((doLogic) ? 'l' : 'd'));
880 class[1] = (ttype != 0) ? 't' : ((A->stype != 0) ? 's' : 'g');
881 SEXP to = PROTECT(newObject(class)),
882 dim = PROTECT(GET_SLOT(to, Matrix_DimSym)),
883 i = PROTECT(allocVector(INTSXP, nnz)),
884 j = PROTECT(allocVector(INTSXP, nnz));
885 INTEGER(dim)[0] = m;
886 INTEGER(dim)[1] = n;
887 memcpy(INTEGER(i), A->i, (size_t) nnz * sizeof(int));
888 memcpy(INTEGER(j), A->j, (size_t) nnz * sizeof(int));
889 if (A->stype != 0) {
890 int tmp, *pi = INTEGER(i), *pj = INTEGER(j);
891 for (R_xlen_t k = 0; k < nnz; ++k) {
892 tmp = pi[k];
893 pi[k] = pj[k];
894 pj[k] = tmp;
895 }
896 }
897 SET_SLOT(to, Matrix_iSym, i);
898 SET_SLOT(to, Matrix_jSym, j);
899 if (A->xtype != CHOLMOD_PATTERN) {
900 SEXP x;
901 if (A->xtype == CHOLMOD_COMPLEX) {
902 PROTECT(x = allocVector(CPLXSXP, nnz));
903 memcpy(COMPLEX(x), A->x, (size_t) nnz * sizeof(Rcomplex));
904 } else if (!doLogic) {
905 PROTECT(x = allocVector(REALSXP, nnz));
906 memcpy(REAL(x), A->x, (size_t) nnz * sizeof(double));
907 } else {
908 PROTECT(x = allocVector(LGLSXP, nnz));
909 int *px = LOGICAL(x);
910 double *py = (double *) A->x;
911 for (R_xlen_t k = 0; k < nnz; ++k)
912 px[k] = (ISNAN(py[k])) ? NA_LOGICAL : (py[k] != 0.0);
913 }
914 SET_SLOT(to, Matrix_xSym, x);
915 UNPROTECT(1);
916 }
917 if (ttype < 0 || A->stype < 0) {
918 SEXP uplo = PROTECT(mkString("L"));
919 SET_SLOT(to, Matrix_uploSym, uplo);
920 UNPROTECT(1);
921 }
922 if (ttype != 0 && diagString && diagString[0] != 'N') {
923 SEXP diag = PROTECT(mkString("U"));
924 SET_SLOT(to, Matrix_diagSym, diag);
925 UNPROTECT(1);
926 }
927 if (TYPEOF(dimnames) == VECSXP && LENGTH(dimnames) == 2)
928 SET_SLOT(to, Matrix_DimNamesSym, dimnames);
929
930 FREE_THEN();
931
932#undef FREE_THEN
933
934 UNPROTECT(4);
935 return to;
936}
937
953/* NB: mostly parallel to CHD2M in ./cholmod-etc.c */
954SEXP cholmod_dense_as_sexp(cholmod_dense *A, int doFree)
955{
956
957#define FREE_THEN(_EXPR_) \
958 do { \
959 if (doFree != 0) { \
960 if (doFree < 0) \
961 R_Free(A); \
962 else \
963 cholmod_free_dense(&A, &c); \
964 _EXPR_; \
965 } \
966 } while (0)
967
968 if (A->xtype != CHOLMOD_REAL && A->xtype != CHOLMOD_COMPLEX)
969 FREE_THEN(error(_("wrong '%s'"), "xtype"));
970 if (A->dtype != CHOLMOD_DOUBLE)
971 FREE_THEN(error(_("wrong '%s'"), "dtype"));
972 if (A->d != A->nrow) /* MJ: currently no need to support this case */
973 FREE_THEN(error(_("leading dimension not equal to number of rows")));
974 if (A->nrow > INT_MAX || A->ncol > INT_MAX)
975 FREE_THEN(error(_("dimensions cannot exceed %s"), "2^31-1"));
976 int m = (int) A->nrow, n = (int) A->ncol;
977 if ((Matrix_int_fast64_t) m * n > R_XLEN_T_MAX)
978 FREE_THEN(error(_("attempt to allocate vector of length exceeding %s"),
979 "R_XLEN_T_MAX"));
980 char class[] = ".geMatrix";
981 class[0] = (A->xtype == CHOLMOD_COMPLEX) ? 'z' : 'd';
982 SEXP to = PROTECT(newObject(class)),
983 dim = PROTECT(GET_SLOT(to, Matrix_DimSym));
984 INTEGER(dim)[0] = m;
985 INTEGER(dim)[1] = n;
986 SEXP x;
987 if (A->xtype == CHOLMOD_COMPLEX) {
988 PROTECT(x = allocVector(CPLXSXP, (R_xlen_t) m * n));
989 memcpy(COMPLEX(x), A->x, (size_t) m * n * sizeof(Rcomplex));
990 } else {
991 PROTECT(x = allocVector(REALSXP, (R_xlen_t) m * n));
992 memcpy(REAL(x), A->x, (size_t) m * n * sizeof(double));
993 }
994 SET_SLOT(to, Matrix_xSym, x);
995
996 FREE_THEN();
997
998#undef FREE_THEN
999
1000 UNPROTECT(3);
1001 return to;
1002}
1003
1017double cholmod_factor_ldetA(cholmod_factor *L)
1018{
1019 int i, j, p;
1020 double ans = 0;
1021 if (L->is_super) {
1022 int *lpi = (int *) L->pi, *lsup = (int *) L->super;
1023 for (i = 0; i < L->nsuper; i++) {
1024 int nrp1 = 1 + lpi[i + 1] - lpi[i],
1025 nc = lsup[i + 1] - lsup[i];
1026 double *x = (double *) L->x + ((int *) L->px)[i];
1027 for (R_xlen_t jn = 0, j = 0; j < nc; j++, jn += nrp1)
1028 ans += 2.0 * log(fabs(x[jn]));
1029 }
1030 } else {
1031 int *li = (int *) L->i, *lp = (int *) L->p;
1032 double *lx = (double *) L->x;
1033 for (j = 0; j < L->n; j++) {
1034 for (p = lp[j]; li[p] != j && p < lp[j + 1]; p++)
1035 ;
1036 if (li[p] != j) {
1037 error(_("invalid simplicial Cholesky factorization: structural zero on main diagonal in column %d"),
1038 j);
1039 break;
1040 }
1041 ans += log(lx[p] * ((L->is_ll) ? lx[p] : 1.0));
1042 }
1043 }
1044 return ans;
1045}
1046
1064cholmod_factor *cholmod_factor_update(cholmod_factor *L, cholmod_sparse *A,
1065 double beta)
1066{
1067 int ll = L->is_ll;
1068 double z[2];
1069 z[0] = beta;
1070 z[1] = 0.0;
1071 if (!cholmod_factorize_p(A, z, NULL, 0, L, &c))
1072 error(_("'%s' failed in '%s'"), "cholmod_factorize_p", __func__);
1073 if (L->is_ll != ll &&
1074 !cholmod_change_factor(L->xtype, ll, L->is_super, 1, 1, L, &c))
1075 error(_("'%s' failed in '%s'"), "cholmod_change_factor", __func__);
1076 return L;
1077}
1078
1079#if 0
1080static
1081int R_cholmod_print_function(const char *fmt, ...)
1082{
1083 va_list(ap);
1084 va_start(ap, fmt);
1085 Rprintf((char *) fmt, ap);
1086 va_end(ap);
1087 return 0;
1088}
1089#endif
1090
1091static
1092void R_cholmod_error_handler(int status, const char *file, int line,
1093 const char *message)
1094{
1096 if (status < 0)
1097 error(_("CHOLMOD error '%s' at file '%s', line %d"),
1098 message, file, line);
1099 else
1100 warning(_("CHOLMOD warning '%s' at file '%s', line %d"),
1101 message, file, line);
1102}
1103
1104int R_cholmod_start(cholmod_common *Common)
1105{
1106 int ans = cholmod_start(Common);
1107 if (!ans)
1108 error(_("'%s' failed in '%s'"), "cholmod_start", __func__);
1109#if 0
1110 /* No longer, with SuiteSparse 5.7.1 : */
1111 Common->print_function =
1112# if 0
1113 R_cholmod_print_function;
1114# else
1115 NULL;
1116# endif
1117#endif
1118 Common->error_handler = R_cholmod_error_handler;
1119 return ans;
1120}
1121
1122int R_cholmod_finish(cholmod_common *Common)
1123{
1124 int ans = cholmod_finish(Common);
1125 if (!ans)
1126 error(_("'%s' failed in '%s'"), "cholmod_finish", __func__);
1127 return ans;
1128}
1129
1131
1132static
1133SEXP
1153
1155 if (!isEnvironment(rho))
1156 ERROR_INVALID_TYPE(rho, __func__);
1157 cholmod_common_env = rho;
1158 dboundSym = install("dbound");
1159 grow0Sym = install("grow0");
1160 grow1Sym = install("grow1");
1161 grow2Sym = install("grow2");
1162 maxrankSym = install("maxrank");
1163 supernodal_switchSym = install("supernodal_switch");
1164 supernodalSym = install("supernodal");
1165 final_asisSym = install("final_asis");
1166 final_superSym = install("final_super");
1167 final_llSym = install("final_ll");
1168 final_packSym = install("final_pack");
1169 final_monotonicSym = install("final_monotonic");
1170 final_resymbolSym = install("final_resymbol");
1171 prefer_zomplexSym = install("final_zomplex");
1172 prefer_upperSym = install("final_upper");
1173 quick_return_if_not_posdefSym = install("quick_return_if_not_posdef");
1174 nmethodsSym = install("nmethods");
1175 postorderSym = install("postorder");
1176 m0_ordSym = install("m0.ord");
1178 return R_NilValue;
1179}
1180
1182 SEXP rho = cholmod_common_env, tmp;
1183
1184#define SET_FRAME_FROM_MEMBER(_MEMBER_, _KIND_) \
1185 do { \
1186 PROTECT(tmp = Scalar ## _KIND_(c. _MEMBER_)); \
1187 defineVar(_MEMBER_ ## Sym, tmp, rho); \
1188 UNPROTECT(1); \
1189 } while (0)
1190
1191 SET_FRAME_FROM_MEMBER(dbound, Real);
1192 SET_FRAME_FROM_MEMBER(grow0, Real);
1193 SET_FRAME_FROM_MEMBER(grow1, Real);
1194 SET_FRAME_FROM_MEMBER(grow2, Integer);
1195 SET_FRAME_FROM_MEMBER(maxrank, Integer);
1196 SET_FRAME_FROM_MEMBER(supernodal_switch, Real);
1197 SET_FRAME_FROM_MEMBER(supernodal, Logical);
1198 SET_FRAME_FROM_MEMBER(final_asis, Logical);
1199 SET_FRAME_FROM_MEMBER(final_super, Logical);
1200 SET_FRAME_FROM_MEMBER(final_ll, Logical);
1201 SET_FRAME_FROM_MEMBER(final_pack, Logical);
1202 SET_FRAME_FROM_MEMBER(final_monotonic, Logical);
1203 SET_FRAME_FROM_MEMBER(final_resymbol, Logical);
1204 SET_FRAME_FROM_MEMBER(prefer_zomplex, Logical);
1205 SET_FRAME_FROM_MEMBER(prefer_upper, Logical);
1206 SET_FRAME_FROM_MEMBER(quick_return_if_not_posdef, Logical);
1207 SET_FRAME_FROM_MEMBER(nmethods, Integer);
1208 SET_FRAME_FROM_MEMBER(postorder, Logical);
1209
1210 PROTECT(tmp = ScalarInteger(c.method[0].ordering));
1211 defineVar(m0_ordSym, tmp, rho);
1212 UNPROTECT(1);
1213
1214 return;
1215}
1216
1218 SEXP rho = cholmod_common_env, tmp;
1219
1220#define GET_MEMBER_FROM_FRAME(_MEMBER_, _KIND_) \
1221 do { \
1222 PROTECT(tmp = findVarInFrame(rho, _MEMBER_ ## Sym)); \
1223 c. _MEMBER_ = as ## _KIND_(tmp); \
1224 UNPROTECT(1); \
1225 } while (0)
1226
1227 GET_MEMBER_FROM_FRAME(dbound, Real);
1228 GET_MEMBER_FROM_FRAME(grow0, Real);
1229 GET_MEMBER_FROM_FRAME(grow1, Real);
1230 GET_MEMBER_FROM_FRAME(grow2, Integer);
1231 GET_MEMBER_FROM_FRAME(maxrank, Integer);
1232 GET_MEMBER_FROM_FRAME(supernodal_switch, Real);
1233 GET_MEMBER_FROM_FRAME(supernodal, Logical);
1234 GET_MEMBER_FROM_FRAME(final_asis, Logical);
1235 GET_MEMBER_FROM_FRAME(final_super, Logical);
1236 GET_MEMBER_FROM_FRAME(final_ll, Logical);
1237 GET_MEMBER_FROM_FRAME(final_pack, Logical);
1238 GET_MEMBER_FROM_FRAME(final_monotonic, Logical);
1239 GET_MEMBER_FROM_FRAME(final_resymbol, Logical);
1240 GET_MEMBER_FROM_FRAME(prefer_zomplex, Logical);
1241 GET_MEMBER_FROM_FRAME(prefer_upper, Logical);
1242 GET_MEMBER_FROM_FRAME(quick_return_if_not_posdef, Logical);
1243 GET_MEMBER_FROM_FRAME(nmethods, Integer);
1244 GET_MEMBER_FROM_FRAME(postorder, Logical);
1245
1246 PROTECT(tmp = findVarInFrame(rho, m0_ordSym));
1247 c.method[0].ordering = asInteger(tmp);
1248 UNPROTECT(1);
1249
1250 return;
1251}
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 ERROR_INVALID_TYPE(_X_, _FUNC_)
Definition Mdefines.h:204
#define SET_SLOT(x, what, value)
Definition Mdefines.h:86
#define GET_SLOT(x, what)
Definition Mdefines.h:85
SEXP newObject(const char *)
Definition objects.c:4
SEXP Matrix_permSym
Definition Msymbols.h:18
SEXP Matrix_DimSym
Definition Msymbols.h:3
SEXP Matrix_xSym
Definition Msymbols.h:22
SEXP Matrix_iSym
Definition Msymbols.h:13
SEXP Matrix_jSym
Definition Msymbols.h:14
SEXP Matrix_DimNamesSym
Definition Msymbols.h:2
SEXP Matrix_diagSym
Definition Msymbols.h:11
SEXP Matrix_uploSym
Definition Msymbols.h:21
SEXP Matrix_pSym
Definition Msymbols.h:17
static const char * valid[]
Definition bind.c:5
static SEXP final_superSym
static SEXP grow2Sym
cholmod_dense * numeric_as_cholmod_dense(cholmod_dense *A, double *data, int nrow, int ncol)
Coerce from (double *) to (cholmod_dense *) with given dimensions.
static SEXP final_packSym
SEXP cholmod_sparse_as_sexp(cholmod_sparse *A, int doFree, int ttype, int doLogic, const char *diagString, SEXP dimnames)
Coerce from (cholmod_sparse *) to CsparseMatrix.
int R_cholmod_start(cholmod_common *Common)
static SEXP final_resymbolSym
#define SET_FRAME_FROM_MEMBER(_MEMBER_, _KIND_)
static SEXP prefer_zomplexSym
SEXP cholmod_common_env
void R_cholmod_common_envset(void)
cholmod_factor * sexp_as_cholmod_factor(cholmod_factor *L, SEXP from)
Coerce from CHMfactor to (cholmod_factor *)
SEXP cholmod_dense_as_sexp(cholmod_dense *A, int doFree)
Coerce from (cholmod_dense *) to [dz]geMatrix.
static SEXP dboundSym
int R_cholmod_finish(cholmod_common *Common)
static SEXP final_llSym
static SEXP final_asisSym
static SEXP prefer_upperSym
static SEXP quick_return_if_not_posdefSym
static SEXP nmethodsSym
static SEXP postorderSym
static void R_cholmod_error_handler(int status, const char *file, int line, const char *message)
static SEXP maxrankSym
static SEXP grow0Sym
static SEXP supernodal_switchSym
void R_cholmod_common_envget(void)
cholmod_triplet * sexp_as_cholmod_triplet(cholmod_triplet *A, SEXP from, Rboolean checkUnit)
Coerce from TsparseMatrix to (cholmod_triplet *)
SEXP checkpi(SEXP p, SEXP i, int m, int n)
cholmod_dense * sexp_as_cholmod_dense(cholmod_dense *A, SEXP from)
Coerce from [nlidz]geMatrix or vector to (cholmod_dense *)
SEXP cholmod_triplet_as_sexp(cholmod_triplet *A, int doFree, int ttype, int doLogic, const char *diagString, SEXP dimnames)
Coerce from (cholmod_triplet *) to TsparseMatrix.
static SEXP supernodalSym
double cholmod_factor_ldetA(cholmod_factor *L)
Log determinant from Cholesky factorization.
SEXP R_cholmod_common_envini(SEXP rho)
#define FREE_THEN(_EXPR_)
static SEXP final_monotonicSym
#define GET_MEMBER_FROM_FRAME(_MEMBER_, _KIND_)
static SEXP grow1Sym
cholmod_sparse * sexp_as_cholmod_sparse(cholmod_sparse *A, SEXP from, Rboolean checkUnit, Rboolean sortInPlace)
Coerce from CsparseMatrix to (cholmod_sparse *)
cholmod_factor * cholmod_factor_update(cholmod_factor *L, cholmod_sparse *A, double beta)
Update a Cholesky factorization.
SEXP cholmod_factor_as_sexp(cholmod_factor *L, int doFree)
Coerce from (cholmod_factor *) to CHMfactor.
static SEXP m0_ordSym
#define MKMS(_FORMAT_,...)
cholmod_common c
Definition cholmod-etc.c:5
Rcomplex Matrix_zone
Definition init.c:26