101 cholmod_sparse *At =
M2CHS(at, 1);
102 PROTECT(b = coerceVector(b, REALSXP));
103 if (LENGTH(b) != At->ncol)
104 error(
_(
"dimensions of '%s' and '%s' are inconsistent"),
"at",
"b");
105 if (At->ncol <= 0 || At->ncol < At->nrow)
106 error(
_(
"%s(%s, %s) requires m-by-n '%s' with n >= m > 0"),
107 "dgCMatrix_cholsol",
"at",
"b",
"at");
108 double zero[] = { 0.0, 0.0 }, one[] = {1.0, 0.0}, mone[] = { -1.0, 0.0 };
111 cholmod_factor *L = cholmod_analyze(At, &
c);
112 if (!cholmod_factorize(At, L, &
c))
113 error(
_(
"'%s' failed"),
"cholmod_factorize");
115 cholmod_dense *B = (cholmod_dense *) R_alloc(1,
sizeof(cholmod_dense));
116 memset(B, 0,
sizeof(cholmod_dense));
117 B->nrow = B->d = B->nzmax = LENGTH(b);
120 B->dtype = CHOLMOD_DOUBLE;
121 B->xtype = CHOLMOD_REAL;
124 cholmod_dense *AtB = cholmod_allocate_dense(
125 At->nrow, 1, At->nrow, CHOLMOD_REAL, &
c);
126 if (!cholmod_sdmult(At, 0, one, zero, B, AtB, &
c))
127 error(
_(
"'%s' failed"),
"cholmod_sdmult");
130 cholmod_dense *C = cholmod_solve(CHOLMOD_A, L, AtB, &
c);
132 error(
_(
"'%s' failed"),
"cholmod_solve");
135 cholmod_dense *R = cholmod_copy_dense(B, &
c);
136 if (!cholmod_sdmult(At, 1, mone, one, C, R, &
c))
137 error(
_(
"'%s' failed"),
"cholmod_sdmult");
139 const char *nms[] = {
"L",
"coef",
"Xty",
"resid",
""};
140 SEXP ans = PROTECT(Rf_mkNamed(VECSXP, nms)), tmp;
142 PROTECT(tmp =
CHF2M(L, 1));
143 SET_VECTOR_ELT(ans, 0, tmp);
145 PROTECT(tmp = allocVector(REALSXP, At->nrow));
147 SET_VECTOR_ELT(ans, 1, tmp);
149 PROTECT(tmp = allocVector(REALSXP, At->nrow));
151 SET_VECTOR_ELT(ans, 2, tmp);
153 PROTECT(tmp = allocVector(REALSXP, At->ncol));
155 SET_VECTOR_ELT(ans, 3, tmp);
157 cholmod_free_factor(& L, &
c);
158 cholmod_free_dense (&AtB, &
c);
159 cholmod_free_dense (& C, &
c);
160 cholmod_free_dense (& R, &
c);
181 static const char *
valid[] = {
191 if (TYPEOF(op) != STRSXP || LENGTH(op) < 1 ||
192 (op = STRING_ELT(op, 0)) == NA_STRING ||
194 error(
_(
"invalid '%s' to '%s'"),
"op", __func__);
197 char ul = (TYPEOF(uplo) == STRSXP && LENGTH(uplo) > 0)
198 ? *CHAR(STRING_ELT(uplo, 0)) :
'L';
201 int *pp = INTEGER(p) + 1, j, k = 0, kend, n = (int) (XLENGTH(p) - 1),
202 len = (ivalid < 5) ? 1 : ((ivalid < 6) ? 2 : n);
205 double *px = REAL(x), tmp;
207 SEXP ans = PROTECT(allocVector(REALSXP, len));
208 double *pans = REAL(ans);
213 for (j = 0; j < n; ++j) {
216 pans[0] += px[(ul ==
'U') ? kend - 1 : k];
222 for (j = 0; j < n; ++j) {
225 pans[0] += log(px[(ul ==
'U') ? kend - 1 : k]);
231 for (j = 0; j < n; ++j) {
234 pans[0] *= px[(ul ==
'U') ? kend - 1 : k];
242 for (j = 0; j < n; ++j) {
244 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
249 else if (tmp < pans[0])
256 for (j = 0; j < n; ++j) {
258 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
263 else if (tmp > pans[0])
271 for (j = 0; j < n; ++j) {
273 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
275 pans[0] = pans[1] = tmp;
278 else if (tmp < pans[0])
280 else if (tmp > pans[1])
292 if (TYPEOF(perm) == INTSXP && LENGTH(perm) == n)
293 pperm = INTEGER(perm);
295 for (j = 0; j < n; ++j) {
297 pans[(pperm) ? pperm[j] : j] =
298 (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
319 int len = asInteger(nans);
324 SEXP nms = PROTECT(allocVector(STRSXP, len)),
325 ans = PROTECT(allocVector(VECSXP, len)), tmp;
329 SET_STRING_ELT(nms, k, mkChar(
"cc5"));
330 tmp = allocVector(INTSXP, 5);
331 memcpy(INTEGER(tmp), D->
cc, 5 *
sizeof(
int));
332 SET_VECTOR_ELT(ans, k, tmp);
335 SET_STRING_ELT(nms, k, mkChar(
"rr5"));
336 tmp = allocVector(INTSXP, 5);
337 memcpy(INTEGER(tmp), D->
rr, 5 *
sizeof(
int));
338 SET_VECTOR_ELT(ans, k, tmp);
341 SET_STRING_ELT(nms, k, mkChar(
"s"));
342 tmp = allocVector(INTSXP, D->
nb + 1);
343 memcpy(INTEGER(tmp), D->
s, (D->
nb + 1) *
sizeof(
int));
344 SET_VECTOR_ELT(ans, k, tmp);
347 SET_STRING_ELT(nms, k, mkChar(
"r"));
348 tmp = allocVector(INTSXP, D->
nb + 1);
349 memcpy(INTEGER(tmp), D->
r, (D->
nb + 1) *
sizeof(
int));
350 SET_VECTOR_ELT(ans, k, tmp);
353 SET_STRING_ELT(nms, k, mkChar(
"q"));
354 tmp = allocVector(INTSXP, A->
n);
355 for (
int j = 0, *q0 = D->
q, *q1 = INTEGER(tmp); j < A->
n; ++j)
357 SET_VECTOR_ELT(ans, k, tmp);
360 SET_STRING_ELT(nms, k, mkChar(
"p"));
361 tmp = allocVector(INTSXP, A->
m);
362 for (
int i = 0, *p0 = D->
p, *p1 = INTEGER(tmp); i < A->
m; ++i)
364 SET_VECTOR_ELT(ans, k, tmp);
370 setAttrib(ans, R_NamesSymbol, nms);
379 int ivalid = R_check_class_etc(obj,
valid);
382 const char *
class =
valid[ivalid];
385 PROTECT_WITH_INDEX(obj, &pid);
386 if (
class[0] ==
'l' ||
class[1] ==
'i') {
392 if (
class[1] ==
't') {
399 cholmod_sparse *A =
M2CHS(obj, 1);
400 if (
class[1] ==
's') {
402 char ul = *CHAR(STRING_ELT(uplo, 0));
403 A->stype = (ul ==
'U') ? 1 : -1;
406 const char *filename = CHAR(asChar(file));
407 FILE *f = fopen(filename,
"w");
409 error(
_(
"failed to open file \"%s\" for writing"), filename);
410 if (!cholmod_write_sparse(f, A, (cholmod_sparse *) NULL, (
char *) NULL, &
c))
411 error(
_(
"'%s' failed"),
"cholmod_write_sparse");