Branch Coverage

LikeR.xs
Criterion Covered Total %
branch 4297 6226 69.0


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 double 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 105739 186252 if (Drand01() <= prob) successes++;
159 198 0 if (k < 0 || k > n || n < 0) return -INFINITY;
198 0 if (k < 0 || k > n || n < 0) return -INFINITY;
0 198 if (k < 0 || k > n || n < 0) return -INFINITY;
173 0 10 if (S->ns <= 0) { S->logdc = NULL; return 0; }
174 0 10 Newx(S->logdc, S->ns, double);
175 66 10 for (long i = 0; i < S->ns; i++) {
186 690 90 for (long i = 0; i < S->ns; i++) {
188 516 174 if (out[i] > mx) mx = out[i];
191 690 90 for (long i = 0; i < S->ns; i++) { out[i] = exp(out[i] - mx); s += out[i]; }
192 690 90 for (long i = 0; i < S->ns; i++) out[i] /= s;
196 0 37 if (ncp == 0) return (double)S->lo;
197 0 37 if (isinf(ncp)) return (double)S->hi;
200 265 37 for (long i = 0; i < S->ns; i++) mu += (double)(S->lo + i) * scratch[i];
206 16 52 if (ncp == 1.0) {
208 112 16 for (long i = 0; i < S->ns; i++) {
210 61 51 if (upper ? (j >= q) : (j <= q)) s += exp(S->logdc[i]);
60 52 if (upper ? (j >= q) : (j <= q)) s += exp(S->logdc[i]);
214 2 50 if (ncp == 0.0) return upper ? (double)(q <= S->lo) : (double)(q >= S->lo);
2 0 if (ncp == 0.0) return upper ? (double)(q <= S->lo) : (double)(q >= S->lo);
0 2 if (ncp == 0.0) return upper ? (double)(q <= S->lo) : (double)(q >= S->lo);
0 0 if (ncp == 0.0) return upper ? (double)(q <= S->lo) : (double)(q >= S->lo);
215 0 50 if (isinf(ncp)) return upper ? (double)(q <= S->hi) : (double)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (double)(q <= S->hi) : (double)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (double)(q <= S->hi) : (double)(q >= S->hi);
0 0 if (isinf(ncp)) return upper ? (double)(q <= S->hi) : (double)(q >= S->hi);
218 402 50 for (long i = 0; i < S->ns; i++) {
220 235 167 if (upper ? (j >= q) : (j <= q)) s += scratch[i];
203 199 if (upper ? (j >= q) : (j <= q)) s += scratch[i];
229 81 0 while (maxit-- > 0) {
231 29 52 if (fabs(fc) < fabs(fb)) { a = b; b = c; c = a; fa = fb; fb = fc; fc = fa; }
234 70 11 if (fabs(step) <= tol_act || fb == 0.0) return b;
0 70 if (fabs(step) <= tol_act || fb == 0.0) return b;
235 70 0 if (fabs(prev) >= tol_act && fabs(fa) > fabs(fb)) {
70 0 if (fabs(prev) >= tol_act && fabs(fa) > fabs(fb)) {
237 45 25 if (a == c) { double t1 = fb / fa; p = cb * t1; q = 1.0 - t1; }
243 27 43 if (p > 0) q = -q; else p = -p;
244 68 2 if (p < 0.75 * cb * q - fabs(tol_act * q) / 2 && p < fabs(prev * q / 2)) step = p / q;
57 11 if (p < 0.75 * cb * q - fabs(tol_act * q) / 2 && p < fabs(prev * q / 2)) step = p / q;
246 9 61 if (fabs(step) < tol_act) step = step > 0 ? tol_act : -tol_act;
4 5 if (fabs(step) < tol_act) step = step > 0 ? tol_act : -tol_act;
248 45 25 if ((fb > 0) == (fc > 0)) { c = a; fc = fa; }
271 0 5 if (!ft_init(&S, a, b, c, d)) return 1.0;
272 0 5 double *restrict sc; Newx(sc, S.ns, double);
274 1 4 if (!strcmp(alt, "less")) p = ft_pnhyper(&S, S.x, 1.0, 0, sc);
275 1 3 else if (!strcmp(alt, "greater")) p = ft_pnhyper(&S, S.x, 1.0, 1, sc);
279 10 13 for (long i = 0; i < S.ns; i++) if (sc[i] <= dx * relErr) s += sc[i];
23 3 for (long i = 0; i < S.ns; i++) if (sc[i] <= dx * relErr) s += sc[i];
282 0 5 if (p < 0) p = 0; if (p > 1) p = 1;
0 5 if (p < 0) p = 0; if (p > 1) p = 1;
290 0 5 if (!ft_init(&S, a, b, c, d)) { *orp = NAN; *lop = NAN; *hip = NAN; return; }
291 0 5 double *restrict sc; Newx(sc, S.ns, double);
296 0 5 if (x == lo) est = 0.0;
297 1 4 else if (x == hi) est = INFINITY;
301 0 4 if (mu > x) { r.mode = 0; est = ft_zeroin(0, 1, ft_rootf, &r, FT_TOL, 1000); }
302 4 0 else if (mu < x) { r.mode = 1; est = 1.0 / ft_zeroin(FT_EPS, 1, ft_rootf, &r, FT_TOL, 1000); }
323 1 4 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
0 1 if (!strcmp(alt, "less")) { clo = 0.0; FT_NCP_U(1 - conf, chi); }
0 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); }
324 1 3 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
0 1 else if (!strcmp(alt, "greater")) { FT_NCP_L(1 - conf, clo); chi = INFINITY; }
1 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; }
325 0 3 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
1 2 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
2 0 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
1 2 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
0 2 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
2 0 else { double al = (1 - conf) / 2; FT_NCP_L(al, clo); FT_NCP_U(al, chi); }
333 20 0 if (!sv || !SvOK(sv)) croak("fisher_test: %s is undef", what);
0 20 if (!sv || !SvOK(sv)) croak("fisher_test: %s is undef", what);
334 0 20 if (!looks_like_number(sv)) croak("fisher_test: %s is not a number", what);
336 0 20 if (v < 0) croak("fisher_test: %s must be nonnegative (got %" IVdf ")", what, v);
349 176 70 for (size_t k = 0; k < n; k++) {
353 176 70 for (size_t k = 0; k < n; k++) {
356 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) {
359 3 1 for (size_t i = 0; i < n; i++) {
368 465 175 for (size_t j = 0; j < n; j++) A[k * n + j] *= pivot;
369 465 175 for (size_t i = 0; i < n; i++) {
370 290 175 if (i != k && A[i * n + k] != 0.0) {
284 6 if (i != k && A[i * n + k] != 0.0) {
373 806 284 for (size_t j = 0; j < n; j++) {
386 1184 621 if (row_hashes) {
388 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) {
392 621 0 } else if (data_hoa) {
394 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) {
399 1805 0 if (val && SvOK(*val)) {
1802 3 if (val && SvOK(*val)) {
400 1753 49 if (looks_like_number(*val)) return SvNV(*val);
409 9 0 if (data_hoa) {
412 24 9 while ((entry = hv_iternext(data_hoa))) {
415 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]) {
418 0 0 while ((entry = hv_iternext(row_hashes[0]))) {
427 1837 0 if (!term || term[0] == '\0') return NAN;
0 1837 if (!term || term[0] == '\0') return NAN;
431 32 1805 if (colon) {
436 32 0 if (isnan(left) || isnan(right)) return NAN;
0 32 if (isnan(left) || isnan(right)) return NAN;
439 0 1805 if (strncmp(term_cpy, "I(", 2) == 0) {
441 0 0 if (end) *end = '\0';
445 0 0 if (caret) {
452 0 0 if (isnan(v)) return NAN;
453 0 0 return power == 1 ? v : pow(v, power);
462 89 1 for (size_t i = 0; i < n; i++) {
464 55 34 if (row_hashes) {
466 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) {
470 34 0 } else if (data_hoa) {
472 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) {
477 57 32 if (val && SvOK(*val)) {
57 0 if (val && SvOK(*val)) {
478 47 10 if (looks_like_number(*val)) return FALSE; // First valid is number -> Numeric Column
488 0 371 if (row_hashes) {
490 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) {
494 371 0 } else if (data_hoa) {
496 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) {
501 371 0 if (val && SvOK(*val)) {
371 0 if (val && SvOK(*val)) {
516 707 812 if (diff < 0) return -1;
517 812 0 if (diff > 0) return 1;
533 53 4 if (diff < 0) return -1;
534 3 1 if (diff > 0) return 1;
542 0 8 Newx(ri, n, RankItem);
543 48 8 for (size_t i = 0; i < n; i++) { ri[i].val = in[i]; ri[i].idx = i; }
547 47 8 while (i < n) {
550 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++;
553 48 47 for (size_t k = i; k <= j; k++) out[ri[k].idx] = avg;
563 303 61 for (size_t i = 0; i < n; i++) {
569 0 61 if (den == 0.0) return NAN;
583 8 1 for (size_t i = 0; i < n - 1; i++) {
584 36 8 for (size_t j = i + 1; j < n; j++) {
587 1 35 if (sx == 0 && sy == 0) { /* joint tie — not counted */ }
0 1 if (sx == 0 && sy == 0) { /* joint tie — not counted */ }
588 1 35 else if (sx == 0) tie_x++;
589 0 35 else if (sy == 0) tie_y++;
590 35 0 else if (sx == sy) C++;
595 0 1 if (denom == 0.0) return NAN;
603 3 59 if (strcmp(method, "spearman") == 0) {
605 0 3 Newx(rx, n, double); Newx(ry, n, double);
0 3 Newx(rx, n, double); Newx(ry, n, double);
612 1 58 if (strcmp(method, "kendall") == 0)
628 0 8623 if (fabs(d) < FPMIN) d = FPMIN;
630 183201 0 for (m = 1; m <= MAX_ITER; m++) {
634 0 183201 if (fabs(d) < FPMIN) d = FPMIN;
636 0 183201 if (fabs(c) < FPMIN) c = FPMIN;
640 0 183201 if (fabs(d) < FPMIN) d = FPMIN;
642 0 183201 if (fabs(c) < FPMIN) c = FPMIN;
644 8623 174578 if (fabs(del - 1.0) < EPS) break;
650 5 8664 if (x <= 0.0) return 0.0;
651 41 8623 if (x >= 1.0) return 1.0;
653 7034 1589 if (x < (a + 1.0) / (a + b + 2.0)) return bt * _incbeta_cf(a, b, x) / a;
660 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;
661 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;
669 384 277 while (get_t_pvalue(high, df, "greater") > p_tail) {
672 0 384 if (high > 1000000.0) break; /* Fallback limit */
675 7586 0 for (unsigned short int i = 0; i < 100; i++) {
678 3711 3875 if (p_mid > p_tail) {
683 277 7309 if (high - low < 1e-8) break;
695 0 0 if (n == 0) return 1;
704 5 0 double step = (n_bins > 0) ? (breaks[1] - breaks[0]) : 0.0;
706 18 5 for (size_t i = 0; i < n_bins; i++) {
711 3 2 if (step > 0.0) {
712 2014 3 for (size_t j = 0; j < n; j++) {
715 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;
719 3 2011 if (idx >= n_bins) {
725 1816 207 while (idx > 0 && val <= breaks[idx]) {
9 1807 while (idx > 0 && val <= breaks[idx]) {
729 1811 203 while (idx < n_bins - 1 && val > breaks[idx + 1]) {
0 1811 while (idx < n_bins - 1 && val > breaks[idx + 1]) {
734 2 0 } else if (n_bins > 0) {
739 18 5 for (size_t i = 0; i < n_bins; i++) {
741 16 2 if (bin_width > 0) {
744 2 0 density[i] = (n_bins == 1) ? 1.0 : 0.0;
767 22 8 if (fabs(y) < 0.42) {
773 7 1 if (y > 0) r = 1.0 - p;
777 1 7 if (y < 0) x = -x;
795 5 1 for (size_t i = 0; i < n; i++) { perm[i] = i + 1; c[i] = 0; }
810 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] */
813 205 1 while (k < n) {
814 119 86 if (c[k] < k) {
816 44 75 if (k % 2 == 0) {
821 595 119 TALLY_PERM();
7 112 TALLY_PERM();
115 4 TALLY_PERM();
836 0 1 if (strcmp(alt, "greater") == 0) return p_le;
837 0 1 if (strcmp(alt, "less") == 0) return p_ge;
839 1 0 double p = 2.0 * (p_le < p_ge ? p_le : p_ge);
840 0 1 return (p > 1.0) ? 1.0 : p;
849 22 2 for (long i = 0; i <= max_inv; i++) dp[i] = 0.0;
852 8 2 for (size_t i = 2; i <= n; i++) {
854 88 8 for (long k = 0; k <= max_inv; k++) next_dp[k] = 0.0;
856 48 8 for (int k = 0; k <= current_max_inv; k++) {
858 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++) {
869 0 2 if (i_obs < 0) i_obs = 0;
870 0 2 if (i_obs > max_inv) i_obs = max_inv;
872 18 2 for (long k = i_obs; k <= max_inv; k++) p_le += dp[k];
874 6 2 for (long k = 0; k <= i_obs; k++) p_ge += dp[k];
876 0 2 if (strcmp(alt, "greater") == 0) return p_ge;
877 1 1 if (strcmp(alt, "less") == 0) return p_le;
879 1 0 double p = 2.0 * (p_ge < p_le ? p_ge : p_le);
880 0 1 return p > 1.0 ? 1.0 : p;
884 0 304 if (f <= 0.0) return 0.0;
893 20 7 for (size_t k = 0; k < p; k++) {
895 0 20 if (r >= n) {
901 168 20 for (size_t i = r; i < n; i++) {
902 39 129 if (fabs(X[i][k]) > max_val) max_val = fabs(X[i][k]);
904 1 19 if (max_val < 1e-10) {
910 165 19 for (size_t i = r; i < n; i++) {
915 10 9 double s = (X[r][k] > 0) ? -norm : norm;
919 20 19 for (size_t j = k + 1; j < p; j++) {
921 182 20 for (size_t i = r + 1; i < n; i++) dot += X[i][j] * X[i][k];
924 182 20 for (size_t i = r + 1; i < n; i++) X[i][j] += tau * X[i][k];
929 146 19 for (size_t i = r + 1; i < n; i++) dot_y += y[i] * X[i][k];
932 146 19 for (size_t i = r + 1; i < n; i++) y[i] += tau_y * X[i][k];
948 13 0 if (!sv || !SvOK(sv)) return 0;
0 13 if (!sv || !SvOK(sv)) return 0;
951 13 12 for (size_t i = 0; i < len; i++) {
952 1 12 if (!isdigit(s[i])) return 1;
959 0 371 if (!str) str = "";
961 364 7 if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) {
356 8 if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) {
356 0 if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) {
1 355 if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) {
965 16 355 if (needs_quotes) {
967 140 16 for (const char *restrict p = str; *p; p++) {
968 9 131 if (*p == '"') {
984 371 112 for (size_t i = 0; i < len; i++) {
985 261 110 if (i > 0) PerlIO_write(fh, sep, sep_len);
986 364 7 if (row[i]) {
997 11 0 if (x < 0.0 || a <= 0.0) return 1.0;
0 11 if (x < 0.0 || a <= 0.0) return 1.0;
998 0 11 if (x == 0.0) return 1.0;
1001 4 7 if (x < a + 1.0) {
1005 58 4 while (fabs(term) > 1e-15) {
1018 105 0 while (i < 10000) { // Safety bound
1022 0 105 if (fabs(d) < 1e-30) d = 1e-30;
1024 0 105 if (fabs(c) < 1e-30) c = 1e-30;
1028 7 98 if (fabs(del - 1.0) < 1e-15) break;
1036 0 11 if (df <= 0) return 1.0;
1037 0 11 if (stat <= 0.0) return 1.0;
1047 2 0 if (k < 0 || k > n) return 0.0L;
0 2 if (k < 0 || k > n) return 0.0L;
1048 0 2 if (k > n / 2) k = n - k;
1050 6 2 for (int i = 1; i <= k; i++) {
1061 2 2 if (k < 0) return 0.0;
1062 0 2 if (k >= max_u) return 1.0;
1067 6 2 for (int j = 1; j <= n; j++) {
1068 48 6 for (int i = j; i <= max_u; i++) w[i] += w[i - j];
1069 30 6 for (int i = max_u; i >= j + m; i--) w[i] -= w[i - j - m];
1073 2 2 for (int i = 0; i <= k; i++) cum_p += w[i];
1087 0 6 if (k < 0) return 0.0;
1088 1 5 if (k >= max_v) return 1.0;
1093 41 5 for (int i = 1; i <= n; i++) {
1094 1541 41 for (int j = max_v; j >= i; j--) w[j] += w[j - i];
1098 177 5 for (int i = 0; i <= k; i++) cum_p += w[i];
1114 0 11 if (n == 0) return 0.0;
1119 113 11 while (i < n) {
1121 110 11 while (j < n && ri[j].val == ri[i].val) j++;
8 102 while (j < n && ri[j].val == ri[i].val) j++;
1123 121 113 for (size_t k = i; k < j; k++) ri[k].rank = r;
1125 6 107 if (t > 1) { *has_ties = 1; tie_adj += ((double)t * t * t - t); }
1143 0 39 if (n == 0) return 1.0;
1144 0 39 if (n < 0) return 1.0 / r_pow_di(x, -n);
1146 399 39 for (int i = 0; i < n; i++) val *= x;
1154 0 0 if(x <= 0.) {
1155 0 0 if(lower) p = 0.;
1157 0 0 } else if(x < 1.) {
1162 0 0 for(k = 1; k < k_max; k += 2) {
1166 0 0 if(!lower) p = 1.0 - p;
1171 0 0 if(lower) {
1176 0 0 while(fabs(old_val - new_val) > tol) {
1189 133 7 for(unsigned int i = 0; i < m; i++) {
1190 2527 133 for(unsigned int j = 0; j < m; j++) {
1192 48013 2527 for(unsigned int k = 0; k < m; k++) s += A[i * m + k] * B[k * m + j];
1199 1 5 if(n == 1) {
1200 361 1 for(int i = 0; i < m * m; i++) V[i] = A[i];
1208 3 2 if((n % 2) == 0) {
1209 1083 3 for(int i = 0; i < m * m; i++) V[i] = B[i];
1215 0 5 if(V[(m / 2) * m + (m / 2)] > 1e140) {
1216 0 0 for(int i = 0; i < m * m; i++) V[i] = V[i] * 1e-140;
1230 19 1 for(int i = 0; i < m; i++) {
1231 361 19 for(int j = 0; j < m; j++) {
1232 153 208 if(i - j + 1 < 0) H[i * m + j] = 0;
1236 19 1 for(int i = 0; i < m; i++) {
1240 1 0 H[(m - 1) * m] += ((2 * h - 1 > 0) ? r_pow_di(2 * h - 1, m) : 0);
1242 19 1 for(int i = 0; i < m; i++) {
1243 361 19 for(int j = 0; j < m; j++) {
1244 190 171 if(i - j + 1 > 0) {
1245 1330 190 for(int g = 1; g <= i - j + 1; g++) H[i * m + j] /= g;
1254 50 1 for(int i = 1; i <= n; i++) {
1256 0 50 if(s < 1e-140) {
1273 285 24 while(i < nx || j < ny) {
15 9 while(i < nx || j < ny) {
1275 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];
1276 54 15 else if (i < nx) val = x[i];
1278 456 24 while(i < nx && x[i] <= val) i++;
180 276 while(i < nx && x[i] <= val) i++;
1279 357 63 while(j < ny && y[j] <= val) j++;
120 237 while(j < ny && y[j] <= val) j++;
1283 78 222 if (diff > max_d_plus) max_d_plus = diff;
1284 45 255 if (-diff > max_d_minus) max_d_minus = -diff;
1285 93 207 if (fabs(diff) > max_d) max_d = fabs(diff);
1294 1790 3160 if (two_sided) return (fabs(r - s) >= q);
1304 120 9 for(unsigned int j = 1; j <= n; j++) {
1305 24 96 if(psmirnov_exact_test(q, 0., j / nd, two_sided)) u[j] = 1.;
1308 180 9 for(unsigned int i = 1; i <= m; i++) {
1309 104 76 if(psmirnov_exact_test(q, i / md, 0., two_sided)) u[0] = 1.;
1310 4650 180 for(int j = 1; j <= n; j++) {
1311 1166 3484 if(psmirnov_exact_test(q, i / md, j / nd, two_sided)) u[j] = 1.;
1326 0 229 if (nu < 1e-7) nu = 1e-7;
1334 0 229 if (strict && tside == 2) {
0 0 if (strict && tside == 2) {
1347 0 6 if (p <= 0.0) return 0.0;
1348 0 6 if (p >= 1.0) return INFINITY;
1351 14 6 while (pf(high, df1, df2) < p) {
1354 0 14 if (high > 1e100) break; /* Fallback limit */
1358 251 0 for (unsigned short int i = 0; i < 150; i++) {
1362 122 129 if (p_mid < p) {
1367 6 245 if (high - low < 1e-12) break;
1399 6 3 for (size_t g = 0; g < k; g++) {
1404 30 6 for (size_t i = 0; i < ng; i++) sum += data[offset + i];
1409 30 6 for (size_t i = 0; i < ng; i++) {
1419 30 3 for (IV i = 0; i < (IV)total_n; i++) grand_mean += data[i];
1424 0 3 if (var_equal) {/* ── Classic one-way ANOVA
1427 0 0 for (size_t g = 0; g < k; g++) {
1443 6 3 for (size_t g = 0; g < k; g++) { w_i[g] = n_i[g] / v_i[g]; sum_w += w_i[g]; }
1445 6 3 for (size_t g = 0; g < k; g++) wgrand += w_i[g] * m_i[g];
1448 6 3 for (size_t g = 0; g < k; g++) {
1454 6 3 for (size_t g = 0; g < k; g++) {
1460 3 0 res.denom_df = (tmp > 0.0) ? (1.0 / (3.0 * tmp)) : 1e300;
1463 6 3 for (size_t g = 0; g < k; g++) {
1470 3 0 res.ms_between = (df1 > 0.0) ? ssbg / df1 : 0.0;
1471 3 0 res.ms_within = (res.denom_df > 0.0) ? sswg / res.denom_df : 0.0;
1490 1 3 if (!tilde) return 0;
1495 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--;
1496 0 3 if (l_end < l_start) return 0; /* empty LHS */
1500 6 0 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
3 3 while (*r_start && isspace((unsigned char)*r_start)) r_start++;
1502 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--;
1503 0 3 if (r_end < r_start) return 0; /* empty RHS */
1547 1 1 if (n != nl) {
1553 0 1 if (n < 2) {
1565 6 1 for (IV i = 0; i < n; i++) {
1567 6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
6 0 const char *restrict label = (lsv && *lsv) ? SvPV_nolen(*lsv) : "";
1570 7 2 for (size_t g = 0; g < ngroups; g++) {
1571 4 3 if (strEQ(group_names[g], label)) { gidx = (IV)g; break; }
1573 2 4 if (gidx < 0) {
1574 0 2 if (ngroups >= OWT_MAX_GROUPS) {
1590 0 1 if (ngroups < 2) {
1593 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1600 6 1 for (unsigned i = 0; i < n; i++) out_sizes[obs_group[i]]++;
1603 2 1 for (size_t g = 0; g < ngroups; g++) {
1604 0 2 if (out_sizes[g] < 2) {
1608 0 0 for (size_t gg = 0; gg < ngroups; gg++) Safefree(group_names[gg]);
1617 1 1 for (size_t g = 1; g < ngroups; g++)
1619 6 1 for (IV i = 0; i < n; i++) {
1621 6 0 double val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
6 0 double val = (rsv && *rsv) ? SvNV(*rsv) : 0.0;
1630 1 0 if (out_names) {
1633 0 0 for (size_t g = 0; g < ngroups; g++) Safefree(group_names[g]);
1657 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;
1658 0 25 if (sigma < 0.0) {
1662 0 25 if (isinf(sigma)) return 0.0;
1663 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
1665 0 25 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
0 0 if (sigma == 0.0) return (x == mu) ? INFINITY : 0.0;
1669 25 0 if (isnan(x) || isinf(x)) return 0.0;
0 25 if (isnan(x) || isinf(x)) return 0.0;
1672 0 25 if (x >= 2.0 * sqrt(DBL_MAX)) return 0.0;
1673 1 24 if (give_log) {
1677 22 2 if (x < 5.0) {
1681 0 2 if (x > sqrt(-2.0 * M_LN2 * (DBL_MIN_EXP + 1.0 - DBL_MANT_DIG))) {
1694 14 7 for (size_t i = 0; i < n; i++) {
1695 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;
1700 14 7 for (size_t i = 0; i < n; i++) { b[i] = d[i]; z[i] = 0.0; }
1701 14 0 for (int iter = 1; iter <= 50; iter++) {
1703 14 14 for (size_t i = 0; i < n - 1; i++) {
1704 14 14 for (size_t j = i + 1; j < n; j++) sm += fabs(A[i * n + j]);
1706 7 7 if (sm == 0.0) break;
1707 7 0 NV tresh = (iter < 4) ? 0.2 * sm / (n * n) : 0.0;
1708 7 7 for (size_t i = 0; i < n - 1; i++) {
1709 7 7 for (size_t j = i + 1; j < n; j++) {
1711 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])) {
1713 7 0 } else if (fabs(A[i * n + j]) > tresh) {
1716 0 7 if (fabs(h) + g == fabs(h)) {
1721 1 6 if (theta < 0.0) t = -t;
1732 0 7 for (size_t k = 0; k < i; k++) {
1737 0 7 for (size_t k = i + 1; k < j; k++) {
1742 0 7 for (size_t k = j + 1; k < n; k++) {
1747 14 7 for (size_t k = 0; k < n; k++) {
1755 14 7 for (size_t i = 0; i < n; i++) {
1763 7 7 for (size_t i = 0; i < n - 1; i++) {
1766 7 7 for (size_t j = i + 1; j < n; j++) {
1767 6 1 if (d[j] > max_val) {
1772 6 1 if (max_k != i) {
1775 12 6 for (size_t k = 0; k < n; k++) {
1786 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)) {
1797 0 5 PUSHMARK(SP);
1798 0 5 EXTEND(SP, 2);
1804 4 0 SV *restrict ret = (count > 0) ? newSVsv(POPs) : newSV(0);
1806 4 0 FREETMPS;
1813 14 2 for (size_t cc = 0; cc < ncols; cc++) {
1814 8 6 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
5 3 if (name_len[cc] == wl && memEQ(SvPVX(col_names[cc]), wname, wl)) { is_outer[cc] = 1; return 1; }
1831 70 15 if (ctx->is_aoh) {
1833 69 1 return (p && *p) ? *p : NULL;
69 0 return (p && *p) ? *p : NULL;
1836 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;
1838 15 0 return (vp && *vp) ? *vp : NULL;
15 0 return (vp && *vp) ? *vp : NULL;
1842 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)
1846 101 0 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
0 101 if (!opp || !*opp) croak("filter: predicate node missing 'op'");
1848 93 8 if (strEQ(op, "and") || strEQ(op, "or")) {
4 89 if (strEQ(op, "and") || strEQ(op, "or")) {
1851 12 0 bool L = filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1852 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
1853 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
1855 4 85 if (strEQ(op, "not")) {
1857 4 0 return !filt_eval(aTHX_ (lp ? *lp : NULL), ctx);
1861 85 0 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
0 85 if (!cp || !*cp) croak("filter: comparison node missing 'col'");
1865 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
1866 83 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
83 0 SV *restrict val = (vp && *vp) ? *vp : &PL_sv_undef;
1867 38 45 if (strEQ(op, ">")) return SvNV(cell) > SvNV(val);
1868 7 38 if (strEQ(op, "<")) return SvNV(cell) < SvNV(val);
1869 4 34 if (strEQ(op, ">=")) return SvNV(cell) >= SvNV(val);
1870 4 30 if (strEQ(op, "<=")) return SvNV(cell) <= SvNV(val);
1871 11 19 if (strEQ(op, "==")) return SvNV(cell) == SvNV(val);
1872 4 15 if (strEQ(op, "!=")) return SvNV(cell) != SvNV(val);
1878 15 0 int c = m ? memcmp(a, b, m) : 0;
1879 11 4 if (c == 0) c = (al > bl) - (al < bl);
1880 7 8 if (strEQ(op, "eq")) return c == 0;
1881 4 4 if (strEQ(op, "ne")) return c != 0;
1882 0 4 if (strEQ(op, "lt")) return c < 0;
1883 4 0 if (strEQ(op, "gt")) return c > 0;
1884 0 0 if (strEQ(op, "le")) return c <= 0;
1885 0 0 if (strEQ(op, "ge")) return c >= 0;
1898 0 12 PUSHMARK(SP);
1899 0 12 EXTEND(SP, 1);
1904 12 0 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
6 6 keep = (n > 0) ? (bool)SvTRUE(TOPs) : 0;
1905 12 0 if (n > 0) (void)POPs;
1907 12 0 FREETMPS; LEAVE;
1920 2031 887 if (arg1 < arg2) return -1;
1921 887 0 if (arg1 > arg2) return 1;
1933 0 39 PUSHMARK(SP);
1934 0 39 XPUSHs(sv_2mortal(newRV_inc((SV*)a_av)));
1935 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)));
1936 0 39 XPUSHs(sv_2mortal(newSVsv(name_sv)));
1940 39 0 if (count > 0) {
1945 39 0 FREETMPS;
1966 0 32 if ((items - 1) & 1) croak("cfilter: trailing options must be name => value pairs");
1967 47 31 for (int oi = 1; oi < items; oi += 2) {
1971 29 18 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
29 0 if (ol == 4 && memEQ(oname, "keep", 4)) keep_sv = oval;
1972 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;
1973 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;
1974 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;
1977 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");
1978 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");
1980 1 28 SV *restrict sel = removing ? remove_sv : keep_sv;
1984 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;
1985 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))) {
1987 16 1 if (SvROK(sel)) cv_sv = SvRV(sel);
1991 0 1 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
1994 1 0 if (!cv) croak("cfilter: unknown function '%s'", name);
2001 9 18 if (na_sv && SvOK(na_sv)) {
9 0 if (na_sv && SvOK(na_sv)) {
2004 8 1 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
8 0 if (nl == 4 && memEQ(nv, "omit", 4)) na_omit = TRUE;
2005 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;
2008 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");
2009 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");
2011 1 23 if (!SvROK(data)) croak("cfilter: data must be a reference");
2014 3 20 if (SvTYPE(rv) == SVt_PVAV) kind = 0;
2015 20 0 else if (SvTYPE(rv) == SVt_PVHV) {
2019 0 20 if (!fe) kind = 2;
2022 20 0 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
18 2 if (SvROK(fv) && SvTYPE(SvRV(fv)) == SVt_PVAV) kind = 1;
2023 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;
2033 14 9 HV *restrict cellmap = by_name ? NULL : newHV();
2035 18 5 if (kind == 1) {
2039 54 18 while ((e = hv_iternext(h))) {
2041 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)");
2043 18 36 if (len > nrows) nrows = len;
2046 54 18 while ((e = hv_iternext(h))) {
2050 36 18 if (!by_name) {
2052 36 0 if (nrows > 0) av_extend(col, nrows - 1);
2053 180 36 for (SSize_t r = 0; r < nrows; r++) {
2054 180 0 SV **restrict ep = (r <= av_len(src)) ? av_fetch(src, r, 0) : NULL;
2055 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));
2063 3 2 if (kind == 0) {
2066 9 3 for (SSize_t r = 0; r < n; r++) {
2068 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)");
2075 7 2 while ((e = hv_iternext(h))) {
2077 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)");
2085 16 5 for (SSize_t r = 0; r < nrows; r++) {
2089 40 16 while ((ie = hv_iternext(row))) {
2091 14 26 if (!hv_exists_ent(seen, ck, 0)) {
2100 2 3 if (!by_name) {
2102 6 2 for (SSize_t c = 0; c < nc; c++) {
2105 6 0 if (nrows > 0) av_extend(col, nrows - 1);
2106 30 6 for (SSize_t r = 0; r < nrows; r++) {
2109 24 6 SV *restrict cell = che ? HeVAL(che) : NULL;
2110 24 6 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
24 0 av_push(col, (cell && SvOK(cell)) ? newSVsv(cell) : newSV(0));
2119 5 18 if (against_sv) {
2120 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)");
2121 1 4 if (!hv_exists_ent(universe, against_sv, 0)) croak("cfilter: against column '%s' not found in data", SvPV_nolen(against_sv));
2126 9 13 if (by_name) {
2130 13 8 for (SSize_t i = 0; i < n; i++) {
2132 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");
2133 1 12 if (!hv_exists_ent(universe, *ep, 0)) croak("cfilter: column '%s' not found in data", SvPV_nolen(*ep));
2137 23 8 for (SSize_t c = 0; c < nc; c++) {
2140 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);
2147 39 13 for (SSize_t c = 0; c < nc; c++) {
2151 12 27 if (against_av) {
2154 60 12 for (SSize_t r = 0; r < nrows; r++) {
2157 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)) {
2165 18 9 } else if (na_omit) {
2168 90 18 for (SSize_t r = 0; r < nrows; r++) {
2170 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));
2178 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);
2183 16 5 if (kind == 1) {
2187 48 16 while ((e = hv_iternext(h))) {
2189 15 33 if (!hv_exists_ent(keepset, ck, 0)) continue;
2192 33 0 if (n > 0) av_extend(dst, n - 1);
2193 157 33 for (SSize_t i = 0; i < n; i++) {
2195 157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
157 0 av_push(dst, (ep && *ep) ? newSVsv(*ep) : newSV(0));
2200 2 3 } else if (kind == 2) {
2204 7 2 while ((e = hv_iternext(h))) {
2209 16 7 while ((ie = hv_iternext(row))) {
2211 11 5 if (!hv_exists_ent(keepset, ck, 0)) continue;
2220 9 3 for (SSize_t r = 0; r < n; r++) {
2224 24 9 while ((ie = hv_iternext(row))) {
2226 15 9 if (!hv_exists_ent(keepset, ck, 0)) continue;
2237 13 8 if (cellmap) SvREFCNT_dec((SV*)cellmap);
2253 1 19 if ((items - 1) & 1) croak("hoh2hoa: trailing options must be name => value pairs");
2254 10 17 for (int oi = 1; oi < items; oi += 2) {
2258 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;
2259 4 1 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
4 0 else if (ol == 9 && memEQ(oname, "row.names", 9)) {
2260 4 0 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
3 1 if (SvOK(oval) && !SvROK(oval)) rn_sv = oval;
2266 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)");
2277 25 14 while ((e = hv_iternext(in_hv))) {
2279 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)");
2284 11 3 if (nrows > 1) qsort(AvARRAY(rows_av), (size_t)nrows, sizeof(SV*), h2h_keycmp);
2290 24 14 while ((e = hv_iternext(in_hv))) {
2294 40 24 while ((ie = hv_iternext(row))) {
2296 26 14 if (!hv_exists_ent(seen, ck, 0)) {
2307 24 14 for (SSize_t r = 0; r < nrows; r++) {
2311 51 24 for (SSize_t c = 0; c < ncols; c++) {
2314 40 11 SV *restrict src = che ? HeVAL(che) : NULL;
2315 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));
2321 3 11 if (rn_sv) {
2322 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));
2324 2 2 for (SSize_t r = 0; r < nrows; r++) av_push(rn_av, newSVsv(*av_fetch(rows_av, r, 0)));
2341 27 0 if (!df || !SvROK(df))
1 26 if (!df || !SvROK(df))
2343 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);
2344 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))
2348 20 5 if (SvTYPE(ref) == SVt_PVAV) {
2354 73 19 for (i = 0; i < n; i++) {
2356 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) {
2361 8 64 if (is_code) keep = filt_call(aTHX_ pred, *rp);
2363 36 36 if (keep) av_push(out, SvREFCNT_inc_simple_NN(*rp));
2366 5 0 } else if (SvTYPE(ref) == SVt_PVHV) {
2370 0 5 if (ncols <= 0) {
2381 13 4 while ((e = hv_iternext(in)) && c < ncols) {
13 0 while ((e = hv_iternext(in)) && c < ncols) {
2383 0 13 char *restrict k = HePV(e, klen);
2385 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) {
2392 4 8 if (len > maxrows) maxrows = len;
2399 16 4 for (i = 0; i < maxrows; i++) {
2401 4 12 if (is_code) {
2403 12 4 for (cc = 0; cc < ncols; cc++) {
2405 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);
2414 7 9 if (keep) {
2415 21 7 for (cc = 0; cc < ncols; cc++) {
2417 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));
2483 8 43 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
6 2 if (SvROK(cols) && SvTYPE(SvRV(cols)) == SVt_PVHV) {
2487 1 5 if (items > 3) croak("col2col: an options hash ref must be the last argument");
2489 5 3 while ((he = hv_iternext(oh))) {
2491 0 5 const char *restrict oname = HePV(he, ol);
2493 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);
2496 18 27 } else if (items > 3) {
2497 1 17 if ((items - 3) & 1) croak("col2col: trailing options must be name => value pairs");
2498 18 15 for (int oi = 3; oi < items; oi += 2) {
2502 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);
2505 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");
2509 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);
2510 3 1 else if (SvOK(cmd) && !SvROK(cmd)) {
2 1 else if (SvOK(cmd) && !SvROK(cmd)) {
2513 0 2 SV *restrict fq = strstr(name, "::") ? newSVpvn(name, nl) : newSVpvf("Stats::LikeR::%s", name);
2516 1 1 if (!cv) croak("col2col: unknown function '%s'", name);
2520 1 40 if (!SvROK(data)) croak("col2col: data must be a reference");
2524 2 38 if (SvTYPE(rv) == SVt_PVAV) kind = 1;
2525 38 0 else if (SvTYPE(rv) == SVt_PVHV) {
2529 0 38 if (!e) croak("col2col: empty data hash");
2531 38 0 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
37 1 if (SvROK(first) && SvTYPE(SvRV(first)) == SVt_PVAV) kind = 0;
2532 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;
2536 37 3 if (kind == 0) {
2542 92 37 while ((e = hv_iternext(h))) {
2544 92 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
0 92 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) continue;
2548 37 55 if (len > nrows) nrows = len;
2549 0 92 Renew(src, av_len(names_av) + 1, AV*);
2553 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*);
2554 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*);
2555 92 37 for (size_t cc = 0; cc < ncols; cc++) {
2556 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);
2557 92 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
2559 426 92 for (size_t r = 0; r < nrows; r++) {
2561 397 29 if (c2c_num(aTHX_ av_fetch(a, (SSize_t)r, 0), &v)) { col_val[cc][r] = v; col_def[cc][r] = 1; }
2568 2 1 if (kind == 1) {
2571 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*);
2572 8 2 for (size_t r = 0; r < nrows; r++) {
2574 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);
2580 0 1 nrows = (size_t)HvKEYS(h);
2581 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*);
2583 5 1 while ((e = hv_iternext(h)) && r < nrows) {
5 0 while ((e = hv_iternext(h)) && r < nrows) {
2585 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);
2591 13 3 for (size_t r = 0; r < nrows; r++) {
2592 3 10 if (!row_hv[r]) continue;
2595 30 10 while ((e = hv_iternext(row_hv[r]))) {
2597 0 30 char *restrict k = HePV(e, kl);
2598 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))); }
2604 2 1 Newxz(col_val, ncols ? ncols : 1, double*);
0 2 Newxz(col_val, ncols ? ncols : 1, double*);
2 1 Newxz(col_val, ncols ? ncols : 1, double*);
2605 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*);
2606 6 3 for (size_t cc = 0; cc < ncols; cc++) {
2609 6 0 Newxz(col_val[cc], nrows ? nrows : 1, double);
0 6 Newxz(col_val[cc], nrows ? nrows : 1, double);
6 0 Newxz(col_val[cc], nrows ? nrows : 1, double);
2610 6 0 Newxz(col_def[cc], nrows ? nrows : 1, char);
2611 30 6 for (size_t r = 0; r < nrows; r++) {
2613 0 30 if (!row_hv[r]) continue;
2614 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; }
2620 1 39 if (ncols == 0) croak("col2col: no usable columns found");
2624 0 39 Newx(col_names, ncols, SV*);
2625 0 39 Newx(name_len, ncols, STRLEN);
2626 98 39 for (size_t cc = 0; cc < ncols; cc++) {
2634 34 5 if (!SvOK(cols_eff)) {
2635 84 34 for (size_t cc = 0; cc < ncols; cc++) is_outer[cc] = 1;
2637 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) {
2640 4 1 for (SSize_t i = 0; i < n; i++) {
2644 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");
2646 1 3 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
2648 3 0 } else if (!SvROK(cols_eff)) {
2651 1 2 if (!c2c_mark(col_names, name_len, ncols, wname, wl, is_outer)) croak("col2col: column '%s' not found in data", wname);
2660 91 36 for (size_t a = 0; a < ncols; a++) {
2662 4 87 if (!is_outer[a]) continue;
2664 222 86 for (size_t b = 0; b < ncols; b++) {
2667 86 136 if (a == b) continue;
2670 117 19 if (na_mode == 0) { // pairwise complete: keep rows defined in both
2671 531 117 for (size_t r = 0; r < nrows; r++)
2672 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])); }
2673 8 11 } else if (na_mode == 1) { // omit: each column drops its own undef (lengths may differ)
2674 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]));
2675 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]));
2677 55 11 for (size_t r = 0; r < nrows; r++) {
2678 48 7 av_push(ca, col_def[a][r] ? newSVnv(col_val[a][r]) : newSV(0));
2679 47 8 av_push(cb, col_def[b][r] ? newSVnv(col_val[b][r]) : newSV(0));
2684 135 1 if (av_len(ca) < 0 || av_len(cb) < 0) {
1 134 if (av_len(ca) < 0 || av_len(cb) < 0) {
2686 5 129 } else if (!skip_errors) {
2695 0 129 PUSHMARK(SP);
2696 0 129 XPUSHs(rv1); XPUSHs(rv2);
0 129 XPUSHs(rv1); XPUSHs(rv2);
2700 129 0 if (SvTRUE(ERRSV)) {
8 121 if (SvTRUE(ERRSV)) {
2702 8 0 const char *restrict ep = SvPV(ERRSV, el);
2704 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++;
2706 8 0 if (n > 0) (void)POPs; // discard the undef G_SCALAR leaves
2708 121 0 res = (n > 0) ? newSVsv(POPs) : newSV(0);
2711 129 0 FREETMPS; LEAVE;
2720 89 36 for (size_t cc = 0; cc < ncols; cc++) { Safefree(col_val[cc]); Safefree(col_def[cc]); }
2749 4 6 for (I32 ai = 1; ai + 1 < items; ai += 2) {
2752 0 4 if (strEQ(key, "var_equal"))
2754 4 0 else if (strEQ(key, "formula"))
2758 0 6 if (!SvROK(data_ref))
2761 5 1 if (SvTYPE(rv) == SVt_PVHV) {
2763 1 0 } else if (SvTYPE(rv) == SVt_PVAV) {
2768 1 5 if (in_av) {
2770 0 1 if (formula_str != NULL)
2774 0 1 if (k < 2)
2779 2 1 for (size_t g = 0; g < k; g++) {
2781 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)
2784 0 2 if (len < 2)
2798 2 1 for (size_t g = 0; g < k; g++) {
2802 12 2 for (IV i = 0; i < len; i++) {
2804 12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
2807 4 1 } else if (formula_str != NULL) {// MODE 2 – formula "response ~ factor"
2808 1 3 if (!parse_formula(formula_str, &lhs, &rhs))
2813 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)
2814 0 2 || SvTYPE(SvRV(*resp_svp)) != SVt_PVAV)
2818 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)
2819 0 2 || SvTYPE(SvRV(*fact_svp)) != SVt_PVAV)
2827 1 1 if (!build_groups_from_formula(aTHX_ resp_av, label_av,
2833 2 1 for (size_t g = 0; g < k; g++) total_n += (IV)sizes[g];
2837 0 1 if (k < 2)
2844 2 1 while ((he = hv_iternext(in_hv)) != NULL) {
2846 2 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
0 2 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
2847 0 0 croak("oneway_test: value for group '%s' is not an array ref",
2850 0 2 if (len < 2)
2851 0 0 croak("oneway_test: group '%s' has fewer than 2 observations",
2857 0 2 const char *kstr = HePV(he, klen);
2868 2 1 while ((he = hv_iternext(in_hv)) != NULL) {
2871 12 2 for (IV i = 0; i < len; i++) {
2873 12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
12 0 flat[offset++] = (svp && *svp) ? SvNV(*svp) : 0.0;
2882 6 3 for (size_t g = 0; g < k; g++) {
2884 30 6 for (size_t i = 0; i < sizes[g]; i++) sum += flat[offset + i];
2892 1 2 if (lhs) Safefree(lhs);
2925 6 3 for (size_t g = 0; g < k; g++) {
2937 6 3 for (size_t g = 0; g < k; g++) Safefree(gnames[g]);
2939 1 2 if (rhs) Safefree(rhs);
2954 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) {
2959 10 0 if (arg_idx < items) {
2960 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) {
2963 1 0 } else if (SvPOK(ST(arg_idx))) {
2969 2 10 for (; arg_idx < items; arg_idx += 2) {
2972 0 2 if (strEQ(key, "x")) x_sv = val;
2973 0 2 else if (strEQ(key, "y")) y_sv = val;
2974 0 2 else if (strEQ(key, "exact")) {
2975 0 0 if (!SvOK(val)) exact = -1;
2978 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
2982 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) {
2990 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) {
2996 0 10 if (nx == 0) croak("Not enough 'x' observations");
3001 230 10 for (size_t i = 0; i < nx; i++) {
3003 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)) {
3010 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) {
3015 120 9 for (size_t i = 0; i < ny; i++) {
3017 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)) {
3021 9 0 if (valid_nx < 1 || valid_ny < 1) {
0 9 if (valid_nx < 1 || valid_ny < 1) {
3028 1 8 if (is_greater) statistic = d_plus;
3029 1 7 else if (is_less) statistic = d_minus;
3033 0 9 if (exact == 1) use_exact = TRUE;
3034 0 9 else if (exact == 0) use_exact = FALSE;
3039 180 9 for(size_t i=0; i
3040 120 9 for(size_t i=0; i
3043 291 9 for(size_t i = 1; i < total_n; i++) {
3044 0 291 if(comb[i] == comb[i-1]) { has_ties = TRUE; break; }
3047 9 0 if (use_exact && has_ties) {
0 9 if (use_exact && has_ties) {
3051 9 0 if (use_exact) {
3058 0 0 if (is_two_sided) {
3065 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) ---
3067 1 0 if (strEQ(dist, "pnorm")) {
3070 50 1 for(size_t i = 0; i < valid_nx; i++) {
3076 0 50 if (diff1 > max_d_plus) max_d_plus = diff1;
3077 1 49 if (diff2 > max_d_plus) max_d_plus = diff2;
3078 8 42 if (-diff1 > max_d_minus) max_d_minus = -diff1;
3079 0 50 if (-diff2 > max_d_minus) max_d_minus = -diff2;
3080 8 42 if (fabs(diff1) > max_d) max_d = fabs(diff1);
3081 0 50 if (fabs(diff2) > max_d) max_d = fabs(diff2);
3083 0 1 if (is_greater) statistic = max_d_plus;
3084 0 1 else if (is_less) statistic = max_d_minus;
3086 1 0 bool use_exact = (exact == -1) ? (valid_nx < 100) : (exact == 1);
3087 1 0 if (use_exact) {
3089 1 0 if (is_two_sided) {
3099 0 0 if (is_two_sided) p_value = K2l(z, 0, 1e-6);
3111 0 10 if (p_value > 1.0) p_value = 1.0;
3112 0 10 if (p_value < 0.0) p_value = 0.0;
3133 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) {
3138 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) {
3143 0 10 if ((items - arg_idx) % 2 != 0) {
3147 20 10 for (; arg_idx < items; arg_idx += 2) {
3150 7 13 if (strEQ(key, "x")) x_sv = val;
3151 7 6 else if (strEQ(key, "y")) y_sv = val;
3152 3 3 else if (strEQ(key, "paired")) paired = SvTRUE(val);
3153 0 3 else if (strEQ(key, "correct")) correct = SvTRUE(val);
3154 1 2 else if (strEQ(key, "mu")) mu = SvNV(val);
3155 0 2 else if (strEQ(key, "exact")) {
3156 0 0 if (!SvOK(val)) exact = -1;
3159 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
3163 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)
3167 0 9 if (nx == 0) croak("Not enough 'x' observations");
3171 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) {
3179 8 1 if (ny > 0 && !paired) {
5 3 if (ny > 0 && !paired) {
3182 28 5 for (size_t i = 0; i < nx; i++) {
3184 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)) {
3190 28 5 for (size_t i = 0; i < ny; i++) {
3192 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)) {
3198 0 5 if (valid_nx == 0) { Safefree(ri); croak("not enough (non-missing) 'x' observations"); }
3199 0 5 if (valid_ny == 0) { Safefree(ri); croak("not enough 'y' observations"); }
3204 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;
3206 0 5 if (exact == 1) use_exact = TRUE;
3207 0 5 else if (exact == 0) use_exact = FALSE;
3208 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);
3209 2 3 if (use_exact && has_ties) {
0 2 if (use_exact && has_ties) {
3213 2 3 if (use_exact) {
3218 1 1 if (strcmp(alternative, "less") == 0) p_value = p_less;
3219 1 0 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3221 0 0 NV p = (p_less < p_greater) ? p_less : p_greater;
3225 3 0 method_desc = correct ? "Wilcoxon rank sum test with continuity correction" : "Wilcoxon rank sum test";
3231 3 0 if (correct) {
3232 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);
3233 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3234 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3238 0 3 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3239 0 3 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3244 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");
3248 23 3 for (size_t i = 0; i < nx; i++) {
3250 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;
3253 18 5 if (paired) {
3255 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;
3258 0 18 if (d == 0.0) has_zeroes = TRUE; // Drop exact zeroes
3262 0 5 if (d == 0.0) has_zeroes = TRUE;
3266 0 3 if (n_nz == 0) {
3271 23 3 for (size_t i = 0; i < n_nz; i++) {
3278 23 3 for (size_t i = 0; i < n_nz; i++) {
3279 19 4 if (ri[i].idx) statistic += ri[i].rank;
3281 0 3 if (exact == 1) use_exact = TRUE;
3282 0 3 else if (exact == 0) use_exact = FALSE;
3283 3 0 else use_exact = (n_nz < 50 && !has_ties);
3 0 else use_exact = (n_nz < 50 && !has_ties);
3284 3 0 if (use_exact && has_ties) {
0 3 if (use_exact && has_ties) {
3288 3 0 if (use_exact && has_zeroes) {
0 3 if (use_exact && has_zeroes) {
3292 3 0 if (use_exact) {
3297 0 3 if (strcmp(alternative, "less") == 0) p_value = p_less;
3298 0 3 else if (strcmp(alternative, "greater") == 0) p_value = p_greater;
3300 0 3 double p = (p_less < p_greater) ? p_less : p_greater;
3304 0 0 method_desc = correct ? "Wilcoxon signed rank test with continuity correction" : "Wilcoxon signed rank test";
3309 0 0 if (correct) {
3310 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);
3311 0 0 else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5;
3312 0 0 else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5;
3316 0 0 if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z);
3317 0 0 else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z);
3322 0 8 if (p_value > 1.0) p_value = 1.0;
3338 3 13 if (!SvROK(data_ref)) {
3343 5 8 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
1 4 if (input_type != SVt_PVAV && input_type != SVt_PVHV) {
3354 8 4 if (input_type == SVt_PVAV) {
3356 0 8 r = av_top_index(obs_av) + 1;
3357 7 1 if (r > 0) {
3359 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) {
3361 0 4 c = av_top_index((AV*)SvRV(*first_elem)) + 1;
3363 8 4 for (unsigned int i = 0; i < r; i++) {
3366 8 0 if (row_sv && SvROK(*row_sv)) {
8 0 if (row_sv && SvROK(*row_sv)) {
3368 20 8 for (unsigned int j = 0; j < c; j++) {
3370 20 0 if (val_sv) obs_matrix[i][j] = SvNV(*val_sv);
3378 7 2 for (unsigned int j = 0; j < c; j++) {
3380 7 0 if (val_sv) obs_array[j] = SvNV(*val_sv);
3384 4 0 } else if (input_type == SVt_PVHV) {
3393 3 1 if (first_entry) {
3395 1 2 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
1 0 if (SvROK(first_val) && SvTYPE(SvRV(first_val)) == SVt_PVHV) {
3400 2 1 while ((row_entry = hv_iternext(obs_hv))) {
3404 2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
2 0 if (SvROK(inner_sv) && SvTYPE(SvRV(inner_sv)) == SVt_PVHV) {
3408 4 2 while ((col_entry = hv_iternext(inner_hv))) {
3410 2 2 if (!hv_exists_ent(col_idx_map, col_key, 0)) {
3420 2 1 for (unsigned int i = 0; i < r; i++) {
3426 2 0 if (inner_he) {
3428 2 0 if (SvROK(inner_sv)) {
3430 4 2 for (unsigned int j = 0; j < c; j++) {
3435 4 0 if (val_he) {
3447 4 2 while ((row_entry = hv_iternext(obs_hv))) {
3452 4 1 for (unsigned int j = 0; j < c; j++) {
3456 4 0 if (val_he) {
3464 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)) {
3471 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;
3474 5 3 if (is_2d) {
3477 10 5 for(unsigned int i=0; i
3478 12 5 for(unsigned int j=0; j
3480 10 5 for (unsigned int i = 0; i < r; i++) {
3481 24 10 for (unsigned int j = 0; j < c; j++) {
3489 4 1 if (input_type == SVt_PVAV) {
3491 8 4 for (unsigned int i = 0; i < r; i++) {
3493 20 8 for (unsigned int j = 0; j < c; j++) {
3497 8 12 if (yates) {
3499 8 0 double y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
3511 2 1 for (unsigned int i = 0; i < r; i++) {
3513 4 2 for (unsigned int j = 0; j < c; j++) {
3519 4 0 if (yates) {
3521 4 0 double y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff;
3536 9 3 for (unsigned int j = 0; j < c; j++) {
3541 2 1 if (input_type == SVt_PVAV) {
3543 6 2 for (unsigned int j = 0; j < c; j++) {
3551 3 1 for (unsigned int j = 0; j < c; j++) {
3563 5 3 if (obs_matrix) {
3564 10 5 for (unsigned int i = 0; i < r; i++) {
3569 3 5 if (obs_array) safefree(obs_array);
3570 2 6 if (row_keys) SvREFCNT_dec(row_keys);
3571 2 6 if (col_keys) SvREFCNT_dec(col_keys);
3590 6 2 if (input_type == SVt_PVAV) {
3596 5 3 if (is_2d) {
3597 3 2 if (yates) {
3621 42 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
41 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
3623 5 36 if (type == SVt_PVHV || type == SVt_PVAV) {
5 0 if (type == SVt_PVHV || type == SVt_PVAV) {
3631 41 2 if (arg_idx < items) {
3633 41 0 if (SvOK(cand) && !SvROK(cand)) {
41 0 if (SvOK(cand) && !SvROK(cand)) {
3635 40 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
39 1 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
39 0 if (!(strEQ(k, "data") || strEQ(k, "file") || strEQ(k, "col.names") ||
3636 39 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
39 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
39 0 strEQ(k, "row.names") || strEQ(k, "sep") || strEQ(k, "delim") ||
3637 39 0 strEQ(k, "undef.val"))) {
3651 65 41 for (; arg_idx < items; arg_idx += 2) {
3652 1 64 if (arg_idx + 1 >= items) croak("write_table: Odd number of arguments passed");
3656 1 63 if (strEQ(key, "data")) data_sv = val;
3657 9 54 else if (strEQ(key, "col.names")) col_names_sv = val;
3658 2 52 else if (strEQ(key, "file")) file_sv = val;
3659 13 39 else if (strEQ(key, "row.names")) row_names_sv = val;
3661 23 16 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
1 22 else if (strEQ(key, "sep") || strEQ(key, "delim")) {
3665 21 1 else if (strEQ(key, "undef.val")) undef_val = SvPV_nolen(val);
3669 40 1 if (!data_sv || !SvROK(data_sv)) {
0 40 if (!data_sv || !SvROK(data_sv)) {
3674 5 35 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
0 5 if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) {
3678 39 1 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
0 39 if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n");
3682 22 17 if (!explicit_sep) {
3684 22 0 if (file_len >= 4) {
3686 19 3 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
0 19 if (strEQ(ext, ".tsv") || strEQ(ext, ".TSV")) {
3688 0 19 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
0 0 } else if (strEQ(ext, ".csv") || strEQ(ext, ".CSV")) {
3694 9 30 if (col_names_sv && SvOK(col_names_sv)) {
9 0 if (col_names_sv && SvOK(col_names_sv)) {
3695 7 2 if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) {
0 7 if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) {
3704 32 5 if (SvTYPE(data_ref) == SVt_PVHV) {
3706 0 32 if (hv_iterinit(hv) == 0) XSRETURN_EMPTY;
3710 0 32 if (!first_val) {
3715 11 21 if (!SvROK(first_val)) {
3719 15 6 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
0 15 if (first_type != SVt_PVHV && first_type != SVt_PVAV) {
3727 79 30 while ((entry = hv_iternext(hv))) {
3729 30 49 if (is_flat_hash) {
3730 30 0 if (val && SvROK(val)) {
1 29 if (val && SvROK(val)) {
3734 49 0 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
49 0 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
11 38 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
1 48 if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != (is_hoh ? SVt_PVHV : SVt_PVAV)) {
3735 0 1 croak("write_table: Mixed data types detected. Ensure all values are %s references.\n", is_hoh ? "HASH" : "ARRAY");
3740 6 24 if (is_hoh) { // Rows are only explicitly pre-gathered for HOH
3743 11 6 while ((entry = hv_iternext(hv))) {
3749 0 5 if (av_len(av) < 0) XSRETURN_EMPTY;
3751 5 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
5 0 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
4 1 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
0 4 if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) {
3752 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))
3756 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))
3764 9 4 for (size_t i = 0; i <= av_len(av); i++) {
3766 9 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
9 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
9 0 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
0 9 if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) {
3773 0 34 if (!fh) croak("write_table: Could not open '%s' for writing", file);
3775 34 0 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
27 7 bool inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0;
3778 6 28 if (is_hoh) {
3779 1 5 if (col_names_sv && SvOK(col_names_sv)) {
1 0 if (col_names_sv && SvOK(col_names_sv)) {
3781 3 1 for(size_t i=0; i<=av_len(c_av); i++) {
3783 3 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3789 9 5 while((entry = hv_iternext((HV*)data_ref))) {
3793 17 9 while((inner_entry = hv_iternext(inner))) {
3799 12 5 for(unsigned i=0; i
3804 12 5 for(unsigned i=0; i
3811 6 0 if (inc_rownames) header_row[h_idx++] = "";
3812 15 6 for(unsigned short int i=0; i
3814 15 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
15 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
3820 11 6 for(size_t i=0; i
3826 11 4 for(size_t i=0; i
3828 11 0 if (inc_rownames) row_data[d_idx++] = row_array[i];
3830 11 0 HV *restrict inner_hv = inner_hv_ptr ? (HV*)SvRV(*inner_hv_ptr) : NULL;
3831 31 9 for(size_t j=0; j
3833 31 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
31 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
3834 31 0 SV **restrict cell_ptr = inner_hv ? hv_fetch(inner_hv, col_name, strlen(col_name), 0) : NULL;
3835 21 10 if (cell_ptr && SvOK(*cell_ptr)) {
20 1 if (cell_ptr && SvOK(*cell_ptr)) {
3836 2 18 if (SvROK(*cell_ptr)) {
3839 2 0 if (headers_av) SvREFCNT_dec(headers_av);
3840 2 0 if (rows_av) SvREFCNT_dec(rows_av);
3852 10 18 } else if (is_flat_hash) {
3856 28 10 for(unsigned int i=0; i
3862 1 9 if (col_names_sv && SvOK(col_names_sv)) {
1 0 if (col_names_sv && SvOK(col_names_sv)) {
3864 0 1 for(SSize_t i=0; i<=av_len(c_av); i++) {
3866 0 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
0 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3869 25 9 for(unsigned i=0; i
3877 8 2 if (inc_rownames) header_row[h_idx++] = "";
3878 25 10 for(size_t i=0; i
3880 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) : "";
3887 8 2 if (inc_rownames) row_data[d_idx++] = "1";
3888 25 10 for(size_t j=0; j
3890 25 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
25 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
3893 25 0 row_data[d_idx++] = (val_ptr && SvOK(*val_ptr)) ? SvPV_nolen(*val_ptr) : undef_val;
25 0 row_data[d_idx++] = (val_ptr && SvOK(*val_ptr)) ? SvPV_nolen(*val_ptr) : undef_val;
3898 14 4 } else if (is_hoa) {
3903 36 14 while((entry = hv_iternext(data_hv))) {
3906 16 20 if (len > max_rows) max_rows = len;
3908 4 10 if (col_names_sv && SvOK(col_names_sv)) {
4 0 if (col_names_sv && SvOK(col_names_sv)) {
3910 9 4 for(size_t i=0; i<=av_len(c_av); i++) {
3912 9 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
9 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
3917 25 10 for(unsigned int i=0; i
3922 25 10 for(unsigned i=0; i
3925 0 14 if (av_len(headers_av) < 0) croak("Could not get headers in write_table");
3926 11 3 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
1 10 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
3930 2 1 for(size_t i=0; i<=av_len(headers_av); i++) {
3932 2 0 if (!h_ptr || !*h_ptr) continue;
0 2 if (!h_ptr || !*h_ptr) continue;
3934 1 1 if (strcmp(SvPV_nolen(h_sv), rownames_col) != 0) {
3944 11 3 if (inc_rownames) header_row[h_idx++] = "";
3945 33 14 for(size_t i=0; i
3947 33 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
33 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
3952 50 14 for(size_t i=0; i
3954 38 12 if (inc_rownames) {
3955 2 36 if (rownames_col) {
3957 2 0 if (rn_arr_ptr && SvROK(*rn_arr_ptr)) {
2 0 if (rn_arr_ptr && SvROK(*rn_arr_ptr)) {
3960 2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
2 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
3961 0 2 if (SvROK(*rn_val_ptr)) {
3964 0 0 if (headers_av) SvREFCNT_dec(headers_av);
3980 128 50 for(size_t j=0; j
3982 128 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
128 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
3984 128 0 if (arr_ptr && SvROK(*arr_ptr)) {
128 0 if (arr_ptr && SvROK(*arr_ptr)) {
3987 109 19 if (cell_ptr && SvOK(*cell_ptr)) {
81 28 if (cell_ptr && SvOK(*cell_ptr)) {
3988 0 81 if (SvROK(*cell_ptr)) {
3991 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4003 38 12 if (inc_rownames && !rownames_col) safefree((char*)row_data[0]);
36 2 if (inc_rownames && !rownames_col) safefree((char*)row_data[0]);
4006 4 0 } else if (is_aoh) {// ----- Array of Hashes
4009 1 3 if (col_names_sv && SvOK(col_names_sv)) {
1 0 if (col_names_sv && SvOK(col_names_sv)) {
4011 2 1 for(size_t i=0; i<=av_len(c_av); i++) {
4013 2 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
2 0 if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c));
4017 7 3 for(size_t i=0; i
4019 7 0 if (row_ptr && SvROK(*row_ptr)) {
7 0 if (row_ptr && SvROK(*row_ptr)) {
4023 13 7 while((entry = hv_iternext(row_hv))) {
4030 7 3 for(unsigned int i=0; i
4035 7 3 for(unsigned int i=0; i
4039 2 2 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
0 2 if (inc_rownames && contains_nondigit(aTHX_ row_names_sv)) {
4042 0 0 for(size_t i=0; i<=av_len(headers_av); i++) {
4044 0 0 if (!h_ptr || !*h_ptr) continue;
0 0 if (!h_ptr || !*h_ptr) continue;
4046 0 0 if (strcmp(SvPV_nolen(h_sv), rownames_col) != 0) {
4056 2 2 if (inc_rownames) header_row[h_idx++] = "";
4057 9 4 for(size_t i=0; i
4059 9 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
9 0 header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4064 9 4 for(size_t i=0; i
4067 9 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
9 0 HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL;
4068 5 4 if (inc_rownames) {
4069 0 5 if (rownames_col) {
4070 0 0 SV **restrict rn_val_ptr = row_hv ? hv_fetch(row_hv, rownames_col, strlen(rownames_col), 0) : NULL;
4071 0 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
0 0 if (rn_val_ptr && SvOK(*rn_val_ptr)) {
4072 0 0 if (SvROK(*rn_val_ptr)) {
4075 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4088 21 9 for(size_t j=0; j
4090 21 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
21 0 const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : "";
4091 21 0 SV **restrict cell_ptr = row_hv ? hv_fetch(row_hv, col_name, strlen(col_name), 0) : NULL;
4092 17 4 if (cell_ptr && SvOK(*cell_ptr)) {
17 0 if (cell_ptr && SvOK(*cell_ptr)) {
4093 0 17 if (SvROK(*cell_ptr)) {
4096 0 0 if (headers_av) SvREFCNT_dec(headers_av);
4105 5 4 if (inc_rownames && !rownames_col) safefree((char*)row_data[0]);
5 0 if (inc_rownames && !rownames_col) safefree((char*)row_data[0]);
4109 32 0 if (headers_av) SvREFCNT_dec(headers_av);
4110 4 28 if (rows_av) SvREFCNT_dec(rows_av);
4126 522 0 if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) {
522 0 if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) {
522 0 if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) {
4131 522 0 sep_len = sep_str ? strlen(sep_str) : 0;
4132 522 0 comment_len = comment_str ? strlen(comment_str) : 0;
4135 0 522 if (!fp) {
4140 6718 521 while (sv_gets(line_sv, fp, 0) != NULL) {
4144 6718 0 if (len > 0 && line[len-1] == '\n') {
6717 1 if (len > 0 && line[len-1] == '\n') {
4146 6717 0 if (len > 0 && line[len-1] == '\r') {
4928 1789 if (len > 0 && line[len-1] == '\r') {
4150 6718 0 if (!in_quotes) {
4153 6720 0 for (size_t i = 0; i < len; i++) {
4154 6720 0 if (line[i] != ' ' && line[i] != '\t') { is_empty = 0; break; }
6718 2 if (line[i] != ' ' && line[i] != '\t') { is_empty = 0; break; }
4156 0 6718 if (is_empty) continue;
4159 6718 0 if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) {
6718 0 if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) {
0 6718 if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) {
4163 384147 6718 for (size_t i = 0; i < len; i++) {// --- CORE PARSING MACHINE
4165 0 384147 if (ch == '\r') continue;
4166 29758 354389 if (ch == '"') {
4167 14881 14877 if (in_quotes && (i + 1 < len) && line[i+1] == '"') {
14870 11 if (in_quotes && (i + 1 < len) && line[i+1] == '"') {
4 14866 if (in_quotes && (i + 1 < len) && line[i+1] == '"') {
4170 14877 14877 } else if (in_quotes) {
4173 14877 0 } else if (!post_quote) {
4176 272046 82343 } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) {
272046 0 } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) {
272046 0 } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) {
69184 202862 } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) {
4185 0 6718 if (in_quotes) {
4194 6718 0 if (use_cb) {
4198 0 6718 PUSHMARK(SP);
4199 0 6718 XPUSHs(sv_2mortal(newRV_inc((SV*)current_row)));
4202 6717 0 FREETMPS;
4214 0 521 if (in_quotes) {
4216 0 0 if (use_cb) {
4220 0 0 PUSHMARK(SP);
4221 0 0 XPUSHs(sv_2mortal(newRV_inc((SV*)current_row)));
4224 0 0 FREETMPS;
4234 521 0 if (use_cb) {
4246 4 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
0 4 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) {
4249 4 0 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
0 4 if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) {
4254 2 2 if (strcmp(method, "pearson") != 0 &&
4255 1 1 strcmp(method, "spearman") != 0 &&
4256 0 1 strcmp(method, "kendall") != 0) {
4265 0 4 if (nx != ny) {
4276 20 4 for (size_t i = 0; i < nx; i++) {
4281 20 0 double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
20 0 double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
20 0 double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN;
4282 20 0 double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
20 0 double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
20 0 double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN;
4285 20 0 if (!isnan(xv) && !isnan(yv)) {
20 0 if (!isnan(xv) && !isnan(yv)) {
4293 0 4 if (n < 2) {
4299 1 3 if (strcmp(method, "kendall") == 0) {
4301 5 1 for (size_t i = 0; i < n; i++) {
4302 25 5 for (size_t j = 0; j < n; j++) {
4310 1 2 if (strcmp(method, "spearman") == 0) {
4317 5 1 for (size_t i = 0; i < n; i++) {
4327 10 2 for (size_t i = 0; i < n; i++) {
4381 0 10 if (items % 2 != 0) croak("Usage: glm(formula => 'am ~ wt + hp', data => \\%mtcars)");
4383 28 10 for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) {
4386 10 18 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
4387 10 8 else if (strEQ(key, "data")) data_sv = val;
4388 8 0 else if (strEQ(key, "family")) family_str = SvPV_nolen(val);
4391 0 10 if (!formula) croak("glm: formula is required");
4392 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");
4396 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);
4404 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++; }
4408 0 10 if (!tilde) croak("glm: invalid formula, missing '~'");
4413 1 9 if ((minus_one = strstr(rhs, "-1")) != NULL) {
4420 0 10 if (minus1) {
4426 9 1 if (has_intercept) terms[num_terms++] = savepv("Intercept");
4429 16 10 while (chunk != NULL) {
4430 0 16 if (num_terms >= term_cap - 3) {
4434 16 0 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
0 16 if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) {
4439 0 16 if (star) {
4442 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';
4443 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';
4451 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';
4457 25 10 for (i = 0; i < num_terms; i++) {
4459 21 25 for (size_t j = 0; j < num_uniq; j++) {
4460 0 21 if (strcmp(terms[i], uniq_terms[j]) == 0) { found = TRUE; break; }
4462 25 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
4467 10 0 if (SvTYPE(ref) == SVt_PVHV) {
4469 0 10 if (hv_iterinit(hv) == 0) croak("glm: Data hash is empty");
4471 10 0 if (entry) {
4473 10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
5 5 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
4476 0 5 Newx(row_names, n, char*);
4477 131 5 for(i = 0; i < n; i++) {
4481 5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
5 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
4483 0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 5 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
4485 160 5 while ((entry = hv_iternext(hv))) {
4493 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
4496 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
4497 0 0 for (i = 0; i < n; i++) {
4499 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) {
4504 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
4511 25 10 for (size_t j = 0; j < p; j++) {
4512 0 25 if (p_exp + 32 >= exp_cap) {
4517 9 16 if (strcmp(uniq_terms[j], "Intercept") == 0) {
4520 1 15 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
4522 0 1 Newx(levels, levels_cap, char*);
4523 60 1 for (i = 0; i < n; i++) {
4525 60 0 if (str_val) {
4527 88 2 for (size_t l = 0; l < num_levels; l++) {
4528 58 30 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
4530 2 58 if (!found) {
4531 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*); }
4537 1 0 if (num_levels > 0) {
4538 1 1 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
4539 1 1 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
4540 1 0 if (strcmp(levels[l1], levels[l2]) > 0) {
4545 1 1 for (size_t l = 1; l < num_levels; l++) {
4546 0 1 if (p_exp >= exp_cap) {
4557 2 1 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
4568 0 10 Newx(X, n * p, double); Newx(Y, n, double);
0 10 Newx(X, n * p, double); Newx(Y, n, double);
4569 0 10 Newx(valid_row_names, n, char*);
4572 291 10 for (size_t i = 0; i < n; i++) {
4574 0 291 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
4578 799 291 for (size_t j = 0; j < p; j++) {
4579 288 511 if (strcmp(exp_terms[j], "Intercept") == 0) {
4581 60 451 } else if (is_dummy[j]) {
4583 60 0 if (str_val) {
4584 30 30 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
4589 0 451 if (isnan(row_x[j])) { row_ok = FALSE; break; }
4592 0 291 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
4594 799 291 for (size_t j = 0; j < p; j++) X[valid_n * p + j] = row_x[j];
4600 0 10 if (valid_n < p) {
4601 0 0 Safefree(X); Safefree(Y); Safefree(valid_row_names); if (row_hashes) Safefree(row_hashes);
4610 25 10 for (i = 0; i < p; i++) { beta[i] = 0.0; beta_old[i] = 0.0; }
4613 291 10 for (i = 0; i < valid_n; i++) sum_y += Y[i];
4615 288 9 for (i = 0; i < valid_n; i++) {
4616 37 251 if (is_binomial) {
4617 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");
4621 21 15 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
4622 15 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
4631 45 0 for (iter = 1; iter <= max_iter; iter++) {
4632 879 45 for (i = 0; i < valid_n; i++) {
4633 380 499 if (is_binomial) {
4636 12 368 if (varmu < 1e-10) varmu = 1e-10;
4645 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; }
4646 879 45 for (size_t k = 0; k < valid_n; k++) {
4648 2419 879 for (i = 0; i < p; i++) {
4651 6827 2419 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
4655 108 45 for (i = 0; i < p; i++) {
4656 0 108 if (aliased[i]) { beta[i] = NAN; } else {
4658 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];
4664 450 45 for (unsigned short int half = 0; half < 10; half++) {
4666 8790 450 for (i = 0; i < valid_n; i++) {
4668 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];
4670 3800 4990 if (is_binomial) {
4673 0 3800 if (mu[i] < 10 * DBL_EPSILON) mu[i] = 10 * DBL_EPSILON;
4674 0 3800 if (mu[i] > 1.0 - 10 * DBL_EPSILON) mu[i] = 1.0 - 10 * DBL_EPSILON;
4676 2170 1630 if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]);
4677 1630 0 else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]);
4687 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)) {
4691 30 10 for (size_t j = 0; j < p; j++) beta[j] = (beta[j] + beta_old[j]) / 2.0;
4694 9 36 if (fabs(deviance_new - deviance_old) / (0.1 + fabs(deviance_new)) < epsilon) {
4698 85 36 for (size_t j = 0; j < p; j++) beta_old[j] = beta[j];
4701 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; }
4702 287 9 for (size_t k = 0; k < valid_n; k++) {
4703 36 251 double w = is_binomial ? (mu[k] * (1.0 - mu[k])) : 1.0;
4704 4 283 if (w < 1e-10) w = 1e-10;
4705 791 287 for (i = 0; i < p; i++) {
4707 2239 791 for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j];
4713 8 1 double wtdmu = has_intercept ? mean_y : (is_binomial ? 0.5 : 0.0);
0 1 double wtdmu = has_intercept ? mean_y : (is_binomial ? 0.5 : 0.0);
4715 287 9 for (i = 0; i < valid_n; i++) {
4716 36 251 if (is_binomial) {
4717 21 15 if (Y[i] == 0.0) null_dev += -2.0 * log(1.0 - wtdmu);
4718 15 0 else if (Y[i] == 1.0) null_dev += -2.0 * log(wtdmu);
4726 7 2 if (is_gaussian) {
4732 1 6 if (dev_for_aic < 1.0355727742801604e-30) {
4737 2 0 } else if (is_binomial) {
4743 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);
4744 287 9 for (size_t i = 0; i < valid_n; i++) {
4746 36 251 if (is_binomial) {
4749 21 15 if (Y[i] == 0.0) d_res = sqrt(-2.0 * log(1.0 - mu[i]));
4750 15 0 else if (Y[i] == 1.0) d_res = sqrt(-2.0 * log(mu[i]));
4752 15 21 res = (Y[i] > mu[i]) ? d_res : -d_res;
4760 23 9 for (size_t j = 0; j < p; j++) {
4765 0 23 if (aliased[j]) {
4768 0 0 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVpv("NaN", 0), 0);
4769 0 0 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVpv("NaN", 0), 0);
4773 5 18 double p_val = is_binomial ? 2.0 * (1.0 - approx_pnorm(fabs(val_stat))) : get_t_pvalue(val_stat, df_res, "two.sided");
4776 5 18 hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVnv(val_stat), 0);
4777 5 18 hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVnv(p_val), 0);
4797 23 9 for (i = 0; i < num_terms; i++) Safefree(terms[i]);
4799 23 9 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]);
4801 23 9 for (size_t j = 0; j < p_exp; j++) {
4803 1 22 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
4809 5 4 if (row_hashes) Safefree(row_hashes);
4818 12 0 if (items < 2 || items % 2 != 0)
0 12 if (items < 2 || items % 2 != 0)
4827 34 12 for (unsigned short int i = 2; i < items; i += 2) {
4830 7 27 if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
4831 12 15 else if (strEQ(key, "method")) method = SvPV_nolen(val);
4832 1 14 else if (strEQ(key, "exact")) exact_sv = val;
4833 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);
4834 7 0 else if (strEQ(key, "continuity")) continuity = SvTRUE(val);
4844 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 ||
4845 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) {
4851 0 12 if (n_raw != (size_t)(av_len(y_av) + 1)) croak("incompatible dimensions");
4855 269 12 for (size_t i = 0; i < n_raw; i++) {
4858 269 0 double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
267 2 double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
267 0 double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN;
4859 269 0 double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
267 2 double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
267 0 double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN;
4861 267 2 if (!isnan(xv) && !isnan(yv)) {
265 2 if (!isnan(xv) && !isnan(yv)) {
4867 0 12 if (n < 3) {
4872 6 6 if (is_pearson) {
4875 30 6 for (size_t i = 0; i < n; i++) {
4884 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;
4886 0 6 if (estimate > 1.0) estimate = 1.0;
4887 0 6 else if (estimate < -1.0) estimate = -1.0;
4892 2 4 if (denom_t <= 0.0)
4893 1 1 statistic = (estimate > 0.0) ? INFINITY : -INFINITY;
4900 1 5 if (est_clamped >= 1.0) est_clamped = 1.0 - DBL_EPSILON;
4901 1 4 else if (est_clamped <= -1.0) est_clamped = -1.0 + DBL_EPSILON;
4910 3 3 } else if (is_kendall) {
4913 207 3 for (size_t i = 0; i < n - 1; i++) {
4914 19920 207 for (size_t j = i + 1; j < n; j++) {
4917 0 19920 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
0 0 if (sign_x == 0 && sign_y == 0) { /* joint tie — ignore */ }
4918 0 19920 else if (sign_x == 0) tie_x++;
4919 0 19920 else if (sign_y == 0) tie_y++;
4920 16 19904 else if (sign_x * sign_y > 0) c++;
4926 3 0 estimate = (denom == 0.0) ? NAN : (double)(c - d) / denom;
4927 3 0 bool has_ties = (tie_x > 0 || tie_y > 0);
0 3 bool has_ties = (tie_x > 0 || tie_y > 0);
4930 1 2 if (!exact_sv || !SvOK(exact_sv))
0 1 if (!exact_sv || !SvOK(exact_sv))
4931 2 0 do_exact = (n < 50) && !has_ties;
2 0 do_exact = (n < 50) && !has_ties;
4935 2 1 if (do_exact && has_ties) do_exact = 0;
0 2 if (do_exact && has_ties) do_exact = 0;
4936 2 1 if (do_exact) {
4944 0 1 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
0 0 if (continuity) S -= (S > 0.0 ? 1.0 : -1.0);
4947 1 0 if (strcmp(alternative, "two.sided") == 0)
4949 0 0 else if (strcmp(alternative, "less") == 0)
4955 3 0 } else if (is_spearman) {
4963 25 3 for (size_t i = 0; i < n; i++) {
4972 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;
4975 0 3 if (estimate > 1.0) estimate = 1.0;
4976 0 3 else if (estimate < -1.0) estimate = -1.0;
4980 25 3 for (size_t i = 0; i < n; i++) {
4987 25 3 for (size_t i = 0; i < n; i++) {
4988 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])) {
4995 0 3 if (!exact_sv || !SvOK(exact_sv))
0 0 if (!exact_sv || !SvOK(exact_sv))
4996 1 2 do_exact = (n < 10) && !has_ties;
1 0 do_exact = (n < 10) && !has_ties;
5000 1 2 if (do_exact) {
5008 0 2 if (continuity) {
5013 2 0 if (denom_t <= 0.0)
5014 1 1 statistic = (r > 0.0) ? INFINITY : -INFINITY;
5037 6 6 if (is_pearson) {
5058 2 0 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
0 2 if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) {
5065 0 2 Newx(x, n_raw, double);
5068 24 2 for (size_t i = 0; i < n_raw; i++) {
5070 24 0 if (elem && SvOK(*elem)) {
24 0 if (elem && SvOK(*elem)) {
5072 24 0 if (!isnan(val)) {
5080 2 0 if (n < 3 || n > 5000) {
0 2 if (n < 3 || n > 5000) {
5087 24 2 for (size_t i = 0; i < n; i++) {
5090 0 2 if (ssq == 0.0) {
5096 0 2 if (n == 3) {
5100 0 0 if (w < 0.75) w = 0.75;
5106 0 2 Newx(m, n, double);
5107 0 2 Newx(a, n, double);
5108 24 2 for (size_t i = 0; i < n; i++) {
5116 2 0 if (n == 4 || n == 5) {
1 1 if (n == 4 || n == 5) {
5118 3 1 for (unsigned int i = 1; i < n-1; i++) {
5126 15 1 for (unsigned int i = 2; i < n-2; i++) {
5130 24 2 for (size_t i = 0; i < n; i++) {
5140 1 1 if (n <= 11) {
5146 0 1 if (y >= gamma) {
5169 0 2 if (p_val > 1.0) p_val = 1.0;
5170 0 2 if (p_val < 0.0) p_val = 0.0;
5179 0 2 EXTEND(SP, 1);
5189 10035 17 for (unsigned short int i = 0; i < items; i++) {
5191 11 10024 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
11 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5194 456 10 for (size_t j = 0; j < len; j++) {
5196 456 0 if (tv && SvOK(*tv)) {
455 1 if (tv && SvOK(*tv)) {
5198 445 10 if (first || val < min_val) {
13 432 if (first || val < min_val) {
5207 10023 1 } else if (SvOK(arg)) {
5209 10015 8 if (first || val < min_val) {
13 10002 if (first || val < min_val) {
5218 1 16 if (count == 0) croak("min needs >= 1 numeric element");
5219 4 12 RETVAL = min_val;
5230 10035 18 for (size_t i = 0; i < items; i++) {
5232 12 10023 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
12 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5235 556 11 for (size_t j = 0; j < len; j++) {
5237 556 0 if (tv && SvOK(*tv)) {
555 1 if (tv && SvOK(*tv)) {
5239 544 11 if (first || val > max_val) {
39 505 if (first || val > max_val) {
5248 10022 1 } else if (SvOK(arg)) {
5250 10014 8 if (first || val > max_val) {
21 9993 if (first || val > max_val) {
5259 1 17 if (count == 0) croak("max needs >= 1 numeric element");
5260 4 13 RETVAL = max_val;
5275 0 11 if (items == 0) {
5279 17 11 while (i < items) {
5281 8 9 if (i + 1 < items && SvPOK(ST(i))) {
6 2 if (i + 1 < items && SvPOK(ST(i))) {
5283 2 4 if (strEQ(key, "n")) {
5288 2 2 } else if (strEQ(key, "min")) {
5293 2 0 } else if (strEQ(key, "max")) {
5302 9 2 if (!n_set) {
5305 1 1 } else if (!min_set) {
5308 1 0 } else if (!max_set) {
5316 0 11 if (!n_set) {
5320 0 11 AUTO_SEED_PRNG();
5322 11 0 if (n > 0) {
5326 20079 11 for (size_t j = 0; j < n; j++) {
5328 0 20079 if (max < min) {
5344 0 12 AUTO_SEED_PRNG();
5345 1 11 if (items % 2 != 0)
5353 31 11 for (unsigned short i = 0; i < items; i += 2) {
5357 11 20 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
5358 10 10 else if (strEQ(key, "size")) { size = (unsigned int)SvUV(val); size_set = TRUE; }
5359 10 0 else if (strEQ(key, "prob")) { prob = SvNV(val); prob_set = TRUE; }
5364 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");
5365 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");
5368 7 0 if (n > 0) {
5370 20499 7 for (unsigned int i = 0; i < n; i++) {
5384 8 1 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
1 7 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
5389 1 6 if (n_raw == 0) croak("hist: input array is empty");
5393 0 6 Newx(x, n_raw, double);
5397 2021 5 for (size_t i = 0; i < n_raw; i++) {
5399 2021 0 if (tv && SvOK(*tv)) {
2021 0 if (tv && SvOK(*tv)) {
5402 5 2015 if (val < min_val) min_val = val;
5403 2012 8 if (val > max_val) max_val = val;
5406 0 5 if (n == 0) {
5412 0 5 if (items == 2) {
5415 5 0 } else if (items > 2) {
5417 5 0 for (unsigned short i = 1; i < items - 1; i++) {
5419 5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
5 0 if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) {
5425 0 5 if (n_bins == 0 && looks_like_number(ST(1))) {
0 0 if (n_bins == 0 && looks_like_number(ST(1))) {
5429 0 5 if (n_bins == 0) n_bins = calculate_sturges_bins(n);
5433 0 5 Newx(breaks, n_bins + 1, double);
5434 0 5 Newx(mids, n_bins, double);
5435 0 5 Newx(density, n_bins, double);
5436 0 5 Newx(counts, n_bins, size_t);
5439 23 5 for (size_t i = 0; i <= n_bins; i++) {
5450 23 5 for (size_t i = 0; i <= n_bins; i++) {
5452 18 5 if (i < n_bins) {
5477 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) {
5482 0 11 if ((items - arg_idx) % 2 != 0)
5485 12 11 for (; arg_idx < items; arg_idx += 2) {
5489 1 11 if (strEQ(key, "x")) x_sv = val;
5490 11 0 else if (strEQ(key, "probs")) probs_sv = val;
5493 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)
5498 0 11 if (n_raw == 0) croak("quantile: 'x' is empty");
5501 0 11 Newx(x, n_raw, NV);
5503 447 11 for (size_t i = 0; i < n_raw; i++) {
5505 447 0 if (tv && SvOK(*tv)) {
447 0 if (tv && SvOK(*tv)) {
5509 0 11 if (n == 0) {
5520 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) {
5524 23 11 for (unsigned int i = 0; i < n_probs; i++) {
5526 23 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
23 0 probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0;
5527 23 0 if (probs[i] < 0.0 || probs[i] > 1.0) {
0 23 if (probs[i] < 0.0 || probs[i] > 1.0) {
5534 0 0 for (unsigned int i = 0; i < n_probs; i++) probs[i] = default_probs[i];
5538 23 11 for (size_t i = 0; i < n_probs; i++) {
5542 1 22 if (n == 1) {
5544 1 21 } else if (p == 1.0) {
5546 1 20 } else if (p == 0.0) {
5559 23 0 if (fabs(pct - pct_rounded) < 1e-9) {
5579 61 46 for (size_t i = 0; i < items; i++) {
5581 45 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
45 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5584 20513 44 for (size_t j = 0; j < len; j++) {
5586 20513 0 if (tv && SvOK(*tv)) {
20512 1 if (tv && SvOK(*tv)) {
5593 15 1 } else if (SvOK(arg)) {
5600 1 45 if (count == 0) croak("mean needs >= 1 element");
5601 34 11 RETVAL = total / count;
5618 12 4 for (size_t i = 0; i < items; i++) {
5620 1 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
1 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5623 4 1 for (size_t j = 0; j < len; j++) {
5625 4 0 if (tv && SvOK(*tv)) {
4 0 if (tv && SvOK(*tv)) {
5629 0 4 if (!slot) croak("mode: internal hash error");
5630 2 2 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
5632 3 1 if (cnt > max_count) max_count = cnt;
5633 2 2 if (cnt == 1)
5640 10 1 } else if (SvOK(arg)) {
5644 0 10 if (!slot) croak("mode: internal hash error");
5645 4 6 size_t cnt = SvOK(*slot) ? SvIV(*slot) + 1 : 1;
5647 6 4 if (cnt > max_count) max_count = cnt;
5648 6 4 if (cnt == 1)
5656 1 3 if (arg_count == 0)
5660 7 3 while ((he = hv_iternext(counts))) {
5661 4 3 if (SvIV(hv_iterval(counts, he)) == max_count) {
5663 0 4 const char *restrict key = HePV(he, klen);
5665 0 4 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
4 0 mXPUSHs(orig ? newSVsv(*orig) : newSVpvn(key, klen));
5675 16 3 for (size_t i = 0; i < items; i++) {
5677 2 14 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
2 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5680 10 1 for (size_t j = 0; j < len; j++) {
5682 10 0 if (tv && SvOK(*tv)) {
9 1 if (tv && SvOK(*tv)) {
5689 13 1 } else if (SvOK(arg)) {
5696 0 3 if (count == 0) croak("sum needs >= 1 element");
5697 1 2 RETVAL = total;
5708 37 21 for (size_t i = 0; i < items; i++) {
5710 18 19 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
18 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5713 10069 17 for (size_t j = 0; j < len; j++) {
5715 10069 0 if (tv && SvOK(*tv)) {
10068 1 if (tv && SvOK(*tv)) {
5725 18 1 } else if (SvOK(arg)) {
5735 1 20 if (count < 2) croak("sd needs >= 2 elements");
5736 2 18 RETVAL = sqrt(M2 / (count - 1));
5747 15 6 for (size_t i = 0; i < items; i++) {
5749 4 11 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
4 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
5752 10012 3 for (size_t j = 0; j < len; j++) {
5754 10012 0 if (tv && SvOK(*tv)) {
10011 1 if (tv && SvOK(*tv)) {
5764 10 1 } else if (SvOK(arg)) {
5774 1 5 if (count < 2) croak("var needs >= 2 elements");
5775 1 4 RETVAL = M2 / (count - 1);
5789 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) {
5794 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) {
5799 0 53 if ((items - arg_idx) % 2 != 0) {
5803 76 53 for (; arg_idx < items; arg_idx += 2) {
5807 25 51 if (strEQ(key, "x")) x_sv = val;
5808 5 46 else if (strEQ(key, "y")) y_sv = val;
5809 35 11 else if (strEQ(key, "mu")) mu = SvNV(val);
5810 4 7 else if (strEQ(key, "paired")) paired = SvTRUE(val);
5811 3 4 else if (strEQ(key, "var_equal")) var_equal = SvTRUE(val);
5812 2 2 else if (strEQ(key, "conf_level")) conf_level = SvNV(val);
5813 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
5818 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)
5822 0 52 if (nx < 2) croak("t_test: 'x' needs at least 2 elements");
5824 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)
5826 52 0 if (conf_level <= 0.0 || conf_level >= 1.0)
1 51 if (conf_level <= 0.0 || conf_level >= 1.0)
5831 396 51 for (size_t i = 0; i < nx; i++) {
5833 396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
396 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
5839 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");
5841 46 4 if (paired || y_av) {
11 35 if (paired || y_av) {
5842 1 14 if (!y_av) croak("t_test: 'y' must be provided for paired or two-sample tests");
5844 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");
5846 127 13 for (size_t i = 0; i < ny; i++) {
5848 127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
127 0 NV val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0;
5854 2 11 if (paired) {
5856 12 2 for (size_t i = 0; i < nx; i++) {
5859 12 0 double dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0;
12 0 double dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0;
5860 12 0 double dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0;
12 0 double dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0;
5867 0 2 if (var_d == 0.0) croak("t_test: data are essentially constant");
5873 2 9 } else if (var_equal) {
5874 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");
5883 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");
5903 1 47 if (strcmp(alternative, "less") == 0) {
5907 1 46 } else if (strcmp(alternative, "greater") == 0) {
5930 14 1 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
0 14 if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) {
5936 1 13 if (n == 0) {
5942 144 13 for(unsigned short int i = 0; meth[i]; i++) meth[i] = tolower(meth[i]);
5944 4 9 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
2 2 if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh");
5945 2 11 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
2 0 if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by");
5946 0 13 if (strcmp(meth, "fdr") == 0) strcpy(meth, "bh");
5950 0 13 Newx(arr, n, PVal);
5951 0 13 Newx(adj, n, double);
5953 356 13 for (size_t i = 0; i < n; i++) {
5955 356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
356 0 arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0;
5961 2 11 if (strcmp(meth, "bonferroni") == 0) {
5962 51 2 for (size_t i = 0; i < n; i++) {
5964 19 32 adj[arr[i].orig_idx] = (v < 1.0) ? v : 1.0;
5966 2 9 } else if (strcmp(meth, "holm") == 0) {
5968 51 2 for (size_t i = 0; i < n; i++) {
5970 32 19 if (v > cummax) cummax = v;
5971 22 29 adj[arr[i].orig_idx] = (cummax < 1.0) ? cummax : 1.0;
5973 2 7 } else if (strcmp(meth, "hochberg") == 0) {
5975 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
5977 22 29 if (v < cummin) cummin = v;
5978 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
5980 2 5 } else if (strcmp(meth, "bh") == 0) {
5982 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
5984 41 10 if (v < cummin) cummin = v;
5985 51 0 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
5987 2 3 } else if (strcmp(meth, "by") == 0) {
5989 51 2 for (size_t i = 1; i <= n; i++) q += 1.0 / i;
5991 51 2 for (ssize_t i = n - 1; i >= 0; i--) {
5993 22 29 if (v < cummin) cummin = v;
5994 26 25 adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0;
5996 2 1 } else if (strcmp(meth, "hommel") == 0) {
5998 0 2 Newx(pa, n, double);
5999 0 2 Newx(q_arr, n, double);
6002 49 2 for (size_t i = 1; i < n; i++) {
6004 0 49 if (temp < min_val) {
6009 51 2 for (size_t i = 0; i < n; i++) {
6013 48 2 for (size_t j = n - 1; j >= 2; j--) {
6018 1128 48 for (size_t k = 1; k < i2_len; k++) {
6020 266 862 if (temp_q1 < q1) {
6025 1224 48 for (size_t i = 0; i <= n_mj; i++) {
6027 847 377 q_arr[i] = (v < q1) ? v : q1;
6030 1176 48 for (size_t i = 0; i < i2_len; i++) {
6034 2400 48 for (size_t i = 0; i < n; i++) {
6035 1401 999 if (pa[i] < q_arr[i]) {
6041 51 2 for (size_t i = 0; i < n; i++) {
6042 50 1 NV v = (pa[i] > arr[i].p) ? pa[i] : arr[i].p;
6043 0 51 if (v > 1.0) v = 1.0;
6047 0 1 } else if (strcmp(meth, "none") == 0) {
6048 0 0 for (size_t i = 0; i < n; i++) {
6056 0 12 EXTEND(SP, n);
6057 306 12 for (size_t i = 0; i < n; i++) {
6071 19 13 for (size_t i = 0; i < items; i++) {
6073 12 7 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
12 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6076 284 11 for (size_t j = 0; j < len; j++) {
6078 284 0 if (tv && SvOK(*tv)) {
283 1 if (tv && SvOK(*tv)) {
6084 6 1 } else if (SvOK(arg)) {
6090 1 12 if (total_count == 0) croak("median needs >= 1 element");
6093 0 12 Newx(nums, total_count, double);
6096 15 12 for (size_t i = 0; i < items; i++) {
6098 11 4 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
11 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6101 282 11 for (size_t j = 0; j < len; j++) {
6103 282 0 if (tv && SvOK(*tv)) {
282 0 if (tv && SvOK(*tv)) {
6110 4 0 } else if (SvOK(arg)) {
6119 4 8 if (total_count % 2 == 0) {
6126 6 6 RETVAL = median_val;
6133 11 59 if (strcmp(method, "pearson") != 0 &&
6134 5 6 strcmp(method, "spearman") != 0 &&
6135 1 4 strcmp(method, "kendall") != 0)
6140 69 0 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
0 69 if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV)
6145 0 69 if (nx == 0) croak("cor: x is empty");
6151 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)
6156 69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
69 0 bool has_y = (SvOK(y_sv) && SvROK(y_sv) &&
6157 69 0 SvTYPE(SvRV(y_sv)) == SVt_PVAV);
6159 69 0 AV*restrict y_av = has_y ? (AV*)SvRV(y_sv) : NULL;
6160 69 0 size_t ny = has_y ? av_len(y_av) + 1 : 0;
6163 69 0 if (has_y && ny > 0) {
69 0 if (has_y && ny > 0) {
6165 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)
6171 68 1 if (!x_is_matrix && !y_is_matrix) {
68 0 if (!x_is_matrix && !y_is_matrix) {
6172 0 68 if (!has_y) {
6176 1 67 if (nx != ny)
6179 0 67 if (nx < 2)
6182 0 67 Newx(xd, nx, double);
6183 0 67 Newx(yd, ny, double);
6186 318 67 for (size_t i = 0; i < nx; i++) {
6188 318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
6190 318 0 if (!isnan(val)) {
6191 67 251 if (isnan(x_first)) x_first = val;
6192 242 9 else if (val != x_first) x_sd0 = 0;
6195 318 67 for (size_t i = 0; i < ny; i++) {
6197 318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
318 0 double val = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN;
6199 318 0 if (!isnan(val)) {
6200 67 251 if (isnan(y_first)) y_first = val;
6201 242 9 else if (val != y_first) y_sd0 = 0;
6204 58 9 if (x_sd0 || y_sd0) {
0 58 if (x_sd0 || y_sd0) {
6206 9 0 if (x_sd0) croak("cor: standard deviation of x is 0");
6215 0 1 if (!x_is_matrix)
6220 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)
6224 0 1 if (ncols_x == 0) croak("cor: x matrix has zero columns");
6229 3 1 for (size_t i = 0; i < nrows; i++) {
6231 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)
6235 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6236 0 1 if (ny != nrows) croak("cor: x and y must have the same number of rows (%lu vs %lu)", nrows, ny);
6237 3 1 for (size_t i = 0; i < nrows; i++) {
6239 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)
6245 0 1 Newx(col_x, ncols_x, NV*);
6246 2 1 for (size_t j = 0; j < ncols_x; j++) {
6247 0 2 Newx(col_x[j], nrows, NV);
6250 6 2 for (size_t i = 0; i < nrows; i++) {
6254 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;
6256 6 0 if (!isnan(val)) {
6257 2 4 if (isnan(first)) first = val;
6258 4 0 else if (val != first) sd0 = 0;
6261 0 2 if (sd0) {
6262 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_x[k]);
6272 1 0 if (has_y && y_is_matrix) {
1 0 if (has_y && y_is_matrix) {
6276 0 1 if (ncols_y == 0) croak("cor: y matrix has zero columns");
6278 0 1 Newx(col_y, ncols_y, NV*);
6279 2 1 for (size_t j = 0; j < ncols_y; j++) {
6280 0 2 Newx(col_y[j], nrows, NV);
6283 6 2 for (size_t i = 0; i < nrows; i++) {
6287 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;
6289 6 0 if (!isnan(val)) {
6290 2 4 if (isnan(first)) first = val;
6291 4 0 else if (val != first) sd0 = 0;
6294 0 2 if (sd0) {
6295 0 0 for (size_t k = 0; k < ncols_x; k++) Safefree(col_x[k]);
6297 0 0 for (size_t k = 0; k <= j; k++) Safefree(col_y[k]);
6307 0 1 if (nrows < 2)
6314 0 1 Newx(rows_out, ncols_x, AV*);
6315 2 1 for (size_t i = 0; i < ncols_x; i++) {
6319 0 1 if (symmetric) {
6322 0 0 Newx(r_cache, ncols_x, NV*);
6323 0 0 for (size_t i = 0; i < ncols_x; i++)
6324 0 0 Newx(r_cache[i], ncols_x, NV);
6326 0 0 for (size_t i = 0; i < ncols_x; i++) {
6328 0 0 for (size_t j = i + 1; j < ncols_x; j++) {
6335 0 0 for (size_t i = 0; i < ncols_x; i++)
6336 0 0 for (size_t j = 0; j < ncols_x; j++)
6339 0 0 for (size_t i = 0; i < ncols_x; i++) Safefree(r_cache[i]);
6343 2 1 for (size_t i = 0; i < ncols_x; i++)
6344 4 2 for (size_t j = 0; j < ncols_y; j++)
6348 2 1 for (size_t i = 0; i < ncols_x; i++)
6352 2 1 for (size_t j = 0; j < ncols_x; j++) Safefree(col_x[j]);
6354 1 0 if (!symmetric) {
6355 2 1 for (size_t j = 0; j < ncols_y; j++) Safefree(col_y[j]);
6371 5 0 if (items > 0) {
6373 3 2 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
2 1 if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) {
6378 2 0 if (center_sv) {
6380 0 2 if (!SvOK(val_sv)) {
6385 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) {
6387 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) {
6389 0 0 } else if (looks_like_number(val_sv)) {
6391 0 0 } else if (SvTRUE(val_sv)) {
6400 1 1 if (scale_sv) {
6402 0 1 if (!SvOK(val_sv)) {
6406 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) {
6408 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) {
6410 0 0 } else if (looks_like_number(val_sv)) {
6412 0 0 if (scale_val == 0.0) scale_val = 1.0; /* Prevent Division By Zero */
6413 0 0 } else if (SvTRUE(val_sv)) {
6424 2 3 if (data_items == 1) {
6426 1 1 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
1 0 if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) {
6428 1 0 if (av_len(av) >= 0) {
6430 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) {
6436 1 4 if (is_matrix) {
6442 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");
6447 3 1 for (size_t r = 0; r < nrow; r++) {
6453 2 1 for (size_t c = 0; c < ncol; c++) {
6456 0 2 Newx(col_data, nrow, NV);
6458 6 2 for (size_t r = 0; r < nrow; r++) {
6460 6 0 if (row_sv && SvROK(*row_sv)) {
6 0 if (row_sv && SvROK(*row_sv)) {
6463 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;
6470 2 0 NV col_center = do_center_mean ? (col_sum / nrow) : center_val;
6473 2 0 if (do_scale_sd) {
6474 0 2 if (nrow <= 1) {
6480 6 2 for (size_t r = 0; r < nrow; r++) {
6487 6 2 for (size_t r = 0; r < nrow; r++) {
6489 6 0 NV final_val = (col_scale == 0.0) ? (0.0 / 0.0) : (centered / col_scale);
6496 0 1 EXTEND(SP, 1);
6503 16 4 for (size_t i = 0; i < data_items; i++) {
6505 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6508 0 0 for (unsigned int j = 0; j < len; j++) {
6510 0 0 if (tv && SvOK(*tv)) { total_count++; }
0 0 if (tv && SvOK(*tv)) { total_count++; }
6512 16 0 } else if (SvOK(arg)) {
6516 0 4 if (total_count == 0) croak("scale requires at least 1 numeric element");
6517 0 4 Newx(nums, total_count, NV);
6518 16 4 for (size_t i = 0; i < data_items; i++) {
6520 0 16 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
0 0 if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
6523 0 0 for (size_t j = 0; j < len; j++) {
6525 0 0 if (tv && SvOK(*tv)) {
0 0 if (tv && SvOK(*tv)) {
6530 16 0 } else if (SvOK(arg)) {
6535 3 1 if (do_center_mean) center_val = sum / total_count;
6536 3 1 if (do_scale_sd) {
6537 1 2 if (total_count <= 1) {
6542 10 2 for (size_t i = 0; i < total_count; i++) {
6548 0 3 EXTEND(SP, total_count);
6549 15 3 for (size_t i = 0; i < total_count; i++) {
6551 15 0 NV final_val = (scale_val == 0.0) ? (0.0 / 0.0) : (centered / scale_val);
6565 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) {
6568 1 0 if (items > 1 && SvOK(ST(1))) {
1 0 if (items > 1 && SvOK(ST(1))) {
6572 0 1 if (items > 2 && SvOK(ST(2))) {
0 0 if (items > 2 && SvOK(ST(2))) {
6576 0 1 if (items > 3 && SvOK(ST(3))) {
0 0 if (items > 3 && SvOK(ST(3))) {
6579 5 0 } else if (items % 2 == 0) {
6581 11 5 for (size_t i = 0; i < items; i += 2) {
6584 5 6 if (strEQ(key, "data")) {
6586 4 2 } else if (strEQ(key, "nrow")) {
6587 4 0 if (SvOK(val)) { nrow = (size_t)SvUV(val); nrow_set = TRUE; }
6588 1 1 } else if (strEQ(key, "ncol")) {
6589 1 0 if (SvOK(val)) { ncol = (size_t)SvUV(val); ncol_set = TRUE; }
6590 1 0 } else if (strEQ(key, "byrow")) {
6600 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) {
6604 0 5 size_t data_len = (UV)(av_top_index(data_av) + 1);
6605 1 4 if (data_len == 0) {
6609 0 4 if (!nrow_set && !ncol_set) {
0 0 if (!nrow_set && !ncol_set) {
6612 4 0 } else if (nrow_set && !ncol_set) {
3 1 } else if (nrow_set && !ncol_set) {
6614 0 1 } else if (!nrow_set && ncol_set) {
0 0 } else if (!nrow_set && ncol_set) {
6618 3 1 if (nrow == 0 || ncol == 0) {
0 3 if (nrow == 0 || ncol == 0) {
6626 6 3 for (r = 0; r < nrow; r++) {
6633 18 3 for (size_t i = 0; i < total_cells; i++) {
6636 18 0 SV*restrict val = fetched ? newSVsv(*fetched) : newSV(0);
6637 6 12 if (byrow) {
6677 0 22 if (items % 2 != 0) croak("Usage: lm(formula => 'mpg ~ wt * hp', data => \\%%mtcars)");
6679 42 22 for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) {
6682 21 21 if (strEQ(key, "formula")) formula = SvPV_nolen(val);
6683 21 0 else if (strEQ(key, "data")) data_sv = val;
6686 1 21 if (!formula) croak("lm: formula is required");
6687 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");
6691 19 0 if (SvTYPE(ref) == SVt_PVHV) {
6693 0 19 if (hv_iterinit(hv) == 0) croak("lm: Data hash is empty");
6695 19 0 if (entry) {
6697 19 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
12 7 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
6700 0 12 Newx(row_names, n, char*);
6701 70 12 for (size_t i = 0; i < n; i++) {
6706 7 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
7 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
6708 0 7 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 7 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
6710 224 7 while ((entry = hv_iternext(hv))) {
6718 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
6720 0 0 Newx(row_names, n, char*);
6721 0 0 Newx(row_hashes, n, HV*);
6722 0 0 for (size_t i = 0; i < n; i++) {
6724 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) {
6729 0 0 for (k = 0; k < i; k++) Safefree(row_names[k]);
6737 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++; }
6741 1 18 if (!tilde) {
6742 2 1 for (size_t i = 0; i < n; i++) Safefree(row_names[i]);
6743 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
6755 71 18 while (*p_idx) {
6757 0 71 if (p_idx[0] == 'I' && p_idx[1] == '(') {
0 0 if (p_idx[0] == 'I' && p_idx[1] == '(') {
6759 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++; }
6763 1 70 if (p_idx[0] == '-' && p_idx[1] == '1' &&
1 0 if (p_idx[0] == '-' && p_idx[1] == '1' &&
6764 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] == '-')) {
6770 8 62 if (p_idx[0] == '+' && p_idx[1] == '0' &&
0 8 if (p_idx[0] == '+' && p_idx[1] == '0' &&
6771 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] == '-')) {
6777 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] == '+') {
6783 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') {
6787 8 62 if (p_idx[0] == '+' && p_idx[1] == '1' &&
0 8 if (p_idx[0] == '+' && p_idx[1] == '1' &&
6788 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] == '-')) {
6793 18 52 if (p_idx == rhs) {
6794 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; }
6795 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; }
6803 0 18 while ((p_idx = strstr(rhs, "++")) != NULL)
6805 0 18 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
6807 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';
6814 26 18 while (chunk != NULL) {
6815 1 25 if (strcmp(chunk, ".") == 0) {
6817 3 1 for (size_t c = 0; c <= (size_t)av_len(cols); c++) {
6819 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
6821 2 1 if (strcmp(col_name, lhs) != 0) {
6823 2 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
6824 1 1 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
6834 25 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
6835 8 17 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
6847 17 1 if (has_intercept) { terms[num_terms++] = savepv("Intercept"); }
6849 18 0 if (strlen(rhs_expanded) > 0) {
6851 27 18 while (chunk != NULL) {
6852 0 27 if (num_terms >= term_cap - 3) {
6857 1 26 if (star) {
6862 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';
6864 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';
6872 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';
6879 46 18 for (i = 0; i < num_terms; i++) {
6881 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; } }
6882 46 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
6886 46 18 for (j = 0; j < p; j++) {
6887 0 46 if (p_exp + 32 >= exp_cap) {
6892 17 29 if (strcmp(uniq_terms[j], "Intercept") == 0) {
6895 5 24 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
6899 42 5 for (i = 0; i < n; i++) {
6901 42 0 if (str_val) {
6903 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; } }
6904 14 28 if (!found) {
6905 0 14 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
6911 5 0 if (num_levels > 0) {
6912 9 5 for (l1 = 0; l1 < num_levels - 1; l1++)
6913 13 9 for (l2 = l1 + 1; l2 < num_levels; l2++)
6914 6 7 if (strcmp(levels[l1], levels[l2]) > 0) { char *tmp = levels[l1]; levels[l1] = levels[l2]; levels[l2] = tmp; }
6915 9 5 for (l = 1; l < num_levels; l++) {
6916 0 9 if (p_exp >= exp_cap) {
6929 14 5 for (l = 0; l < num_levels; l++) Safefree(levels[l]);
6940 0 18 Newx(X, n * p, NV); Newx(Y, n, NV);
0 18 Newx(X, n * p, NV); Newx(Y, n, NV);
6941 0 18 Newx(valid_row_names, n, char*);
6945 292 18 for (i = 0; i < n; i++) {
6947 3 289 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
6951 823 289 for (j = 0; j < p; j++) {
6952 257 566 if (strcmp(exp_terms[j], "Intercept") == 0) {
6954 78 488 } else if (is_dummy[j]) {
6956 78 0 if (str_val) {
6957 27 51 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
6962 0 488 if (isnan(row_x[j])) { row_ok = FALSE; break; }
6965 0 289 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
6967 823 289 for (j = 0; j < p; j++) X[valid_n * p + j] = row_x[j];
6973 2 16 if (valid_n <= p) {
6974 5 2 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
6975 5 2 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
6976 5 2 for (j = 0; j < p_exp; j++) {
6978 0 5 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
6982 0 2 if (row_hashes) Safefree(row_hashes);
6987 45 16 for (i = 0; i < p; i++)
6988 133 45 for (j = 0; j < p; j++) {
6990 2487 133 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * X[k * p + j];
6994 45 16 for (i = 0; i < p; i++) {
6996 815 45 for (k = 0; k < valid_n; k++) sum += X[k * p + i] * Y[k];
7002 45 16 for (i = 0; i < p; i++) {
7003 1 44 if (aliased[i]) { beta[i] = NAN; }
7006 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];
7016 286 16 for (i = 0; i < valid_n; i++) sum_y += Y[i];
7018 286 16 for (i = 0; i < valid_n; i++) {
7020 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];
7023 254 32 NV diff_m = has_intercept ? (y_hat - mean_y) : y_hat;
7031 16 0 rse_sq = (df_res > 0) ? (rss / (NV)df_res) : NAN;
7037 16 0 if (final_rank != df_int && (mss + rss) > 0.0) {
16 0 if (final_rank != df_int && (mss + rss) > 0.0) {
7040 16 0 if (rse_sq > 0.0 && numdf > 0) {
16 0 if (rse_sq > 0.0 && numdf > 0) {
7043 0 0 } else if (rse_sq == 0.0) {
7047 0 0 } else if (final_rank == df_int) {
7050 45 16 for (j = 0; j < p; j++) {
7054 1 44 if (aliased[j]) {
7061 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));
7080 16 0 if (!isnan(f_stat)) {
7089 41 16 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7090 41 16 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7091 45 16 for (j = 0; j < p_exp; j++) {
7093 9 36 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7098 7 9 if (row_hashes) Safefree(row_hashes);
7112 0 6 if (by == 0.0) {
7113 0 0 if (from == to) {
7114 0 0 EXTEND(SP, 1);
7122 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)) {
7130 0 6 if (n_elements_d < 0.0) n_elements_d = 0.0;
7133 0 6 EXTEND(SP, n_elements);
7134 3027 6 for (size_t i = 0; i < n_elements; i++) {
7144 1 1 AUTO_SEED_PRNG();
7149 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)) {
7155 0 2 if ((items - arg_start) % 2 != 0) {
7159 5 2 for (int i = arg_start; i < items; i += 2) {
7163 2 3 if (strEQ(key, "n")) n = (unsigned int)SvUV(val);
7164 1 2 else if (strEQ(key, "mean")) mean = SvNV(val);
7165 2 0 else if (strEQ(key, "sd")) sd = SvNV(val);
7168 1 1 if (sd < 0.0) croak("rnorm: standard deviation must be non-negative");
7170 1 0 if (n > 0) {
7173 5000 1 for (size_t i = 0; i < n; ) {
7180 1357 5000 } while (s >= 1.0 || s == 0.0);
0 5000 } while (s >= 1.0 || s == 0.0);
7184 4999 1 if (i < n) {
7205 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) {
7206 1 0 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
0 1 if (!SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVHV) {
7217 2 1 while ((entry = hv_iternext(input_hv))) {
7220 2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
2 0 if (SvROK(arr_ref) && SvTYPE(SvRV(arr_ref)) == SVt_PVAV) {
7223 12 2 for (size_t k = 0; k <= len; k++) {
7225 12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
12 0 if (v && *v && SvOK(*v)) {
7260 0 10 if (!SvROK(data_sv)) croak("aov: data is required and must be a reference");
7265 10 0 if (SvTYPE(ref) == SVt_PVHV) {
7267 0 10 if (hv_iterinit(hv) == 0) croak("aov: Data hash is empty");
7269 10 0 if (entry) {
7271 10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
10 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
7274 0 10 Newx(row_names, n, char*);
7275 70 10 for(i = 0; i < n; i++) {
7279 0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
0 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
7281 0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
0 0 Newx(row_names, n, char*); Newx(row_hashes, n, HV*);
7283 0 0 while ((entry = hv_iternext(hv))) {
7291 0 0 } else if (SvTYPE(ref) == SVt_PVAV) {
7294 0 0 Newx(row_names, n, char*);
7295 0 0 Newx(row_hashes, n, HV*);
7296 0 0 for (i = 0; i < n; i++) {
7298 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) {
7304 0 0 for (size_t k = 0; k < i; k++) Safefree(row_names[k]);
7314 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++; }
7317 1 9 if (!tilde) {
7318 2 1 for (i = 0; i < n; i++) Safefree(row_names[i]);
7319 0 1 Safefree(row_names); if (row_hashes) Safefree(row_hashes);
7326 0 9 while ((p_idx = strstr(rhs, "-1")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7327 0 9 while ((p_idx = strstr(rhs, "+0")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7328 0 9 while ((p_idx = strstr(rhs, "0+")) != NULL) { has_intercept = FALSE; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7329 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'; }
7330 0 9 while ((p_idx = strstr(rhs, "+1")) != NULL) { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); }
7331 0 9 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
0 0 if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; }
7332 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); }
7334 0 9 while ((p_idx = strstr(rhs, "++")) != NULL) memmove(p_idx, p_idx + 1, strlen(p_idx + 1) + 1);
7335 0 9 if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1);
7337 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';
7341 12 9 while (chunk != NULL) {
7342 1 11 if (strcmp(chunk, ".") == 0) {
7344 3 1 for (size_t c = 0; c <= av_len(cols); c++) {
7346 3 0 if (col_sv && SvOK(*col_sv)) {
3 0 if (col_sv && SvOK(*col_sv)) {
7348 2 1 if (strcmp(col_name, lhs) != 0) {
7350 2 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
7351 1 1 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
7361 11 0 if (rhs_len + slen + 2 < sizeof(rhs_expanded)) {
7362 3 8 if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; }
7376 9 0 if (has_intercept) { terms[num_terms++] = savepv("Intercept"); }
7377 9 0 if (strlen(rhs_expanded) > 0) {
7379 13 9 while (chunk != NULL) {
7380 0 13 if (num_terms >= term_cap - 3) {
7385 1 12 if (star) {
7390 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';
7391 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';
7399 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';
7406 24 9 for (i = 0; i < num_terms; i++) {
7408 22 24 for (size_t k = 0; k < num_uniq; k++) {
7409 0 22 if (strcmp(terms[i], uniq_terms[k]) == 0) { found = TRUE; break; }
7411 24 0 if (!found) uniq_terms[num_uniq++] = savepv(terms[i]);
7418 24 8 for (j = 0; j < p; j++) {
7419 9 15 if (p_exp + 64 >= exp_cap) {
7427 9 15 if (strcmp(uniq_terms[j], "Intercept") == 0) {
7437 2 13 if (colon) {
7445 4 2 for (size_t e = 0; e < p_exp; e++) {
7446 1 3 if (strcmp(parent_term[e], left) == 0) l_indices[l_count++] = e;
7447 1 3 if (strcmp(parent_term[e], right) == 0) r_indices[r_count++] = e;
7450 1 1 if (l_count == 0 || r_count == 0) {
0 1 if (l_count == 0 || r_count == 0) {
7454 1 1 for (unsigned int li = 0; li < l_count; li++) {
7455 1 1 for (unsigned int ri = 0; ri < r_count; ri++) {
7456 0 1 if (p_exp >= exp_cap) {
7477 4 9 if (is_column_categorical(aTHX_ data_hoa, row_hashes, n, uniq_terms[j])) {
7481 61 4 for (i = 0; i < n; i++) {
7483 61 0 if (str_val) {
7485 87 9 for (size_t l = 0; l < num_levels; l++) {
7486 52 35 if (strcmp(levels[l], str_val) == 0) { found = TRUE; break; }
7488 9 52 if (!found) {
7489 0 9 if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); }
7495 4 0 if (num_levels > 0) {
7496 5 4 for (size_t l1 = 0; l1 < num_levels - 1; l1++) {
7497 6 5 for (size_t l2 = l1 + 1; l2 < num_levels; l2++) {
7498 1 5 if (strcmp(levels[l1], levels[l2]) > 0) {
7506 5 4 for (size_t l = 1; l < num_levels; l++) {
7507 0 5 if (p_exp >= exp_cap) {
7524 9 4 for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]);
7544 64 8 for(i = 0; i < n; i++) X_mat[i] = (double*)safemalloc(p_exp * sizeof(double));
7545 0 8 Newx(Y, n, double);
7547 64 8 for (i = 0; i < n; i++) {
7549 0 64 if (isnan(y_val)) { Safefree(row_names[i]); continue; }
7552 194 64 for (j = 0; j < p_exp; j++) {
7553 64 130 if (strcmp(exp_terms[j], "Intercept") == 0) {
7555 20 110 } else if (is_interact[j]) {
7557 70 40 } else if (is_dummy[j]) {
7559 70 0 if (str_val) {
7560 32 38 row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0;
7565 0 40 if (isnan(row_x[j])) { row_ok = FALSE; break; }
7568 0 64 if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; }
7570 194 64 for (j = 0; j < p_exp; j++) X_mat[valid_n][j] = row_x[j];
7576 1 7 if (valid_n <= p_exp) {
7578 3 1 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7579 3 1 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7580 3 1 for (j = 0; j < p_exp; j++) {
7582 0 3 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7588 2 1 for(i = 0; i < n; i++) Safefree(X_mat[i]);
7590 0 1 if (row_hashes) Safefree(row_hashes);
7591 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]); }
7603 20 7 for (i = 0; i < p_exp; i++) {
7604 7 13 if (strcmp(exp_terms[i], "Intercept") == 0) continue;
7605 1 12 if (aliased_qr[i]) continue;
7612 20 7 for (i = 0; i < p_exp; i++) {
7613 19 1 if (!aliased_qr[i]) rank++;
7616 43 7 for (i = rank; i < valid_n; i++) {
7620 7 0 NV ms_res = (res_df > 0) ? rss_prev / res_df : 0.0;
7622 19 7 for (j = 0; j < num_uniq; j++) {
7623 7 12 if (strcmp(uniq_terms[j], "Intercept") == 0) continue;
7627 11 1 NV ms = (df > 0) ? ss / df : 0.0;
7632 12 0 if (ms_res > 0.0 && df > 0) {
11 1 if (ms_res > 0.0 && df > 0) {
7652 1 6 if (is_stacked) {
7657 1 0 if (e) {
7659 1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
7667 18 7 for (size_t c = 0; c <= (size_t)av_len(all_cols); c++) {
7669 18 0 if (!col_sv || !SvOK(*col_sv)) continue;
0 18 if (!col_sv || !SvOK(*col_sv)) continue;
7673 147 18 for (i = 0; i < tgt_n; i++) {
7675 98 49 if (!isnan(val)) { col_sum += val; col_count++; }
7677 15 3 NV col_mean = (col_count > 0) ? col_sum / col_count : NAN;
7688 19 7 for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms);
7689 19 7 for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms);
7690 20 7 for (j = 0; j < p_exp; j++) {
7692 5 15 if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); }
7699 62 7 for (i = 0; i < n; i++) Safefree(X_mat[i]);
7702 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]); }
7704 0 7 if (row_hashes) Safefree(row_hashes);
7716 1 5 if (items < 1) croak("fisher_test requires at least a data reference");
7722 2 5 for (unsigned int i = 1; i < items; i += 2) {
7723 0 2 if (i + 1 >= items) croak("fisher_test: odd number of named arguments");
7726 2 0 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
0 2 if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) {
7728 0 0 if (!(conf_level > 0 && conf_level < 1))
0 0 if (!(conf_level > 0 && conf_level < 1))
7730 2 0 } else if (strEQ(key, "alternative")) {
7732 2 0 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
1 1 if (strNE(alternative, "two.sided") && strNE(alternative, "less") &&
7733 0 1 strNE(alternative, "greater"))
7739 0 5 if (!SvROK(data_ref)) croak("fisher_test requires a reference to a 2x2 Array or Hash");
7742 2 3 if (SvTYPE(deref) == SVt_PVAV) {
7744 0 2 if (av_len(outer) != 1) croak("Outer array must have exactly 2 rows");
7747 2 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
2 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
2 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
2 0 if (!(r1p && r2p && SvROK(*r1p) && SvROK(*r2p)
7748 2 0 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
0 2 && SvTYPE(SvRV(*r1p)) == SVt_PVAV && SvTYPE(SvRV(*r2p)) == SVt_PVAV))
7751 2 0 if (av_len(r1) != 1 || av_len(r2) != 1)
0 2 if (av_len(r1) != 1 || av_len(r2) != 1)
7757 3 0 } else if (SvTYPE(deref) == SVt_PVHV) {
7761 0 3 if (HvUSEDKEYS(outer) != 2) croak("Outer hash must have exactly 2 keys");
0 3 if (HvUSEDKEYS(outer) != 2) croak("Outer hash must have exactly 2 keys");
7766 2 1 SV *restrict row1_sv = hv_iterval(outer, swap_rows ? e2 : e1);
7767 2 1 SV *restrict row2_sv = hv_iterval(outer, swap_rows ? e1 : e2);
7768 3 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
3 0 if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV ||
7769 3 0 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
0 3 !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV)
7774 6 3 for (unsigned int rr = 0; rr < 2; rr++) {
7776 0 6 if (HvUSEDKEYS(in) != 2) croak("Inner hashes must have exactly 2 keys");
0 6 if (HvUSEDKEYS(in) != 2) croak("Inner hashes must have exactly 2 keys");
7781 3 3 HE *col0 = swap_cols ? c2 : c1;
7782 3 3 HE *col1 = swap_cols ? c1 : c2;
7790 0 5 if (a + b + c + d == 0) croak("fisher_test: table is all zeros");
7826 0 7 if (items % 2 != 0) croak("Usage: power_t_test(n => 30, delta => 0.5, sd => 1.0, ...)");
7827 27 7 for (unsigned short int i = 0; i < items; i += 2) {
7831 1 26 if (strEQ(key, "n")) sv_n = val;
7832 7 19 else if (strEQ(key, "delta")) sv_delta = val;
7833 7 12 else if (strEQ(key, "sd")) sv_sd = val;
7834 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;
7835 6 5 else if (strEQ(key, "power")) sv_power = val;
7836 3 2 else if (strEQ(key, "type")) type = SvPV_nolen(val);
7837 2 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
7838 0 0 else if (strEQ(key, "strict")) strict = SvTRUE(val);
7839 0 0 else if (strEQ(key, "tol")) tol = SvNV(val);
7843 1 6 bool is_null_n = (!sv_n || !SvOK(sv_n));
0 1 bool is_null_n = (!sv_n || !SvOK(sv_n));
7844 7 0 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
0 7 bool is_null_delta = (!sv_delta || !SvOK(sv_delta));
7845 6 1 bool is_null_power = (!sv_power || !SvOK(sv_power));
0 6 bool is_null_power = (!sv_power || !SvOK(sv_power));
7846 7 0 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
0 7 bool is_null_sd = (sv_sd && !SvOK(sv_sd));
7847 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));
7850 6 1 if (is_null_n) missing_count++;
7851 0 7 if (is_null_delta) missing_count++;
7852 1 6 if (is_null_power) missing_count++;
7853 0 7 if (is_null_sd) missing_count++;
7854 0 7 if (is_null_sig_level) missing_count++;
7856 0 7 if (missing_count != 1) {
7860 1 6 NV n = is_null_n ? 0.0 : SvNV(sv_n);
7861 7 0 NV delta = is_null_delta ? 0.0 : SvNV(sv_delta);
7862 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);
7863 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);
7864 6 1 NV power = is_null_power ? 0.0 : SvNV(sv_power);
7865 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;
7866 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;
7867 6 1 if (tside == 2 && !is_null_delta) delta = fabs(delta);
6 0 if (tside == 2 && !is_null_delta) delta = fabs(delta);
7868 1 6 if (is_null_power) {
7870 6 0 } else if (is_null_n) {
7872 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;
7873 222 6 while (high - low > tol) {
7875 49 173 if (p_body(mid, delta, sd, sig_level, tsample, tside, strict) < power) low = mid;
7879 0 0 } else if (is_null_sd) {
7881 0 0 while (high - low > tol) {
7883 0 0 if (p_body(n, delta, mid, sig_level, tsample, tside, strict) > power) low = mid;
7887 0 0 } else if (is_null_delta) {
7889 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;
7890 0 0 while (high - low > tol) {
7892 0 0 if (p_body(n, mid, sd, sig_level, tsample, tside, strict) < power) low = mid;
7896 0 0 } else if (is_null_sig_level) {
7898 0 0 while (high - low > tol) {
7900 0 0 if (p_body(n, delta, sd, mid, tsample, tside, strict) < power) low = mid;
7912 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";
7914 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" : "");
7915 6 1 if (n_str[0] != '\0') hv_stores(ret, "note", newSVpv(n_str, 0));
7928 3 0 if (arg_idx < items && SvROK(ST(arg_idx))) {
2 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
7930 1 1 if (t == SVt_PVAV) {
7932 1 0 } else if (t == SVt_PVHV) {
7936 2 1 if (!h_sv && arg_idx < items
2 0 if (!h_sv && arg_idx < items
7937 1 1 && SvROK(ST(arg_idx))
7938 1 0 && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) {
7942 2 3 for (; arg_idx < items; arg_idx += 2) {
7945 1 1 if (strEQ(key, "x")) x_sv = val;
7946 1 0 else if (strEQ(key, "g")) g_sv = val;
7947 0 0 else if (strEQ(key, "h")) h_sv = val;
7951 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))
7961 1 2 if (h_sv) {
7962 1 0 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
0 1 if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV)
7969 3 1 while ((he = hv_iternext(h_hv))) {
7971 3 0 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
0 3 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
7975 0 1 if (total < 2) croak("not enough observations");
7977 0 1 size_t num_keys = HvKEYS(h_hv);
7982 3 1 while ((he = hv_iternext(h_hv))) {
7984 0 3 const char *restrict key_str = HePV(he, klen);
7988 14 3 for (size_t i = 0; i < n_g; i++) {
7990 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)) {
8001 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)
8003 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)
8010 0 2 if (nx != ng) croak("kruskal_test: 'x' and 'g' must have the same length");
8011 0 2 if (nx < 2) croak("not enough observations");
8020 28 2 for (size_t i = 0; i < nx; i++) {
8023 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)
8024 28 0 && g_el && SvOK(*g_el)) {
28 0 && g_el && SvOK(*g_el)) {
8029 22 6 if (id_sv) {
8045 3 0 if (valid_n < 2 || k < 2) {
0 3 if (valid_n < 2 || k < 2) {
8047 0 0 if (group_names) {
8048 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]); }
8051 0 0 if (valid_n < 2) croak("not enough observations");
8061 42 3 for (size_t i = 0; i < valid_n; i++) {
8069 9 3 for (size_t i = 0; i < k; i++) {
8070 9 0 if (group_counts[i] > 0)
8076 0 3 if (tie_adj > 0.0) {
8093 9 3 for (size_t i = 0; i < k; i++) {
8094 9 0 if (group_counts[i] > 0 && group_names[i]) {
9 0 if (group_counts[i] > 0 && group_names[i]) {
8100 9 0 if (group_names[i]) Safefree(group_names[i]); // Clean up name copy
8125 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) {
8131 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) {
8136 0 6 if ((items - arg_idx) % 2 != 0) {
8140 2 6 for (; arg_idx < items; arg_idx += 2) {
8144 0 2 if (strEQ(key, "x")) x_sv = val;
8145 0 2 else if (strEQ(key, "y")) y_sv = val;
8146 1 1 else if (strEQ(key, "ratio")) ratio = SvNV(val);
8147 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);
8148 0 0 else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val);
8152 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)
8154 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)
8157 6 0 if (ratio <= 0.0 || !isfinite(ratio))
0 6 if (ratio <= 0.0 || !isfinite(ratio))
8159 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))
8168 26 6 for (size_t i = 0; i < nx_raw; i++) {
8170 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)) {
8172 26 0 if (!isnan(val) && isfinite(val)) {
26 0 if (!isnan(val) && isfinite(val)) {
8183 21 6 for (size_t i = 0; i < ny_raw; i++) {
8185 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)) {
8187 21 0 if (!isnan(val) && isfinite(val)) {
21 0 if (!isnan(val) && isfinite(val)) {
8196 1 5 if (nx < 2) croak("not enough 'x' observations");
8197 1 4 if (ny < 2) croak("not enough 'y' observations");
8203 1 3 if (var_y == 0.0) croak("var_test: variance of 'y' is zero (cannot divide by zero)");
8209 0 3 if (strcmp(alternative, "less") == 0) {
8211 0 3 } else if (strcmp(alternative, "greater") == 0) {
8218 3 0 p_val = 2.0 * (p1 < p2 ? p1 : p2);
8248 0 6 SV *restrict ret = &PL_sv_undef;
8250 0 6 if (!PL_srand_called) {
8254 0 6 if (n < 0) n = 0;
8255 6 0 if (SvROK(ref)) {
8258 3 3 if (SvTYPE(rv) == SVt_PVHV) {
8261 3 0 unsigned limit = (n < (IV)count) ? (I32)n : count;
8264 3 0 if (count > 0 && limit > 0) {
3 0 if (count > 0 && limit > 0) {
8271 12 3 while ((entry = hv_iternext(hv)))
8275 6 3 for (i = 0; i < limit; i++) {
8285 6 3 for (i = 0; i < limit; i++) {
8291 0 6 (void)hv_store(
8302 3 0 } else if (SvTYPE(rv) == SVt_PVAV) {/* --- ARRAY REFERENCE --- */
8304 0 3 size_t count = av_top_index(av) + 1; /* signed; 0 for empty AV */
8308 3 0 if (n > 0)
8310 3 0 if (count > 0) {
8315 0 3 Newx(idx, count, size_t);
8316 15 3 for (size_t i = 0; i < count; i++)
8319 6 3 for (size_t i = 0; i < limit; i++) {
8326 6 3 for (size_t i = 0; i < (size_t)n; i++) {
8327 6 0 if (i < limit) {
8330 6 0 if (sv && sv != &PL_sv_undef)
6 0 if (sv && sv != &PL_sv_undef)
8341 0 0 for (size_t i = 0; i < (size_t)n; i++)
8354 0 23 if (items < 1) {
8361 0 23 if ((items - 1) % 2 != 0) {
8364 9 23 for (size_t i = 1; i < items; i += 2) {
8367 3 6 if (strEQ(key, "mean")) mean = SvNV(val);
8368 4 2 else if (strEQ(key, "sd")) sd = SvNV(val);
8369 2 0 else if (strEQ(key, "log")) give_log = SvTRUE(val) ? 1 : 0;
8373 1 22 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
1 0 if (SvROK(x_sv) && SvTYPE(SvRV(x_sv)) == SVt_PVAV) {
8378 1 0 if (n > 0) {
8380 3 1 for (IV i = 0; i < n; i++) {
8382 3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
3 0 NV x_val = (elem && *elem) ? SvNV(*elem) : NAN;
8406 4 0 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
0 4 if (!SvROK(h_ref) || SvTYPE(SvRV(h_ref)) != SVt_PVHV) {
8409 4 0 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
0 4 if (!SvROK(i_ref) || SvTYPE(SvRV(i_ref)) != SVt_PVHV) {
8416 4 4 while ((h_entry = hv_iternext(h_hv))) {
8421 4 0 if (i_fetch_he) {
8424 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)) {
8427 2 1 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8431 2 2 while ((i_entry = hv_iternext(i_row_hv))) {
8436 1 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8442 2 1 for (SSize_t idx = 0; idx < top_idx; idx += 2) {
8446 2 0 if (key_svp && val_svp) {
2 0 if (key_svp && val_svp) {
8464 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)) {
8467 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)) {
8470 10 2 target_root_mode = (SvTYPE(SvRV(h_ref)) == SVt_PVHV) ? 1 : 2;
8471 10 2 i_root_mode = (SvTYPE(SvRV(i_ref)) == SVt_PVHV) ? 1 : 2;
8473 10 2 if (target_root_mode == 1) {
8475 0 10 if (HvKEYS(h_hv) > 0) {
8 2 if (HvKEYS(h_hv) > 0) {
8478 61 6 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
59 2 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
8479 8 59 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)) {
8481 8 0 if (SvROK(val)) {
8482 5 3 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
8483 3 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
8491 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++) {
8493 2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
2 0 if (svp && *svp && SvROK(*svp)) {
8494 2 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
8495 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
8500 2 10 if (target_inner_mode == 0) {
8501 2 0 if (i_root_mode == 1) {
8503 0 2 if (HvKEYS(i_hv) > 0) {
2 0 if (HvKEYS(i_hv) > 0) {
8506 16 2 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
16 0 for (STRLEN p_idx = 0; p_idx <= probe_max && target_inner_mode == 0; p_idx++) {
8507 2 16 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)) {
8509 2 0 if (SvROK(val)) {
8510 1 1 if (SvTYPE(SvRV(val)) == SVt_PVHV) target_inner_mode = 1;
8511 1 0 else if (SvTYPE(SvRV(val)) == SVt_PVAV) target_inner_mode = 2;
8519 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++) {
8521 0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
0 0 if (svp && *svp && SvROK(*svp)) {
8522 0 0 if (SvTYPE(SvRV(*svp)) == SVt_PVHV) target_inner_mode = 1;
8523 0 0 else if (SvTYPE(SvRV(*svp)) == SVt_PVAV) target_inner_mode = 2;
8528 0 12 if (target_inner_mode == 0) { target_inner_mode = 1; }
8533 10 2 if (i_root_mode == 1) {
8544 30 6 if (i_root_mode == 1) {
8546 10 20 if (!i_entry) break;
8550 2 18 current_idx = looks_like_number(row_key_sv) ? SvIV(row_key_sv) : -1;
8552 2 4 if (i_idx > i_top) break;
8555 4 0 if (!svp || !*svp) continue;
0 4 if (!svp || !*svp) continue;
8560 23 1 if (SvROK(i_row_sv)) {
8565 18 5 if (target_root_mode == 1) {
8567 9 9 if (h_fetch_he) h_row_sv = HeVAL(h_fetch_he);
8569 4 1 if (current_idx >= 0) {
8571 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;
8574 11 12 if (h_row_sv && SvROK(h_row_sv)) {
11 0 if (h_row_sv && SvROK(h_row_sv)) {
8575 7 4 if (SvTYPE(SvRV(h_row_sv)) == SVt_PVHV) {
8577 4 0 } else if (SvTYPE(SvRV(h_row_sv)) == SVt_PVAV) {
8582 16 7 if (!h_row_hv && !h_row_av) {
12 4 if (!h_row_hv && !h_row_av) {
8583 3 9 if (target_inner_mode == 2) {
8590 9 3 if (target_root_mode == 1) {
8593 2 1 if (current_idx >= 0) {
8599 16 7 if (h_row_hv) {
8600 12 4 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8605 13 12 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
8610 4 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8614 6 4 for (SSize_t idx = 0; idx < inner_top_idx; idx += 2) {
8617 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) {
8618 6 0 SV *restrict val_to_store = *val_svp ? *val_svp : &PL_sv_undef;
8623 7 0 } else if (h_row_av) {
8624 5 2 if (SvTYPE(SvRV(i_row_sv)) == SVt_PVAV) {
8628 11 5 for (SSize_t idx = 0; idx <= inner_top_idx; ++idx) {
8630 11 0 if (val_svp) {
8631 11 0 SV *restrict val_to_push = *val_svp ? *val_svp : &PL_sv_undef;
8633 11 0 if (sv_inc) {
8638 2 0 } else if (SvTYPE(SvRV(i_row_sv)) == SVt_PVHV) {
8643 2 2 while ((i_inner_entry = hv_iternext(i_inner_hv))) {
8646 2 0 if (col_key_sv && col_val) {
2 0 if (col_key_sv && col_val) {
8649 2 0 if (sv_key_inc && sv_val_inc) {
2 0 if (sv_key_inc && sv_val_inc) {
8666 1 10 if (items == 0) {
8670 1 9 if (!SvOK(arg1)) {
8676 2 7 if (!SvROK(arg1)) {
8677 4 2 for (unsigned i = 0; i < items; i++) {
8682 1 6 if (SvTYPE(rv) == SVt_PVAV) {
8685 3 1 for (unsigned i = 0; i < len; i++) {
8687 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8689 6 0 } else if (SvTYPE(rv) == SVt_PVHV) { // CASES 3, 4, 5: Hash Reference
8692 3 3 if (items > 1) {
8698 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) {
8701 3 1 for (unsigned i = 0; i < len; i++) {
8703 3 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8709 6 2 while ((he = hv_iternext(hv))) {
8711 6 0 if (SvROK(inner_sv)) {
8713 6 0 if (SvTYPE(inner_rv) == SVt_PVHV) {// CASE 5: Hash of Hashes
8716 3 3 if (valp) increment_count(aTHX_ counts_hv, *valp);
8717 0 0 } else if (SvTYPE(inner_rv) == SVt_PVAV) {// CASE 4: Hash of Arrays (Row-Oriented)
8718 0 0 if (looks_like_number(arg2)) {
8722 0 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8731 8 3 while ((he = hv_iternext(hv))) {
8733 5 3 if (SvROK(val)) {// --- SAFETY CHECK
8736 2 3 if (SvTYPE(inner_rv) == SVt_PVAV) {
8739 6 2 for (unsigned i = 0; i < len; i++) {
8741 6 0 if (valp) increment_count(aTHX_ counts_hv, *valp);
8743 3 0 } else if (SvTYPE(inner_rv) == SVt_PVHV) {
8748 4 3 while ((inner_he = hv_iternext(inner_hv))) {
8807 1 7 if (!SvOK(data_ref)) {
8810 1 6 if (!SvOK(target_key_sv)) {
8813 1 5 if (!SvOK(group_key_sv)) {
8817 0 5 if (!SvROK(data_ref)) {
8820 2 3 if (items > 3) { /* Capture the optional filter argument */
8822 2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
2 0 if (SvROK(filter_ref) && SvTYPE(SvRV(filter_ref)) == SVt_PVHV) {
8830 2 3 if (SvTYPE(SvRV(data_ref)) == SVt_PVAV) { /* Input is an Array of Hashes (AoH) */
8833 8 2 for (SSize_t i = 0; i < len; i++) {
8835 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) {
8839 8 0 if (group_he) {
8841 7 1 SV *restrict target_val = target_he ? HeVAL(target_he) : NULL;
8842 7 1 if (target_val && SvOK(target_val)) {
7 0 if (target_val && SvOK(target_val)) {
8844 4 3 if (filter_hv) {
8847 4 2 while ((f_he = hv_iternext(filter_hv))) {
8851 4 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
8853 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);
8854 2 2 if (!keep) {
8860 5 2 if (pass_filter) {
8863 1 4 if (res_he) {
8875 3 0 } else if (SvTYPE(SvRV(data_ref)) == SVt_PVHV) {
8879 2 1 if (group_he && target_he &&
2 0 if (group_he && target_he &&
8880 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 &&
8881 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) {
8887 8 2 for (SSize_t i = 0; i < len; i++) {
8890 8 0 if (g_svp && *g_svp) {
8 0 if (g_svp && *g_svp) {
8892 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;
8893 8 0 if (t_val && SvOK(t_val)) {
7 1 if (t_val && SvOK(t_val)) {
8895 4 3 if (filter_hv) {
8898 4 2 while ((f_he = hv_iternext(filter_hv))) {
8903 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) {
8906 4 0 if (val_svp) val_sv = *val_svp;
8909 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);
8910 2 2 if (!keep) {
8916 5 2 if (pass_filter) {
8919 1 4 if (res_he) {
8933 5 1 while ((row_he = hv_iternext(data_hv))) {
8935 5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
5 0 if (SvROK(row_val) && SvTYPE(SvRV(row_val)) == SVt_PVHV) {
8939 5 0 if (inner_group_he) {
8941 4 1 SV *restrict t_val = inner_target_he ? HeVAL(inner_target_he) : NULL;
8942 4 1 if (t_val && SvOK(t_val)) {
3 1 if (t_val && SvOK(t_val)) {
8944 0 3 if (filter_hv) {
8947 0 0 while ((f_he = hv_iternext(filter_hv))) {
8951 0 0 SV *restrict val_sv = val_he ? HeVAL(val_he) : NULL;
8953 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);
8954 0 0 if (!keep) {
8960 3 0 if (pass_filter) {
8963 1 2 if (res_he) {
8993 11 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
10 1 if (arg_idx < items && SvROK(ST(arg_idx))) {
8995 2 8 if (t == SVt_PVAV || t == SVt_PVHV) {
2 0 if (t == SVt_PVAV || t == SVt_PVHV) {
9001 2 10 if ((items - arg_idx) % 2 != 0) croak("Usage: prcomp($data, key => value, ...)");
9002 4 10 for (; arg_idx < items; arg_idx += 2) {
9005 0 4 if (strEQ(key, "x")) x_sv = val;
9006 0 4 else if (strEQ(key, "retx")) retx = SvTRUE(val);
9007 0 4 else if (strEQ(key, "center")) center = SvTRUE(val);
9008 2 2 else if (strEQ(key, "scale")) do_scale = SvTRUE(val);
9009 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;
9010 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;
9014 9 1 if (!x_sv || !SvROK(x_sv))
0 9 if (!x_sv || !SvROK(x_sv))
9023 7 2 if (SvTYPE(ref) == SVt_PVAV) {
9026 6 1 if (n_raw > 0) {
9028 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) {
9033 2 0 } else if (SvTYPE(ref) == SVt_PVHV) {
9035 2 0 if (hv_iterinit(hv) > 0) {
9038 2 0 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
1 1 if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) {
9041 1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
1 0 } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) {
9048 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");
9051 1 7 if (is_hoh) {
9057 0 1 if (p == 0) croak("prcomp: inner hashes cannot be empty");
9061 2 1 while ((entry = hv_iternext(inner))) {
9065 1 6 } else if (is_hoa) {
9068 0 1 if (p == 0) croak("prcomp: input hash is empty");
9072 2 1 while ((entry = hv_iternext(hv))) {
9080 6 2 if (is_aoa) {
9082 18 6 for (size_t i = 0; i < n_raw; i++) {
9084 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) {
9087 36 18 for (size_t j = 0; j < p; j++) {
9089 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)) {
9091 0 35 if (!isfinite(v)) row_ok = FALSE;
9095 17 1 if (row_ok) n++;
9098 1 1 } else if (is_hoa) {
9101 2 1 for (size_t j = 0; j < p; j++) {
9105 3 1 for (size_t i = 0; i < n_raw; i++) {
9107 6 3 for (size_t j = 0; j < p; j++) {
9109 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)) {
9111 0 6 if (!isfinite(v)) row_ok = FALSE;
9115 3 0 if (row_ok) n++;
9118 1 0 } else if (is_hoh) {
9122 3 1 while ((entry = hv_iternext(hv))) {
9125 6 3 for (size_t j = 0; j < p; j++) {
9127 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)) {
9129 0 6 if (!isfinite(v)) row_ok = FALSE;
9133 3 0 if (row_ok) n++;
9136 0 8 if (n == 0) {
9137 0 0 if (colnames) {
9138 0 0 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
9147 15 7 for (size_t j = 0; j < p; j++) {
9149 43 15 for (size_t i = 0; i < n; i++) col_sum += X_mat[i * p + j];
9150 15 0 if (center) {
9152 43 15 for (size_t i = 0; i < n; i++) X_mat[i * p + j] -= cen_vec[j];
9154 3 12 if (do_scale) {
9156 9 3 for (size_t i = 0; i < n; i++) {
9157 9 0 NV val = X_mat[i * p + j] - (center ? 0 : (col_sum / n));
9160 3 0 sc_vec[j] = (n > 1) ? sqrt(sum_sq / (n - 1)) : 0.0;
9161 1 2 if (sc_vec[j] <= 1e-15) {
9163 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); }
9166 6 2 for (size_t i = 0; i < n; i++) X_mat[i * p + j] /= sc_vec[j];
9171 20 7 for (size_t i = 0; i < n; i++) {
9172 40 20 for (size_t j = 0; j < p; j++) {
9173 60 40 for (size_t k = j; k < p; k++) {
9179 14 7 for (size_t j = 0; j < p; j++) {
9180 7 14 for (size_t k = 0; k < j; k++) {
9190 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;
9192 7 0 NV n_adj = (n > 1) ? (NV)(n - 1) : 1.0;
9193 13 7 for (size_t j = 0; j < k_cols; j++) {
9195 0 13 if (e_val < 0.0) e_val = 0.0; // clamp floating point inaccuracy
9198 1 6 if (tol >= 0.0) {
9201 2 1 for (size_t j = 0; j < k_cols; j++) {
9202 1 1 if (sdev[j] > threshold) rank_est++;
9204 1 0 if (rank_est < k_cols) k_cols = rank_est;
9209 12 7 for (size_t j = 0; j < k_cols; j++) av_push(sdev_av, newSVnv(sdev[j]));
9212 14 7 for (size_t j = 0; j < p; j++) {
9214 24 14 for (size_t m = 0; m < k_cols; m++) {
9220 7 0 if (retx) {
9222 20 7 for (size_t i = 0; i < n; i++) {
9224 34 20 for (size_t m = 0; m < k_cols; m++) {
9226 68 34 for (size_t c = 0; c < p; c++) {
9235 2 5 if (colnames) {
9237 4 2 for (size_t j = 0; j < p; j++) {
9242 7 0 if (center) {
9244 14 7 for (size_t j = 0; j < p; j++) av_push(c_av, newSVnv(cen_vec[j]));
9249 1 6 if (do_scale) {
9251 2 1 for (size_t j = 0; j < p; j++) av_push(sc_av, newSVnv(sc_vec[j]));
9257 2 5 if (colnames) {
9258 4 2 for (size_t i = 0; i < p; i++) Safefree(colnames[i]);
9275 0 38 SvGETMAGIC(input_ref);
0 0 SvGETMAGIC(input_ref);
9276 1 37 if (!SvROK(input_ref))
9279 14 23 if (ref_type == SVt_PVHV) {// ── Hash-of-Hashes
9285 23 12 while ((he_row = hv_iternext(in_hv))) {
9289 0 23 SvGETMAGIC(row_val);
0 0 SvGETMAGIC(row_val);
9291 22 1 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
1 21 if (!SvROK(row_val) || SvTYPE(SvRV(row_val)) != SVt_PVHV)
9295 33 21 while ((he_col = hv_iternext(in_inner_hv))) {
9300 0 33 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
9302 14 19 if (out_inner_he) {
9304 14 0 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
0 14 if (!SvROK(inner_ref) || SvTYPE(SvRV(inner_ref)) != SVt_PVHV)
9310 0 19 if (!hv_store_ent(out_hv, col_key_sv, inner_ref, 0)) {
9316 0 33 if (!hv_store_ent(out_inner_hv, row_key_sv, val, 0)) {
9322 22 1 } else if (ref_type == SVt_PVAV) { // Array-of-Arrays
9328 21 1 if (nrows > 0) {// Pass 1: validate all rows; fix ncols from row 0
9331 20 1 if (!elem || !*elem)
0 20 if (!elem || !*elem)
9333 0 20 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9334 19 1 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
1 18 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
9338 19 16 for (SSize_t i = 1; i < nrows; i++) {
9341 19 0 if (!elem || !*elem)
0 19 if (!elem || !*elem)
9343 0 19 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9344 19 0 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
0 19 if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV)
9347 2 17 if (row_ncols != ncols)
9353 15 1 if (ncols > 0) {
9355 32 15 for (SSize_t j = 0; j < ncols; j++) {
9358 0 32 if (!av_store(out_av, j, col_ref)) {
9364 67 32 for (SSize_t i = 0; i < nrows; i++) {
9366 67 0 if (elem && *elem) {
67 0 if (elem && *elem) {
9367 0 67 SvGETMAGIC(*elem);
0 0 SvGETMAGIC(*elem);
9371 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;
9372 0 67 SvGETMAGIC(val);
0 0 SvGETMAGIC(val);
9374 0 67 if (!av_store(out_col_av, i, val)) {