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