8 int m = INTEGER(dim)[0], n = INTEGER(dim)[1];
12 if (XLENGTH(p) - 1 != n)
13 return errorString(
_(
"'%s' slot does not have length %s"),
17 return errorString(
_(
"first element of '%s' slot is not 0"),
20 for (j = 1; j <= n; ++j) {
21 if (pp[j] == NA_INTEGER)
24 if (pp[j] < pp[j - 1])
27 if (pp[j] - pp[j - 1] > m)
28 return errorString(
_(
"first differences of '%s' slot exceed %s"),
34 if (XLENGTH(i) < pp[n])
35 return errorString(
_(
"'%s' slot has length less than %s"),
37 int *pi = INTEGER(i), k, kend, ik, i0, sorted = 1;
38 for (j = 1, k = 0; j <= n; ++j) {
46 if (ik < 0 || ik >= m)
47 return errorString(
_(
"'%s' slot has elements not in {%s}"),
48 "i",
"0,...,Dim[1]-1");
52 return errorString(
_(
"'%s' slot is not increasing within columns after sorting"),
58 SEXP ans = Rf_allocVector(LGLSXP, 1);
59 LOGICAL(ans)[0] = sorted;
105 int order_ = Rf_asInteger(order);
106 if (order_ < 0 || order_ > 3)
110 PROTECT(b = (
TYPEOF(b) == REALSXP)
111 ? Rf_duplicate(b) : Rf_coerceVector(b, REALSXP));
112 if (LENGTH(b) != A->
m)
113 Rf_error(
_(
"dimensions of '%s' and '%s' are inconsistent"),
"a",
"b");
114 if (A->
n <= 0 || A->
n > A->
m)
115 Rf_error(
_(
"%s(%s, %s) requires m-by-n '%s' with m >= n > 0"),
116 "dgCMatrix_qrsol",
"a",
"b",
"a");
118 Rf_error(
_(
"'%s' failed"),
"cs_qrsol");
120 SEXP tmp = Rf_allocVector(REALSXP, A->
n);
121 memcpy(REAL(tmp), REAL(b),
sizeof(
double) * (
size_t) A->
n);
133 cholmod_sparse *At =
M2CHS(at, 1);
134 PROTECT(b = Rf_coerceVector(b, REALSXP));
135 if (LENGTH(b) != At->ncol)
136 Rf_error(
_(
"dimensions of '%s' and '%s' are inconsistent"),
"at",
"b");
137 if (At->ncol <= 0 || At->ncol < At->nrow)
138 Rf_error(
_(
"%s(%s, %s) requires m-by-n '%s' with n >= m > 0"),
139 "dgCMatrix_cholsol",
"at",
"b",
"at");
140 double zero[] = { 0.0, 0.0 }, one[] = {1.0, 0.0}, mone[] = { -1.0, 0.0 };
143 cholmod_factor *L = cholmod_analyze(At, &
c);
144 if (!cholmod_factorize(At, L, &
c))
145 Rf_error(
_(
"'%s' failed"),
"cholmod_factorize");
147 cholmod_dense *B = (cholmod_dense *) R_alloc(1,
sizeof(cholmod_dense));
148 memset(B, 0,
sizeof(cholmod_dense));
149 B->nrow = B->d = B->nzmax = (size_t) LENGTH(b);
152 B->dtype = CHOLMOD_DOUBLE;
153 B->xtype = CHOLMOD_REAL;
156 cholmod_dense *AtB = cholmod_allocate_dense(
157 At->nrow, 1, At->nrow, CHOLMOD_REAL, &
c);
158 if (!cholmod_sdmult(At, 0, one, zero, B, AtB, &
c))
159 Rf_error(
_(
"'%s' failed"),
"cholmod_sdmult");
162 cholmod_dense *C = cholmod_solve(CHOLMOD_A, L, AtB, &
c);
164 Rf_error(
_(
"'%s' failed"),
"cholmod_solve");
167 cholmod_dense *R = cholmod_copy_dense(B, &
c);
168 if (!cholmod_sdmult(At, 1, mone, one, C, R, &
c))
169 Rf_error(
_(
"'%s' failed"),
"cholmod_sdmult");
171 const char *nms[] = {
"L",
"coef",
"Xty",
"resid",
""};
172 SEXP ans = PROTECT(Rf_mkNamed(VECSXP, nms)), tmp;
174 PROTECT(tmp =
CHF2M(L, 1));
175 SET_VECTOR_ELT(ans, 0, tmp);
177 PROTECT(tmp = Rf_allocVector(REALSXP, (R_xlen_t) At->nrow));
178 memcpy(REAL(tmp), C->x,
sizeof(
double) * At->nrow);
179 SET_VECTOR_ELT(ans, 1, tmp);
181 PROTECT(tmp = Rf_allocVector(REALSXP, (R_xlen_t) At->nrow));
182 memcpy(REAL(tmp), AtB->x,
sizeof(
double) * At->nrow);
183 SET_VECTOR_ELT(ans, 2, tmp);
185 PROTECT(tmp = Rf_allocVector(REALSXP, (R_xlen_t) At->ncol));
186 memcpy(REAL(tmp), R->x,
sizeof(
double) * At->ncol);
187 SET_VECTOR_ELT(ans, 3, tmp);
189 cholmod_free_factor(& L, &
c);
190 cholmod_free_dense (&AtB, &
c);
191 cholmod_free_dense (& C, &
c);
192 cholmod_free_dense (& R, &
c);
213 static const char *valid[] = {
223 if (
TYPEOF(op) != STRSXP || LENGTH(op) < 1 ||
224 (op = STRING_ELT(op, 0)) == NA_STRING ||
225 (ivalid =
strmatch(CHAR(op), valid)) < 0)
226 Rf_error(
_(
"invalid '%s' to '%s'"),
"op", __func__);
229 char ul = (
TYPEOF(uplo) == STRSXP && LENGTH(uplo) > 0)
230 ? CHAR(STRING_ELT(uplo, 0))[0] :
'L';
233 int *pp = INTEGER(p) + 1, j, k, kend, n = (int) (XLENGTH(p) - 1),
234 len = (ivalid < 5) ? 1 : ((ivalid < 6) ? 2 : n);
237 double *px = REAL(x), tmp;
239 SEXP ans = PROTECT(Rf_allocVector(REALSXP, len));
240 double *pans = REAL(ans);
245 for (j = 0, k = 0; j < n; ++j) {
248 pans[0] += px[(ul ==
'U') ? kend - 1 : k];
254 for (j = 0, k = 0; j < n; ++j) {
257 pans[0] += log(px[(ul ==
'U') ? kend - 1 : k]);
263 for (j = 0, k = 0; j < n; ++j) {
266 pans[0] *= px[(ul ==
'U') ? kend - 1 : k];
274 for (j = 0, k = 0; j < n; ++j) {
276 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
281 else if (tmp < pans[0])
288 for (j = 0, k = 0; j < n; ++j) {
290 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
295 else if (tmp > pans[0])
303 for (j = 0, k = 0; j < n; ++j) {
305 tmp = (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
307 pans[0] = pans[1] = tmp;
310 else if (tmp < pans[0])
312 else if (tmp > pans[1])
324 if (
TYPEOF(perm) == INTSXP && LENGTH(perm) == n)
325 pperm = INTEGER(perm);
327 for (j = 0, k = 0; j < n; ++j) {
329 pans[(pperm) ? pperm[j] : j] =
330 (k < kend) ? px[(ul ==
'U') ? kend - 1 : k] : 0.0;
351 int len = Rf_asInteger(nans);
356 SEXP nms = PROTECT(Rf_allocVector(STRSXP, len)),
357 ans = PROTECT(Rf_allocVector(VECSXP, len)), tmp;
361 SET_STRING_ELT(nms, k, Rf_mkChar(
"cc5"));
362 tmp = Rf_allocVector(INTSXP, 5);
363 memcpy(INTEGER(tmp), D->
cc,
sizeof(
int) * 5);
364 SET_VECTOR_ELT(ans, k, tmp);
367 SET_STRING_ELT(nms, k, Rf_mkChar(
"rr5"));
368 tmp = Rf_allocVector(INTSXP, 5);
369 memcpy(INTEGER(tmp), D->
rr,
sizeof(
int) * 5);
370 SET_VECTOR_ELT(ans, k, tmp);
373 SET_STRING_ELT(nms, k, Rf_mkChar(
"s"));
374 tmp = Rf_allocVector(INTSXP, D->
nb + 1);
375 memcpy(INTEGER(tmp), D->
s ,
sizeof(
int) * (
size_t) (D->
nb + 1));
376 SET_VECTOR_ELT(ans, k, tmp);
379 SET_STRING_ELT(nms, k, Rf_mkChar(
"r"));
380 tmp = Rf_allocVector(INTSXP, D->
nb + 1);
381 memcpy(INTEGER(tmp), D->
r ,
sizeof(
int) * (
size_t) (D->
nb + 1));
382 SET_VECTOR_ELT(ans, k, tmp);
385 SET_STRING_ELT(nms, k, Rf_mkChar(
"q"));
386 tmp = Rf_allocVector(INTSXP, A->
n);
387 for (
int j = 0, *q0 = D->
q, *q1 = INTEGER(tmp); j < A->
n; ++j)
389 SET_VECTOR_ELT(ans, k, tmp);
392 SET_STRING_ELT(nms, k, Rf_mkChar(
"p"));
393 tmp = Rf_allocVector(INTSXP, A->
m);
394 for (
int i = 0, *p0 = D->
p, *p1 = INTEGER(tmp); i < A->
m; ++i)
396 SET_VECTOR_ELT(ans, k, tmp);
402 Rf_setAttrib(ans, R_NamesSymbol, nms);