Branch Coverage

LikeR.xs
Criterion Covered Total %
branch 4731 6706 70.5


line true false branch
48 26 0 if (!val || !SvOK(val)) return;
0 26 if (!val || !SvOK(val)) return;
54 26 0 if (svp) {
55 17 9 if (!SvOK(*svp)) {
90 0 229 if (df <= 0.0) return 0.0;
96 6869771 229 for (unsigned short i = 1; i < n_steps; i++) {
105 3435000 3434771 NV weight = (i % 2 != 0) ? 4.0 : 2.0;
125 50 6 for (size_t i = 0; i < n; i++) {
131 50 6 for (size_t i = 0; i < n; ) {
133 44 6 while (j < n && items[j].val == items[i].val) j++;
0 44 while (j < n && items[j].val == items[i].val) j++;
135 50 50 for (size_t k = i; k < j; k++) items[k].rank = avg_rank;
139 50 6 for (size_t i = 0; i < n; i++) ranks[i] = items[i].rank;
145 100 20399 if (prob <= 0.0) return 0;
146 100 20299 if (prob >= 1.0) return size;
149 291991 20299 for (size_t i = 0; i < size; i++) {
150 105828 186163 if (Drand01() <= prob) successes++;
159 546 0 if (k < 0 || k > n || n < 0) return -INFINITY;
546 0 if (k < 0 || k > n || n < 0) return -INFINITY;
0 546 if (k < 0 || k > n || n < 0) return -INFINITY;
173 0 26 if (S->ns <= 0) { S->logdc = NULL; return 0; }
174 0 26 Newx(S->logdc, S->ns, NV);
175 182 26 for (long i = 0; i < S->ns; i++) {
186 1782 233 for (long i = 0; i < S->ns; i++) {
188 1061 721 if (out[i] > mx) mx = out[i];
191 1782 233 for (long i = 0; i < S->ns; i++) { out[i] = exp(out[i] - mx); s += out[i]; }
192 1782 233 for (long i = 0; i < S->ns; i++) out[i] /= s;
196 2 91 if (ncp == 0) return (NV)S->lo;
197 0 91 if (isinf(ncp)) return (NV)S->hi;
200 679 91 for (long i = 0; i < S->ns; i++) mu += (NV)(S->lo + i) * scratch[i];
206 42 143 if (ncp == 1.0) {
208 302 42 for (long i = 0; i < S->ns; i++) {
210 144 158 if (upper ? (j >= q) : (j <= q)) s += exp(S->logdc[i]);
143 159 if (upper ? (j >= q) : (j <= q)) s += exp(S->logdc[i]);
214 10 133 if (ncp == 0.0) return upper ? (NV)(q <= S->lo) : (NV)(q >= S->lo);
7 3 if (ncp == 0.0) return upper ? (NV)(q <= S->lo) : (NV)(q >= S->lo);
0 7 if (ncp == 0.0) return upper ? (NV)(q <= S->lo) : (NV)(q >= S->lo);
3 0 if (ncp == 0.0) return upper ? (NV)(q <= S->lo) : (NV)(q >= S->lo);
215 0 133 if (isinf(ncp)) return upper ? (NV)(q <= S->hi) : (NV)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (NV)(q <= S->hi) : (NV)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (NV)(q <= S->hi) : (NV)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (NV)(q <= S->hi) : (NV)(q >= S->hi);
218 1040 133 for (long i = 0; i < S->ns; i++) {
220 522 518 if (upper ? (j >= q) : (j <= q)) s += scratch[i];
474 566 if (upper ? (j >= q) : (j <= q)) s += scratch[i];
229 216 0 while (maxit-- > 0) {
231 72 144 if (fabs(fc) < fabs(fb)) { a = b; b = c; c = a; fa = fb; fb = fc; fc = fa; }
234 187 29 if (fabs(step) <= tol_act || fb == 0.0) return b;
0 187 if (fabs(step) <= tol_act || fb == 0.0) return b;
235 187 0 if (fabs(prev) >= tol_act && fabs(fa) > fabs(fb)) {
187 0 if (fabs(prev) >= tol_act && fabs(fa) > fabs(fb)) {
237 119 68 if (a == c) { NV t1 = fb / fa; p = cb * t1; q = 1.0 - t1; }
243 73 114 if (p > 0) q = -q; else p = -p;
244 179 8 if (p < 0.75 * cb * q - fabs(tol_act * q) / 2 && p < fabs(prev * q / 2)) step = p / q;
155 24 if (p < 0.75 * cb * q - fabs(tol_act * q) / 2 && p < fabs(prev * q / 2)) step = p / q;
246 25 162 if (fabs(step) < tol_act) step = step > 0 ? tol_act : -tol_act;
9 16 if (fabs(step) < tol_act) step = step > 0 ? tol_act : -tol_act;
248 119 68 if ((fb > 0) == (fc > 0)) { c = a; fc = fa; }
271 0 13 if (!ft_init(&S, a, b, c, d)) return 1.0;
272 0 13 NV *restrict sc; Newx(sc, S.ns, NV);
274 2 11 if (!strcmp(alt, "less")) p = ft_pnhyper(&S, S.x, 1.0, 0, sc);
275 2 9 else if (!strcmp(alt, "greater")) p = ft_pnhyper(&S, S.x, 1.0, 1, sc);
279 30 33 for (long i = 0; i < S.ns; i++) if (sc[i] <= dx * relErr) s += sc[i];
63 9 for (long i = 0; i < S.ns; i++) if (sc[i] <= dx * relErr) s += sc[i];
282 0 13 if (p < 0) p = 0; if (p > 1) p = 1;
0 13 if (p < 0) p = 0; if (p > 1) p = 1;
290 0 13 if (!ft_init(&S, a, b, c, d)) { *orp = NAN; *lop = NAN; *hip = NAN; return; }
291 0 13 NV *restrict sc; Newx(sc, S.ns, NV);
296 1 12 if (x == lo) est = 0.0;
297 2 10 else if (x == hi) est = INFINITY;
301 2 8 if (mu > x) { r.mode = 0; est = ft_zeroin(0, 1, ft_rootf, &r, FT_TOL, 1000); }
302 8 0 else if (mu < x) { r.mode = 1; est = 1.0 / ft_zeroin(FT_EPS, 1, ft_rootf, &r, FT_TOL, 1000); }
322 2 11 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
0 2 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
1 1 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
1 0 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
323 2 9 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
0 2 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
2 0 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
0 0 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
324 1 8 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
5 3 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
3 0 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
2 7 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
2 5 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
5 0 else { NV al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
332 56 0 if (!sv || !SvOK(sv)) croak("fisher_test: %s is undef", what);
0 56 if (!sv || !SvOK(sv)) croak("fisher_test: %s is undef", what);
333 0 56 if (!looks_like_number(sv)) croak("fisher_test: %s is not a number", what);
335 1 55 if (v < 0) croak("fisher_test: %s must be nonnegative (got %" IVdf ")", what, v);
348 237 75 for (size_t k = 0; k < n; k++) {
352 237 75 for (size_t k = 0; k < n; k++) {
355 188 49 if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) {
0 188 if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) {
358 2451 49 for (size_t i = 0; i < n; i++) {
367 644 188 for (size_t j = 0; j < n; j++) A[k * n + j] *= pivot;
368 644 188 for (size_t i = 0; i < n; i++) {
369 456 188 if (i != k && A[i * n + k] != 0.0) {
450 6 if (i != k && A[i * n + k] != 0.0) {
372 8500 450 for (size_t j = 0; j < n; j++) {
385 1184 3712 if (row_hashes) {
387 1184 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
1184 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
1184 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
391 3712 0 } else if (data_hoa) {
393 3712 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
3712 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
3712 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
398 4896 0 if (val && SvOK(*val)) {
4893 3 if (val && SvOK(*val)) {
399 4844 49 if (looks_like_number(*val)) return SvNV(*val);
408 9 0 if (data_hoa) {
411 24 9 while ((entry = hv_iternext(data_hoa))) {
414 0 0 } else if (row_hashes && n > 0 && row_hashes[0]) {
0 0 } else if (row_hashes && n > 0 && row_hashes[0]) {
0 0 } else if (row_hashes && n > 0 && row_hashes[0]) {
417 0 0 while ((entry = hv_iternext(row_hashes[0]))) {
426 4928 0 if (!term || term[0] == '\0') return NAN;
0 4928 if (!term || term[0] == '\0') return NAN;
430 32 4896 if (colon) {
435 32 0 if (isnan(left) || isnan(right)) return NAN;
0 32 if (isnan(left) || isnan(right)) return NAN;
438 0 4896 if (strncmp(term_cpy, "I(", 2) == 0) {
440 0 0 if (end) *end = '\0';
444 0 0 if (caret) {
451 0 0 if (isnan(v)) return NAN;
452 0 0 return power == 1 ? v : pow(v, power);
461 145 1 for (size_t i = 0; i < n; i++) {
463 55 90 if (row_hashes) {
465 23 32 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
23 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
23 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
469 90 0 } else if (data_hoa) {
471 90 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
90 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
90 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
476 113 32 if (val && SvOK(*val)) {
113 0 if (val && SvOK(*val)) {
477 103 10 if (looks_like_number(*val)) return FALSE; // First valid is number -> Numeric Column
487 0 371 if (row_hashes) {
489 0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) {
493 371 0 } else if (data_hoa) {
495 371 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
371 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
371 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
500 371 0 if (val && SvOK(*val)) {
371 0 if (val && SvOK(*val)) {
515 707 812 if (diff < 0) return -1;
516 812 0 if (diff > 0) return 1;
532 53 4 if (diff < 0) return -1;
533 3 1 if (diff > 0) return 1;
541 0 8 Newx(ri, n, RankItem);
542 48 8 for (size_t i = 0; i < n; i++) { ri[i].val = in[i]; ri[i].idx = i; }
546 47 8 while (i < n) {
549 40 8 while (j + 1 < n && ri[j + 1].val == ri[j].val) j++;
1 39 while (j + 1 < n && ri[j + 1].val == ri[j].val) j++;
552 48 47 for (size_t k = i; k <= j; k++) out[ri[k].idx] = avg;
562 303 61 for (size_t i = 0; i < n; i++) {
568 0 61 if (den == 0.0) return NAN;
582 8 1 for (size_t i = 0; i < n - 1; i++) {
583 36 8 for (size_t j = i + 1; j < n; j++) {
586 1 35 if (sx == 0 && sy == 0) { /* joint tie — not counted */ }
0 1 if (sx == 0 && sy == 0) { /* joint tie — not counted */ }
587 1 35 else if (sx == 0) tie_x++;
588 0 35 else if (sy == 0) tie_y++;
589 35 0 else if (sx == sy) C++;
594 0 1 if (denom == 0.0) return NAN;
602 3 59 if (strcmp(method, "spearman") == 0) {
604 0 3 Newx(rx, n, NV); Newx(ry, n, NV);
0 3 Newx(rx, n, NV); Newx(ry, n, NV);
611 1 58 if (strcmp(method, "kendall") == 0)
627 0 8632 if (fabs(d) < FPMIN) d = FPMIN;
629 184713 3 for (m = 1; m <= MAX_ITER; m++) {
633 0 184713 if (fabs(d) < FPMIN) d = FPMIN;
635 0 184713 if (fabs(c) < FPMIN) c = FPMIN;
639 0 184713 if (fabs(d) < FPMIN) d = FPMIN;
641 0 184713 if (fabs(c) < FPMIN) c = FPMIN;
643 8629 176084 if (fabs(del - 1.0) < EPS) break;
649 9 8674 if (x <= 0.0) return 0.0;
650 42 8632 if (x >= 1.0) return 1.0;
652 7035 1597 if (x < (a + 1.0) / (a + b + 2.0)) return bt * _incbeta_cf(a, b, x) / a;
659 2 8373 if (strcmp(alt, "less") == 0) return (t < 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail;
1 1 if (strcmp(alt, "less") == 0) return (t < 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail;
660 8248 125 if (strcmp(alt, "greater") == 0) return (t > 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail;
8248 0 if (strcmp(alt, "greater") == 0) return (t > 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail;
668 384 277 while (get_t_pvalue(high, df, "greater") > p_tail) {
671 0 384 if (high > 1000000.0) break; /* Fallback limit */
674 7586 0 for (unsigned short int i = 0; i < 100; i++) {
677 3711 3875 if (p_mid > p_tail) {
682 277 7309 if (high - low < 1e-8) break;
694 0 0 if (n == 0) return 1;
703 5 0 NV step = (n_bins > 0) ? (breaks[1] - breaks[0]) : 0.0;
705 18 5 for (size_t i = 0; i < n_bins; i++) {
710 3 2 if (step > 0.0) {
711 2014 3 for (size_t j = 0; j < n; j++) {
714 2014 0 if (isnan(val) || isinf(val) || val < min_val) continue;
2014 0 if (isnan(val) || isinf(val) || val < min_val) continue;
0 2014 if (isnan(val) || isinf(val) || val < min_val) continue;
718 3 2011 if (idx >= n_bins) {
724 1816 207 while (idx > 0 && val <= breaks[idx]) {
9 1807 while (idx > 0 && val <= breaks[idx]) {
728 1811 203 while (idx < n_bins - 1 && val > breaks[idx + 1]) {
0 1811 while (idx < n_bins - 1 && val > breaks[idx + 1]) {
733 2 0 } else if (n_bins > 0) {
738 18 5 for (size_t i = 0; i < n_bins; i++) {
740 16 2 if (bin_width > 0) {
743 2 0 density[i] = (n_bins == 1) ? 1.0 : 0.0;
766 22 8 if (fabs(y) < 0.42) {
772 7 1 if (y > 0) r = 1.0 - p;
776 1 7 if (y < 0) x = -x;
794 5 1 for (size_t i = 0; i < n; i++) { perm[i] = i + 1; c[i] = 0; }
809 5 1 TALLY_PERM(); /* initial permutation [1, 2, ..., n] */
1 0 TALLY_PERM(); /* initial permutation [1, 2, ..., n] */
0 1 TALLY_PERM(); /* initial permutation [1, 2, ..., n] */
812 205 1 while (k < n) {
813 119 86 if (c[k] < k) {
815 44 75 if (k % 2 == 0) {
820 595 119 TALLY_PERM();
7 112 TALLY_PERM();
115 4 TALLY_PERM();
835 0 1 if (strcmp(alt, "greater") == 0) return p_le;
836 0 1 if (strcmp(alt, "less") == 0) return p_ge;
838 1 0 NV p = 2.0 * (p_le < p_ge ? p_le : p_ge);
839 0 1 return (p > 1.0) ? 1.0 : p;
848 22 2 for (long i = 0; i <= max_inv; i++) dp[i] = 0.0;
851 8 2 for (size_t i = 2; i <= n; i++) {
853 88 8 for (long k = 0; k <= max_inv; k++) next_dp[k] = 0.0;
855 48 8 for (int k = 0; k <= current_max_inv; k++) {
857 178 28 for (int j = 0; j <= i - 1 && k - j >= 0; j++) {
158 20 for (int j = 0; j <= i - 1 && k - j >= 0; j++) {
868 0 2 if (i_obs < 0) i_obs = 0;
869 0 2 if (i_obs > max_inv) i_obs = max_inv;
871 18 2 for (long k = i_obs; k <= max_inv; k++) p_le += dp[k];
873 6 2 for (long k = 0; k <= i_obs; k++) p_ge += dp[k];
875 0 2 if (strcmp(alt, "greater") == 0) return p_ge;
876 1 1 if (strcmp(alt, "less") == 0) return p_le;
878 1 0 NV p = 2.0 * (p_ge < p_le ? p_ge : p_le);
879 0 1 return p > 1.0 ? 1.0 : p;
883 0 308 if (f <= 0.0) return 0.0;
892 20 7 for (size_t k = 0; k < p; k++) {
894 0 20 if (r >= n) {
900 168 20 for (size_t i = r; i < n; i++) {
901 41 127 if (fabs(X[i][k]) > max_val) max_val = fabs(X[i][k]);
903 1 19 if (max_val < 1e-10) {
909 165 19 for (size_t i = r; i < n; i++) {
914 12 7 NV s = (X[r][k] > 0) ? -norm : norm;
918 20 19 for (size_t j = k + 1; j < p; j++) {
920 182 20 for (size_t i = r + 1; i < n; i++) dot += X[i][j] * X[i][k];
923 182 20 for (size_t i = r + 1; i < n; i++) X[i][j] += tau * X[i][k];
928 146 19 for (size_t i = r + 1; i < n; i++) dot_y += y[i] * X[i][k];
931 146 19 for (size_t i = r + 1; i < n; i++) y[i] += tau_y * X[i][k];
947 21 0 if (!sv || !SvOK(sv)) return 0;
0 21 if (!sv || !SvOK(sv)) return 0;
950 21 19 for (size_t i = 0; i < len; i++) {
951 2 19 if (!isdigit(s[i])) return 1;
976 165 0 const size_t sep_len = sep ? strlen(sep) : 0;
977 140483 165 for (size_t i = 0; i < n; i++) {
978 140320 163 if (i && sep_len) PerlIO_write(fh, sep, sep_len);
140320 0 if (i && sep_len) PerlIO_write(fh, sep, sep_len);
980 140483 0 if (!f || !*f) continue; /* undef/empty -> print nothing */
52 140431 if (!f || !*f) continue; /* undef/empty -> print nothing */
983 140422 9 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
140420 2 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
2 140418 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
985 140418 0 } else if (sep_len && strstr(f, sep)) {
10 140408 } else if (sep_len && strstr(f, sep)) {
988 140408 23 if (!need_quotes) {
992 174 23 for (const char *restrict p = f; *p; p++) {
993 10 164 if (*p == '"') PerlIO_putc(fh, '"'); /* double it */
1005 11 0 if (x < 0.0 || a <= 0.0) return 1.0;
0 11 if (x < 0.0 || a <= 0.0) return 1.0;
1006 0 11 if (x == 0.0) return 1.0;
1009 4 7 if (x < a + 1.0) {
1013 58 4 while (fabs(term) > 1e-15) {
1026 105 0 while (i < 10000) { // Safety bound
1030 0 105 if (fabs(d) < 1e-30) d = 1e-30;
1032 0 105 if (fabs(c) < 1e-30) c = 1e-30;
1036 7 98 if (fabs(del - 1.0) < 1e-15) break;
1044 0 11 if (df <= 0) return 1.0;
1045 0 11 if (stat <= 0.0) return 1.0;
1055 2 0 if (k < 0 || k > n) return 0.0L;
0 2 if (k < 0 || k > n) return 0.0L;
1056 0 2 if (k > n / 2) k = n - k;
1058 6 2 for (int i = 1; i <= k; i++) {
1069 2 2 if (k < 0) return 0.0;
1070 0 2 if (k >= max_u) return 1.0;
1075 6 2 for (int j = 1; j <= n; j++) {
1076 48 6 for (int i = j; i <= max_u; i++) w[i] += w[i - j];
1077 30 6 for (int i = max_u; i >= j + m; i--) w[i] -= w[i - j - m];
1081 2 2 for (int i = 0; i <= k; i++) cum_p += w[i];
1097 0 6 if (k < 0) return 0.0;
1099 1 5 if ((size_t)k >= max_v) return 1.0;
1103 41 5 for (size_t i = 1; i <= n; i++)
1104 1541 41 for (size_t j = max_v; j >= i; j--)
1108 177 5 for (size_t v = 0; v <= (size_t)k; v++) cum_p += w[v];
1111 41 5 for (size_t i = 0; i < n; i++) total *= 2.0L;
1125 0 11 if (n == 0) return 0.0;
1130 113 11 while (i < n) {
1132 110 11 while (j < n && ri[j].val == ri[i].val) j++;
8 102 while (j < n && ri[j].val == ri[i].val) j++;
1134 121 113 for (size_t k = i; k < j; k++) ri[k].rank = r;
1136 6 107 if (t > 1) { *has_ties = 1; tie_adj += ((NV)t * t * t - t); }
1154 0 43 if (n == 0) return 1.0;
1155 0 43 if (n < 0) return 1.0 / r_pow_di(x, -n);
1157 403 43 for (int i = 0; i < n; i++) val *= x;
1165 1 2 if(x <= 0.) {
1166 0 1 if(lower) p = 0.;
1168 2 0 } else if(x < 1.) {
1173 3 2 for(k = 1; k < k_max; k += 2) {
1177 2 0 if(!lower) p = 1.0 - p;
1182 0 0 if(lower) {
1187 0 0 while(fabs(old_val - new_val) > tol) {
1200 137 11 for(unsigned int i = 0; i < m; i++) {
1201 2531 137 for(unsigned int j = 0; j < m; j++) {
1203 48017 2531 for(unsigned int k = 0; k < m; k++) s += A[i * m + k] * B[k * m + j];
1210 3 7 if(n == 1) {
1211 363 3 for(int i = 0; i < m * m; i++) V[i] = A[i];
1219 3 4 if((n % 2) == 0) {
1220 1083 3 for(int i = 0; i < m * m; i++) V[i] = B[i];
1226 0 7 if(V[(m / 2) * m + (m / 2)] > 1e140) {
1227 0 0 for(int i = 0; i < m * m; i++) V[i] = V[i] * 1e-140;
1241 21 3 for(int i = 0; i < m; i++) {
1242 363 21 for(int j = 0; j < m; j++) {
1243 153 210 if(i - j + 1 < 0) H[i * m + j] = 0;
1247 21 3 for(int i = 0; i < m; i++) {
1251 1 2 H[(m - 1) * m] += ((2 * h - 1 > 0) ? r_pow_di(2 * h - 1, m) : 0);
1253 21 3 for(int i = 0; i < m; i++) {
1254 363 21 for(int j = 0; j < m; j++) {
1255 192 171 if(i - j + 1 > 0) {
1256 1332 192 for(int g = 1; g <= i - j + 1; g++) H[i * m + j] /= g;
1265 56 3 for(int i = 1; i <= n; i++) {
1267 0 56 if(s < 1e-140) {
1292 628 74 while (i < nx || j < ny) {
53 21 while (i < nx || j < ny) {
1294 628 53 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
574 54 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
313 261 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
1295 54 53 else if (i < nx) val = x[i];
1297 982 74 while (i < nx && x[i] <= val) i++;
375 607 while (i < nx && x[i] <= val) i++;
1298 921 75 while (j < ny && y[j] <= val) j++;
315 606 while (j < ny && y[j] <= val) j++;
1302 120 561 if (diff > max_d_plus) max_d_plus = diff;
1303 45 636 if (-diff > max_d_minus) max_d_minus = -diff;
1304 135 546 if (fabs(diff) > max_d) max_d = fabs(diff);
1310 24758 3208 if (two_sided) return (fabs(r - s) >= q);
1319 306 19 for (size_t j = 1; j <= n; j++)
1320 125 181 u[j] = psmirnov_exact_test(q, 0., j / nd, two_sided) ? 1. : u[j - 1];
1321 366 19 for (size_t i = 1; i <= m; i++) {
1322 266 100 if (psmirnov_exact_test(q, i / md, 0., two_sided)) u[0] = 1.;
1323 27294 366 for (size_t j = 1; j <= n; j++) {
1324 23526 3768 if (psmirnov_exact_test(q, i / md, j / nd, two_sided)) u[j] = 1.;
1339 0 229 if (nu < 1e-7) nu = 1e-7;
1347 0 229 if (strict && tside == 2) {
0 0 if (strict && tside == 2) {
1360 0 6 if (p <= 0.0) return 0.0;
1361 0 6 if (p >= 1.0) return INFINITY;
1364 14 6 while (pf(high, df1, df2) < p) {
1367 0 14 if (high > 1e100) break; /* Fallback limit */
1371 251 0 for (unsigned short int i = 0; i < 150; i++) {
1375 122 129 if (p_mid < p) {
1380 6 245 if (high - low < 1e-12) break;
1412 12 6 for (size_t g = 0; g < k; g++) {
1417 66 12 for (size_t i = 0; i < ng; i++) sum += data[offset + i];
1422 66 12 for (size_t i = 0; i < ng; i++) {
1432 66 6 for (IV i = 0; i < (IV)total_n; i++) grand_mean += data[i];
1437 0 6 if (var_equal) {/* ── Classic one-way ANOVA
1440 0 0 for (size_t g = 0; g < k; g++) {
1456 12 6 for (size_t g = 0; g < k; g++) { w_i[g] = n_i[g] / v_i[g]; sum_w += w_i[g]; }
1458 12 6 for (size_t g = 0; g < k; g++) wgrand += w_i[g] * m_i[g];
1461 12 6 for (size_t g = 0; g < k; g++) {
1467 12 6 for (size_t g = 0; g < k; g++) {
1473 6 0 res.denom_df = (tmp > 0.0) ? (1.0 / (3.0 * tmp)) : 1e300;
1476 12 6 for (size_t g = 0; g < k; g++) {
1483 6 0 res.ms_between = (df1 > 0.0) ? ssbg / df1 : 0.0;
1484 6 0 res.ms_within = (res.denom_df > 0.0) ? sswg / res.denom_df : 0.0;
1503 1 3 if (!tilde) return 0;
1508 6 0 while (l_end >= l_start && isspace((unsigned char)*l_end)) l_end--;
3 3 while (l_end >= l_start && isspace((unsigned char)*l_end)) l_end--;
1509 0 3 if (l_end < l_start) return 0; /* empty LHS */
1513 6 0 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
3 3 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
1515 3 0 while (r_end >= r_start && isspace((unsigned char)*r_end)) r_end--;
0 3 while (r_end >= r_start && isspace((unsigned char)*r_end)) r_end--;
1516 0 3 if (r_end < r_start) return 0; /* empty RHS */
1560 1 1 if (n != nl) {
1566 0 1 if (n < 2) {
1578 6 1 for (IV i = 0; i < n; i++) {
1580 6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
1583 7 2 for (size_t g = 0; g < ngroups; g++) {
1584 4 3 if (strEQ(group_names[g], label)) { gidx = (IV)g; break; }
1586 2 4 if (gidx < 0) {
1587 0 2 if (ngroups >= OWT_MAX_GROUPS) {
1603 0 1 if (ngroups < 2) {
1606 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1612 6 1 for (unsigned i = 0; i < n; i++) out_sizes[obs_group[i]]++;
1614 2 1 for (size_t g = 0; g < ngroups; g++) {
1615 0 2 if (out_sizes[g] < 2) {
1619 0 0 for (size_t gg = 0; gg < ngroups; gg++) Safefree(group_names[gg]);
1628 1 1 for (size_t g = 1; g < ngroups; g++)
1630 6 1 for (IV i = 0; i < n; i++) {
1632 6 0 NV val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
6 0 NV val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
1639 1 0 if (out_names) {
1642 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1666 25 0 if (isnan(x) || isnan(mu) || isnan(sigma)) return x + mu + sigma;
25 0 if (isnan(x) || isnan(mu) || isnan(sigma)) return x + mu + sigma;
0 25 if (isnan(x) || isnan(mu) || isnan(sigma)) return x + mu + sigma;
1667 0 25 if (sigma < 0.0) {
1671 0 25 if (isinf(sigma)) return 0.0;
1672 25 0 if ((isnan(x) || isinf(x)) && mu == x) return NAN; // x-mu is NaN
0 25 if ((isnan(x) || isinf(x)) && mu == x) return NAN; // x-mu is NaN
0 0 if ((isnan(x) || isinf(x)) && mu == x) return NAN; // x-mu is NaN
1674 0 25 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
0 0 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
1678 25 0 if (isnan(x) || isinf(x)) return 0.0;
0 25 if (isnan(x) || isinf(x)) return 0.0;
1681 0 25 if (x >= 2.0 * sqrt(DBL_MAX)) return 0.0;
1682 1 24 if (give_log) {
1686 22 2 if (x < 5.0) {
1690 0 2 if (x > sqrt(-2.0 * M_LN2 * (DBL_MIN_EXP + 1.0 - DBL_MANT_DIG))) {
1703 14 7 for (size_t i = 0; i < n; i++) {
1704 14 14 for (size_t j = 0; j < n; j++) v[i * n + j] = (i == j) ? 1.0 : 0.0;
28 14 for (size_t j = 0; j < n; j++) v[i * n + j] = (i == j) ? 1.0 : 0.0;
1709 14 7 for (size_t i = 0; i < n; i++) { b[i] = d[i]; z[i] = 0.0; }
1710 14 0 for (int iter = 1; iter <= 50; iter++) {
1712 14 14 for (size_t i = 0; i < n - 1; i++) {
1713 14 14 for (size_t j = i + 1; j < n; j++) sm += fabs(A[i * n + j]);
1715 7 7 if (sm == 0.0) break;
1716 7 0 NV tresh = (iter < 4) ? 0.2 * sm / (n * n) : 0.0;
1717 7 7 for (size_t i = 0; i < n - 1; i++) {
1718 7 7 for (size_t j = i + 1; j < n; j++) {
1720 0 7 if (iter > 4 && fabs(d[i]) + g == fabs(d[i]) && fabs(d[j]) + g == fabs(d[j])) {
0 0 if (iter > 4 && fabs(d[i]) + g == fabs(d[i]) && fabs(d[j]) + g == fabs(d[j])) {
0 0 if (iter > 4 && fabs(d[i]) + g == fabs(d[i]) && fabs(d[j]) + g == fabs(d[j])) {
1722 7 0 } else if (fabs(A[i * n + j]) > tresh) {
1725 0 7 if (fabs(h) + g == fabs(h)) {
1730 1 6 if (theta < 0.0) t = -t;
1741 0 7 for (size_t k = 0; k < i; k++) {
1746 0 7 for (size_t k = i + 1; k < j; k++) {
1751 0 7 for (size_t k = j + 1; k < n; k++) {
1756 14 7 for (size_t k = 0; k < n; k++) {
1764 14 7 for (size_t i = 0; i < n; i++) {
1772 7 7 for (size_t i = 0; i < n - 1; i++) {
1775 7 7 for (size_t j = i + 1; j < n; j++) {
1776 6 1 if (d[j] > max_val) {
1781 6 1 if (max_k != i) {
1784 12 6 for (size_t k = 0; k < n; k++) {
1795 456 0 if (ep && *ep && SvOK(*ep) && looks_like_number(*ep)) {
456 0 if (ep && *ep && SvOK(*ep) && looks_like_number(*ep)) {
427 29 if (ep && *ep && SvOK(*ep) && looks_like_number(*ep)) {
427 0 if (ep && *ep && SvOK(*ep) && looks_like_number(*ep)) {
1806 0 4 PUSHMARK(SP);
1807 0 4 EXTEND(SP, 2);
1813 3 0 SV *restrict ret = (count > 0) ? newSVsv(POPs) : newSV(0);
1815 3 0 FREETMPS;
1822 15 2 for (size_t cc = 0; cc < ncols; cc++) {
1823 9 6 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
5 4 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
1840 82 15 if (ctx->is_aoh) {
1842 81 1 return (p && *p) ? *p : NULL;
81 0 return (p && *p) ? *p : NULL;
1845 15 0 if (!cp || !*cp || !SvROK(*cp) || SvTYPE(SvRV(*cp)) != SVt_PVAV) return NULL;
15 0 if (!cp || !*cp || !SvROK(*cp) || SvTYPE(SvRV(*cp)) != SVt_PVAV) return NULL;
15 0 if (!cp || !*cp || !SvROK(*cp) || SvTYPE(SvRV(*cp)) != SVt_PVAV) return NULL;
0 15 if (!cp || !*cp || !SvROK(*cp) || SvTYPE(SvRV(*cp)) != SVt_PVAV) return NULL;
1847 15 0 return (vp && *vp) ? *vp : NULL;
15 0 return (vp && *vp) ? *vp : NULL;
1851 116 0 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
116 0 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
0 116 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
1855 116 0 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
0 116 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
1857 105 11 if (strEQ(op, "and") || strEQ(op, "or")) {
4 101 if (strEQ(op, "and") || strEQ(op, "or")) {
1860 15 0 bool L = filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1861 11 4 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
9 2 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
9 0 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
6 3 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
1862 3 1 return L ? 1 : filt_eval(aTHX_ (rp ? *rp : NULL), ctx); // or
3 0 return L ? 1 : filt_eval(aTHX_ (rp ? *rp : NULL), ctx); // or
1 2 return L ? 1 : filt_eval(aTHX_ (rp ? *rp : NULL), ctx); // or
1864 4 97 if (strEQ(op, "not")) {
1866 4 0 return !filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1870 97 0 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
0 97 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
1874 96 1 if (!cell || !SvOK(cell)) return 0; // missing / undef cell never matches
1 95 if (!cell || !SvOK(cell)) return 0; // missing / undef cell never matches
1875 95 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
95 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
1876 41 54 if (strEQ(op, ">")) return SvNV(cell) > SvNV(val);
1877 13 41 if (strEQ(op, "<")) return SvNV(cell) < SvNV(val);
1878 7 34 if (strEQ(op, ">=")) return SvNV(cell) >= SvNV(val);
1879 4 30 if (strEQ(op, "<=")) return SvNV(cell) <= SvNV(val);
1880 11 19 if (strEQ(op, "==")) return SvNV(cell) == SvNV(val);
1881 4 15 if (strEQ(op, "!=")) return SvNV(cell) != SvNV(val);
1887 15 0 int c = m ? memcmp(a, b, m) : 0;
1888 11 4 if (c == 0) c = (al > bl) - (al < bl);
1889 7 8 if (strEQ(op, "eq")) return c == 0;
1890 4 4 if (strEQ(op, "ne")) return c != 0;
1891 0 4 if (strEQ(op, "lt")) return c < 0;
1892 4 0 if (strEQ(op, "gt")) return c > 0;
1893 0 0 if (strEQ(op, "le")) return c <= 0;
1894 0 0 if (strEQ(op, "ge")) return c >= 0;
1907 0 12 PUSHMARK(SP);
1908 0 12 EXTEND(SP, 1);
1913 12 0 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
6 6 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
1914 12 0 if (n > 0) (void)POPs;
1916 12 0 FREETMPS; LEAVE;
1935 0 39 PUSHMARK(SP);
1936 0 39 XPUSHs(sv_2mortal(newRV_inc((SV*)a_av)));
1937 12 27 if (b_av) XPUSHs(sv_2mortal(newRV_inc((SV*)b_av)));
0 12 if (b_av) XPUSHs(sv_2mortal(newRV_inc((SV*)b_av)));
1938 0 39 XPUSHs(sv_2mortal(newSVsv(name_sv)));
1942 39 0 if (count > 0) {
1947 39 0 FREETMPS;
1976 6780 2 if (use_cb) {
1982 0 6780 PUSHMARK(SP);
1983 0 6780 XPUSHs(sv_2mortal(newRV_noinc((SV*)row)));
1986 6774 0 FREETMPS;
2001 38 43 if (need > *capp) {
2002 38 0 size_t nc = (*capp > 0) ? *capp : 64;
2003 70 38 while (nc < need) nc *= 2;
2008 59 22 if (sep) *dst++ = '+';
2039 49 2 int a_ok = (av && SvOK(av));
47 2 int a_ok = (av && SvOK(av));
2040 50 1 int b_ok = (bv && SvOK(bv));
48 2 int b_ok = (bv && SvOK(bv));
2041 47 4 if (!a_ok || !b_ok) { /* undef/missing always sorts last */
2 45 if (!a_ok || !b_ok) { /* undef/missing always sorts last */
2042 4 2 if (!a_ok && !b_ok) return 0;
1 3 if (!a_ok && !b_ok) return 0;
2043 2 3 return a_ok ? -1 : 1;
2045 41 4 if (c->numeric) {
2062 0 24 PUSHMARK(SP);
2067 24 0 if (count > 0) {
2077 24 0 FREETMPS;
2087 52 7 while (i < mid && j < hi) {
38 14 while (i < mid && j < hi) {
2089 9 29 if (cmp(aTHX_ ctx, idx[i], idx[j]) <= 0) tmp[k++] = idx[i++];
2092 14 21 while (i < mid) tmp[k++] = idx[i++];
2093 7 21 while (j < hi) tmp[k++] = idx[j++];
2094 59 21 for (size_t t = lo; t < hi; t++) idx[t] = tmp[t];
2100 56 37 if (hi - lo < 2) return;
2105 16 21 if (cmp(aTHX_ ctx, idx[mid - 1], idx[mid]) <= 0) return;
2115 0 6 if (!stash) stash = PL_curstash;
2116 6 0 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
6 0 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
6 0 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
0 6 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
0 0 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
6 0 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
0 6 const char *restrict pkg = stash ? HvNAME(stash) : NULL;
2117 0 6 if (!pkg) pkg = "main";
2149 17 10 if (out_aoh) {
2151 15 2 if (n) av_extend(out, (SSize_t)n - 1);
2152 13 4 if (is_aoh) {
2154 34 13 for (size_t k = 0; k < n; k++) {
2156 34 0 SV *restrict row = (rp && *rp) ? *rp : &PL_sv_undef;
34 0 SV *restrict row = (rp && *rp) ? *rp : &PL_sv_undef;
2161 7 4 for (size_t k = 0; k < n; k++) {
2163 14 7 for (size_t c = 0; c < ncols; c++) {
2165 14 0 hv_store_ent(rh, colkeys[c],
14 0 hv_store_ent(rh, colkeys[c],
2175 6 4 if (!is_aoh) {
2177 8 6 for (size_t c = 0; c < ncols; c++) {
2179 8 0 if (n) av_extend(ncol, (SSize_t)n - 1);
2180 19 8 for (size_t k = 0; k < n; k++) {
2182 19 0 av_push(ncol, (cp && *cp) ? newSVsv(*cp) : newSV(0));
19 0 av_push(ncol, (cp && *cp) ? newSVsv(*cp) : newSV(0));
2192 7 4 for (size_t i = 0; i < n; i++) {
2194 7 0 if (!(rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV))
7 0 if (!(rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV))
7 0 if (!(rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV))
0 7 if (!(rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV))
2199 14 7 while ((he = hv_iternext(rh))) {
2201 7 7 if (!hv_exists_ent(seen, ksv, 0)) {
2208 7 4 for (SSize_t c = 0; c < nk; c++) {
2211 7 0 if (n) av_extend(ncol, (SSize_t)n - 1);
2212 17 7 for (size_t k = 0; k < n; k++) {
2215 17 0 if (rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV) {
17 0 if (rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV) {
17 0 if (rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV) {
17 0 if (rp && *rp && SvROK(*rp) && SvTYPE(SvRV(*rp)) == SVt_PVHV) {
2217 14 3 if (he) cell = HeVAL(he);
2219 14 3 av_push(ncol, cell ? newSVsv(cell) : newSV(0));
2253 11 1 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV)
1 10 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV)
2260 18 10 for (i = 0; i < n; i++) {
2264 18 0 if (!(rp && *rp && SvROK(*rp)
18 0 if (!(rp && *rp && SvROK(*rp)
17 1 if (!(rp && *rp && SvROK(*rp)
2265 0 17 && SvTYPE(SvRV(*rp)) == SVt_PVHV))
2270 18 17 while ((he = hv_iternext(row))) {
2275 7 11 if (oute && SvROK(HeVAL(oute))
7 0 if (oute && SvROK(HeVAL(oute))
2276 7 0 && SvTYPE(SvRV(HeVAL(oute))) == SVt_PVAV) {
2280 11 0 if (n > 0) av_extend(col, n - 1);
2290 11 10 while ((he = hv_iternext(out))) {
2292 10 1 if (av_len(col) < n - 1)
2319 22 12 SV *restrict result = NULL;
2323 7 27 if (SvROK(by) && SvTYPE(SvRV(by)) == SVt_PVCV) {
6 1 if (SvROK(by) && SvTYPE(SvRV(by)) == SVt_PVCV) {
2326 27 1 } else if (SvOK(by) && !SvROK(by)) {
26 1 } else if (SvOK(by) && !SvROK(by)) {
2335 1 31 if (!SvROK(data))
2338 18 13 if (SvTYPE(SvRV(data)) == SVt_PVAV) {
2342 13 0 } else if (SvTYPE(SvRV(data)) == SVt_PVHV) {
2351 20 11 if (!SvOK(output)) {
2356 10 1 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
2 8 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
1 1 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
4 4 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
0 5 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
0 0 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
5 0 if (ol == 3 && toLOWER(os[0]) == 'a' && toLOWER(os[1]) == 'o'
2357 1 4 && toLOWER(os[2]) == 'h')
1 0 && toLOWER(os[2]) == 'h')
4 0 && toLOWER(os[2]) == 'h')
2359 5 1 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
1 4 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
1 0 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
4 0 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
0 5 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
0 0 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
5 0 else if (ol == 3 && toLOWER(os[0]) == 'h' && toLOWER(os[1]) == 'o'
2360 1 4 && toLOWER(os[2]) == 'a')
1 0 && toLOWER(os[2]) == 'a')
4 0 && toLOWER(os[2]) == 'a')
2370 13 17 if (!is_aoh) {
2374 18 11 while ((he = hv_iternext(src_hv))) {
2376 18 0 if (!cv || !SvROK(cv) || SvTYPE(SvRV(cv)) != SVt_PVAV)
17 1 if (!cv || !SvROK(cv) || SvTYPE(SvRV(cv)) != SVt_PVAV)
0 17 if (!cv || !SvROK(cv) || SvTYPE(SvRV(cv)) != SVt_PVAV)
2377 0 1 croak("csort: HoA value for column '%s' is not an "
2380 10 7 if (common == -2) common = len;
2381 1 6 else if (len != common)
2389 9 2 if (ncols) {
2390 0 9 Newx(colkeys, ncols, SV *); SAVEFREEPV(colkeys);
2391 0 9 Newx(colavs, ncols, AV *); SAVEFREEPV(colavs);
2394 15 9 while ((he = hv_iternext(src_hv))) {
2403 24 4 Newx(idx, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(idx);
0 24 Newx(idx, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(idx);
24 4 Newx(idx, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(idx);
2404 24 4 Newx(tmp, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(tmp);
0 24 Newx(tmp, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(tmp);
24 4 Newx(tmp, (size_t)(n > 0 ? n : 1), size_t); SAVEFREEPV(tmp);
2405 62 28 for (size_t i = 0; i < (size_t)n; i++) idx[i] = i;
2407 20 8 if (n > 1) {
2408 6 14 if (is_code) {
2410 0 6 Newx(rowrefs, (size_t)n, SV *); SAVEFREEPV(rowrefs);
2412 4 2 if (is_aoh) {
2413 12 4 for (size_t i = 0; i < (size_t)n; i++) {
2415 12 0 rowrefs[i] = (rp && *rp) ? *rp : &PL_sv_undef;
12 0 rowrefs[i] = (rp && *rp) ? *rp : &PL_sv_undef;
2420 6 2 for (size_t i = 0; i < (size_t)n; i++) {
2422 12 6 for (size_t c = 0; c < ncols; c++) {
2424 12 0 SV *restrict cell = (cp && *cp)
2425 12 0 ? SvREFCNT_inc_simple_NN(*cp) : newSV(0);
2440 0 14 Newx(vals, (size_t)n, SV *); SAVEFREEPV(vals);
2444 9 5 if (is_aoh) {
2445 27 9 for (size_t i = 0; i < (size_t)n; i++) {
2448 27 0 if (rp && *rp && SvROK(*rp)
27 0 if (rp && *rp && SvROK(*rp)
27 0 if (rp && *rp && SvROK(*rp)
2449 27 0 && SvTYPE(SvRV(*rp)) == SVt_PVHV) {
2452 26 1 if (cp && *cp) { cell = *cp; found = 1; }
26 0 if (cp && *cp) { cell = *cp; found = 1; }
2454 26 1 if (cell && SvOK(cell) && !looks_like_number(cell))
25 1 if (cell && SvOK(cell) && !looks_like_number(cell))
3 22 if (cell && SvOK(cell) && !looks_like_number(cell))
2460 4 1 if (!(colp && *colp && SvROK(*colp)
4 0 if (!(colp && *colp && SvROK(*colp)
4 0 if (!(colp && *colp && SvROK(*colp)
2461 0 4 && SvTYPE(SvRV(*colp)) == SVt_PVAV))
2465 11 4 for (size_t i = 0; i < (size_t)n; i++) {
2467 11 0 SV *cell = (cp && *cp) ? *cp : NULL;
11 0 SV *cell = (cp && *cp) ? *cp : NULL;
2468 11 0 if (cell && SvOK(cell) && !looks_like_number(cell))
11 0 if (cell && SvOK(cell) && !looks_like_number(cell))
0 11 if (cell && SvOK(cell) && !looks_like_number(cell))
2473 0 13 if (!found)
2487 16 11 FREETMPS; /* reap synthesized rows; restores $a/$b via the save stack at LEAVE */
2490 0 27 XPUSHs(sv_2mortal(result));
2507 0 32 if ((items - 1) & 1) croak("cfilter: trailing options must be name => value pairs");
2508 47 31 for (int oi = 1; oi < items; oi += 2) {
2512 29 18 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
29 0 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
2513 2 16 else if (ol == 6 && memEQ(oname, "remove", 6)) remove_sv = oval;
2 0 else if (ol == 6 && memEQ(oname, "remove", 6)) remove_sv = oval;
2514 9 7 else if (ol == 2 && memEQ(oname, "na", 2)) na_sv = oval;
9 0 else if (ol == 2 && memEQ(oname, "na", 2)) na_sv = oval;
2515 6 1 else if (ol == 7 && memEQ(oname, "against", 7)) against_sv = oval;
6 0 else if (ol == 7 && memEQ(oname, "against", 7)) against_sv = oval;
2518 29 2 if (keep_sv && remove_sv) croak("cfilter: give either keep or remove, not both");
1 28 if (keep_sv && remove_sv) croak("cfilter: give either keep or remove, not both");
2519 2 28 if (!keep_sv && !remove_sv) croak("cfilter: need a keep or remove argument");
1 1 if (!keep_sv && !remove_sv) croak("cfilter: need a keep or remove argument");
2521 1 28 SV *restrict sel = removing ? remove_sv : keep_sv;
2525 28 1 if (SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVAV) by_name = TRUE;
11 17 if (SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVAV) by_name = TRUE;
2526 17 1 else if ((SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVCV) || (SvOK(sel) && !SvROK(sel))) {
1 16 else if ((SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVCV) || (SvOK(sel) && !SvROK(sel))) {
2 0 else if ((SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVCV) || (SvOK(sel) && !SvROK(sel))) {
1 1 else if ((SvROK(sel) && SvTYPE(SvRV(sel)) == SVt_PVCV) || (SvOK(sel) && !SvROK(sel))) {
2528 16 1 if (SvROK(sel)) cv_sv = SvRV(sel);
2532 0 1 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
2535 1 0 if (!cv) croak("cfilter: unknown function '%s'", name);
2542 9 18 if (na_sv && SvOK(na_sv)) {
9 0 if (na_sv && SvOK(na_sv)) {
2545 8 1 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
8 0 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
2546 0 1 else if (nl == 4 && memEQ(nv, "keep", 4)) na_omit = FALSE;
0 0 else if (nl == 4 && memEQ(nv, "keep", 4)) na_omit = FALSE;
2549 11 15 if (by_name && (na_sv || against_sv)) croak("cfilter: na/against only apply to a predicate selector");
10 1 if (by_name && (na_sv || against_sv)) croak("cfilter: na/against only apply to a predicate selector");
0 10 if (by_name && (na_sv || against_sv)) croak("cfilter: na/against only apply to a predicate selector");
2550 6 19 if (against_sv && na_sv) croak("cfilter: give na or against, not both");
1 5 if (against_sv && na_sv) croak("cfilter: give na or against, not both");
2552 1 23 if (!SvROK(data)) croak("cfilter: data must be a reference");
2555 3 20 if (SvTYPE(rv) == SVt_PVAV) kind = 0;
2556 20 0 else if (SvTYPE(rv) == SVt_PVHV) {
2560 0 20 if (!fe) kind = 2;
2563 20 0 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
18 2 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
2564 2 0 else if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVHV) kind = 2;
2 0 else if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVHV) kind = 2;
2574 14 9 HV *restrict cellmap = by_name ? NULL : newHV();
2576 18 5 if (kind == 1) {
2580 54 18 while ((e = hv_iternext(h))) {
2582 54 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) croak("cfilter: every value must be an array ref (hash of arrays)");
0 54 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) croak("cfilter: every value must be an array ref (hash of arrays)");
2584 18 36 if (len > nrows) nrows = len;
2587 54 18 while ((e = hv_iternext(h))) {
2591 36 18 if (!by_name) {
2593 36 0 if (nrows > 0) av_extend(col, nrows - 1);
2594 180 36 for (SSize_t r = 0; r < nrows; r++) {
2595 180 0 SV **restrict ep = (r <= av_len(src)) ? av_fetch(src, r, 0) : NULL;
2596 180 0 av_push(col, (ep && *ep && SvOK(*ep)) ? newSVsv(*ep) : newSV(0));
180 0 av_push(col, (ep && *ep && SvOK(*ep)) ? newSVsv(*ep) : newSV(0));
153 27 av_push(col, (ep && *ep && SvOK(*ep)) ? newSVsv(*ep) : newSV(0));
2604 3 2 if (kind == 0) {
2607 9 3 for (SSize_t r = 0; r < n; r++) {
2609 9 0 if (!ep || !*ep || !SvROK(*ep) || SvTYPE(SvRV(*ep)) != SVt_PVHV) croak("cfilter: array elements must be hash refs (array of hashes)");
9 0 if (!ep || !*ep || !SvROK(*ep) || SvTYPE(SvRV(*ep)) != SVt_PVHV) croak("cfilter: array elements must be hash refs (array of hashes)");
9 0 if (!ep || !*ep || !SvROK(*ep) || SvTYPE(SvRV(*ep)) != SVt_PVHV) croak("cfilter: array elements must be hash refs (array of hashes)");
0 9 if (!ep || !*ep || !SvROK(*ep) || SvTYPE(SvRV(*ep)) != SVt_PVHV) croak("cfilter: array elements must be hash refs (array of hashes)");
2616 7 2 while ((e = hv_iternext(h))) {
2618 7 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVHV) croak("cfilter: every value must be a hash ref (hash of hashes)");
0 7 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVHV) croak("cfilter: every value must be a hash ref (hash of hashes)");
2626 16 5 for (SSize_t r = 0; r < nrows; r++) {
2630 40 16 while ((ie = hv_iternext(row))) {
2632 14 26 if (!hv_exists_ent(seen, ck, 0)) {
2641 2 3 if (!by_name) {
2643 6 2 for (SSize_t c = 0; c < nc; c++) {
2646 6 0 if (nrows > 0) av_extend(col, nrows - 1);
2647 30 6 for (SSize_t r = 0; r < nrows; r++) {
2650 24 6 SV *restrict cell = che ? HeVAL(che) : NULL;
2651 24 6 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
24 0 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
2660 5 18 if (against_sv) {
2661 5 0 if (!SvOK(against_sv) || SvROK(against_sv)) croak("cfilter: against must be a column name (string)");
0 5 if (!SvOK(against_sv) || SvROK(against_sv)) croak("cfilter: against must be a column name (string)");
2662 1 4 if (!hv_exists_ent(universe, against_sv, 0)) croak("cfilter: against column '%s' not found in data", SvPV_nolen(against_sv));
2667 9 13 if (by_name) {
2671 13 8 for (SSize_t i = 0; i < n; i++) {
2673 13 0 if (!ep || !*ep || !SvOK(*ep)) croak("cfilter: column list contains an undefined entry");
13 0 if (!ep || !*ep || !SvOK(*ep)) croak("cfilter: column list contains an undefined entry");
0 13 if (!ep || !*ep || !SvOK(*ep)) croak("cfilter: column list contains an undefined entry");
2674 1 12 if (!hv_exists_ent(universe, *ep, 0)) croak("cfilter: column '%s' not found in data", SvPV_nolen(*ep));
2678 23 8 for (SSize_t c = 0; c < nc; c++) {
2681 3 20 if (removing ? !in_list : in_list) (void)hv_store_ent(keepset, ck, newSViv(1), 0);
13 10 if (removing ? !in_list : in_list) (void)hv_store_ent(keepset, ck, newSViv(1), 0);
2688 39 13 for (SSize_t c = 0; c < nc; c++) {
2692 12 27 if (against_av) {
2695 60 12 for (SSize_t r = 0; r < nrows; r++) {
2698 60 0 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
60 0 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
57 3 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
57 0 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
57 0 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
57 0 if (p1 && *p1 && SvOK(*p1) && p2 && *p2 && SvOK(*p2)) {
2706 18 9 } else if (na_omit) {
2709 90 18 for (SSize_t r = 0; r < nrows; r++) {
2711 90 0 if (p && *p && SvOK(*p)) av_push(a1, newSVsv(*p));
90 0 if (p && *p && SvOK(*p)) av_push(a1, newSVsv(*p));
72 18 if (p && *p && SvOK(*p)) av_push(a1, newSVsv(*p));
2719 0 39 if (removing ? !pass : pass) (void)hv_store_ent(keepset, ck, newSViv(1), 0);
26 13 if (removing ? !pass : pass) (void)hv_store_ent(keepset, ck, newSViv(1), 0);
2724 16 5 if (kind == 1) {
2728 48 16 while ((e = hv_iternext(h))) {
2730 15 33 if (!hv_exists_ent(keepset, ck, 0)) continue;
2733 33 0 if (n > 0) av_extend(dst, n - 1);
2734 157 33 for (SSize_t i = 0; i < n; i++) {
2736 157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
2741 2 3 } else if (kind == 2) {
2745 7 2 while ((e = hv_iternext(h))) {
2750 16 7 while ((ie = hv_iternext(row))) {
2752 11 5 if (!hv_exists_ent(keepset, ck, 0)) continue;
2761 9 3 for (SSize_t r = 0; r < n; r++) {
2765 24 9 while ((ie = hv_iternext(row))) {
2767 15 9 if (!hv_exists_ent(keepset, ck, 0)) continue;
2778 13 8 if (cellmap) SvREFCNT_dec((SV*)cellmap);
2794 1 19 if ((items - 1) & 1) croak("hoh2hoa: trailing options must be name => value pairs");
2795 10 17 for (int oi = 1; oi < items; oi += 2) {
2799 9 1 if (ol == 9 && memEQ(oname, "undef.val", 9)) fill = SvOK(oval) ? oval : NULL;
5 4 if (ol == 9 && memEQ(oname, "undef.val", 9)) fill = SvOK(oval) ? oval : NULL;
4 1 if (ol == 9 && memEQ(oname, "undef.val", 9)) fill = SvOK(oval) ? oval : NULL;
2800 4 1 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
4 0 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
2801 4 0 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
3 1 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
2807 16 1 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVHV) croak("hoh2hoa: data must be a hash ref (hash of hashes)");
1 15 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVHV) croak("hoh2hoa: data must be a hash ref (hash of hashes)");
2818 25 14 while ((e = hv_iternext(in_hv))) {
2820 25 0 if (!SvROK(rv) || SvTYPE(SvRV(rv)) != SVt_PVHV) croak("hoh2hoa: every value must be a hash ref (hash of hashes)");
1 24 if (!SvROK(rv) || SvTYPE(SvRV(rv)) != SVt_PVHV) croak("hoh2hoa: every value must be a hash ref (hash of hashes)");
2825 11 3 if (nrows > 1) qsort(AvARRAY(rows_av), (size_t)nrows, sizeof(SV*), h2h_keycmp);
2831 24 14 while ((e = hv_iternext(in_hv))) {
2835 40 24 while ((ie = hv_iternext(row))) {
2837 26 14 if (!hv_exists_ent(seen, ck, 0)) {
2848 24 14 for (SSize_t r = 0; r < nrows; r++) {
2852 51 24 for (SSize_t c = 0; c < ncols; c++) {
2855 40 11 SV *restrict src = che ? HeVAL(che) : NULL;
2856 40 11 SV *restrict cell = (src && SvOK(src)) ? newSVsv(src) : (fill ? newSVsv(fill) : newSV(0));
38 2 SV *restrict cell = (src && SvOK(src)) ? newSVsv(src) : (fill ? newSVsv(fill) : newSV(0));
7 6 SV *restrict cell = (src && SvOK(src)) ? newSVsv(src) : (fill ? newSVsv(fill) : newSV(0));
2862 3 11 if (rn_sv) {
2863 1 2 if (hv_exists_ent(out_hv, rn_sv, 0)) croak("hoh2hoa: row.names column '%s' collides with an existing column", SvPV_nolen(rn_sv));
2865 2 2 for (SSize_t r = 0; r < nrows; r++) av_push(rn_av, newSVsv(*av_fetch(rows_av, r, 0)));
2882 30 0 if (!df || !SvROK(df))
1 29 if (!df || !SvROK(df))
2884 29 0 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
28 1 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
3 25 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
2885 26 3 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
26 0 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
25 1 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
0 25 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
2889 23 5 if (SvTYPE(ref) == SVt_PVAV) {
2895 82 22 for (i = 0; i < n; i++) {
2897 82 0 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
82 0 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
81 1 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
0 81 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
2902 8 73 if (is_code) keep = filt_call(aTHX_ pred, *rp);
2904 41 40 if (keep) av_push(out, SvREFCNT_inc_simple_NN(*rp));
2907 5 0 } else if (SvTYPE(ref) == SVt_PVHV) {
2911 0 5 if (ncols <= 0) {
2922 13 4 while ((e = hv_iternext(in)) && c < ncols) {
13 0 while ((e = hv_iternext(in)) && c < ncols) {
2924 0 13 char *restrict k = HePV(e, klen);
2926 13 0 if (!v || !SvROK(v) || SvTYPE(SvRV(v)) != SVt_PVAV) {
12 1 if (!v || !SvROK(v) || SvTYPE(SvRV(v)) != SVt_PVAV) {
0 12 if (!v || !SvROK(v) || SvTYPE(SvRV(v)) != SVt_PVAV) {
2933 4 8 if (len > maxrows) maxrows = len;
2940 16 4 for (i = 0; i < maxrows; i++) {
2942 4 12 if (is_code) {
2944 12 4 for (cc = 0; cc < ncols; cc++) {
2946 12 0 hv_store(rowh, names[cc], nlens[cc], newSVsv((vp && *vp) ? *vp : &PL_sv_undef), 0);
12 0 hv_store(rowh, names[cc], nlens[cc], newSVsv((vp && *vp) ? *vp : &PL_sv_undef), 0);
2955 7 9 if (keep) {
2956 21 7 for (cc = 0; cc < ncols; cc++) {
2958 21 0 av_push(outav[cc], newSVsv((vp && *vp) ? *vp : &PL_sv_undef));
21 0 av_push(outav[cc], newSVsv((vp && *vp) ? *vp : &PL_sv_undef));
3024 8 43 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
6 2 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
3028 1 5 if (items > 3) croak("col2col: an options hash ref must be the last argument");
3030 5 3 while ((he = hv_iternext(oh))) {
3032 0 5 const char *restrict oname = HePV(he, ol);
3034 1 4 C2C_DECODE_OPT(oname, ol, oval);
1 0 C2C_DECODE_OPT(oname, ol, oval);
0 1 C2C_DECODE_OPT(oname, ol, oval);
0 0 C2C_DECODE_OPT(oname, ol, oval);
1 0 C2C_DECODE_OPT(oname, ol, oval);
1 0 C2C_DECODE_OPT(oname, ol, oval);
0 0 C2C_DECODE_OPT(oname, ol, oval);
0 0 C2C_DECODE_OPT(oname, ol, oval);
0 4 C2C_DECODE_OPT(oname, ol, oval);
0 0 C2C_DECODE_OPT(oname, ol, oval);
1 3 C2C_DECODE_OPT(oname, ol, oval);
0 1 C2C_DECODE_OPT(oname, ol, oval);
0 0 C2C_DECODE_OPT(oname, ol, oval);
2 2 C2C_DECODE_OPT(oname, ol, oval);
2 0 C2C_DECODE_OPT(oname, ol, oval);
3037 18 27 } else if (items > 3) {
3038 1 17 if ((items - 3) & 1) croak("col2col: trailing options must be name => value pairs");
3039 18 15 for (int oi = 3; oi < items; oi += 2) {
3043 7 11 C2C_DECODE_OPT(oname, ol, oval);
7 0 C2C_DECODE_OPT(oname, ol, oval);
1 6 C2C_DECODE_OPT(oname, ol, oval);
1 0 C2C_DECODE_OPT(oname, ol, oval);
5 1 C2C_DECODE_OPT(oname, ol, oval);
4 1 C2C_DECODE_OPT(oname, ol, oval);
1 1 C2C_DECODE_OPT(oname, ol, oval);
1 0 C2C_DECODE_OPT(oname, ol, oval);
6 5 C2C_DECODE_OPT(oname, ol, oval);
1 5 C2C_DECODE_OPT(oname, ol, oval);
3 3 C2C_DECODE_OPT(oname, ol, oval);
3 0 C2C_DECODE_OPT(oname, ol, oval);
3 5 C2C_DECODE_OPT(oname, ol, oval);
2 1 C2C_DECODE_OPT(oname, ol, oval);
2 0 C2C_DECODE_OPT(oname, ol, oval);
3046 7 38 if (na_set && rm_set) croak("col2col: give na or rm.undef, not both");
1 6 if (na_set && rm_set) croak("col2col: give na or rm.undef, not both");
3050 41 3 if (SvROK(cmd) && SvTYPE(SvRV(cmd)) == SVt_PVCV) cv_sv = SvRV(cmd);
40 1 if (SvROK(cmd) && SvTYPE(SvRV(cmd)) == SVt_PVCV) cv_sv = SvRV(cmd);
3051 3 1 else if (SvOK(cmd) && !SvROK(cmd)) {
2 1 else if (SvOK(cmd) && !SvROK(cmd)) {
3054 0 2 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
3057 1 1 if (!cv) croak("col2col: unknown function '%s'", name);
3061 1 40 if (!SvROK(data)) croak("col2col: data must be a reference");
3065 2 38 if (SvTYPE(rv) == SVt_PVAV) kind = 1;
3066 38 0 else if (SvTYPE(rv) == SVt_PVHV) {
3070 0 38 if (!e) croak("col2col: empty data hash");
3072 38 0 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
37 1 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
3073 1 0 else if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVHV) kind = 2;
1 0 else if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVHV) kind = 2;
3077 37 3 if (kind == 0) {
3083 92 37 while ((e = hv_iternext(h))) {
3085 92 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
0 92 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
3089 37 55 if (len > nrows) nrows = len;
3090 0 92 Renew(src, av_len(names_av) + 1, AV*);
3094 37 0 Newxz(col_val, ncols ? ncols : 1, NV*);
0 37 Newxz(col_val, ncols ? ncols : 1, NV*);
37 0 Newxz(col_val, ncols ? ncols : 1, NV*);
3095 37 0 Newxz(col_def, ncols ? ncols : 1, char*);
0 37 Newxz(col_def, ncols ? ncols : 1, char*);
37 0 Newxz(col_def, ncols ? ncols : 1, char*);
3096 92 37 for (size_t cc = 0; cc < ncols; cc++) {
3097 92 0 Newxz(col_val[cc], nrows ? nrows : 1, NV);
0 92 Newxz(col_val[cc], nrows ? nrows : 1, NV);
92 0 Newxz(col_val[cc], nrows ? nrows : 1, NV);
3098 92 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
3100 426 92 for (size_t r = 0; r < nrows; r++) {
3102 397 29 if (c2c_num(aTHX_ av_fetch(a, (SSize_t)r, 0), &v)) { col_val[cc][r] = v; col_def[cc][r] = 1; }
3109 2 1 if (kind == 1) {
3112 2 0 Newxz(row_hv, nrows ? nrows : 1, HV*);
0 2 Newxz(row_hv, nrows ? nrows : 1, HV*);
2 0 Newxz(row_hv, nrows ? nrows : 1, HV*);
3113 8 2 for (size_t r = 0; r < nrows; r++) {
3115 8 0 if (ep && *ep && SvROK(*ep) && SvTYPE(SvRV(*ep)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(*ep);
8 0 if (ep && *ep && SvROK(*ep) && SvTYPE(SvRV(*ep)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(*ep);
5 3 if (ep && *ep && SvROK(*ep) && SvTYPE(SvRV(*ep)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(*ep);
5 0 if (ep && *ep && SvROK(*ep) && SvTYPE(SvRV(*ep)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(*ep);
3121 0 1 nrows = (size_t)HvKEYS(h);
3122 1 0 Newxz(row_hv, nrows ? nrows : 1, HV*);
0 1 Newxz(row_hv, nrows ? nrows : 1, HV*);
1 0 Newxz(row_hv, nrows ? nrows : 1, HV*);
3124 5 1 while ((e = hv_iternext(h)) && r < nrows) {
5 0 while ((e = hv_iternext(h)) && r < nrows) {
3126 5 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(val);
5 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) row_hv[r] = (HV*)SvRV(val);
3132 13 3 for (size_t r = 0; r < nrows; r++) {
3133 3 10 if (!row_hv[r]) continue;
3136 30 10 while ((e = hv_iternext(row_hv[r]))) {
3138 0 30 char *restrict k = HePV(e, kl);
3139 6 24 if (!hv_exists(seen, k, kl)) { (void)hv_store(seen, k, kl, &PL_sv_yes, 0); av_push(names_av, newSVsv(hv_iterkeysv(e))); }
3145 2 1 Newxz(col_val, ncols ? ncols : 1, NV*);
0 2 Newxz(col_val, ncols ? ncols : 1, NV*);
2 1 Newxz(col_val, ncols ? ncols : 1, NV*);
3146 2 1 Newxz(col_def, ncols ? ncols : 1, char*);
0 2 Newxz(col_def, ncols ? ncols : 1, char*);
2 1 Newxz(col_def, ncols ? ncols : 1, char*);
3147 6 3 for (size_t cc = 0; cc < ncols; cc++) {
3150 6 0 Newxz(col_val[cc], nrows ? nrows : 1, NV);
0 6 Newxz(col_val[cc], nrows ? nrows : 1, NV);
6 0 Newxz(col_val[cc], nrows ? nrows : 1, NV);
3151 6 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
3152 30 6 for (size_t r = 0; r < nrows; r++) {
3154 0 30 if (!row_hv[r]) continue;
3155 30 0 if (c2c_num(aTHX_ hv_fetch(row_hv[r], k, kl, 0), &v)) { col_val[cc][r] = v; col_def[cc][r] = 1; }
3161 1 39 if (ncols == 0) croak("col2col: no usable columns found");
3165 0 39 Newx(col_names, ncols, SV*);
3166 0 39 Newx(name_len, ncols, STRLEN);
3167 98 39 for (size_t cc = 0; cc < ncols; cc++) {
3175 34 5 if (!SvOK(cols_eff)) {
3176 84 34 for (size_t cc = 0; cc < ncols; cc++) is_outer[cc] = 1;
3178 2 3 else if (SvROK(cols_eff) && SvTYPE(SvRV(cols_eff)) == SVt_PVAV) {
2 0 else if (SvROK(cols_eff) && SvTYPE(SvRV(cols_eff)) == SVt_PVAV) {
3181 4 1 for (SSize_t i = 0; i < n; i++) {
3185 4 0 if (!ep || !*ep || !SvOK(*ep)) croak("col2col: column list contains an undefined entry");
4 0 if (!ep || !*ep || !SvOK(*ep)) croak("col2col: column list contains an undefined entry");
0 4 if (!ep || !*ep || !SvOK(*ep)) croak("col2col: column list contains an undefined entry");
3187 1 3 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
3189 3 0 } else if (!SvROK(cols_eff)) {
3192 1 2 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
3201 90 36 for (size_t a = 0; a < ncols; a++) {
3203 4 86 if (!is_outer[a]) continue;
3205 221 85 for (size_t b = 0; b < ncols; b++) {
3208 86 135 if (a == b) continue;
3211 116 19 if (na_mode == 0) { // pairwise complete: keep rows defined in both
3212 528 116 for (size_t r = 0; r < nrows; r++)
3213 516 12 if (col_def[a][r] && col_def[b][r]) { av_push(ca, newSVnv(col_val[a][r])); av_push(cb, newSVnv(col_val[b][r])); }
504 12 if (col_def[a][r] && col_def[b][r]) { av_push(ca, newSVnv(col_val[a][r])); av_push(cb, newSVnv(col_val[b][r])); }
3214 8 11 } else if (na_mode == 1) { // omit: each column drops its own undef (lengths may differ)
3215 27 9 for (size_t r = 0; r < nrows; r++) if (col_def[a][r]) av_push(ca, newSVnv(col_val[a][r]));
36 8 for (size_t r = 0; r < nrows; r++) if (col_def[a][r]) av_push(ca, newSVnv(col_val[a][r]));
3216 27 9 for (size_t r = 0; r < nrows; r++) if (col_def[b][r]) av_push(cb, newSVnv(col_val[b][r]));
36 8 for (size_t r = 0; r < nrows; r++) if (col_def[b][r]) av_push(cb, newSVnv(col_val[b][r]));
3218 55 11 for (size_t r = 0; r < nrows; r++) {
3219 48 7 av_push(ca, col_def[a][r] ? newSVnv(col_val[a][r]) : newSV(0));
3220 47 8 av_push(cb, col_def[b][r] ? newSVnv(col_val[b][r]) : newSV(0));
3225 134 1 if (av_len(ca) < 0 || av_len(cb) < 0) {
1 133 if (av_len(ca) < 0 || av_len(cb) < 0) {
3227 4 129 } else if (!skip_errors) {
3236 0 129 PUSHMARK(SP);
3237 0 129 XPUSHs(rv1); XPUSHs(rv2);
0 129 XPUSHs(rv1); XPUSHs(rv2);
3241 129 0 if (SvTRUE(ERRSV)) {
8 121 if (SvTRUE(ERRSV)) {
3243 8 0 const char *restrict ep = SvPV(ERRSV, el);
3245 132 0 while (ll < el && ep[ll] != '\n' && ep[ll] != '\r') ll++;
124 8 while (ll < el && ep[ll] != '\n' && ep[ll] != '\r') ll++;
124 0 while (ll < el && ep[ll] != '\n' && ep[ll] != '\r') ll++;
3247 8 0 if (n > 0) (void)POPs; // discard the undef G_SCALAR leaves
3249 121 0 res = (n > 0) ? newSVsv(POPs) : newSV(0);
3252 129 0 FREETMPS; LEAVE;
3261 89 36 for (size_t cc = 0; cc < ncols; cc++) { Safefree(col_val[cc]); Safefree(col_def[cc]); }
3292 4 20 for (I32 ai = 1; ai + 1 < items; ai += 2) {
3295 4 0 if (strEQ(key, "var_equal") || strEQ(key, "var.equal"))
0 4 if (strEQ(key, "var_equal") || strEQ(key, "var.equal"))
3297 4 0 else if (strEQ(key, "formula"))
3302 1 19 if (!SvROK(data_ref))
3305 12 7 if (SvTYPE(rv) == SVt_PVHV) in_hv = (HV *)rv;
3306 7 0 else if (SvTYPE(rv) == SVt_PVAV) in_av = (AV *)rv;
3309 7 12 if (in_av) {
3311 0 7 if (formula_str != NULL)
3315 2 5 if (k < 2)
3318 0 5 Newx(sizes, k, size_t);
3319 0 5 Newxz(gnames, k, char *); /* zeroed: safe to free on error */
3322 7 2 for (size_t g = 0; g < k; g++) {
3324 7 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV) {
7 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV) {
7 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV) {
0 7 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV) {
3329 3 4 if (len < 2) {
3341 0 2 Newx(flat, (size_t)total_n, NV);
3343 3 1 for (size_t g = 0; g < k; g++) {
3346 16 2 for (IV i = 0; i < len; i++) {
3348 16 0 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
16 0 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
15 1 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
0 15 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
3358 4 8 else if (formula_str != NULL) {
3360 1 3 if (!parse_formula(formula_str, &lhs, &rhs))
3366 2 1 if (!resp_svp || !*resp_svp || !SvROK(*resp_svp)
2 0 if (!resp_svp || !*resp_svp || !SvROK(*resp_svp)
2 0 if (!resp_svp || !*resp_svp || !SvROK(*resp_svp)
3367 0 2 || SvTYPE(SvRV(*resp_svp)) != SVt_PVAV) {
3373 2 0 if (!fact_svp || !*fact_svp || !SvROK(*fact_svp)
2 0 if (!fact_svp || !*fact_svp || !SvROK(*fact_svp)
2 0 if (!fact_svp || !*fact_svp || !SvROK(*fact_svp)
3374 0 2 || SvTYPE(SvRV(*fact_svp)) != SVt_PVAV) {
3383 0 2 Newx(flat, (size_t)(n > 0 ? n : 0), NV);
3384 0 2 Newx(sizes, (size_t)(n > 0 ? n : 0), size_t); /* k <= n upper bound */
3386 1 1 if (!build_groups_from_formula(aTHX_ resp_av, label_av,
3390 2 1 for (size_t g = 0; g < k; g++) total_n += (IV)sizes[g];
3394 0 8 k = (size_t)HvUSEDKEYS(in_hv); /* robust count, not iterinit's */
3395 0 8 if (k < 2)
3398 0 8 Newx(sizes, k, size_t);
3399 0 8 Newxz(gnames, k, char *);
3403 14 6 for (size_t g = 0; (he = hv_iternext(in_hv)) != NULL; g++) {
3405 13 1 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) {
0 13 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) {
3407 0 1 "value for group '%s' is not an array ref", HePV(he, PL_na));
3411 1 12 if (len < 2) {
3413 0 1 "group '%s' has fewer than 2 observations", HePV(he, PL_na));
3419 0 12 const char *kstr = HePV(he, klen);
3424 0 6 Newx(flat, (size_t)total_n, NV);
3427 10 4 while ((he = hv_iternext(in_hv)) != NULL) {
3430 52 8 for (IV i = 0; i < len; i++) {
3432 52 0 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
52 0 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
51 1 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
1 50 if (!svp || !*svp || !SvOK(*svp) || !looks_like_number(*svp)) {
3435 0 2 HePV(he, PL_na), (long)i);
3444 0 6 Newx(gmeans, k, NV);
3447 12 6 for (size_t g = 0; g < k; g++) {
3449 66 12 for (size_t i = 0; i < sizes[g]; i++) sum += flat[offset + i];
3481 12 6 for (size_t g = 0; g < k; g++) {
3495 12 6 for (size_t g = 0; g < k; g++) Safefree(gnames[g]);
3497 1 5 if (lhs) Safefree(lhs);
3498 1 5 if (rhs) Safefree(rhs);
3506 4 6 if (flat) Safefree(flat);
3507 9 1 if (sizes) Safefree(sizes);
3508 8 2 if (gnames) {
3509 6 10 for (size_t g = 0; g < k; g++) if (gnames[g]) Safefree(gnames[g]);
16 8 for (size_t g = 0; g < k; g++) if (gnames[g]) Safefree(gnames[g]);
3512 0 10 if (gmeans) Safefree(gmeans);
3513 2 8 if (lhs) Safefree(lhs);
3514 2 8 if (rhs) Safefree(rhs);
3531 42 1 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
37 5 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
37 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3543 41 2 if (arg_idx < items) {
3544 26 15 if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
26 0 if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3547 15 0 } else if (SvPOK(ST(arg_idx)) && (((items - arg_idx) % 2) == 1)) {
8 7 } else if (SvPOK(ST(arg_idx)) && (((items - arg_idx) % 2) == 1)) {
3554 21 40 for (; arg_idx < items; arg_idx += 2) {
3557 2 19 if (arg_idx + 1 >= items) /* Fix #2: no value -> would read off stack */
3560 2 17 if (strEQ(key, "x")) x_sv = val;
3561 5 12 else if (strEQ(key, "y")) y_sv = val;
3562 5 7 else if (strEQ(key, "exact")) {
3563 0 5 if (!SvOK(val)) exact = -1;
3566 6 1 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
3570 36 4 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
36 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
0 36 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
3578 6 30 if (!is_two_sided && !is_greater && !is_less) {
4 2 if (!is_two_sided && !is_greater && !is_less) {
2 2 if (!is_two_sided && !is_greater && !is_less) {
3584 1 33 if (nx == 0) croak("Not enough 'x' observations");
3589 464 33 for (size_t i = 0; i < nx; i++) {
3591 464 0 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
464 0 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
58 406 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
57 1 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
50 7 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
3596 2 31 if (valid_nx < 1) {
3605 29 2 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
23 6 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
23 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
3608 23 0 NV *restrict y_data = (NV *)safemalloc((ny ? ny : 1) * sizeof(NV));
3610 321 23 for (size_t i = 0; i < ny; i++) {
3612 321 0 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
321 0 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
36 285 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
36 0 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
30 6 if (el && *el && (SvNIOK(*el) || (SvOK(*el) && looks_like_number(*el)))) {
3616 2 21 if (valid_ny < 1) {
3623 2 19 if (is_greater) statistic = d_plus;
3624 2 17 else if (is_less) statistic = d_minus;
3631 2 19 if (exact == 1) use_exact = TRUE;
3632 0 19 else if (exact == 0) use_exact = FALSE;
3636 21 0 if (use_exact && mn > KS_EXACT_MAX_PRODUCT) {
0 21 if (use_exact && mn > KS_EXACT_MAX_PRODUCT) {
3644 21 0 if (use_exact) {
3648 625 71 while (a < valid_nx || b < valid_ny) {
52 19 while (a < valid_nx || b < valid_ny) {
3649 571 52 NV v = (b >= valid_ny || (a < valid_nx && x_data[a] <= y_data[b]))
316 255 NV v = (b >= valid_ny || (a < valid_nx && x_data[a] <= y_data[b]))
3650 623 54 ? x_data[a++] : y_data[b++];
3651 656 21 if (have_prev && v == prev) { has_ties = TRUE; break; }
2 654 if (have_prev && v == prev) { has_ties = TRUE; break; }
3654 2 19 if (has_ties) {
3660 19 2 if (use_exact) {
3672 2 0 if (is_two_sided) p_value = K2l(z, 0, 1e-9);
3677 6 2 } else if (y_sv && SvPOK(y_sv)) {
6 0 } else if (y_sv && SvPOK(y_sv)) {
3679 4 2 if (strEQ(dist, "pnorm")) {
3682 59 4 for (size_t i = 0; i < valid_nx; i++) {
3688 0 59 if (diff1 > max_d_plus) max_d_plus = diff1;
3689 4 55 if (diff2 > max_d_plus) max_d_plus = diff2;
3690 17 42 if (-diff1 > max_d_minus) max_d_minus = -diff1;
3691 0 59 if (-diff2 > max_d_minus) max_d_minus = -diff2;
3692 14 45 if (fabs(diff1) > max_d) max_d = fabs(diff1);
3693 3 56 if (fabs(diff2) > max_d) max_d = fabs(diff2);
3695 0 4 if (is_greater) statistic = max_d_plus;
3696 0 4 else if (is_less) statistic = max_d_minus;
3699 3 1 bool use_exact = (exact == -1) ? (valid_nx < 100) : (exact == 1);
3700 3 1 if (use_exact) {
3702 3 0 if (is_two_sided) {
3712 1 0 if (is_two_sided) p_value = K2l(z, 0, 1e-6);
3725 0 25 if (p_value > 1.0) p_value = 1.0;
3726 0 25 if (p_value < 0.0) p_value = 0.0;
3748 10 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
2 8 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
2 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3753 10 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
2 8 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
2 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3758 0 10 if ((items - arg_idx) % 2 != 0) {
3762 20 10 for (; arg_idx < items; arg_idx += 2) {
3765 7 13 if (strEQ(key, "x")) x_sv = val;
3766 7 6 else if (strEQ(key, "y")) y_sv = val;
3767 3 3 else if (strEQ(key, "paired")) paired = SvTRUE(val);
3768 0 3 else if (strEQ(key, "correct")) correct = SvTRUE(val);
3769 1 2 else if (strEQ(key, "mu")) mu = SvNV(val);
3770 0 2 else if (strEQ(key, "exact")) {
3771 0 0 if (!SvOK(val)) exact = -1;
3774 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
3778 2 8 if (strNE(alternative, "two.sided") && strNE(alternative, "less") && strNE(alternative, "greater"))
1 1 if (strNE(alternative, "two.sided") && strNE(alternative, "less") && strNE(alternative, "greater"))
0 1 if (strNE(alternative, "two.sided") && strNE(alternative, "less") && strNE(alternative, "greater"))
3781 9 1 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
9 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 9 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
3785 0 9 if (nx == 0) croak("Not enough 'x' observations");
3789 8 1 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
8 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
8 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
3797 8 1 if (ny > 0 && !paired) {
5 3 if (ny > 0 && !paired) {
3800 28 5 for (size_t i = 0; i < nx; i++) {
3802 28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
3808 28 5 for (size_t i = 0; i < ny; i++) {
3810 28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
28 0 if (el && SvOK(*el) && looks_like_number(*el)) {
3816 0 5 if (valid_nx == 0) { Safefree(ri); croak("not enough (non-missing) 'x' observations"); }
3817 0 5 if (valid_ny == 0) { Safefree(ri); croak("not enough 'y' observations"); }
3822 28 28 for (size_t i = 0; i < total_n; i++) if (ri[i].idx == 1) w_rank_sum += ri[i].rank;
56 5 for (size_t i = 0; i < total_n; i++) if (ri[i].idx == 1) w_rank_sum += ri[i].rank;
3824 0 5 if (exact == 1) use_exact = TRUE;
3825 0 5 else if (exact == 0) use_exact = FALSE;
3826 5 0 else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties);
5 0 else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties);
2 3 else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties);
3827 2 3 if (use_exact && has_ties) {
0 2 if (use_exact && has_ties) {
3831 2 3 if (use_exact) {
3836 1 1 if (strcmp(alternative, "less") == 0) p_value = p_less;
3837 1 0 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3839 0 0 NV p = (p_less < p_greater) ? p_less : p_greater;
3843 3 0 method_desc = correct ? "Wilcoxon rank sum test with continuity correction" : "Wilcoxon rank sum test";
3848 3 0 if (correct) {
3850 3 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
2 1 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
1 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
3851 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3852 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3855 0 3 if (var <= 0.0) {
3860 0 3 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3861 0 3 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3867 3 1 if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test");
3 0 if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test");
1 2 if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test");
3871 23 3 for (size_t i = 0; i < nx; i++) {
3873 23 0 if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue;
23 0 if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue;
0 23 if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue;
3876 18 5 if (paired) {
3878 18 0 if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue;
18 0 if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue;
0 18 if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue;
3881 0 18 if (d == 0.0) has_zeroes = TRUE; // Drop exact zeroes
3885 0 5 if (d == 0.0) has_zeroes = TRUE;
3889 0 3 if (n_nz == 0) {
3894 23 3 for (size_t i = 0; i < n_nz; i++) {
3901 23 3 for (size_t i = 0; i < n_nz; i++) {
3902 19 4 if (ri[i].idx) statistic += ri[i].rank;
3904 0 3 if (exact == 1) use_exact = TRUE;
3905 0 3 else if (exact == 0) use_exact = FALSE;
3906 3 0 else use_exact = (n_nz < 50 && !has_ties);
3 0 else use_exact = (n_nz < 50 && !has_ties);
3907 3 0 if (use_exact && has_ties) {
0 3 if (use_exact && has_ties) {
3911 3 0 if (use_exact && has_zeroes) {
0 3 if (use_exact && has_zeroes) {
3915 3 0 if (use_exact) {
3920 0 3 if (strcmp(alternative, "less") == 0) p_value = p_less;
3921 0 3 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3923 0 3 NV p = (p_less < p_greater) ? p_less : p_greater;
3927 0 0 method_desc = correct ? "Wilcoxon signed rank test with continuity correction" : "Wilcoxon signed rank test";
3932 0 0 if (correct) {
3934 0 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
0 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
0 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0) ? 0.5 : (z < 0) ? -0.5 : 0.0;
3935 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3936 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3940 0 0 if (var <= 0.0) {
3945 0 0 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3946 0 0 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3952 0 8 if (p_value > 1.0) p_value = 1.0;
3968 3 13 if (!SvROK(data_ref)) {
3973 5 8 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
1 4 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
3984 8 4 if (input_type == SVt_PVAV) {
3986 0 8 r = av_top_index(obs_av) + 1;
3987 7 1 if (r > 0) {
3989 7 0 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
4 3 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
4 0 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
3991 0 4 c = av_top_index((AV*)SvRV(*first_elem)) + 1;
3993 8 4 for (unsigned int i = 0; i < r; i++) {
3996 8 0 if (row_sv && SvROK(*row_sv)) {
8 0 if (row_sv && SvROK(*row_sv)) {
3998 20 8 for (unsigned int j = 0; j < c; j++) {
4000 20 0 if (val_sv) obs_matrix[i][j] = SvNV(*val_sv);
4008 7 2 for (unsigned int j = 0; j < c; j++) {
4010 7 0 if (val_sv) obs_array[j] = SvNV(*val_sv);
4014 4 0 } else if (input_type == SVt_PVHV) {
4023 3 1 if (first_entry) {
4025 1 2 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
1 0 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
4030 2 1 while ((row_entry = hv_iternext(obs_hv))) {
4034 2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
4038 4 2 while ((col_entry = hv_iternext(inner_hv))) {
4040 2 2 if (!hv_exists_ent(col_idx_map, col_key, 0)) {
4050 2 1 for (unsigned int i = 0; i < r; i++) {
4056 2 0 if (inner_he) {
4058 2 0 if (SvROK(inner_sv)) {
4060 4 2 for (unsigned int j = 0; j < c; j++) {
4065 4 0 if (val_he) {
4077 4 2 while ((row_entry = hv_iternext(obs_hv))) {
4082 4 1 for (unsigned int j = 0; j < c; j++) {
4086 4 0 if (val_he) {
4094 5 5 if ((is_2d && (r == 0 || c == 0)) || (!is_2d && c == 0)) {
5 0 if ((is_2d && (r == 0 || c == 0)) || (!is_2d && c == 0)) {
5 0 if ((is_2d && (r == 0 || c == 0)) || (!is_2d && c == 0)) {
5 5 if ((is_2d && (r == 0 || c == 0)) || (!is_2d && c == 0)) {
2 3 if ((is_2d && (r == 0 || c == 0)) || (!is_2d && c == 0)) {
4101 5 3 bool yates = (is_2d && r == 2 && c == 2) ? 1 : 0;
5 0 bool yates = (is_2d && r == 2 && c == 2) ? 1 : 0;
3 2 bool yates = (is_2d && r == 2 && c == 2) ? 1 : 0;
4104 5 3 if (is_2d) {
4107 10 5 for(unsigned int i=0; i
4108 12 5 for(unsigned int j=0; j
4110 10 5 for (unsigned int i = 0; i < r; i++) {
4111 24 10 for (unsigned int j = 0; j < c; j++) {
4119 4 1 if (input_type == SVt_PVAV) {
4121 8 4 for (unsigned int i = 0; i < r; i++) {
4123 20 8 for (unsigned int j = 0; j < c; j++) {
4127 8 12 if (yates) {
4129 8 0 NV y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
4141 2 1 for (unsigned int i = 0; i < r; i++) {
4143 4 2 for (unsigned int j = 0; j < c; j++) {
4149 4 0 if (yates) {
4151 4 0 NV y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
4166 9 3 for (unsigned int j = 0; j < c; j++) {
4171 2 1 if (input_type == SVt_PVAV) {
4173 6 2 for (unsigned int j = 0; j < c; j++) {
4181 3 1 for (unsigned int j = 0; j < c; j++) {
4193 5 3 if (obs_matrix) {
4194 10 5 for (unsigned int i = 0; i < r; i++) {
4199 3 5 if (obs_array) safefree(obs_array);
4200 2 6 if (row_keys) SvREFCNT_dec(row_keys);
4201 2 6 if (col_keys) SvREFCNT_dec(col_keys);
4220 6 2 if (input_type == SVt_PVAV) {
4226 5 3 if (is_2d) {
4227 3 2 if (yates) {
4250 64 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
63 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
4252 10 53 if (type == SVt_PVHV || type == SVt_PVAV) {
10 0 if (type == SVt_PVHV || type == SVt_PVAV) {
4260 63 2 if (arg_idx < items) {
4262 63 0 if (SvOK(cand) && !SvROK(cand)) {
63 0 if (SvOK(cand) && !SvROK(cand)) {
4264 62 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
61 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
61 0 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
4265 61 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
60 1 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
60 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
4266 60 0 strEQ(k, "undef.val"))) {
4282 83 62 for (; arg_idx < items; arg_idx += 2) {
4283 2 81 if (arg_idx + 1 >= items) croak("write_table: Odd number of arguments passed");
4286 1 80 if (strEQ(key, "data")) data_sv = val;
4287 16 64 else if (strEQ(key, "col.names")) col_names_sv = val;
4288 2 62 else if (strEQ(key, "file")) file_sv = val;
4289 19 43 else if (strEQ(key, "row.names")) row_names_sv = val;
4291 26 17 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
1 25 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
4297 24 1 else if (strEQ(key, "undef.val")) undef_val = SvOK(val) ? SvPV_nolen(val) : "";
23 1 else if (strEQ(key, "undef.val")) undef_val = SvOK(val) ? SvPV_nolen(val) : "";
4300 61 1 if (!data_sv || !SvROK(data_sv)) {
0 61 if (!data_sv || !SvROK(data_sv)) {
4304 10 51 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
0 10 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
4307 60 1 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
0 60 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
4310 42 18 if (!explicit_sep) {
4312 42 0 if (file_len >= 4) {
4314 39 3 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
0 39 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
4316 0 39 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
0 0 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
4321 16 44 if (col_names_sv && SvOK(col_names_sv)) {
16 0 if (col_names_sv && SvOK(col_names_sv)) {
4322 14 2 if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) {
0 14 if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) {
4329 48 10 if (SvTYPE(data_ref) == SVt_PVHV) {
4331 1 47 if (hv_iterinit(hv) == 0) XSRETURN_EMPTY;
4335 0 47 if (!first_val) {
4339 10 37 if (!SvROK(first_val)) {
4343 25 12 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
0 25 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
4350 100 45 while ((entry = hv_iternext(hv))) {
4352 28 72 if (is_flat_hash) {
4353 28 0 if (val && SvROK(val)) {
0 28 if (val && SvROK(val)) {
4357 72 0 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
71 1 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
19 52 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
1 70 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
4358 1 1 croak("write_table: Mixed data types detected. Ensure all values are %s references.\n", is_hoh ? "HASH" : "ARRAY");
4362 11 34 if (is_hoh) { // Rows are only explicitly pre-gathered for HOH
4365 17 11 while ((entry = hv_iternext(hv))) {
4371 1 9 if (av_len(av) < 0) XSRETURN_EMPTY;
4373 9 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
9 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
8 1 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
0 8 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
4374 1 0 if (first_ptr && *first_ptr && SvROK(*first_ptr))
1 0 if (first_ptr && *first_ptr && SvROK(*first_ptr))
0 1 if (first_ptr && *first_ptr && SvROK(*first_ptr))
4378 1 0 else if (first_ptr && *first_ptr && SvOK(*first_ptr))
1 0 else if (first_ptr && *first_ptr && SvOK(*first_ptr))
1 0 else if (first_ptr && *first_ptr && SvOK(*first_ptr))
4387 26 8 for (SSize_t i = 0; i <= av_len(av); i++) {
4389 26 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
26 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
26 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
0 26 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
4396 1 52 if (!fh) {
4398 1 0 if (rows_av) SvREFCNT_dec(rows_av);
4402 52 0 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
40 12 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
4405 10 42 if (is_hoh) {
4406 2 8 if (col_names_sv && SvOK(col_names_sv)) {
2 0 if (col_names_sv && SvOK(col_names_sv)) {
4410 3 2 for (SSize_t i = 0; i <= av_len(c_av); i++) {
4412 3 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4418 12 8 while ((entry = hv_iternext((HV*)data_ref))) {
4422 70019 12 while ((inner_entry = hv_iternext(inner))) {
4429 70014 8 for (unsigned i = 0; i < num_cols; i++) {
4433 5 3 if (num_cols > 1)
4440 10 0 if (inc_rownames) header_row[h_idx++] = "";
4443 70017 10 for (size_t i = 0; i < num_headers; i++) {
4445 70017 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
70017 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4456 16 8 for (size_t i = 0; i < num_rows; i++) {
4459 16 0 if (inc_rownames) row_data[d_idx++] = SvPV_nolen(row_key_sv);
4461 16 0 SV *restrict inner_sv = inner_he ? HeVAL(inner_he) : NULL;
4462 16 0 HV *restrict inner_hv = (inner_sv && SvROK(inner_sv)) ? (HV*)SvRV(inner_sv) : NULL;
16 0 HV *restrict inner_hv = (inner_sv && SvROK(inner_sv)) ? (HV*)SvRV(inner_sv) : NULL;
4463 70033 14 for (size_t j = 0; j < num_headers; j++) {
4465 70033 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
70033 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
4467 70033 0 HE *restrict cell_he = (inner_hv && h_sv) ? hv_fetch_ent(inner_hv, h_sv, 0, 0) : NULL;
70033 0 HE *restrict cell_he = (inner_hv && h_sv) ? hv_fetch_ent(inner_hv, h_sv, 0, 0) : NULL;
4468 70023 10 SV *restrict cell_sv = cell_he ? HeVAL(cell_he) : NULL;
4469 70023 10 if (cell_sv && SvOK(cell_sv)) {
70022 1 if (cell_sv && SvOK(cell_sv)) {
4470 2 70020 if (SvROK(cell_sv)) {
4473 2 0 if (headers_av) SvREFCNT_dec(headers_av);
4474 2 0 if (rows_av) SvREFCNT_dec(rows_av);
4486 10 32 } else if (is_flat_hash) {
4488 1 9 if (col_names_sv && SvOK(col_names_sv)) {
1 0 if (col_names_sv && SvOK(col_names_sv)) {
4490 0 1 for (SSize_t i = 0; i <= av_len(c_av); i++) {
4492 0 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
0 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4498 25 9 for (unsigned int i = 0; i < num_cols; i++) {
4502 9 0 if (num_cols > 1)
4508 8 2 if (inc_rownames) header_row[h_idx++] = "";
4509 25 10 for (size_t i = 0; i < num_headers; i++) {
4511 25 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
25 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4518 8 2 if (inc_rownames) row_data[d_idx++] = "1";
4519 25 10 for (size_t j = 0; j < num_headers; j++) {
4521 25 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
25 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
4523 25 0 HE *restrict val_he = h_sv ? hv_fetch_ent(data_hv, h_sv, 0, 0) : NULL;
4524 25 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
4527 25 0 if (val_sv && SvOK(val_sv)) {
25 0 if (val_sv && SvOK(val_sv)) {
4528 0 25 if (SvROK(val_sv)) {
4531 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4542 24 8 } else if (is_hoa) {
4547 51 24 while ((entry = hv_iternext(data_hv))) {
4550 30 21 if (len > max_rows) max_rows = len;
4552 8 16 if (col_names_sv && SvOK(col_names_sv)) {
8 0 if (col_names_sv && SvOK(col_names_sv)) {
4555 16 8 for (SSize_t i = 0; i <= av_len(c_av); i++) {
4557 16 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
15 1 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4563 35 16 for (unsigned int i = 0; i < num_cols; i++) {
4567 14 2 if (num_cols > 1)
4570 1 23 if (av_len(headers_av) < 0) {
4576 16 7 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
1 15 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
4580 2 1 for (SSize_t i = 0; i <= av_len(headers_av); i++) {
4582 2 0 if (!h_ptr || !*h_ptr) continue;
0 2 if (!h_ptr || !*h_ptr) continue;
4585 1 1 if (!sv_eq(h_sv, row_names_sv)) {
4595 16 7 if (inc_rownames) header_row[h_idx++] = "";
4596 49 23 for (size_t i = 0; i < num_headers; i++) {
4598 49 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
49 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4607 64 23 for (size_t i = 0; i < max_rows; i++) {
4609 46 18 if (inc_rownames) {
4610 2 44 if (rownames_col) {
4613 2 0 SV *restrict rn_arr_sv = rn_arr_he ? HeVAL(rn_arr_he) : NULL;
4614 2 0 if (rn_arr_sv && SvROK(rn_arr_sv)) {
2 0 if (rn_arr_sv && SvROK(rn_arr_sv)) {
4617 2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
4618 0 2 if (SvROK(*rn_val_ptr)) {
4621 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4636 154 64 for (size_t j = 0; j < num_headers; j++) {
4638 154 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
154 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
4640 154 0 HE *restrict arr_he = h_sv ? hv_fetch_ent(data_hv, h_sv, 0, 0) : NULL;
4641 150 4 SV *restrict arr_sv = arr_he ? HeVAL(arr_he) : NULL;
4642 150 4 if (arr_sv && SvROK(arr_sv)) {
150 0 if (arr_sv && SvROK(arr_sv)) {
4645 128 22 if (cell_ptr && SvOK(*cell_ptr)) {
100 28 if (cell_ptr && SvOK(*cell_ptr)) {
4646 0 100 if (SvROK(*cell_ptr)) {
4649 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4663 8 0 } else if (is_aoh) { // ----- Array of Hashes
4666 3 5 if (col_names_sv && SvOK(col_names_sv)) {
3 0 if (col_names_sv && SvOK(col_names_sv)) {
4669 2 3 for (SSize_t i = 0; i <= av_len(c_av); i++) {
4671 2 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
2 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4675 20 5 for (size_t i = 0; i < num_rows; i++) {
4677 20 0 if (row_ptr && SvROK(*row_ptr)) {
20 0 if (row_ptr && SvROK(*row_ptr)) {
4681 31 20 while ((entry = hv_iternext(row_hv))) {
4689 14 5 for (unsigned int i = 0; i < num_cols; i++) {
4693 4 1 if (num_cols > 1)
4697 5 3 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
1 4 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
4701 0 1 for (SSize_t i = 0; i <= av_len(headers_av); i++) {
4703 0 0 if (!h_ptr || !*h_ptr) continue;
0 0 if (!h_ptr || !*h_ptr) continue;
4706 0 0 if (!sv_eq(h_sv, row_names_sv)) {
4716 5 3 if (inc_rownames) header_row[h_idx++] = "";
4717 16 8 for (size_t i = 0; i < num_headers; i++) {
4719 16 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
16 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4725 26 8 for (size_t i = 0; i < num_rows; i++) {
4728 26 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
26 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
4729 21 5 if (inc_rownames) {
4730 2 19 if (rownames_col) {
4732 2 0 HE *restrict rn_he = row_hv ? hv_fetch_ent(row_hv, row_names_sv, 0, 0) : NULL;
4733 2 0 SV *restrict rn_sv = rn_he ? HeVAL(rn_he) : NULL;
4734 2 0 if (rn_sv && SvOK(rn_sv)) {
2 0 if (rn_sv && SvOK(rn_sv)) {
4735 0 2 if (SvROK(rn_sv)) {
4738 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4750 39 26 for (size_t j = 0; j < num_headers; j++) {
4752 39 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
39 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
4754 39 0 HE *restrict cell_he = (row_hv && h_sv) ? hv_fetch_ent(row_hv, h_sv, 0, 0) : NULL;
39 0 HE *restrict cell_he = (row_hv && h_sv) ? hv_fetch_ent(row_hv, h_sv, 0, 0) : NULL;
4755 35 4 SV *restrict cell_sv = cell_he ? HeVAL(cell_he) : NULL;
4756 35 4 if (cell_sv && SvOK(cell_sv)) {
34 1 if (cell_sv && SvOK(cell_sv)) {
4757 0 34 if (SvROK(cell_sv)) {
4760 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4772 49 0 if (headers_av) SvREFCNT_dec(headers_av);
4773 8 41 if (rows_av) SvREFCNT_dec(rows_av);
4795 547 1 if (SvOK(callback)) {
4796 546 1 if (SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV)
546 0 if (SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV)
4803 547 0 sep_len = sep_str ? strlen(sep_str) : 0;
4804 547 0 comment_len = comment_str ? strlen(comment_str) : 0;
4805 547 0 sep0 = sep_len ? sep_str[0] : 0;
4807 0 547 if (!fp)
4817 1 546 if (!use_cb)
4826 6789 541 while (sv_gets(line_sv, fp, 0) != NULL) {
4830 6789 0 if (len && line[len-1] == '\n') {
6788 1 if (len && line[len-1] == '\n') {
4832 6787 1 if (len && line[len-1] == '\r')
4930 1857 if (len && line[len-1] == '\r')
4835 6785 4 if (!in_quotes) {
4838 6788 2 while (k < len && (line[k] == ' ' || line[k] == '\t'))
3 6785 while (k < len && (line[k] == ' ' || line[k] == '\t'))
2 6783 while (k < len && (line[k] == ' ' || line[k] == '\t'))
4840 2 6783 if (k == len)
4843 6236 547 if (seen_first && comment_len && len >= comment_len
6236 0 if (seen_first && comment_len && len >= comment_len
6236 0 if (seen_first && comment_len && len >= comment_len
4844 1 6235 && memcmp(line, comment_str, comment_len) == 0)
4850 105806 29 while (i < len) {
4851 14896 90910 if (in_quotes) {
4856 4 14892 if (!q) {
4863 14884 8 if (run)
4867 14880 12 if (i + 1 < len && line[i+1] == '"') {
6 14874 if (i + 1 < len && line[i+1] == '"') {
4878 287228 6753 while (i < len) {
4880 272342 14886 if (c == '"' || c == '\r')
272342 0 if (c == '"' || c == '\r')
4882 69271 203071 if (c == sep0 && sep_len && (len - i) >= sep_len
69271 0 if (c == sep0 && sep_len && (len - i) >= sep_len
69271 0 if (c == sep0 && sep_len && (len - i) >= sep_len
4883 0 69271 && (sep_len == 1
4884 0 0 || memcmp(line + i, sep_str, sep_len) == 0))
4888 61133 29777 if (i > start)
4890 6753 84157 if (i >= len)
4894 14886 69271 if (c == '"') {
4897 14886 0 if (!post_quote)
4900 0 69271 } else if (c == '\r') {
4913 4 6782 if (in_quotes) {
4922 0 541 if (in_quotes) {/* EOF with an unterminated quote: flush the trailing record */
4927 540 1 if (use_cb) {
4939 4 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
0 4 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
4942 4 0 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
0 4 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
4947 2 2 if (strcmp(method, "pearson") != 0 &&
4948 1 1 strcmp(method, "spearman") != 0 &&
4949 0 1 strcmp(method, "kendall") != 0) {
4958 0 4 if (nx != ny) {
4969 20 4 for (size_t i = 0; i < nx; i++) {
4974 20 0 NV xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
20 0 NV xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
20 0 NV xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
4975 20 0 NV yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
20 0 NV yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
20 0 NV yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
4978 20 0 if (!isnan(xv) && !isnan(yv)) {
20 0 if (!isnan(xv) && !isnan(yv)) {
4986 0 4 if (n < 2) {
4992 1 3 if (strcmp(method, "kendall") == 0) {
4994 5 1 for (size_t i = 0; i < n; i++) {
4995 25 5 for (size_t j = 0; j < n; j++) {
5003 1 2 if (strcmp(method, "spearman") == 0) {
5010 5 1 for (size_t i = 0; i < n; i++) {
5020 10 2 for (size_t i = 0; i < n; i++) {
5073 0 11 if (items % 2 != 0) croak("Usage: glm(formula => 'am ~ wt + hp', data => \\%mtcars)");
5075 31 11 for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) {
5078 11 20 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
5079 11 9 else if (strEQ(key, "data")) data_sv = val;
5080 9 0 else if (strEQ(key, "family")) family_str = SvPV_nolen(val);
5083 0 11 if (!formula) croak("glm: formula is required");
5084 11 0 if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference");
0 11 if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference");
5088 8 3 if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str);
0 8 if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str);
5095 112 38 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
150 11 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
150 0 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
5099 0 11 if (!tilde) croak("glm: invalid formula, missing '~'");
5104 1 10 if ((minus_one = strstr(rhs, "-1")) != NULL) {
5111 0 11 if (minus1) {
5117 10 1 if (has_intercept) terms[num_terms++] = savepv("Intercept");
5120 18 11 while (chunk != NULL) {
5121 0 18 if (num_terms >= term_cap - 3) {
5125 18 0 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
0 18 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
5130 0 18 if (star) {
5133 0 0 char *restrict c_l = strchr(left, '^'); if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
0 0 char *restrict c_l = strchr(left, '^'); if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
5134 0 0 char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
0 0 char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
5142 0 18 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
0 0 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
5148 28 11 for (i = 0; i < num_terms; i++) {
5150 24 28 for (size_t j = 0; j < num_uniq; j++) {
5151 0 24 if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; }
5153 28 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
5157 11 0 if (SvTYPE(ref) == SVt_PVHV) {
5159 0 11 if (hv_iterinit(hv) == 0) croak("glm: Data hash is empty");
5161 11 0 if (entry) {
5163 11 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
6 5 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
5166 0 6 Newx(row_names, n, char*);
5174 21 5 for (size_t k = 0; k < sizeof rn_keys / sizeof rn_keys[0]; k++) {
5177 1 20 if (rn && *rn && SvROK(*rn)
1 0 if (rn && *rn && SvROK(*rn)
1 0 if (rn && *rn && SvROK(*rn)
5178 1 0 && SvTYPE(SvRV(*rn)) == SVt_PVAV) {
5183 134 6 for (i = 0; i < n; i++) {
5185 3 131 ? av_fetch(rn_av, (SSize_t)i, 0) : NULL;
5186 3 131 if (nm && *nm && SvOK(*nm)) {
3 0 if (nm && *nm && SvOK(*nm)) {
3 0 if (nm && *nm && SvOK(*nm)) {
5196 5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
5198 0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
5200 160 5 while ((entry = hv_iternext(hv))) {
5208 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
5211 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
5212 0 0 for (i = 0; i < n; i++) {
5214 0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
5222 0 0 for (size_t k = 0; k < sizeof rn_keys / sizeof rn_keys[0]; k++) {
5224 0 0 if (nm && *nm && SvOK(*nm)) break;
0 0 if (nm && *nm && SvOK(*nm)) break;
0 0 if (nm && *nm && SvOK(*nm)) break;
5227 0 0 if (nm && *nm && SvOK(*nm)) {
0 0 if (nm && *nm && SvOK(*nm)) {
0 0 if (nm && *nm && SvOK(*nm)) {
5237 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
5243 28 11 for (size_t j = 0; j < p; j++) {
5244 0 28 if (p_exp + 32 >= exp_cap) {
5249 10 18 if (strcmp(uniq_terms[j], "Intercept") == 0) {
5252 1 17 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
5254 0 1 Newx(levels, levels_cap, char*);
5255 60 1 for (i = 0; i < n; i++) {
5257 60 0 if (str_val) {
5259 88 2 for (size_t l = 0; l < num_levels; l++) {
5260 58 30 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
5262 2 58 if (!found) {
5263 0 2 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
0 0 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
5269 1 0 if (num_levels > 0) {
5270 1 1 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
5271 1 1 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
5272 1 0 if (strcmp(levels[l1], levels[l2]) > 0) {
5277 1 1 for (size_t l = 1; l < num_levels; l++) {
5278 0 1 if (p_exp >= exp_cap) {
5289 2 1 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
5300 0 11 Newx(X, n * p, NV); Newx(Y, n, NV);
0 11 Newx(X, n * p, NV); Newx(Y, n, NV);
5301 0 11 Newx(valid_row_names, n, char*);
5303 294 11 for (size_t i = 0; i < n; i++) {
5305 0 294 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
5309 808 294 for (size_t j = 0; j < p; j++) {
5310 291 517 if (strcmp(exp_terms[j], "Intercept") == 0) {
5312 60 457 } else if (is_dummy[j]) {
5314 60 0 if (str_val) {
5315 30 30 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
5320 0 457 if (isnan(row_x[j])) { row_ok = FALSE; break; }
5323 0 294 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
5325 808 294 for (size_t j = 0; j < p; j++) X[valid_n * p + j] = row_x[j];
5331 0 11 if (valid_n < p) {
5332 0 0 Safefree(X); Safefree(Y); Safefree(valid_row_names); if (row_hashes) Safefree(row_hashes);
5340 28 11 for (i = 0; i < p; i++) { beta[i] = 0.0; beta_old[i] = 0.0; }
5342 294 11 for (i = 0; i < valid_n; i++) sum_y += Y[i];
5344 291 10 for (i = 0; i < valid_n; i++) {
5345 37 254 if (is_binomial) {
5346 36 1 if (Y[i] < 0.0 || Y[i] > 1.0) croak("glm: binomial family requires response between 0 and 1");
0 36 if (Y[i] < 0.0 || Y[i] > 1.0) croak("glm: binomial family requires response between 0 and 1");
5350 21 15 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
5351 15 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
5359 46 0 for (iter = 1; iter <= max_iter; iter++) {
5360 882 46 for (i = 0; i < valid_n; i++) {
5361 380 502 if (is_binomial) {
5364 12 368 if (varmu < 1e-10) varmu = 1e-10;
5372 281 111 for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
111 46 for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
5373 882 46 for (size_t k = 0; k < valid_n; k++) {
5375 2428 882 for (i = 0; i < p; i++) {
5378 6854 2428 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
5382 111 46 for (i = 0; i < p; i++) {
5383 0 111 if (aliased[i]) { beta[i] = NAN; } else {
5385 281 0 for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j];
281 111 for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j];
5390 460 46 for (unsigned short int half = 0; half < 10; half++) {
5392 8820 460 for (i = 0; i < valid_n; i++) {
5394 24280 0 for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j];
24280 8820 for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j];
5396 3800 5020 if (is_binomial) {
5398 0 3800 if (mu[i] < 10 * DBL_EPSILON) mu[i] = 10 * DBL_EPSILON;
5399 0 3800 if (mu[i] > 1.0 - 10 * DBL_EPSILON) mu[i] = 1.0 - 10 * DBL_EPSILON;
5401 2170 1630 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
5402 1630 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
5411 320 140 if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) {
10 310 if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) {
0 10 if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) {
5415 30 10 for (size_t j = 0; j < p; j++) beta[j] = (beta[j] + beta_old[j]) / 2.0;
5417 10 36 if (fabs(deviance_new - deviance_old) / (0.1 + fabs(deviance_new)) < epsilon) {
5421 85 36 for (size_t j = 0; j < p; j++) beta_old[j] = beta[j];
5423 72 26 for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
26 10 for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
5424 290 10 for (size_t k = 0; k < valid_n; k++) {
5425 36 254 NV w = is_binomial ? (mu[k] * (1.0 - mu[k])) : 1.0;
5426 4 286 if (w < 1e-10) w = 1e-10;
5427 800 290 for (i = 0; i < p; i++) {
5429 2266 800 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
5433 9 1 NV wtdmu = has_intercept ? mean_y : (is_binomial ? 0.5 : 0.0);
0 1 NV wtdmu = has_intercept ? mean_y : (is_binomial ? 0.5 : 0.0);
5435 290 10 for (i = 0; i < valid_n; i++) {
5436 36 254 if (is_binomial) {
5437 21 15 if (Y[i] == 0.0) null_dev += -2.0 * log(1.0 - wtdmu);
5438 15 0 else if (Y[i] == 1.0) null_dev += -2.0 * log(wtdmu);
5445 8 2 if (is_gaussian) {
5448 1 7 if (dev_for_aic < 1.0355727742801604e-30) {
5452 2 0 } else if (is_binomial) {
5457 2 8 dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN);
7 1 dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN);
5458 290 10 for (size_t i = 0; i < valid_n; i++) {
5460 36 254 if (is_binomial) {
5462 21 15 if (Y[i] == 0.0) d_res = sqrt(-2.0 * log(1.0 - mu[i]));
5463 15 0 else if (Y[i] == 1.0) d_res = sqrt(-2.0 * log(mu[i]));
5465 15 21 res = (Y[i] > mu[i]) ? d_res : -d_res;
5473 26 10 for (size_t j = 0; j < p; j++) {
5478 0 26 if (aliased[j]) {
5481 0 0 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVpv("NaN", 0), 0);
5482 0 0 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVpv("NaN", 0), 0);
5486 5 21 NV p_val = is_binomial ? 2.0 * (1.0 - approx_pnorm(fabs(val_stat))) : get_t_pvalue(val_stat, df_res, "two.sided");
5489 5 21 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVnv(val_stat), 0);
5490 5 21 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVnv(p_val), 0);
5509 26 10 for (i = 0; i < num_terms; i++) Safefree(terms[i]);
5511 26 10 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]);
5513 26 10 for (size_t j = 0; j < p_exp; j++) {
5515 1 25 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
5521 5 5 if (row_hashes) Safefree(row_hashes);
5530 12 0 if (items < 2 || items % 2 != 0)
0 12 if (items < 2 || items % 2 != 0)
5539 34 12 for (unsigned short int i = 2; i < items; i += 2) {
5542 7 27 if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
5543 12 15 else if (strEQ(key, "method")) method = SvPV_nolen(val);
5544 1 14 else if (strEQ(key, "exact")) exact_sv = val;
5545 7 7 else if (strEQ(key, "conf.level") || strEQ(key, "conf_level")) conf_level = SvNV(val);
0 7 else if (strEQ(key, "conf.level") || strEQ(key, "conf_level")) conf_level = SvNV(val);
5546 7 0 else if (strEQ(key, "continuity")) continuity = SvTRUE(val);
5556 12 0 if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV ||
12 0 if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV ||
12 0 if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV ||
5557 12 0 !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) {
12 0 !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) {
0 12 !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) {
5563 0 12 if (n_raw != (size_t)(av_len(y_av) + 1)) croak("incompatible dimensions");
5567 269 12 for (size_t i = 0; i < n_raw; i++) {
5570 269 0 NV xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
267 2 NV xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
267 0 NV xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
5571 269 0 NV yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
267 2 NV yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
267 0 NV yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
5573 267 2 if (!isnan(xv) && !isnan(yv)) {
265 2 if (!isnan(xv) && !isnan(yv)) {
5579 0 12 if (n < 3) {
5584 6 6 if (is_pearson) {
5587 30 6 for (size_t i = 0; i < n; i++) {
5596 6 0 estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0;
6 0 estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0;
5598 0 6 if (estimate > 1.0) estimate = 1.0;
5599 0 6 else if (estimate < -1.0) estimate = -1.0;
5604 2 4 if (denom_t <= 0.0)
5605 1 1 statistic = (estimate > 0.0) ? INFINITY : -INFINITY;
5612 1 5 if (est_clamped >= 1.0) est_clamped = 1.0 - DBL_EPSILON;
5613 1 4 else if (est_clamped <= -1.0) est_clamped = -1.0 + DBL_EPSILON;
5622 3 3 } else if (is_kendall) {
5625 207 3 for (size_t i = 0; i < n - 1; i++) {
5626 19920 207 for (size_t j = i + 1; j < n; j++) {
5629 0 19920 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
0 0 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
5630 0 19920 else if (sign_x == 0) tie_x++;
5631 0 19920 else if (sign_y == 0) tie_y++;
5632 16 19904 else if (sign_x * sign_y > 0) c++;
5638 3 0 estimate = (denom == 0.0) ? NAN : (NV)(c - d) / denom;
5639 3 0 bool has_ties = (tie_x > 0 || tie_y > 0);
0 3 bool has_ties = (tie_x > 0 || tie_y > 0);
5642 1 2 if (!exact_sv || !SvOK(exact_sv))
0 1 if (!exact_sv || !SvOK(exact_sv))
5643 2 0 do_exact = (n < 50) && !has_ties;
2 0 do_exact = (n < 50) && !has_ties;
5647 2 1 if (do_exact && has_ties) do_exact = 0;
0 2 if (do_exact && has_ties) do_exact = 0;
5648 2 1 if (do_exact) {
5656 0 1 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
0 0 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
5659 1 0 if (strcmp(alternative, "two.sided") == 0)
5661 0 0 else if (strcmp(alternative, "less") == 0)
5667 3 0 } else if (is_spearman) {
5675 25 3 for (size_t i = 0; i < n; i++) {
5684 3 0 estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0;
3 0 estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0;
5687 0 3 if (estimate > 1.0) estimate = 1.0;
5688 0 3 else if (estimate < -1.0) estimate = -1.0;
5692 25 3 for (size_t i = 0; i < n; i++) {
5699 25 3 for (size_t i = 0; i < n; i++) {
5700 25 0 if (rank_x[i] != floor(rank_x[i]) || rank_y[i] != floor(rank_y[i])) {
0 25 if (rank_x[i] != floor(rank_x[i]) || rank_y[i] != floor(rank_y[i])) {
5707 0 3 if (!exact_sv || !SvOK(exact_sv))
0 0 if (!exact_sv || !SvOK(exact_sv))
5708 1 2 do_exact = (n < 10) && !has_ties;
1 0 do_exact = (n < 10) && !has_ties;
5712 1 2 if (do_exact) {
5720 0 2 if (continuity) {
5725 2 0 if (denom_t <= 0.0)
5726 1 1 statistic = (r > 0.0) ? INFINITY : -INFINITY;
5749 6 6 if (is_pearson) {
5770 2 0 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
0 2 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
5777 0 2 Newx(x, n_raw, NV);
5780 24 2 for (size_t i = 0; i < n_raw; i++) {
5782 24 0 if (elem && SvOK(*elem)) {
24 0 if (elem && SvOK(*elem)) {
5784 24 0 if (!isnan(val)) {
5792 2 0 if (n < 3 || n > 5000) {
0 2 if (n < 3 || n > 5000) {
5799 24 2 for (size_t i = 0; i < n; i++) {
5802 0 2 if (ssq == 0.0) {
5808 0 2 if (n == 3) {
5812 0 0 if (w < 0.75) w = 0.75;
5818 0 2 Newx(m, n, NV);
5819 0 2 Newx(a, n, NV);
5820 24 2 for (size_t i = 0; i < n; i++) {
5828 2 0 if (n == 4 || n == 5) {
1 1 if (n == 4 || n == 5) {
5830 3 1 for (unsigned int i = 1; i < n-1; i++) {
5838 15 1 for (unsigned int i = 2; i < n-2; i++) {
5842 24 2 for (size_t i = 0; i < n; i++) {
5852 1 1 if (n <= 11) {
5858 0 1 if (y >= gamma) {
5881 0 2 if (p_val > 1.0) p_val = 1.0;
5882 0 2 if (p_val < 0.0) p_val = 0.0;
5891 0 2 EXTEND(SP, 1);
5901 10046 28 for (unsigned short int i = 0; i < items; i++) {
5903 22 10024 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
22 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5906 498 21 for (size_t j = 0; j < len; j++) {
5908 498 0 if (tv && SvOK(*tv)) {
497 1 if (tv && SvOK(*tv)) {
5910 476 21 if (first || val < min_val) {
18 458 if (first || val < min_val) {
5919 10023 1 } else if (SvOK(arg)) {
5921 10015 8 if (first || val < min_val) {
7 10008 if (first || val < min_val) {
5930 1 27 if (count == 0) croak("min needs >= 1 numeric element");
5931 12 15 RETVAL = min_val;
5942 10046 29 for (size_t i = 0; i < items; i++) {
5944 23 10023 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
23 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5947 598 22 for (size_t j = 0; j < len; j++) {
5949 598 0 if (tv && SvOK(*tv)) {
597 1 if (tv && SvOK(*tv)) {
5951 575 22 if (first || val > max_val) {
67 508 if (first || val > max_val) {
5960 10022 1 } else if (SvOK(arg)) {
5962 10014 8 if (first || val > max_val) {
31 9983 if (first || val > max_val) {
5971 1 28 if (count == 0) croak("max needs >= 1 numeric element");
5972 12 16 RETVAL = max_val;
5987 0 11 if (items == 0) {
5991 17 11 while (i < items) {
5993 8 9 if (i + 1 < items && SvPOK(ST(i))) {
6 2 if (i + 1 < items && SvPOK(ST(i))) {
5995 2 4 if (strEQ(key, "n")) {
6000 2 2 } else if (strEQ(key, "min")) {
6005 2 0 } else if (strEQ(key, "max")) {
6014 9 2 if (!n_set) {
6017 1 1 } else if (!min_set) {
6020 1 0 } else if (!max_set) {
6028 0 11 if (!n_set) {
6032 0 11 AUTO_SEED_PRNG();
6034 11 0 if (n > 0) {
6038 20079 11 for (size_t j = 0; j < n; j++) {
6040 0 20079 if (max < min) {
6056 0 12 AUTO_SEED_PRNG();
6057 1 11 if (items % 2 != 0)
6065 31 11 for (unsigned short i = 0; i < items; i += 2) {
6069 11 20 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
6070 10 10 else if (strEQ(key, "size")) { size = (unsigned int)SvUV(val); size_set = TRUE; }
6071 10 0 else if (strEQ(key, "prob")) { prob = SvNV(val); prob_set = TRUE; }
6076 10 1 if (!size_set || !prob_set) croak("rbinom: 'size' and 'prob' are required arguments");
1 9 if (!size_set || !prob_set) croak("rbinom: 'size' and 'prob' are required arguments");
6077 8 1 if (prob < 0.0 || prob > 1.0) croak("rbinom: prob must be between 0 and 1");
1 7 if (prob < 0.0 || prob > 1.0) croak("rbinom: prob must be between 0 and 1");
6080 7 0 if (n > 0) {
6082 20499 7 for (unsigned int i = 0; i < n; i++) {
6096 8 1 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
1 7 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6101 1 6 if (n_raw == 0) croak("hist: input array is empty");
6105 0 6 Newx(x, n_raw, NV);
6109 2021 5 for (size_t i = 0; i < n_raw; i++) {
6111 2021 0 if (tv && SvOK(*tv)) {
2021 0 if (tv && SvOK(*tv)) {
6114 5 2015 if (val < min_val) min_val = val;
6115 2012 8 if (val > max_val) max_val = val;
6118 0 5 if (n == 0) {
6124 0 5 if (items == 2) {
6127 5 0 } else if (items > 2) {
6129 5 0 for (unsigned short i = 1; i < items - 1; i++) {
6131 5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
6137 0 5 if (n_bins == 0 && looks_like_number(ST(1))) {
0 0 if (n_bins == 0 && looks_like_number(ST(1))) {
6141 0 5 if (n_bins == 0) n_bins = calculate_sturges_bins(n);
6145 0 5 Newx(breaks, n_bins + 1, NV);
6146 0 5 Newx(mids, n_bins, NV);
6147 0 5 Newx(density, n_bins, NV);
6148 0 5 Newx(counts, n_bins, size_t);
6151 23 5 for (size_t i = 0; i <= n_bins; i++) {
6162 23 5 for (size_t i = 0; i <= n_bins; i++) {
6164 18 5 if (i < n_bins) {
6189 22 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
21 1 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
21 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6194 0 22 if ((items - arg_idx) % 2 != 0)
6197 23 22 for (; arg_idx < items; arg_idx += 2) {
6201 1 22 if (strEQ(key, "x")) x_sv = val;
6202 22 0 else if (strEQ(key, "probs")) probs_sv = val;
6205 22 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
22 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 22 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6210 0 22 if (n_raw == 0) croak("quantile: 'x' is empty");
6213 0 22 Newx(x, n_raw, NV);
6215 489 22 for (size_t i = 0; i < n_raw; i++) {
6217 489 0 if (tv && SvOK(*tv)) {
489 0 if (tv && SvOK(*tv)) {
6221 0 22 if (n == 0) {
6232 22 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
22 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
22 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
6236 45 22 for (unsigned int i = 0; i < n_probs; i++) {
6238 45 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
45 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
6239 45 0 if (probs[i] < 0.0 || probs[i] > 1.0) {
0 45 if (probs[i] < 0.0 || probs[i] > 1.0) {
6246 0 0 for (unsigned int i = 0; i < n_probs; i++) probs[i] = default_probs[i];
6250 45 22 for (size_t i = 0; i < n_probs; i++) {
6254 1 44 if (n == 1) {
6256 1 43 } else if (p == 1.0) {
6258 1 42 } else if (p == 0.0) {
6271 45 0 if (fabs(pct - pct_rounded) < 1e-9) {
6291 72 57 for (size_t i = 0; i < items; i++) {
6293 56 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
56 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6296 20555 55 for (size_t j = 0; j < len; j++) {
6298 20555 0 if (tv && SvOK(*tv)) {
20554 1 if (tv && SvOK(*tv)) {
6305 15 1 } else if (SvOK(arg)) {
6312 1 56 if (count == 0) croak("mean needs >= 1 element");
6313 42 14 RETVAL = total / count;
6330 12 4 for (size_t i = 0; i < items; i++) {
6332 1 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
1 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6335 4 1 for (size_t j = 0; j < len; j++) {
6337 4 0 if (tv && SvOK(*tv)) {
4 0 if (tv && SvOK(*tv)) {
6341 0 4 if (!slot) croak("mode: internal hash error");
6342 2 2 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
6344 3 1 if (cnt > max_count) max_count = cnt;
6345 2 2 if (cnt == 1)
6352 10 1 } else if (SvOK(arg)) {
6356 0 10 if (!slot) croak("mode: internal hash error");
6357 4 6 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
6359 6 4 if (cnt > max_count) max_count = cnt;
6360 6 4 if (cnt == 1)
6368 1 3 if (arg_count == 0)
6372 7 3 while ((he = hv_iternext(counts))) {
6373 4 3 if (SvIV(hv_iterval(counts, he)) == max_count) {
6375 0 4 const char *restrict key = HePV(he, klen);
6377 0 4 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
4 0 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
6387 16 3 for (size_t i = 0; i < items; i++) {
6389 2 14 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
2 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6392 10 1 for (size_t j = 0; j < len; j++) {
6394 10 0 if (tv && SvOK(*tv)) {
9 1 if (tv && SvOK(*tv)) {
6401 13 1 } else if (SvOK(arg)) {
6408 0 3 if (count == 0) croak("sum needs >= 1 element");
6409 1 2 RETVAL = total;
6420 37 21 for (size_t i = 0; i < items; i++) {
6422 18 19 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
18 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6425 10069 17 for (size_t j = 0; j < len; j++) {
6427 10069 0 if (tv && SvOK(*tv)) {
10068 1 if (tv && SvOK(*tv)) {
6437 18 1 } else if (SvOK(arg)) {
6447 1 20 if (count < 2) croak("sd needs >= 2 elements");
6448 2 18 RETVAL = sqrt(M2 / (count - 1));
6459 15 6 for (size_t i = 0; i < items; i++) {
6461 4 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
4 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6464 10012 3 for (size_t j = 0; j < len; j++) {
6466 10012 0 if (tv && SvOK(*tv)) {
10011 1 if (tv && SvOK(*tv)) {
6476 10 1 } else if (SvOK(arg)) {
6486 1 5 if (count < 2) croak("var needs >= 2 elements");
6487 1 4 RETVAL = M2 / (count - 1);
6501 53 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
27 26 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
27 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6506 53 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
10 43 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
10 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6511 0 53 if ((items - arg_idx) % 2 != 0) {
6515 76 53 for (; arg_idx < items; arg_idx += 2) {
6519 25 51 if (strEQ(key, "x")) x_sv = val;
6520 5 46 else if (strEQ(key, "y")) y_sv = val;
6521 35 11 else if (strEQ(key, "mu")) mu = SvNV(val);
6522 4 7 else if (strEQ(key, "paired")) paired = SvTRUE(val);
6523 3 4 else if (strEQ(key, "var_equal")) var_equal = SvTRUE(val);
6524 2 2 else if (strEQ(key, "conf_level")) conf_level = SvNV(val);
6525 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
6530 52 1 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
52 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 52 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6534 0 52 if (nx < 2) croak("t_test: 'x' needs at least 2 elements");
6536 14 38 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV)
14 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV)
14 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV)
6538 52 0 if (conf_level <= 0.0 || conf_level >= 1.0)
1 51 if (conf_level <= 0.0 || conf_level >= 1.0)
6543 396 51 for (size_t i = 0; i < nx; i++) {
6545 396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
6551 1 50 if (var_x == 0.0 && !y_av) croak("t_test: data are essentially constant");
1 0 if (var_x == 0.0 && !y_av) croak("t_test: data are essentially constant");
6553 46 4 if (paired || y_av) {
11 35 if (paired || y_av) {
6554 1 14 if (!y_av) croak("t_test: 'y' must be provided for paired or two-sample tests");
6556 3 11 if (paired && ny != nx) croak("t_test: Paired arrays must be same length");
1 2 if (paired && ny != nx) croak("t_test: Paired arrays must be same length");
6558 127 13 for (size_t i = 0; i < ny; i++) {
6560 127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
6566 2 11 if (paired) {
6568 12 2 for (size_t i = 0; i < nx; i++) {
6571 12 0 NV dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0;
12 0 NV dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0;
6572 12 0 NV dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0;
12 0 NV dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0;
6579 0 2 if (var_d == 0.0) croak("t_test: data are essentially constant");
6585 2 9 } else if (var_equal) {
6586 0 2 if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant");
0 0 if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant");
6595 0 9 if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant");
0 0 if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant");
6615 1 47 if (strcmp(alternative, "less") == 0) {
6619 1 46 } else if (strcmp(alternative, "greater") == 0) {
6642 14 1 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
0 14 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
6648 1 13 if (n == 0) {
6654 144 13 for(unsigned short int i = 0; meth[i]; i++) meth[i] = tolower(meth[i]);
6656 4 9 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
2 2 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
6657 2 11 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
2 0 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
6658 0 13 if (strcmp(meth, "fdr") == 0) strcpy(meth, "bh");
6662 0 13 Newx(arr, n, PVal);
6663 0 13 Newx(adj, n, NV);
6665 356 13 for (size_t i = 0; i < n; i++) {
6667 356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
6673 2 11 if (strcmp(meth, "bonferroni") == 0) {
6674 51 2 for (size_t i = 0; i < n; i++) {
6676 19 32 adj[arr[i].orig_idx] = (v < 1.0) ? v : 1.0;
6678 2 9 } else if (strcmp(meth, "holm") == 0) {
6680 51 2 for (size_t i = 0; i < n; i++) {
6682 32 19 if (v > cummax) cummax = v;
6683 22 29 adj[arr[i].orig_idx] = (cummax < 1.0) ? cummax : 1.0;
6685 2 7 } else if (strcmp(meth, "hochberg") == 0) {
6687 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6689 22 29 if (v < cummin) cummin = v;
6690 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6692 2 5 } else if (strcmp(meth, "bh") == 0) {
6694 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6696 41 10 if (v < cummin) cummin = v;
6697 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6699 2 3 } else if (strcmp(meth, "by") == 0) {
6701 51 2 for (size_t i = 1; i <= n; i++) q += 1.0 / i;
6703 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6705 22 29 if (v < cummin) cummin = v;
6706 26 25 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6708 2 1 } else if (strcmp(meth, "hommel") == 0) {
6710 0 2 Newx(pa, n, NV);
6711 0 2 Newx(q_arr, n, NV);
6714 49 2 for (size_t i = 1; i < n; i++) {
6716 0 49 if (temp < min_val) {
6721 51 2 for (size_t i = 0; i < n; i++) {
6725 48 2 for (size_t j = n - 1; j >= 2; j--) {
6730 1128 48 for (size_t k = 1; k < i2_len; k++) {
6732 266 862 if (temp_q1 < q1) {
6737 1224 48 for (size_t i = 0; i <= n_mj; i++) {
6739 847 377 q_arr[i] = (v < q1) ? v : q1;
6742 1176 48 for (size_t i = 0; i < i2_len; i++) {
6746 2400 48 for (size_t i = 0; i < n; i++) {
6747 1401 999 if (pa[i] < q_arr[i]) {
6753 51 2 for (size_t i = 0; i < n; i++) {
6754 50 1 NV v = (pa[i] > arr[i].p) ? pa[i] : arr[i].p;
6755 0 51 if (v > 1.0) v = 1.0;
6759 0 1 } else if (strcmp(meth, "none") == 0) {
6760 0 0 for (size_t i = 0; i < n; i++) {
6768 0 12 EXTEND(SP, n);
6769 306 12 for (size_t i = 0; i < n; i++) {
6783 30 24 for (size_t i = 0; i < items; i++) {
6785 23 7 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
23 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6788 326 22 for (size_t j = 0; j < len; j++) {
6790 326 0 if (tv && SvOK(*tv)) {
325 1 if (tv && SvOK(*tv)) {
6796 6 1 } else if (SvOK(arg)) {
6802 1 23 if (total_count == 0) croak("median needs >= 1 element");
6805 0 23 Newx(nums, total_count, NV);
6808 26 23 for (size_t i = 0; i < items; i++) {
6810 22 4 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
22 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6813 324 22 for (size_t j = 0; j < len; j++) {
6815 324 0 if (tv && SvOK(*tv)) {
324 0 if (tv && SvOK(*tv)) {
6822 4 0 } else if (SvOK(arg)) {
6831 7 16 if (total_count % 2 == 0) {
6838 14 9 RETVAL = median_val;
6845 11 59 if (strcmp(method, "pearson") != 0 &&
6846 5 6 strcmp(method, "spearman") != 0 &&
6847 1 4 strcmp(method, "kendall") != 0)
6852 69 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 69 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6857 0 69 if (nx == 0) croak("cor: x is empty");
6863 69 0 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
1 68 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
1 0 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
6868 69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
6869 69 0 SvTYPE(SvRV(y_sv)) == SVt_PVAV);
6871 69 0 AV*restrict y_av = has_y ? (AV*)SvRV(y_sv) : NULL;
6872 69 0 size_t ny = has_y ? av_len(y_av) + 1 : 0;
6875 69 0 if (has_y && ny > 0) {
69 0 if (has_y && ny > 0) {
6877 69 0 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
1 68 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
1 0 if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV)
6883 68 1 if (!x_is_matrix && !y_is_matrix) {
68 0 if (!x_is_matrix && !y_is_matrix) {
6884 0 68 if (!has_y) {
6888 1 67 if (nx != ny)
6891 0 67 if (nx < 2)
6894 0 67 Newx(xd, nx, NV);
6895 0 67 Newx(yd, ny, NV);
6898 318 67 for (size_t i = 0; i < nx; i++) {
6900 318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
6902 318 0 if (!isnan(val)) {
6903 67 251 if (isnan(x_first)) x_first = val;
6904 242 9 else if (val != x_first) x_sd0 = 0;
6907 318 67 for (size_t i = 0; i < ny; i++) {
6909 318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 NV val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
6911 318 0 if (!isnan(val)) {
6912 67 251 if (isnan(y_first)) y_first = val;
6913 242 9 else if (val != y_first) y_sd0 = 0;
6916 58 9 if (x_sd0 || y_sd0) {
0 58 if (x_sd0 || y_sd0) {
6918 9 0 if (x_sd0) croak("cor: standard deviation of x is 0");
6927 0 1 if (!x_is_matrix)
6932 1 0 if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV)
1 0 if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV)
0 1 if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV)
6936 0 1 if (ncols_x == 0) croak("cor: x matrix has zero columns");
6941 3 1 for (size_t i = 0; i < nrows; i++) {
6943 3 0 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
3 0 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
0 3 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
6947 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6948 0 1 if (ny != nrows) croak("cor: x and y must have the same number of rows (%lu vs %lu)", nrows, ny);
6949 3 1 for (size_t i = 0; i < nrows; i++) {
6951 3 0 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
3 0 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
0 3 if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV)
6957 0 1 Newx(col_x, ncols_x, NV*);
6958 2 1 for (size_t j = 0; j < ncols_x; j++) {
6959 0 2 Newx(col_x[j], nrows, NV);
6962 6 2 for (size_t i = 0; i < nrows; i++) {
6966 6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
6968 6 0 if (!isnan(val)) {
6969 2 4 if (isnan(first)) first = val;
6970 4 0 else if (val != first) sd0 = 0;
6973 0 2 if (sd0) {
6974 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_x[k]);
6984 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6988 0 1 if (ncols_y == 0) croak("cor: y matrix has zero columns");
6990 0 1 Newx(col_y, ncols_y, NV*);
6991 2 1 for (size_t j = 0; j < ncols_y; j++) {
6992 0 2 Newx(col_y[j], nrows, NV);
6995 6 2 for (size_t i = 0; i < nrows; i++) {
6999 6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
6 0 NV val = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN;
7001 6 0 if (!isnan(val)) {
7002 2 4 if (isnan(first)) first = val;
7003 4 0 else if (val != first) sd0 = 0;
7006 0 2 if (sd0) {
7007 0 0 for (size_t k = 0; k < ncols_x; k++) Safefree(col_x[k]);
7009 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_y[k]);
7019 0 1 if (nrows < 2)
7026 0 1 Newx(rows_out, ncols_x, AV*);
7027 2 1 for (size_t i = 0; i < ncols_x; i++) {
7031 0 1 if (symmetric) {
7034 0 0 Newx(r_cache, ncols_x, NV*);
7035 0 0 for (size_t i = 0; i < ncols_x; i++)
7036 0 0 Newx(r_cache[i], ncols_x, NV);
7038 0 0 for (size_t i = 0; i < ncols_x; i++) {
7040 0 0 for (size_t j = i + 1; j < ncols_x; j++) {
7047 0 0 for (size_t i = 0; i < ncols_x; i++)
7048 0 0 for (size_t j = 0; j < ncols_x; j++)
7051 0 0 for (size_t i = 0; i < ncols_x; i++) Safefree(r_cache[i]);
7055 2 1 for (size_t i = 0; i < ncols_x; i++)
7056 4 2 for (size_t j = 0; j < ncols_y; j++)
7060 2 1 for (size_t i = 0; i < ncols_x; i++)
7064 2 1 for (size_t j = 0; j < ncols_x; j++) Safefree(col_x[j]);
7066 1 0 if (!symmetric) {
7067 2 1 for (size_t j = 0; j < ncols_y; j++) Safefree(col_y[j]);
7083 5 0 if (items > 0) {
7085 3 2 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
2 1 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
7090 2 0 if (center_sv) {
7092 0 2 if (!SvOK(val_sv)) {
7097 2 0 if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
2 0 if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
1 1 if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
7099 1 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
1 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
0 1 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
0 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
7101 0 0 } else if (looks_like_number(val_sv)) {
7103 0 0 } else if (SvTRUE(val_sv)) {
7112 1 1 if (scale_sv) {
7114 0 1 if (!SvOK(val_sv)) {
7118 1 0 if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
1 0 if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
0 1 if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) {
7120 1 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
1 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
0 1 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
0 0 } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) {
7122 0 0 } else if (looks_like_number(val_sv)) {
7124 0 0 if (scale_val == 0.0) scale_val = 1.0; /* Prevent Division By Zero */
7125 0 0 } else if (SvTRUE(val_sv)) {
7136 2 3 if (data_items == 1) {
7138 1 1 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
1 0 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
7140 1 0 if (av_len(av) >= 0) {
7142 1 0 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
1 0 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
1 0 if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) {
7148 1 4 if (is_matrix) {
7154 1 0 if (nrow == 0 || ncol == 0) croak("scale requires non-empty matrix");
0 1 if (nrow == 0 || ncol == 0) croak("scale requires non-empty matrix");
7159 3 1 for (size_t r = 0; r < nrow; r++) {
7165 2 1 for (size_t c = 0; c < ncol; c++) {
7168 0 2 Newx(col_data, nrow, NV);
7170 6 2 for (size_t r = 0; r < nrow; r++) {
7172 6 0 if (row_sv && SvROK(*row_sv)) {
6 0 if (row_sv && SvROK(*row_sv)) {
7175 6 0 col_data[r] = (cell_sv && SvOK(*cell_sv)) ? SvNV(*cell_sv) : 0.0;
6 0 col_data[r] = (cell_sv && SvOK(*cell_sv)) ? SvNV(*cell_sv) : 0.0;
7182 2 0 NV col_center = do_center_mean ? (col_sum / nrow) : center_val;
7185 2 0 if (do_scale_sd) {
7186 0 2 if (nrow <= 1) {
7192 6 2 for (size_t r = 0; r < nrow; r++) {
7199 6 2 for (size_t r = 0; r < nrow; r++) {
7201 6 0 NV final_val = (col_scale == 0.0) ? (0.0 / 0.0) : (centered / col_scale);
7208 0 1 EXTEND(SP, 1);
7215 16 4 for (size_t i = 0; i < data_items; i++) {
7217 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
7220 0 0 for (unsigned int j = 0; j < len; j++) {
7222 0 0 if (tv && SvOK(*tv)) { total_count++; }
0 0 if (tv && SvOK(*tv)) { total_count++; }
7224 16 0 } else if (SvOK(arg)) {
7228 0 4 if (total_count == 0) croak("scale requires at least 1 numeric element");
7229 0 4 Newx(nums, total_count, NV);
7230 16 4 for (size_t i = 0; i < data_items; i++) {
7232 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
7235 0 0 for (size_t j = 0; j < len; j++) {
7237 0 0 if (tv && SvOK(*tv)) {
0 0 if (tv && SvOK(*tv)) {
7242 16 0 } else if (SvOK(arg)) {
7247 3 1 if (do_center_mean) center_val = sum / total_count;
7248 3 1 if (do_scale_sd) {
7249 1 2 if (total_count <= 1) {
7254 10 2 for (size_t i = 0; i < total_count; i++) {
7260 0 3 EXTEND(SP, total_count);
7261 15 3 for (size_t i = 0; i < total_count; i++) {
7263 15 0 NV final_val = (scale_val == 0.0) ? (0.0 / 0.0) : (centered / scale_val);
7277 6 0 if (items > 0 && SvROK(ST(0)) && SvTYPE(SvRV(ST(0))) == SVt_PVAV) {
1 5 if (items > 0 && SvROK(ST(0)) && SvTYPE(SvRV(ST(0))) == SVt_PVAV) {
1 0 if (items > 0 && SvROK(ST(0)) && SvTYPE(SvRV(ST(0))) == SVt_PVAV) {
7280 1 0 if (items > 1 && SvOK(ST(1))) {
1 0 if (items > 1 && SvOK(ST(1))) {
7284 0 1 if (items > 2 && SvOK(ST(2))) {
0 0 if (items > 2 && SvOK(ST(2))) {
7288 0 1 if (items > 3 && SvOK(ST(3))) {
0 0 if (items > 3 && SvOK(ST(3))) {
7291 5 0 } else if (items % 2 == 0) {
7293 11 5 for (size_t i = 0; i < items; i += 2) {
7296 5 6 if (strEQ(key, "data")) {
7298 4 2 } else if (strEQ(key, "nrow")) {
7299 4 0 if (SvOK(val)) { nrow = (size_t)SvUV(val); nrow_set = TRUE; }
7300 1 1 } else if (strEQ(key, "ncol")) {
7301 1 0 if (SvOK(val)) { ncol = (size_t)SvUV(val); ncol_set = TRUE; }
7302 1 0 } else if (strEQ(key, "byrow")) {
7312 6 0 if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) {
5 1 if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) {
0 5 if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) {
7316 0 5 size_t data_len = (UV)(av_top_index(data_av) + 1);
7317 1 4 if (data_len == 0) {
7321 0 4 if (!nrow_set && !ncol_set) {
0 0 if (!nrow_set && !ncol_set) {
7324 4 0 } else if (nrow_set && !ncol_set) {
3 1 } else if (nrow_set && !ncol_set) {
7326 0 1 } else if (!nrow_set && ncol_set) {
0 0 } else if (!nrow_set && ncol_set) {
7330 3 1 if (nrow == 0 || ncol == 0) {
0 3 if (nrow == 0 || ncol == 0) {
7338 6 3 for (r = 0; r < nrow; r++) {
7345 18 3 for (size_t i = 0; i < total_cells; i++) {
7348 18 0 SV*restrict val = fetched ? newSVsv(*fetched) : newSV(0);
7349 6 12 if (byrow) {
7392 0 27 if (items % 2 != 0)
7395 52 27 for (I32 i_arg = 0; i_arg < items; i_arg += 2) {
7398 26 26 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
7399 26 0 else if (strEQ(key, "data")) data_sv = val;
7402 1 26 if (!formula) croak("lm: formula is required");
7403 25 1 if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference");
1 24 if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference");
7407 24 0 if (SvTYPE(ref) == SVt_PVHV) {
7409 0 24 if (hv_iterinit(hv) == 0) croak("lm: Data hash is empty");
7411 24 0 if (entry) {
7413 24 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
16 8 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
7416 0 16 Newx(row_names, n, char*);
7417 140 16 for (i = 0; i < n; i++) {
7422 8 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
8 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
7423 0 8 n = (size_t)HvUSEDKEYS(hv);
7424 0 8 Newx(row_names, n, char*);
7425 0 8 Newx(row_hashes, n, HV*);
7428 226 7 while ((entry = hv_iternext(hv))) {
7431 225 1 if (!SvROK(rval) || SvTYPE(SvRV(rval)) != SVt_PVHV) {
0 225 if (!SvROK(rval) || SvTYPE(SvRV(rval)) != SVt_PVHV) {
7432 1 1 for (k = 0; k < i; k++) Safefree(row_names[k]);
7443 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
7446 0 0 Newx(row_names, n, char*);
7447 0 0 Newx(row_hashes, n, HV*);
7448 0 0 for (i = 0; i < n; i++) {
7450 0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
7456 0 0 for (k = 0; k < i; k++) Safefree(row_names[k]);
7468 2298 167 while (*src) { if (!isspace((unsigned char)*src)) *dst++ = *src; src++; }
2465 23 while (*src) { if (!isspace((unsigned char)*src)) *dst++ = *src; src++; }
7472 1 22 if (!tilde) {
7473 2 1 for (i = 0; i < n; i++) Safefree(row_names[i]);
7474 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
7485 2224 22 while (*p_idx) {
7486 0 2224 if (p_idx[0] == 'I' && p_idx[1] == '(') {
0 0 if (p_idx[0] == 'I' && p_idx[1] == '(') {
7488 0 0 while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; }
0 0 while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; }
0 0 while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; }
0 0 while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; }
7491 1 2223 if (p_idx[0] == '-' && p_idx[1] == '1' &&
1 0 if (p_idx[0] == '-' && p_idx[1] == '1' &&
7492 0 1 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
7497 58 2165 if (p_idx[0] == '+' && p_idx[1] == '0' &&
0 58 if (p_idx[0] == '+' && p_idx[1] == '0' &&
7498 0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
7503 22 2201 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
0 22 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
0 0 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
7508 22 2201 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') {
0 22 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') {
0 0 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') {
7511 58 2165 if (p_idx[0] == '+' && p_idx[1] == '1' &&
0 58 if (p_idx[0] == '+' && p_idx[1] == '1' &&
7512 0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
0 0 (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) {
7516 22 2201 if (p_idx == rhs) {
7517 0 22 if (p_idx[0] == '1' && p_idx[1] == '\0') { p_idx[0] = '\0'; break; }
0 0 if (p_idx[0] == '1' && p_idx[1] == '\0') { p_idx[0] = '\0'; break; }
7518 0 22 if (p_idx[0] == '1' && p_idx[1] == '+') { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); continue; }
0 0 if (p_idx[0] == '1' && p_idx[1] == '+') { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); continue; }
7526 0 22 while ((p_idx = strstr(rhs, "++")) != NULL)
7528 0 22 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
7530 22 0 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
0 22 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
7539 80 22 while (chunk != NULL) {
7540 1 79 if (strcmp(chunk, ".") == 0) {
7542 3 1 for (size_t c = 0; c <= (size_t)av_len(cols); c++) {
7544 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
7546 2 1 if (strcmp(col_name, lhs) != 0)
7561 21 1 if (has_intercept) terms[num_terms++] = savepv("Intercept");
7563 22 0 if (rhs_len > 0) {
7565 81 22 while (chunk != NULL) {
7566 0 81 if (num_terms >= term_cap - 3) {
7571 1 80 if (star) {
7576 0 1 if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
0 0 if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
7578 1 0 if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
1 0 if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
7586 0 80 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
0 0 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
7595 104 22 for (i = 0; i < num_terms; i++) {
7597 0 1320 for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; } }
1320 104 for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; } }
7598 104 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
7603 104 22 for (j = 0; j < p; j++) {
7604 1 103 if (p_exp + 32 >= exp_cap) {
7609 21 83 if (strcmp(uniq_terms[j], "Intercept") == 0) {
7612 5 78 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
7616 42 5 for (i = 0; i < n; i++) {
7618 42 0 if (str_val) {
7620 28 39 for (l = 0; l < num_levels; l++) { if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; } }
67 14 for (l = 0; l < num_levels; l++) { if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; } }
7621 14 28 if (!found) {
7622 0 14 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
7628 5 0 if (num_levels > 0) {
7631 9 5 for (l = 1; l < num_levels; l++) {
7632 0 9 if (p_exp >= exp_cap) {
7645 14 5 for (l = 0; l < num_levels; l++) Safefree(levels[l]);
7656 0 22 Newx(X, n * p, NV); Newx(Y, n, NV);
0 22 Newx(X, n * p, NV); Newx(Y, n, NV);
7657 0 22 Newx(valid_row_names, n, char*);
7664 362 22 for (i = 0; i < n; i++) {
7666 3 359 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
7670 3905 359 for (j = 0; j < p; j++) {
7671 327 3578 if (strcmp(exp_terms[j], "Intercept") == 0) {
7673 78 3500 } else if (is_dummy[j]) {
7675 78 0 if (str_val) {
7676 27 51 X[base + j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
7681 0 3500 if (isnan(v)) { row_ok = FALSE; break; }
7685 0 359 if (!row_ok) { Safefree(row_names[i]); continue; }
7692 3 19 if (valid_n <= p) {
7693 8 3 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7694 8 3 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7695 8 3 for (j = 0; j < p_exp; j++) {
7697 0 8 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7701 5 3 for (i = 0; i < valid_n; i++) Safefree(valid_row_names[i]);
7703 0 3 if (row_hashes) Safefree(row_hashes);
7711 0 19 if (valid_n < n) Renew(X, valid_n * (size_t)p, NV);
0 0 if (valid_n < n) Renew(X, valid_n * (size_t)p, NV);
7715 100 19 for (i = 0; i < p; i++)
7716 2742 100 for (j = 0; j < p; j++) {
7718 158579 2742 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * X[k * p + j];
7722 100 19 for (i = 0; i < p; i++) {
7724 3891 100 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * Y[k];
7730 100 19 for (i = 0; i < p; i++) {
7731 49 51 if (aliased[i]) { beta[i] = NAN; }
7734 145 146 for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j];
291 51 for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j];
7744 354 19 for (i = 0; i < valid_n; i++) sum_y += Y[i];
7746 354 19 for (i = 0; i < valid_n; i++) {
7748 1006 2885 for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j];
3891 354 for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j];
7751 322 32 NV diff_m = has_intercept ? (y_hat - mean_y) : y_hat;
7758 19 0 rse_sq = (df_res > 0) ? (rss / (NV)df_res) : NAN;
7764 19 0 if (final_rank != df_int && (mss + rss) > 0.0) {
19 0 if (final_rank != df_int && (mss + rss) > 0.0) {
7767 17 2 if (rse_sq > 0.0 && numdf > 0) {
17 0 if (rse_sq > 0.0 && numdf > 0) {
7770 2 0 } else if (rse_sq == 0.0) {
7774 0 0 } else if (final_rank == df_int) {
7777 100 19 for (j = 0; j < p; j++) {
7781 49 51 if (aliased[j]) {
7788 47 4 NV t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0));
4 0 NV t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0));
7807 19 0 if (!isnan(f_stat)) {
7816 96 19 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7817 96 19 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7818 100 19 for (j = 0; j < p_exp; j++) {
7820 9 91 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7825 7 12 if (row_hashes) Safefree(row_hashes);
7839 0 6 if (by == 0.0) {
7840 0 0 if (from == to) {
7841 0 0 EXTEND(SP, 1);
7849 5 1 if ((from < to && by < 0.0) || (from > to && by > 0.0)) {
5 0 if ((from < to && by < 0.0) || (from > to && by > 0.0)) {
1 5 if ((from < to && by < 0.0) || (from > to && by > 0.0)) {
0 1 if ((from < to && by < 0.0) || (from > to && by > 0.0)) {
7857 0 6 if (n_elements_d < 0.0) n_elements_d = 0.0;
7860 0 6 EXTEND(SP, n_elements);
7861 3027 6 for (size_t i = 0; i < n_elements; i++) {
7871 1 1 AUTO_SEED_PRNG();
7876 2 0 if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) {
0 2 if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) {
0 0 if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) {
0 0 if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) {
7882 0 2 if ((items - arg_start) % 2 != 0) {
7886 5 2 for (int i = arg_start; i < items; i += 2) {
7890 2 3 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
7891 1 2 else if (strEQ(key, "mean")) mean = SvNV(val);
7892 2 0 else if (strEQ(key, "sd")) sd = SvNV(val);
7895 1 1 if (sd < 0.0) croak("rnorm: standard deviation must be non-negative");
7897 1 0 if (n > 0) {
7900 5000 1 for (size_t i = 0; i < n; ) {
7907 1411 5000 } while (s >= 1.0 || s == 0.0);
0 5000 } while (s >= 1.0 || s == 0.0);
7911 4999 1 if (i < n) {
7932 10 0 if (!formula_sv || !SvOK(formula_sv) || SvCUR(formula_sv) == 0) {
9 1 if (!formula_sv || !SvOK(formula_sv) || SvCUR(formula_sv) == 0) {
0 9 if (!formula_sv || !SvOK(formula_sv) || SvCUR(formula_sv) == 0) {
7933 1 0 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
0 1 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
7944 2 1 while ((entry = hv_iternext(input_hv))) {
7947 2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
7950 12 2 for (size_t k = 0; k <= len; k++) {
7952 12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
7987 0 10 if (!SvROK(data_sv)) croak("aov: data is required and must be a reference");
7992 10 0 if (SvTYPE(ref) == SVt_PVHV) {
7994 0 10 if (hv_iterinit(hv) == 0) croak("aov: Data hash is empty");
7996 10 0 if (entry) {
7998 10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
8001 0 10 Newx(row_names, n, char*);
8002 70 10 for(i = 0; i < n; i++) {
8006 0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
8008 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
8010 0 0 while ((entry = hv_iternext(hv))) {
8018 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
8021 0 0 Newx(row_names, n, char*);
8022 0 0 Newx(row_hashes, n, HV*);
8023 0 0 for (i = 0; i < n; i++) {
8025 0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
0 0 if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) {
8031 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
8041 85 28 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
113 10 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
113 0 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
8044 1 9 if (!tilde) {
8045 2 1 for (i = 0; i < n; i++) Safefree(row_names[i]);
8046 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
8053 0 9 while ((p_idx = strstr(rhs, "-1")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
8054 0 9 while ((p_idx = strstr(rhs, "+0")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
8055 0 9 while ((p_idx = strstr(rhs, "0+")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
8056 0 9 if (rhs[0] == '0' && rhs[1] == '\0') { has_intercept = FALSE; rhs[0] = '\0'; }
0 0 if (rhs[0] == '0' && rhs[1] == '\0') { has_intercept = FALSE; rhs[0] = '\0'; }
8057 0 9 while ((p_idx = strstr(rhs, "+1")) != NULL) { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
8058 0 9 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
0 0 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
8059 0 9 else if (rhs[0] == '1' && rhs[1] == '+') { memmove(rhs, rhs + 2, strlen(rhs + 2) + 1); }
0 0 else if (rhs[0] == '1' && rhs[1] == '+') { memmove(rhs, rhs + 2, strlen(rhs + 2) + 1); }
8061 0 9 while ((p_idx = strstr(rhs, "++")) != NULL) memmove(p_idx, p_idx + 1, strlen(p_idx + 1) + 1);
8062 0 9 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
8064 9 0 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
0 9 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
8068 12 9 while (chunk != NULL) {
8069 1 11 if (strcmp(chunk, ".") == 0) {
8071 3 1 for (size_t c = 0; c <= av_len(cols); c++) {
8073 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
8075 2 1 if (strcmp(col_name, lhs) != 0) {
8077 2 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
8078 1 1 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
8088 11 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
8089 3 8 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
8103 9 0 if (has_intercept) { terms[num_terms++] = savepv("Intercept"); }
8104 9 0 if (strlen(rhs_expanded) > 0) {
8106 13 9 while (chunk != NULL) {
8107 0 13 if (num_terms >= term_cap - 3) {
8112 1 12 if (star) {
8117 0 1 if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
0 0 if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0';
8118 0 1 char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
0 0 char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0';
8126 0 12 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
0 0 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
8133 24 9 for (i = 0; i < num_terms; i++) {
8135 22 24 for (size_t k = 0; k < num_uniq; k++) {
8136 0 22 if (strcmp(terms[i], uniq_terms[k]) == 0) { found = TRUE; break; }
8138 24 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
8145 24 8 for (j = 0; j < p; j++) {
8146 9 15 if (p_exp + 64 >= exp_cap) {
8154 9 15 if (strcmp(uniq_terms[j], "Intercept") == 0) {
8164 2 13 if (colon) {
8172 4 2 for (size_t e = 0; e < p_exp; e++) {
8173 1 3 if (strcmp(parent_term[e], left) == 0) l_indices[l_count++] = e;
8174 1 3 if (strcmp(parent_term[e], right) == 0) r_indices[r_count++] = e;
8177 1 1 if (l_count == 0 || r_count == 0) {
0 1 if (l_count == 0 || r_count == 0) {
8181 1 1 for (unsigned int li = 0; li < l_count; li++) {
8182 1 1 for (unsigned int ri = 0; ri < r_count; ri++) {
8183 0 1 if (p_exp >= exp_cap) {
8204 4 9 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
8208 61 4 for (i = 0; i < n; i++) {
8210 61 0 if (str_val) {
8212 87 9 for (size_t l = 0; l < num_levels; l++) {
8213 52 35 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
8215 9 52 if (!found) {
8216 0 9 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
8222 4 0 if (num_levels > 0) {
8223 5 4 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
8224 6 5 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
8225 2 4 if (strcmp(levels[l1], levels[l2]) > 0) {
8233 5 4 for (size_t l = 1; l < num_levels; l++) {
8234 0 5 if (p_exp >= exp_cap) {
8251 9 4 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
8271 64 8 for(i = 0; i < n; i++) X_mat[i] = (NV*)safemalloc(p_exp * sizeof(NV));
8272 0 8 Newx(Y, n, NV);
8274 64 8 for (i = 0; i < n; i++) {
8276 0 64 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
8279 194 64 for (j = 0; j < p_exp; j++) {
8280 64 130 if (strcmp(exp_terms[j], "Intercept") == 0) {
8282 20 110 } else if (is_interact[j]) {
8284 70 40 } else if (is_dummy[j]) {
8286 70 0 if (str_val) {
8287 32 38 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
8292 0 40 if (isnan(row_x[j])) { row_ok = FALSE; break; }
8295 0 64 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
8297 194 64 for (j = 0; j < p_exp; j++) X_mat[valid_n][j] = row_x[j];
8303 1 7 if (valid_n <= p_exp) {
8305 3 1 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
8306 3 1 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
8307 3 1 for (j = 0; j < p_exp; j++) {
8309 0 3 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
8315 2 1 for(i = 0; i < n; i++) Safefree(X_mat[i]);
8317 0 1 if (row_hashes) Safefree(row_hashes);
8318 0 3 for (i = 0; i < num_uniq; i++) { if (term_base_level[i]) Safefree(term_base_level[i]); }
3 1 for (i = 0; i < num_uniq; i++) { if (term_base_level[i]) Safefree(term_base_level[i]); }
8330 20 7 for (i = 0; i < p_exp; i++) {
8331 7 13 if (strcmp(exp_terms[i], "Intercept") == 0) continue;
8332 1 12 if (aliased_qr[i]) continue;
8339 20 7 for (i = 0; i < p_exp; i++) {
8340 19 1 if (!aliased_qr[i]) rank++;
8343 43 7 for (i = rank; i < valid_n; i++) {
8347 7 0 NV ms_res = (res_df > 0) ? rss_prev / res_df : 0.0;
8349 19 7 for (j = 0; j < num_uniq; j++) {
8350 7 12 if (strcmp(uniq_terms[j], "Intercept") == 0) continue;
8354 11 1 NV ms = (df > 0) ? ss / df : 0.0;
8359 12 0 if (ms_res > 0.0 && df > 0) {
11 1 if (ms_res > 0.0 && df > 0) {
8379 1 6 if (is_stacked) {
8384 1 0 if (e) {
8386 1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
8394 18 7 for (size_t c = 0; c <= (size_t)av_len(all_cols); c++) {
8396 18 0 if (!col_sv || !SvOK(*col_sv)) continue;
0 18 if (!col_sv || !SvOK(*col_sv)) continue;
8400 147 18 for (i = 0; i < tgt_n; i++) {
8402 98 49 if (!isnan(val)) { col_sum += val; col_count++; }
8404 15 3 NV col_mean = (col_count > 0) ? col_sum / col_count : NAN;
8415 19 7 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
8416 19 7 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
8417 20 7 for (j = 0; j < p_exp; j++) {
8419 5 15 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
8426 62 7 for (i = 0; i < n; i++) Safefree(X_mat[i]);
8429 4 15 for (i = 0; i < num_uniq; i++) { if (term_base_level[i]) Safefree(term_base_level[i]); }
19 7 for (i = 0; i < num_uniq; i++) { if (term_base_level[i]) Safefree(term_base_level[i]); }
8431 0 7 if (row_hashes) Safefree(row_hashes);
8443 1 17 if (items < 1) croak("fisher_test requires at least a data reference");
8449 6 15 for (unsigned int i = 1; i < items; i += 2) {
8450 0 6 if (i + 1 >= items) croak("fisher_test: odd number of named arguments");
8453 5 1 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
0 5 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
8455 1 0 if (!(conf_level > 0 && conf_level < 1))
1 0 if (!(conf_level > 0 && conf_level < 1))
8457 5 0 } else if (strEQ(key, "alternative")) {
8459 5 0 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
3 2 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
8460 1 2 strNE(alternative, "greater"))
8466 0 15 if (!SvROK(data_ref)) croak("fisher_test requires a reference to a 2x2 Array or Hash");
8469 11 4 if (SvTYPE(deref) == SVt_PVAV) {
8471 0 11 if (av_len(outer) != 1) croak("Outer array must have exactly 2 rows");
8474 11 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
11 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
11 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
11 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
8475 11 0 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
0 11 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
8478 10 1 if (av_len(r1) != 1 || av_len(r2) != 1)
0 10 if (av_len(r1) != 1 || av_len(r2) != 1)
8484 4 0 } else if (SvTYPE(deref) == SVt_PVHV) {
8488 0 4 if (HvUSEDKEYS(outer) != 2) croak("Outer hash must have exactly 2 keys");
0 4 if (HvUSEDKEYS(outer) != 2) croak("Outer hash must have exactly 2 keys");
8493 2 2 SV *restrict row1_sv = hv_iterval(outer, swap_rows ? e2 : e1);
8494 2 2 SV *restrict row2_sv = hv_iterval(outer, swap_rows ? e1 : e2);
8495 4 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
4 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
8496 4 0 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
0 4 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
8501 8 4 for (unsigned int rr = 0; rr < 2; rr++) {
8503 0 8 if (HvUSEDKEYS(in) != 2) croak("Inner hashes must have exactly 2 keys");
0 8 if (HvUSEDKEYS(in) != 2) croak("Inner hashes must have exactly 2 keys");
8508 3 5 HE *col0 = swap_cols ? c2 : c1;
8509 3 5 HE *col1 = swap_cols ? c1 : c2;
8517 0 13 if (a + b + c + d == 0) croak("fisher_test: table is all zeros");
8553 0 7 if (items % 2 != 0) croak("Usage: power_t_test(n => 30, delta => 0.5, sd => 1.0, ...)");
8554 27 7 for (unsigned short int i = 0; i < items; i += 2) {
8558 1 26 if (strEQ(key, "n")) sv_n = val;
8559 7 19 else if (strEQ(key, "delta")) sv_delta = val;
8560 7 12 else if (strEQ(key, "sd")) sv_sd = val;
8561 12 0 else if (strEQ(key, "sig.level") || strEQ(key, "sig_level")) sv_sig_level = val;
1 11 else if (strEQ(key, "sig.level") || strEQ(key, "sig_level")) sv_sig_level = val;
8562 6 5 else if (strEQ(key, "power")) sv_power = val;
8563 3 2 else if (strEQ(key, "type")) type = SvPV_nolen(val);
8564 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
8565 0 0 else if (strEQ(key, "strict")) strict = SvTRUE(val);
8566 0 0 else if (strEQ(key, "tol")) tol = SvNV(val);
8570 1 6 bool is_null_n = (!sv_n || !SvOK(sv_n));
0 1 bool is_null_n = (!sv_n || !SvOK(sv_n));
8571 7 0 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
0 7 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
8572 6 1 bool is_null_power = (!sv_power || !SvOK(sv_power));
0 6 bool is_null_power = (!sv_power || !SvOK(sv_power));
8573 7 0 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
0 7 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
8574 1 6 bool is_null_sig_level = (sv_sig_level && !SvOK(sv_sig_level));
0 1 bool is_null_sig_level = (sv_sig_level && !SvOK(sv_sig_level));
8577 6 1 if (is_null_n) missing_count++;
8578 0 7 if (is_null_delta) missing_count++;
8579 1 6 if (is_null_power) missing_count++;
8580 0 7 if (is_null_sd) missing_count++;
8581 0 7 if (is_null_sig_level) missing_count++;
8583 0 7 if (missing_count != 1) {
8587 1 6 NV n = is_null_n ? 0.0 : SvNV(sv_n);
8588 7 0 NV delta = is_null_delta ? 0.0 : SvNV(sv_delta);
8589 7 0 NV sd = (!sv_sd || is_null_sd) ? 1.0 : SvNV(sv_sd);
7 0 NV sd = (!sv_sd || is_null_sd) ? 1.0 : SvNV(sv_sd);
8590 1 6 NV sig_level = (!sv_sig_level || is_null_sig_level) ? 0.05 : SvNV(sv_sig_level);
1 0 NV sig_level = (!sv_sig_level || is_null_sig_level) ? 0.05 : SvNV(sv_sig_level);
8591 6 1 NV power = is_null_power ? 0.0 : SvNV(sv_power);
8592 6 1 short int tsample = (strEQ(type, "one.sample") || strEQ(type, "paired")) ? 1 : 2;
1 5 short int tsample = (strEQ(type, "one.sample") || strEQ(type, "paired")) ? 1 : 2;
8593 6 1 short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2;
6 0 short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2;
0 6 short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2;
8594 6 1 if (tside == 2 && !is_null_delta) delta = fabs(delta);
6 0 if (tside == 2 && !is_null_delta) delta = fabs(delta);
8595 1 6 if (is_null_power) {
8597 6 0 } else if (is_null_n) {
8599 0 6 while (p_body(high, delta, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0;
0 0 while (p_body(high, delta, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0;
8600 222 6 while (high - low > tol) {
8602 49 173 if (p_body(mid, delta, sd, sig_level, tsample, tside, strict) < power) low = mid;
8606 0 0 } else if (is_null_sd) {
8608 0 0 while (high - low > tol) {
8610 0 0 if (p_body(n, delta, mid, sig_level, tsample, tside, strict) > power) low = mid;
8614 0 0 } else if (is_null_delta) {
8616 0 0 while (p_body(n, high, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0;
0 0 while (p_body(n, high, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0;
8617 0 0 while (high - low > tol) {
8619 0 0 if (p_body(n, mid, sd, sig_level, tsample, tside, strict) < power) low = mid;
8623 0 0 } else if (is_null_sig_level) {
8625 0 0 while (high - low > tol) {
8627 0 0 if (p_body(n, delta, sd, mid, tsample, tside, strict) < power) low = mid;
8639 2 5 const char*restrict m_str = (tsample == 1) ? (strEQ(type, "paired") ? "Paired t test power calculation" : "One-sample t test power calculation") : "Two-sample t test power calculation";
1 1 const char*restrict m_str = (tsample == 1) ? (strEQ(type, "paired") ? "Paired t test power calculation" : "One-sample t test power calculation") : "Two-sample t test power calculation";
8641 2 5 const char*restrict n_str = (tsample == 2) ? "n is number in *each* group" : (strEQ(type, "paired") ? "n is number of *pairs*, sd is std.dev. of *differences* within pairs" : "");
1 1 const char*restrict n_str = (tsample == 2) ? "n is number in *each* group" : (strEQ(type, "paired") ? "n is number of *pairs*, sd is std.dev. of *differences* within pairs" : "");
8642 6 1 if (n_str[0] != '\0') hv_stores(ret, "note", newSVpv(n_str, 0));
8655 3 0 if (arg_idx < items && SvROK(ST(arg_idx))) {
2 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
8657 1 1 if (t == SVt_PVAV) {
8659 1 0 } else if (t == SVt_PVHV) {
8663 2 1 if (!h_sv && arg_idx < items
2 0 if (!h_sv && arg_idx < items
8664 1 1 && SvROK(ST(arg_idx))
8665 1 0 && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
8669 2 3 for (; arg_idx < items; arg_idx += 2) {
8672 1 1 if (strEQ(key, "x")) x_sv = val;
8673 1 0 else if (strEQ(key, "g")) g_sv = val;
8674 0 0 else if (strEQ(key, "h")) h_sv = val;
8678 1 2 if (h_sv && (x_sv || g_sv))
1 0 if (h_sv && (x_sv || g_sv))
0 1 if (h_sv && (x_sv || g_sv))
8688 1 2 if (h_sv) {
8689 1 0 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
0 1 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
8696 3 1 while ((he = hv_iternext(h_hv))) {
8698 3 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
0 3 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
8702 0 1 if (total < 2) croak("not enough observations");
8704 0 1 size_t num_keys = HvKEYS(h_hv);
8709 3 1 while ((he = hv_iternext(h_hv))) {
8711 0 3 const char *restrict key_str = HePV(he, klen);
8715 14 3 for (size_t i = 0; i < n_g; i++) {
8717 14 0 if (el && SvOK(*el) && looks_like_number(*el)) {
14 0 if (el && SvOK(*el) && looks_like_number(*el)) {
14 0 if (el && SvOK(*el) && looks_like_number(*el)) {
8728 2 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
2 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 2 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
8730 2 0 if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV)
2 0 if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV)
0 2 if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV)
8737 0 2 if (nx != ng) croak("kruskal_test: 'x' and 'g' must have the same length");
8738 0 2 if (nx < 2) croak("not enough observations");
8747 28 2 for (size_t i = 0; i < nx; i++) {
8750 28 0 if (x_el && SvOK(*x_el) && looks_like_number(*x_el)
28 0 if (x_el && SvOK(*x_el) && looks_like_number(*x_el)
28 0 if (x_el && SvOK(*x_el) && looks_like_number(*x_el)
8751 28 0 && g_el && SvOK(*g_el)) {
28 0 && g_el && SvOK(*g_el)) {
8756 22 6 if (id_sv) {
8772 3 0 if (valid_n < 2 || k < 2) {
0 3 if (valid_n < 2 || k < 2) {
8774 0 0 if (group_names) {
8775 0 0 for (size_t i = 0; i < k; i++) { if (group_names[i]) Safefree(group_names[i]); }
0 0 for (size_t i = 0; i < k; i++) { if (group_names[i]) Safefree(group_names[i]); }
8778 0 0 if (valid_n < 2) croak("not enough observations");
8788 42 3 for (size_t i = 0; i < valid_n; i++) {
8796 9 3 for (size_t i = 0; i < k; i++) {
8797 9 0 if (group_counts[i] > 0)
8803 0 3 if (tie_adj > 0.0) {
8820 9 3 for (size_t i = 0; i < k; i++) {
8821 9 0 if (group_counts[i] > 0 && group_names[i]) {
9 0 if (group_counts[i] > 0 && group_names[i]) {
8827 9 0 if (group_names[i]) Safefree(group_names[i]); // Clean up name copy
8852 6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
8858 6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
6 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
8863 0 6 if ((items - arg_idx) % 2 != 0) {
8867 2 6 for (; arg_idx < items; arg_idx += 2) {
8871 0 2 if (strEQ(key, "x")) x_sv = val;
8872 0 2 else if (strEQ(key, "y")) y_sv = val;
8873 1 1 else if (strEQ(key, "ratio")) ratio = SvNV(val);
8874 0 1 else if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) conf_level = SvNV(val);
0 0 else if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) conf_level = SvNV(val);
8875 0 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
8879 6 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 6 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
8881 6 0 if (!y_sv || !SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV)
6 0 if (!y_sv || !SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV)
0 6 if (!y_sv || !SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV)
8884 6 0 if (ratio <= 0.0 || !isfinite(ratio))
0 6 if (ratio <= 0.0 || !isfinite(ratio))
8886 6 0 if (conf_level <= 0.0 || conf_level >= 1.0 || !isfinite(conf_level))
6 0 if (conf_level <= 0.0 || conf_level >= 1.0 || !isfinite(conf_level))
0 6 if (conf_level <= 0.0 || conf_level >= 1.0 || !isfinite(conf_level))
8895 26 6 for (size_t i = 0; i < nx_raw; i++) {
8897 26 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
26 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
26 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
8899 26 0 if (!isnan(val) && isfinite(val)) {
26 0 if (!isnan(val) && isfinite(val)) {
8910 21 6 for (size_t i = 0; i < ny_raw; i++) {
8912 21 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
21 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
21 0 if (tv && SvOK(*tv) && looks_like_number(*tv)) {
8914 21 0 if (!isnan(val) && isfinite(val)) {
21 0 if (!isnan(val) && isfinite(val)) {
8923 1 5 if (nx < 2) croak("not enough 'x' observations");
8924 1 4 if (ny < 2) croak("not enough 'y' observations");
8930 1 3 if (var_y == 0.0) croak("var_test: variance of 'y' is zero (cannot divide by zero)");
8936 0 3 if (strcmp(alternative, "less") == 0) {
8938 0 3 } else if (strcmp(alternative, "greater") == 0) {
8945 3 0 p_val = 2.0 * (p1 < p2 ? p1 : p2);
8975 0 6 SV *restrict ret = &PL_sv_undef;
8977 0 6 if (!PL_srand_called) {
8981 0 6 if (n < 0) n = 0;
8982 6 0 if (SvROK(ref)) {
8985 3 3 if (SvTYPE(rv) == SVt_PVHV) {
8988 3 0 unsigned limit = (n < (IV)count) ? (I32)n : count;
8991 3 0 if (count > 0 && limit > 0) {
3 0 if (count > 0 && limit > 0) {
8998 12 3 while ((entry = hv_iternext(hv)))
9002 6 3 for (i = 0; i < limit; i++) {
9012 6 3 for (i = 0; i < limit; i++) {
9018 0 6 (void)hv_store(
9029 3 0 } else if (SvTYPE(rv) == SVt_PVAV) {/* --- ARRAY REFERENCE --- */
9031 0 3 size_t count = av_top_index(av) + 1; /* signed; 0 for empty AV */
9035 3 0 if (n > 0)
9037 3 0 if (count > 0) {
9042 0 3 Newx(idx, count, size_t);
9043 15 3 for (size_t i = 0; i < count; i++)
9046 6 3 for (size_t i = 0; i < limit; i++) {
9053 6 3 for (size_t i = 0; i < (size_t)n; i++) {
9054 6 0 if (i < limit) {
9057 6 0 if (sv && sv != &PL_sv_undef)
6 0 if (sv && sv != &PL_sv_undef)
9068 0 0 for (size_t i = 0; i < (size_t)n; i++)
9081 0 23 if (items < 1) {
9088 0 23 if ((items - 1) % 2 != 0) {
9091 9 23 for (size_t i = 1; i < items; i += 2) {
9094 3 6 if (strEQ(key, "mean")) mean = SvNV(val);
9095 4 2 else if (strEQ(key, "sd")) sd = SvNV(val);
9096 2 0 else if (strEQ(key, "log")) give_log = SvTRUE(val) ? 1 : 0;
9100 1 22 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
1 0 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
9105 1 0 if (n > 0) {
9107 3 1 for (IV i = 0; i < n; i++) {
9109 3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
9133 4 0 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
0 4 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
9136 4 0 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
0 4 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
9143 4 4 while ((h_entry = hv_iternext(h_hv))) {
9148 4 0 if (i_fetch_he) {
9151 3 1 if (SvROK(h_row_sv) && SvTYPE(SvRV(h_row_sv)) == SVt_PVHV && SvROK(i_row_sv)) {
3 0 if (SvROK(h_row_sv) && SvTYPE(SvRV(h_row_sv)) == SVt_PVHV && SvROK(i_row_sv)) {
3 0 if (SvROK(h_row_sv) && SvTYPE(SvRV(h_row_sv)) == SVt_PVHV && SvROK(i_row_sv)) {
9154 2 1 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
9158 2 2 while ((i_entry = hv_iternext(i_row_hv))) {
9163 1 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
9169 2 1 for (SSize_t idx = 0; idx < top_idx; idx += 2) {
9173 2 0 if (key_svp && val_svp) {
2 0 if (key_svp && val_svp) {
9191 13 1 if (!SvROK(h_ref) || (SvTYPE(SvRV(h_ref)) != SVt_PVHV && SvTYPE(SvRV(h_ref)) != SVt_PVAV)) {
2 11 if (!SvROK(h_ref) || (SvTYPE(SvRV(h_ref)) != SVt_PVHV && SvTYPE(SvRV(h_ref)) != SVt_PVAV)) {
0 2 if (!SvROK(h_ref) || (SvTYPE(SvRV(h_ref)) != SVt_PVHV && SvTYPE(SvRV(h_ref)) != SVt_PVAV)) {
9194 12 1 if (!SvROK(i_ref) || (SvTYPE(SvRV(i_ref)) != SVt_PVHV && SvTYPE(SvRV(i_ref)) != SVt_PVAV)) {
2 10 if (!SvROK(i_ref) || (SvTYPE(SvRV(i_ref)) != SVt_PVHV && SvTYPE(SvRV(i_ref)) != SVt_PVAV)) {
0 2 if (!SvROK(i_ref) || (SvTYPE(SvRV(i_ref)) != SVt_PVHV && SvTYPE(SvRV(i_ref)) != SVt_PVAV)) {
9197 10 2 target_root_mode = (SvTYPE(SvRV(h_ref)) == SVt_PVHV) ? 1 : 2;
9198 10 2 i_root_mode = (SvTYPE(SvRV(i_ref)) == SVt_PVHV) ? 1 : 2;
9200 10 2 if (target_root_mode == 1) {
9202 0 10 if (HvKEYS(h_hv) > 0) {
8 2 if (HvKEYS(h_hv) > 0) {
9205 43 0 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
35 8 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
9206 8 35 for (HE *restrict p_entry = probe_array[p_idx]; p_entry && target_inner_mode == 0; p_entry = HeNEXT(p_entry)) {
8 0 for (HE *restrict p_entry = probe_array[p_idx]; p_entry && target_inner_mode == 0; p_entry = HeNEXT(p_entry)) {
9208 8 0 if (SvROK(val)) {
9209 5 3 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
9210 3 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
9218 2 2 for (SSize_t p_idx = 0; p_idx <= top && target_inner_mode == 0; p_idx++) {
2 0 for (SSize_t p_idx = 0; p_idx <= top && target_inner_mode == 0; p_idx++) {
9220 2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
9221 2 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
9222 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
9227 2 10 if (target_inner_mode == 0) {
9228 2 0 if (i_root_mode == 1) {
9230 0 2 if (HvKEYS(i_hv) > 0) {
2 0 if (HvKEYS(i_hv) > 0) {
9233 15 1 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
14 1 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
9234 2 14 for (HE *restrict p_entry = probe_array[p_idx]; p_entry && target_inner_mode == 0; p_entry = HeNEXT(p_entry)) {
2 0 for (HE *restrict p_entry = probe_array[p_idx]; p_entry && target_inner_mode == 0; p_entry = HeNEXT(p_entry)) {
9236 2 0 if (SvROK(val)) {
9237 1 1 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
9238 1 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
9246 0 0 for (SSize_t p_idx = 0; p_idx <= top && target_inner_mode == 0; p_idx++) {
0 0 for (SSize_t p_idx = 0; p_idx <= top && target_inner_mode == 0; p_idx++) {
9248 0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
9249 0 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
9250 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
9255 0 12 if (target_inner_mode == 0) { target_inner_mode = 1; }
9260 10 2 if (i_root_mode == 1) {
9271 30 6 if (i_root_mode == 1) {
9273 10 20 if (!i_entry) break;
9277 2 18 current_idx = looks_like_number(row_key_sv) ? SvIV(row_key_sv) : -1;
9279 2 4 if (i_idx > i_top) break;
9282 4 0 if (!svp || !*svp) continue;
0 4 if (!svp || !*svp) continue;
9287 23 1 if (SvROK(i_row_sv)) {
9292 18 5 if (target_root_mode == 1) {
9294 9 9 if (h_fetch_he) h_row_sv = HeVAL(h_fetch_he);
9296 4 1 if (current_idx >= 0) {
9298 2 2 if (h_fetch_svp && *h_fetch_svp) h_row_sv = *h_fetch_svp;
2 0 if (h_fetch_svp && *h_fetch_svp) h_row_sv = *h_fetch_svp;
9301 11 12 if (h_row_sv && SvROK(h_row_sv)) {
11 0 if (h_row_sv && SvROK(h_row_sv)) {
9302 7 4 if (SvTYPE(SvRV(h_row_sv)) == SVt_PVHV) {
9304 4 0 } else if (SvTYPE(SvRV(h_row_sv)) == SVt_PVAV) {
9309 16 7 if (!h_row_hv && !h_row_av) {
12 4 if (!h_row_hv && !h_row_av) {
9310 3 9 if (target_inner_mode == 2) {
9317 9 3 if (target_root_mode == 1) {
9320 2 1 if (current_idx >= 0) {
9326 16 7 if (h_row_hv) {
9327 12 4 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
9332 13 12 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
9337 4 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
9341 6 4 for (SSize_t idx = 0; idx < inner_top_idx; idx += 2) {
9344 6 0 if (key_svp && *key_svp && val_svp) {
6 0 if (key_svp && *key_svp && val_svp) {
6 0 if (key_svp && *key_svp && val_svp) {
9345 6 0 SV *restrict val_to_store = *val_svp ? *val_svp : &PL_sv_undef;
9350 7 0 } else if (h_row_av) {
9351 5 2 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
9355 11 5 for (SSize_t idx = 0; idx <= inner_top_idx; ++idx) {
9357 11 0 if (val_svp) {
9358 11 0 SV *restrict val_to_push = *val_svp ? *val_svp : &PL_sv_undef;
9360 11 0 if (sv_inc) {
9365 2 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
9370 2 2 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
9373 2 0 if (col_key_sv && col_val) {
2 0 if (col_key_sv && col_val) {
9376 2 0 if (sv_key_inc && sv_val_inc) {
2 0 if (sv_key_inc && sv_val_inc) {
9393 1 10 if (items == 0) {
9397 1 9 if (!SvOK(arg1)) {
9403 2 7 if (!SvROK(arg1)) {
9404 4 2 for (unsigned i = 0; i < items; i++) {
9409 1 6 if (SvTYPE(rv) == SVt_PVAV) {
9412 3 1 for (unsigned i = 0; i < len; i++) {
9414 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
9416 6 0 } else if (SvTYPE(rv) == SVt_PVHV) { // CASES 3, 4, 5: Hash Reference
9419 3 3 if (items > 1) {
9425 1 2 if (col_svp && SvROK(*col_svp) && SvTYPE(SvRV(*col_svp)) == SVt_PVAV) {
1 0 if (col_svp && SvROK(*col_svp) && SvTYPE(SvRV(*col_svp)) == SVt_PVAV) {
1 0 if (col_svp && SvROK(*col_svp) && SvTYPE(SvRV(*col_svp)) == SVt_PVAV) {
9428 3 1 for (unsigned i = 0; i < len; i++) {
9430 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
9436 6 2 while ((he = hv_iternext(hv))) {
9438 6 0 if (SvROK(inner_sv)) {
9440 6 0 if (SvTYPE(inner_rv) == SVt_PVHV) {// CASE 5: Hash of Hashes
9443 3 3 if (valp) increment_count(aTHX_ counts_hv, *valp);
9444 0 0 } else if (SvTYPE(inner_rv) == SVt_PVAV) {// CASE 4: Hash of Arrays (Row-Oriented)
9445 0 0 if (looks_like_number(arg2)) {
9449 0 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
9458 8 3 while ((he = hv_iternext(hv))) {
9460 5 3 if (SvROK(val)) {// --- SAFETY CHECK
9463 2 3 if (SvTYPE(inner_rv) == SVt_PVAV) {
9466 6 2 for (unsigned i = 0; i < len; i++) {
9468 6 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
9470 3 0 } else if (SvTYPE(inner_rv) == SVt_PVHV) {
9475 4 3 while ((inner_he = hv_iternext(inner_hv))) {
9534 1 7 if (!SvOK(data_ref)) {
9537 1 6 if (!SvOK(target_key_sv)) {
9540 1 5 if (!SvOK(group_key_sv)) {
9544 0 5 if (!SvROK(data_ref)) {
9547 2 3 if (items > 3) { /* Capture the optional filter argument */
9549 2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
9557 2 3 if (SvTYPE(SvRV(data_ref)) == SVt_PVAV) { /* Input is an Array of Hashes (AoH) */
9560 8 2 for (SSize_t i = 0; i < len; i++) {
9562 8 0 if (row_svp && SvROK(*row_svp) && SvTYPE(SvRV(*row_svp)) == SVt_PVHV) {
8 0 if (row_svp && SvROK(*row_svp) && SvTYPE(SvRV(*row_svp)) == SVt_PVHV) {
8 0 if (row_svp && SvROK(*row_svp) && SvTYPE(SvRV(*row_svp)) == SVt_PVHV) {
9566 8 0 if (group_he) {
9568 7 1 SV *restrict target_val = target_he ? HeVAL(target_he) : NULL;
9569 7 1 if (target_val && SvOK(target_val)) {
7 0 if (target_val && SvOK(target_val)) {
9571 4 3 if (filter_hv) {
9574 4 2 while ((f_he = hv_iternext(filter_hv))) {
9578 4 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
9580 4 0 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
9581 2 2 if (!keep) {
9587 5 2 if (pass_filter) {
9590 1 4 if (res_he) {
9602 3 0 } else if (SvTYPE(SvRV(data_ref)) == SVt_PVHV) {
9606 2 1 if (group_he && target_he &&
2 0 if (group_he && target_he &&
9607 2 0 SvROK(HeVAL(group_he)) && SvTYPE(SvRV(HeVAL(group_he))) == SVt_PVAV &&
2 0 SvROK(HeVAL(group_he)) && SvTYPE(SvRV(HeVAL(group_he))) == SVt_PVAV &&
9608 2 0 SvROK(HeVAL(target_he)) && SvTYPE(SvRV(HeVAL(target_he))) == SVt_PVAV) {
2 0 SvROK(HeVAL(target_he)) && SvTYPE(SvRV(HeVAL(target_he))) == SVt_PVAV) {
9614 8 2 for (SSize_t i = 0; i < len; i++) {
9617 8 0 if (g_svp && *g_svp) {
8 0 if (g_svp && *g_svp) {
9619 8 0 SV *restrict t_val = (t_svp && *t_svp) ? *t_svp : NULL;
8 0 SV *restrict t_val = (t_svp && *t_svp) ? *t_svp : NULL;
9620 8 0 if (t_val && SvOK(t_val)) {
7 1 if (t_val && SvOK(t_val)) {
9622 4 3 if (filter_hv) {
9625 4 2 while ((f_he = hv_iternext(filter_hv))) {
9630 4 0 if (arr_he && SvROK(HeVAL(arr_he)) && SvTYPE(SvRV(HeVAL(arr_he))) == SVt_PVAV) {
4 0 if (arr_he && SvROK(HeVAL(arr_he)) && SvTYPE(SvRV(HeVAL(arr_he))) == SVt_PVAV) {
4 0 if (arr_he && SvROK(HeVAL(arr_he)) && SvTYPE(SvRV(HeVAL(arr_he))) == SVt_PVAV) {
9633 4 0 if (val_svp) val_sv = *val_svp;
9636 4 0 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
0 4 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
4 0 EVAL_FILTER(f_sub, val_sv, keep);
9637 2 2 if (!keep) {
9643 5 2 if (pass_filter) {
9646 1 4 if (res_he) {
9660 5 1 while ((row_he = hv_iternext(data_hv))) {
9662 5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
9666 5 0 if (inner_group_he) {
9668 4 1 SV *restrict t_val = inner_target_he ? HeVAL(inner_target_he) : NULL;
9669 4 1 if (t_val && SvOK(t_val)) {
3 1 if (t_val && SvOK(t_val)) {
9671 0 3 if (filter_hv) {
9674 0 0 while ((f_he = hv_iternext(filter_hv))) {
9678 0 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
9680 0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
0 0 EVAL_FILTER(f_sub, val_sv, keep);
9681 0 0 if (!keep) {
9687 3 0 if (pass_filter) {
9690 1 2 if (res_he) {
9720 11 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
10 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
9722 2 8 if (t == SVt_PVAV || t == SVt_PVHV) {
2 0 if (t == SVt_PVAV || t == SVt_PVHV) {
9728 2 10 if ((items - arg_idx) % 2 != 0) croak("Usage: prcomp($data, key => value, ...)");
9729 4 10 for (; arg_idx < items; arg_idx += 2) {
9732 0 4 if (strEQ(key, "x")) x_sv = val;
9733 0 4 else if (strEQ(key, "retx")) retx = SvTRUE(val);
9734 0 4 else if (strEQ(key, "center")) center = SvTRUE(val);
9735 2 2 else if (strEQ(key, "scale")) do_scale = SvTRUE(val);
9736 1 1 else if (strEQ(key, "tol")) tol = SvOK(val) ? SvNV(val) : -1.0;
1 0 else if (strEQ(key, "tol")) tol = SvOK(val) ? SvNV(val) : -1.0;
9737 1 0 else if (strEQ(key, "rank")) rank_opt = SvOK(val) ? (long)SvIV(val) : -1;
1 0 else if (strEQ(key, "rank")) rank_opt = SvOK(val) ? (long)SvIV(val) : -1;
9741 9 1 if (!x_sv || !SvROK(x_sv))
0 9 if (!x_sv || !SvROK(x_sv))
9750 7 2 if (SvTYPE(ref) == SVt_PVAV) {
9753 6 1 if (n_raw > 0) {
9755 6 0 if (first && SvROK(*first) && SvTYPE(SvRV(*first)) == SVt_PVAV) {
6 0 if (first && SvROK(*first) && SvTYPE(SvRV(*first)) == SVt_PVAV) {
6 0 if (first && SvROK(*first) && SvTYPE(SvRV(*first)) == SVt_PVAV) {
9760 2 0 } else if (SvTYPE(ref) == SVt_PVHV) {
9762 2 0 if (hv_iterinit(hv) > 0) {
9765 2 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 1 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
9768 1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
9775 8 1 if (n_raw == 0 || (p == 0 && !is_hoa && !is_hoh)) croak("prcomp: input matrix is empty or has zero columns");
2 6 if (n_raw == 0 || (p == 0 && !is_hoa && !is_hoh)) croak("prcomp: input matrix is empty or has zero columns");
1 1 if (n_raw == 0 || (p == 0 && !is_hoa && !is_hoh)) croak("prcomp: input matrix is empty or has zero columns");
0 1 if (n_raw == 0 || (p == 0 && !is_hoa && !is_hoh)) croak("prcomp: input matrix is empty or has zero columns");
9778 1 7 if (is_hoh) {
9784 0 1 if (p == 0) croak("prcomp: inner hashes cannot be empty");
9788 2 1 while ((entry = hv_iternext(inner))) {
9792 1 6 } else if (is_hoa) {
9795 0 1 if (p == 0) croak("prcomp: input hash is empty");
9799 2 1 while ((entry = hv_iternext(hv))) {
9807 6 2 if (is_aoa) {
9809 18 6 for (size_t i = 0; i < n_raw; i++) {
9811 18 0 if (row_sv && SvROK(*row_sv) && SvTYPE(SvRV(*row_sv)) == SVt_PVAV) {
18 0 if (row_sv && SvROK(*row_sv) && SvTYPE(SvRV(*row_sv)) == SVt_PVAV) {
18 0 if (row_sv && SvROK(*row_sv) && SvTYPE(SvRV(*row_sv)) == SVt_PVAV) {
9814 36 18 for (size_t j = 0; j < p; j++) {
9816 36 0 if (cell_sv && SvOK(*cell_sv) && looks_like_number(*cell_sv)) {
36 0 if (cell_sv && SvOK(*cell_sv) && looks_like_number(*cell_sv)) {
35 1 if (cell_sv && SvOK(*cell_sv) && looks_like_number(*cell_sv)) {
9818 0 35 if (!isfinite(v)) row_ok = FALSE;
9822 17 1 if (row_ok) n++;
9825 1 1 } else if (is_hoa) {
9828 2 1 for (size_t j = 0; j < p; j++) {
9832 3 1 for (size_t i = 0; i < n_raw; i++) {
9834 6 3 for (size_t j = 0; j < p; j++) {
9836 6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
9838 0 6 if (!isfinite(v)) row_ok = FALSE;
9842 3 0 if (row_ok) n++;
9845 1 0 } else if (is_hoh) {
9849 3 1 while ((entry = hv_iternext(hv))) {
9852 6 3 for (size_t j = 0; j < p; j++) {
9854 6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
6 0 if (cell && SvOK(*cell) && looks_like_number(*cell)) {
9856 0 6 if (!isfinite(v)) row_ok = FALSE;
9860 3 0 if (row_ok) n++;
9863 0 8 if (n == 0) {
9864 0 0 if (colnames) {
9865 0 0 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
9874 15 7 for (size_t j = 0; j < p; j++) {
9876 43 15 for (size_t i = 0; i < n; i++) col_sum += X_mat[i * p + j];
9877 15 0 if (center) {
9879 43 15 for (size_t i = 0; i < n; i++) X_mat[i * p + j] -= cen_vec[j];
9881 3 12 if (do_scale) {
9883 9 3 for (size_t i = 0; i < n; i++) {
9884 9 0 NV val = X_mat[i * p + j] - (center ? 0 : (col_sum / n));
9887 3 0 sc_vec[j] = (n > 1) ? sqrt(sum_sq / (n - 1)) : 0.0;
9888 1 2 if (sc_vec[j] <= 1e-15) {
9890 0 1 if (colnames) { for (size_t k = 0; k < p; k++) Safefree(colnames[k]); Safefree(colnames); }
0 0 if (colnames) { for (size_t k = 0; k < p; k++) Safefree(colnames[k]); Safefree(colnames); }
9893 6 2 for (size_t i = 0; i < n; i++) X_mat[i * p + j] /= sc_vec[j];
9898 20 7 for (size_t i = 0; i < n; i++) {
9899 40 20 for (size_t j = 0; j < p; j++) {
9900 60 40 for (size_t k = j; k < p; k++) {
9906 14 7 for (size_t j = 0; j < p; j++) {
9907 7 14 for (size_t k = 0; k < j; k++) {
9917 1 6 if (rank_opt > 0 && rank_opt < (long)k_cols) k_cols = (size_t)rank_opt;
1 0 if (rank_opt > 0 && rank_opt < (long)k_cols) k_cols = (size_t)rank_opt;
9919 7 0 NV n_adj = (n > 1) ? (NV)(n - 1) : 1.0;
9920 13 7 for (size_t j = 0; j < k_cols; j++) {
9922 0 13 if (e_val < 0.0) e_val = 0.0; // clamp floating point inaccuracy
9925 1 6 if (tol >= 0.0) {
9928 2 1 for (size_t j = 0; j < k_cols; j++) {
9929 1 1 if (sdev[j] > threshold) rank_est++;
9931 1 0 if (rank_est < k_cols) k_cols = rank_est;
9936 12 7 for (size_t j = 0; j < k_cols; j++) av_push(sdev_av, newSVnv(sdev[j]));
9939 14 7 for (size_t j = 0; j < p; j++) {
9941 24 14 for (size_t m = 0; m < k_cols; m++) {
9947 7 0 if (retx) {
9949 20 7 for (size_t i = 0; i < n; i++) {
9951 34 20 for (size_t m = 0; m < k_cols; m++) {
9953 68 34 for (size_t c = 0; c < p; c++) {
9962 2 5 if (colnames) {
9964 4 2 for (size_t j = 0; j < p; j++) {
9969 7 0 if (center) {
9971 14 7 for (size_t j = 0; j < p; j++) av_push(c_av, newSVnv(cen_vec[j]));
9976 1 6 if (do_scale) {
9978 2 1 for (size_t j = 0; j < p; j++) av_push(sc_av, newSVnv(sc_vec[j]));
9984 2 5 if (colnames) {
9985 4 2 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
10002 0 38 SvGETMAGIC(input_ref);
0 0 SvGETMAGIC(input_ref);
10003 1 37 if (!SvROK(input_ref))
10006 14 23 if (ref_type == SVt_PVHV) {// ── Hash-of-Hashes
10012 23 12 while ((he_row = hv_iternext(in_hv))) {
10016 0 23 SvGETMAGIC(row_val);
0 0 SvGETMAGIC(row_val);
10018 22 1 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
1 21 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
10022 33 21 while ((he_col = hv_iternext(in_inner_hv))) {
10027 0 33 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
10029 14 19 if (out_inner_he) {
10031 14 0 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
0 14 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
10037 0 19 if (!hv_store_ent(out_hv, col_key_sv, inner_ref, 0)) {
10043 0 33 if (!hv_store_ent(out_inner_hv, row_key_sv, val, 0)) {
10049 22 1 } else if (ref_type == SVt_PVAV) { // Array-of-Arrays
10055 21 1 if (nrows > 0) {// Pass 1: validate all rows; fix ncols from row 0
10058 20 1 if (!elem || !*elem)
0 20 if (!elem || !*elem)
10060 0 20 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
10061 19 1 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
1 18 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
10065 19 16 for (SSize_t i = 1; i < nrows; i++) {
10068 19 0 if (!elem || !*elem)
0 19 if (!elem || !*elem)
10070 0 19 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
10071 19 0 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
0 19 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
10074 2 17 if (row_ncols != ncols)
10080 15 1 if (ncols > 0) {
10082 32 15 for (SSize_t j = 0; j < ncols; j++) {
10085 0 32 if (!av_store(out_av, j, col_ref)) {
10091 67 32 for (SSize_t i = 0; i < nrows; i++) {
10093 67 0 if (elem && *elem) {
67 0 if (elem && *elem) {
10094 0 67 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
10098 63 4 SV *restrict val = (val_ptr && *val_ptr) ? *val_ptr : &PL_sv_undef;
63 0 SV *restrict val = (val_ptr && *val_ptr) ? *val_ptr : &PL_sv_undef;
10099 0 67 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
10101 0 67 if (!av_store(out_col_av, i, val)) {