8 c##TYPE *x, size_t dx, \
9 c##TYPE *y, size_t dy) \
24 c##TYPE *x, size_t dx, size_t addx, int nddx, \
25 c##TYPE *y, size_t dy, size_t addy, int nddy) \
34 if (nddx) dx -= addx; else dx += addx; \
35 if (nddy) dy -= addy; else dy += addy; \
42 c##TYPE *x, size_t dx, \
43 const c##TYPE *y, size_t dy) \
55 c##TYPE *x, size_t dx, size_t addx, int nddx, \
56 const c##TYPE *y, size_t dy, size_t addy, int nddy) \
62 if (nddx) dx -= addx; else dx += addx; \
63 if (nddy) dy -= addy; else dy += addy; \
69c##symswapr2(c##TYPE *x, \
70 size_t n, char uplo, size_t i, size_t j) \
72 if (n == 0 || i == j) \
79 c##TYPE *xi = x + i * n, *xj = x + j * n, tmp; \
84 c##swap2(i, xi, 1, xj, 1); \
85 c##swap2(j - i - 1, xi + i + n, n, xj + i + 1, 1); \
86 c##swap2(n - j - 1, xj + i + n, n, xj + j + n, n); \
88 c##swap2(i, x + i, n, x + j, n); \
89 c##swap2(j - i - 1, xi + i + 1, 1, xi + j + n, n); \
90 c##swap2(n - j - 1, xi + j + 1, 1, xj + j + 1, 1); \
96c##symswapr1(c##TYPE *x, \
97 size_t n, char uplo, size_t i, size_t j) \
99 if (n == 0 || i == j) \
106 c##TYPE *xi, *xj, tmp; \
108 xi = x + DENSE_INDEX_U(0, i, n); \
109 xj = x + DENSE_INDEX_U(0, j, n); \
113 c##swap1(i, xi, 1, 0, 0, xj, 1, 0, 0); \
114 c##swap1(j - i - 1, xi + i + (i + 1), i + 2, 1, 0, xj + i + 1, 1, 0, 0); \
115 c##swap1(n - j - 1, xj + i + (j + 1), j + 2, 1, 0, xj + j + (j + 1), j + 2, 1, 0); \
117 xi = x + DENSE_INDEX_L(i, i, n); \
118 xj = x + DENSE_INDEX_L(j, j, n); \
122 c##swap1(i, x + i, n - 1, 1, 1, x + j, n - 1, 1, 1); \
123 c##swap1(j - i - 1, xi + (i - i) + 1, 1, 0, 0, xi + (j - i) + (n - i - 1), n - i - 2, 1, 1); \
124 c##swap1(n - j - 1, xi + (j - i) + 1, 1, 0, 0, xj + (j - j) + 1, 1, 0, 0); \
130c##symcopyr2(c##TYPE *x, const c##TYPE *y, \
131 size_t n, char uplo, size_t i, size_t j) \
135 c##TYPE *xi = x + i * n, *xj = x + j * n; \
136 const c##TYPE *yi = y + i * n, *yj = y + j * n; \
141 c##copy2(i, xi, 1, yj, 1); \
143 c##copy2(j - i - 1, xi + i + n, n, yj + i + 1, 1); \
144 c##copy2(n - j - 1, xj + i + n, n, yj + j + n, n); \
147 c##copy2(j, xi, 1, yj, 1); \
148 c##copy2(i - j - 1, xi + j + 1, 1, yj + j + n, n); \
149 c##copy2(n - i - 1, xi + i + n, n, yi + j + n, n); \
154 c##copy2(i, x + i, n, y + j, n); \
156 c##copy2(j - i - 1, xi + i + 1, 1, yi + j + n, n); \
157 c##copy2(n - j - 1, xi + j + 1, 1, yj + j + 1, 1); \
160 c##copy2(j, x + i, n, y + j, n); \
161 c##copy2(i - j - 1, xj + i + n, n, yj + j + 1, 1); \
162 c##copy2(n - i - 1, xi + i + 1, 1, yj + i + 1, 1); \
169c##symcopyr1(c##TYPE *x, const c##TYPE *y, \
170 size_t n, char uplo, size_t i, size_t j) \
175 const c##TYPE *yi, *yj; \
177 xi = x + DENSE_INDEX_U(0, i, n); \
178 xj = x + DENSE_INDEX_U(0, j, n); \
179 yi = y + DENSE_INDEX_U(0, i, n); \
180 yj = y + DENSE_INDEX_U(0, j, n); \
184 c##copy1(i, xi, 1, 0, 0, yj, 1, 0, 0); \
186 c##copy1(j - i - 1, xi + i + (i + 1), i + 2, 1, 0, yj + i + 1, 1, 0, 0); \
187 c##copy1(n - j - 1, xj + i + (j + 1), j + 2, 1, 0, yj + j + (j + 1), j + 2, 1, 0); \
190 c##copy1(j, xi, 1, 0, 0, yj, 1, 0, 0); \
191 c##copy1(i - j - 1, xi + j + 1, 1, 0, 0, yj + j + (j + 1), j + 2, 1, 0); \
192 c##copy1(n - i - 1, xi + i + (i + 1), 0, i + 2, 1, yi + j + (i + 1), i + 2, 1, 0); \
195 xi = x + DENSE_INDEX_L(i, i, n); \
196 xj = x + DENSE_INDEX_L(j, j, n); \
197 yi = y + DENSE_INDEX_L(i, i, n); \
198 yj = y + DENSE_INDEX_L(j, j, n); \
202 c##copy1(i, x + i, n - 1, 1, 1, y + j, n - 1, 1, 1); \
204 c##copy1(j - i - 1, xi + (i - i) + 1, 1, 0, 0, yi + (j - i) + (n - i - 1), n - i - 2, 1, 1); \
205 c##copy1(n - j - 1, xi + (j - i) + 1, 1, 0, 0, yj + (j - j) + 1, 1, 0, 0); \
208 c##copy1(j, x + i, n - 1, 1, 1, y + j, n - 1, 1, 1); \
209 c##copy1(i - j - 1, xj + (i - j) + (n - j - 1), n - j - 2, 1, 1, yj + (j - j) + 1, 1, 0, 0); \
210 c##copy1(n - i - 1, xi + (i - i) + 1, 1, 0, 0, yj + (i - j) + 1, 1, 0, 0); \
217c##rowperm2(c##TYPE *x, const c##TYPE *y, \
218 int m, int n, const int *p, int off, int invert) \
220 if (m <= 0 || n <= 0) \
222 size_t m_ = (size_t) m, n_ = (size_t) n; \
225 memcpy(x, y, sizeof(c##TYPE) * m_ * n_); \
230 for (j = 0; j < n; ++j, x += m, y += m) \
231 for (i = 0; i < m; ++i) \
232 x[i] = y[p[i] - off]; \
234 for (j = 0; j < n; ++j, x += m, y += m) \
235 for (i = 0; i < m; ++i) \
236 x[p[i] - off] = y[i]; \
239 Matrix_Calloc(q, m, int); \
241 for (i = 0; i < m; ++i) \
242 q[i] = -(p[i] - off + 1); \
244 for (i = 0; i < m; ++i) \
245 q[p[i] - off] = -(i + 1); \
246 for (i = 0; i < m; ++i) { \
252 while (q[k1] < 0) { \
253 c##swap2(n_, x + k0, m_, x + k1, m_); \
266c##symperm2(c##TYPE *x, const c##TYPE *y, \
267 int n, char uplo, const int *p, int off, int invert) \
271 size_t n_ = (size_t) n; \
274 memcpy(x, y, sizeof(c##TYPE) * n_ * n_); \
279 for (j = 0; j < n; ++j) \
280 c##symcopyr2(x, y, n_, uplo, (size_t) j, (size_t) (p[j] - off)); \
282 for (j = 0; j < n; ++j) \
283 c##symcopyr2(x, y, n_, uplo, (size_t) (p[j] - off), (size_t) j); \
286 Matrix_Calloc(q, n, int); \
288 for (j = 0; j < n; ++j) \
289 q[j] = -(p[j] - off + 1); \
291 for (j = 0; j < n; ++j) \
292 q[p[j] - off] = -(j + 1); \
293 for (j = 0; j < n; ++j) { \
299 while (q[k1] < 0) { \
300 c##symswapr2(x, n_, uplo, (size_t) k0, (size_t) k1); \
313c##symperm1(c##TYPE *x, const c##TYPE *y, \
314 int n, char uplo, const int *p, int off, int invert) \
318 size_t n_ = (size_t) n; \
321 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n_)); \
326 for (j = 0; j < n; ++j) \
327 c##symcopyr1(x, y, n_, uplo, (size_t) j, (size_t) (p[j] - off)); \
329 for (j = 0; j < n; ++j) \
330 c##symcopyr1(x, y, n_, uplo, (size_t) (p[j] - off), (size_t) j); \
333 Matrix_Calloc(q, n, int); \
335 for (j = 0; j < n; ++j) \
336 q[j] = -(p[j] - off + 1); \
338 for (j = 0; j < n; ++j) \
339 q[p[j] - off] = -(j + 1); \
340 for (j = 0; j < n; ++j) { \
346 while (q[k1] < 0) { \
347 c##symswapr1(x, n_, uplo, (size_t) k0, (size_t) k1); \
360c##pack2(c##TYPE *x, const c##TYPE *y, \
361 size_t n, char uplo, char trans, char diag) \
366 for (j = 0; j < n; y += n - (++j)) \
367 for (i = 0; i <= j; ++i) \
369 if (diag != '\0') { \
371 for (j = 0, x = tmp; j < n; x += (++j) + 1) \
373 } else if (trans == 'C') \
374 for (j = 0, x = tmp; j < n; x += (++j) + 1) \
375 c##SET_PROJ_REAL(*x); \
377 for (j = 0; j < n; y += (++j)) \
378 for (i = j; i < n; ++i) \
380 if (diag != '\0') { \
382 for (j = 0, x = tmp; j < n; x += n - (j++)) \
384 } else if (trans == 'C') \
385 for (j = 0, x = tmp; j < n; x += n - (j++)) \
386 c##SET_PROJ_REAL(*x); \
392c##pack1(c##TYPE *x, const c##TYPE *y, \
393 size_t n, char uplo, char trans, char diag) \
396 if (diag != '\0') { \
399 for (j = 0; j < n; ++j) { \
400 for (i = 0; i <= j; ++i) \
402 for (i = j + 1; i < n; ++i) \
406 for (j = 0; j < n; ++j) { \
407 for (i = 0; i < j; ++i) \
409 for (i = j; i < n; ++i) \
415 for (j = 0, x = tmp; j < n; ++j, x += dx) \
418 } else if (trans == 'C') { \
419 c##TYPE *u = x, *l = x; \
421 for (j = 0; j < n; ++j) { \
422 for (i = 0; i < j; ++i) { \
423 c##ASSIGN_IDEN(*u, *y); \
424 c##ASSIGN_CONJ(*l, *y); \
425 u += 1; y += 1; l += n; \
427 c##ASSIGN_PROJ_REAL(*u, *y); \
429 u += n - j - 1; l = x + j + 1; \
432 for (j = 0; j < n; ++j) { \
434 c##ASSIGN_PROJ_REAL(*l, *y); \
436 for (i = j + 1; i < n; ++i) { \
437 c##ASSIGN_IDEN(*l, *y); \
438 c##ASSIGN_CONJ(*u, *y); \
439 l += 1; y += 1; u += n; \
444 c##TYPE *u = x, *l = x; \
446 for (j = 0; j < n; ++j) { \
447 for (i = 0; i < j; ++i) { \
448 c##ASSIGN_IDEN(*u, *y); \
449 c##ASSIGN_IDEN(*l, *y); \
450 u += 1; y += 1; l += n; \
452 c##ASSIGN_IDEN(*u, *y); \
454 u += n - j - 1; l = x + j + 1; \
457 for (j = 0; j < n; ++j) { \
459 c##ASSIGN_IDEN(*l, *y); \
461 for (i = j + 1; i < n; ++i) { \
462 c##ASSIGN_IDEN(*l, *y); \
463 c##ASSIGN_IDEN(*u, *y); \
464 l += 1; y += 1; u += n; \
473c##force2(c##TYPE *x, const c##TYPE *y, \
474 size_t n, char uplo, char trans, char diag) \
478 if (diag != -'N') { \
480 memset(x, 0, sizeof(c##TYPE) * n * n); \
481 for (j = 0; j < n; ++j, x += dx) \
485 size_t dy = (trans) ? 1 : dx; \
486 memset(x, 0, sizeof(c##TYPE) * n * n); \
487 for (j = 0; j < n; ++j, x += dx, y += dy) \
490 for (j = 0; j < n; ++j) { \
491 for (i = 0; i < j; ++i) \
494 for (i = j + 1; i < n; ++i) \
498 } else if (diag > '\0') { \
501 for (j = 0; j < n; ++j) { \
505 for (i = 0; i <= j; ++i) \
509 for (i = j + 1; i < n; ++i) \
513 for (j = 0; j < n; ++j) { \
514 for (i = 0; i < j; ++i) \
520 for (i = j; i < n; ++i) \
527 for (j = 0, x = tmp; j < n; ++j, x += dx) \
530 } else if (trans == 'C') { \
531 c##TYPE *u = x, *l = x; \
533 for (j = 0; j < n; ++j) { \
534 for (i = 0; i < j; ++i) { \
536 c##ASSIGN_CONJ(*l, *u); \
538 c##ASSIGN_IDEN(*u, *y); \
539 c##ASSIGN_CONJ(*l, *y); \
545 c##SET_PROJ_REAL(*u); \
547 c##ASSIGN_PROJ_REAL(*u, *y); \
552 u += n - j - 1; l = x + j + 1; \
555 for (j = 0; j < n; ++j) { \
558 c##SET_PROJ_REAL(*l); \
561 c##ASSIGN_PROJ_REAL(*l, *y); \
565 for (i = j + 1; i < n; ++i) { \
567 c##ASSIGN_CONJ(*u, *l); \
569 c##ASSIGN_IDEN(*l, *y); \
570 c##ASSIGN_CONJ(*u, *y); \
578 c##TYPE *u = x, *l = x; \
580 for (j = 0; j < n; ++j) { \
581 for (i = 0; i < j; ++i) { \
583 c##ASSIGN_IDEN(*l, *u); \
585 c##ASSIGN_IDEN(*u, *y); \
586 c##ASSIGN_IDEN(*l, *y); \
592 c##ASSIGN_IDEN(*u, *y); \
597 u += n - j - 1; l = x + j + 1; \
600 for (j = 0; j < n; ++j) { \
604 c##ASSIGN_IDEN(*l, *y); \
608 for (i = j + 1; i < n; ++i) { \
610 c##ASSIGN_IDEN(*u, *l); \
612 c##ASSIGN_IDEN(*l, *y); \
613 c##ASSIGN_IDEN(*u, *y); \
625c##force1(c##TYPE *x, const c##TYPE *y, \
626 size_t n, char uplo, char trans, char diag) \
631 if (diag != -'N') { \
632 memset(x, 0, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
633 for (j = 0; j < n; x += (++j) + 1) \
636 memset(x, 0, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
637 for (j = 0; j < n; ++j, x += j + 1, y += (trans) ? 1 : j + 1) \
640 for (j = 0; j < n; ++j) { \
641 for (i = 0; i < j; ++i) \
646 } else if (diag > '\0') { \
648 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
650 for (j = 0; j < n; x += (++j) + 1) \
652 } else if (trans == 'C') { \
654 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
655 for (j = 0; j < n; x += (++j) + 1) \
656 c##SET_PROJ_REAL(*x); \
660 if (diag != -'N') { \
661 memset(x, 0, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
662 for (j = 0; j < n; x += n - (j++)) \
665 memset(x, 0, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
666 for (j = 0; j < n; x += n - j, y += (trans) ? 1 : n - j, j++) \
669 for (j = 0; j < n; ++j) { \
671 for (i = j + 1; i < n; ++i) \
675 } else if (diag > '\0') { \
677 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
679 for (j = 0; j < n; x += n - (j++)) \
681 } else if (trans == 'C') { \
683 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
684 for (j = 0; j < n; x += n - (j++)) \
685 c##SET_PROJ_REAL(*x); \
692c##trans2(c##TYPE *x, const c##TYPE *y, \
693 size_t m, size_t n, char trans) \
695 size_t i, j, mn = m * n, mn1s = mn - 1; \
697 memcpy(x, y, sizeof(c##TYPE) * mn); \
698 else if (trans == 'C') \
699 for (j = 0; j < m; ++j, y -= mn1s) \
700 for (i = 0; i < n; ++i, x += 1, y += m) \
701 c##ASSIGN_CONJ(*x, *y); \
703 for (j = 0; j < m; ++j, y -= mn1s) \
704 for (i = 0; i < n; ++i, x += 1, y += m) \
705 c##ASSIGN_IDEN(*x, *y); \
710c##trans1(c##TYPE *x, const c##TYPE *y, \
711 size_t n, char uplo, char trans) \
715 if (trans == 'N') { \
716 memcpy(x, y, sizeof(c##TYPE) * PACKED_LENGTH(n)); \
717 } else if (trans == 'C') { \
719 for (j = 0; j < n; ++j) { \
720 for (i = j; i < n; ++i) { \
721 tmp = *(y + DENSE_INDEX_U(j, i, n)); \
722 c##ASSIGN_CONJ(*x, tmp); \
727 for (j = 0; j < n; ++j) { \
728 for (i = 0; i <= j; ++i) { \
729 tmp = *(y + DENSE_INDEX_L(j, i, n)); \
730 c##ASSIGN_CONJ(*x, tmp); \
736 for (j = 0; j < n; ++j) { \
737 for (i = j; i < n; ++i) { \
738 tmp = *(y + DENSE_INDEX_U(j, i, n)); \
739 c##ASSIGN_IDEN(*x, tmp); \
744 for (j = 0; j < n; ++j) { \
745 for (i = 0; i <= j; ++i) { \
746 tmp = *(y + DENSE_INDEX_L(j, i, n)); \
747 c##ASSIGN_IDEN(*x, tmp); \
756c##band2(c##TYPE *x, const c##TYPE *y, \
757 size_t m, size_t n, size_t a, size_t b) \
759 if (m == 0 || n == 0) \
762 if (a > b || a >= m + n || b == 0) { \
764 memset(x, 0, sizeof(c##TYPE) * d); \
767 a = (a == 0) ? 1 : a; \
768 b = (b >= m + n) ? m + n - 1 : b; \
769 size_t i, j, i0, i1, \
770 j0 = (a < m) ? 0 : a - m, \
771 j1 = (b < n) ? b : n; \
774 memset(x, 0, sizeof(c##TYPE) * d); \
775 x += d; if (y) y += d; \
777 for (j = j0; j < j1; ++j) { \
778 i0 = (b <= m + j) ? m + j - b : 0; \
779 i1 = (a >= j + 1) ? m + j - a + 1 : m; \
780 for (i = 0; i < i0; ++i) \
783 for (i = i0; i < i1; ++i) \
787 for (i = i1; i < m; ++i) \
793 memset(x, 0, sizeof(c##TYPE) * d); \
794 x += d; if (y) y += d; \
800c##band1(c##TYPE *x, const c##TYPE *y, \
801 size_t n, char uplo, size_t a, size_t b) \
806 a = (a < n) ? n : a; \
808 b = (b > n) ? n : b; \
810 if (a > b || a >= n + n || b == 0) { \
811 d = PACKED_LENGTH(n); \
812 memset(x, 0, sizeof(c##TYPE) * d); \
816 b = (b >= n + n) ? n + n - 1 : b; \
818 a = (a == 0) ? 1 : a; \
819 size_t i, j, i0, i1, \
820 j0 = (a < n) ? 0 : a - n, \
821 j1 = (b < n) ? b : n; \
824 d = PACKED_LENGTH(j0); \
825 memset(x, 0, sizeof(c##TYPE) * d); \
826 x += d; if (y) y += d; \
828 for (j = j0; j < j1; ++j) { \
829 i0 = (b <= n + j) ? n + j - b : 0; \
830 i1 = (a >= n ) ? n + j - a + 1 : j + 1; \
831 for (i = 0; i < i0; ++i) \
834 for (i = i0; i < i1; ++i) \
838 for (i = i1; i <= j; ++i) \
843 d = PACKED_LENGTH(n) - PACKED_LENGTH(j1); \
844 memset(x, 0, sizeof(c##TYPE) * d); \
845 x += d; if (y) y += d; \
849 d = PACKED_LENGTH(n) - PACKED_LENGTH(j0); \
850 memset(x, 0, sizeof(c##TYPE) * d); \
851 x += d; if (y) y += d; \
853 for (j = j0; j < j1; ++j) { \
854 i0 = (b <= n ) ? n + j - b : j; \
855 i1 = (a >= j + 1) ? n + j - a + 1 : n; \
856 for (i = j; i < i0; ++i) \
857 x[i - j] = c##ZERO; \
859 for (i = i0; i < i1; ++i) \
860 x[i - j] = y[i - j]; \
863 for (i = i1; i < n; ++i) \
864 x[i - j] = c##ZERO; \
868 d = PACKED_LENGTH(n - j1); \
869 memset(x, 0, sizeof(c##TYPE) * d); \
870 x += d; if (y) y += d; \
885c##test2(const c##TYPE *x, \
886 size_t n, char uplo, char trans, char diag) \
890 for (j = 0; j < n; ++j) { \
891 for (i = 0; i < j; ++i) { \
892 if (c##NOT_ZERO(*x)) \
896 if (diag != -'N' && c##NOT_UNIT(*x)) \
899 for (i = j + 1; i < n; ++i) { \
900 if (c##NOT_ZERO(*x)) \
905 } else if (diag > '\0') { \
907 for (j = 0; j < n; ++j) { \
909 if (diag != 'N' && c##NOT_UNIT(*x)) \
912 for (i = j + 1; i < n; ++i) { \
913 if (c##NOT_ZERO(*x)) \
919 for (j = 0; j < n; ++j) { \
920 for (i = 0; i < j; ++i) { \
921 if (c##NOT_ZERO(*x)) \
925 if (diag != 'N' && c##NOT_UNIT(*x)) \
931 } else if (trans == 'C') { \
932 const c##TYPE *u = x, *l = x; \
933 for (j = 0; j < n; ++j) { \
934 for (i = 0; i < j; ++i) { \
935 if (c##NOT_CONJ(*l, *u)) \
939 if (c##NOT_ZERO_IMAG(*u)) \
942 u += n - j - 1; l = x + j + 1; \
945 const c##TYPE *u = x, *l = x; \
946 for (j = 0; j < n; ++j) { \
947 for (i = 0; i < j; ++i) { \
948 if (c##NOT_IDEN(*l, *u)) \
953 u += n - j - 1; l = x + j + 1; \
960c##test1(const c##TYPE *x, \
961 size_t n, char uplo, char trans, char diag) \
966 for (j = 0; j < n; ++j) { \
967 for (i = 0; i < j; ++i) { \
968 if (c##NOT_ZERO(*x)) \
972 if (diag != -'N' && c##NOT_UNIT(*x)) \
976 } else if (diag > '\0') { \
978 for (j = 0; j < n; x += (++j) + 1) \
979 if (c##NOT_UNIT(*x)) \
981 } else if (trans == 'C') { \
982 for (j = 0; j < n; x += (++j) + 1) \
983 if (c##NOT_ZERO_IMAG(*x)) \
988 for (j = 0; j < n; ++j) { \
989 if (diag != -'N' && c##NOT_UNIT(*x)) \
992 for (i = j + 1; i < n; ++i) { \
993 if (c##NOT_ZERO(*x)) \
998 } else if (diag > '\0') { \
1000 for (j = 0; j < n; x += n - (j++)) \
1001 if (c##NOT_UNIT(*x)) \
1003 } else if (trans == 'C') { \
1004 for (j = 0; j < n; x += n - (j++)) \
1005 if (c##NOT_ZERO_IMAG(*x)) \
1012void c##tspaggr( int *i1, int *j1, c##TYPE *x1, \
1013 const int *i0, const int *j0, const c##TYPE *x0, \
1014 int m, int n, int *nnz, int *iwork, c##TYPE *work) \
1016 int *iworkA = iwork, *iworkB = iworkA + m + 1, *iworkC = iworkB + m, \
1017 *j_ = iworkC + n, i, j, k, kend, ka, kb; \
1019 c##TYPE *x_ = work; \
1024 int nnz0 = *nnz, nnz1 = 0; \
1028 for (i = 0; i <= m; ++i) \
1031 for (k = 0; k < nnz0; ++k) \
1033 for (i = 0; i < m; ++i) \
1034 iworkA[i] += iworkA[i - 1]; \
1042 for (k = 0; k < nnz0; ++k) { \
1044 x_[iworkA[i0[k]] ] = x0[k]; \
1046 j_[iworkA[i0[k]]++] = j0[k]; \
1059 for (j = 0; j < n; ++j) \
1061 for (i = 0, k = 0; i < m; ++i) { \
1064 while (k < kend) { \
1065 if (iworkC[j_[k]] < ka) { \
1067 iworkC[j_[k]] = kb; \
1075 c##INCREMENT_IDEN(x_[iworkC[j_[k]]], x_[k]); \
1096 for (i = 0, k = 0; i < m; ++i) { \
1114void c##tspsort( int *p1, int *i1, c##TYPE *x1, \
1115 const int *i0, const int *j0, const c##TYPE *x0, \
1116 int m, int n, int *nnz, int *iwork, c##TYPE *work) \
1120 c##tspaggr(NULL, NULL, NULL, i0, j0, x0, m, n, nnz, iwork, work); \
1124 int *iworkA = iwork, *iworkB = iworkA + m + 1, *iworkC = iworkB + m, \
1125 *j_ = iworkC + n, i, j, k, kb; \
1127 c##TYPE *x_ = work; \
1132 for (j = 0; j <= n; ++j) \
1135 for (i = 0, k = 0; i < m; ++i) { \
1143 for (j = 0; j < n; ++j) \
1144 p1[j] += (iworkC[j] = p1[j - 1]); \
1152 for (i = 0, k = 0; i < m; ++i) { \
1156 x1[iworkC[j_[k]] ] = x_[k]; \
1158 i1[iworkC[j_[k]]++] = i; \
1171void c##cspsort(int *p1, int *i1, c##TYPE *x1, \
1172 int m, int n, int *iwork, c##TYPE *work) \
1174 int *iworkA = iwork, *iworkB = iworkA + m + 1, \
1175 *j_ = iworkB + ((m < n) ? n : m), i, j, k, kend, nnz = p1[n]; \
1177 c##TYPE *x_ = work; \
1180 for (i = 0; i <= m; ++i) \
1183 for (k = 0; k < nnz; ++k) \
1185 for (i = 0; i < m; ++i) \
1186 iworkA[i] += (iworkB[i] = iworkA[i - 1]); \
1190 for (j = 0, k = 0; j < n; ++j) { \
1192 while (k < kend) { \
1195 x_[iworkB[i] ] = x1[k]; \
1197 j_[iworkB[i]++] = j; \
1203 for (j = 0; j < n; ++j) \
1204 iworkB[j] = p1[j]; \
1207 for (i = 0, k = 0; i < m; ++i) { \
1209 while (k < kend) { \
1212 x1[iworkB[j] ] = x_[k]; \
1214 i1[iworkB[j]++] = i; \
1223void c##csptrans( int *p1, int *i1, c##TYPE *x1, \
1224 const int *p0, const int *i0, const c##TYPE *x0, \
1225 int m, int n, char trans, int *iwork) \
1227 int i, j, k, kend, nnz = p0[n]; \
1230 for (i = 0; i <= m; ++i) \
1233 for (k = 0; k < nnz; ++k) \
1235 for (i = 0; i < m; ++i) \
1236 p1[i] += (iwork[i] = p1[i - 1]); \
1240 for (j = 0, k = 0; j < n; ++j) { \
1242 while (k < kend) { \
1244 c##ASSIGN_CONJ(x1[iwork[i0[k]]], x0[k]); \
1246 i1[iwork[i0[k]]++] = j; \
1251 for (j = 0, k = 0; j < n; ++j) { \
1253 while (k < kend) { \
1255 c##ASSIGN_IDEN(x1[iwork[i0[k]]], x0[k]); \
1257 i1[iwork[i0[k]]++] = j; \
1274void zvreal(Rcomplex *x,
const Rcomplex *y,
size_t n)
1278 (* x ).r = (*(y++)).r;
1287void zvimag(Rcomplex *x,
const Rcomplex *y,
size_t n)
1292 (*(x++)).i = (*(y++)).i;
1300void zvconj(Rcomplex *x,
const Rcomplex *y,
size_t n)
1304 (* x ).r = (* y ).r;
1305 (*(x++)).i = -(*(y++)).i;
void zvimag(Rcomplex *x, const Rcomplex *y, size_t n)
void zvreal(Rcomplex *x, const Rcomplex *y, size_t n)
void zvconj(Rcomplex *x, const Rcomplex *y, size_t n)