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