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