7 int m,
int n,
int byrow, SEXP dimnames)
9 SEXPTYPE tf = TYPEOF(from);
10 char cl[] =
"...Matrix";
11 cl[0] = (zzz[0] ==
'.')
13 : ((zzz[0] ==
',') ? ((tf == CPLXSXP) ?
'z' :
'd') : zzz[0]);
16#ifndef MATRIX_ENABLE_IMATRIX
21 PROTECT(from = coerceVector(from, tt));
23 if (
cl[1] !=
'g' && m != n)
24 error(
_(
"attempt to construct non-square %s"),
25 (
cl[1] ==
's') ?
"symmetricMatrix" :
"triangularMatrix");
28 if (((
cl[2] !=
'p') ? mn : (mn + n) / 2) > R_XLEN_T_MAX)
29 error(
_(
"attempt to allocate vector of length exceeding %s"),
35 int *pdim = INTEGER(dim);
44 if (
cl[1] !=
'g' && ul !=
'U') {
45 SEXP uplo = PROTECT(mkString(
"L"));
50 if (
cl[1] ==
't' && di !=
'N') {
51 SEXP diag = PROTECT(mkString(
"U"));
57 SEXP x = PROTECT(allocVector(tt, (
cl[2] !=
'p') ? mn : (mn + n) / 2));
58 R_xlen_t k, r = XLENGTH(from);
59 int i, j, recycle = r < mn;
61#define VAD_SUBCASES(_PREFIX_, _CTYPE_, _PTR_, _NA_) \
63 _CTYPE_ *dest = _PTR_(x), *src = _PTR_(from); \
67 } else if (r == 1) { \
70 } else if (cl[2] != 'p') { \
73 Matrix_memcpy(dest, src, mn, sizeof(_CTYPE_)); \
75 _PREFIX_ ## transpose2(dest, src, n, m); \
81 *(dest++) = src[k++]; \
84 for (j = 0; j < n; ++j) { \
86 for (i = 0; i < m; ++i) { \
94 } else if (ul == 'U') { \
97 for (j = 0; j < n; ++j) { \
98 for (i = 0; i <= j; ++i) { \
99 if (recycle) k %= r; \
100 *(dest++) = src[k++]; \
105 for (j = 0; j < n; ++j) { \
107 for (i = 0; i <= j; ++i) { \
108 if (recycle) k %= r; \
109 *(dest++) = src[k]; \
117 for (j = 0; j < n; ++j) { \
118 for (i = j; i < n; ++i) { \
119 if (recycle) k %= r; \
120 *(dest++) = src[k++]; \
126 for (j = 0; j < n; ++j) { \
128 for (i = 0; i <= j; ++i) { \
129 if (recycle) k %= r; \
130 *(dest++) = src[k]; \
165 SEXP m, SEXP n, SEXP byrow, SEXP dimnames)
167 switch (TYPEOF(from)) {
179 if (TYPEOF(zzz) != STRSXP || LENGTH(zzz) < 1 ||
180 (zzz = STRING_ELT(zzz, 0)) == NA_STRING ||
181 (zzz_ = CHAR(zzz))[0] ==
'\0' ||
182 (zzz_ )[1] ==
'\0' ||
183 !((zzz_[1] ==
'g' && (zzz_[2] ==
'e' )) ||
184 (zzz_[1] ==
's' && (zzz_[2] ==
'y' || zzz_[2] ==
'p')) ||
185 (zzz_[1] ==
't' && (zzz_[2] ==
'r' || zzz_[2] ==
'p'))))
186 error(
_(
"second argument of '%s' does not specify a subclass of %s"),
187 __func__,
"denseMatrix");
189 char ul =
'U', di =
'N';
190 if (zzz_[1] !=
'g') {
191 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
192 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
193 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
194 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
196 if (zzz_[1] ==
't') {
197 if (TYPEOF(diag) != STRSXP || LENGTH(diag) < 1 ||
198 (diag = STRING_ELT(diag, 0)) == NA_STRING ||
199 ((di = *CHAR(diag)) !=
'N' && di !=
'U'))
200 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"diag",
"N",
"U");
204 if (m != R_NilValue) {
205 if (TYPEOF(m) == INTSXP) {
207 if (LENGTH(m) >= 1 && (tmp = INTEGER(m)[0]) != NA_INTEGER &&
210 }
else if (TYPEOF(m) == REALSXP) {
212 if (LENGTH(m) >= 1 && !ISNAN(tmp = REAL(m)[0]) &&
214 if (trunc(tmp) > INT_MAX)
215 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
220 error(
_(
"invalid '%s' to '%s'"),
"m", __func__);
224 if (n != R_NilValue) {
225 if (TYPEOF(n) == INTSXP) {
227 if (LENGTH(n) >= 1 && (tmp = INTEGER(n)[0]) != NA_INTEGER &&
230 }
else if (TYPEOF(n) == REALSXP) {
232 if (LENGTH(n) >= 1 && !ISNAN(tmp = REAL(n)[0]) &&
234 if (trunc(tmp) > INT_MAX)
235 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
240 error(
_(
"invalid '%s' to '%s'"),
"n", __func__);
244 if (TYPEOF(byrow) != LGLSXP || LENGTH(byrow) < 1 ||
245 (byrow_ = LOGICAL(byrow)[0]) == NA_LOGICAL)
246 error(
_(
"'%s' must be %s or %s"),
"byrow",
"TRUE",
"FALSE");
248 if (dimnames != R_NilValue)
249 if (TYPEOF(dimnames) != VECSXP || LENGTH(dimnames) != 2)
250 error(
_(
"invalid '%s' to '%s'"),
"dimnames", __func__);
252 R_xlen_t vlen_ = XLENGTH(from);
253 if (zzz_[1] !=
'g' && (m_ < 0) != (n_ < 0)) {
258 }
else if (m_ < 0 && n_ < 0) {
260 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
266 error(
_(
"nonempty vector supplied for empty matrix"));
268 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
270 m_ = (n_ == 0) ? 0 : vlen_ / n_ + (vlen_ % n_ != 0);
274 error(
_(
"nonempty vector supplied for empty matrix"));
276 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
278 n_ = (m_ == 0) ? 0 : vlen_ / m_ + (vlen_ % m_ != 0);
285 warning(
_(
"nonempty vector supplied for empty matrix"));
286 else if (vlen_ > mlen_)
287 warning(
_(
"vector length (%lld) exceeds matrix length (%d * %d)"),
288 (
long long) vlen_, m_, n_);
289 else if (mlen_ % vlen_ != 0)
290 warning(
_(
"matrix length (%d * %d) is not a multiple of vector length (%lld)"),
291 m_, n_, (
long long) vlen_);
300 SEXPTYPE tf = TYPEOF(from);
301 char cl[] =
"...Matrix";
302 cl[0] = (zzz[0] ==
'.')
304 : ((zzz[0] ==
',') ? ((tf == CPLXSXP) ?
'z' :
'd') : zzz[0]);
307#ifndef MATRIX_ENABLE_IMATRIX
312 PROTECT(from = coerceVector(from, tt));
317 SEXP dim = getAttrib(from, R_DimSymbol), dimnames;
318 int *pdim, isM, m, n, doDN;
319 R_xlen_t mn = XLENGTH(from);
321 isM = TYPEOF(dim) == INTSXP && LENGTH(dim) == 2;
327 if (m != n || n > 0) {
334 PROTECT(dimnames = getAttrib(from, R_DimNamesSymbol));
336 doDN = dimnames != R_NilValue;
341 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
346 pdim[1] = n = (int) mn;
348 pdim[0] = m = (int) mn;
352 SEXP nms = PROTECT(getAttrib(from, R_NamesSymbol));
354 doDN = nms != R_NilValue;
356 PROTECT(dimnames = allocVector(VECSXP, 2));
358 SET_VECTOR_ELT(dimnames,
trans ? 1 : 0, nms);
363 if (
cl[1] !=
'g' && m != n)
364 error(
_(
"attempt to construct non-square %s"),
365 (
cl[1] ==
's') ?
"symmetricMatrix" :
"triangularMatrix");
374 if (
cl[1] !=
'g' && ul !=
'U') {
375 SEXP uplo = PROTECT(mkString(
"L"));
380 if (
cl[1] ==
't' && di !=
'N') {
381 SEXP diag = PROTECT(mkString(
"U"));
390 if (
new <= 0 || (
new <= 1 && ATTRIB(from) == R_NilValue) ||
391 !MAYBE_REFERENCED(from)) {
393 if (ATTRIB(from) != R_NilValue &&
new >= 1) {
395 SET_ATTRIB(from, R_NilValue);
403 PROTECT(x = allocVector(tt, mn));
416 Matrix_memcpy(COMPLEX(x), COMPLEX(from), mn,
sizeof(Rcomplex));
426 PROTECT(x = allocVector(tt, (mn - n) / 2 + n));
430 ipack2(LOGICAL(x), LOGICAL(from), n, ul, di);
433 ipack2(INTEGER(x), INTEGER(from), n, ul, di);
436 dpack2(REAL(x), REAL(from), n, ul, di);
439 zpack2(COMPLEX(x), COMPLEX(from), n, ul, di);
457 switch (TYPEOF(from)) {
469 if (TYPEOF(zzz) != STRSXP || LENGTH(zzz) < 1 ||
470 (zzz = STRING_ELT(zzz, 0)) == NA_STRING ||
471 (zzz_ = CHAR(zzz))[0] ==
'\0' ||
472 (zzz_ )[1] ==
'\0' ||
473 !((zzz_[1] ==
'g' && (zzz_[2] ==
'e' )) ||
474 (zzz_[1] ==
's' && (zzz_[2] ==
'y' || zzz_[2] ==
'p')) ||
475 (zzz_[1] ==
't' && (zzz_[2] ==
'r' || zzz_[2] ==
'p'))))
476 error(
_(
"second argument of '%s' does not specify a subclass of %s"),
477 __func__,
"denseMatrix");
479 char ul =
'U', di =
'N';
480 if (zzz_[1] !=
'g') {
481 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
482 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
483 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
484 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
486 if (zzz_[1] ==
't') {
487 if (TYPEOF(diag) != STRSXP || LENGTH(diag) < 1 ||
488 (diag = STRING_ELT(diag, 0)) == NA_STRING ||
489 ((di = *CHAR(diag)) !=
'N' && di !=
'U'))
490 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"diag",
"N",
"U");
494 if (TYPEOF(
trans) != LGLSXP || LENGTH(
trans) < 1 ||
495 (trans_ = LOGICAL(
trans)[0]) == NA_LOGICAL)
496 error(
_(
"'%s' must be %s or %s"),
"trans",
"TRUE",
"FALSE");
503 packed = packed &&
class[1] !=
'g';
505 char cl[] =
"...Matrix";
508 cl[2] = (packed) ?
'p' :
509 ((
class[1] ==
'g') ?
'e' : ((
class[1] ==
's') ?
'y' :
'r'));
513 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
517 if (len > R_XLEN_T_MAX)
518 error(
_(
"attempt to allocate vector of length exceeding %s"),
520 if (
class[2] !=
'C' && packed && len > R_XLEN_T_MAX)
521 error(
_(
"coercing n-by-n %s to %s is not supported for n*n exceeding %s"),
522 "[RT]sparseMatrix",
"packedMatrix",
"R_XLEN_T_MAX");
524 if (bytes > 0x1.0p+30 )
525 warning(
_(
"sparse->dense coercion: allocating vector of size %0.1f GiB"),
535 char ul =
'U', di =
'N';
536 if (
class[1] !=
'g') {
538 ul = *CHAR(STRING_ELT(uplo, 0));
543 if (
class[1] ==
't') {
545 di = *CHAR(STRING_ELT(diag, 0));
554 SEXP x1 = PROTECT(allocVector(
kindToType(
class[0]), (R_xlen_t) len)),
556 int *pp, *pi, *pj, nprotect = 2;
561 if (
class[2] !=
'T') {
564 pp = INTEGER(p0) + 1;
566 if (
class[2] !=
'R') {
571 if (
class[2] !=
'C') {
579 switch (class[0]) { \
581 SAD_SUBCASES(int, LOGICAL, SHOW, FIRSTOF, INCREMENT_LOGICAL, 1); \
584 SAD_SUBCASES(int, INTEGER, SHOW, FIRSTOF, INCREMENT_INTEGER, 1); \
587 SAD_SUBCASES(double, REAL, SHOW, FIRSTOF, INCREMENT_REAL, 1.0); \
590 SAD_SUBCASES(Rcomplex, COMPLEX, SHOW, FIRSTOF, INCREMENT_COMPLEX, Matrix_zone); \
597#define SAD_SUBCASES(_CTYPE_, _PTR_, _MASK_, _REPLACE_, _INCREMENT_, _ONE_) \
599 _MASK_(_CTYPE_ *px0 = _PTR_(x0)); \
600 _CTYPE_ *px1 = _PTR_(x1) ; \
601 Matrix_memset(px1, 0, len, sizeof(_CTYPE_)); \
604 SAD_SUBSUBCASES(SAD_LOOP_C2NP, SAD_LOOP_R2NP, SAD_LOOP_T2NP, \
605 _MASK_, _REPLACE_, _INCREMENT_); \
606 if (class[1] == 't' && di != 'N') { \
608 R_xlen_t n1a = (R_xlen_t) n + 1; \
609 for (int d = 0; d < n; ++d, px1 += n1a) \
612 } else if (ul == 'U') { \
614 SAD_SUBSUBCASES(SAD_LOOP_C2UP, SAD_LOOP_R2UP, SAD_LOOP_T2UP, \
615 _MASK_, _REPLACE_, _INCREMENT_); \
616 if (class[1] == 't' && di != 'N') { \
618 for (int d = 0; d < n; px1 += (++d) + 1) \
623 SAD_SUBSUBCASES(SAD_LOOP_C2LP, SAD_LOOP_R2LP, SAD_LOOP_T2LP, \
624 _MASK_, _REPLACE_, _INCREMENT_); \
625 if (class[1] == 't' && di != 'N') { \
627 for (int d = 0; d < n; px1 += n - (d++)) \
633#define SAD_SUBSUBCASES(_LOOP_C_, _LOOP_R_, _LOOP_T_, _MASK_, _REPLACE_, _INCREMENT_) \
635 switch (class[2]) { \
639 _LOOP_C_(_MASK_, _REPLACE_, _INCREMENT_); \
645 _LOOP_R_(_MASK_, _REPLACE_, _INCREMENT_); \
650 R_xlen_t index, k, nnz = XLENGTH(i0); \
651 _LOOP_T_(_MASK_, _REPLACE_, _INCREMENT_); \
659#define SAD_LOOP_C2NP(_MASK_, _REPLACE_, _INCREMENT_) \
661 for (j = 0, k = 0; j < n; ++j, px1 += m) { \
664 px1[*pi] = _REPLACE_(*px0, 1); \
665 ++k; ++pi; _MASK_(++px0); \
670#define SAD_LOOP_C2UP(_MASK_, _REPLACE_, _INCREMENT_) \
672 for (j = 0, k = 0; j < n; px1 += (++j)) { \
675 px1[*pi] = _REPLACE_(*px0, 1); \
676 ++k; ++pi; _MASK_(++px0); \
681#define SAD_LOOP_C2LP(_MASK_, _REPLACE_, _INCREMENT_) \
683 for (j = 0, k = 0; j < n; px1 += n - (j++)) { \
686 px1[*pi - j] = _REPLACE_(*px0, 1); \
687 ++k; ++pi; _MASK_(++px0); \
692#define SAD_LOOP_R2NP(_MASK_, _REPLACE_, _INCREMENT_) \
694 R_xlen_t m1 = (R_xlen_t) m; \
695 for (i = 0, k = 0; i < m; ++i, ++px1) { \
698 px1[m1 * *pj] = _REPLACE_(*px0, 1); \
699 ++k; ++pj; _MASK_(++px0); \
704#define SAD_LOOP_R2UP(_MASK_, _REPLACE_, _INCREMENT_) \
706 for (i = 0, k = 0; i < n; ++i) { \
709 px1[PACKED_AR21_UP(i, *pj)] = _REPLACE_(*px0, 1); \
710 ++k; ++pj; _MASK_(++px0); \
715#define SAD_LOOP_R2LP(_MASK_, _REPLACE_, _INCREMENT_) \
717 R_xlen_t n2 = (R_xlen_t) n * 2; \
718 for (i = 0, k = 0; i < n; ++i) { \
721 px1[PACKED_AR21_LO(i, *pj, n2)] = _REPLACE_(*px0, 1); \
722 ++k; ++pj; _MASK_(++px0); \
727#define SAD_LOOP_T2NP(_MASK_, _REPLACE_, _INCREMENT_) \
729 R_xlen_t m1 = (R_xlen_t) m; \
730 for (k = 0; k < nnz; ++k) { \
731 index = m1 * *pj + *pi; \
732 _INCREMENT_(px1[index], (*px0)); \
733 ++pi; ++pj; _MASK_(++px0); \
737#define SAD_LOOP_T2UP(_MASK_, _REPLACE_, _INCREMENT_) \
739 for (k = 0; k < nnz; ++k) { \
740 index = PACKED_AR21_UP(*pi, *pj); \
741 _INCREMENT_(px1[index], (*px0)); \
742 ++pi; ++pj; _MASK_(++px0); \
746#define SAD_LOOP_T2LP(_MASK_, _REPLACE_, _INCREMENT_) \
748 R_xlen_t n2 = (R_xlen_t) n * 2; \
749 for (k = 0; k < nnz; ++k) { \
750 index = PACKED_AR21_LO(*pi, *pj, n2); \
751 _INCREMENT_(px1[index], (*px0)); \
752 ++pi; ++pj; _MASK_(++px0); \
766#undef SAD_SUBSUBCASES
784 static const char *
valid[] = {
786 int ivalid = R_check_class_etc(from,
valid);
791 if (TYPEOF(packed) != LGLSXP || LENGTH(packed) < 1 ||
792 (packed_ = LOGICAL(packed)[0]) == NA_LOGICAL)
793 error(
_(
"'%s' must be %s or %s"),
"packed",
"TRUE",
"FALSE");
799 char kind,
char shape,
int packed,
char ul)
801 char cl[] =
"...Matrix";
802 cl[0] = (kind ==
'.') ?
class[0] : ((kind ==
',') ? ((
class[0] ==
'z') ?
'z' :
'd') : kind);
804 cl[2] = (
cl[1] ==
'g') ?
'e' : ((packed) ?
'p' : ((
cl[1] ==
's') ?
'y' :
'r'));
808 int n = INTEGER(dim)[0];
810 if (len > R_XLEN_T_MAX)
811 error(
_(
"attempt to allocate vector of length exceeding %s"),
814 if (bytes > 0x1.0p+30 )
815 warning(
_(
"sparse->dense coercion: allocating vector of size %0.1f GiB"),
828 if (
cl[1] !=
'g' && ul !=
'U') {
829 SEXP uplo = PROTECT(mkString(
"L"));
835 char di = *CHAR(STRING_ELT(diag, 0));
836 if (
cl[1] ==
't' && di !=
'N')
841 if (
class[0] !=
cl[0]) {
842 if (
class[0] ==
'n' &&
cl[0] ==
'l')
852 SEXP x1 = PROTECT(allocVector(TYPEOF(x0), (R_xlen_t) len));
855#define DAD_SUBCASES(_PREFIX_, _CTYPE_, _PTR_) \
857 _CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1); \
858 Matrix_memset(px1, 0, (R_xlen_t) len, sizeof(_CTYPE_)); \
859 if (di == 'N' || cl[1] != 't') { \
861 _PREFIX_ ## dcpy2(px1, px0, n, n, ul, di); \
863 _PREFIX_ ## dcpy1(px1, px0, n, n, ul, ul, di); \
894 SEXP kind, SEXP shape, SEXP packed, SEXP uplo)
897 int ivalid = R_check_class_etc(from,
valid);
902 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
903 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
904 (kind_ = CHAR(kind)[0]) ==
'\0')
905 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
908 if (TYPEOF(shape) != STRSXP || LENGTH(shape) < 1 ||
909 (shape = STRING_ELT(shape, 0)) == NA_STRING ||
910 ((shape_ = CHAR(shape)[0]) !=
'g' && shape_ !=
's' && shape_ !=
't'))
911 error(
_(
"invalid '%s' to '%s'"),
"shape", __func__);
915 if (TYPEOF(packed) != LGLSXP || LENGTH(packed) < 1 ||
916 (packed_ = LOGICAL(packed)[0]) == NA_LOGICAL)
917 error(
_(
"'%s' must be %s or %s"),
"packed",
"TRUE",
"FALSE");
922 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
923 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
924 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
925 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
934 int mg = INTEGER(margin)[0] - 1;
937 char cl[] =
".geMatrix";
938 cl[0] = (kind ==
'.') ?
'n' : ((kind ==
',') ?
'd' : kind);
942 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
944 if (len > R_XLEN_T_MAX)
945 error(
_(
"attempt to allocate vector of length exceeding %s"),
948 if (bytes > 0x1.0p+30 )
949 warning(
_(
"sparse->dense coercion: allocating vector of size %0.1f GiB"),
960 int *pperm = INTEGER(perm);
962 SEXP x = PROTECT(allocVector(
kindToType(
cl[0]), (R_xlen_t) len));
965#define IAD_SUBCASES(_CTYPE_, _PTR_, _ONE_) \
967 _CTYPE_ *px = _PTR_(x); \
968 Matrix_memset(px, 0, (R_xlen_t) len, sizeof(_CTYPE_)); \
970 R_xlen_t m1 = (R_xlen_t) m; \
971 for (int i = 0; i < m; ++i) \
972 px[i + m1 * (*(pperm++) - 1)] = _ONE_; \
974 for (int j = 0; j < n; ++j, px += m) \
975 px[ *(pperm++) - 1 ] = _ONE_; \
1006 static const char *
valid[] = {
"indMatrix",
"pMatrix" };
1007 int ivalid = R_check_class_etc(from,
valid);
1012 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
1013 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
1014 (kind_ = CHAR(kind)[0]) ==
'\0')
1015 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
1021 int m,
int n,
int byrow, SEXP dimnames)
1025 ((TYPEOF(length0) == INTSXP) ? INTEGER(length0)[0] : REAL(length0)[0]);
1030 SEXPTYPE tf = TYPEOF(x0);
1031 char cl[] =
"...Matrix";
1032 cl[0] = (zzz[0] ==
'.')
1033 ? ((x0 == R_NilValue) ?
'n' :
typeToKind(tf))
1034 : ((zzz[0] ==
',') ? ((tf == CPLXSXP) ?
'z' :
'd') : zzz[0]);
1036 cl[2] = (byrow) ?
'R' :
'C';
1037#ifndef MATRIX_ENABLE_IMATRIX
1042 if (x0 != R_NilValue) {
1044 x0 = coerceVector(x0, tt);
1049 if (
cl[1] !=
'g' && m != n)
1050 error(
_(
"attempt to construct non-square %s"),
1051 (
cl[1] ==
's') ?
"symmetricMatrix" :
"triangularMatrix");
1056 int *pdim = INTEGER(dim);
1065 if (
cl[1] !=
'g' && ul !=
'U') {
1066 SEXP uplo = PROTECT(mkString(
"L"));
1071 if (
cl[1] ==
't' && di !=
'N') {
1072 SEXP diag = PROTECT(mkString(
"U"));
1078 R_xlen_t k = 0, nnz0 = XLENGTH(i0);
1080#define VAS_SUBCASES(...) \
1082 switch (TYPEOF(i0)) { \
1085 int *pi0 = INTEGER(i0); \
1086 VAS_SUBSUBCASES(__VA_ARGS__); \
1091 double *pi0 = REAL(i0); \
1092 VAS_SUBSUBCASES(__VA_ARGS__); \
1100#define VAS_SUBSUBCASES() \
1104 else if (cl[1] == 'g') { \
1110 while (k < nnz0 && (Matrix_int_fast64_t) pi0[k++] <= mn) \
1113 Matrix_int_fast64_t mn_mod_r = mn % r; \
1114 nnz1 = nnz0 * (mn / r); \
1115 while (k < nnz0 && (Matrix_int_fast64_t) pi0[k++] <= mn_mod_r) \
1119 else if (cl[1] == 's' || di == 'N') { \
1121 nnz1 = (mn + n) / 2; \
1122 else if (r >= mn) { \
1123 if ((ul == 'U') == !byrow) { \
1124 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k++] - 1) < mn) \
1125 if (pos % n <= pos / n) \
1128 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k++] - 1) < mn) \
1129 if (pos % n >= pos / n) \
1134 Matrix_int_fast64_t a = 0; \
1135 if ((ul == 'U') == !byrow) { \
1138 while (k < nnz0 && (pos = a + pi0[k++] - 1) < mn) \
1139 if (pos % n <= pos / n) \
1146 while (k < nnz0 && (pos = a + pi0[k++] - 1) < mn) \
1147 if (pos % n >= pos / n) \
1156 nnz1 = (mn - n) / 2; \
1157 else if (r >= mn) { \
1158 if ((ul == 'U') == !byrow) { \
1159 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k++] - 1) < mn) \
1160 if (pos % n < pos / n) \
1163 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k++] - 1) < mn) \
1164 if (pos % n > pos / n) \
1169 Matrix_int_fast64_t a = 0; \
1170 if ((ul == 'U') == !byrow) { \
1173 while (k < nnz0 && (pos = a + pi0[k++] - 1) < mn) \
1174 if (pos % n < pos / n) \
1181 while (k < nnz0 && (pos = a + pi0[k++] - 1) < mn) \
1182 if (pos % n > pos / n) \
1193#undef VAS_SUBSUBCASES
1196 error(
_(
"attempt to construct %s with more than %s nonzero entries"),
1197 "sparseMatrix",
"2^31-1");
1199 int i_, j_, m_ = (byrow) ? n : m, n_ = (byrow) ? m : n;
1201 p1 = PROTECT(allocVector(INTSXP, (R_xlen_t) n_ + 1)),
1202 i1 = PROTECT(allocVector(INTSXP, nnz1));
1205 int *pp1 = INTEGER(p1) + 1, *pi1 = INTEGER(i1);
1209#define VAS_SUBSUBCASES(_MASK0_, _MASK1_, _REPLACE_, _CTYPE_, _PTR_, _ONE_, _NA_) \
1211 _MASK0_(_CTYPE_ *px0 = _PTR_(x0)); \
1212 _MASK1_(_CTYPE_ *px1 = _PTR_(x1)); \
1215 else if (cl[1] == 'g') { \
1217 for (j_ = 0; j_ < n_; ++j_) { \
1219 for (i_ = 0; i_ < m_; ++i_) { \
1221 _MASK1_(*(px1++) = _NA_); \
1225 else if (r >= mn) { \
1226 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k] - 1) < mn) { \
1228 *(pi1++) = pos % m_; \
1229 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1234 Matrix_int_fast64_t a = 0; \
1237 while (k < nnz0 && (pos = a + pi0[k] - 1) < mn) { \
1239 *(pi1++) = pos % m_; \
1240 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1247 else if (cl[1] == 's' || di == 'N') { \
1249 if ((ul == 'U') == !byrow) { \
1250 for (j_ = 0; j_ < n_; ++j_) { \
1252 for (i_ = 0; i_ <= j_; ++i_) { \
1254 _MASK1_(*(px1++) = _NA_); \
1258 for (j_ = 0; j_ < n_; ++j_) { \
1259 pp1[j_] = n_ - j_; \
1260 for (i_ = j_; i_ < n_; ++i_) { \
1262 _MASK1_(*(px1++) = _NA_); \
1267 else if (r >= mn) { \
1268 if ((ul == 'U') == !byrow) { \
1269 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k] - 1) < mn) { \
1270 if ((i_ = pos % n_) <= (j_ = pos / n_)) { \
1273 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1278 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k] - 1) < mn) { \
1279 if ((i_ = pos % n_) >= (j_ = pos / n_)) { \
1282 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1289 Matrix_int_fast64_t a = 0; \
1290 if ((ul == 'U') == !byrow) { \
1293 while (k < nnz0 && (pos = a + pi0[k] - 1) < mn) { \
1294 if ((i_ = pos % n) <= (j_ = pos / n)) { \
1297 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1306 while (k < nnz0 && (pos = a + pi0[k] - 1) < mn) { \
1307 if ((i_ = pos % n) >= (j_ = pos / n)) { \
1310 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1321 if ((ul == 'U') == !byrow) { \
1322 for (j_ = 0; j_ < n_; ++j_) { \
1324 for (i_ = 0; i_ < j_; ++i_) { \
1326 _MASK1_(*(px1++) = _NA_); \
1330 for (j_ = 0; j_ < n_; ++j_) { \
1331 pp1[j_] = n_ - j_ - 1; \
1332 for (i_ = j_ + 1; i_ < n_; ++i_) { \
1334 _MASK1_(*(px1++) = _NA_); \
1339 else if (r >= mn) { \
1340 if ((ul == 'U') == !byrow) { \
1341 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k] - 1) < mn) { \
1342 if ((i_ = pos % n_) < (j_ = pos / n_)) { \
1345 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1350 while (k < nnz0 && (pos = (Matrix_int_fast64_t) pi0[k] - 1) < mn) { \
1351 if ((i_ = pos % n_) > (j_ = pos / n_)) { \
1354 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1361 Matrix_int_fast64_t a = 0; \
1362 if ((ul == 'U') == !byrow) { \
1365 while (k < nnz0 && (pos = a + pi0[k] - 1) < mn) { \
1366 if ((i_ = pos % n) < (j_ = pos / n)) { \
1369 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1378 while (k < nnz0 && (pos = a + pi0[k] - 1) < mn) { \
1379 if ((i_ = pos % n) > (j_ = pos / n)) { \
1382 _MASK1_(*(px1++) = _REPLACE_(px0[k], _ONE_)); \
1396 SEXP x1 = PROTECT(allocVector(
kindToType(
cl[0]), nnz1));
1399 if (x0 == R_NilValue)
1405 if (x0 == R_NilValue)
1411 if (x0 == R_NilValue)
1417 if (x0 == R_NilValue)
1430#undef VAS_SUBSUBCASES
1432 for (j_ = 0; j_ < n_; ++j_)
1433 pp1[j_] += pp1[j_ - 1];
1454 SEXP m, SEXP n, SEXP byrow, SEXP dimnames)
1457 int ivalid = R_check_class_etc(from,
valid);
1462 if (TYPEOF(zzz) != STRSXP || LENGTH(zzz) < 1 ||
1463 (zzz = STRING_ELT(zzz, 0)) == NA_STRING ||
1464 (zzz_ = CHAR(zzz))[0] ==
'\0' ||
1465 (zzz_[1] !=
'g' && zzz_[1] !=
's' && zzz_[1] !=
't') ||
1466 (zzz_[2] !=
'C' && zzz_[2] !=
'R' && zzz_[2] !=
'T'))
1467 error(
_(
"second argument of '%s' does not specify a subclass of %s"),
1468 __func__,
"[CRT]sparseMatrix");
1470 char ul =
'U', di =
'N';
1471 if (zzz_[1] !=
'g') {
1472 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
1473 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
1474 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
1475 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
1477 if (zzz_[1] ==
't') {
1478 if (TYPEOF(diag) != STRSXP || LENGTH(diag) < 1 ||
1479 (diag = STRING_ELT(diag, 0)) == NA_STRING ||
1480 ((di = *CHAR(diag)) !=
'N' && di !=
'U'))
1481 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"diag",
"N",
"U");
1485 if (m != R_NilValue) {
1486 if (TYPEOF(m) == INTSXP) {
1488 if (LENGTH(m) >= 1 && (tmp = INTEGER(m)[0]) != NA_INTEGER &&
1491 }
else if (TYPEOF(m) == REALSXP) {
1493 if (LENGTH(m) >= 1 && !ISNAN(tmp = REAL(m)[0]) &&
1495 if (trunc(tmp) > INT_MAX)
1496 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
1501 error(
_(
"invalid '%s' to '%s'"),
"m", __func__);
1505 if (n != R_NilValue) {
1506 if (TYPEOF(n) == INTSXP) {
1508 if (LENGTH(n) >= 1 && (tmp = INTEGER(n)[0]) != NA_INTEGER &&
1511 }
else if (TYPEOF(n) == REALSXP) {
1513 if (LENGTH(n) >= 1 && !ISNAN(tmp = REAL(n)[0]) &&
1515 if (trunc(tmp) > INT_MAX)
1516 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
1521 error(
_(
"invalid '%s' to '%s'"),
"n", __func__);
1525 if (TYPEOF(byrow) != LGLSXP || LENGTH(byrow) < 1 ||
1526 (byrow_ = LOGICAL(byrow)[0]) == NA_LOGICAL)
1527 error(
_(
"'%s' must be %s or %s"),
"byrow",
"TRUE",
"FALSE");
1529 if (dimnames != R_NilValue)
1530 if (TYPEOF(dimnames) != VECSXP || LENGTH(dimnames) != 2)
1531 error(
_(
"invalid '%s' to '%s'"),
"dimnames", __func__);
1535 ((TYPEOF(tmp) == INTSXP) ? INTEGER(tmp)[0] : REAL(tmp)[0]);
1536 if (zzz_[1] !=
'g' && (m_ < 0) != (n_ < 0)) {
1541 }
else if (m_ < 0 && n_ < 0) {
1542 if (vlen_ > INT_MAX)
1543 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
1546 }
else if (m_ < 0) {
1549 error(
_(
"nonempty vector supplied for empty matrix"));
1551 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
1553 m_ = (n_ == 0) ? 0 : vlen_ / n_ + (vlen_ % n_ != 0);
1554 }
else if (n_ < 0) {
1557 error(
_(
"nonempty vector supplied for empty matrix"));
1559 error(
_(
"dimensions cannot exceed %s"),
"2^31-1");
1561 n_ = (m_ == 0) ? 0 : vlen_ / m_ + (vlen_ % m_ != 0);
1567 else if (mlen_ == 0)
1568 warning(
_(
"nonempty vector supplied for empty matrix"));
1569 else if (vlen_ > mlen_)
1570 warning(
_(
"vector length (%lld) exceeds matrix length (%d * %d)"),
1571 (
long long) vlen_, m_, n_);
1572 else if (mlen_ % vlen_ != 0)
1573 warning(
_(
"matrix length (%d * %d) is not a multiple of vector length (%lld)"),
1574 m_, n_, (
long long) vlen_);
1583 char cl[] =
"...Matrix";
1586 cl[2] = (zzz[1] ==
'g') ?
'e' : ((zzz[1] ==
's') ?
'y' :
'r');
1587#ifndef MATRIX_ENABLE_IMATRIX
1592 PROTECT_WITH_INDEX(from, &pid);
1605 switch (TYPEOF(from)) {
1617 if (TYPEOF(zzz) != STRSXP || LENGTH(zzz) < 1 ||
1618 (zzz = STRING_ELT(zzz, 0)) == NA_STRING ||
1619 (zzz_ = CHAR(zzz))[0] ==
'\0' ||
1620 (zzz_[1] !=
'g' && zzz_[1] !=
's' && zzz_[1] !=
't') ||
1621 (zzz_[2] !=
'C' && zzz_[2] !=
'R' && zzz_[2] !=
'T'))
1622 error(
_(
"second argument of '%s' does not specify a subclass of %s"),
1623 __func__,
"[CRT]sparseMatrix");
1625 char ul =
'U', di =
'N';
1626 if (zzz_[1] !=
'g') {
1627 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
1628 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
1629 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
1630 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
1632 if (zzz_[1] ==
't') {
1633 if (TYPEOF(diag) != STRSXP || LENGTH(diag) < 1 ||
1634 (diag = STRING_ELT(diag, 0)) == NA_STRING ||
1635 ((di = *CHAR(diag)) !=
'N' && di !=
'U'))
1636 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"diag",
"N",
"U");
1640 if (TYPEOF(
trans) != LGLSXP || LENGTH(
trans) < 1 ||
1641 (trans_ = LOGICAL(
trans)[0]) == NA_LOGICAL)
1642 error(
_(
"'%s' must be %s or %s"),
"trans",
"TRUE",
"FALSE");
1649 char cl[] =
"...Matrix";
1656 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
1657 if (m != n || n > 0)
1665 char ul =
'U', di =
'N';
1666 if (
class[1] !=
'g') {
1668 ul = *CHAR(STRING_ELT(uplo, 0));
1673 if (
class[1] ==
't') {
1675 di = *CHAR(STRING_ELT(diag, 0));
1684 int i, j, *pp, *pi, *pj;
1686 p1 = i1 = j1 = NULL;
1687 pp = pi = pj = NULL;
1689#define DAS_CASES(_MASK_) \
1691 switch (class[0]) { \
1693 DAS_SUBCASES(int, LOGICAL, _MASK_, ISNZ_LOGICAL); \
1696 DAS_SUBCASES(int, INTEGER, _MASK_, ISNZ_INTEGER); \
1699 DAS_SUBCASES(double, REAL, _MASK_, ISNZ_REAL); \
1702 DAS_SUBCASES(Rcomplex, COMPLEX, _MASK_, ISNZ_COMPLEX); \
1709#define DAS_SUBCASES(_CTYPE_, _PTR_, _MASK_, _ISNZ_) \
1711 _CTYPE_ *px0 = _PTR_(x0) ; \
1712 _MASK_(_CTYPE_ *px1 = _PTR_(x1)); \
1713 if (class[1] == 'g') \
1715 DAS_SUBSUBCASES(DAS_LOOP_GEN2C, DAS_LOOP_GEN2R, DAS_LOOP_GEN2C, \
1717 else if (class[2] != 'p' && di == 'N') \
1719 DAS_SUBSUBCASES(DAS_LOOP_TRN2C, DAS_LOOP_TRN2R, DAS_LOOP_TRN2C, \
1721 else if (class[2] != 'p') \
1723 DAS_SUBSUBCASES(DAS_LOOP_TRU2C, DAS_LOOP_TRU2R, DAS_LOOP_TRU2C, \
1725 else if (di == 'N') \
1727 DAS_SUBSUBCASES(DAS_LOOP_TPN2C, DAS_LOOP_TPN2R, DAS_LOOP_TPN2C, \
1731 DAS_SUBSUBCASES(DAS_LOOP_TPU2C, DAS_LOOP_TPU2R, DAS_LOOP_TPU2C, \
1735#undef DAS_SUBSUBCASES
1736#define DAS_SUBSUBCASES(_LOOP_C_, _LOOP_R_, _LOOP_T_, _MASK_, _ISNZ_) \
1740 _LOOP_C_(_ISNZ_, ++nnz, DAS_VALID2C); \
1743 _LOOP_R_(_ISNZ_, ++nnz, DAS_VALID2R); \
1746 _LOOP_T_(_ISNZ_, ++nnz, DAS_VALID2T); \
1753#define DAS_LOOP_GEN2C(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1755 for (j = 0; j < n; ++j) { \
1756 for (i = 0; i < m; ++i, ++px0) \
1757 if (_ISNZ_(*px0)) _DO_INNER_; \
1762#define DAS_LOOP_GEN2R(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1764 R_xlen_t mn1s = (R_xlen_t) m * n - 1; \
1765 for (i = 0; i < m; ++i, px0 -= mn1s) { \
1766 for (j = 0; j < n; ++j, px0 += m) \
1767 if (_ISNZ_(*px0)) _DO_INNER_; \
1772#define DAS_LOOP_TRN2C(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1775 for (j = 0; j < n; px0 += n - (++j)) { \
1776 for (i = 0; i <= j; ++i, ++px0) \
1777 if (_ISNZ_(*px0)) _DO_INNER_; \
1781 for (j = 0; j < n; px0 += (++j)) { \
1782 for (i = j; i < n; ++i, ++px0) \
1783 if (_ISNZ_(*px0)) _DO_INNER_; \
1789#define DAS_LOOP_TRN2R(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1793 d = (R_xlen_t) n * n - 1; \
1794 for (i = 0; i < n; ++i, px0 -= (d -= n)) { \
1795 for (j = i; j < n; ++j, px0 += n) \
1796 if (_ISNZ_(*px0)) _DO_INNER_; \
1801 for (i = 0; i < n; ++i, px0 -= (d += n)) { \
1802 for (j = 0; j <= i; ++j, px0 += n) \
1803 if (_ISNZ_(*px0)) _DO_INNER_; \
1809#define DAS_LOOP_TRU2C(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1813 for (j = 1; j < n; ++j) { \
1814 for (i = 0; i < j; ++i, ++px0) \
1815 if (_ISNZ_(*px0)) _DO_INNER_; \
1820 for (j = 0; j < n; ++j) { \
1822 for (i = j + 1; i < n; ++i, ++px0) \
1823 if (_ISNZ_(*px0)) _DO_INNER_; \
1829#define DAS_LOOP_TRU2R(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1833 d = (R_xlen_t) n * (n - 1) - 1; \
1834 for (i = 0; i < n; ++i) { \
1835 for (j = i + 1; j < n; ++j) { \
1837 if (_ISNZ_(*px0)) _DO_INNER_; \
1845 for (i = 1; i < n; ++i) { \
1846 for (j = 0; j < i; ++j) { \
1847 if (_ISNZ_(*px0)) _DO_INNER_; \
1856#define DAS_LOOP_TPN2C(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1859 for (j = 0; j < n; ++j) { \
1860 for (i = 0; i <= j; ++i, ++px0) \
1861 if (_ISNZ_(*px0)) _DO_INNER_; \
1865 for (j = 0; j < n; ++j) { \
1866 for (i = j; i < n; ++i, ++px0) \
1867 if (_ISNZ_(*px0)) _DO_INNER_; \
1873#define DAS_LOOP_TPN2R(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1877 d = PACKED_LENGTH(n) - 1; \
1878 for (i = 0; i < n; px0 -= (d -= (++i))) { \
1879 for (j = i; j < n; px0 += (++j)) \
1880 if (_ISNZ_(*px0)) _DO_INNER_; \
1885 for (i = 0; i < n; px0 -= (d += n - (++i))) { \
1886 for (j = 0; j <= i; px0 += n - (++j)) \
1887 if (_ISNZ_(*px0)) _DO_INNER_; \
1893#define DAS_LOOP_TPU2C(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1896 for (j = 1; j < n; ++j) { \
1898 for (i = 0; i < j; ++i, ++px0) \
1899 if (_ISNZ_(*px0)) _DO_INNER_; \
1903 for (j = 0; j < n; ++j) { \
1905 for (i = j + 1; i < n; ++i, ++px0) \
1906 if (_ISNZ_(*px0)) _DO_INNER_; \
1912#define DAS_LOOP_TPU2R(_ISNZ_, _DO_INNER_, _DO_OUTER_) \
1916 d = PACKED_LENGTH(n - 1) - 1; \
1917 for (i = 0; i < n; ++i) { \
1918 for (j = i + 1; j < n; ++j) { \
1920 if (_ISNZ_(*px0)) _DO_INNER_; \
1923 px0 -= (d -= i + 1); \
1928 for (i = 1; i < n; ++i) { \
1929 for (j = 0; j < i; ++j) { \
1930 if (_ISNZ_(*px0)) _DO_INNER_; \
1934 px0 -= (d += n - i); \
1939#define DAS_VALID2T \
1940 if (nnz > INT_MAX) \
1941 error(_("attempt to construct %s with more than %s nonzero entries"), \
1942 "sparseMatrix", "2^31-1")
1944#define DAS_VALID2C \
1945 do { DAS_VALID2T; else *(pp++) = (int) nnz; } while (0)
1947#define DAS_VALID2R DAS_VALID2C
1958 int r = (
cl[2] ==
'C') ? n : m;
1959 PROTECT(p1 = allocVector(INTSXP, (R_xlen_t) r + 1));
1964 if (r > 0 && di !=
'N' && ul == ((
cl[2] ==
'C') ?
'U' :
'L'))
1967 if (
class[0] ==
'n')
1972 PROTECT(i1 = allocVector(INTSXP, nnz));
1978 PROTECT(j1 = allocVector(INTSXP, nnz));
1984#undef DAS_SUBSUBCASES
1985#define DAS_SUBSUBCASES(_LOOP_C_, _LOOP_R_, _LOOP_T_, _MASK_, _ISNZ_) \
1992 _MASK_(*(px1++) = *px0); \
1999 _MASK_(*(px1++) = *px0); \
2007 _MASK_(*(px1++) = *px0); \
2019 if (
class[0] ==
'n')
2022 SEXP x1 = PROTECT(allocVector(TYPEOF(x0), nnz));
2030#undef DAS_SUBSUBCASES
2034#undef DAS_LOOP_GEN2C
2035#undef DAS_LOOP_GEN2R
2036#undef DAS_LOOP_TRN2C
2037#undef DAS_LOOP_TRN2R
2038#undef DAS_LOOP_TRU2C
2039#undef DAS_LOOP_TRU2R
2040#undef DAS_LOOP_TPN2C
2041#undef DAS_LOOP_TPN2R
2042#undef DAS_LOOP_TPU2C
2043#undef DAS_LOOP_TPU2R
2045 UNPROTECT(nprotect);
2053 int ivalid = R_check_class_etc(from,
valid);
2058 if (TYPEOF(repr) != STRSXP || LENGTH(repr) < 1 ||
2059 (repr = STRING_ELT(repr, 0)) == NA_STRING ||
2060 ((repr_ = CHAR(repr)[0]) !=
'C' && repr_ !=
'R' && repr_ !=
'T'))
2061 error(
_(
"invalid '%s' to '%s'"),
"repr", __func__);
2067 char kind,
char shape,
char repr,
char ul)
2069 char cl[] =
"...Matrix";
2070 cl[0] = (kind ==
'.') ?
class[0] : ((kind ==
',') ? ((
class[0] ==
'z') ?
'z' :
'd') : kind);
2076 int n = INTEGER(dim)[0];
2088 if (
cl[1] !=
'g' && ul !=
'U') {
2089 SEXP uplo = PROTECT(mkString(
"L"));
2095 char di = *CHAR(STRING_ELT(diag, 0));
2096 if (
cl[1] ==
't' && di !=
'N')
2100 if (
cl[1] ==
't' && di !=
'N') {
2102 SEXP p = PROTECT(allocVector(INTSXP, (R_xlen_t) n + 1));
2104 Matrix_memset(INTEGER(p), 0, (R_xlen_t) n + 1,
sizeof(
int));
2111#define DAS_CASES(_MASK_) \
2115 DAS_LOOP(int, LOGICAL, _MASK_, ISNZ_LOGICAL, 1); \
2118 DAS_LOOP(int, INTEGER, _MASK_, ISNZ_INTEGER, 1); \
2121 DAS_LOOP(double, REAL, _MASK_, ISNZ_REAL, 1.0); \
2124 DAS_LOOP(Rcomplex, COMPLEX, _MASK_, ISNZ_COMPLEX, Matrix_zone); \
2132 if (
class[0] !=
cl[0]) {
2133 if (
class[0] ==
'n' &&
cl[0] ==
'l')
2137 if (
class[0] ==
'n')
2145 SEXP p = PROTECT(allocVector(INTSXP, (R_xlen_t) n + 1));
2147 int *pp = INTEGER(p);
2153#define DAS_LOOP(_CTYPE_, _PTR_, _MASK_, _ISNZ_, _ONE_) \
2155 _CTYPE_ *px0 = _PTR_(x0); \
2156 for (d = 0; d < n; ++d) { \
2170 for (d = 1; d <= n; ++d)
2179#define DAS_LOOP(_CTYPE_, _PTR_, _MASK_, _ISNZ_, _ONE_) \
2181 _CTYPE_ *px0 = _PTR_(x0); \
2182 for (d = 0; d < n; ++d) { \
2197 SEXP i1 = PROTECT(allocVector(INTSXP, nnz));
2204 int *pi1 = INTEGER(i1);
2207#define DAS_LOOP(_CTYPE_, _PTR_, _MASK_, _ISNZ_, _ONE_) \
2209 _MASK_(_CTYPE_ *px1 = _PTR_(x1)); \
2211 _CTYPE_ *px0 = _PTR_(x0); \
2212 for (d = 0; d < n; ++d) { \
2213 if (_ISNZ_(*px0)) { \
2215 _MASK_(*(px1++) = *px0); \
2220 for (d = 0; d < n; ++d) { \
2222 _MASK_(*(px1++) = _ONE_); \
2229 else if (di ==
'N' && nnz == n) {
2233 SEXP x1 = PROTECT(allocVector(TYPEOF(x0), nnz));
2245 SEXP kind, SEXP shape, SEXP repr, SEXP uplo)
2248 int ivalid = R_check_class_etc(from,
valid);
2253 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2254 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2255 (kind_ = CHAR(kind)[0]) ==
'\0')
2256 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2259 if (TYPEOF(shape) != STRSXP || LENGTH(shape) < 1 ||
2260 (shape = STRING_ELT(shape, 0)) == NA_STRING ||
2261 ((shape_ = CHAR(shape)[0]) !=
'g' && shape_ !=
's' && shape_ !=
't'))
2262 error(
_(
"invalid '%s' to '%s'"),
"shape", __func__);
2265 if (TYPEOF(repr) != STRSXP || LENGTH(repr) < 1 ||
2266 (repr = STRING_ELT(repr, 0)) == NA_STRING ||
2267 ((repr_ = CHAR(repr)[0]) !=
'C' && repr_ !=
'R' && repr_ !=
'T'))
2268 error(
_(
"invalid '%s' to '%s'"),
"repr", __func__);
2271 if (shape_ !=
'g') {
2272 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
2273 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
2274 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
2275 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
2284 int mg = INTEGER(margin)[0] - 1;
2287 char cl[] =
".g.Matrix";
2288 cl[0] = (kind ==
'.') ?
'n' : ((kind ==
',') ?
'd' : kind);
2289 cl[2] = (repr ==
'.') ? ((mg == 0) ?
'R' :
'C') : repr;
2293 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1],
2294 r = (mg == 0) ? m : n, s = (mg == 0) ? n : m;
2295 if (m != n || n > 0)
2304 int *pperm = INTEGER(perm);
2307 SEXP i = PROTECT(allocVector(INTSXP, r)),
2308 j = PROTECT(allocVector(INTSXP, r));
2309 int k, *pi = INTEGER(i), *pj = INTEGER(j);
2310 for (k = 0; k < r; ++k) {
2312 *(pj++) = *(pperm++) - 1;
2316 }
else if ((
cl[2] ==
'C') == (mg != 0)) {
2317 SEXP p = PROTECT(allocVector(INTSXP, (R_xlen_t) r + 1)),
2318 i = PROTECT(allocVector(INTSXP, r));
2319 int k, *pp = INTEGER(p), *pi = INTEGER(i);
2320 for (k = 0; k < r; ++k) {
2322 *(pi++) = *(pperm++) - 1;
2328 SEXP p = PROTECT(allocVector(INTSXP, (R_xlen_t) s + 1));
2329 int k, *pp = INTEGER(p);
2331 for (k = 0; k < r; ++k)
2333 for (k = 0; k < s; ++k)
2335 SEXP j = PROTECT(allocVector(INTSXP, r));
2336 int *pj = INTEGER(j), *work;
2340 for (k = 0; k < r; ++k)
2341 pj[work[pperm[k]]++] = k;
2353#define IAS_SUBCASES(_CTYPE_, _PTR_, _ONE_) \
2355 _CTYPE_ *px = _PTR_(x); \
2356 for (int k = 0; k < r; ++k) \
2388 static const char *
valid[] = {
"indMatrix",
"pMatrix" };
2389 int ivalid = R_check_class_etc(from,
valid);
2394 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2395 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2396 (kind_ = CHAR(kind)[0]) ==
'\0')
2397 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2400 if (TYPEOF(repr) != STRSXP || LENGTH(repr) < 1 ||
2401 (repr = STRING_ELT(repr, 0)) == NA_STRING ||
2402 ((repr_ = CHAR(repr)[0]) !=
'.' &&
2403 repr_ !=
'C' && repr_ !=
'R' && repr_ !=
'T'))
2404 error(
_(
"invalid '%s' to '%s'"),
"repr", __func__);
2413 else if (kind ==
',')
2414 kind = (
class[0] ==
'z') ?
'z' :
'd';
2415 if (kind ==
class[0])
2419 char cl[] =
"...Matrix";
2426 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
2427 if (m != n || n > 0)
2435 if (
class[1] !=
'g') {
2437 char ul = *CHAR(STRING_ELT(uplo, 0));
2441 if (
class[1] ==
't') {
2443 char di = *CHAR(STRING_ELT(diag, 0));
2453 if (TYPEOF(x) != tt) {
2454 REPROTECT(x = coerceVector(x, tt), pid);
2455 if (
class[0] ==
'n')
2459 REPROTECT(x = duplicate(x), pid);
2460 if (
class[0] ==
'n')
2464 if (
class[0] ==
'n') {
2466 R_xlen_t i, len = XLENGTH(x);
2467 int *px = LOGICAL(x);
2468 for (i = 0; i < len; ++i, ++px) {
2469 if (*px == NA_LOGICAL) {
2470 REPROTECT(x = duplicate(x), pid);
2486 int ivalid = R_check_class_etc(from,
valid);
2491 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2492 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2493 (kind_ = CHAR(kind)[0]) ==
'\0')
2494 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2503 else if (kind ==
',')
2504 kind = (
class[0] ==
'z') ?
'z' :
'd';
2505 if (kind ==
class[0])
2509 if (
class[2] ==
'T' && (
class[0] ==
'n' ||
class[0] ==
'l') &&
2510 kind !=
'n' && kind !=
'l') {
2517 char cl[] =
"...Matrix";
2524 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
2525 if (m != n || n > 0)
2533 if (
class[1] !=
'g') {
2535 char ul = *CHAR(STRING_ELT(uplo, 0));
2539 if (
class[1] ==
't') {
2541 char di = *CHAR(STRING_ELT(diag, 0));
2549 if (
class[2] !=
'T') {
2552 nnz = INTEGER(p)[XLENGTH(p) - 1];
2555 if (
class[2] !=
'R') {
2562 if (
class[2] !=
'C') {
2567 if (
class[0] ==
'n') {
2568 SEXP x = PROTECT(allocVector(tt, nnz));
2572 int *px = LOGICAL(x);
2579 int *px = INTEGER(x);
2586 double *px = REAL(x);
2593 Rcomplex *px = COMPLEX(x);
2603 }
else if (kind !=
'n') {
2607 REPROTECT(x = coerceVector(x, tt), pid);
2619 static const char *
valid[] = {
2621 int ivalid = R_check_class_etc(from,
valid);
2626 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2627 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2628 (kind_ = CHAR(kind)[0]) ==
'\0')
2629 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2638 else if (kind ==
',')
2639 kind = (
class[0] ==
'z') ?
'z' :
'd';
2640 if (kind ==
class[0])
2644 char cl[] =
".diMatrix";
2649 int n = INTEGER(dim)[0];
2659 char di = *CHAR(STRING_ELT(diag, 0));
2668 if (TYPEOF(x) == tt) {
2669 if (
class[0] ==
'n') {
2671 R_xlen_t i, len = XLENGTH(x);
2672 int *px = LOGICAL(x);
2673 for (i = 0; i < len; ++i, ++px) {
2674 if (*px == NA_LOGICAL) {
2675 REPROTECT(x = duplicate(x), pid);
2682 REPROTECT(x = coerceVector(x, tt), pid);
2683 if (
class[0] ==
'n')
2699 int ivalid = R_check_class_etc(from,
valid);
2704 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2705 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2706 (kind_ = CHAR(kind)[0]) ==
'\0')
2707 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2720 static const char *
valid[] = {
"indMatrix",
"pMatrix" };
2721 int ivalid = R_check_class_etc(from,
valid);
2726 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
2727 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
2728 (kind_ = CHAR(kind)[0]) ==
'\0')
2729 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
2736 if (
class[1] ==
'g')
2739 char cl[] =
".geMatrix";
2744 int n = INTEGER(dim)[0];
2750 if (
class[1] !=
's')
2757 char ul = *CHAR(STRING_ELT(uplo, 0)), di =
'N';
2760 if (
class[1] ==
's') {
2762 if (LENGTH(factors) > 0)
2767 di = *CHAR(STRING_ELT(diag, 0));
2772 error(
_(
"attempt to allocate vector of length exceeding %s"),
2776 if (
class[2] ==
'p' ||
new) {
2777 PROTECT(x1 = allocVector(TYPEOF(x0), (R_xlen_t) n * n));
2782#define DAG_SUBCASES(_PREFIX_, _CTYPE_, _PTR_) \
2784 _CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1); \
2785 if (class[2] == 'p') \
2786 _PREFIX_ ## unpack1(px1, px0, n, ul, di); \
2788 Matrix_memcpy(px1, px0, (R_xlen_t) n * n, sizeof(_CTYPE_)); \
2789 if (class[1] == 's') \
2790 _PREFIX_ ## syforce2(px1, n, ul); \
2792 _PREFIX_ ## trforce2(px1, n, n, ul, di); \
2816 UNPROTECT(nprotect);
2824 int ivalid = R_check_class_etc(from,
valid);
2833 if (
class[1] ==
'g')
2836 char cl[] =
".g.Matrix";
2842 int n = INTEGER(dim)[0];
2848 if (
class[1] ==
's')
2854 if (
class[1] ==
's') {
2856 if (LENGTH(factors) > 0)
2861 char di = *CHAR(STRING_ELT(diag, 0));
2865 if (
class[2] !=
'T') {
2870 if (
class[2] !=
'R') {
2875 if (
class[2] !=
'C') {
2880 if (
class[0] !=
'n') {
2891 char ul = *CHAR(STRING_ELT(uplo, 0));
2894#define ASSIGN_COMPLEX_JJ(_X_, _Y_) \
2895 do { _X_.r = _Y_.r; _X_.i = 0.0; } while (0)
2897#define ASSIGN_COMPLEX_JI(_X_, _Y_) \
2898 do { _X_.r = _Y_.r; _X_.i = -_Y_.i; } while (0)
2902 switch (class[0]) { \
2904 SAG_SUBCASES(int, LOGICAL, SHOW, 1, \
2905 ASSIGN_REAL, ASSIGN_REAL); \
2908 SAG_SUBCASES(int, INTEGER, SHOW, 1, \
2909 ASSIGN_REAL, ASSIGN_REAL); \
2912 SAG_SUBCASES(double, REAL, SHOW, 1.0, \
2913 ASSIGN_REAL, ASSIGN_REAL); \
2916 SAG_SUBCASES(Rcomplex, COMPLEX, SHOW, Matrix_zone, \
2917 ASSIGN_COMPLEX_JJ, ASSIGN_COMPLEX_JI); \
2924 if (
class[2] !=
'T') {
2928 p1 = PROTECT(allocVector(INTSXP, (R_xlen_t) n + 1)),
2929 i0 = PROTECT(
GET_SLOT(from, iSym));
2931 *pp0 = INTEGER(p0), *pp1 = INTEGER(p1), *pi0 = INTEGER(i0);
2933 pp0++; *(pp1++) = 0;
2935 if (
class[1] ==
's') {
2937 for (j = 0, k = 0; j < n; ++j) {
2945 for (j = 1; j < n; ++j)
2946 pp1[j] += pp1[j - 1];
2947 if (pp1[n - 1] > INT_MAX - pp0[n - 1])
2948 error(
_(
"attempt to construct %s with more than %s nonzero entries"),
2949 "sparseMatrix",
"2^31-1");
2950 for (j = 0; j < n; ++j)
2953 if (n > INT_MAX - pp0[n - 1])
2954 error(
_(
"attempt to construct %s with more than %s nonzero entries"),
2955 "sparseMatrix",
"2^31-1");
2956 for (j = 0; j < n; ++j)
2957 pp1[j] = pp0[j] + j + 1;
2960 SEXP i1 = PROTECT(allocVector(INTSXP, pp1[n - 1]));
2961 int *pi1 = INTEGER(i1);
2965#define SAG_SUBCASES(_CTYPE_, _PTR_, _MASK_, _ONE_, _ASSIGN_JJ_, _ASSIGN_JI_) \
2967 _MASK_(_CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1)); \
2968 if (class[1] == 's') { \
2970 Matrix_Calloc(pp1_, n, int); \
2971 Matrix_memcpy(pp1_, pp1 - 1, n, sizeof(int)); \
2972 for (j = 0, k = 0; j < n; ++j) { \
2974 while (k < kend) { \
2975 if (pi0[k] == j) { \
2976 pi1[pp1_[j]] = pi0[k]; \
2977 _MASK_(_ASSIGN_JJ_(px1[pp1_[j]], px0[k])); \
2980 pi1[pp1_[j]] = pi0[k]; \
2981 _MASK_(px1[pp1_[j]] = px0[k]); \
2983 pi1[pp1_[pi0[k]]] = j; \
2984 _MASK_(_ASSIGN_JI_(px1[pp1_[pi0[k]]], px0[k])); \
2990 Matrix_Free(pp1_, n); \
2991 } else if (ul == ((class[2] == 'C') ? 'U' : 'L')) { \
2992 for (j = 0, k = 0; j < n; ++j) { \
2994 while (k < kend) { \
2995 *(pi1++) = *(pi0++); \
2996 _MASK_(*(px1++) = *(px0++)); \
3000 _MASK_(*(px1++) = _ONE_); \
3003 for (j = 0, k = 0; j < n; ++j) { \
3006 _MASK_(*(px1++) = _ONE_); \
3007 while (k < kend) { \
3008 *(pi1++) = *(pi0++); \
3009 _MASK_(*(px1++) = *(px0++)); \
3016 if (
class[0] ==
'n')
3020 x1 = PROTECT(allocVector(TYPEOF(x0), pp1[n - 1]));
3030 int *pi0 = INTEGER(i0), *pj0 = INTEGER(j0);
3031 R_xlen_t nnz0 = XLENGTH(i0), nnz1;
3033 if (
class[1] ==
's') {
3035 for (R_xlen_t k = 0; k < nnz0; ++k)
3036 if (pi0[k] == pj0[k])
3040 if (nnz1 > R_XLEN_T_MAX - nnz0)
3041 error(
_(
"attempt to allocate vector of length exceeding %s"),
3045 SEXP i1 = PROTECT(allocVector(INTSXP, nnz1)),
3046 j1 = PROTECT(allocVector(INTSXP, nnz1));
3047 int *pi1 = INTEGER(i1), *pj1 = INTEGER(j1);
3052#define SAG_SUBCASES(_CTYPE_, _PTR_, _MASK_, _ONE_, _ASSIGN_JJ_, _ASSIGN_JI_) \
3054 _MASK_(_CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1)); \
3055 if (class[1] == 's') { \
3056 for (R_xlen_t k = 0; k < nnz0; ++k) { \
3057 if (*pi0 == *pj0) { \
3060 _MASK_(_ASSIGN_JJ_((*px1), (*px0))); \
3065 _MASK_(*px1 = *px0); \
3069 _MASK_(_ASSIGN_JI_((*px1), (*px0))); \
3072 ++pi0; ++pj0; _MASK_(++px0); \
3075 Matrix_memcpy(pi1, pi0, nnz0, sizeof(int)); \
3076 Matrix_memcpy(pj1, pj0, nnz0, sizeof(int)); \
3077 _MASK_(Matrix_memcpy(px1, px0, nnz0, sizeof(_CTYPE_))); \
3080 _MASK_(px1 += nnz0); \
3081 for (int d = 0; d < n; ++d) { \
3082 *(pi1++) = *(pj1++) = d; \
3083 _MASK_(*(px1++) = _ONE_); \
3088 if (
class[0] ==
'n')
3092 x1 = PROTECT(allocVector(TYPEOF(x0), nnz1));
3110 static const char *
valid[] = {
3112 int ivalid = R_check_class_etc(from,
valid);
3121 if (
class[2] !=
'p')
3124 char cl[] =
"...Matrix";
3144 int n = INTEGER(dim)[0];
3146 error(
_(
"attempt to allocate vector of length exceeding %s"),
3157 char ul = *CHAR(STRING_ELT(uplo, 0));
3164 if (LENGTH(factors) > 0)
3176 char di = *CHAR(STRING_ELT(diag, 0));
3183 x1 = PROTECT(allocVector(TYPEOF(x0), (R_xlen_t) n * n));
3186#define UNPACK(_PREFIX_, _CTYPE_, _PTR_) \
3188 _CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1); \
3189 Matrix_memset(px1, 0, (R_xlen_t) n * n, sizeof(_CTYPE_)); \
3190 _PREFIX_ ## unpack1(px1, px0, n, ul, 'N'); \
3206 UNPACK(z, Rcomplex, COMPLEX);
3221 static const char *
valid[] = {
3222 "dpoMatrix",
"dppMatrix",
"corMatrix",
"copMatrix",
3224 int ivalid = R_check_class_etc(from,
valid);
3233 if (
class[2] ==
'p')
3235 int ge =
class[1] ==
'g';
3237 char cl[] =
"...Matrix";
3239 cl[1] = (ge) ? ((di ==
'\0') ?
's' :
't') :
class[1];
3244 int *pdim = INTEGER(dim), n = pdim[0];
3246 error(
_(
"attempt to pack non-square matrix"));
3257 SEXP uplo = PROTECT(mkString(
"L"));
3261 if (
cl[1] ==
't' && di !=
'N') {
3262 SEXP diag = PROTECT(mkString(
"U"));
3268 ul = *CHAR(STRING_ELT(uplo, 0));
3275 di = *CHAR(STRING_ELT(diag, 0));
3281 if (LENGTH(factors) > 0)
3298#define PACK(_PREFIX_, _CTYPE_, _PTR_) \
3300 _CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1); \
3301 _PREFIX_ ## pack2(px1, px0, n, ul, 'N'); \
3307 PACK(i,
int, LOGICAL);
3310 PACK(i,
int, INTEGER);
3314 PACK(d,
double, REAL);
3317 PACK(z, Rcomplex, COMPLEX);
3332 static const char *
valid[] = {
3333 "dpoMatrix",
"dppMatrix",
"corMatrix",
"copMatrix",
3335 int ivalid = R_check_class_etc(from,
valid);
3339 char ul =
'U', di =
'\0';
3340 if (
valid[ivalid][1] ==
'g') {
3341 if (TYPEOF(uplo) != STRSXP || LENGTH(uplo) < 1 ||
3342 (uplo = STRING_ELT(uplo, 0)) == NA_STRING ||
3343 ((ul = *CHAR(uplo)) !=
'U' && ul !=
'L'))
3344 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"uplo",
"U",
"L");
3345 if (diag != R_NilValue) {
3346 if (TYPEOF(diag) != STRSXP || LENGTH(diag) < 1 ||
3347 (diag = STRING_ELT(diag, 0)) == NA_STRING ||
3348 ((di = *CHAR(diag)) !=
'N' && ul !=
'U'))
3349 error(
_(
"'%s' must be \"%s\" or \"%s\""),
"diag",
"N",
"U");
3356void trans(SEXP p0, SEXP i0, SEXP x0, SEXP p1, SEXP i1, SEXP x1,
3359 int *pp0 = INTEGER(p0), *pp1 = INTEGER(p1),
3360 *pi0 = INTEGER(i0), *pi1 = INTEGER(i1),
3361 i, j, k, kend, nnz = pp0[n];
3364 for (k = 0; k < nnz; ++k)
3366 for (i = 0; i < m; ++i)
3367 pp1[i] += pp1[i - 1];
3373#define TRANS_LOOP(_CTYPE_, _PTR_, _MASK_) \
3375 _MASK_(_CTYPE_ *px0 = _PTR_(x0), *px1 = _PTR_(x1)); \
3376 for (j = 0, k = 0; j < n; ++j) { \
3378 while (k < kend) { \
3381 _MASK_(px1[pp1_[i]] = px0[k]); \
3388 if (!(x0 && x1) || TYPEOF(x0) != TYPEOF(x1))
3391 switch (TYPEOF(x0)) {
3415void tsort(SEXP i0, SEXP j0, SEXP x0, SEXP *p1, SEXP *i1, SEXP *x1,
3418 R_xlen_t nnz0 = XLENGTH(i0), nnz1 = 0;
3420 error(
_(
"unable to aggregate %s with '%s' and '%s' slots of length exceeding %s"),
3421 "TsparseMatrix",
"i",
"j",
"2^31-1");
3425 PROTECT(*p1 = allocVector(INTSXP, (R_xlen_t) n + 1));
3426 int *pi0 = INTEGER(i0), *pj0 = INTEGER(j0), *pp1 = INTEGER(*p1), *pi1,
3427 i, j, r = (m < n) ? n : m;
3428 R_xlen_t k, kstart, kend, kend_;
3431 int *workA, *workB, *workC, *pj_;
3432 size_t lwork = (size_t) m + r + m + nnz0;
3438#define TSORT_LOOP(_CTYPE_, _PTR_, _MASK_, _INCREMENT_) \
3440 _MASK_(_CTYPE_ *px0 = _PTR_(x0), *px1, *px_); \
3441 _MASK_(Matrix_Calloc(px_, nnz0, _CTYPE_)); \
3445 for (k = 0; k < nnz0; ++k) \
3453 for (i = 1; i < m; ++i) \
3454 workA[i] += (workB[i] = workA[i - 1]); \
3463 for (k = 0; k < nnz0; ++k) { \
3464 pj_[workB[pi0[k]]] = pj0[k] ; \
3465 _MASK_(px_[workB[pi0[k]]] = px0[k]); \
3479 for (j = 0; j < n; ++j) \
3481 for (i = 0; i < m; ++i) { \
3482 kstart = kend_ = k; \
3484 while (k < kend) { \
3485 if (workB[pj_[k]] < kstart) { \
3487 workB[pj_[k]] = kend_; \
3488 pj_[kend_] = pj_[k] ; \
3489 _MASK_(px_[kend_] = px_[k]); \
3493 _MASK_(_INCREMENT_(px_[workB[pj_[k]]], px_[k])); \
3498 nnz1 += kend_ - kstart; \
3510 Matrix_memset(workB, 0, n, sizeof(int)); \
3511 for (i = 0; i < m; ++i) { \
3513 while (k < kend_) { \
3524 for (j = 0; j < n; ++j) { \
3525 pp1[j] = pp1[j - 1] + workB[j]; \
3526 workB[j] = pp1[j - 1]; \
3529 PROTECT(*i1 = allocVector( INTSXP, nnz1)) ; \
3530 _MASK_(PROTECT(*x1 = allocVector(TYPEOF(x0), nnz1))); \
3531 pi1 = INTEGER(*i1) ; \
3532 _MASK_(px1 = _PTR_(*x1)); \
3541 for (i = 0; i < m; ++i) { \
3543 while (k < kend_) { \
3544 pi1[workB[pj_[k]]] = i; \
3545 _MASK_(px1[workB[pj_[k]]] = px_[k]); \
3552 _MASK_(Matrix_Free(px_, nnz0)); \
3553 _MASK_(UNPROTECT(1)); \
3560 switch (TYPEOF(x0)) {
3585void taggr(SEXP i0, SEXP j0, SEXP x0, SEXP *i1, SEXP *j1, SEXP *x1,
3588 R_xlen_t nnz0 = XLENGTH(i0), nnz1 = 0;
3590 error(
_(
"unable to aggregate %s with '%s' and '%s' slots of length exceeding %s"),
3591 "TsparseMatrix",
"i",
"j",
"2^31-1");
3595 int *pi0 = INTEGER(i0), *pj0 = INTEGER(j0), *pi1, *pj1,
3596 i, j, r = (m < n) ? n : m;
3597 R_xlen_t k, kstart, kend, kend_;
3599 int *workA, *workB, *workC, *pj_;
3600 size_t lwork = (size_t) m + r + m + nnz0;
3606#define TAGGR_LOOP(_CTYPE_, _PTR_, _MASK_, _INCREMENT_) \
3608 _MASK_(_CTYPE_ *px0 = _PTR_(x0), *px1, *px_); \
3609 _MASK_(Matrix_Calloc(px_, nnz0, _CTYPE_)); \
3613 for (k = 0; k < nnz0; ++k) \
3621 for (i = 1; i < m; ++i) \
3622 workA[i] += (workB[i] = workA[i - 1]); \
3631 for (k = 0; k < nnz0; ++k) { \
3632 pj_[workB[pi0[k]]] = pj0[k] ; \
3633 _MASK_(px_[workB[pi0[k]]] = px0[k]); \
3647 for (j = 0; j < n; ++j) \
3649 for (i = 0; i < m; ++i) { \
3650 kstart = kend_ = k; \
3652 while (k < kend) { \
3653 if (workB[pj_[k]] < kstart) { \
3655 workB[pj_[k]] = kend_; \
3656 pj_[kend_] = pj_[k] ; \
3657 _MASK_(px_[kend_] = px_[k]); \
3661 _MASK_(_INCREMENT_(px_[workB[pj_[k]]], px_[k])); \
3666 nnz1 += kend_ - kstart; \
3668 if (nnz1 != nnz0) { \
3669 PROTECT(*i1 = allocVector( INTSXP, nnz1)) ; \
3670 PROTECT(*j1 = allocVector( INTSXP, nnz1)) ; \
3671 _MASK_(PROTECT(*x1 = allocVector(TYPEOF(x0), nnz1))); \
3672 pi1 = INTEGER(*i1) ; \
3673 pj1 = INTEGER(*j1) ; \
3674 _MASK_(px1 = _PTR_(*x1)); \
3677 for (i = 0; i < m; ++i) { \
3679 while (k < kend_) { \
3681 *(pj1++) = pj_[k] ; \
3682 _MASK_(*(px1++) = px_[k]); \
3688 _MASK_(UNPROTECT(1)); \
3691 _MASK_(Matrix_Free(px_, nnz0)); \
3697 switch (TYPEOF(x0)) {
3723 if (
class[2] ==
'C')
3726 char cl[] =
"..CMatrix";
3732 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
3733 if (m != n || n > 0)
3741 if (
class[1] !=
'g') {
3743 char ul = *CHAR(STRING_ELT(uplo, 0));
3748 if (
class[1] ==
't') {
3750 char di = *CHAR(STRING_ELT(diag, 0));
3756 if (LENGTH(factors) > 0)
3761 if (
class[2] ==
'R') {
3764 p1 = PROTECT(allocVector(INTSXP, (R_xlen_t) n + 1)),
3765 i1 = PROTECT(allocVector(INTSXP, INTEGER(p0)[m]));
3768 if (
class[0] ==
'n')
3769 trans(p0, j0, NULL, p1, i1, NULL, n, m);
3772 x1 = PROTECT(allocVector(TYPEOF(x0), INTEGER(p0)[m]));
3774 trans(p0, j0, x0, p1, i1, x1, n, m);
3781 p1 = NULL, i1 = NULL;
3782 if (
class[0] ==
'n') {
3783 tsort(i0, j0, NULL, &p1, &i1, NULL, m, n);
3792 tsort(i0, j0, x0, &p1, &i1, &x1, m, n);
3811 static const char *
valid[] = {
3813 int ivalid = R_check_class_etc(from,
valid);
3822 if (
class[2] ==
'R')
3825 char cl[] =
"..RMatrix";
3831 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
3832 if (m != n || n > 0)
3840 if (
class[1] !=
'g') {
3842 char ul = *CHAR(STRING_ELT(uplo, 0));
3847 if (
class[1] ==
't') {
3849 char di = *CHAR(STRING_ELT(diag, 0));
3855 if (LENGTH(factors) > 0)
3860 if (
class[2] ==
'C') {
3863 p1 = PROTECT(allocVector(INTSXP, (R_xlen_t) m + 1)),
3864 j1 = PROTECT(allocVector(INTSXP, INTEGER(p0)[n]));
3867 if (
class[0] ==
'n')
3868 trans(p0, i0, NULL, p1, j1, NULL, m, n);
3871 x1 = PROTECT(allocVector(TYPEOF(x0), INTEGER(p0)[n]));
3873 trans(p0, i0, x0, p1, j1, x1, m, n);
3880 p1 = NULL, j1 = NULL;
3881 if (
class[0] ==
'n') {
3882 tsort(j0, i0, NULL, &p1, &j1, NULL, n, m);
3891 tsort(j0, i0, x0, &p1, &j1, &x1, n, m);
3910 static const char *
valid[] = {
3912 int ivalid = R_check_class_etc(from,
valid);
3921 if (
class[2] ==
'T')
3924 char cl[] =
"..TMatrix";
3930 int *pdim = INTEGER(dim), m = pdim[0], n = pdim[1];
3931 if (m != n || n > 0)
3939 if (
class[1] !=
'g') {
3941 char ul = *CHAR(STRING_ELT(uplo, 0));
3946 if (
class[1] ==
't') {
3948 char di = *CHAR(STRING_ELT(diag, 0));
3954 if (LENGTH(factors) > 0)
3963 int *pp = INTEGER(p), *pi, r = (
class[2] ==
'C') ? n : m, nnz = pp[r];
3964 if (XLENGTH(i) == nnz) {
3968 SEXP i_ = PROTECT(allocVector(INTSXP, nnz));
3973 PROTECT(i = allocVector(INTSXP, nnz));
3975 pi = INTEGER(i); ++pp;
3977 for (j = 0, k = 0; j < r; ++j) {
3984 if (
class[0] !=
'n') {
3986 if (XLENGTH(x) == nnz)
3989 SEXP x_ = PROTECT(allocVector(TYPEOF(x), nnz));
4002 Matrix_memcpy(COMPLEX(x_), COMPLEX(x), nnz,
sizeof(Rcomplex));
4019 static const char *
valid[] = {
4021 int ivalid = R_check_class_etc(from,
valid);
4032 int ivalid = R_check_class_etc(from,
valid);
4039 PROTECT_WITH_INDEX(from, &pid);
4045 R_xlen_t len = XLENGTH(to);
4046 int *px = LOGICAL(to);
4048 if (*(px++) == NA_LOGICAL) {
4105 int ivalid = R_check_class_etc(from,
valid);
4112 PROTECT_WITH_INDEX(from, &pid);
4147 setAttrib(to, R_DimSymbol, dim);
4152 setAttrib(to, R_DimNamesSymbol, dimnames);
4176 int ivalid = R_check_class_etc(from,
valid);
4205 int ivalid = R_check_class_etc(from,
valid);
4210 if (
cl[1] ==
'g' ||
cl[2] ==
'd')
4211 error(
_(
"attempt to pack a %s"),
"generalMatrix");
4234 int ivalid = R_check_class_etc(from,
valid);
4262 int ivalid = R_check_class_etc(from,
valid);
4290 int ivalid = R_check_class_etc(from,
valid);
4318 int ivalid = R_check_class_etc(from,
valid);
4324 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
4325 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
4326 (kind_ = CHAR(kind)[0]) ==
'\0')
4327 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
4329 if (TYPEOF(sparse) != LGLSXP || LENGTH(sparse) < 1)
4330 error(
_(
"'%s' must be %s or %s or %s"),
"sparse",
"TRUE",
"FALSE",
"NA");
4331 int sparse_ = LOGICAL(sparse)[0];
4338 if (sparse_ == NA_LOGICAL || !sparse_)
4343 char cl_[] =
"..CMatrix";
4354 if (sparse_ != NA_LOGICAL && !sparse_) {
4356 char cl_[] =
"...Matrix";
4357 cl_[0] = (kind_ ==
'.') ?
cl[0] : ((kind_ ==
',') ? ((
cl[0] ==
'z') ?
'z' :
'd') : kind_);
4365 if (sparse_ == NA_LOGICAL)
4373 if (sparse_ == NA_LOGICAL || sparse_)
4387 int ivalid = R_check_class_etc(from,
valid);
4393 if (TYPEOF(kind) != STRSXP || LENGTH(kind) < 1 ||
4394 (kind = STRING_ELT(kind, 0)) == NA_STRING ||
4395 (kind_ = CHAR(kind)[0]) ==
'\0')
4396 error(
_(
"invalid '%s' to '%s'"),
"kind", __func__);
4404 char cl_[] =
"...Matrix";
4405 cl_[0] = (kind_ ==
'.') ?
cl[0] : ((kind_ ==
',') ? ((
cl[0] ==
'z') ?
'z' :
'd') : kind_);
4418 char cl_[] =
"...Matrix";
4419 cl_[0] = (kind_ ==
'.') ?
cl[0] : ((kind_ ==
',') ? ((
cl[0] ==
'z') ?
'z' :
'd') : kind_);
long long Matrix_int_fast64_t
#define ERROR_INVALID_CLASS(_X_, _FUNC_)
#define INCREMENT_REAL(_X_, _Y_)
char typeToKind(SEXPTYPE)
#define INCREMENT_COMPLEX(_X_, _Y_)
#define INCREMENT_INTEGER(_X_, _Y_)
#define VALID_NONVIRTUAL_VECTOR
#define ASSIGN_REAL(_X_, _Y_)
#define VALID_NONVIRTUAL_MATRIX
SEXPTYPE kindToType(char)
#define ERROR_INVALID_TYPE(_X_, _FUNC_)
#define ISNZ_LOGICAL(_X_)
#define Matrix_Free(_VAR_, _N_)
#define INCREMENT_PATTERN(_X_, _Y_)
#define SET_SLOT(x, what, value)
#define GET_SLOT(x, what)
#define Matrix_Calloc(_VAR_, _N_, _CTYPE_)
SEXP newObject(const char *)
#define INCREMENT_LOGICAL(_X_, _Y_)
#define VALID_NONVIRTUAL_SHIFT(i, pToInd)
int DimNames_is_trivial(SEXP dn)
void set_symmetrized_DimNames(SEXP obj, SEXP dn, int J)
static const char * valid[]
SEXP R_diagonal_as_dense(SEXP from, SEXP kind, SEXP shape, SEXP packed, SEXP uplo)
SEXP R_diagonal_as_kind(SEXP from, SEXP kind)
SEXP dense_as_packed(SEXP from, const char *class, char ul, char di)
SEXP sparse_as_Csparse(SEXP from, const char *class)
SEXP sparse_as_Rsparse(SEXP from, const char *class)
SEXP R_sparse_as_general(SEXP from)
SEXP R_Matrix_as_packed(SEXP from)
SEXP diagonal_as_sparse(SEXP from, const char *class, char kind, char shape, char repr, char ul)
#define VAS_SUBCASES(...)
SEXP R_vector_as_dense(SEXP from, SEXP zzz, SEXP uplo, SEXP diag, SEXP m, SEXP n, SEXP byrow, SEXP dimnames)
void taggr(SEXP i0, SEXP j0, SEXP x0, SEXP *i1, SEXP *j1, SEXP *x1, int m, int n)
#define SAD_SUBCASES(_CTYPE_, _PTR_, _MASK_, _REPLACE_, _INCREMENT_, _ONE_)
SEXP R_sparse_as_kind(SEXP from, SEXP kind)
SEXP R_Matrix_as_matrix(SEXP from)
SEXP R_dense_as_general(SEXP from)
SEXP sparse_as_dense(SEXP from, const char *class, int packed)
#define IAS_SUBCASES(_CTYPE_, _PTR_, _ONE_)
SEXP R_sparse_as_dense(SEXP from, SEXP packed)
SEXP dense_as_sparse(SEXP from, const char *class, char repr)
#define DAS_SUBCASES(_CTYPE_, _PTR_, _MASK_, _ISNZ_)
SEXP sparse_as_kind(SEXP from, const char *class, char kind)
SEXP dense_as_kind(SEXP from, const char *class, char kind, int new)
SEXP R_dense_as_packed(SEXP from, SEXP uplo, SEXP diag)
SEXP diagonal_as_kind(SEXP from, const char *class, char kind)
#define VAD_SUBCASES(_PREFIX_, _CTYPE_, _PTR_, _NA_)
SEXP index_as_dense(SEXP from, const char *class, char kind)
SEXP R_dense_as_sparse(SEXP from, SEXP repr)
#define DAS_CASES(_MASK_)
SEXP R_Matrix_as_unpacked(SEXP from)
#define DAG_SUBCASES(_PREFIX_, _CTYPE_, _PTR_)
SEXP R_matrix_as_sparse(SEXP from, SEXP zzz, SEXP uplo, SEXP diag, SEXP trans)
SEXP R_Matrix_as_Rsparse(SEXP from)
SEXP R_vector_as_sparse(SEXP from, SEXP zzz, SEXP uplo, SEXP diag, SEXP m, SEXP n, SEXP byrow, SEXP dimnames)
#define TRANS_LOOP(_CTYPE_, _PTR_, _MASK_)
SEXP sparse_as_Tsparse(SEXP from, const char *class)
SEXP R_sparse_as_Rsparse(SEXP from)
#define PACK(_PREFIX_, _CTYPE_, _PTR_)
SEXP vector_as_sparse(SEXP from, const char *zzz, char ul, char di, int m, int n, int byrow, SEXP dimnames)
SEXP matrix_as_dense(SEXP from, const char *zzz, char ul, char di, int trans, int new)
#define SAG_SUBCASES(_CTYPE_, _PTR_, _MASK_, _ONE_, _ASSIGN_JJ_, _ASSIGN_JI_)
void trans(SEXP p0, SEXP i0, SEXP x0, SEXP p1, SEXP i1, SEXP x1, int m, int n)
SEXP R_sparse_as_Tsparse(SEXP from)
SEXP R_Matrix_as_general(SEXP from, SEXP kind)
SEXP R_dense_as_kind(SEXP from, SEXP kind)
SEXP R_Matrix_as_vector(SEXP from)
SEXP R_index_as_kind(SEXP from, SEXP kind)
SEXP R_dense_as_unpacked(SEXP from)
#define UNPACK(_PREFIX_, _CTYPE_, _PTR_)
#define IAD_SUBCASES(_CTYPE_, _PTR_, _ONE_)
SEXP R_Matrix_as_Csparse(SEXP from)
void tsort(SEXP i0, SEXP j0, SEXP x0, SEXP *p1, SEXP *i1, SEXP *x1, int m, int n)
SEXP R_sparse_as_Csparse(SEXP from)
SEXP dense_as_unpacked(SEXP from, const char *class)
SEXP matrix_as_sparse(SEXP from, const char *zzz, char ul, char di, int trans)
SEXP vector_as_dense(SEXP from, const char *zzz, char ul, char di, int m, int n, int byrow, SEXP dimnames)
SEXP dense_as_general(SEXP from, const char *class, int new)
#define DAD_SUBCASES(_PREFIX_, _CTYPE_, _PTR_)
SEXP R_index_as_dense(SEXP from, SEXP kind)
#define TAGGR_LOOP(_CTYPE_, _PTR_, _MASK_, _INCREMENT_)
SEXP sparse_as_general(SEXP from, const char *class)
SEXP R_diagonal_as_sparse(SEXP from, SEXP kind, SEXP shape, SEXP repr, SEXP uplo)
SEXP R_Matrix_as_Tsparse(SEXP from)
SEXP index_as_kind(SEXP from, const char *class, char kind)
#define TSORT_LOOP(_CTYPE_, _PTR_, _MASK_, _INCREMENT_)
SEXP diagonal_as_dense(SEXP from, const char *class, char kind, char shape, int packed, char ul)
SEXP R_index_as_sparse(SEXP from, SEXP kind, SEXP repr)
SEXP R_matrix_as_dense(SEXP from, SEXP zzz, SEXP uplo, SEXP diag, SEXP trans)
#define DAS_LOOP(_CTYPE_, _PTR_, _MASK_, _ISNZ_, _ONE_)
SEXP index_as_sparse(SEXP from, const char *class, char kind, char repr)
SEXP R_Matrix_as_kind(SEXP from, SEXP kind, SEXP sparse)
SEXP Tsparse_aggregate(SEXP from)
void * Matrix_memset(void *dest, int ch, R_xlen_t length, size_t size)
void * Matrix_memcpy(void *dest, const void *src, R_xlen_t length, size_t size)