Branch Coverage

LikeR.xs
Criterion Covered Total %
branch 4350 6266 69.4


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 106224 185767 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 176 70 for (size_t k = 0; k < n; k++) {
352 176 70 for (size_t k = 0; k < n; k++) {
355 175 1 if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) {
0 175 if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) {
358 3 1 for (size_t i = 0; i < n; i++) {
367 465 175 for (size_t j = 0; j < n; j++) A[k * n + j] *= pivot;
368 465 175 for (size_t i = 0; i < n; i++) {
369 290 175 if (i != k && A[i * n + k] != 0.0) {
284 6 if (i != k && A[i * n + k] != 0.0) {
372 806 284 for (size_t j = 0; j < n; j++) {
385 1184 621 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 621 0 } else if (data_hoa) {
393 621 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
621 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
621 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
398 1805 0 if (val && SvOK(*val)) {
1802 3 if (val && SvOK(*val)) {
399 1753 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 1837 0 if (!term || term[0] == '\0') return NAN;
0 1837 if (!term || term[0] == '\0') return NAN;
430 32 1805 if (colon) {
435 32 0 if (isnan(left) || isnan(right)) return NAN;
0 32 if (isnan(left) || isnan(right)) return NAN;
438 0 1805 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 89 1 for (size_t i = 0; i < n; i++) {
463 55 34 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 34 0 } else if (data_hoa) {
471 34 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
34 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
34 0 if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) {
476 57 32 if (val && SvOK(*val)) {
57 0 if (val && SvOK(*val)) {
477 47 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 8623 if (fabs(d) < FPMIN) d = FPMIN;
629 183197 0 for (m = 1; m <= MAX_ITER; m++) {
633 0 183197 if (fabs(d) < FPMIN) d = FPMIN;
635 0 183197 if (fabs(c) < FPMIN) c = FPMIN;
639 0 183197 if (fabs(d) < FPMIN) d = FPMIN;
641 0 183197 if (fabs(c) < FPMIN) c = FPMIN;
643 8623 174574 if (fabs(del - 1.0) < EPS) break;
649 5 8664 if (x <= 0.0) return 0.0;
650 41 8623 if (x >= 1.0) return 1.0;
652 7033 1590 if (x < (a + 1.0) / (a + b + 2.0)) return bt * _incbeta_cf(a, b, x) / a;
659 2 8363 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 115 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 304 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 11 8 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 163 0 const size_t sep_len = sep ? strlen(sep) : 0;
977 140471 163 for (size_t i = 0; i < n; i++) {
978 140310 161 if (i && sep_len) PerlIO_write(fh, sep, sep_len);
140310 0 if (i && sep_len) PerlIO_write(fh, sep, sep_len);
980 140471 0 if (!f || !*f) continue; /* undef/empty -> print nothing */
51 140420 if (!f || !*f) continue; /* undef/empty -> print nothing */
983 140412 8 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
140411 1 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
1 140410 if (strchr(f, '"') || strchr(f, '\n') || strchr(f, '\r')) {
985 140410 0 } else if (sep_len && strstr(f, sep)) {
9 140401 } else if (sep_len && strstr(f, sep)) {
988 140401 19 if (!need_quotes) {
992 150 19 for (const char *restrict p = f; *p; p++) {
993 9 141 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];
1095 0 6 if (k < 0) return 0.0;
1096 1 5 if (k >= max_v) return 1.0;
1101 41 5 for (int i = 1; i <= n; i++) {
1102 1541 41 for (int j = max_v; j >= i; j--) w[j] += w[j - i];
1106 177 5 for (int i = 0; i <= k; i++) cum_p += w[i];
1122 0 11 if (n == 0) return 0.0;
1127 113 11 while (i < n) {
1129 110 11 while (j < n && ri[j].val == ri[i].val) j++;
8 102 while (j < n && ri[j].val == ri[i].val) j++;
1131 121 113 for (size_t k = i; k < j; k++) ri[k].rank = r;
1133 6 107 if (t > 1) { *has_ties = 1; tie_adj += ((NV)t * t * t - t); }
1151 0 39 if (n == 0) return 1.0;
1152 0 39 if (n < 0) return 1.0 / r_pow_di(x, -n);
1154 399 39 for (int i = 0; i < n; i++) val *= x;
1162 0 0 if(x <= 0.) {
1163 0 0 if(lower) p = 0.;
1165 0 0 } else if(x < 1.) {
1170 0 0 for(k = 1; k < k_max; k += 2) {
1174 0 0 if(!lower) p = 1.0 - p;
1179 0 0 if(lower) {
1184 0 0 while(fabs(old_val - new_val) > tol) {
1197 133 7 for(unsigned int i = 0; i < m; i++) {
1198 2527 133 for(unsigned int j = 0; j < m; j++) {
1200 48013 2527 for(unsigned int k = 0; k < m; k++) s += A[i * m + k] * B[k * m + j];
1207 1 5 if(n == 1) {
1208 361 1 for(int i = 0; i < m * m; i++) V[i] = A[i];
1216 3 2 if((n % 2) == 0) {
1217 1083 3 for(int i = 0; i < m * m; i++) V[i] = B[i];
1223 0 5 if(V[(m / 2) * m + (m / 2)] > 1e140) {
1224 0 0 for(int i = 0; i < m * m; i++) V[i] = V[i] * 1e-140;
1238 19 1 for(int i = 0; i < m; i++) {
1239 361 19 for(int j = 0; j < m; j++) {
1240 153 208 if(i - j + 1 < 0) H[i * m + j] = 0;
1244 19 1 for(int i = 0; i < m; i++) {
1248 1 0 H[(m - 1) * m] += ((2 * h - 1 > 0) ? r_pow_di(2 * h - 1, m) : 0);
1250 19 1 for(int i = 0; i < m; i++) {
1251 361 19 for(int j = 0; j < m; j++) {
1252 190 171 if(i - j + 1 > 0) {
1253 1330 190 for(int g = 1; g <= i - j + 1; g++) H[i * m + j] /= g;
1262 50 1 for(int i = 1; i <= n; i++) {
1264 0 50 if(s < 1e-140) {
1281 285 24 while(i < nx || j < ny) {
15 9 while(i < nx || j < ny) {
1283 285 15 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
231 54 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
126 105 if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j];
1284 54 15 else if (i < nx) val = x[i];
1286 456 24 while(i < nx && x[i] <= val) i++;
180 276 while(i < nx && x[i] <= val) i++;
1287 357 63 while(j < ny && y[j] <= val) j++;
120 237 while(j < ny && y[j] <= val) j++;
1291 78 222 if (diff > max_d_plus) max_d_plus = diff;
1292 45 255 if (-diff > max_d_minus) max_d_minus = -diff;
1293 93 207 if (fabs(diff) > max_d) max_d = fabs(diff);
1302 1790 3160 if (two_sided) return (fabs(r - s) >= q);
1312 120 9 for(unsigned int j = 1; j <= n; j++) {
1313 24 96 if(psmirnov_exact_test(q, 0., j / nd, two_sided)) u[j] = 1.;
1316 180 9 for(unsigned int i = 1; i <= m; i++) {
1317 104 76 if(psmirnov_exact_test(q, i / md, 0., two_sided)) u[0] = 1.;
1318 4650 180 for(int j = 1; j <= n; j++) {
1319 1166 3484 if(psmirnov_exact_test(q, i / md, j / nd, two_sided)) u[j] = 1.;
1334 0 229 if (nu < 1e-7) nu = 1e-7;
1342 0 229 if (strict && tside == 2) {
0 0 if (strict && tside == 2) {
1355 0 6 if (p <= 0.0) return 0.0;
1356 0 6 if (p >= 1.0) return INFINITY;
1359 14 6 while (pf(high, df1, df2) < p) {
1362 0 14 if (high > 1e100) break; /* Fallback limit */
1366 251 0 for (unsigned short int i = 0; i < 150; i++) {
1370 122 129 if (p_mid < p) {
1375 6 245 if (high - low < 1e-12) break;
1407 6 3 for (size_t g = 0; g < k; g++) {
1412 30 6 for (size_t i = 0; i < ng; i++) sum += data[offset + i];
1417 30 6 for (size_t i = 0; i < ng; i++) {
1427 30 3 for (IV i = 0; i < (IV)total_n; i++) grand_mean += data[i];
1432 0 3 if (var_equal) {/* ── Classic one-way ANOVA
1435 0 0 for (size_t g = 0; g < k; g++) {
1451 6 3 for (size_t g = 0; g < k; g++) { w_i[g] = n_i[g] / v_i[g]; sum_w += w_i[g]; }
1453 6 3 for (size_t g = 0; g < k; g++) wgrand += w_i[g] * m_i[g];
1456 6 3 for (size_t g = 0; g < k; g++) {
1462 6 3 for (size_t g = 0; g < k; g++) {
1468 3 0 res.denom_df = (tmp > 0.0) ? (1.0 / (3.0 * tmp)) : 1e300;
1471 6 3 for (size_t g = 0; g < k; g++) {
1478 3 0 res.ms_between = (df1 > 0.0) ? ssbg / df1 : 0.0;
1479 3 0 res.ms_within = (res.denom_df > 0.0) ? sswg / res.denom_df : 0.0;
1498 1 3 if (!tilde) return 0;
1503 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--;
1504 0 3 if (l_end < l_start) return 0; /* empty LHS */
1508 6 0 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
3 3 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
1510 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--;
1511 0 3 if (r_end < r_start) return 0; /* empty RHS */
1555 1 1 if (n != nl) {
1561 0 1 if (n < 2) {
1573 6 1 for (IV i = 0; i < n; i++) {
1575 6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
1578 7 2 for (size_t g = 0; g < ngroups; g++) {
1579 4 3 if (strEQ(group_names[g], label)) { gidx = (IV)g; break; }
1581 2 4 if (gidx < 0) {
1582 0 2 if (ngroups >= OWT_MAX_GROUPS) {
1598 0 1 if (ngroups < 2) {
1601 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1608 6 1 for (unsigned i = 0; i < n; i++) out_sizes[obs_group[i]]++;
1611 2 1 for (size_t g = 0; g < ngroups; g++) {
1612 0 2 if (out_sizes[g] < 2) {
1616 0 0 for (size_t gg = 0; gg < ngroups; gg++) Safefree(group_names[gg]);
1625 1 1 for (size_t g = 1; g < ngroups; g++)
1627 6 1 for (IV i = 0; i < n; i++) {
1629 6 0 NV val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
6 0 NV val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
1638 1 0 if (out_names) {
1641 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1665 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;
1666 0 25 if (sigma < 0.0) {
1670 0 25 if (isinf(sigma)) return 0.0;
1671 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
1673 0 25 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
0 0 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
1677 25 0 if (isnan(x) || isinf(x)) return 0.0;
0 25 if (isnan(x) || isinf(x)) return 0.0;
1680 0 25 if (x >= 2.0 * sqrt(DBL_MAX)) return 0.0;
1681 1 24 if (give_log) {
1685 22 2 if (x < 5.0) {
1689 0 2 if (x > sqrt(-2.0 * M_LN2 * (DBL_MIN_EXP + 1.0 - DBL_MANT_DIG))) {
1702 14 7 for (size_t i = 0; i < n; i++) {
1703 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;
1708 14 7 for (size_t i = 0; i < n; i++) { b[i] = d[i]; z[i] = 0.0; }
1709 14 0 for (int iter = 1; iter <= 50; iter++) {
1711 14 14 for (size_t i = 0; i < n - 1; i++) {
1712 14 14 for (size_t j = i + 1; j < n; j++) sm += fabs(A[i * n + j]);
1714 7 7 if (sm == 0.0) break;
1715 7 0 NV tresh = (iter < 4) ? 0.2 * sm / (n * n) : 0.0;
1716 7 7 for (size_t i = 0; i < n - 1; i++) {
1717 7 7 for (size_t j = i + 1; j < n; j++) {
1719 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])) {
1721 7 0 } else if (fabs(A[i * n + j]) > tresh) {
1724 0 7 if (fabs(h) + g == fabs(h)) {
1729 1 6 if (theta < 0.0) t = -t;
1740 0 7 for (size_t k = 0; k < i; k++) {
1745 0 7 for (size_t k = i + 1; k < j; k++) {
1750 0 7 for (size_t k = j + 1; k < n; k++) {
1755 14 7 for (size_t k = 0; k < n; k++) {
1763 14 7 for (size_t i = 0; i < n; i++) {
1771 7 7 for (size_t i = 0; i < n - 1; i++) {
1774 7 7 for (size_t j = i + 1; j < n; j++) {
1775 6 1 if (d[j] > max_val) {
1780 6 1 if (max_k != i) {
1783 12 6 for (size_t k = 0; k < n; k++) {
1794 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)) {
1805 0 5 PUSHMARK(SP);
1806 0 5 EXTEND(SP, 2);
1812 4 0 SV *restrict ret = (count > 0) ? newSVsv(POPs) : newSV(0);
1814 4 0 FREETMPS;
1821 13 2 for (size_t cc = 0; cc < ncols; cc++) {
1822 7 6 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
5 2 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
1839 70 15 if (ctx->is_aoh) {
1841 69 1 return (p && *p) ? *p : NULL;
69 0 return (p && *p) ? *p : NULL;
1844 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;
1846 15 0 return (vp && *vp) ? *vp : NULL;
15 0 return (vp && *vp) ? *vp : NULL;
1850 101 0 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
101 0 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
0 101 if (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV)
1854 101 0 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
0 101 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
1856 93 8 if (strEQ(op, "and") || strEQ(op, "or")) {
4 89 if (strEQ(op, "and") || strEQ(op, "or")) {
1859 12 0 bool L = filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1860 8 4 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
6 2 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
6 0 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
4 2 if (op[0] == 'a') return L ? filt_eval(aTHX_ (rp ? *rp : NULL), ctx) : 0; // and
1861 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
1863 4 85 if (strEQ(op, "not")) {
1865 4 0 return !filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1869 85 0 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
0 85 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
1873 84 1 if (!cell || !SvOK(cell)) return 0; // missing / undef cell never matches
1 83 if (!cell || !SvOK(cell)) return 0; // missing / undef cell never matches
1874 83 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
83 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
1875 38 45 if (strEQ(op, ">")) return SvNV(cell) > SvNV(val);
1876 7 38 if (strEQ(op, "<")) return SvNV(cell) < SvNV(val);
1877 4 34 if (strEQ(op, ">=")) return SvNV(cell) >= SvNV(val);
1878 4 30 if (strEQ(op, "<=")) return SvNV(cell) <= SvNV(val);
1879 11 19 if (strEQ(op, "==")) return SvNV(cell) == SvNV(val);
1880 4 15 if (strEQ(op, "!=")) return SvNV(cell) != SvNV(val);
1886 15 0 int c = m ? memcmp(a, b, m) : 0;
1887 11 4 if (c == 0) c = (al > bl) - (al < bl);
1888 7 8 if (strEQ(op, "eq")) return c == 0;
1889 4 4 if (strEQ(op, "ne")) return c != 0;
1890 0 4 if (strEQ(op, "lt")) return c < 0;
1891 4 0 if (strEQ(op, "gt")) return c > 0;
1892 0 0 if (strEQ(op, "le")) return c <= 0;
1893 0 0 if (strEQ(op, "ge")) return c >= 0;
1906 0 12 PUSHMARK(SP);
1907 0 12 EXTEND(SP, 1);
1912 12 0 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
6 6 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
1913 12 0 if (n > 0) (void)POPs;
1915 12 0 FREETMPS; LEAVE;
1928 2029 890 if (arg1 < arg2) return -1;
1929 890 0 if (arg1 > arg2) return 1;
1941 0 39 PUSHMARK(SP);
1942 0 39 XPUSHs(sv_2mortal(newRV_inc((SV*)a_av)));
1943 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)));
1944 0 39 XPUSHs(sv_2mortal(newSVsv(name_sv)));
1948 39 0 if (count > 0) {
1953 39 0 FREETMPS;
1982 6718 0 if (use_cb) {
1988 0 6718 PUSHMARK(SP);
1989 0 6718 XPUSHs(sv_2mortal(newRV_noinc((SV*)row)));
1992 6717 0 FREETMPS;
2017 0 32 if ((items - 1) & 1) croak("cfilter: trailing options must be name => value pairs");
2018 47 31 for (int oi = 1; oi < items; oi += 2) {
2022 29 18 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
29 0 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
2023 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;
2024 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;
2025 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;
2028 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");
2029 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");
2031 1 28 SV *restrict sel = removing ? remove_sv : keep_sv;
2035 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;
2036 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))) {
2038 16 1 if (SvROK(sel)) cv_sv = SvRV(sel);
2042 0 1 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
2045 1 0 if (!cv) croak("cfilter: unknown function '%s'", name);
2052 9 18 if (na_sv && SvOK(na_sv)) {
9 0 if (na_sv && SvOK(na_sv)) {
2055 8 1 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
8 0 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
2056 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;
2059 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");
2060 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");
2062 1 23 if (!SvROK(data)) croak("cfilter: data must be a reference");
2065 3 20 if (SvTYPE(rv) == SVt_PVAV) kind = 0;
2066 20 0 else if (SvTYPE(rv) == SVt_PVHV) {
2070 0 20 if (!fe) kind = 2;
2073 20 0 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
18 2 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
2074 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;
2084 14 9 HV *restrict cellmap = by_name ? NULL : newHV();
2086 18 5 if (kind == 1) {
2090 54 18 while ((e = hv_iternext(h))) {
2092 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)");
2094 18 36 if (len > nrows) nrows = len;
2097 54 18 while ((e = hv_iternext(h))) {
2101 36 18 if (!by_name) {
2103 36 0 if (nrows > 0) av_extend(col, nrows - 1);
2104 180 36 for (SSize_t r = 0; r < nrows; r++) {
2105 180 0 SV **restrict ep = (r <= av_len(src)) ? av_fetch(src, r, 0) : NULL;
2106 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));
2114 3 2 if (kind == 0) {
2117 9 3 for (SSize_t r = 0; r < n; r++) {
2119 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)");
2126 7 2 while ((e = hv_iternext(h))) {
2128 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)");
2136 16 5 for (SSize_t r = 0; r < nrows; r++) {
2140 40 16 while ((ie = hv_iternext(row))) {
2142 14 26 if (!hv_exists_ent(seen, ck, 0)) {
2151 2 3 if (!by_name) {
2153 6 2 for (SSize_t c = 0; c < nc; c++) {
2156 6 0 if (nrows > 0) av_extend(col, nrows - 1);
2157 30 6 for (SSize_t r = 0; r < nrows; r++) {
2160 24 6 SV *restrict cell = che ? HeVAL(che) : NULL;
2161 24 6 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
24 0 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
2170 5 18 if (against_sv) {
2171 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)");
2172 1 4 if (!hv_exists_ent(universe, against_sv, 0)) croak("cfilter: against column '%s' not found in data", SvPV_nolen(against_sv));
2177 9 13 if (by_name) {
2181 13 8 for (SSize_t i = 0; i < n; i++) {
2183 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");
2184 1 12 if (!hv_exists_ent(universe, *ep, 0)) croak("cfilter: column '%s' not found in data", SvPV_nolen(*ep));
2188 23 8 for (SSize_t c = 0; c < nc; c++) {
2191 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);
2198 39 13 for (SSize_t c = 0; c < nc; c++) {
2202 12 27 if (against_av) {
2205 60 12 for (SSize_t r = 0; r < nrows; r++) {
2208 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)) {
2216 18 9 } else if (na_omit) {
2219 90 18 for (SSize_t r = 0; r < nrows; r++) {
2221 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));
2229 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);
2234 16 5 if (kind == 1) {
2238 48 16 while ((e = hv_iternext(h))) {
2240 15 33 if (!hv_exists_ent(keepset, ck, 0)) continue;
2243 33 0 if (n > 0) av_extend(dst, n - 1);
2244 157 33 for (SSize_t i = 0; i < n; i++) {
2246 157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
2251 2 3 } else if (kind == 2) {
2255 7 2 while ((e = hv_iternext(h))) {
2260 16 7 while ((ie = hv_iternext(row))) {
2262 11 5 if (!hv_exists_ent(keepset, ck, 0)) continue;
2271 9 3 for (SSize_t r = 0; r < n; r++) {
2275 24 9 while ((ie = hv_iternext(row))) {
2277 15 9 if (!hv_exists_ent(keepset, ck, 0)) continue;
2288 13 8 if (cellmap) SvREFCNT_dec((SV*)cellmap);
2304 1 19 if ((items - 1) & 1) croak("hoh2hoa: trailing options must be name => value pairs");
2305 10 17 for (int oi = 1; oi < items; oi += 2) {
2309 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;
2310 4 1 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
4 0 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
2311 4 0 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
3 1 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
2317 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)");
2328 25 14 while ((e = hv_iternext(in_hv))) {
2330 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)");
2335 11 3 if (nrows > 1) qsort(AvARRAY(rows_av), (size_t)nrows, sizeof(SV*), h2h_keycmp);
2341 24 14 while ((e = hv_iternext(in_hv))) {
2345 40 24 while ((ie = hv_iternext(row))) {
2347 26 14 if (!hv_exists_ent(seen, ck, 0)) {
2358 24 14 for (SSize_t r = 0; r < nrows; r++) {
2362 51 24 for (SSize_t c = 0; c < ncols; c++) {
2365 40 11 SV *restrict src = che ? HeVAL(che) : NULL;
2366 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));
2372 3 11 if (rn_sv) {
2373 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));
2375 2 2 for (SSize_t r = 0; r < nrows; r++) av_push(rn_av, newSVsv(*av_fetch(rows_av, r, 0)));
2392 27 0 if (!df || !SvROK(df))
1 26 if (!df || !SvROK(df))
2394 26 0 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
25 1 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
3 22 bool is_code = (pred && SvROK(pred) && SvTYPE(SvRV(pred)) == SVt_PVCV);
2395 23 3 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
23 0 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
22 1 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
0 22 if (!is_code && (!pred || !SvROK(pred) || SvTYPE(SvRV(pred)) != SVt_PVHV))
2399 20 5 if (SvTYPE(ref) == SVt_PVAV) {
2405 73 19 for (i = 0; i < n; i++) {
2407 73 0 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
73 0 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
72 1 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
0 72 if (!rp || !*rp || !SvROK(*rp) || SvTYPE(SvRV(*rp)) != SVt_PVHV) {
2412 8 64 if (is_code) keep = filt_call(aTHX_ pred, *rp);
2414 36 36 if (keep) av_push(out, SvREFCNT_inc_simple_NN(*rp));
2417 5 0 } else if (SvTYPE(ref) == SVt_PVHV) {
2421 0 5 if (ncols <= 0) {
2432 13 4 while ((e = hv_iternext(in)) && c < ncols) {
13 0 while ((e = hv_iternext(in)) && c < ncols) {
2434 0 13 char *restrict k = HePV(e, klen);
2436 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) {
2443 4 8 if (len > maxrows) maxrows = len;
2450 16 4 for (i = 0; i < maxrows; i++) {
2452 4 12 if (is_code) {
2454 12 4 for (cc = 0; cc < ncols; cc++) {
2456 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);
2465 7 9 if (keep) {
2466 21 7 for (cc = 0; cc < ncols; cc++) {
2468 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));
2534 8 43 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
6 2 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
2538 1 5 if (items > 3) croak("col2col: an options hash ref must be the last argument");
2540 5 3 while ((he = hv_iternext(oh))) {
2542 0 5 const char *restrict oname = HePV(he, ol);
2544 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);
2547 18 27 } else if (items > 3) {
2548 1 17 if ((items - 3) & 1) croak("col2col: trailing options must be name => value pairs");
2549 18 15 for (int oi = 3; oi < items; oi += 2) {
2553 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);
2556 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");
2560 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);
2561 3 1 else if (SvOK(cmd) && !SvROK(cmd)) {
2 1 else if (SvOK(cmd) && !SvROK(cmd)) {
2564 0 2 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
2567 1 1 if (!cv) croak("col2col: unknown function '%s'", name);
2571 1 40 if (!SvROK(data)) croak("col2col: data must be a reference");
2575 2 38 if (SvTYPE(rv) == SVt_PVAV) kind = 1;
2576 38 0 else if (SvTYPE(rv) == SVt_PVHV) {
2580 0 38 if (!e) croak("col2col: empty data hash");
2582 38 0 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
37 1 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
2583 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;
2587 37 3 if (kind == 0) {
2593 92 37 while ((e = hv_iternext(h))) {
2595 92 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
0 92 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
2599 37 55 if (len > nrows) nrows = len;
2600 0 92 Renew(src, av_len(names_av) + 1, AV*);
2604 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*);
2605 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*);
2606 92 37 for (size_t cc = 0; cc < ncols; cc++) {
2607 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);
2608 92 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
2610 426 92 for (size_t r = 0; r < nrows; r++) {
2612 397 29 if (c2c_num(aTHX_ av_fetch(a, (SSize_t)r, 0), &v)) { col_val[cc][r] = v; col_def[cc][r] = 1; }
2619 2 1 if (kind == 1) {
2622 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*);
2623 8 2 for (size_t r = 0; r < nrows; r++) {
2625 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);
2631 0 1 nrows = (size_t)HvKEYS(h);
2632 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*);
2634 5 1 while ((e = hv_iternext(h)) && r < nrows) {
5 0 while ((e = hv_iternext(h)) && r < nrows) {
2636 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);
2642 13 3 for (size_t r = 0; r < nrows; r++) {
2643 3 10 if (!row_hv[r]) continue;
2646 30 10 while ((e = hv_iternext(row_hv[r]))) {
2648 0 30 char *restrict k = HePV(e, kl);
2649 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))); }
2655 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*);
2656 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*);
2657 6 3 for (size_t cc = 0; cc < ncols; cc++) {
2660 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);
2661 6 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
2662 30 6 for (size_t r = 0; r < nrows; r++) {
2664 0 30 if (!row_hv[r]) continue;
2665 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; }
2671 1 39 if (ncols == 0) croak("col2col: no usable columns found");
2675 0 39 Newx(col_names, ncols, SV*);
2676 0 39 Newx(name_len, ncols, STRLEN);
2677 98 39 for (size_t cc = 0; cc < ncols; cc++) {
2685 34 5 if (!SvOK(cols_eff)) {
2686 84 34 for (size_t cc = 0; cc < ncols; cc++) is_outer[cc] = 1;
2688 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) {
2691 4 1 for (SSize_t i = 0; i < n; i++) {
2695 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");
2697 1 3 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
2699 3 0 } else if (!SvROK(cols_eff)) {
2702 1 2 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
2711 91 36 for (size_t a = 0; a < ncols; a++) {
2713 4 87 if (!is_outer[a]) continue;
2715 222 86 for (size_t b = 0; b < ncols; b++) {
2718 86 136 if (a == b) continue;
2721 117 19 if (na_mode == 0) { // pairwise complete: keep rows defined in both
2722 531 117 for (size_t r = 0; r < nrows; r++)
2723 519 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])); }
507 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])); }
2724 8 11 } else if (na_mode == 1) { // omit: each column drops its own undef (lengths may differ)
2725 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]));
2726 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]));
2728 55 11 for (size_t r = 0; r < nrows; r++) {
2729 48 7 av_push(ca, col_def[a][r] ? newSVnv(col_val[a][r]) : newSV(0));
2730 47 8 av_push(cb, col_def[b][r] ? newSVnv(col_val[b][r]) : newSV(0));
2735 135 1 if (av_len(ca) < 0 || av_len(cb) < 0) {
1 134 if (av_len(ca) < 0 || av_len(cb) < 0) {
2737 5 129 } else if (!skip_errors) {
2746 0 129 PUSHMARK(SP);
2747 0 129 XPUSHs(rv1); XPUSHs(rv2);
0 129 XPUSHs(rv1); XPUSHs(rv2);
2751 129 0 if (SvTRUE(ERRSV)) {
8 121 if (SvTRUE(ERRSV)) {
2753 8 0 const char *restrict ep = SvPV(ERRSV, el);
2755 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++;
2757 8 0 if (n > 0) (void)POPs; // discard the undef G_SCALAR leaves
2759 121 0 res = (n > 0) ? newSVsv(POPs) : newSV(0);
2762 129 0 FREETMPS; LEAVE;
2771 89 36 for (size_t cc = 0; cc < ncols; cc++) { Safefree(col_val[cc]); Safefree(col_def[cc]); }
2800 4 6 for (I32 ai = 1; ai + 1 < items; ai += 2) {
2803 0 4 if (strEQ(key, "var_equal"))
2805 4 0 else if (strEQ(key, "formula"))
2809 0 6 if (!SvROK(data_ref))
2812 5 1 if (SvTYPE(rv) == SVt_PVHV) {
2814 1 0 } else if (SvTYPE(rv) == SVt_PVAV) {
2819 1 5 if (in_av) {
2821 0 1 if (formula_str != NULL)
2825 0 1 if (k < 2)
2830 2 1 for (size_t g = 0; g < k; g++) {
2832 2 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV)
2 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV)
2 0 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV)
0 2 if (!val || !*val || !SvROK(*val) || SvTYPE(SvRV(*val)) != SVt_PVAV)
2835 0 2 if (len < 2)
2849 2 1 for (size_t g = 0; g < k; g++) {
2853 12 2 for (IV i = 0; i < len; i++) {
2855 12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
2858 4 1 } else if (formula_str != NULL) {// MODE 2 – formula "response ~ factor"
2859 1 3 if (!parse_formula(formula_str, &lhs, &rhs))
2864 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)
2865 0 2 || SvTYPE(SvRV(*resp_svp)) != SVt_PVAV)
2869 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)
2870 0 2 || SvTYPE(SvRV(*fact_svp)) != SVt_PVAV)
2878 1 1 if (!build_groups_from_formula(aTHX_ resp_av, label_av,
2884 2 1 for (size_t g = 0; g < k; g++) total_n += (IV)sizes[g];
2888 0 1 if (k < 2)
2895 2 1 while ((he = hv_iternext(in_hv)) != NULL) {
2897 2 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
0 2 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
2898 0 0 croak("oneway_test: value for group '%s' is not an array ref",
2901 0 2 if (len < 2)
2902 0 0 croak("oneway_test: group '%s' has fewer than 2 observations",
2908 0 2 const char *kstr = HePV(he, klen);
2919 2 1 while ((he = hv_iternext(in_hv)) != NULL) {
2922 12 2 for (IV i = 0; i < len; i++) {
2924 12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
2933 6 3 for (size_t g = 0; g < k; g++) {
2935 30 6 for (size_t i = 0; i < sizes[g]; i++) sum += flat[offset + i];
2943 1 2 if (lhs) Safefree(lhs);
2976 6 3 for (size_t g = 0; g < k; g++) {
2988 6 3 for (size_t g = 0; g < k; g++) Safefree(gnames[g]);
2990 1 2 if (rhs) Safefree(rhs);
3005 10 0 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) {
10 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3010 10 0 if (arg_idx < items) {
3011 9 1 if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
9 0 if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
3014 1 0 } else if (SvPOK(ST(arg_idx))) {
3020 2 10 for (; arg_idx < items; arg_idx += 2) {
3023 0 2 if (strEQ(key, "x")) x_sv = val;
3024 0 2 else if (strEQ(key, "y")) y_sv = val;
3025 0 2 else if (strEQ(key, "exact")) {
3026 0 0 if (!SvOK(val)) exact = -1;
3029 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
3033 10 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
10 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
0 10 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
3041 2 8 if (!is_two_sided && !is_greater && !is_less) {
1 1 if (!is_two_sided && !is_greater && !is_less) {
0 1 if (!is_two_sided && !is_greater && !is_less) {
3047 0 10 if (nx == 0) croak("Not enough 'x' observations");
3052 230 10 for (size_t i = 0; i < nx; i++) {
3054 230 0 if (el && SvOK(*el) && looks_like_number(*el)) {
230 0 if (el && SvOK(*el) && looks_like_number(*el)) {
230 0 if (el && SvOK(*el) && looks_like_number(*el)) {
3061 10 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
9 1 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
9 0 if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) {
3066 120 9 for (size_t i = 0; i < ny; i++) {
3068 120 0 if (el && SvOK(*el) && looks_like_number(*el)) {
120 0 if (el && SvOK(*el) && looks_like_number(*el)) {
120 0 if (el && SvOK(*el) && looks_like_number(*el)) {
3072 9 0 if (valid_nx < 1 || valid_ny < 1) {
0 9 if (valid_nx < 1 || valid_ny < 1) {
3079 1 8 if (is_greater) statistic = d_plus;
3080 1 7 else if (is_less) statistic = d_minus;
3084 0 9 if (exact == 1) use_exact = TRUE;
3085 0 9 else if (exact == 0) use_exact = FALSE;
3090 180 9 for(size_t i=0; i
3091 120 9 for(size_t i=0; i
3094 291 9 for(size_t i = 1; i < total_n; i++) {
3095 0 291 if(comb[i] == comb[i-1]) { has_ties = TRUE; break; }
3098 9 0 if (use_exact && has_ties) {
0 9 if (use_exact && has_ties) {
3102 9 0 if (use_exact) {
3109 0 0 if (is_two_sided) {
3116 1 0 } else if (y_sv && SvPOK(y_sv)) {// --- ONE SAMPLE (e.g. against pnorm) ---
1 0 } else if (y_sv && SvPOK(y_sv)) {// --- ONE SAMPLE (e.g. against pnorm) ---
3118 1 0 if (strEQ(dist, "pnorm")) {
3121 50 1 for(size_t i = 0; i < valid_nx; i++) {
3127 0 50 if (diff1 > max_d_plus) max_d_plus = diff1;
3128 1 49 if (diff2 > max_d_plus) max_d_plus = diff2;
3129 8 42 if (-diff1 > max_d_minus) max_d_minus = -diff1;
3130 0 50 if (-diff2 > max_d_minus) max_d_minus = -diff2;
3131 8 42 if (fabs(diff1) > max_d) max_d = fabs(diff1);
3132 0 50 if (fabs(diff2) > max_d) max_d = fabs(diff2);
3134 0 1 if (is_greater) statistic = max_d_plus;
3135 0 1 else if (is_less) statistic = max_d_minus;
3137 1 0 bool use_exact = (exact == -1) ? (valid_nx < 100) : (exact == 1);
3138 1 0 if (use_exact) {
3140 1 0 if (is_two_sided) {
3150 0 0 if (is_two_sided) p_value = K2l(z, 0, 1e-6);
3162 0 10 if (p_value > 1.0) p_value = 1.0;
3163 0 10 if (p_value < 0.0) p_value = 0.0;
3184 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) {
3189 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) {
3194 0 10 if ((items - arg_idx) % 2 != 0) {
3198 20 10 for (; arg_idx < items; arg_idx += 2) {
3201 7 13 if (strEQ(key, "x")) x_sv = val;
3202 7 6 else if (strEQ(key, "y")) y_sv = val;
3203 3 3 else if (strEQ(key, "paired")) paired = SvTRUE(val);
3204 0 3 else if (strEQ(key, "correct")) correct = SvTRUE(val);
3205 1 2 else if (strEQ(key, "mu")) mu = SvNV(val);
3206 0 2 else if (strEQ(key, "exact")) {
3207 0 0 if (!SvOK(val)) exact = -1;
3210 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
3214 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)
3218 0 9 if (nx == 0) croak("Not enough 'x' observations");
3222 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) {
3230 8 1 if (ny > 0 && !paired) {
5 3 if (ny > 0 && !paired) {
3233 28 5 for (size_t i = 0; i < nx; i++) {
3235 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)) {
3241 28 5 for (size_t i = 0; i < ny; i++) {
3243 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)) {
3249 0 5 if (valid_nx == 0) { Safefree(ri); croak("not enough (non-missing) 'x' observations"); }
3250 0 5 if (valid_ny == 0) { Safefree(ri); croak("not enough 'y' observations"); }
3255 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;
3257 0 5 if (exact == 1) use_exact = TRUE;
3258 0 5 else if (exact == 0) use_exact = FALSE;
3259 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);
3260 2 3 if (use_exact && has_ties) {
0 2 if (use_exact && has_ties) {
3264 2 3 if (use_exact) {
3269 1 1 if (strcmp(alternative, "less") == 0) p_value = p_less;
3270 1 0 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3272 0 0 NV p = (p_less < p_greater) ? p_less : p_greater;
3276 3 0 method_desc = correct ? "Wilcoxon rank sum test with continuity correction" : "Wilcoxon rank sum test";
3282 3 0 if (correct) {
3283 3 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5);
2 1 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5);
3284 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3285 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3289 0 3 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3290 0 3 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3295 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");
3299 23 3 for (size_t i = 0; i < nx; i++) {
3301 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;
3304 18 5 if (paired) {
3306 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;
3309 0 18 if (d == 0.0) has_zeroes = TRUE; // Drop exact zeroes
3313 0 5 if (d == 0.0) has_zeroes = TRUE;
3317 0 3 if (n_nz == 0) {
3322 23 3 for (size_t i = 0; i < n_nz; i++) {
3329 23 3 for (size_t i = 0; i < n_nz; i++) {
3330 19 4 if (ri[i].idx) statistic += ri[i].rank;
3332 0 3 if (exact == 1) use_exact = TRUE;
3333 0 3 else if (exact == 0) use_exact = FALSE;
3334 3 0 else use_exact = (n_nz < 50 && !has_ties);
3 0 else use_exact = (n_nz < 50 && !has_ties);
3335 3 0 if (use_exact && has_ties) {
0 3 if (use_exact && has_ties) {
3339 3 0 if (use_exact && has_zeroes) {
0 3 if (use_exact && has_zeroes) {
3343 3 0 if (use_exact) {
3348 0 3 if (strcmp(alternative, "less") == 0) p_value = p_less;
3349 0 3 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3351 0 3 NV p = (p_less < p_greater) ? p_less : p_greater;
3355 0 0 method_desc = correct ? "Wilcoxon signed rank test with continuity correction" : "Wilcoxon signed rank test";
3360 0 0 if (correct) {
3361 0 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5);
0 0 if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5);
3362 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3363 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3367 0 0 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3368 0 0 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3373 0 8 if (p_value > 1.0) p_value = 1.0;
3389 3 13 if (!SvROK(data_ref)) {
3394 5 8 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
1 4 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
3405 8 4 if (input_type == SVt_PVAV) {
3407 0 8 r = av_top_index(obs_av) + 1;
3408 7 1 if (r > 0) {
3410 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) {
3412 0 4 c = av_top_index((AV*)SvRV(*first_elem)) + 1;
3414 8 4 for (unsigned int i = 0; i < r; i++) {
3417 8 0 if (row_sv && SvROK(*row_sv)) {
8 0 if (row_sv && SvROK(*row_sv)) {
3419 20 8 for (unsigned int j = 0; j < c; j++) {
3421 20 0 if (val_sv) obs_matrix[i][j] = SvNV(*val_sv);
3429 7 2 for (unsigned int j = 0; j < c; j++) {
3431 7 0 if (val_sv) obs_array[j] = SvNV(*val_sv);
3435 4 0 } else if (input_type == SVt_PVHV) {
3444 3 1 if (first_entry) {
3446 1 2 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
1 0 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
3451 2 1 while ((row_entry = hv_iternext(obs_hv))) {
3455 2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
3459 4 2 while ((col_entry = hv_iternext(inner_hv))) {
3461 2 2 if (!hv_exists_ent(col_idx_map, col_key, 0)) {
3471 2 1 for (unsigned int i = 0; i < r; i++) {
3477 2 0 if (inner_he) {
3479 2 0 if (SvROK(inner_sv)) {
3481 4 2 for (unsigned int j = 0; j < c; j++) {
3486 4 0 if (val_he) {
3498 4 2 while ((row_entry = hv_iternext(obs_hv))) {
3503 4 1 for (unsigned int j = 0; j < c; j++) {
3507 4 0 if (val_he) {
3515 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)) {
3522 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;
3525 5 3 if (is_2d) {
3528 10 5 for(unsigned int i=0; i
3529 12 5 for(unsigned int j=0; j
3531 10 5 for (unsigned int i = 0; i < r; i++) {
3532 24 10 for (unsigned int j = 0; j < c; j++) {
3540 4 1 if (input_type == SVt_PVAV) {
3542 8 4 for (unsigned int i = 0; i < r; i++) {
3544 20 8 for (unsigned int j = 0; j < c; j++) {
3548 8 12 if (yates) {
3550 8 0 NV y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
3562 2 1 for (unsigned int i = 0; i < r; i++) {
3564 4 2 for (unsigned int j = 0; j < c; j++) {
3570 4 0 if (yates) {
3572 4 0 NV y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
3587 9 3 for (unsigned int j = 0; j < c; j++) {
3592 2 1 if (input_type == SVt_PVAV) {
3594 6 2 for (unsigned int j = 0; j < c; j++) {
3602 3 1 for (unsigned int j = 0; j < c; j++) {
3614 5 3 if (obs_matrix) {
3615 10 5 for (unsigned int i = 0; i < r; i++) {
3620 3 5 if (obs_array) safefree(obs_array);
3621 2 6 if (row_keys) SvREFCNT_dec(row_keys);
3622 2 6 if (col_keys) SvREFCNT_dec(col_keys);
3641 6 2 if (input_type == SVt_PVAV) {
3647 5 3 if (is_2d) {
3648 3 2 if (yates) {
3671 63 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
62 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
3673 9 53 if (type == SVt_PVHV || type == SVt_PVAV) {
9 0 if (type == SVt_PVHV || type == SVt_PVAV) {
3681 62 2 if (arg_idx < items) {
3683 62 0 if (SvOK(cand) && !SvROK(cand)) {
62 0 if (SvOK(cand) && !SvROK(cand)) {
3685 61 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
60 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
60 0 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
3686 60 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
59 1 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
59 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
3687 59 0 strEQ(k, "undef.val"))) {
3703 82 61 for (; arg_idx < items; arg_idx += 2) {
3704 2 80 if (arg_idx + 1 >= items) croak("write_table: Odd number of arguments passed");
3707 1 79 if (strEQ(key, "data")) data_sv = val;
3708 16 63 else if (strEQ(key, "col.names")) col_names_sv = val;
3709 2 61 else if (strEQ(key, "file")) file_sv = val;
3710 18 43 else if (strEQ(key, "row.names")) row_names_sv = val;
3712 26 17 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
1 25 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
3718 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) : "";
3721 60 1 if (!data_sv || !SvROK(data_sv)) {
0 60 if (!data_sv || !SvROK(data_sv)) {
3725 9 51 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
0 9 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
3728 59 1 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
0 59 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
3731 41 18 if (!explicit_sep) {
3733 41 0 if (file_len >= 4) {
3735 38 3 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
0 38 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
3737 0 38 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
0 0 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
3742 16 43 if (col_names_sv && SvOK(col_names_sv)) {
16 0 if (col_names_sv && SvOK(col_names_sv)) {
3743 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) {
3750 48 9 if (SvTYPE(data_ref) == SVt_PVHV) {
3752 1 47 if (hv_iterinit(hv) == 0) XSRETURN_EMPTY;
3756 0 47 if (!first_val) {
3760 11 36 if (!SvROK(first_val)) {
3764 24 12 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
0 24 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
3771 100 45 while ((entry = hv_iternext(hv))) {
3773 30 70 if (is_flat_hash) {
3774 30 0 if (val && SvROK(val)) {
1 29 if (val && SvROK(val)) {
3778 70 0 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
70 0 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
19 51 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
1 69 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
3779 1 0 croak("write_table: Mixed data types detected. Ensure all values are %s references.\n", is_hoh ? "HASH" : "ARRAY");
3783 11 34 if (is_hoh) { // Rows are only explicitly pre-gathered for HOH
3786 17 11 while ((entry = hv_iternext(hv))) {
3792 1 8 if (av_len(av) < 0) XSRETURN_EMPTY;
3794 8 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
8 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
7 1 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
0 7 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
3795 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))
3799 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))
3808 25 7 for (SSize_t i = 0; i <= av_len(av); i++) {
3810 25 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
25 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
25 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
0 25 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
3817 1 51 if (!fh) {
3819 1 0 if (rows_av) SvREFCNT_dec(rows_av);
3823 51 0 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
40 11 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
3826 10 41 if (is_hoh) {
3827 2 8 if (col_names_sv && SvOK(col_names_sv)) {
2 0 if (col_names_sv && SvOK(col_names_sv)) {
3831 3 2 for (SSize_t i = 0; i <= av_len(c_av); i++) {
3833 3 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3839 12 8 while ((entry = hv_iternext((HV*)data_ref))) {
3843 70019 12 while ((inner_entry = hv_iternext(inner))) {
3850 70014 8 for (unsigned i = 0; i < num_cols; i++) {
3854 5 3 if (num_cols > 1)
3861 10 0 if (inc_rownames) header_row[h_idx++] = "";
3864 70017 10 for (size_t i = 0; i < num_headers; i++) {
3866 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) : "";
3877 16 8 for (size_t i = 0; i < num_rows; i++) {
3880 16 0 if (inc_rownames) row_data[d_idx++] = SvPV_nolen(row_key_sv);
3882 16 0 SV *restrict inner_sv = inner_he ? HeVAL(inner_he) : NULL;
3883 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;
3884 70033 14 for (size_t j = 0; j < num_headers; j++) {
3886 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;
3888 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;
3889 70023 10 SV *restrict cell_sv = cell_he ? HeVAL(cell_he) : NULL;
3890 70023 10 if (cell_sv && SvOK(cell_sv)) {
70022 1 if (cell_sv && SvOK(cell_sv)) {
3891 2 70020 if (SvROK(cell_sv)) {
3894 2 0 if (headers_av) SvREFCNT_dec(headers_av);
3895 2 0 if (rows_av) SvREFCNT_dec(rows_av);
3907 10 31 } else if (is_flat_hash) {
3909 1 9 if (col_names_sv && SvOK(col_names_sv)) {
1 0 if (col_names_sv && SvOK(col_names_sv)) {
3911 0 1 for (SSize_t i = 0; i <= av_len(c_av); i++) {
3913 0 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
0 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3919 25 9 for (unsigned int i = 0; i < num_cols; i++) {
3923 9 0 if (num_cols > 1)
3929 8 2 if (inc_rownames) header_row[h_idx++] = "";
3930 25 10 for (size_t i = 0; i < num_headers; i++) {
3932 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) : "";
3939 8 2 if (inc_rownames) row_data[d_idx++] = "1";
3940 25 10 for (size_t j = 0; j < num_headers; j++) {
3942 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;
3944 25 0 HE *restrict val_he = h_sv ? hv_fetch_ent(data_hv, h_sv, 0, 0) : NULL;
3945 25 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
3948 25 0 if (val_sv && SvOK(val_sv)) {
25 0 if (val_sv && SvOK(val_sv)) {
3949 0 25 if (SvROK(val_sv)) {
3952 0 0 if (headers_av) SvREFCNT_dec(headers_av);
3963 24 7 } else if (is_hoa) {
3968 51 24 while ((entry = hv_iternext(data_hv))) {
3971 30 21 if (len > max_rows) max_rows = len;
3973 8 16 if (col_names_sv && SvOK(col_names_sv)) {
8 0 if (col_names_sv && SvOK(col_names_sv)) {
3976 16 8 for (SSize_t i = 0; i <= av_len(c_av); i++) {
3978 16 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
15 1 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3984 35 16 for (unsigned int i = 0; i < num_cols; i++) {
3988 14 2 if (num_cols > 1)
3991 1 23 if (av_len(headers_av) < 0) {
3997 16 7 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
1 15 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
4001 2 1 for (SSize_t i = 0; i <= av_len(headers_av); i++) {
4003 2 0 if (!h_ptr || !*h_ptr) continue;
0 2 if (!h_ptr || !*h_ptr) continue;
4006 1 1 if (!sv_eq(h_sv, row_names_sv)) {
4016 16 7 if (inc_rownames) header_row[h_idx++] = "";
4017 49 23 for (size_t i = 0; i < num_headers; i++) {
4019 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) : "";
4028 64 23 for (size_t i = 0; i < max_rows; i++) {
4030 46 18 if (inc_rownames) {
4031 2 44 if (rownames_col) {
4034 2 0 SV *restrict rn_arr_sv = rn_arr_he ? HeVAL(rn_arr_he) : NULL;
4035 2 0 if (rn_arr_sv && SvROK(rn_arr_sv)) {
2 0 if (rn_arr_sv && SvROK(rn_arr_sv)) {
4038 2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
4039 0 2 if (SvROK(*rn_val_ptr)) {
4042 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4057 154 64 for (size_t j = 0; j < num_headers; j++) {
4059 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;
4061 154 0 HE *restrict arr_he = h_sv ? hv_fetch_ent(data_hv, h_sv, 0, 0) : NULL;
4062 150 4 SV *restrict arr_sv = arr_he ? HeVAL(arr_he) : NULL;
4063 150 4 if (arr_sv && SvROK(arr_sv)) {
150 0 if (arr_sv && SvROK(arr_sv)) {
4066 128 22 if (cell_ptr && SvOK(*cell_ptr)) {
100 28 if (cell_ptr && SvOK(*cell_ptr)) {
4067 0 100 if (SvROK(*cell_ptr)) {
4070 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4084 7 0 } else if (is_aoh) { // ----- Array of Hashes
4087 3 4 if (col_names_sv && SvOK(col_names_sv)) {
3 0 if (col_names_sv && SvOK(col_names_sv)) {
4090 2 3 for (SSize_t i = 0; i <= av_len(c_av); i++) {
4092 2 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
2 0 if (c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4096 19 4 for (size_t i = 0; i < num_rows; i++) {
4098 19 0 if (row_ptr && SvROK(*row_ptr)) {
19 0 if (row_ptr && SvROK(*row_ptr)) {
4102 25 19 while ((entry = hv_iternext(row_hv))) {
4110 8 4 for (unsigned int i = 0; i < num_cols; i++) {
4114 3 1 if (num_cols > 1)
4118 5 2 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
1 4 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
4122 0 1 for (SSize_t i = 0; i <= av_len(headers_av); i++) {
4124 0 0 if (!h_ptr || !*h_ptr) continue;
0 0 if (!h_ptr || !*h_ptr) continue;
4127 0 0 if (!sv_eq(h_sv, row_names_sv)) {
4137 5 2 if (inc_rownames) header_row[h_idx++] = "";
4138 10 7 for (size_t i = 0; i < num_headers; i++) {
4140 10 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
10 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4146 25 7 for (size_t i = 0; i < num_rows; i++) {
4149 25 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
25 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
4150 21 4 if (inc_rownames) {
4151 2 19 if (rownames_col) {
4153 2 0 HE *restrict rn_he = row_hv ? hv_fetch_ent(row_hv, row_names_sv, 0, 0) : NULL;
4154 2 0 SV *restrict rn_sv = rn_he ? HeVAL(rn_he) : NULL;
4155 2 0 if (rn_sv && SvOK(rn_sv)) {
2 0 if (rn_sv && SvOK(rn_sv)) {
4156 0 2 if (SvROK(rn_sv)) {
4159 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4171 33 25 for (size_t j = 0; j < num_headers; j++) {
4173 33 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
33 0 SV *restrict h_sv = (h_ptr && SvOK(*h_ptr)) ? *h_ptr : NULL;
4175 33 0 HE *restrict cell_he = (row_hv && h_sv) ? hv_fetch_ent(row_hv, h_sv, 0, 0) : NULL;
33 0 HE *restrict cell_he = (row_hv && h_sv) ? hv_fetch_ent(row_hv, h_sv, 0, 0) : NULL;
4176 29 4 SV *restrict cell_sv = cell_he ? HeVAL(cell_he) : NULL;
4177 29 4 if (cell_sv && SvOK(cell_sv)) {
29 0 if (cell_sv && SvOK(cell_sv)) {
4178 0 29 if (SvROK(cell_sv)) {
4181 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4193 48 0 if (headers_av) SvREFCNT_dec(headers_av);
4194 8 40 if (rows_av) SvREFCNT_dec(rows_av);
4216 522 0 if (SvOK(callback)) {
4217 522 0 if (SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV)
522 0 if (SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV)
4224 522 0 sep_len = sep_str ? strlen(sep_str) : 0;
4225 522 0 comment_len = comment_str ? strlen(comment_str) : 0;
4226 522 0 sep0 = sep_len ? sep_str[0] : 0;
4228 0 522 if (!fp)
4238 0 522 if (!use_cb)
4247 6718 521 while (sv_gets(line_sv, fp, 0) != NULL) {
4251 6718 0 if (len && line[len-1] == '\n') {
6717 1 if (len && line[len-1] == '\n') {
4253 6717 0 if (len && line[len-1] == '\r')
4928 1789 if (len && line[len-1] == '\r')
4256 6718 0 if (!in_quotes) {
4259 6720 0 while (k < len && (line[k] == ' ' || line[k] == '\t'))
0 6720 while (k < len && (line[k] == ' ' || line[k] == '\t'))
2 6718 while (k < len && (line[k] == ' ' || line[k] == '\t'))
4261 0 6718 if (k == len)
4264 6196 522 if (seen_first && comment_len && len >= comment_len
6196 0 if (seen_first && comment_len && len >= comment_len
6196 0 if (seen_first && comment_len && len >= comment_len
4265 0 6196 && memcmp(line, comment_str, comment_len) == 0)
4271 105638 22 while (i < len) {
4272 14881 90757 if (in_quotes) {
4277 0 14881 if (!q) {
4284 14873 8 if (run)
4288 14870 11 if (i + 1 < len && line[i+1] == '"') {
4 14866 if (i + 1 < len && line[i+1] == '"') {
4299 286923 6696 while (i < len) {
4301 272046 14877 if (c == '"' || c == '\r')
272046 0 if (c == '"' || c == '\r')
4303 69184 202862 if (c == sep0 && sep_len && (len - i) >= sep_len
69184 0 if (c == sep0 && sep_len && (len - i) >= sep_len
69184 0 if (c == sep0 && sep_len && (len - i) >= sep_len
4304 0 69184 && (sep_len == 1
4305 0 0 || memcmp(line + i, sep_str, sep_len) == 0))
4309 61001 29756 if (i > start)
4311 6696 84061 if (i >= len)
4315 14877 69184 if (c == '"') {
4318 14877 0 if (!post_quote)
4321 0 69184 } else if (c == '\r') {
4334 0 6718 if (in_quotes) {
4343 0 521 if (in_quotes) {/* EOF with an unterminated quote: flush the trailing record */
4348 521 0 if (use_cb) {
4360 4 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
0 4 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
4363 4 0 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
0 4 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
4368 2 2 if (strcmp(method, "pearson") != 0 &&
4369 1 1 strcmp(method, "spearman") != 0 &&
4370 0 1 strcmp(method, "kendall") != 0) {
4379 0 4 if (nx != ny) {
4390 20 4 for (size_t i = 0; i < nx; i++) {
4395 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;
4396 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;
4399 20 0 if (!isnan(xv) && !isnan(yv)) {
20 0 if (!isnan(xv) && !isnan(yv)) {
4407 0 4 if (n < 2) {
4413 1 3 if (strcmp(method, "kendall") == 0) {
4415 5 1 for (size_t i = 0; i < n; i++) {
4416 25 5 for (size_t j = 0; j < n; j++) {
4424 1 2 if (strcmp(method, "spearman") == 0) {
4431 5 1 for (size_t i = 0; i < n; i++) {
4441 10 2 for (size_t i = 0; i < n; i++) {
4495 0 10 if (items % 2 != 0) croak("Usage: glm(formula => 'am ~ wt + hp', data => \\%mtcars)");
4497 28 10 for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) {
4500 10 18 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
4501 10 8 else if (strEQ(key, "data")) data_sv = val;
4502 8 0 else if (strEQ(key, "family")) family_str = SvPV_nolen(val);
4505 0 10 if (!formula) croak("glm: formula is required");
4506 10 0 if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference");
0 10 if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference");
4510 7 3 if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str);
0 7 if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str);
4518 104 34 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
138 10 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
138 0 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
4522 0 10 if (!tilde) croak("glm: invalid formula, missing '~'");
4527 1 9 if ((minus_one = strstr(rhs, "-1")) != NULL) {
4534 0 10 if (minus1) {
4540 9 1 if (has_intercept) terms[num_terms++] = savepv("Intercept");
4543 16 10 while (chunk != NULL) {
4544 0 16 if (num_terms >= term_cap - 3) {
4548 16 0 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
0 16 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
4553 0 16 if (star) {
4556 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';
4557 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';
4565 0 16 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
0 0 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
4571 25 10 for (i = 0; i < num_terms; i++) {
4573 21 25 for (size_t j = 0; j < num_uniq; j++) {
4574 0 21 if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; }
4576 25 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
4581 10 0 if (SvTYPE(ref) == SVt_PVHV) {
4583 0 10 if (hv_iterinit(hv) == 0) croak("glm: Data hash is empty");
4585 10 0 if (entry) {
4587 10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
5 5 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
4590 0 5 Newx(row_names, n, char*);
4591 131 5 for(i = 0; i < n; i++) {
4595 5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
4597 0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
4599 160 5 while ((entry = hv_iternext(hv))) {
4607 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
4610 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
4611 0 0 for (i = 0; i < n; i++) {
4613 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) {
4618 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
4625 25 10 for (size_t j = 0; j < p; j++) {
4626 0 25 if (p_exp + 32 >= exp_cap) {
4631 9 16 if (strcmp(uniq_terms[j], "Intercept") == 0) {
4634 1 15 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
4636 0 1 Newx(levels, levels_cap, char*);
4637 60 1 for (i = 0; i < n; i++) {
4639 60 0 if (str_val) {
4641 88 2 for (size_t l = 0; l < num_levels; l++) {
4642 58 30 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
4644 2 58 if (!found) {
4645 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*); }
4651 1 0 if (num_levels > 0) {
4652 1 1 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
4653 1 1 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
4654 1 0 if (strcmp(levels[l1], levels[l2]) > 0) {
4659 1 1 for (size_t l = 1; l < num_levels; l++) {
4660 0 1 if (p_exp >= exp_cap) {
4671 2 1 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
4682 0 10 Newx(X, n * p, NV); Newx(Y, n, NV);
0 10 Newx(X, n * p, NV); Newx(Y, n, NV);
4683 0 10 Newx(valid_row_names, n, char*);
4686 291 10 for (size_t i = 0; i < n; i++) {
4688 0 291 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
4692 799 291 for (size_t j = 0; j < p; j++) {
4693 288 511 if (strcmp(exp_terms[j], "Intercept") == 0) {
4695 60 451 } else if (is_dummy[j]) {
4697 60 0 if (str_val) {
4698 30 30 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
4703 0 451 if (isnan(row_x[j])) { row_ok = FALSE; break; }
4706 0 291 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
4708 799 291 for (size_t j = 0; j < p; j++) X[valid_n * p + j] = row_x[j];
4714 0 10 if (valid_n < p) {
4715 0 0 Safefree(X); Safefree(Y); Safefree(valid_row_names); if (row_hashes) Safefree(row_hashes);
4724 25 10 for (i = 0; i < p; i++) { beta[i] = 0.0; beta_old[i] = 0.0; }
4727 291 10 for (i = 0; i < valid_n; i++) sum_y += Y[i];
4729 288 9 for (i = 0; i < valid_n; i++) {
4730 37 251 if (is_binomial) {
4731 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");
4735 21 15 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
4736 15 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
4745 45 0 for (iter = 1; iter <= max_iter; iter++) {
4746 879 45 for (i = 0; i < valid_n; i++) {
4747 380 499 if (is_binomial) {
4750 12 368 if (varmu < 1e-10) varmu = 1e-10;
4759 272 108 for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
108 45 for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
4760 879 45 for (size_t k = 0; k < valid_n; k++) {
4762 2419 879 for (i = 0; i < p; i++) {
4765 6827 2419 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
4769 108 45 for (i = 0; i < p; i++) {
4770 0 108 if (aliased[i]) { beta[i] = NAN; } else {
4772 272 0 for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j];
272 108 for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j];
4778 450 45 for (unsigned short int half = 0; half < 10; half++) {
4780 8790 450 for (i = 0; i < valid_n; i++) {
4782 24190 0 for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j];
24190 8790 for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j];
4784 3800 4990 if (is_binomial) {
4787 0 3800 if (mu[i] < 10 * DBL_EPSILON) mu[i] = 10 * DBL_EPSILON;
4788 0 3800 if (mu[i] > 1.0 - 10 * DBL_EPSILON) mu[i] = 1.0 - 10 * DBL_EPSILON;
4790 2170 1630 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
4791 1630 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
4801 320 130 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)) {
4805 30 10 for (size_t j = 0; j < p; j++) beta[j] = (beta[j] + beta_old[j]) / 2.0;
4808 9 36 if (fabs(deviance_new - deviance_old) / (0.1 + fabs(deviance_new)) < epsilon) {
4812 85 36 for (size_t j = 0; j < p; j++) beta_old[j] = beta[j];
4815 63 23 for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
23 9 for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; }
4816 287 9 for (size_t k = 0; k < valid_n; k++) {
4817 36 251 NV w = is_binomial ? (mu[k] * (1.0 - mu[k])) : 1.0;
4818 4 283 if (w < 1e-10) w = 1e-10;
4819 791 287 for (i = 0; i < p; i++) {
4821 2239 791 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
4827 8 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);
4829 287 9 for (i = 0; i < valid_n; i++) {
4830 36 251 if (is_binomial) {
4831 21 15 if (Y[i] == 0.0) null_dev += -2.0 * log(1.0 - wtdmu);
4832 15 0 else if (Y[i] == 1.0) null_dev += -2.0 * log(wtdmu);
4840 7 2 if (is_gaussian) {
4846 1 6 if (dev_for_aic < 1.0355727742801604e-30) {
4851 2 0 } else if (is_binomial) {
4857 2 7 dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN);
7 0 dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN);
4858 287 9 for (size_t i = 0; i < valid_n; i++) {
4860 36 251 if (is_binomial) {
4863 21 15 if (Y[i] == 0.0) d_res = sqrt(-2.0 * log(1.0 - mu[i]));
4864 15 0 else if (Y[i] == 1.0) d_res = sqrt(-2.0 * log(mu[i]));
4866 15 21 res = (Y[i] > mu[i]) ? d_res : -d_res;
4874 23 9 for (size_t j = 0; j < p; j++) {
4879 0 23 if (aliased[j]) {
4882 0 0 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVpv("NaN", 0), 0);
4883 0 0 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVpv("NaN", 0), 0);
4887 5 18 NV p_val = is_binomial ? 2.0 * (1.0 - approx_pnorm(fabs(val_stat))) : get_t_pvalue(val_stat, df_res, "two.sided");
4890 5 18 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVnv(val_stat), 0);
4891 5 18 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVnv(p_val), 0);
4911 23 9 for (i = 0; i < num_terms; i++) Safefree(terms[i]);
4913 23 9 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]);
4915 23 9 for (size_t j = 0; j < p_exp; j++) {
4917 1 22 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
4923 5 4 if (row_hashes) Safefree(row_hashes);
4932 12 0 if (items < 2 || items % 2 != 0)
0 12 if (items < 2 || items % 2 != 0)
4941 34 12 for (unsigned short int i = 2; i < items; i += 2) {
4944 7 27 if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
4945 12 15 else if (strEQ(key, "method")) method = SvPV_nolen(val);
4946 1 14 else if (strEQ(key, "exact")) exact_sv = val;
4947 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);
4948 7 0 else if (strEQ(key, "continuity")) continuity = SvTRUE(val);
4958 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 ||
4959 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) {
4965 0 12 if (n_raw != (size_t)(av_len(y_av) + 1)) croak("incompatible dimensions");
4969 269 12 for (size_t i = 0; i < n_raw; i++) {
4972 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;
4973 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;
4975 267 2 if (!isnan(xv) && !isnan(yv)) {
265 2 if (!isnan(xv) && !isnan(yv)) {
4981 0 12 if (n < 3) {
4986 6 6 if (is_pearson) {
4989 30 6 for (size_t i = 0; i < n; i++) {
4998 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;
5000 0 6 if (estimate > 1.0) estimate = 1.0;
5001 0 6 else if (estimate < -1.0) estimate = -1.0;
5006 2 4 if (denom_t <= 0.0)
5007 1 1 statistic = (estimate > 0.0) ? INFINITY : -INFINITY;
5014 1 5 if (est_clamped >= 1.0) est_clamped = 1.0 - DBL_EPSILON;
5015 1 4 else if (est_clamped <= -1.0) est_clamped = -1.0 + DBL_EPSILON;
5024 3 3 } else if (is_kendall) {
5027 207 3 for (size_t i = 0; i < n - 1; i++) {
5028 19920 207 for (size_t j = i + 1; j < n; j++) {
5031 0 19920 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
0 0 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
5032 0 19920 else if (sign_x == 0) tie_x++;
5033 0 19920 else if (sign_y == 0) tie_y++;
5034 16 19904 else if (sign_x * sign_y > 0) c++;
5040 3 0 estimate = (denom == 0.0) ? NAN : (NV)(c - d) / denom;
5041 3 0 bool has_ties = (tie_x > 0 || tie_y > 0);
0 3 bool has_ties = (tie_x > 0 || tie_y > 0);
5044 1 2 if (!exact_sv || !SvOK(exact_sv))
0 1 if (!exact_sv || !SvOK(exact_sv))
5045 2 0 do_exact = (n < 50) && !has_ties;
2 0 do_exact = (n < 50) && !has_ties;
5049 2 1 if (do_exact && has_ties) do_exact = 0;
0 2 if (do_exact && has_ties) do_exact = 0;
5050 2 1 if (do_exact) {
5058 0 1 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
0 0 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
5061 1 0 if (strcmp(alternative, "two.sided") == 0)
5063 0 0 else if (strcmp(alternative, "less") == 0)
5069 3 0 } else if (is_spearman) {
5077 25 3 for (size_t i = 0; i < n; i++) {
5086 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;
5089 0 3 if (estimate > 1.0) estimate = 1.0;
5090 0 3 else if (estimate < -1.0) estimate = -1.0;
5094 25 3 for (size_t i = 0; i < n; i++) {
5101 25 3 for (size_t i = 0; i < n; i++) {
5102 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])) {
5109 0 3 if (!exact_sv || !SvOK(exact_sv))
0 0 if (!exact_sv || !SvOK(exact_sv))
5110 1 2 do_exact = (n < 10) && !has_ties;
1 0 do_exact = (n < 10) && !has_ties;
5114 1 2 if (do_exact) {
5122 0 2 if (continuity) {
5127 2 0 if (denom_t <= 0.0)
5128 1 1 statistic = (r > 0.0) ? INFINITY : -INFINITY;
5151 6 6 if (is_pearson) {
5172 2 0 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
0 2 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
5179 0 2 Newx(x, n_raw, NV);
5182 24 2 for (size_t i = 0; i < n_raw; i++) {
5184 24 0 if (elem && SvOK(*elem)) {
24 0 if (elem && SvOK(*elem)) {
5186 24 0 if (!isnan(val)) {
5194 2 0 if (n < 3 || n > 5000) {
0 2 if (n < 3 || n > 5000) {
5201 24 2 for (size_t i = 0; i < n; i++) {
5204 0 2 if (ssq == 0.0) {
5210 0 2 if (n == 3) {
5214 0 0 if (w < 0.75) w = 0.75;
5220 0 2 Newx(m, n, NV);
5221 0 2 Newx(a, n, NV);
5222 24 2 for (size_t i = 0; i < n; i++) {
5230 2 0 if (n == 4 || n == 5) {
1 1 if (n == 4 || n == 5) {
5232 3 1 for (unsigned int i = 1; i < n-1; i++) {
5240 15 1 for (unsigned int i = 2; i < n-2; i++) {
5244 24 2 for (size_t i = 0; i < n; i++) {
5254 1 1 if (n <= 11) {
5260 0 1 if (y >= gamma) {
5283 0 2 if (p_val > 1.0) p_val = 1.0;
5284 0 2 if (p_val < 0.0) p_val = 0.0;
5293 0 2 EXTEND(SP, 1);
5303 10035 17 for (unsigned short int i = 0; i < items; i++) {
5305 11 10024 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
11 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5308 456 10 for (size_t j = 0; j < len; j++) {
5310 456 0 if (tv && SvOK(*tv)) {
455 1 if (tv && SvOK(*tv)) {
5312 445 10 if (first || val < min_val) {
13 432 if (first || val < min_val) {
5321 10023 1 } else if (SvOK(arg)) {
5323 10015 8 if (first || val < min_val) {
9 10006 if (first || val < min_val) {
5332 1 16 if (count == 0) croak("min needs >= 1 numeric element");
5333 4 12 RETVAL = min_val;
5344 10035 18 for (size_t i = 0; i < items; i++) {
5346 12 10023 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
12 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5349 556 11 for (size_t j = 0; j < len; j++) {
5351 556 0 if (tv && SvOK(*tv)) {
555 1 if (tv && SvOK(*tv)) {
5353 544 11 if (first || val > max_val) {
41 503 if (first || val > max_val) {
5362 10022 1 } else if (SvOK(arg)) {
5364 10014 8 if (first || val > max_val) {
21 9993 if (first || val > max_val) {
5373 1 17 if (count == 0) croak("max needs >= 1 numeric element");
5374 4 13 RETVAL = max_val;
5389 0 11 if (items == 0) {
5393 17 11 while (i < items) {
5395 8 9 if (i + 1 < items && SvPOK(ST(i))) {
6 2 if (i + 1 < items && SvPOK(ST(i))) {
5397 2 4 if (strEQ(key, "n")) {
5402 2 2 } else if (strEQ(key, "min")) {
5407 2 0 } else if (strEQ(key, "max")) {
5416 9 2 if (!n_set) {
5419 1 1 } else if (!min_set) {
5422 1 0 } else if (!max_set) {
5430 0 11 if (!n_set) {
5434 0 11 AUTO_SEED_PRNG();
5436 11 0 if (n > 0) {
5440 20079 11 for (size_t j = 0; j < n; j++) {
5442 0 20079 if (max < min) {
5458 0 12 AUTO_SEED_PRNG();
5459 1 11 if (items % 2 != 0)
5467 31 11 for (unsigned short i = 0; i < items; i += 2) {
5471 11 20 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
5472 10 10 else if (strEQ(key, "size")) { size = (unsigned int)SvUV(val); size_set = TRUE; }
5473 10 0 else if (strEQ(key, "prob")) { prob = SvNV(val); prob_set = TRUE; }
5478 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");
5479 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");
5482 7 0 if (n > 0) {
5484 20499 7 for (unsigned int i = 0; i < n; i++) {
5498 8 1 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
1 7 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
5503 1 6 if (n_raw == 0) croak("hist: input array is empty");
5507 0 6 Newx(x, n_raw, NV);
5511 2021 5 for (size_t i = 0; i < n_raw; i++) {
5513 2021 0 if (tv && SvOK(*tv)) {
2021 0 if (tv && SvOK(*tv)) {
5516 5 2015 if (val < min_val) min_val = val;
5517 2012 8 if (val > max_val) max_val = val;
5520 0 5 if (n == 0) {
5526 0 5 if (items == 2) {
5529 5 0 } else if (items > 2) {
5531 5 0 for (unsigned short i = 1; i < items - 1; i++) {
5533 5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
5539 0 5 if (n_bins == 0 && looks_like_number(ST(1))) {
0 0 if (n_bins == 0 && looks_like_number(ST(1))) {
5543 0 5 if (n_bins == 0) n_bins = calculate_sturges_bins(n);
5547 0 5 Newx(breaks, n_bins + 1, NV);
5548 0 5 Newx(mids, n_bins, NV);
5549 0 5 Newx(density, n_bins, NV);
5550 0 5 Newx(counts, n_bins, size_t);
5553 23 5 for (size_t i = 0; i <= n_bins; i++) {
5564 23 5 for (size_t i = 0; i <= n_bins; i++) {
5566 18 5 if (i < n_bins) {
5591 11 0 if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
10 1 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) {
5596 0 11 if ((items - arg_idx) % 2 != 0)
5599 12 11 for (; arg_idx < items; arg_idx += 2) {
5603 1 11 if (strEQ(key, "x")) x_sv = val;
5604 11 0 else if (strEQ(key, "probs")) probs_sv = val;
5607 11 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
11 0 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 11 if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
5612 0 11 if (n_raw == 0) croak("quantile: 'x' is empty");
5615 0 11 Newx(x, n_raw, NV);
5617 447 11 for (size_t i = 0; i < n_raw; i++) {
5619 447 0 if (tv && SvOK(*tv)) {
447 0 if (tv && SvOK(*tv)) {
5623 0 11 if (n == 0) {
5634 11 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
11 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
11 0 if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) {
5638 23 11 for (unsigned int i = 0; i < n_probs; i++) {
5640 23 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
23 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
5641 23 0 if (probs[i] < 0.0 || probs[i] > 1.0) {
0 23 if (probs[i] < 0.0 || probs[i] > 1.0) {
5648 0 0 for (unsigned int i = 0; i < n_probs; i++) probs[i] = default_probs[i];
5652 23 11 for (size_t i = 0; i < n_probs; i++) {
5656 1 22 if (n == 1) {
5658 1 21 } else if (p == 1.0) {
5660 1 20 } else if (p == 0.0) {
5673 23 0 if (fabs(pct - pct_rounded) < 1e-9) {
5693 61 46 for (size_t i = 0; i < items; i++) {
5695 45 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
45 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5698 20513 44 for (size_t j = 0; j < len; j++) {
5700 20513 0 if (tv && SvOK(*tv)) {
20512 1 if (tv && SvOK(*tv)) {
5707 15 1 } else if (SvOK(arg)) {
5714 1 45 if (count == 0) croak("mean needs >= 1 element");
5715 34 11 RETVAL = total / count;
5732 12 4 for (size_t i = 0; i < items; i++) {
5734 1 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
1 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5737 4 1 for (size_t j = 0; j < len; j++) {
5739 4 0 if (tv && SvOK(*tv)) {
4 0 if (tv && SvOK(*tv)) {
5743 0 4 if (!slot) croak("mode: internal hash error");
5744 2 2 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
5746 3 1 if (cnt > max_count) max_count = cnt;
5747 2 2 if (cnt == 1)
5754 10 1 } else if (SvOK(arg)) {
5758 0 10 if (!slot) croak("mode: internal hash error");
5759 4 6 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
5761 6 4 if (cnt > max_count) max_count = cnt;
5762 6 4 if (cnt == 1)
5770 1 3 if (arg_count == 0)
5774 7 3 while ((he = hv_iternext(counts))) {
5775 4 3 if (SvIV(hv_iterval(counts, he)) == max_count) {
5777 0 4 const char *restrict key = HePV(he, klen);
5779 0 4 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
4 0 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
5789 16 3 for (size_t i = 0; i < items; i++) {
5791 2 14 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
2 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5794 10 1 for (size_t j = 0; j < len; j++) {
5796 10 0 if (tv && SvOK(*tv)) {
9 1 if (tv && SvOK(*tv)) {
5803 13 1 } else if (SvOK(arg)) {
5810 0 3 if (count == 0) croak("sum needs >= 1 element");
5811 1 2 RETVAL = total;
5822 37 21 for (size_t i = 0; i < items; i++) {
5824 18 19 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
18 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5827 10069 17 for (size_t j = 0; j < len; j++) {
5829 10069 0 if (tv && SvOK(*tv)) {
10068 1 if (tv && SvOK(*tv)) {
5839 18 1 } else if (SvOK(arg)) {
5849 1 20 if (count < 2) croak("sd needs >= 2 elements");
5850 2 18 RETVAL = sqrt(M2 / (count - 1));
5861 15 6 for (size_t i = 0; i < items; i++) {
5863 4 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
4 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5866 10012 3 for (size_t j = 0; j < len; j++) {
5868 10012 0 if (tv && SvOK(*tv)) {
10011 1 if (tv && SvOK(*tv)) {
5878 10 1 } else if (SvOK(arg)) {
5888 1 5 if (count < 2) croak("var needs >= 2 elements");
5889 1 4 RETVAL = M2 / (count - 1);
5903 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) {
5908 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) {
5913 0 53 if ((items - arg_idx) % 2 != 0) {
5917 76 53 for (; arg_idx < items; arg_idx += 2) {
5921 25 51 if (strEQ(key, "x")) x_sv = val;
5922 5 46 else if (strEQ(key, "y")) y_sv = val;
5923 35 11 else if (strEQ(key, "mu")) mu = SvNV(val);
5924 4 7 else if (strEQ(key, "paired")) paired = SvTRUE(val);
5925 3 4 else if (strEQ(key, "var_equal")) var_equal = SvTRUE(val);
5926 2 2 else if (strEQ(key, "conf_level")) conf_level = SvNV(val);
5927 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
5932 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)
5936 0 52 if (nx < 2) croak("t_test: 'x' needs at least 2 elements");
5938 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)
5940 52 0 if (conf_level <= 0.0 || conf_level >= 1.0)
1 51 if (conf_level <= 0.0 || conf_level >= 1.0)
5945 396 51 for (size_t i = 0; i < nx; i++) {
5947 396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
5953 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");
5955 46 4 if (paired || y_av) {
11 35 if (paired || y_av) {
5956 1 14 if (!y_av) croak("t_test: 'y' must be provided for paired or two-sample tests");
5958 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");
5960 127 13 for (size_t i = 0; i < ny; i++) {
5962 127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
5968 2 11 if (paired) {
5970 12 2 for (size_t i = 0; i < nx; i++) {
5973 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;
5974 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;
5981 0 2 if (var_d == 0.0) croak("t_test: data are essentially constant");
5987 2 9 } else if (var_equal) {
5988 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");
5997 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");
6017 1 47 if (strcmp(alternative, "less") == 0) {
6021 1 46 } else if (strcmp(alternative, "greater") == 0) {
6044 14 1 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
0 14 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
6050 1 13 if (n == 0) {
6056 144 13 for(unsigned short int i = 0; meth[i]; i++) meth[i] = tolower(meth[i]);
6058 4 9 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
2 2 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
6059 2 11 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
2 0 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
6060 0 13 if (strcmp(meth, "fdr") == 0) strcpy(meth, "bh");
6064 0 13 Newx(arr, n, PVal);
6065 0 13 Newx(adj, n, NV);
6067 356 13 for (size_t i = 0; i < n; i++) {
6069 356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
6075 2 11 if (strcmp(meth, "bonferroni") == 0) {
6076 51 2 for (size_t i = 0; i < n; i++) {
6078 19 32 adj[arr[i].orig_idx] = (v < 1.0) ? v : 1.0;
6080 2 9 } else if (strcmp(meth, "holm") == 0) {
6082 51 2 for (size_t i = 0; i < n; i++) {
6084 32 19 if (v > cummax) cummax = v;
6085 22 29 adj[arr[i].orig_idx] = (cummax < 1.0) ? cummax : 1.0;
6087 2 7 } else if (strcmp(meth, "hochberg") == 0) {
6089 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6091 22 29 if (v < cummin) cummin = v;
6092 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6094 2 5 } else if (strcmp(meth, "bh") == 0) {
6096 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6098 41 10 if (v < cummin) cummin = v;
6099 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6101 2 3 } else if (strcmp(meth, "by") == 0) {
6103 51 2 for (size_t i = 1; i <= n; i++) q += 1.0 / i;
6105 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
6107 22 29 if (v < cummin) cummin = v;
6108 26 25 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
6110 2 1 } else if (strcmp(meth, "hommel") == 0) {
6112 0 2 Newx(pa, n, NV);
6113 0 2 Newx(q_arr, n, NV);
6116 49 2 for (size_t i = 1; i < n; i++) {
6118 0 49 if (temp < min_val) {
6123 51 2 for (size_t i = 0; i < n; i++) {
6127 48 2 for (size_t j = n - 1; j >= 2; j--) {
6132 1128 48 for (size_t k = 1; k < i2_len; k++) {
6134 266 862 if (temp_q1 < q1) {
6139 1224 48 for (size_t i = 0; i <= n_mj; i++) {
6141 847 377 q_arr[i] = (v < q1) ? v : q1;
6144 1176 48 for (size_t i = 0; i < i2_len; i++) {
6148 2400 48 for (size_t i = 0; i < n; i++) {
6149 1401 999 if (pa[i] < q_arr[i]) {
6155 51 2 for (size_t i = 0; i < n; i++) {
6156 50 1 NV v = (pa[i] > arr[i].p) ? pa[i] : arr[i].p;
6157 0 51 if (v > 1.0) v = 1.0;
6161 0 1 } else if (strcmp(meth, "none") == 0) {
6162 0 0 for (size_t i = 0; i < n; i++) {
6170 0 12 EXTEND(SP, n);
6171 306 12 for (size_t i = 0; i < n; i++) {
6185 19 13 for (size_t i = 0; i < items; i++) {
6187 12 7 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
12 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6190 284 11 for (size_t j = 0; j < len; j++) {
6192 284 0 if (tv && SvOK(*tv)) {
283 1 if (tv && SvOK(*tv)) {
6198 6 1 } else if (SvOK(arg)) {
6204 1 12 if (total_count == 0) croak("median needs >= 1 element");
6207 0 12 Newx(nums, total_count, NV);
6210 15 12 for (size_t i = 0; i < items; i++) {
6212 11 4 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
11 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6215 282 11 for (size_t j = 0; j < len; j++) {
6217 282 0 if (tv && SvOK(*tv)) {
282 0 if (tv && SvOK(*tv)) {
6224 4 0 } else if (SvOK(arg)) {
6233 4 8 if (total_count % 2 == 0) {
6240 6 6 RETVAL = median_val;
6247 11 59 if (strcmp(method, "pearson") != 0 &&
6248 5 6 strcmp(method, "spearman") != 0 &&
6249 1 4 strcmp(method, "kendall") != 0)
6254 69 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 69 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6259 0 69 if (nx == 0) croak("cor: x is empty");
6265 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)
6270 69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
6271 69 0 SvTYPE(SvRV(y_sv)) == SVt_PVAV);
6273 69 0 AV*restrict y_av = has_y ? (AV*)SvRV(y_sv) : NULL;
6274 69 0 size_t ny = has_y ? av_len(y_av) + 1 : 0;
6277 69 0 if (has_y && ny > 0) {
69 0 if (has_y && ny > 0) {
6279 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)
6285 68 1 if (!x_is_matrix && !y_is_matrix) {
68 0 if (!x_is_matrix && !y_is_matrix) {
6286 0 68 if (!has_y) {
6290 1 67 if (nx != ny)
6293 0 67 if (nx < 2)
6296 0 67 Newx(xd, nx, NV);
6297 0 67 Newx(yd, ny, NV);
6300 318 67 for (size_t i = 0; i < nx; i++) {
6302 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;
6304 318 0 if (!isnan(val)) {
6305 67 251 if (isnan(x_first)) x_first = val;
6306 242 9 else if (val != x_first) x_sd0 = 0;
6309 318 67 for (size_t i = 0; i < ny; i++) {
6311 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;
6313 318 0 if (!isnan(val)) {
6314 67 251 if (isnan(y_first)) y_first = val;
6315 242 9 else if (val != y_first) y_sd0 = 0;
6318 58 9 if (x_sd0 || y_sd0) {
0 58 if (x_sd0 || y_sd0) {
6320 9 0 if (x_sd0) croak("cor: standard deviation of x is 0");
6329 0 1 if (!x_is_matrix)
6334 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)
6338 0 1 if (ncols_x == 0) croak("cor: x matrix has zero columns");
6343 3 1 for (size_t i = 0; i < nrows; i++) {
6345 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)
6349 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6350 0 1 if (ny != nrows) croak("cor: x and y must have the same number of rows (%lu vs %lu)", nrows, ny);
6351 3 1 for (size_t i = 0; i < nrows; i++) {
6353 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)
6359 0 1 Newx(col_x, ncols_x, NV*);
6360 2 1 for (size_t j = 0; j < ncols_x; j++) {
6361 0 2 Newx(col_x[j], nrows, NV);
6364 6 2 for (size_t i = 0; i < nrows; i++) {
6368 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;
6370 6 0 if (!isnan(val)) {
6371 2 4 if (isnan(first)) first = val;
6372 4 0 else if (val != first) sd0 = 0;
6375 0 2 if (sd0) {
6376 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_x[k]);
6386 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6390 0 1 if (ncols_y == 0) croak("cor: y matrix has zero columns");
6392 0 1 Newx(col_y, ncols_y, NV*);
6393 2 1 for (size_t j = 0; j < ncols_y; j++) {
6394 0 2 Newx(col_y[j], nrows, NV);
6397 6 2 for (size_t i = 0; i < nrows; i++) {
6401 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;
6403 6 0 if (!isnan(val)) {
6404 2 4 if (isnan(first)) first = val;
6405 4 0 else if (val != first) sd0 = 0;
6408 0 2 if (sd0) {
6409 0 0 for (size_t k = 0; k < ncols_x; k++) Safefree(col_x[k]);
6411 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_y[k]);
6421 0 1 if (nrows < 2)
6428 0 1 Newx(rows_out, ncols_x, AV*);
6429 2 1 for (size_t i = 0; i < ncols_x; i++) {
6433 0 1 if (symmetric) {
6436 0 0 Newx(r_cache, ncols_x, NV*);
6437 0 0 for (size_t i = 0; i < ncols_x; i++)
6438 0 0 Newx(r_cache[i], ncols_x, NV);
6440 0 0 for (size_t i = 0; i < ncols_x; i++) {
6442 0 0 for (size_t j = i + 1; j < ncols_x; j++) {
6449 0 0 for (size_t i = 0; i < ncols_x; i++)
6450 0 0 for (size_t j = 0; j < ncols_x; j++)
6453 0 0 for (size_t i = 0; i < ncols_x; i++) Safefree(r_cache[i]);
6457 2 1 for (size_t i = 0; i < ncols_x; i++)
6458 4 2 for (size_t j = 0; j < ncols_y; j++)
6462 2 1 for (size_t i = 0; i < ncols_x; i++)
6466 2 1 for (size_t j = 0; j < ncols_x; j++) Safefree(col_x[j]);
6468 1 0 if (!symmetric) {
6469 2 1 for (size_t j = 0; j < ncols_y; j++) Safefree(col_y[j]);
6485 5 0 if (items > 0) {
6487 3 2 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
2 1 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
6492 2 0 if (center_sv) {
6494 0 2 if (!SvOK(val_sv)) {
6499 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) {
6501 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) {
6503 0 0 } else if (looks_like_number(val_sv)) {
6505 0 0 } else if (SvTRUE(val_sv)) {
6514 1 1 if (scale_sv) {
6516 0 1 if (!SvOK(val_sv)) {
6520 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) {
6522 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) {
6524 0 0 } else if (looks_like_number(val_sv)) {
6526 0 0 if (scale_val == 0.0) scale_val = 1.0; /* Prevent Division By Zero */
6527 0 0 } else if (SvTRUE(val_sv)) {
6538 2 3 if (data_items == 1) {
6540 1 1 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
1 0 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
6542 1 0 if (av_len(av) >= 0) {
6544 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) {
6550 1 4 if (is_matrix) {
6556 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");
6561 3 1 for (size_t r = 0; r < nrow; r++) {
6567 2 1 for (size_t c = 0; c < ncol; c++) {
6570 0 2 Newx(col_data, nrow, NV);
6572 6 2 for (size_t r = 0; r < nrow; r++) {
6574 6 0 if (row_sv && SvROK(*row_sv)) {
6 0 if (row_sv && SvROK(*row_sv)) {
6577 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;
6584 2 0 NV col_center = do_center_mean ? (col_sum / nrow) : center_val;
6587 2 0 if (do_scale_sd) {
6588 0 2 if (nrow <= 1) {
6594 6 2 for (size_t r = 0; r < nrow; r++) {
6601 6 2 for (size_t r = 0; r < nrow; r++) {
6603 6 0 NV final_val = (col_scale == 0.0) ? (0.0 / 0.0) : (centered / col_scale);
6610 0 1 EXTEND(SP, 1);
6617 16 4 for (size_t i = 0; i < data_items; i++) {
6619 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6622 0 0 for (unsigned int j = 0; j < len; j++) {
6624 0 0 if (tv && SvOK(*tv)) { total_count++; }
0 0 if (tv && SvOK(*tv)) { total_count++; }
6626 16 0 } else if (SvOK(arg)) {
6630 0 4 if (total_count == 0) croak("scale requires at least 1 numeric element");
6631 0 4 Newx(nums, total_count, NV);
6632 16 4 for (size_t i = 0; i < data_items; i++) {
6634 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6637 0 0 for (size_t j = 0; j < len; j++) {
6639 0 0 if (tv && SvOK(*tv)) {
0 0 if (tv && SvOK(*tv)) {
6644 16 0 } else if (SvOK(arg)) {
6649 3 1 if (do_center_mean) center_val = sum / total_count;
6650 3 1 if (do_scale_sd) {
6651 1 2 if (total_count <= 1) {
6656 10 2 for (size_t i = 0; i < total_count; i++) {
6662 0 3 EXTEND(SP, total_count);
6663 15 3 for (size_t i = 0; i < total_count; i++) {
6665 15 0 NV final_val = (scale_val == 0.0) ? (0.0 / 0.0) : (centered / scale_val);
6679 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) {
6682 1 0 if (items > 1 && SvOK(ST(1))) {
1 0 if (items > 1 && SvOK(ST(1))) {
6686 0 1 if (items > 2 && SvOK(ST(2))) {
0 0 if (items > 2 && SvOK(ST(2))) {
6690 0 1 if (items > 3 && SvOK(ST(3))) {
0 0 if (items > 3 && SvOK(ST(3))) {
6693 5 0 } else if (items % 2 == 0) {
6695 11 5 for (size_t i = 0; i < items; i += 2) {
6698 5 6 if (strEQ(key, "data")) {
6700 4 2 } else if (strEQ(key, "nrow")) {
6701 4 0 if (SvOK(val)) { nrow = (size_t)SvUV(val); nrow_set = TRUE; }
6702 1 1 } else if (strEQ(key, "ncol")) {
6703 1 0 if (SvOK(val)) { ncol = (size_t)SvUV(val); ncol_set = TRUE; }
6704 1 0 } else if (strEQ(key, "byrow")) {
6714 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) {
6718 0 5 size_t data_len = (UV)(av_top_index(data_av) + 1);
6719 1 4 if (data_len == 0) {
6723 0 4 if (!nrow_set && !ncol_set) {
0 0 if (!nrow_set && !ncol_set) {
6726 4 0 } else if (nrow_set && !ncol_set) {
3 1 } else if (nrow_set && !ncol_set) {
6728 0 1 } else if (!nrow_set && ncol_set) {
0 0 } else if (!nrow_set && ncol_set) {
6732 3 1 if (nrow == 0 || ncol == 0) {
0 3 if (nrow == 0 || ncol == 0) {
6740 6 3 for (r = 0; r < nrow; r++) {
6747 18 3 for (size_t i = 0; i < total_cells; i++) {
6750 18 0 SV*restrict val = fetched ? newSVsv(*fetched) : newSV(0);
6751 6 12 if (byrow) {
6791 0 22 if (items % 2 != 0) croak("Usage: lm(formula => 'mpg ~ wt * hp', data => \\%%mtcars)");
6793 42 22 for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) {
6796 21 21 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
6797 21 0 else if (strEQ(key, "data")) data_sv = val;
6800 1 21 if (!formula) croak("lm: formula is required");
6801 20 1 if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference");
1 19 if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference");
6805 19 0 if (SvTYPE(ref) == SVt_PVHV) {
6807 0 19 if (hv_iterinit(hv) == 0) croak("lm: Data hash is empty");
6809 19 0 if (entry) {
6811 19 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
12 7 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
6814 0 12 Newx(row_names, n, char*);
6815 70 12 for (size_t i = 0; i < n; i++) {
6820 7 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
7 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
6822 0 7 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 7 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
6824 224 7 while ((entry = hv_iternext(hv))) {
6832 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
6834 0 0 Newx(row_names, n, char*);
6835 0 0 Newx(row_hashes, n, HV*);
6836 0 0 for (size_t i = 0; i < n; i++) {
6838 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) {
6843 0 0 for (k = 0; k < i; k++) Safefree(row_names[k]);
6851 137 59 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
196 19 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
196 0 while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; }
6855 1 18 if (!tilde) {
6856 2 1 for (size_t i = 0; i < n; i++) Safefree(row_names[i]);
6857 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
6869 71 18 while (*p_idx) {
6871 0 71 if (p_idx[0] == 'I' && p_idx[1] == '(') {
0 0 if (p_idx[0] == 'I' && p_idx[1] == '(') {
6873 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++; }
6877 1 70 if (p_idx[0] == '-' && p_idx[1] == '1' &&
1 0 if (p_idx[0] == '-' && p_idx[1] == '1' &&
6878 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] == '-')) {
6884 8 62 if (p_idx[0] == '+' && p_idx[1] == '0' &&
0 8 if (p_idx[0] == '+' && p_idx[1] == '0' &&
6885 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] == '-')) {
6891 18 52 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
0 18 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
0 0 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') {
6897 18 52 if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') {
0 18 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') {
6901 8 62 if (p_idx[0] == '+' && p_idx[1] == '1' &&
0 8 if (p_idx[0] == '+' && p_idx[1] == '1' &&
6902 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] == '-')) {
6907 18 52 if (p_idx == rhs) {
6908 0 18 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; }
6909 0 18 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; }
6917 0 18 while ((p_idx = strstr(rhs, "++")) != NULL)
6919 0 18 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
6921 18 0 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
0 18 if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0';
6928 26 18 while (chunk != NULL) {
6929 1 25 if (strcmp(chunk, ".") == 0) {
6931 3 1 for (size_t c = 0; c <= (size_t)av_len(cols); c++) {
6933 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
6935 2 1 if (strcmp(col_name, lhs) != 0) {
6937 2 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
6938 1 1 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
6948 25 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
6949 8 17 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
6961 17 1 if (has_intercept) { terms[num_terms++] = savepv("Intercept"); }
6963 18 0 if (strlen(rhs_expanded) > 0) {
6965 27 18 while (chunk != NULL) {
6966 0 27 if (num_terms >= term_cap - 3) {
6971 1 26 if (star) {
6976 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';
6978 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';
6986 0 26 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
0 0 if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0';
6993 46 18 for (i = 0; i < num_terms; i++) {
6995 0 40 for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; } }
40 46 for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; } }
6996 46 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
7000 46 18 for (j = 0; j < p; j++) {
7001 0 46 if (p_exp + 32 >= exp_cap) {
7006 17 29 if (strcmp(uniq_terms[j], "Intercept") == 0) {
7009 5 24 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
7013 42 5 for (i = 0; i < n; i++) {
7015 42 0 if (str_val) {
7017 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; } }
7018 14 28 if (!found) {
7019 0 14 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
7025 5 0 if (num_levels > 0) {
7026 9 5 for (l1 = 0; l1 < num_levels - 1; l1++)
7027 13 9 for (l2 = l1 + 1; l2 < num_levels; l2++)
7028 6 7 if (strcmp(levels[l1], levels[l2]) > 0) { char *tmp = levels[l1]; levels[l1] = levels[l2]; levels[l2] = tmp; }
7029 9 5 for (l = 1; l < num_levels; l++) {
7030 0 9 if (p_exp >= exp_cap) {
7043 14 5 for (l = 0; l < num_levels; l++) Safefree(levels[l]);
7054 0 18 Newx(X, n * p, NV); Newx(Y, n, NV);
0 18 Newx(X, n * p, NV); Newx(Y, n, NV);
7055 0 18 Newx(valid_row_names, n, char*);
7059 292 18 for (i = 0; i < n; i++) {
7061 3 289 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
7065 823 289 for (j = 0; j < p; j++) {
7066 257 566 if (strcmp(exp_terms[j], "Intercept") == 0) {
7068 78 488 } else if (is_dummy[j]) {
7070 78 0 if (str_val) {
7071 27 51 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
7076 0 488 if (isnan(row_x[j])) { row_ok = FALSE; break; }
7079 0 289 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
7081 823 289 for (j = 0; j < p; j++) X[valid_n * p + j] = row_x[j];
7087 2 16 if (valid_n <= p) {
7088 5 2 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7089 5 2 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7090 5 2 for (j = 0; j < p_exp; j++) {
7092 0 5 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7096 0 2 if (row_hashes) Safefree(row_hashes);
7101 45 16 for (i = 0; i < p; i++)
7102 133 45 for (j = 0; j < p; j++) {
7104 2487 133 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * X[k * p + j];
7108 45 16 for (i = 0; i < p; i++) {
7110 815 45 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * Y[k];
7116 45 16 for (i = 0; i < p; i++) {
7117 1 44 if (aliased[i]) { beta[i] = NAN; }
7120 128 2 for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j];
130 44 for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j];
7130 286 16 for (i = 0; i < valid_n; i++) sum_y += Y[i];
7132 286 16 for (i = 0; i < valid_n; i++) {
7134 810 5 for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j];
815 286 for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j];
7137 254 32 NV diff_m = has_intercept ? (y_hat - mean_y) : y_hat;
7145 16 0 rse_sq = (df_res > 0) ? (rss / (NV)df_res) : NAN;
7151 16 0 if (final_rank != df_int && (mss + rss) > 0.0) {
16 0 if (final_rank != df_int && (mss + rss) > 0.0) {
7154 16 0 if (rse_sq > 0.0 && numdf > 0) {
16 0 if (rse_sq > 0.0 && numdf > 0) {
7157 0 0 } else if (rse_sq == 0.0) {
7161 0 0 } else if (final_rank == df_int) {
7164 45 16 for (j = 0; j < p; j++) {
7168 1 44 if (aliased[j]) {
7175 44 0 NV t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0));
0 0 NV t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0));
7194 16 0 if (!isnan(f_stat)) {
7203 41 16 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7204 41 16 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7205 45 16 for (j = 0; j < p_exp; j++) {
7207 9 36 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7212 7 9 if (row_hashes) Safefree(row_hashes);
7226 0 6 if (by == 0.0) {
7227 0 0 if (from == to) {
7228 0 0 EXTEND(SP, 1);
7236 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)) {
7244 0 6 if (n_elements_d < 0.0) n_elements_d = 0.0;
7247 0 6 EXTEND(SP, n_elements);
7248 3027 6 for (size_t i = 0; i < n_elements; i++) {
7258 1 1 AUTO_SEED_PRNG();
7263 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)) {
7269 0 2 if ((items - arg_start) % 2 != 0) {
7273 5 2 for (int i = arg_start; i < items; i += 2) {
7277 2 3 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
7278 1 2 else if (strEQ(key, "mean")) mean = SvNV(val);
7279 2 0 else if (strEQ(key, "sd")) sd = SvNV(val);
7282 1 1 if (sd < 0.0) croak("rnorm: standard deviation must be non-negative");
7284 1 0 if (n > 0) {
7287 5000 1 for (size_t i = 0; i < n; ) {
7294 1385 5000 } while (s >= 1.0 || s == 0.0);
0 5000 } while (s >= 1.0 || s == 0.0);
7298 4999 1 if (i < n) {
7319 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) {
7320 1 0 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
0 1 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
7331 2 1 while ((entry = hv_iternext(input_hv))) {
7334 2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
7337 12 2 for (size_t k = 0; k <= len; k++) {
7339 12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
7374 0 10 if (!SvROK(data_sv)) croak("aov: data is required and must be a reference");
7379 10 0 if (SvTYPE(ref) == SVt_PVHV) {
7381 0 10 if (hv_iterinit(hv) == 0) croak("aov: Data hash is empty");
7383 10 0 if (entry) {
7385 10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
7388 0 10 Newx(row_names, n, char*);
7389 70 10 for(i = 0; i < n; i++) {
7393 0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
7395 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
7397 0 0 while ((entry = hv_iternext(hv))) {
7405 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
7408 0 0 Newx(row_names, n, char*);
7409 0 0 Newx(row_hashes, n, HV*);
7410 0 0 for (i = 0; i < n; i++) {
7412 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) {
7418 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
7428 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++; }
7431 1 9 if (!tilde) {
7432 2 1 for (i = 0; i < n; i++) Safefree(row_names[i]);
7433 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
7440 0 9 while ((p_idx = strstr(rhs, "-1")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7441 0 9 while ((p_idx = strstr(rhs, "+0")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7442 0 9 while ((p_idx = strstr(rhs, "0+")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7443 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'; }
7444 0 9 while ((p_idx = strstr(rhs, "+1")) != NULL) { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7445 0 9 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
0 0 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
7446 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); }
7448 0 9 while ((p_idx = strstr(rhs, "++")) != NULL) memmove(p_idx, p_idx + 1, strlen(p_idx + 1) + 1);
7449 0 9 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
7451 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';
7455 12 9 while (chunk != NULL) {
7456 1 11 if (strcmp(chunk, ".") == 0) {
7458 3 1 for (size_t c = 0; c <= av_len(cols); c++) {
7460 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
7462 2 1 if (strcmp(col_name, lhs) != 0) {
7464 2 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
7465 1 1 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
7475 11 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
7476 3 8 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
7490 9 0 if (has_intercept) { terms[num_terms++] = savepv("Intercept"); }
7491 9 0 if (strlen(rhs_expanded) > 0) {
7493 13 9 while (chunk != NULL) {
7494 0 13 if (num_terms >= term_cap - 3) {
7499 1 12 if (star) {
7504 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';
7505 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';
7513 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';
7520 24 9 for (i = 0; i < num_terms; i++) {
7522 22 24 for (size_t k = 0; k < num_uniq; k++) {
7523 0 22 if (strcmp(terms[i], uniq_terms[k]) == 0) { found = TRUE; break; }
7525 24 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
7532 24 8 for (j = 0; j < p; j++) {
7533 9 15 if (p_exp + 64 >= exp_cap) {
7541 9 15 if (strcmp(uniq_terms[j], "Intercept") == 0) {
7551 2 13 if (colon) {
7559 4 2 for (size_t e = 0; e < p_exp; e++) {
7560 1 3 if (strcmp(parent_term[e], left) == 0) l_indices[l_count++] = e;
7561 1 3 if (strcmp(parent_term[e], right) == 0) r_indices[r_count++] = e;
7564 1 1 if (l_count == 0 || r_count == 0) {
0 1 if (l_count == 0 || r_count == 0) {
7568 1 1 for (unsigned int li = 0; li < l_count; li++) {
7569 1 1 for (unsigned int ri = 0; ri < r_count; ri++) {
7570 0 1 if (p_exp >= exp_cap) {
7591 4 9 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
7595 61 4 for (i = 0; i < n; i++) {
7597 61 0 if (str_val) {
7599 87 9 for (size_t l = 0; l < num_levels; l++) {
7600 52 35 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
7602 9 52 if (!found) {
7603 0 9 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
7609 4 0 if (num_levels > 0) {
7610 5 4 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
7611 6 5 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
7612 1 5 if (strcmp(levels[l1], levels[l2]) > 0) {
7620 5 4 for (size_t l = 1; l < num_levels; l++) {
7621 0 5 if (p_exp >= exp_cap) {
7638 9 4 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
7658 64 8 for(i = 0; i < n; i++) X_mat[i] = (NV*)safemalloc(p_exp * sizeof(NV));
7659 0 8 Newx(Y, n, NV);
7661 64 8 for (i = 0; i < n; i++) {
7663 0 64 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
7666 194 64 for (j = 0; j < p_exp; j++) {
7667 64 130 if (strcmp(exp_terms[j], "Intercept") == 0) {
7669 20 110 } else if (is_interact[j]) {
7671 70 40 } else if (is_dummy[j]) {
7673 70 0 if (str_val) {
7674 32 38 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
7679 0 40 if (isnan(row_x[j])) { row_ok = FALSE; break; }
7682 0 64 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
7684 194 64 for (j = 0; j < p_exp; j++) X_mat[valid_n][j] = row_x[j];
7690 1 7 if (valid_n <= p_exp) {
7692 3 1 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7693 3 1 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7694 3 1 for (j = 0; j < p_exp; j++) {
7696 0 3 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7702 2 1 for(i = 0; i < n; i++) Safefree(X_mat[i]);
7704 0 1 if (row_hashes) Safefree(row_hashes);
7705 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]); }
7717 20 7 for (i = 0; i < p_exp; i++) {
7718 7 13 if (strcmp(exp_terms[i], "Intercept") == 0) continue;
7719 1 12 if (aliased_qr[i]) continue;
7726 20 7 for (i = 0; i < p_exp; i++) {
7727 19 1 if (!aliased_qr[i]) rank++;
7730 43 7 for (i = rank; i < valid_n; i++) {
7734 7 0 NV ms_res = (res_df > 0) ? rss_prev / res_df : 0.0;
7736 19 7 for (j = 0; j < num_uniq; j++) {
7737 7 12 if (strcmp(uniq_terms[j], "Intercept") == 0) continue;
7741 11 1 NV ms = (df > 0) ? ss / df : 0.0;
7746 12 0 if (ms_res > 0.0 && df > 0) {
11 1 if (ms_res > 0.0 && df > 0) {
7766 1 6 if (is_stacked) {
7771 1 0 if (e) {
7773 1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
7781 18 7 for (size_t c = 0; c <= (size_t)av_len(all_cols); c++) {
7783 18 0 if (!col_sv || !SvOK(*col_sv)) continue;
0 18 if (!col_sv || !SvOK(*col_sv)) continue;
7787 147 18 for (i = 0; i < tgt_n; i++) {
7789 98 49 if (!isnan(val)) { col_sum += val; col_count++; }
7791 15 3 NV col_mean = (col_count > 0) ? col_sum / col_count : NAN;
7802 19 7 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7803 19 7 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7804 20 7 for (j = 0; j < p_exp; j++) {
7806 5 15 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7813 62 7 for (i = 0; i < n; i++) Safefree(X_mat[i]);
7816 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]); }
7818 0 7 if (row_hashes) Safefree(row_hashes);
7830 1 17 if (items < 1) croak("fisher_test requires at least a data reference");
7836 6 15 for (unsigned int i = 1; i < items; i += 2) {
7837 0 6 if (i + 1 >= items) croak("fisher_test: odd number of named arguments");
7840 5 1 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
0 5 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
7842 1 0 if (!(conf_level > 0 && conf_level < 1))
1 0 if (!(conf_level > 0 && conf_level < 1))
7844 5 0 } else if (strEQ(key, "alternative")) {
7846 5 0 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
3 2 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
7847 1 2 strNE(alternative, "greater"))
7853 0 15 if (!SvROK(data_ref)) croak("fisher_test requires a reference to a 2x2 Array or Hash");
7856 11 4 if (SvTYPE(deref) == SVt_PVAV) {
7858 0 11 if (av_len(outer) != 1) croak("Outer array must have exactly 2 rows");
7861 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)
7862 11 0 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
0 11 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
7865 10 1 if (av_len(r1) != 1 || av_len(r2) != 1)
0 10 if (av_len(r1) != 1 || av_len(r2) != 1)
7871 4 0 } else if (SvTYPE(deref) == SVt_PVHV) {
7875 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");
7880 1 3 SV *restrict row1_sv = hv_iterval(outer, swap_rows ? e2 : e1);
7881 1 3 SV *restrict row2_sv = hv_iterval(outer, swap_rows ? e1 : e2);
7882 4 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
4 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
7883 4 0 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
0 4 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
7888 8 4 for (unsigned int rr = 0; rr < 2; rr++) {
7890 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");
7895 4 4 HE *col0 = swap_cols ? c2 : c1;
7896 4 4 HE *col1 = swap_cols ? c1 : c2;
7904 0 13 if (a + b + c + d == 0) croak("fisher_test: table is all zeros");
7940 0 7 if (items % 2 != 0) croak("Usage: power_t_test(n => 30, delta => 0.5, sd => 1.0, ...)");
7941 27 7 for (unsigned short int i = 0; i < items; i += 2) {
7945 1 26 if (strEQ(key, "n")) sv_n = val;
7946 7 19 else if (strEQ(key, "delta")) sv_delta = val;
7947 7 12 else if (strEQ(key, "sd")) sv_sd = val;
7948 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;
7949 6 5 else if (strEQ(key, "power")) sv_power = val;
7950 3 2 else if (strEQ(key, "type")) type = SvPV_nolen(val);
7951 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
7952 0 0 else if (strEQ(key, "strict")) strict = SvTRUE(val);
7953 0 0 else if (strEQ(key, "tol")) tol = SvNV(val);
7957 1 6 bool is_null_n = (!sv_n || !SvOK(sv_n));
0 1 bool is_null_n = (!sv_n || !SvOK(sv_n));
7958 7 0 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
0 7 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
7959 6 1 bool is_null_power = (!sv_power || !SvOK(sv_power));
0 6 bool is_null_power = (!sv_power || !SvOK(sv_power));
7960 7 0 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
0 7 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
7961 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));
7964 6 1 if (is_null_n) missing_count++;
7965 0 7 if (is_null_delta) missing_count++;
7966 1 6 if (is_null_power) missing_count++;
7967 0 7 if (is_null_sd) missing_count++;
7968 0 7 if (is_null_sig_level) missing_count++;
7970 0 7 if (missing_count != 1) {
7974 1 6 NV n = is_null_n ? 0.0 : SvNV(sv_n);
7975 7 0 NV delta = is_null_delta ? 0.0 : SvNV(sv_delta);
7976 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);
7977 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);
7978 6 1 NV power = is_null_power ? 0.0 : SvNV(sv_power);
7979 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;
7980 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;
7981 6 1 if (tside == 2 && !is_null_delta) delta = fabs(delta);
6 0 if (tside == 2 && !is_null_delta) delta = fabs(delta);
7982 1 6 if (is_null_power) {
7984 6 0 } else if (is_null_n) {
7986 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;
7987 222 6 while (high - low > tol) {
7989 49 173 if (p_body(mid, delta, sd, sig_level, tsample, tside, strict) < power) low = mid;
7993 0 0 } else if (is_null_sd) {
7995 0 0 while (high - low > tol) {
7997 0 0 if (p_body(n, delta, mid, sig_level, tsample, tside, strict) > power) low = mid;
8001 0 0 } else if (is_null_delta) {
8003 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;
8004 0 0 while (high - low > tol) {
8006 0 0 if (p_body(n, mid, sd, sig_level, tsample, tside, strict) < power) low = mid;
8010 0 0 } else if (is_null_sig_level) {
8012 0 0 while (high - low > tol) {
8014 0 0 if (p_body(n, delta, sd, mid, tsample, tside, strict) < power) low = mid;
8026 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";
8028 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" : "");
8029 6 1 if (n_str[0] != '\0') hv_stores(ret, "note", newSVpv(n_str, 0));
8042 3 0 if (arg_idx < items && SvROK(ST(arg_idx))) {
2 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
8044 1 1 if (t == SVt_PVAV) {
8046 1 0 } else if (t == SVt_PVHV) {
8050 2 1 if (!h_sv && arg_idx < items
2 0 if (!h_sv && arg_idx < items
8051 1 1 && SvROK(ST(arg_idx))
8052 1 0 && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
8056 2 3 for (; arg_idx < items; arg_idx += 2) {
8059 1 1 if (strEQ(key, "x")) x_sv = val;
8060 1 0 else if (strEQ(key, "g")) g_sv = val;
8061 0 0 else if (strEQ(key, "h")) h_sv = val;
8065 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))
8075 1 2 if (h_sv) {
8076 1 0 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
0 1 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
8083 3 1 while ((he = hv_iternext(h_hv))) {
8085 3 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
0 3 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
8089 0 1 if (total < 2) croak("not enough observations");
8091 0 1 size_t num_keys = HvKEYS(h_hv);
8096 3 1 while ((he = hv_iternext(h_hv))) {
8098 0 3 const char *restrict key_str = HePV(he, klen);
8102 14 3 for (size_t i = 0; i < n_g; i++) {
8104 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)) {
8115 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)
8117 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)
8124 0 2 if (nx != ng) croak("kruskal_test: 'x' and 'g' must have the same length");
8125 0 2 if (nx < 2) croak("not enough observations");
8134 28 2 for (size_t i = 0; i < nx; i++) {
8137 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)
8138 28 0 && g_el && SvOK(*g_el)) {
28 0 && g_el && SvOK(*g_el)) {
8143 22 6 if (id_sv) {
8159 3 0 if (valid_n < 2 || k < 2) {
0 3 if (valid_n < 2 || k < 2) {
8161 0 0 if (group_names) {
8162 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]); }
8165 0 0 if (valid_n < 2) croak("not enough observations");
8175 42 3 for (size_t i = 0; i < valid_n; i++) {
8183 9 3 for (size_t i = 0; i < k; i++) {
8184 9 0 if (group_counts[i] > 0)
8190 0 3 if (tie_adj > 0.0) {
8207 9 3 for (size_t i = 0; i < k; i++) {
8208 9 0 if (group_counts[i] > 0 && group_names[i]) {
9 0 if (group_counts[i] > 0 && group_names[i]) {
8214 9 0 if (group_names[i]) Safefree(group_names[i]); // Clean up name copy
8239 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) {
8245 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) {
8250 0 6 if ((items - arg_idx) % 2 != 0) {
8254 2 6 for (; arg_idx < items; arg_idx += 2) {
8258 0 2 if (strEQ(key, "x")) x_sv = val;
8259 0 2 else if (strEQ(key, "y")) y_sv = val;
8260 1 1 else if (strEQ(key, "ratio")) ratio = SvNV(val);
8261 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);
8262 0 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
8266 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)
8268 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)
8271 6 0 if (ratio <= 0.0 || !isfinite(ratio))
0 6 if (ratio <= 0.0 || !isfinite(ratio))
8273 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))
8282 26 6 for (size_t i = 0; i < nx_raw; i++) {
8284 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)) {
8286 26 0 if (!isnan(val) && isfinite(val)) {
26 0 if (!isnan(val) && isfinite(val)) {
8297 21 6 for (size_t i = 0; i < ny_raw; i++) {
8299 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)) {
8301 21 0 if (!isnan(val) && isfinite(val)) {
21 0 if (!isnan(val) && isfinite(val)) {
8310 1 5 if (nx < 2) croak("not enough 'x' observations");
8311 1 4 if (ny < 2) croak("not enough 'y' observations");
8317 1 3 if (var_y == 0.0) croak("var_test: variance of 'y' is zero (cannot divide by zero)");
8323 0 3 if (strcmp(alternative, "less") == 0) {
8325 0 3 } else if (strcmp(alternative, "greater") == 0) {
8332 3 0 p_val = 2.0 * (p1 < p2 ? p1 : p2);
8362 0 6 SV *restrict ret = &PL_sv_undef;
8364 0 6 if (!PL_srand_called) {
8368 0 6 if (n < 0) n = 0;
8369 6 0 if (SvROK(ref)) {
8372 3 3 if (SvTYPE(rv) == SVt_PVHV) {
8375 3 0 unsigned limit = (n < (IV)count) ? (I32)n : count;
8378 3 0 if (count > 0 && limit > 0) {
3 0 if (count > 0 && limit > 0) {
8385 12 3 while ((entry = hv_iternext(hv)))
8389 6 3 for (i = 0; i < limit; i++) {
8399 6 3 for (i = 0; i < limit; i++) {
8405 0 6 (void)hv_store(
8416 3 0 } else if (SvTYPE(rv) == SVt_PVAV) {/* --- ARRAY REFERENCE --- */
8418 0 3 size_t count = av_top_index(av) + 1; /* signed; 0 for empty AV */
8422 3 0 if (n > 0)
8424 3 0 if (count > 0) {
8429 0 3 Newx(idx, count, size_t);
8430 15 3 for (size_t i = 0; i < count; i++)
8433 6 3 for (size_t i = 0; i < limit; i++) {
8440 6 3 for (size_t i = 0; i < (size_t)n; i++) {
8441 6 0 if (i < limit) {
8444 6 0 if (sv && sv != &PL_sv_undef)
6 0 if (sv && sv != &PL_sv_undef)
8455 0 0 for (size_t i = 0; i < (size_t)n; i++)
8468 0 23 if (items < 1) {
8475 0 23 if ((items - 1) % 2 != 0) {
8478 9 23 for (size_t i = 1; i < items; i += 2) {
8481 3 6 if (strEQ(key, "mean")) mean = SvNV(val);
8482 4 2 else if (strEQ(key, "sd")) sd = SvNV(val);
8483 2 0 else if (strEQ(key, "log")) give_log = SvTRUE(val) ? 1 : 0;
8487 1 22 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
1 0 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
8492 1 0 if (n > 0) {
8494 3 1 for (IV i = 0; i < n; i++) {
8496 3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
8520 4 0 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
0 4 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
8523 4 0 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
0 4 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
8530 4 4 while ((h_entry = hv_iternext(h_hv))) {
8535 4 0 if (i_fetch_he) {
8538 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)) {
8541 2 1 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8545 2 2 while ((i_entry = hv_iternext(i_row_hv))) {
8550 1 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8556 2 1 for (SSize_t idx = 0; idx < top_idx; idx += 2) {
8560 2 0 if (key_svp && val_svp) {
2 0 if (key_svp && val_svp) {
8578 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)) {
8581 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)) {
8584 10 2 target_root_mode = (SvTYPE(SvRV(h_ref)) == SVt_PVHV) ? 1 : 2;
8585 10 2 i_root_mode = (SvTYPE(SvRV(i_ref)) == SVt_PVHV) ? 1 : 2;
8587 10 2 if (target_root_mode == 1) {
8589 0 10 if (HvKEYS(h_hv) > 0) {
8 2 if (HvKEYS(h_hv) > 0) {
8592 54 0 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
46 8 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
8593 8 46 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)) {
8595 8 0 if (SvROK(val)) {
8596 5 3 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
8597 3 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
8605 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++) {
8607 2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
8608 2 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
8609 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
8614 2 10 if (target_inner_mode == 0) {
8615 2 0 if (i_root_mode == 1) {
8617 0 2 if (HvKEYS(i_hv) > 0) {
2 0 if (HvKEYS(i_hv) > 0) {
8620 14 0 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
12 2 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
8621 2 12 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)) {
8623 2 0 if (SvROK(val)) {
8624 1 1 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
8625 1 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
8633 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++) {
8635 0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
8636 0 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
8637 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
8642 0 12 if (target_inner_mode == 0) { target_inner_mode = 1; }
8647 10 2 if (i_root_mode == 1) {
8658 30 6 if (i_root_mode == 1) {
8660 10 20 if (!i_entry) break;
8664 2 18 current_idx = looks_like_number(row_key_sv) ? SvIV(row_key_sv) : -1;
8666 2 4 if (i_idx > i_top) break;
8669 4 0 if (!svp || !*svp) continue;
0 4 if (!svp || !*svp) continue;
8674 23 1 if (SvROK(i_row_sv)) {
8679 18 5 if (target_root_mode == 1) {
8681 9 9 if (h_fetch_he) h_row_sv = HeVAL(h_fetch_he);
8683 4 1 if (current_idx >= 0) {
8685 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;
8688 11 12 if (h_row_sv && SvROK(h_row_sv)) {
11 0 if (h_row_sv && SvROK(h_row_sv)) {
8689 7 4 if (SvTYPE(SvRV(h_row_sv)) == SVt_PVHV) {
8691 4 0 } else if (SvTYPE(SvRV(h_row_sv)) == SVt_PVAV) {
8696 16 7 if (!h_row_hv && !h_row_av) {
12 4 if (!h_row_hv && !h_row_av) {
8697 3 9 if (target_inner_mode == 2) {
8704 9 3 if (target_root_mode == 1) {
8707 2 1 if (current_idx >= 0) {
8713 16 7 if (h_row_hv) {
8714 12 4 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8719 13 12 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
8724 4 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8728 6 4 for (SSize_t idx = 0; idx < inner_top_idx; idx += 2) {
8731 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) {
8732 6 0 SV *restrict val_to_store = *val_svp ? *val_svp : &PL_sv_undef;
8737 7 0 } else if (h_row_av) {
8738 5 2 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8742 11 5 for (SSize_t idx = 0; idx <= inner_top_idx; ++idx) {
8744 11 0 if (val_svp) {
8745 11 0 SV *restrict val_to_push = *val_svp ? *val_svp : &PL_sv_undef;
8747 11 0 if (sv_inc) {
8752 2 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8757 2 2 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
8760 2 0 if (col_key_sv && col_val) {
2 0 if (col_key_sv && col_val) {
8763 2 0 if (sv_key_inc && sv_val_inc) {
2 0 if (sv_key_inc && sv_val_inc) {
8780 1 10 if (items == 0) {
8784 1 9 if (!SvOK(arg1)) {
8790 2 7 if (!SvROK(arg1)) {
8791 4 2 for (unsigned i = 0; i < items; i++) {
8796 1 6 if (SvTYPE(rv) == SVt_PVAV) {
8799 3 1 for (unsigned i = 0; i < len; i++) {
8801 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8803 6 0 } else if (SvTYPE(rv) == SVt_PVHV) { // CASES 3, 4, 5: Hash Reference
8806 3 3 if (items > 1) {
8812 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) {
8815 3 1 for (unsigned i = 0; i < len; i++) {
8817 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8823 6 2 while ((he = hv_iternext(hv))) {
8825 6 0 if (SvROK(inner_sv)) {
8827 6 0 if (SvTYPE(inner_rv) == SVt_PVHV) {// CASE 5: Hash of Hashes
8830 3 3 if (valp) increment_count(aTHX_ counts_hv, *valp);
8831 0 0 } else if (SvTYPE(inner_rv) == SVt_PVAV) {// CASE 4: Hash of Arrays (Row-Oriented)
8832 0 0 if (looks_like_number(arg2)) {
8836 0 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8845 8 3 while ((he = hv_iternext(hv))) {
8847 5 3 if (SvROK(val)) {// --- SAFETY CHECK
8850 2 3 if (SvTYPE(inner_rv) == SVt_PVAV) {
8853 6 2 for (unsigned i = 0; i < len; i++) {
8855 6 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8857 3 0 } else if (SvTYPE(inner_rv) == SVt_PVHV) {
8862 4 3 while ((inner_he = hv_iternext(inner_hv))) {
8921 1 7 if (!SvOK(data_ref)) {
8924 1 6 if (!SvOK(target_key_sv)) {
8927 1 5 if (!SvOK(group_key_sv)) {
8931 0 5 if (!SvROK(data_ref)) {
8934 2 3 if (items > 3) { /* Capture the optional filter argument */
8936 2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
8944 2 3 if (SvTYPE(SvRV(data_ref)) == SVt_PVAV) { /* Input is an Array of Hashes (AoH) */
8947 8 2 for (SSize_t i = 0; i < len; i++) {
8949 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) {
8953 8 0 if (group_he) {
8955 7 1 SV *restrict target_val = target_he ? HeVAL(target_he) : NULL;
8956 7 1 if (target_val && SvOK(target_val)) {
7 0 if (target_val && SvOK(target_val)) {
8958 4 3 if (filter_hv) {
8961 4 2 while ((f_he = hv_iternext(filter_hv))) {
8965 4 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
8967 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);
8968 2 2 if (!keep) {
8974 5 2 if (pass_filter) {
8977 1 4 if (res_he) {
8989 3 0 } else if (SvTYPE(SvRV(data_ref)) == SVt_PVHV) {
8993 2 1 if (group_he && target_he &&
2 0 if (group_he && target_he &&
8994 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 &&
8995 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) {
9001 8 2 for (SSize_t i = 0; i < len; i++) {
9004 8 0 if (g_svp && *g_svp) {
8 0 if (g_svp && *g_svp) {
9006 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;
9007 8 0 if (t_val && SvOK(t_val)) {
7 1 if (t_val && SvOK(t_val)) {
9009 4 3 if (filter_hv) {
9012 4 2 while ((f_he = hv_iternext(filter_hv))) {
9017 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) {
9020 4 0 if (val_svp) val_sv = *val_svp;
9023 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);
9024 2 2 if (!keep) {
9030 5 2 if (pass_filter) {
9033 1 4 if (res_he) {
9047 5 1 while ((row_he = hv_iternext(data_hv))) {
9049 5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
9053 5 0 if (inner_group_he) {
9055 4 1 SV *restrict t_val = inner_target_he ? HeVAL(inner_target_he) : NULL;
9056 4 1 if (t_val && SvOK(t_val)) {
3 1 if (t_val && SvOK(t_val)) {
9058 0 3 if (filter_hv) {
9061 0 0 while ((f_he = hv_iternext(filter_hv))) {
9065 0 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
9067 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);
9068 0 0 if (!keep) {
9074 3 0 if (pass_filter) {
9077 1 2 if (res_he) {
9107 11 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
10 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
9109 2 8 if (t == SVt_PVAV || t == SVt_PVHV) {
2 0 if (t == SVt_PVAV || t == SVt_PVHV) {
9115 2 10 if ((items - arg_idx) % 2 != 0) croak("Usage: prcomp($data, key => value, ...)");
9116 4 10 for (; arg_idx < items; arg_idx += 2) {
9119 0 4 if (strEQ(key, "x")) x_sv = val;
9120 0 4 else if (strEQ(key, "retx")) retx = SvTRUE(val);
9121 0 4 else if (strEQ(key, "center")) center = SvTRUE(val);
9122 2 2 else if (strEQ(key, "scale")) do_scale = SvTRUE(val);
9123 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;
9124 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;
9128 9 1 if (!x_sv || !SvROK(x_sv))
0 9 if (!x_sv || !SvROK(x_sv))
9137 7 2 if (SvTYPE(ref) == SVt_PVAV) {
9140 6 1 if (n_raw > 0) {
9142 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) {
9147 2 0 } else if (SvTYPE(ref) == SVt_PVHV) {
9149 2 0 if (hv_iterinit(hv) > 0) {
9152 2 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 1 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
9155 1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
9162 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");
9165 1 7 if (is_hoh) {
9171 0 1 if (p == 0) croak("prcomp: inner hashes cannot be empty");
9175 2 1 while ((entry = hv_iternext(inner))) {
9179 1 6 } else if (is_hoa) {
9182 0 1 if (p == 0) croak("prcomp: input hash is empty");
9186 2 1 while ((entry = hv_iternext(hv))) {
9194 6 2 if (is_aoa) {
9196 18 6 for (size_t i = 0; i < n_raw; i++) {
9198 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) {
9201 36 18 for (size_t j = 0; j < p; j++) {
9203 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)) {
9205 0 35 if (!isfinite(v)) row_ok = FALSE;
9209 17 1 if (row_ok) n++;
9212 1 1 } else if (is_hoa) {
9215 2 1 for (size_t j = 0; j < p; j++) {
9219 3 1 for (size_t i = 0; i < n_raw; i++) {
9221 6 3 for (size_t j = 0; j < p; j++) {
9223 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)) {
9225 0 6 if (!isfinite(v)) row_ok = FALSE;
9229 3 0 if (row_ok) n++;
9232 1 0 } else if (is_hoh) {
9236 3 1 while ((entry = hv_iternext(hv))) {
9239 6 3 for (size_t j = 0; j < p; j++) {
9241 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)) {
9243 0 6 if (!isfinite(v)) row_ok = FALSE;
9247 3 0 if (row_ok) n++;
9250 0 8 if (n == 0) {
9251 0 0 if (colnames) {
9252 0 0 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
9261 15 7 for (size_t j = 0; j < p; j++) {
9263 43 15 for (size_t i = 0; i < n; i++) col_sum += X_mat[i * p + j];
9264 15 0 if (center) {
9266 43 15 for (size_t i = 0; i < n; i++) X_mat[i * p + j] -= cen_vec[j];
9268 3 12 if (do_scale) {
9270 9 3 for (size_t i = 0; i < n; i++) {
9271 9 0 NV val = X_mat[i * p + j] - (center ? 0 : (col_sum / n));
9274 3 0 sc_vec[j] = (n > 1) ? sqrt(sum_sq / (n - 1)) : 0.0;
9275 1 2 if (sc_vec[j] <= 1e-15) {
9277 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); }
9280 6 2 for (size_t i = 0; i < n; i++) X_mat[i * p + j] /= sc_vec[j];
9285 20 7 for (size_t i = 0; i < n; i++) {
9286 40 20 for (size_t j = 0; j < p; j++) {
9287 60 40 for (size_t k = j; k < p; k++) {
9293 14 7 for (size_t j = 0; j < p; j++) {
9294 7 14 for (size_t k = 0; k < j; k++) {
9304 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;
9306 7 0 NV n_adj = (n > 1) ? (NV)(n - 1) : 1.0;
9307 13 7 for (size_t j = 0; j < k_cols; j++) {
9309 0 13 if (e_val < 0.0) e_val = 0.0; // clamp floating point inaccuracy
9312 1 6 if (tol >= 0.0) {
9315 2 1 for (size_t j = 0; j < k_cols; j++) {
9316 1 1 if (sdev[j] > threshold) rank_est++;
9318 1 0 if (rank_est < k_cols) k_cols = rank_est;
9323 12 7 for (size_t j = 0; j < k_cols; j++) av_push(sdev_av, newSVnv(sdev[j]));
9326 14 7 for (size_t j = 0; j < p; j++) {
9328 24 14 for (size_t m = 0; m < k_cols; m++) {
9334 7 0 if (retx) {
9336 20 7 for (size_t i = 0; i < n; i++) {
9338 34 20 for (size_t m = 0; m < k_cols; m++) {
9340 68 34 for (size_t c = 0; c < p; c++) {
9349 2 5 if (colnames) {
9351 4 2 for (size_t j = 0; j < p; j++) {
9356 7 0 if (center) {
9358 14 7 for (size_t j = 0; j < p; j++) av_push(c_av, newSVnv(cen_vec[j]));
9363 1 6 if (do_scale) {
9365 2 1 for (size_t j = 0; j < p; j++) av_push(sc_av, newSVnv(sc_vec[j]));
9371 2 5 if (colnames) {
9372 4 2 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
9389 0 38 SvGETMAGIC(input_ref);
0 0 SvGETMAGIC(input_ref);
9390 1 37 if (!SvROK(input_ref))
9393 14 23 if (ref_type == SVt_PVHV) {// ── Hash-of-Hashes
9399 23 12 while ((he_row = hv_iternext(in_hv))) {
9403 0 23 SvGETMAGIC(row_val);
0 0 SvGETMAGIC(row_val);
9405 22 1 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
1 21 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
9409 33 21 while ((he_col = hv_iternext(in_inner_hv))) {
9414 0 33 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
9416 14 19 if (out_inner_he) {
9418 14 0 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
0 14 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
9424 0 19 if (!hv_store_ent(out_hv, col_key_sv, inner_ref, 0)) {
9430 0 33 if (!hv_store_ent(out_inner_hv, row_key_sv, val, 0)) {
9436 22 1 } else if (ref_type == SVt_PVAV) { // Array-of-Arrays
9442 21 1 if (nrows > 0) {// Pass 1: validate all rows; fix ncols from row 0
9445 20 1 if (!elem || !*elem)
0 20 if (!elem || !*elem)
9447 0 20 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9448 19 1 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
1 18 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
9452 19 16 for (SSize_t i = 1; i < nrows; i++) {
9455 19 0 if (!elem || !*elem)
0 19 if (!elem || !*elem)
9457 0 19 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9458 19 0 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
0 19 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
9461 2 17 if (row_ncols != ncols)
9467 15 1 if (ncols > 0) {
9469 32 15 for (SSize_t j = 0; j < ncols; j++) {
9472 0 32 if (!av_store(out_av, j, col_ref)) {
9478 67 32 for (SSize_t i = 0; i < nrows; i++) {
9480 67 0 if (elem && *elem) {
67 0 if (elem && *elem) {
9481 0 67 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9485 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;
9486 0 67 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
9488 0 67 if (!av_store(out_col_av, i, val)) {