| line | % | coverage | branch |
| 30 | 50 | T | F | if (df <= 0.0) return 0.0; |
| 40 | 100 | T | F | for (unsigned short i = 1; i < n_steps; i++) { |
| 52 | 100 | T | F | double weight = (i % 2 != 0) ? 4.0 : 2.0; |
| 73 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 79 | 100 | T | F | for (size_t i = 0; i < n; ) { |
| 81 | 100 | T | F | while (j < n && items[j].val == items[i].val) j++; |
| 50 | T | F | while (j < n && items[j].val == items[i].val) j++; |
| 83 | 100 | T | F | for (size_t k = i; k < j; k++) items[k].rank = avg_rank; |
| 87 | 100 | T | F | for (size_t i = 0; i < n; i++) ranks[i] = items[i].rank; |
| 93 | 100 | T | F | if (prob <= 0.0) return 0; |
| 94 | 100 | T | F | if (prob >= 1.0) return size; |
| 97 | 100 | T | F | for (size_t i = 0; i < size; i++) { |
| 98 | 100 | T | F | if (Drand01() <= prob) successes++; |
| 111 | 100 | T | F | for(size_t k = 0; k <= max_x - min_x; ++k) { |
| 113 | 100 | T | F | if (d_val > max_d) max_d = d_val; |
| 117 | 100 | T | F | for(size_t k = 0; k <= max_x - min_x; ++k) { |
| 124 | 100 | T | F | for(size_t k = 0; k <= max_x - min_x; ++k) { |
| 126 | 100 | T | F | if (min_x + k <= a) *lower_tail += p_prob; |
| 127 | 100 | T | F | if (min_x + k >= a) *upper_tail += p_prob; |
| 135 | 100 | T | F | size_t min_x = (r2 > c1) ? 0 : c1 - r2; |
| 143 | 100 | T | F | for(size_t x = min_x; x <= max_x; ++x) { |
| 148 | 50 | T | F | if (a == min_x && a == max_x) *mle_or = 1.0; |
| 0 | T | F | if (a == min_x && a == max_x) *mle_or = 1.0; |
| 149 | 50 | T | F | else if (a == min_x) *mle_or = 0.0; |
| 150 | 100 | T | F | else if (a == max_x) *mle_or = INFINITY; |
| 153 | 50 | T | F | for (unsigned short int i = 0; i < 3000; i++) { |
| 156 | 100 | T | F | for(size_t k = 0; k <= max_x - min_x; ++k) { |
| 158 | 100 | T | F | if (d_val > max_d) max_d = d_val; |
| 161 | 100 | T | F | for(size_t k = 0; k <= max_x - min_x; ++k) { |
| 168 | 100 | T | F | if (exp_val > a) log_high = log_mid; |
| 170 | 100 | T | F | if (log_high - log_low < 1e-15) break; |
| 179 | 100 | T | F | if (!is_less) { |
| 180 | 100 | T | F | double target_alpha = is_greater ? alpha : alpha / 2.0; |
| 181 | 50 | T | F | if (a != min_x) { |
| 183 | 50 | T | F | for (unsigned short int i = 0; i < 1000; i++) { |
| 188 | 100 | T | F | if (err < best_err) { best_err = err; best = mid; } |
| 189 | 100 | T | F | if (ut > target_alpha) log_high = log_mid; |
| 191 | 100 | T | F | if (log_high - log_low < 1e-15) break; |
| 198 | 100 | T | F | if (!is_greater) { |
| 199 | 100 | T | F | double target_alpha = is_less ? alpha : alpha / 2.0; |
| 200 | 100 | T | F | if (a != max_x) { |
| 202 | 50 | T | F | for (unsigned short int i = 0; i < 1000; i++) { |
| 207 | 100 | T | F | if (err < best_err) { best_err = err; best = mid; } |
| 208 | 100 | T | F | if (lt > target_alpha) log_low = log_mid; |
| 210 | 100 | T | F | if (log_high - log_low < 1e-15) break; |
| 221 | 100 | T | F | size_t min_x = (r2 > c1) ? 0 : c1 - r2; |
| 226 | 100 | T | F | for(size_t x = min_x; x <= max_x; ++x) { |
| 232 | 100 | T | F | if (strcmp(alt, "less") == 0) { |
| 233 | 100 | T | F | for(size_t x = min_x; x <= a; ++x) p_val += exp(logdc[x - min_x]); |
| 234 | 100 | T | F | } else if (strcmp(alt, "greater") == 0) { |
| 235 | 100 | T | F | for(size_t x = a; x <= max_x; ++x) p_val += exp(logdc[x - min_x]); |
| 239 | 100 | T | F | for(size_t x = min_x; x <= max_x; ++x) { |
| 241 | 100 | T | F | if (p_cur <= p_obs * relErr) p_val += p_cur; |
| 246 | 50 | T | F | return (p_val > 1.0) ? 1.0 : p_val; |
| 261 | 100 | T | F | for (size_t k = 0; k < n; k++) { |
| 266 | 100 | T | F | for (size_t k = 0; k < n; k++) { |
| 269 | 100 | T | F | if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) { |
| 50 | T | F | if (fabs(A[k * n + k]) <= 1e-10 * orig_diag[k] || fabs(A[k * n + k]) < 1e-24) { |
| 272 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 281 | 100 | T | F | for (size_t j = 0; j < n; j++) A[k * n + j] *= pivot; |
| 282 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 283 | 100 | T | F | if (i != k && A[i * n + k] != 0.0) { |
| 100 | T | F | if (i != k && A[i * n + k] != 0.0) { |
| 286 | 100 | T | F | for (size_t j = 0; j < n; j++) { |
| 299 | 100 | T | F | if (row_hashes) { |
| 301 | 50 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 50 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 50 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 305 | 50 | T | F | } else if (data_hoa) { |
| 307 | 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 312 | 50 | T | F | if (val && SvOK(*val)) { |
| 100 | T | F | if (val && SvOK(*val)) { |
| 313 | 50 | T | F | if (looks_like_number(*val)) return SvNV(*val); |
| 322 | 50 | T | F | if (data_hoa) { |
| 325 | 100 | T | F | while ((entry = hv_iternext(data_hoa))) { |
| 328 | 0 | T | F | } else if (row_hashes && n > 0 && row_hashes[0]) { |
| 0 | T | F | } else if (row_hashes && n > 0 && row_hashes[0]) { |
| 0 | T | F | } else if (row_hashes && n > 0 && row_hashes[0]) { |
| 331 | 0 | T | F | while ((entry = hv_iternext(row_hashes[0]))) { |
| 340 | 50 | T | F | if (!term || term[0] == '\0') return NAN; |
| 50 | T | F | if (!term || term[0] == '\0') return NAN; |
| 344 | 100 | T | F | if (colon) { |
| 350 | 50 | T | F | if (isnan(left) || isnan(right)) return NAN; |
| 50 | T | F | if (isnan(left) || isnan(right)) return NAN; |
| 353 | 50 | T | F | if (strncmp(term_cpy, "I(", 2) == 0) { |
| 355 | 0 | T | F | if (end) *end = '\0'; |
| 359 | 0 | T | F | if (caret) { |
| 366 | 0 | T | F | if (isnan(v)) return NAN; |
| 367 | 0 | T | F | return power == 1 ? v : pow(v, power); |
| 376 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 378 | 100 | T | F | if (row_hashes) { |
| 380 | 100 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 50 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 50 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 384 | 50 | T | F | } else if (data_hoa) { |
| 386 | 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 391 | 100 | T | F | if (val && SvOK(*val)) { |
| 50 | T | F | if (val && SvOK(*val)) { |
| 392 | 100 | T | F | if (looks_like_number(*val)) return false; // First valid is number -> Numeric Column |
| 402 | 50 | T | F | if (row_hashes) { |
| 404 | 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVAV) { |
| 408 | 50 | T | F | } else if (data_hoa) { |
| 410 | 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 50 | T | F | if (col && SvROK(*col) && SvTYPE(SvRV(*col)) == SVt_PVAV) { |
| 415 | 50 | T | F | if (val && SvOK(*val)) { |
| 50 | T | F | if (val && SvOK(*val)) { |
| 430 | 100 | T | F | if (diff < 0) return -1; |
| 431 | 50 | T | F | if (diff > 0) return 1; |
| 447 | 100 | T | F | if (diff < 0) return -1; |
| 448 | 100 | T | F | if (diff > 0) return 1; |
| 456 | 50 | T | F | Newx(ri, n, RankItem); |
| 457 | 100 | T | F | for (size_t i = 0; i < n; i++) { ri[i].val = in[i]; ri[i].idx = i; } |
| 461 | 100 | T | F | while (i < n) { |
| 464 | 100 | T | F | while (j + 1 < n && ri[j + 1].val == ri[j].val) j++; |
| 100 | T | F | while (j + 1 < n && ri[j + 1].val == ri[j].val) j++; |
| 467 | 100 | T | F | for (size_t k = i; k <= j; k++) out[ri[k].idx] = avg; |
| 477 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 483 | 50 | T | F | if (den == 0.0) return NAN; |
| 497 | 100 | T | F | for (size_t i = 0; i < n - 1; i++) { |
| 498 | 100 | T | F | for (size_t j = i + 1; j < n; j++) { |
| 501 | 100 | T | F | if (sx == 0 && sy == 0) { /* joint tie â not counted */ } |
| 50 | T | F | if (sx == 0 && sy == 0) { /* joint tie â not counted */ } |
| 502 | 100 | T | F | else if (sx == 0) tie_x++; |
| 503 | 50 | T | F | else if (sy == 0) tie_y++; |
| 504 | 50 | T | F | else if (sx == sy) C++; |
| 509 | 50 | T | F | if (denom == 0.0) return NAN; |
| 517 | 100 | T | F | if (strcmp(method, "spearman") == 0) { |
| 519 | 50 | T | F | Newx(rx, n, double); Newx(ry, n, double); |
| 50 | T | F | Newx(rx, n, double); Newx(ry, n, double); |
| 526 | 100 | T | F | if (strcmp(method, "kendall") == 0) |
| 542 | 50 | T | F | if (fabs(d) < FPMIN) d = FPMIN; |
| 544 | 50 | T | F | for (m = 1; m <= MAX_ITER; m++) { |
| 548 | 50 | T | F | if (fabs(d) < FPMIN) d = FPMIN; |
| 550 | 50 | T | F | if (fabs(c) < FPMIN) c = FPMIN; |
| 554 | 50 | T | F | if (fabs(d) < FPMIN) d = FPMIN; |
| 556 | 50 | T | F | if (fabs(c) < FPMIN) c = FPMIN; |
| 558 | 100 | T | F | if (fabs(del - 1.0) < EPS) break; |
| 564 | 50 | T | F | if (x <= 0.0) return 0.0; |
| 565 | 100 | T | F | if (x >= 1.0) return 1.0; |
| 567 | 100 | T | F | if (x < (a + 1.0) / (a + b + 2.0)) return bt * _incbeta_cf(a, b, x) / a; |
| 574 | 100 | T | F | if (strcmp(alt, "less") == 0) return (t < 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail; |
| 100 | T | F | if (strcmp(alt, "less") == 0) return (t < 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail; |
| 575 | 100 | T | F | if (strcmp(alt, "greater") == 0) return (t > 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail; |
| 50 | T | F | if (strcmp(alt, "greater") == 0) return (t > 0) ? 0.5 * prob_2tail : 1.0 - 0.5 * prob_2tail; |
| 583 | 100 | T | F | while (get_t_pvalue(high, df, "greater") > p_tail) { |
| 586 | 50 | T | F | if (high > 1000000.0) break; /* Fallback limit */ |
| 589 | 50 | T | F | for (unsigned short int i = 0; i < 100; i++) { |
| 592 | 100 | T | F | if (p_mid > p_tail) { |
| 597 | 100 | T | F | if (high - low < 1e-8) break; |
| 609 | 0 | T | F | if (n == 0) return 1; |
| 618 | 50 | T | F | double step = (n_bins > 0) ? (breaks[1] - breaks[0]) : 0.0; |
| 620 | 100 | T | F | for (size_t i = 0; i < n_bins; i++) { |
| 625 | 100 | T | F | if (step > 0.0) { |
| 626 | 100 | T | F | for (size_t j = 0; j < n; j++) { |
| 629 | 50 | T | F | if (isnan(val) || isinf(val) || val < min_val) continue; |
| 50 | T | F | if (isnan(val) || isinf(val) || val < min_val) continue; |
| 50 | T | F | if (isnan(val) || isinf(val) || val < min_val) continue; |
| 633 | 100 | T | F | if (idx >= n_bins) { |
| 639 | 100 | T | F | while (idx > 0 && val <= breaks[idx]) { |
| 100 | T | F | while (idx > 0 && val <= breaks[idx]) { |
| 643 | 100 | T | F | while (idx < n_bins - 1 && val > breaks[idx + 1]) { |
| 50 | T | F | while (idx < n_bins - 1 && val > breaks[idx + 1]) { |
| 648 | 50 | T | F | } else if (n_bins > 0) { |
| 653 | 100 | T | F | for (size_t i = 0; i < n_bins; i++) { |
| 655 | 100 | T | F | if (bin_width > 0) { |
| 658 | 50 | T | F | density[i] = (n_bins == 1) ? 1.0 : 0.0; |
| 681 | 100 | T | F | if (fabs(y) < 0.42) { |
| 687 | 100 | T | F | if (y > 0) r = 1.0 - p; |
| 691 | 100 | T | F | if (y < 0) x = -x; |
| 709 | 100 | T | F | for (size_t i = 0; i < n; i++) { perm[i] = i + 1; c[i] = 0; } |
| 724 | 100 | T | F | TALLY_PERM(); /* initial permutation [1, 2, ..., n] */ |
| 50 | T | F | TALLY_PERM(); /* initial permutation [1, 2, ..., n] */ |
| 50 | T | F | TALLY_PERM(); /* initial permutation [1, 2, ..., n] */ |
| 727 | 100 | T | F | while (k < n) { |
| 728 | 100 | T | F | if (c[k] < k) { |
| 730 | 100 | T | F | if (k % 2 == 0) { |
| 735 | 100 | T | F | TALLY_PERM(); |
| 100 | T | F | TALLY_PERM(); |
| 100 | T | F | TALLY_PERM(); |
| 751 | 50 | T | F | if (strcmp(alt, "greater") == 0) return p_le; |
| 752 | 50 | T | F | if (strcmp(alt, "less") == 0) return p_ge; |
| 754 | 50 | T | F | double p = 2.0 * (p_le < p_ge ? p_le : p_ge); |
| 755 | 50 | T | F | return (p > 1.0) ? 1.0 : p; |
| 764 | 100 | T | F | for (long i = 0; i <= max_inv; i++) dp[i] = 0.0; |
| 767 | 100 | T | F | for (size_t i = 2; i <= n; i++) { |
| 769 | 100 | T | F | for (long k = 0; k <= max_inv; k++) next_dp[k] = 0.0; |
| 771 | 100 | T | F | for (int k = 0; k <= current_max_inv; k++) { |
| 773 | 100 | T | F | for (int j = 0; j <= i - 1 && k - j >= 0; j++) { |
| 100 | T | F | for (int j = 0; j <= i - 1 && k - j >= 0; j++) { |
| 784 | 50 | T | F | if (i_obs < 0) i_obs = 0; |
| 785 | 50 | T | F | if (i_obs > max_inv) i_obs = max_inv; |
| 787 | 100 | T | F | for (long k = i_obs; k <= max_inv; k++) p_le += dp[k]; |
| 789 | 100 | T | F | for (long k = 0; k <= i_obs; k++) p_ge += dp[k]; |
| 791 | 50 | T | F | if (strcmp(alt, "greater") == 0) return p_ge; |
| 792 | 100 | T | F | if (strcmp(alt, "less") == 0) return p_le; |
| 794 | 50 | T | F | double p = 2.0 * (p_ge < p_le ? p_ge : p_le); |
| 795 | 50 | T | F | return p > 1.0 ? 1.0 : p; |
| 799 | 50 | T | F | if (f <= 0.0) return 0.0; |
| 808 | 100 | T | F | for (size_t k = 0; k < p; k++) { |
| 810 | 50 | T | F | if (r >= n) { |
| 816 | 100 | T | F | for (size_t i = r; i < n; i++) { |
| 817 | 100 | T | F | if (fabs(X[i][k]) > max_val) max_val = fabs(X[i][k]); |
| 819 | 100 | T | F | if (max_val < 1e-10) { |
| 825 | 100 | T | F | for (size_t i = r; i < n; i++) { |
| 830 | 100 | T | F | double s = (X[r][k] > 0) ? -norm : norm; |
| 834 | 100 | T | F | for (size_t j = k + 1; j < p; j++) { |
| 836 | 100 | T | F | for (size_t i = r + 1; i < n; i++) dot += X[i][j] * X[i][k]; |
| 839 | 100 | T | F | for (size_t i = r + 1; i < n; i++) X[i][j] += tau * X[i][k]; |
| 844 | 100 | T | F | for (size_t i = r + 1; i < n; i++) dot_y += y[i] * X[i][k]; |
| 847 | 100 | T | F | for (size_t i = r + 1; i < n; i++) y[i] += tau_y * X[i][k]; |
| 863 | 50 | T | F | if (!sv || !SvOK(sv)) return 0; |
| 50 | T | F | if (!sv || !SvOK(sv)) return 0; |
| 866 | 100 | T | F | for (size_t i = 0; i < len; i++) { |
| 867 | 50 | T | F | if (!isdigit(s[i])) return 1; |
| 874 | 50 | T | F | if (!str) str = ""; |
| 876 | 100 | T | F | if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) { |
| 100 | T | F | if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) { |
| 50 | T | F | if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) { |
| 50 | T | F | if (strstr(str, sep) != NULL || strchr(str, '"') != NULL || strchr(str, '\r') != NULL || strchr(str, '\n') != NULL) { |
| 880 | 100 | T | F | if (needs_quotes) { |
| 882 | 100 | T | F | for (const char *restrict p = str; *p; p++) { |
| 883 | 100 | T | F | if (*p == '"') { |
| 899 | 100 | T | F | for (size_t i = 0; i < len; i++) { |
| 900 | 100 | T | F | if (i > 0) PerlIO_write(fh, sep, sep_len); |
| 901 | 50 | T | F | if (row[i]) { |
| 912 | 50 | T | F | if (x < 0.0 || a <= 0.0) return 1.0; |
| 50 | T | F | if (x < 0.0 || a <= 0.0) return 1.0; |
| 913 | 50 | T | F | if (x == 0.0) return 1.0; |
| 916 | 100 | T | F | if (x < a + 1.0) { |
| 920 | 100 | T | F | while (fabs(term) > 1e-15) { |
| 933 | 50 | T | F | while (i < 10000) { // Safety bound |
| 937 | 50 | T | F | if (fabs(d) < 1e-30) d = 1e-30; |
| 939 | 50 | T | F | if (fabs(c) < 1e-30) c = 1e-30; |
| 943 | 100 | T | F | if (fabs(del - 1.0) < 1e-15) break; |
| 951 | 50 | T | F | if (df <= 0) return 1.0; |
| 952 | 50 | T | F | if (stat <= 0.0) return 1.0; |
| 963 | 50 | T | F | if (k < 0 || k > n) return 0.0L; |
| 50 | T | F | if (k < 0 || k > n) return 0.0L; |
| 964 | 50 | T | F | if (k > n / 2) k = n - k; |
| 966 | 100 | T | F | for (int i = 1; i <= k; i++) { |
| 977 | 100 | T | F | if (k < 0) return 0.0; |
| 978 | 50 | T | F | if (k >= max_u) return 1.0; |
| 983 | 100 | T | F | for (int j = 1; j <= n; j++) { |
| 984 | 100 | T | F | for (int i = j; i <= max_u; i++) w[i] += w[i - j]; |
| 985 | 100 | T | F | for (int i = max_u; i >= j + m; i--) w[i] -= w[i - j - m]; |
| 989 | 100 | T | F | for (int i = 0; i <= k; i++) cum_p += w[i]; |
| 1003 | 50 | T | F | if (k < 0) return 0.0; |
| 1004 | 100 | T | F | if (k >= max_v) return 1.0; |
| 1009 | 100 | T | F | for (int i = 1; i <= n; i++) { |
| 1010 | 100 | T | F | for (int j = max_v; j >= i; j--) w[j] += w[j - i]; |
| 1014 | 100 | T | F | for (int i = 0; i <= k; i++) cum_p += w[i]; |
| 1030 | 50 | T | F | if (n == 0) return 0.0; |
| 1035 | 100 | T | F | while (i < n) { |
| 1037 | 100 | T | F | while (j < n && ri[j].val == ri[i].val) j++; |
| 100 | T | F | while (j < n && ri[j].val == ri[i].val) j++; |
| 1039 | 100 | T | F | for (size_t k = i; k < j; k++) ri[k].rank = r; |
| 1041 | 100 | T | F | if (t > 1) { *has_ties = 1; tie_adj += ((double)t * t * t - t); } |
| 1059 | 50 | T | F | if (n == 0) return 1.0; |
| 1060 | 50 | T | F | if (n < 0) return 1.0 / r_pow_di(x, -n); |
| 1062 | 100 | T | F | for (int i = 0; i < n; i++) val *= x; |
| 1070 | 0 | T | F | if(x <= 0.) { |
| 1071 | 0 | T | F | if(lower) p = 0.; |
| 1073 | 0 | T | F | } else if(x < 1.) { |
| 1078 | 0 | T | F | for(k = 1; k < k_max; k += 2) { |
| 1082 | 0 | T | F | if(!lower) p = 1.0 - p; |
| 1087 | 0 | T | F | if(lower) { |
| 1092 | 0 | T | F | while(fabs(old_val - new_val) > tol) { |
| 1105 | 100 | T | F | for(unsigned int i = 0; i < m; i++) { |
| 1106 | 100 | T | F | for(unsigned int j = 0; j < m; j++) { |
| 1108 | 100 | T | F | for(unsigned int k = 0; k < m; k++) s += A[i * m + k] * B[k * m + j]; |
| 1115 | 100 | T | F | if(n == 1) { |
| 1116 | 100 | T | F | for(int i = 0; i < m * m; i++) V[i] = A[i]; |
| 1124 | 100 | T | F | if((n % 2) == 0) { |
| 1125 | 100 | T | F | for(int i = 0; i < m * m; i++) V[i] = B[i]; |
| 1131 | 50 | T | F | if(V[(m / 2) * m + (m / 2)] > 1e140) { |
| 1132 | 0 | T | F | for(int i = 0; i < m * m; i++) V[i] = V[i] * 1e-140; |
| 1146 | 100 | T | F | for(int i = 0; i < m; i++) { |
| 1147 | 100 | T | F | for(int j = 0; j < m; j++) { |
| 1148 | 100 | T | F | if(i - j + 1 < 0) H[i * m + j] = 0; |
| 1152 | 100 | T | F | for(int i = 0; i < m; i++) { |
| 1156 | 50 | T | F | H[(m - 1) * m] += ((2 * h - 1 > 0) ? r_pow_di(2 * h - 1, m) : 0); |
| 1158 | 100 | T | F | for(int i = 0; i < m; i++) { |
| 1159 | 100 | T | F | for(int j = 0; j < m; j++) { |
| 1160 | 100 | T | F | if(i - j + 1 > 0) { |
| 1161 | 100 | T | F | for(int g = 1; g <= i - j + 1; g++) H[i * m + j] /= g; |
| 1170 | 100 | T | F | for(int i = 1; i <= n; i++) { |
| 1172 | 50 | T | F | if(s < 1e-140) { |
| 1191 | 100 | T | F | while(i < nx || j < ny) { |
| 50 | T | F | while(i < nx || j < ny) { |
| 1193 | 50 | T | F | if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j]; |
| 100 | T | F | if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j]; |
| 100 | T | F | if (i < nx && j < ny) val = (x[i] < y[j]) ? x[i] : y[j]; |
| 1194 | 50 | T | F | else if (i < nx) val = x[i]; |
| 1197 | 100 | T | F | while(i < nx && x[i] <= val) i++; |
| 100 | T | F | while(i < nx && x[i] <= val) i++; |
| 1198 | 100 | T | F | while(j < ny && y[j] <= val) j++; |
| 100 | T | F | while(j < ny && y[j] <= val) j++; |
| 1204 | 100 | T | F | if (diff > max_d_plus) max_d_plus = diff; |
| 1205 | 100 | T | F | if (-diff > max_d_minus) max_d_minus = -diff; |
| 1206 | 100 | T | F | if (fabs(diff) > max_d) max_d = fabs(diff); |
| 1215 | 100 | T | F | if (two_sided) return (fabs(r - s) >= q); |
| 1225 | 100 | T | F | for(unsigned int j = 1; j <= n; j++) { |
| 1226 | 100 | T | F | if(psmirnov_exact_test(q, 0., j / nd, two_sided)) u[j] = 1.; |
| 1229 | 100 | T | F | for(unsigned int i = 1; i <= m; i++) { |
| 1230 | 100 | T | F | if(psmirnov_exact_test(q, i / md, 0., two_sided)) u[0] = 1.; |
| 1231 | 100 | T | F | for(int j = 1; j <= n; j++) { |
| 1232 | 100 | T | F | if(psmirnov_exact_test(q, i / md, j / nd, two_sided)) u[j] = 1.; |
| 1247 | 50 | T | F | if (nu < 1e-7) nu = 1e-7; |
| 1255 | 50 | T | F | if (strict && tside == 2) { |
| 0 | T | F | if (strict && tside == 2) { |
| 1276 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 1281 | 50 | T | F | if (arg_idx < items) { |
| 1282 | 100 | T | F | if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 1285 | 50 | T | F | } else if (SvPOK(ST(arg_idx))) { |
| 1292 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 1295 | 50 | T | F | if (strEQ(key, "x")) x_sv = val; |
| 1296 | 50 | T | F | else if (strEQ(key, "y")) y_sv = val; |
| 1297 | 50 | T | F | else if (strEQ(key, "exact")) { |
| 1298 | 0 | T | F | if (!SvOK(val)) exact = -1; |
| 1301 | 50 | T | F | else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val); |
| 1305 | 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) { |
| 1313 | 100 | T | F | if (!is_two_sided && !is_greater && !is_less) { |
| 100 | T | F | if (!is_two_sided && !is_greater && !is_less) { |
| 50 | T | F | if (!is_two_sided && !is_greater && !is_less) { |
| 1319 | 50 | T | F | if (nx == 0) croak("Not enough 'x' observations"); |
| 1324 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 1326 | 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 1335 | 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 100 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 1341 | 100 | T | F | for (size_t i = 0; i < ny; i++) { |
| 1343 | 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 1348 | 50 | T | F | if (valid_nx < 1 || valid_ny < 1) { |
| 50 | T | F | if (valid_nx < 1 || valid_ny < 1) { |
| 1357 | 100 | T | F | if (is_greater) statistic = d_plus; |
| 1358 | 100 | T | F | else if (is_less) statistic = d_minus; |
| 1363 | 50 | T | F | if (exact == 1) use_exact = true; |
| 1364 | 50 | T | F | else if (exact == 0) use_exact = false; |
| 1370 | 100 | T | F | for(size_t i=0; i<valid_nx; i++) comb[i] = x_data[i]; |
| 1371 | 100 | T | F | for(size_t i=0; i<valid_ny; i++) comb[valid_nx+i] = y_data[i]; |
| 1375 | 100 | T | F | for(size_t i = 1; i < total_n; i++) { |
| 1376 | 50 | T | F | if(comb[i] == comb[i-1]) { has_ties = true; break; } |
| 1379 | 50 | T | F | if (use_exact && has_ties) { |
| 50 | T | F | if (use_exact && has_ties) { |
| 1383 | 50 | T | F | if (use_exact) { |
| 1390 | 0 | T | F | if (is_two_sided) { |
| 1399 | 50 | T | F | else if (y_sv && SvPOK(y_sv)) { |
| 50 | T | F | else if (y_sv && SvPOK(y_sv)) { |
| 1401 | 50 | T | F | if (strEQ(dist, "pnorm")) { |
| 1404 | 100 | T | F | for(size_t i = 0; i < valid_nx; i++) { |
| 1412 | 50 | T | F | if (diff1 > max_d_plus) max_d_plus = diff1; |
| 1413 | 100 | T | F | if (diff2 > max_d_plus) max_d_plus = diff2; |
| 1414 | 100 | T | F | if (-diff1 > max_d_minus) max_d_minus = -diff1; |
| 1415 | 50 | T | F | if (-diff2 > max_d_minus) max_d_minus = -diff2; |
| 1417 | 100 | T | F | if (fabs(diff1) > max_d) max_d = fabs(diff1); |
| 1418 | 50 | T | F | if (fabs(diff2) > max_d) max_d = fabs(diff2); |
| 1420 | 50 | T | F | if (is_greater) statistic = max_d_plus; |
| 1421 | 50 | T | F | else if (is_less) statistic = max_d_minus; |
| 1423 | 50 | T | F | bool use_exact = (exact == -1) ? (valid_nx < 100) : (exact == 1); |
| 1424 | 50 | T | F | if (use_exact) { |
| 1426 | 50 | T | F | if (is_two_sided) { |
| 1436 | 0 | T | F | if (is_two_sided) p_value = K2l(z, 0, 1e-6); |
| 1448 | 50 | T | F | if (p_value > 1.0) p_value = 1.0; |
| 1449 | 50 | T | F | if (p_value < 0.0) p_value = 0.0; |
| 1470 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 1475 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 1480 | 50 | T | F | if ((items - arg_idx) % 2 != 0) { |
| 1484 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 1487 | 100 | T | F | if (strEQ(key, "x")) x_sv = val; |
| 1488 | 100 | T | F | else if (strEQ(key, "y")) y_sv = val; |
| 1489 | 100 | T | F | else if (strEQ(key, "paired")) paired = SvTRUE(val); |
| 1490 | 50 | T | F | else if (strEQ(key, "correct")) correct = SvTRUE(val); |
| 1491 | 100 | T | F | else if (strEQ(key, "mu")) mu = SvNV(val); |
| 1492 | 50 | T | F | else if (strEQ(key, "exact")) { |
| 1493 | 0 | T | F | if (!SvOK(val)) exact = -1; |
| 1496 | 50 | T | F | else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val); |
| 1500 | 100 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 1504 | 50 | T | F | if (nx == 0) croak("Not enough 'x' observations"); |
| 1508 | 100 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) { |
| 1516 | 100 | T | F | if (ny > 0 && !paired) { |
| 100 | T | F | if (ny > 0 && !paired) { |
| 1519 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 1521 | 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 1527 | 100 | T | F | for (size_t i = 0; i < ny; i++) { |
| 1529 | 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 1535 | 50 | T | F | if (valid_nx == 0) { Safefree(ri); croak("not enough (non-missing) 'x' observations"); } |
| 1536 | 50 | T | F | if (valid_ny == 0) { Safefree(ri); croak("not enough 'y' observations"); } |
| 1541 | 100 | T | F | for (size_t i = 0; i < total_n; i++) if (ri[i].idx == 1) w_rank_sum += ri[i].rank; |
| 100 | T | F | for (size_t i = 0; i < total_n; i++) if (ri[i].idx == 1) w_rank_sum += ri[i].rank; |
| 1544 | 50 | T | F | if (exact == 1) use_exact = true; |
| 1545 | 50 | T | F | else if (exact == 0) use_exact = false; |
| 1546 | 50 | T | F | else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties); |
| 50 | T | F | else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties); |
| 100 | T | F | else use_exact = (valid_nx < 50 && valid_ny < 50 && !has_ties); |
| 1548 | 100 | T | F | if (use_exact && has_ties) { |
| 50 | T | F | if (use_exact && has_ties) { |
| 1552 | 100 | T | F | if (use_exact) { |
| 1557 | 100 | T | F | if (strcmp(alternative, "less") == 0) p_value = p_less; |
| 1558 | 50 | T | F | else if (strcmp(alternative, "greater") == 0) p_value = p_greater; |
| 1560 | 0 | T | F | double p = (p_less < p_greater) ? p_less : p_greater; |
| 1564 | 50 | T | F | method_desc = correct ? "Wilcoxon rank sum test with continuity correction" : "Wilcoxon rank sum test"; |
| 1570 | 50 | T | F | if (correct) { |
| 1571 | 50 | T | F | if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5); |
| 100 | T | F | if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5); |
| 1572 | 0 | T | F | else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5; |
| 1573 | 0 | T | F | else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5; |
| 1577 | 50 | T | F | if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z); |
| 1578 | 50 | T | F | else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z); |
| 1583 | 100 | T | F | if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test"); |
| 50 | T | F | if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test"); |
| 100 | T | F | if (paired && (!y_av || nx != ny)) croak("'x' and 'y' must have the same length for paired test"); |
| 1587 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 1589 | 50 | T | F | if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue; |
| 50 | T | F | if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue; |
| 50 | T | F | if (!x_el || !SvOK(*x_el) || !looks_like_number(*x_el)) continue; |
| 1592 | 100 | T | F | if (paired) { |
| 1594 | 50 | T | F | if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue; |
| 50 | T | F | if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue; |
| 50 | T | F | if (!y_el || !SvOK(*y_el) || !looks_like_number(*y_el)) continue; |
| 1597 | 50 | T | F | if (d == 0.0) has_zeroes = true; // Drop exact zeroes |
| 1601 | 50 | T | F | if (d == 0.0) has_zeroes = true; |
| 1605 | 50 | T | F | if (n_nz == 0) { |
| 1610 | 100 | T | F | for (size_t i = 0; i < n_nz; i++) { |
| 1617 | 100 | T | F | for (size_t i = 0; i < n_nz; i++) { |
| 1618 | 100 | T | F | if (ri[i].idx) statistic += ri[i].rank; |
| 1620 | 50 | T | F | if (exact == 1) use_exact = true; |
| 1621 | 50 | T | F | else if (exact == 0) use_exact = false; |
| 1622 | 50 | T | F | else use_exact = (n_nz < 50 && !has_ties); |
| 50 | T | F | else use_exact = (n_nz < 50 && !has_ties); |
| 1623 | 50 | T | F | if (use_exact && has_ties) { |
| 50 | T | F | if (use_exact && has_ties) { |
| 1627 | 50 | T | F | if (use_exact && has_zeroes) { |
| 50 | T | F | if (use_exact && has_zeroes) { |
| 1631 | 50 | T | F | if (use_exact) { |
| 1636 | 50 | T | F | if (strcmp(alternative, "less") == 0) p_value = p_less; |
| 1637 | 50 | T | F | else if (strcmp(alternative, "greater") == 0) p_value = p_greater; |
| 1639 | 50 | T | F | double p = (p_less < p_greater) ? p_less : p_greater; |
| 1643 | 0 | T | F | method_desc = correct ? "Wilcoxon signed rank test with continuity correction" : "Wilcoxon signed rank test"; |
| 1648 | 0 | T | F | if (correct) { |
| 1649 | 0 | T | F | if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5); |
| 0 | T | F | if (strcmp(alternative, "two.sided") == 0) CORRECTION = (z > 0 ? 0.5 : -0.5); |
| 1650 | 0 | T | F | else if (strcmp(alternative, "greater") == 0) CORRECTION = 0.5; |
| 1651 | 0 | T | F | else if (strcmp(alternative, "less") == 0) CORRECTION = -0.5; |
| 1655 | 0 | T | F | if (strcmp(alternative, "less") == 0) p_value = approx_pnorm(z); |
| 1656 | 0 | T | F | else if (strcmp(alternative, "greater") == 0) p_value = 1.0 - approx_pnorm(z); |
| 1661 | 50 | T | F | if (p_value > 1.0) p_value = 1.0; |
| 1677 | 50 | T | F | int r = av_top_index(obs_av) + 1, c = 0; |
| 1680 | 50 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 100 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 50 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 1683 | 50 | T | F | c = av_top_index(first_row) + 1; |
| 1691 | 100 | T | F | int yates = (is_2d && r == 2 && c == 2) ? 1 : 0; |
| 50 | T | F | int yates = (is_2d && r == 2 && c == 2) ? 1 : 0; |
| 100 | T | F | int yates = (is_2d && r == 2 && c == 2) ? 1 : 0; |
| 1694 | 100 | T | F | if (is_2d) { |
| 1697 | 100 | T | F | for(unsigned int i=0; i<r; i++) row_sum[i] = 0.0; |
| 1698 | 100 | T | F | for(unsigned int j=0; j<c; j++) col_sum[j] = 0.0; |
| 1699 | 100 | T | F | for (unsigned int i = 0; i < r; i++) { |
| 1702 | 100 | T | F | for (unsigned int j = 0; j < c; j++) { |
| 1710 | 100 | T | F | for (unsigned int i = 0; i < r; i++) { |
| 1714 | 100 | T | F | for (unsigned int j = 0; j < c; j++) { |
| 1719 | 100 | T | F | if (yates) { |
| 1722 | 50 | T | F | double y_corr = (abs_diff > 0.5) ? 0.5 : abs_diff; |
| 1734 | 100 | T | F | for (unsigned int j = 0; j < c; j++) { |
| 1739 | 100 | T | F | for (unsigned int j = 0; j < c; j++) { |
| 1753 | 100 | T | F | if (is_2d) { |
| 1754 | 100 | T | F | if (yates) { |
| 1777 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx))) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx))) { |
| 1779 | 100 | T | F | if (type == SVt_PVHV || type == SVt_PVAV) { |
| 50 | T | F | if (type == SVt_PVHV || type == SVt_PVAV) { |
| 1784 | 50 | T | F | if (arg_idx < items) { |
| 1794 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 1795 | 50 | T | F | if (arg_idx + 1 >= items) croak("write_table: Odd number of arguments passed"); |
| 1798 | 50 | T | F | if (strEQ(key, "data")) data_sv = val; |
| 1799 | 100 | T | F | else if (strEQ(key, "col.names")) col_names_sv = val; |
| 1800 | 50 | T | F | else if (strEQ(key, "file")) file_sv = val; |
| 1801 | 100 | T | F | else if (strEQ(key, "row.names")) row_names_sv = val; |
| 1802 | 50 | T | F | else if (strEQ(key, "sep")) sep = SvPV_nolen(val); |
| 1806 | 50 | T | F | if (!data_sv || !SvROK(data_sv)) { |
| 50 | T | F | if (!data_sv || !SvROK(data_sv)) { |
| 1810 | 100 | T | F | if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) { |
| 50 | T | F | if (SvTYPE(data_ref) != SVt_PVHV && SvTYPE(data_ref) != SVt_PVAV) { |
| 1814 | 50 | T | F | if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n"); |
| 50 | T | F | if (!file_sv || !SvOK(file_sv)) croak("write_table: file name missing\n"); |
| 1817 | 100 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 50 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 1818 | 100 | T | F | if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!SvROK(col_names_sv) || SvTYPE(SvRV(col_names_sv)) != SVt_PVAV) { |
| 1827 | 100 | T | F | if (SvTYPE(data_ref) == SVt_PVHV) { |
| 1829 | 50 | T | F | if (hv_iterinit(hv) == 0) XSRETURN_EMPTY; |
| 1833 | 50 | T | F | if (!first_val || !SvROK(first_val)) { |
| 50 | T | F | if (!first_val || !SvROK(first_val)) { |
| 1837 | 100 | T | F | if (first_type != SVt_PVHV && first_type != SVt_PVAV) { |
| 50 | T | F | if (first_type != SVt_PVHV && first_type != SVt_PVAV) { |
| 1845 | 100 | T | F | while ((entry = hv_iternext(hv))) { |
| 1847 | 50 | T | F | if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != first_type) { |
| 50 | T | F | if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != first_type) { |
| 50 | T | F | if (!val || !SvROK(val) || SvTYPE(SvRV(val)) != first_type) { |
| 1848 | 0 | T | F | croak("write_table: Mixed data types detected. Ensure all values are %s references.\n", is_hoh ? "HASH" : "ARRAY"); |
| 1852 | 100 | T | F | if (is_hoh) { |
| 1855 | 100 | T | F | while ((entry = hv_iternext(hv))) { |
| 1861 | 50 | T | F | if (av_len(av) < 0) XSRETURN_EMPTY; |
| 1863 | 50 | T | F | if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!first_ptr || !*first_ptr || !SvROK(*first_ptr) || SvTYPE(SvRV(*first_ptr)) != SVt_PVHV) { |
| 1867 | 100 | T | F | for (size_t i = 0; i <= av_len(av); i++) { |
| 1869 | 50 | T | F | if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) { |
| 50 | T | F | if (!ptr || !*ptr || !SvROK(*ptr) || SvTYPE(SvRV(*ptr)) != SVt_PVHV) { |
| 1877 | 50 | T | F | if (!fh) croak("write_table: Could not open '%s' for writing", file); |
| 1880 | 50 | T | F | int inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0; |
| 100 | T | F | int inc_rownames = (row_names_sv && SvTRUE(row_names_sv)) ? 1 : 0; |
| 1884 | 100 | T | F | if (is_hoh) { |
| 1885 | 100 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 50 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 1887 | 100 | T | F | for(size_t i=0; i<=av_len(c_av); i++) { |
| 1889 | 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 1895 | 100 | T | F | while((entry = hv_iternext((HV*)data_ref))) { |
| 1899 | 100 | T | F | while((inner_entry = hv_iternext(inner))) { |
| 1905 | 100 | T | F | for(unsigned i=0; i<num_cols; i++) { |
| 1910 | 100 | T | F | for(unsigned i=0; i<num_cols; i++) av_push(headers_av, newSVpv(col_array[i], 0)); |
| 1918 | 50 | T | F | if (inc_rownames) header_row[h_idx++] = ""; |
| 1919 | 100 | T | F | for(unsigned short int i=0; i<num_headers; i++) { |
| 1921 | 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 1928 | 100 | T | F | for(size_t i=0; i<num_rows; i++) { |
| 1936 | 100 | T | F | for(size_t i=0; i<num_rows; i++) { |
| 1938 | 50 | T | F | if (inc_rownames) row_data[d_idx++] = row_array[i]; |
| 1941 | 50 | T | F | HV *restrict inner_hv = inner_hv_ptr ? (HV*)SvRV(*inner_hv_ptr) : NULL; |
| 1943 | 100 | T | F | for(size_t j=0; j<num_headers; j++) { |
| 1945 | 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 1946 | 50 | T | F | SV **restrict cell_ptr = inner_hv ? hv_fetch(inner_hv, col_name, strlen(col_name), 0) : NULL; |
| 1947 | 100 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 100 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 1948 | 100 | T | F | if (SvROK(*cell_ptr)) { |
| 1952 | 50 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 1953 | 50 | T | F | if (rows_av) SvREFCNT_dec(rows_av); |
| 1965 | 100 | T | F | } else if (is_hoa) { // ----- Hash of Arrays ----- |
| 1970 | 100 | T | F | while((entry = hv_iternext(data_hv))) { |
| 1973 | 100 | T | F | if (len > max_rows) max_rows = len; |
| 1976 | 100 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 50 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 1978 | 100 | T | F | for(size_t i=0; i<=av_len(c_av); i++) { |
| 1980 | 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 1985 | 100 | T | F | for(unsigned int i=0; i<num_cols; i++) { |
| 1990 | 100 | T | F | for(unsigned i=0; i<num_cols; i++) av_push(headers_av, newSVpv(col_array[i], 0)); |
| 1993 | 50 | T | F | if (av_len(headers_av) < 0) croak("Could not get headers in write_table"); |
| 1994 | 100 | T | F | if (inc_rownames && contains_nondigit(row_names_sv)) { |
| 50 | T | F | if (inc_rownames && contains_nondigit(row_names_sv)) { |
| 1998 | 0 | T | F | for(size_t i=0; i<=av_len(headers_av); i++) { |
| 2000 | 0 | T | F | if (!h_ptr || !*h_ptr) continue; |
| 0 | T | F | if (!h_ptr || !*h_ptr) continue; |
| 2002 | 0 | T | F | if (strcmp(SvPV_nolen(h_sv), rownames_col) != 0) { |
| 2012 | 100 | T | F | if (inc_rownames) header_row[h_idx++] = ""; |
| 2013 | 100 | T | F | for(size_t i=0; i<num_headers; i++) { |
| 2015 | 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 2020 | 100 | T | F | for(size_t i=0; i<max_rows; i++) { |
| 2022 | 100 | T | F | if (inc_rownames) { |
| 2023 | 50 | T | F | if (rownames_col) { |
| 2025 | 0 | T | F | if (rn_arr_ptr && SvROK(*rn_arr_ptr)) { |
| 0 | T | F | if (rn_arr_ptr && SvROK(*rn_arr_ptr)) { |
| 2028 | 0 | T | F | if (rn_val_ptr && SvOK(*rn_val_ptr)) { |
| 0 | T | F | if (rn_val_ptr && SvOK(*rn_val_ptr)) { |
| 2029 | 0 | T | F | if (SvROK(*rn_val_ptr)) { |
| 2032 | 0 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 2048 | 100 | T | F | for(size_t j=0; j<num_headers; j++) { |
| 2050 | 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 2052 | 50 | T | F | if (arr_ptr && SvROK(*arr_ptr)) { |
| 50 | T | F | if (arr_ptr && SvROK(*arr_ptr)) { |
| 2055 | 100 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 100 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 2056 | 50 | T | F | if (SvROK(*cell_ptr)) { |
| 2059 | 0 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 2071 | 100 | T | F | if (inc_rownames && !rownames_col) safefree((char*)row_data[0]); |
| 50 | T | F | if (inc_rownames && !rownames_col) safefree((char*)row_data[0]); |
| 2074 | 50 | T | F | } else if (is_aoh) {// ----- Array of Hashes ----- |
| 2077 | 100 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 50 | T | F | if (col_names_sv && SvOK(col_names_sv)) { |
| 2079 | 100 | T | F | for(size_t i=0; i<=av_len(c_av); i++) { |
| 2081 | 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 50 | T | F | if(c && SvOK(*c)) av_push(headers_av, newSVsv(*c)); |
| 2085 | 100 | T | F | for(size_t i=0; i<num_rows; i++) { |
| 2087 | 50 | T | F | if (row_ptr && SvROK(*row_ptr)) { |
| 50 | T | F | if (row_ptr && SvROK(*row_ptr)) { |
| 2091 | 100 | T | F | while((entry = hv_iternext(row_hv))) { |
| 2098 | 100 | T | F | for(unsigned int i=0; i<num_cols; i++) { |
| 2103 | 100 | T | F | for(unsigned int i=0; i<num_cols; i++) av_push(headers_av, newSVpv(col_array[i], 0)); |
| 2107 | 100 | T | F | if (inc_rownames && contains_nondigit(row_names_sv)) { |
| 50 | T | F | if (inc_rownames && contains_nondigit(row_names_sv)) { |
| 2110 | 0 | T | F | for(size_t i=0; i<=av_len(headers_av); i++) { |
| 2112 | 0 | T | F | if (!h_ptr || !*h_ptr) continue; |
| 0 | T | F | if (!h_ptr || !*h_ptr) continue; |
| 2114 | 0 | T | F | if (strcmp(SvPV_nolen(h_sv), rownames_col) != 0) { |
| 2124 | 100 | T | F | if (inc_rownames) header_row[h_idx++] = ""; |
| 2125 | 100 | T | F | for(size_t i=0; i<num_headers; i++) { |
| 2127 | 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | header_row[h_idx++] = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 2132 | 100 | T | F | for(size_t i=0; i<num_rows; i++) { |
| 2135 | 50 | T | F | HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL; |
| 50 | T | F | HV *restrict row_hv = (row_ptr && SvROK(*row_ptr)) ? (HV*)SvRV(*row_ptr) : NULL; |
| 2136 | 100 | T | F | if (inc_rownames) { |
| 2137 | 50 | T | F | if (rownames_col) { |
| 2138 | 0 | T | F | SV **restrict rn_val_ptr = row_hv ? hv_fetch(row_hv, rownames_col, strlen(rownames_col), 0) : NULL; |
| 2139 | 0 | T | F | if (rn_val_ptr && SvOK(*rn_val_ptr)) { |
| 0 | T | F | if (rn_val_ptr && SvOK(*rn_val_ptr)) { |
| 2140 | 0 | T | F | if (SvROK(*rn_val_ptr)) { |
| 2143 | 0 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 2157 | 100 | T | F | for(size_t j=0; j<num_headers; j++) { |
| 2159 | 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 50 | T | F | const char *restrict col_name = (h_ptr && SvOK(*h_ptr)) ? SvPV_nolen(*h_ptr) : ""; |
| 2160 | 50 | T | F | SV **restrict cell_ptr = row_hv ? hv_fetch(row_hv, col_name, strlen(col_name), 0) : NULL; |
| 2161 | 100 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 50 | T | F | if (cell_ptr && SvOK(*cell_ptr)) { |
| 2162 | 50 | T | F | if (SvROK(*cell_ptr)) { |
| 2165 | 0 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 2174 | 100 | T | F | if (inc_rownames && !rownames_col) safefree((char*)row_data[0]); |
| 50 | T | F | if (inc_rownames && !rownames_col) safefree((char*)row_data[0]); |
| 2178 | 50 | T | F | if (headers_av) SvREFCNT_dec(headers_av); |
| 2179 | 100 | T | F | if (rows_av) SvREFCNT_dec(rows_av); |
| 2196 | 50 | T | F | if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) { |
| 50 | T | F | if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) { |
| 50 | T | F | if (SvOK(callback) && SvROK(callback) && SvTYPE(SvRV(callback)) == SVt_PVCV) { |
| 2201 | 50 | T | F | sep_len = sep_str ? strlen(sep_str) : 0; |
| 2202 | 50 | T | F | comment_len = comment_str ? strlen(comment_str) : 0; |
| 2205 | 50 | T | F | if (!fp) { |
| 2210 | 100 | T | F | while (sv_gets(line_sv, fp, 0) != NULL) { |
| 2214 | 50 | T | F | if (len > 0 && line[len-1] == '\n') { |
| 100 | T | F | if (len > 0 && line[len-1] == '\n') { |
| 2216 | 50 | T | F | if (len > 0 && line[len-1] == '\r') { |
| 100 | T | F | if (len > 0 && line[len-1] == '\r') { |
| 2220 | 100 | T | F | if (!in_quotes) { |
| 2223 | 50 | T | F | for (size_t i = 0; i < len; i++) { |
| 2224 | 50 | T | F | if (line[i] != ' ' && line[i] != '\t') { is_empty = 0; break; } |
| 100 | T | F | if (line[i] != ' ' && line[i] != '\t') { is_empty = 0; break; } |
| 2226 | 50 | T | F | if (is_empty) continue; |
| 2229 | 50 | T | F | if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) { |
| 50 | T | F | if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) { |
| 50 | T | F | if (comment_len > 0 && len >= comment_len && strncmp(line, comment_str, comment_len) == 0) { |
| 2234 | 100 | T | F | for (size_t i = 0; i < len; i++) { |
| 2236 | 100 | T | F | if (ch == '\r') continue; |
| 2237 | 100 | T | F | if (ch == '"') { |
| 2238 | 100 | T | F | if (in_quotes && (i + 1 < len) && line[i+1] == '"') { |
| 100 | T | F | if (in_quotes && (i + 1 < len) && line[i+1] == '"') { |
| 100 | T | F | if (in_quotes && (i + 1 < len) && line[i+1] == '"') { |
| 2241 | 100 | T | F | } else if (in_quotes) { |
| 2244 | 100 | T | F | } else if (!post_quote) { |
| 2247 | 100 | T | F | } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) { |
| 50 | T | F | } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) { |
| 50 | T | F | } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) { |
| 100 | T | F | } else if (!in_quotes && sep_len > 0 && (len - i) >= sep_len && strncmp(line + i, sep_str, sep_len) == 0) { |
| 2256 | 100 | T | F | if (in_quotes) { |
| 2265 | 50 | T | F | if (use_cb) { |
| 2269 | 50 | T | F | PUSHMARK(SP); |
| 2270 | 50 | T | F | XPUSHs(sv_2mortal(newRV_inc((SV*)current_row))); |
| 2273 | 50 | T | F | FREETMPS; |
| 2285 | 100 | T | F | if (in_quotes) { |
| 2287 | 50 | T | F | if (use_cb) { |
| 2291 | 50 | T | F | PUSHMARK(SP); |
| 2292 | 50 | T | F | XPUSHs(sv_2mortal(newRV_inc((SV*)current_row))); |
| 2295 | 50 | T | F | FREETMPS; |
| 2306 | 50 | T | F | if (use_cb) { |
| 2318 | 50 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) { |
| 2321 | 50 | T | F | if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!SvROK(y_sv) || SvTYPE(SvRV(y_sv)) != SVt_PVAV) { |
| 2326 | 100 | T | F | if (strcmp(method, "pearson") != 0 && |
| 2327 | 100 | T | F | strcmp(method, "spearman") != 0 && |
| 2328 | 50 | T | F | strcmp(method, "kendall") != 0) { |
| 2337 | 50 | T | F | if (nx != ny) { |
| 2348 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 2353 | 50 | T | F | double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN; |
| 50 | T | F | double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN; |
| 50 | T | F | double xv = (x_tv && SvOK(*x_tv) && looks_like_number(*x_tv)) ? SvNV(*x_tv) : NAN; |
| 2354 | 50 | T | F | double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN; |
| 50 | T | F | double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN; |
| 50 | T | F | double yv = (y_tv && SvOK(*y_tv) && looks_like_number(*y_tv)) ? SvNV(*y_tv) : NAN; |
| 2357 | 50 | T | F | if (!isnan(xv) && !isnan(yv)) { |
| 50 | T | F | if (!isnan(xv) && !isnan(yv)) { |
| 2365 | 50 | T | F | if (n < 2) { |
| 2373 | 100 | T | F | if (strcmp(method, "kendall") == 0) { |
| 2375 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 2376 | 100 | T | F | for (size_t j = 0; j < n; j++) { |
| 2385 | 100 | T | F | if (strcmp(method, "spearman") == 0) { |
| 2394 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 2406 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 2462 | 50 | T | F | if (items % 2 != 0) croak("Usage: glm(formula => 'am ~ wt + hp', data => \\%mtcars)"); |
| 2464 | 100 | T | F | for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) { |
| 2467 | 100 | T | F | if (strEQ(key, "formula")) formula = SvPV_nolen(val); |
| 2468 | 100 | T | F | else if (strEQ(key, "data")) data_sv = val; |
| 2469 | 50 | T | F | else if (strEQ(key, "family")) family_str = SvPV_nolen(val); |
| 2472 | 50 | T | F | if (!formula) croak("glm: formula is required"); |
| 2473 | 50 | T | F | if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference"); |
| 50 | T | F | if (!data_sv || !SvROK(data_sv)) croak("glm: data is required and must be a reference"); |
| 2477 | 100 | T | F | if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str); |
| 50 | T | F | if (!is_binomial && !is_gaussian) croak("glm: unsupported family '%s'", family_str); |
| 2485 | 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 50 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 2489 | 50 | T | F | if (!tilde) croak("glm: invalid formula, missing '~'"); |
| 2493 | 50 | T | F | if (strstr(rhs, "-1")) has_intercept = false; |
| 2494 | 50 | T | F | if (has_intercept) terms[num_terms++] = savepv("Intercept"); |
| 2497 | 100 | T | F | while (chunk != NULL) { |
| 2498 | 50 | T | F | if (num_terms >= term_cap - 3) { |
| 2502 | 50 | T | F | if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) { |
| 50 | T | F | if (strcmp(chunk, "1") == 0 || strcmp(chunk, "-1") == 0) { |
| 2507 | 50 | T | F | if (star) { |
| 2510 | 0 | T | F | char *restrict c_l = strchr(left, '^'); if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 0 | T | F | char *restrict c_l = strchr(left, '^'); if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 2511 | 0 | T | F | char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 0 | T | F | char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 2520 | 50 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 0 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 2526 | 100 | T | F | for (i = 0; i < num_terms; i++) { |
| 2528 | 100 | T | F | for (size_t j = 0; j < num_uniq; j++) { |
| 2529 | 50 | T | F | if (strcmp(terms[i], uniq_terms[j]) == 0) { found = true; break; } |
| 2531 | 50 | T | F | if (!found) uniq_terms[num_uniq++] = savepv(terms[i]); |
| 2537 | 50 | T | F | if (SvTYPE(ref) == SVt_PVHV) { |
| 2539 | 50 | T | F | if (hv_iterinit(hv) == 0) croak("glm: Data hash is empty"); |
| 2541 | 50 | T | F | if (entry) { |
| 2543 | 50 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 100 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 2546 | 50 | T | F | Newx(row_names, n, char*); |
| 2547 | 100 | T | F | for(i = 0; i < n; i++) { |
| 2551 | 50 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 50 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 2553 | 50 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 50 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 2555 | 100 | T | F | while ((entry = hv_iternext(hv))) { |
| 2563 | 0 | T | F | } else if (SvTYPE(ref) == SVt_PVAV) { |
| 2566 | 0 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 0 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 2567 | 0 | T | F | for (i = 0; i < n; i++) { |
| 2569 | 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 2574 | 0 | T | F | for (size_t k = 0; k < i; k++) Safefree(row_names[k]); |
| 2582 | 100 | T | F | for (size_t j = 0; j < p; j++) { |
| 2583 | 50 | T | F | if (p_exp + 32 >= exp_cap) { |
| 2588 | 100 | T | F | if (strcmp(uniq_terms[j], "Intercept") == 0) { |
| 2591 | 100 | T | F | if (is_column_categorical(data_hoa, row_hashes, n, uniq_terms[j])) { |
| 2593 | 50 | T | F | Newx(levels, levels_cap, char*); |
| 2594 | 100 | T | F | for (i = 0; i < n; i++) { |
| 2596 | 50 | T | F | if (str_val) { |
| 2598 | 100 | T | F | for (size_t l = 0; l < num_levels; l++) { |
| 2599 | 100 | T | F | if (strcmp(levels[l], str_val) == 0) { found = true; break; } |
| 2601 | 100 | T | F | if (!found) { |
| 2602 | 50 | T | F | if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); } |
| 0 | T | F | if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); } |
| 2608 | 50 | T | F | if (num_levels > 0) { |
| 2609 | 100 | T | F | for (size_t l1 = 0; l1 < num_levels - 1; l1++) { |
| 2610 | 100 | T | F | for (size_t l2 = l1 + 1; l2 < num_levels; l2++) { |
| 2611 | 50 | T | F | if (strcmp(levels[l1], levels[l2]) > 0) { |
| 2616 | 100 | T | F | for (size_t l = 1; l < num_levels; l++) { |
| 2617 | 50 | T | F | if (p_exp >= exp_cap) { |
| 2628 | 100 | T | F | for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]); |
| 2639 | 50 | T | F | Newx(X, n * p, double); Newx(Y, n, double); |
| 50 | T | F | Newx(X, n * p, double); Newx(Y, n, double); |
| 2640 | 50 | T | F | Newx(valid_row_names, n, char*); |
| 2643 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 2645 | 50 | T | F | if (isnan(y_val)) { Safefree(row_names[i]); continue; } |
| 2649 | 100 | T | F | for (size_t j = 0; j < p; j++) { |
| 2650 | 100 | T | F | if (strcmp(exp_terms[j], "Intercept") == 0) { |
| 2652 | 100 | T | F | } else if (is_dummy[j]) { |
| 2654 | 50 | T | F | if (str_val) { |
| 2655 | 100 | T | F | row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0; |
| 2660 | 50 | T | F | if (isnan(row_x[j])) { row_ok = false; break; } |
| 2663 | 50 | T | F | if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; } |
| 2665 | 100 | T | F | for (size_t j = 0; j < p; j++) X[valid_n * p + j] = row_x[j]; |
| 2671 | 50 | T | F | if (valid_n <= p) { |
| 2672 | 0 | T | F | Safefree(X); Safefree(Y); Safefree(valid_row_names); if (row_hashes) Safefree(row_hashes); |
| 2681 | 100 | T | F | for (i = 0; i < p; i++) { beta[i] = 0.0; beta_old[i] = 0.0; } |
| 2684 | 100 | T | F | for (i = 0; i < valid_n; i++) sum_y += Y[i]; |
| 2686 | 100 | T | F | for (i = 0; i < valid_n; i++) { |
| 2687 | 100 | T | F | if (is_binomial) { |
| 2688 | 50 | T | F | if (Y[i] < 0.0 || Y[i] > 1.0) croak("glm: binomial family requires response between 0 and 1"); |
| 50 | T | F | if (Y[i] < 0.0 || Y[i] > 1.0) croak("glm: binomial family requires response between 0 and 1"); |
| 2692 | 100 | T | F | if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]); |
| 2693 | 50 | T | F | else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]); |
| 2702 | 50 | T | F | for (iter = 1; iter <= max_iter; iter++) { |
| 2703 | 100 | T | F | for (i = 0; i < valid_n; i++) { |
| 2704 | 100 | T | F | if (is_binomial) { |
| 2707 | 50 | T | F | if (varmu < 1e-10) varmu = 1e-10; |
| 2716 | 100 | T | F | for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; } |
| 100 | T | F | for (i = 0; i < p; i++) { XtWZ[i] = 0.0; for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; } |
| 2717 | 100 | T | F | for (size_t k = 0; k < valid_n; k++) { |
| 2719 | 100 | T | F | for (i = 0; i < p; i++) { |
| 2722 | 100 | T | F | for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j]; |
| 2726 | 100 | T | F | for (i = 0; i < p; i++) { |
| 2727 | 50 | T | F | if (aliased[i]) { beta[i] = NAN; } else { |
| 2729 | 50 | T | F | for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j]; |
| 100 | T | F | for (size_t j = 0; j < p; j++) if (!aliased[j]) sum += XtWX[i * p + j] * XtWZ[j]; |
| 2735 | 100 | T | F | for (unsigned short int half = 0; half < 10; half++) { |
| 2737 | 100 | T | F | for (i = 0; i < valid_n; i++) { |
| 2739 | 50 | T | F | for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j]; |
| 100 | T | F | for (size_t j = 0; j < p; j++) if (!aliased[j]) linear_pred += X[i * p + j] * beta[j]; |
| 2741 | 100 | T | F | if (is_binomial) { |
| 2744 | 50 | T | F | if (mu[i] < 10 * DBL_EPSILON) mu[i] = 10 * DBL_EPSILON; |
| 2745 | 50 | T | F | if (mu[i] > 1.0 - 10 * DBL_EPSILON) mu[i] = 1.0 - 10 * DBL_EPSILON; |
| 2748 | 100 | T | F | if (Y[i] == 0.0) dev = -2.0 * log(1.0 - mu[i]); |
| 2749 | 50 | T | F | else if (Y[i] == 1.0) dev = -2.0 * log(mu[i]); |
| 2759 | 100 | T | F | if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) { |
| 100 | T | F | if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) { |
| 50 | T | F | if (!is_binomial || deviance_new <= deviance_old + 1e-7 || !isfinite(deviance_new)) { |
| 2764 | 100 | T | F | for (size_t j = 0; j < p; j++) beta[j] = (beta[j] + beta_old[j]) / 2.0; |
| 2767 | 100 | T | F | if (fabs(deviance_new - deviance_old) / (0.1 + fabs(deviance_new)) < epsilon) { |
| 2771 | 100 | T | F | for (size_t j = 0; j < p; j++) beta_old[j] = beta[j]; |
| 2774 | 100 | T | F | for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; } |
| 100 | T | F | for (i = 0; i < p; i++) { for (size_t j = 0; j < p; j++) XtWX[i * p + j] = 0.0; } |
| 2775 | 100 | T | F | for (size_t k = 0; k < valid_n; k++) { |
| 2776 | 100 | T | F | double w = is_binomial ? (mu[k] * (1.0 - mu[k])) : 1.0; |
| 2777 | 50 | T | F | if (w < 1e-10) w = 1e-10; |
| 2778 | 100 | T | F | for (i = 0; i < p; i++) { |
| 2780 | 100 | T | F | for (size_t j = 0; j < p; j++) XtWX[i * p + j] += xw * X[k * p + j]; |
| 2786 | 100 | T | F | for (i = 0; i < valid_n; i++) { |
| 2787 | 100 | T | F | if (is_binomial) { |
| 2788 | 100 | T | F | if (Y[i] == 0.0) null_dev += -2.0 * log(1.0 - wtdmu); |
| 2789 | 50 | T | F | else if (Y[i] == 1.0) null_dev += -2.0 * log(wtdmu); |
| 2797 | 100 | T | F | if (is_gaussian) { |
| 2800 | 50 | T | F | } else if (is_binomial) { |
| 2806 | 100 | T | F | dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN); |
| 50 | T | F | dispersion = is_binomial ? 1.0 : ((df_res > 0) ? (deviance_new / df_res) : NAN); |
| 2807 | 100 | T | F | for (size_t i = 0; i < valid_n; i++) { |
| 2809 | 100 | T | F | if (is_binomial) { |
| 2812 | 100 | T | F | if (Y[i] == 0.0) d_res = sqrt(-2.0 * log(1.0 - mu[i])); |
| 2813 | 50 | T | F | else if (Y[i] == 1.0) d_res = sqrt(-2.0 * log(mu[i])); |
| 2815 | 100 | T | F | res = (Y[i] > mu[i]) ? d_res : -d_res; |
| 2824 | 100 | T | F | for (size_t j = 0; j < p; j++) { |
| 2829 | 50 | T | F | if (aliased[j]) { |
| 2832 | 0 | T | F | hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVpv("NaN", 0), 0); |
| 2833 | 0 | T | F | hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVpv("NaN", 0), 0); |
| 2837 | 100 | T | F | double p_val = is_binomial ? 2.0 * (1.0 - approx_pnorm(fabs(val_stat))) : get_t_pvalue(val_stat, df_res, "two.sided"); |
| 2841 | 100 | T | F | hv_store(row_hv, is_binomial ? "z value" : "t value", 7, newSVnv(val_stat), 0); |
| 2842 | 100 | T | F | hv_store(row_hv, is_binomial ? "Pr(>|z|)" : "Pr(>|t|)", 8, newSVnv(p_val), 0); |
| 2864 | 100 | T | F | for (i = 0; i < num_terms; i++) Safefree(terms[i]); |
| 2866 | 100 | T | F | for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); |
| 2868 | 100 | T | F | for (size_t j = 0; j < p_exp; j++) { |
| 2870 | 100 | T | F | if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); } |
| 2877 | 100 | T | F | if (row_hashes) Safefree(row_hashes); |
| 2887 | 50 | T | F | if (items < 2 || items % 2 != 0) |
| 50 | T | F | if (items < 2 || items % 2 != 0) |
| 2899 | 100 | T | F | for (unsigned short int i = 2; i < items; i += 2) { |
| 2903 | 100 | T | F | if (strEQ(key, "alternative")) alternative = SvPV_nolen(val); |
| 2904 | 100 | T | F | else if (strEQ(key, "method")) method = SvPV_nolen(val); |
| 2905 | 50 | T | F | else if (strEQ(key, "exact")) exact_sv = val; |
| 2906 | 100 | T | F | else if (strEQ(key, "conf.level") || strEQ(key, "conf_level")) conf_level = SvNV(val); |
| 50 | T | F | else if (strEQ(key, "conf.level") || strEQ(key, "conf_level")) conf_level = SvNV(val); |
| 2907 | 50 | T | F | else if (strEQ(key, "continuity")) continuity = SvTRUE(val); |
| 2920 | 50 | T | F | if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV || |
| 50 | T | F | if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV || |
| 50 | T | F | if (!SvOK(x_ref) || !SvROK(x_ref) || SvTYPE(SvRV(x_ref)) != SVt_PVAV || |
| 2921 | 50 | T | F | !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) { |
| 50 | T | F | !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) { |
| 50 | T | F | !SvOK(y_ref) || !SvROK(y_ref) || SvTYPE(SvRV(y_ref)) != SVt_PVAV) { |
| 2929 | 50 | T | F | if (n_raw != av_len(y_av) + 1) croak("incompatible dimensions"); |
| 2935 | 100 | T | F | for (size_t i = 0; i < n_raw; i++) { |
| 2939 | 50 | T | F | double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN; |
| 100 | T | F | double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN; |
| 50 | T | F | double xv = (x_val && SvOK(*x_val) && looks_like_number(*x_val)) ? SvNV(*x_val) : NAN; |
| 2940 | 50 | T | F | double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN; |
| 100 | T | F | double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN; |
| 50 | T | F | double yv = (y_val && SvOK(*y_val) && looks_like_number(*y_val)) ? SvNV(*y_val) : NAN; |
| 2943 | 100 | T | F | if (!isnan(xv) && !isnan(yv)) { |
| 100 | T | F | if (!isnan(xv) && !isnan(yv)) { |
| 2950 | 50 | T | F | if (n < 3) { |
| 2956 | 100 | T | F | if (is_pearson) { |
| 2959 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 2968 | 50 | T | F | estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0; |
| 50 | T | F | estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0; |
| 2982 | 100 | T | F | } else if (is_kendall) { |
| 2984 | 100 | T | F | for (size_t i = 0; i < n - 1; i++) { |
| 2985 | 100 | T | F | for (size_t j = i + 1; j < n; j++) { |
| 2989 | 50 | T | F | if (sign_x == 0 && sign_y == 0) { /* Joint tie, ignore */ } |
| 0 | T | F | if (sign_x == 0 && sign_y == 0) { /* Joint tie, ignore */ } |
| 2990 | 50 | T | F | else if (sign_x == 0) tie_x++; |
| 2991 | 50 | T | F | else if (sign_y == 0) tie_y++; |
| 2992 | 100 | T | F | else if (sign_x * sign_y > 0) c++; |
| 2997 | 50 | T | F | estimate = (denom == 0.0) ? (0.0/0.0) : (double)(c - d) / denom; |
| 2999 | 50 | T | F | bool has_ties = (tie_x > 0 || tie_y > 0); |
| 50 | T | F | bool has_ties = (tie_x > 0 || tie_y > 0); |
| 3003 | 50 | T | F | if (!exact_sv || !SvOK(exact_sv)) { |
| 0 | T | F | if (!exact_sv || !SvOK(exact_sv)) { |
| 3004 | 50 | T | F | do_exact = (n < 50) && !has_ties; |
| 50 | T | F | do_exact = (n < 50) && !has_ties; |
| 3009 | 50 | T | F | if (do_exact && has_ties) do_exact = 0; |
| 50 | T | F | if (do_exact && has_ties) do_exact = 0; |
| 3011 | 50 | T | F | if (do_exact) { |
| 3019 | 0 | T | F | if (continuity) S -= (S > 0 ? 1 : -1); |
| 0 | T | F | if (continuity) S -= (S > 0 ? 1 : -1); |
| 3022 | 0 | T | F | if (strcmp(alternative, "two.sided") == 0) { |
| 3024 | 0 | T | F | } else if (strcmp(alternative, "less") == 0) { |
| 3030 | 50 | T | F | } else if (is_spearman) { |
| 3038 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3047 | 50 | T | F | estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0; |
| 50 | T | F | estimate = (M2_x > 0.0 && M2_y > 0.0) ? cov / sqrt(M2_x * M2_y) : 0.0; |
| 3051 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3058 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3059 | 50 | T | F | if (rank_x[i] != floor(rank_x[i]) || rank_y[i] != floor(rank_y[i])) { |
| 50 | T | F | if (rank_x[i] != floor(rank_x[i]) || rank_y[i] != floor(rank_y[i])) { |
| 3064 | 50 | T | F | if (!exact_sv || !SvOK(exact_sv)) { |
| 0 | T | F | if (!exact_sv || !SvOK(exact_sv)) { |
| 3065 | 50 | T | F | do_exact = (n < 10) && !has_ties; |
| 50 | T | F | do_exact = (n < 10) && !has_ties; |
| 3070 | 50 | T | F | if (do_exact) { |
| 3075 | 0 | T | F | if (continuity) |
| 3092 | 100 | T | F | if (is_pearson) { |
| 3114 | 50 | T | F | if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) { |
| 50 | T | F | if (!SvROK(data) || SvTYPE(SvRV(data)) != SVt_PVAV) { |
| 3121 | 50 | T | F | Newx(x, n_raw, double); |
| 3124 | 100 | T | F | for (size_t i = 0; i < n_raw; i++) { |
| 3126 | 50 | T | F | if (elem && SvOK(*elem)) { |
| 50 | T | F | if (elem && SvOK(*elem)) { |
| 3128 | 50 | T | F | if (!isnan(val)) { |
| 3136 | 50 | T | F | if (n < 3 || n > 5000) { |
| 50 | T | F | if (n < 3 || n > 5000) { |
| 3143 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3146 | 50 | T | F | if (ssq == 0.0) { |
| 3153 | 50 | T | F | if (n == 3) { |
| 3157 | 0 | T | F | if (w < 0.75) w = 0.75; |
| 3163 | 50 | T | F | Newx(m, n, double); |
| 3164 | 50 | T | F | Newx(a, n, double); |
| 3165 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3173 | 50 | T | F | if (n == 4 || n == 5) { |
| 100 | T | F | if (n == 4 || n == 5) { |
| 3175 | 100 | T | F | for (unsigned int i = 1; i < n-1; i++) { |
| 3183 | 100 | T | F | for (unsigned int i = 2; i < n-2; i++) { |
| 3187 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3197 | 100 | T | F | if (n <= 11) { |
| 3203 | 50 | T | F | if (y >= gamma) { |
| 3226 | 50 | T | F | if (p_val > 1.0) p_val = 1.0; |
| 3227 | 50 | T | F | if (p_val < 0.0) p_val = 0.0; |
| 3237 | 50 | T | F | EXTEND(SP, 1); |
| 3247 | 100 | T | F | for (unsigned short int i = 0; i < items; i++) { |
| 3249 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 3252 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 3254 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3256 | 100 | T | F | if (first || val < min_val) { |
| 50 | T | F | if (first || val < min_val) { |
| 3263 | 50 | T | F | } else if (SvOK(arg)) { |
| 3265 | 100 | T | F | if (first || val < min_val) { |
| 100 | T | F | if (first || val < min_val) { |
| 3272 | 100 | T | F | if (count == 0) croak("min needs >= 1 numeric element"); |
| 3273 | 50 | T | F | RETVAL = min_val; |
| 3284 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 3286 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 3289 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 3291 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3293 | 100 | T | F | if (first || val > max_val) { |
| 100 | T | F | if (first || val > max_val) { |
| 3300 | 50 | T | F | } else if (SvOK(arg)) { |
| 3302 | 100 | T | F | if (first || val > max_val) { |
| 100 | T | F | if (first || val > max_val) { |
| 3309 | 100 | T | F | if (count == 0) croak("max needs >= 1 numeric element"); |
| 3310 | 50 | T | F | RETVAL = max_val; |
| 3325 | 50 | T | F | if (items == 0) { |
| 3329 | 100 | T | F | while (i < items) { |
| 3331 | 100 | T | F | if (i + 1 < items && SvPOK(ST(i))) { |
| 100 | T | F | if (i + 1 < items && SvPOK(ST(i))) { |
| 3333 | 100 | T | F | if (strEQ(key, "n")) { |
| 3338 | 100 | T | F | } else if (strEQ(key, "min")) { |
| 3343 | 50 | T | F | } else if (strEQ(key, "max")) { |
| 3352 | 100 | T | F | if (!n_set) { |
| 3355 | 100 | T | F | } else if (!min_set) { |
| 3358 | 50 | T | F | } else if (!max_set) { |
| 3366 | 50 | T | F | if (!n_set) { |
| 3370 | 50 | T | F | AUTO_SEED_PRNG(); |
| 3372 | 50 | T | F | if (n > 0) { |
| 3376 | 100 | T | F | for (size_t j = 0; j < n; j++) { |
| 3378 | 50 | T | F | if (max < min) { |
| 3394 | 50 | T | F | AUTO_SEED_PRNG(); |
| 3395 | 100 | T | F | if (items % 2 != 0) |
| 3403 | 100 | T | F | for (unsigned short i = 0; i < items; i += 2) { |
| 3407 | 100 | T | F | if (strEQ(key, "n")) n = (unsigned int)SvUV(val); |
| 3408 | 100 | T | F | else if (strEQ(key, "size")) { size = (unsigned int)SvUV(val); size_set = true; } |
| 3409 | 50 | T | F | else if (strEQ(key, "prob")) { prob = SvNV(val); prob_set = true; } |
| 3414 | 100 | T | F | if (!size_set || !prob_set) croak("rbinom: 'size' and 'prob' are required arguments"); |
| 100 | T | F | if (!size_set || !prob_set) croak("rbinom: 'size' and 'prob' are required arguments"); |
| 3415 | 100 | T | F | if (prob < 0.0 || prob > 1.0) croak("rbinom: prob must be between 0 and 1"); |
| 100 | T | F | if (prob < 0.0 || prob > 1.0) croak("rbinom: prob must be between 0 and 1"); |
| 3418 | 50 | T | F | if (n > 0) { |
| 3420 | 100 | T | F | for (unsigned int i = 0; i < n; i++) { |
| 3435 | 100 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 100 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 3440 | 100 | T | F | if (n_raw == 0) croak("hist: input array is empty"); |
| 3444 | 50 | T | F | Newx(x, n_raw, double); |
| 3448 | 100 | T | F | for (size_t i = 0; i < n_raw; i++) { |
| 3450 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3453 | 100 | T | F | if (val < min_val) min_val = val; |
| 3454 | 100 | T | F | if (val > max_val) max_val = val; |
| 3457 | 50 | T | F | if (n == 0) { |
| 3464 | 50 | T | F | if (items == 2) { |
| 3467 | 50 | T | F | } else if (items > 2) { |
| 3469 | 50 | T | F | for (unsigned short i = 1; i < items - 1; i++) { |
| 3471 | 50 | T | F | if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) { |
| 50 | T | F | if (SvPOK(ST(i)) && strEQ(SvPV_nolen(ST(i)), "breaks")) { |
| 3477 | 50 | T | F | if (n_bins == 0 && looks_like_number(ST(1))) { |
| 0 | T | F | if (n_bins == 0 && looks_like_number(ST(1))) { |
| 3481 | 50 | T | F | if (n_bins == 0) n_bins = calculate_sturges_bins(n); |
| 3485 | 50 | T | F | Newx(breaks, n_bins + 1, double); |
| 3486 | 50 | T | F | Newx(mids, n_bins, double); |
| 3487 | 50 | T | F | Newx(density, n_bins, double); |
| 3488 | 50 | T | F | Newx(counts, n_bins, size_t); |
| 3492 | 100 | T | F | for (size_t i = 0; i <= n_bins; i++) { |
| 3505 | 100 | T | F | for (size_t i = 0; i <= n_bins; i++) { |
| 3507 | 100 | T | F | if (i < n_bins) { |
| 3535 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 3541 | 50 | T | F | if ((items - arg_idx) % 2 != 0) |
| 3544 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 3548 | 100 | T | F | if (strEQ(key, "x")) x_sv = val; |
| 3549 | 50 | T | F | else if (strEQ(key, "probs")) probs_sv = val; |
| 3552 | 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 3556 | 50 | T | F | if (n_raw == 0) croak("quantile: 'x' is empty"); |
| 3560 | 50 | T | F | Newx(x, n_raw, double); |
| 3562 | 100 | T | F | for (size_t i = 0; i < n_raw; i++) { |
| 3564 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3568 | 50 | T | F | if (n == 0) { |
| 3579 | 50 | T | F | if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) { |
| 50 | T | F | if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) { |
| 50 | T | F | if (probs_sv && SvROK(probs_sv) && SvTYPE(SvRV(probs_sv)) == SVt_PVAV) { |
| 3583 | 100 | T | F | for (unsigned int i = 0; i < n_probs; i++) { |
| 3585 | 50 | T | F | probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0; |
| 50 | T | F | probs[i] = (tv && SvOK(*tv)) ? SvNV(*tv) : 0.0; |
| 3586 | 50 | T | F | if (probs[i] < 0.0 || probs[i] > 1.0) { |
| 50 | T | F | if (probs[i] < 0.0 || probs[i] > 1.0) { |
| 3593 | 0 | T | F | for (unsigned int i = 0; i < n_probs; i++) probs[i] = default_probs[i]; |
| 3599 | 100 | T | F | for (size_t i = 0; i < n_probs; i++) { |
| 3602 | 100 | T | F | if (n == 1) { |
| 3604 | 100 | T | F | } else if (p == 1.0) { |
| 3606 | 100 | T | F | } else if (p == 0.0) { |
| 3620 | 50 | T | F | if (pct == (unsigned int)pct) { |
| 3644 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 3646 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 3649 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 3651 | 50 | T | F | if (tv && SvOK(*tv)) { total += SvNV(*tv); count++; } |
| 50 | T | F | if (tv && SvOK(*tv)) { total += SvNV(*tv); count++; } |
| 3653 | 50 | T | F | } else if (SvOK(arg)) { |
| 3657 | 100 | T | F | if (count == 0) croak("mean needs >= 1 element"); |
| 3658 | 100 | T | F | RETVAL = total / count; |
| 3669 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 3671 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 3674 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 3676 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3684 | 50 | T | F | } else if (SvOK(arg)) { |
| 3692 | 100 | T | F | if (count < 2) croak("stdev needs >= 2 elements"); |
| 3693 | 50 | T | F | RETVAL = sqrt(M2 / (count - 1)); |
| 3704 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 3706 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 3709 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 3711 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 3719 | 50 | T | F | } else if (SvOK(arg)) { |
| 3727 | 100 | T | F | if (count < 2) croak("var needs >= 2 elements"); |
| 3728 | 100 | T | F | RETVAL = M2 / (count - 1); |
| 3744 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 3750 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx)) && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 3756 | 50 | T | F | if ((items - arg_idx) % 2 != 0) { |
| 3761 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 3765 | 100 | T | F | if (strEQ(key, "x")) x_sv = val; |
| 3766 | 100 | T | F | else if (strEQ(key, "y")) y_sv = val; |
| 3767 | 100 | T | F | else if (strEQ(key, "mu")) mu = SvNV(val); |
| 3768 | 100 | T | F | else if (strEQ(key, "paired")) paired = SvTRUE(val); |
| 3769 | 100 | T | F | else if (strEQ(key, "var_equal")) var_equal = SvTRUE(val); |
| 3770 | 100 | T | F | else if (strEQ(key, "conf_level")) conf_level = SvNV(val); |
| 3771 | 50 | T | F | else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val); |
| 3776 | 100 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 3780 | 50 | T | F | if (nx < 2) croak("t_test: 'x' needs at least 2 elements"); |
| 3782 | 100 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) |
| 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) |
| 50 | T | F | if (y_sv && SvROK(y_sv) && SvTYPE(SvRV(y_sv)) == SVt_PVAV) |
| 3785 | 50 | T | F | if (conf_level <= 0.0 || conf_level >= 1.0) |
| 100 | T | F | if (conf_level <= 0.0 || conf_level >= 1.0) |
| 3790 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 3792 | 50 | T | F | double val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0; |
| 50 | T | F | double val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0; |
| 3798 | 100 | T | F | if (var_x == 0.0 && !y_av) croak("t_test: data are essentially constant"); |
| 50 | T | F | if (var_x == 0.0 && !y_av) croak("t_test: data are essentially constant"); |
| 3800 | 100 | T | F | if (paired || y_av) { |
| 100 | T | F | if (paired || y_av) { |
| 3801 | 100 | T | F | if (!y_av) croak("t_test: 'y' must be provided for paired or two-sample tests"); |
| 3803 | 100 | T | F | if (paired && ny != nx) croak("t_test: Paired arrays must be same length"); |
| 100 | T | F | if (paired && ny != nx) croak("t_test: Paired arrays must be same length"); |
| 3805 | 100 | T | F | for (size_t i = 0; i < ny; i++) { |
| 3807 | 50 | T | F | double val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0; |
| 50 | T | F | double val = (tv && SvOK(*tv)) ? SvNV(*tv) : 0; |
| 3813 | 100 | T | F | if (paired) { |
| 3815 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 3818 | 50 | T | F | double dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0; |
| 50 | T | F | double dx = (dx_ptr && SvOK(*dx_ptr)) ? SvNV(*dx_ptr) : 0.0; |
| 3819 | 50 | T | F | double dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0; |
| 50 | T | F | double dy = (dy_ptr && SvOK(*dy_ptr)) ? SvNV(*dy_ptr) : 0.0; |
| 3826 | 50 | T | F | if (var_d == 0.0) croak("t_test: data are essentially constant"); |
| 3832 | 100 | T | F | } else if (var_equal) { |
| 3833 | 50 | T | F | if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant"); |
| 0 | T | F | if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant"); |
| 3842 | 50 | T | F | if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant"); |
| 0 | T | F | if (var_x == 0.0 && var_y == 0.0) croak("t_test: data are essentially constant"); |
| 3862 | 100 | T | F | if (strcmp(alternative, "less") == 0) { |
| 3866 | 100 | T | F | } else if (strcmp(alternative, "greater") == 0) { |
| 3889 | 100 | T | F | if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!SvROK(p_sv) || SvTYPE(SvRV(p_sv)) != SVt_PVAV) { |
| 3895 | 100 | T | F | if (n == 0) { |
| 3901 | 100 | T | F | for(unsigned short int i = 0; meth[i]; i++) meth[i] = tolower(meth[i]); |
| 3903 | 100 | T | F | if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh"); |
| 100 | T | F | if (strstr(meth, "benjamini") && strstr(meth, "hochberg")) strcpy(meth, "bh"); |
| 3904 | 100 | T | F | if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by"); |
| 50 | T | F | if (strstr(meth, "benjamini") && strstr(meth, "yekutieli")) strcpy(meth, "by"); |
| 3905 | 50 | T | F | if (strcmp(meth, "fdr") == 0) strcpy(meth, "bh"); |
| 3909 | 50 | T | F | Newx(arr, n, PVal); |
| 3910 | 50 | T | F | Newx(adj, n, double); |
| 3912 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3914 | 50 | T | F | arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0; |
| 50 | T | F | arr[i].p = (tv && SvOK(*tv)) ? SvNV(*tv) : 1.0; |
| 3920 | 100 | T | F | if (strcmp(meth, "bonferroni") == 0) { |
| 3921 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3923 | 100 | T | F | adj[arr[i].orig_idx] = (v < 1.0) ? v : 1.0; |
| 3925 | 100 | T | F | } else if (strcmp(meth, "holm") == 0) { |
| 3927 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3929 | 100 | T | F | if (v > cummax) cummax = v; |
| 3930 | 100 | T | F | adj[arr[i].orig_idx] = (cummax < 1.0) ? cummax : 1.0; |
| 3932 | 100 | T | F | } else if (strcmp(meth, "hochberg") == 0) { |
| 3934 | 100 | T | F | for (ssize_t i = n - 1; i >= 0; i--) { |
| 3936 | 100 | T | F | if (v < cummin) cummin = v; |
| 3937 | 50 | T | F | adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0; |
| 3939 | 100 | T | F | } else if (strcmp(meth, "bh") == 0) { |
| 3941 | 100 | T | F | for (ssize_t i = n - 1; i >= 0; i--) { |
| 3943 | 100 | T | F | if (v < cummin) cummin = v; |
| 3944 | 50 | T | F | adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0; |
| 3946 | 100 | T | F | } else if (strcmp(meth, "by") == 0) { |
| 3948 | 100 | T | F | for (size_t i = 1; i <= n; i++) q += 1.0 / i; |
| 3950 | 100 | T | F | for (ssize_t i = n - 1; i >= 0; i--) { |
| 3952 | 100 | T | F | if (v < cummin) cummin = v; |
| 3953 | 100 | T | F | adj[arr[i].orig_idx] = (cummin < 1.0) ? cummin : 1.0; |
| 3955 | 100 | T | F | } else if (strcmp(meth, "hommel") == 0) { |
| 3957 | 50 | T | F | Newx(pa, n, double); |
| 3958 | 50 | T | F | Newx(q_arr, n, double); |
| 3961 | 100 | T | F | for (size_t i = 1; i < n; i++) { |
| 3963 | 50 | T | F | if (temp < min_val) { |
| 3968 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3972 | 100 | T | F | for (size_t j = n - 1; j >= 2; j--) { |
| 3977 | 100 | T | F | for (size_t k = 1; k < i2_len; k++) { |
| 3979 | 100 | T | F | if (temp_q1 < q1) { |
| 3984 | 100 | T | F | for (size_t i = 0; i <= n_mj; i++) { |
| 3986 | 100 | T | F | q_arr[i] = (v < q1) ? v : q1; |
| 3989 | 100 | T | F | for (size_t i = 0; i < i2_len; i++) { |
| 3993 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 3994 | 100 | T | F | if (pa[i] < q_arr[i]) { |
| 4000 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 4001 | 100 | T | F | double v = (pa[i] > arr[i].p) ? pa[i] : arr[i].p; |
| 4002 | 50 | T | F | if (v > 1.0) v = 1.0; |
| 4006 | 50 | T | F | } else if (strcmp(meth, "none") == 0) { |
| 4007 | 0 | T | F | for (size_t i = 0; i < n; i++) { |
| 4015 | 50 | T | F | EXTEND(SP, n); |
| 4016 | 100 | T | F | for (size_t i = 0; i < n; i++) { |
| 4030 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 4032 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 4035 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 4037 | 50 | T | F | if (tv && SvOK(*tv)) { total_count++; } |
| 50 | T | F | if (tv && SvOK(*tv)) { total_count++; } |
| 4039 | 50 | T | F | } else if (SvOK(arg)) { |
| 4043 | 100 | T | F | if (total_count == 0) croak("median needs >= 1 element"); |
| 4045 | 50 | T | F | Newx(nums, total_count, double); |
| 4047 | 100 | T | F | for (size_t i = 0; i < items; i++) { |
| 4049 | 100 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 4052 | 100 | T | F | for (size_t j = 0; j < len; j++) { |
| 4054 | 50 | T | F | if (tv && SvOK(*tv)) { |
| 50 | T | F | if (tv && SvOK(*tv)) { |
| 4058 | 50 | T | F | } else if (SvOK(arg)) { |
| 4064 | 100 | T | F | if (total_count % 2 == 0) { |
| 4070 | 100 | T | F | RETVAL = median_val; |
| 4077 | 100 | T | F | if (strcmp(method, "pearson") != 0 && |
| 4078 | 100 | T | F | strcmp(method, "spearman") != 0 && |
| 4079 | 100 | T | F | strcmp(method, "kendall") != 0) |
| 4084 | 50 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 4089 | 50 | T | F | if (nx == 0) croak("cor: x is empty"); |
| 4095 | 50 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 100 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 50 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 4100 | 50 | T | F | bool has_y = (SvOK(y_sv) && SvROK(y_sv) && |
| 50 | T | F | bool has_y = (SvOK(y_sv) && SvROK(y_sv) && |
| 4101 | 50 | T | F | SvTYPE(SvRV(y_sv)) == SVt_PVAV); |
| 4103 | 50 | T | F | AV*restrict y_av = has_y ? (AV*)SvRV(y_sv) : NULL; |
| 4104 | 50 | T | F | size_t ny = has_y ? av_len(y_av) + 1 : 0; |
| 4107 | 50 | T | F | if (has_y && ny > 0) { |
| 50 | T | F | if (has_y && ny > 0) { |
| 4109 | 50 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 100 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 50 | T | F | if (fp && SvROK(*fp) && SvTYPE(SvRV(*fp)) == SVt_PVAV) |
| 4115 | 100 | T | F | if (!x_is_matrix && !y_is_matrix) { |
| 50 | T | F | if (!x_is_matrix && !y_is_matrix) { |
| 4116 | 50 | T | F | if (!has_y) { |
| 4120 | 100 | T | F | if (nx != ny) |
| 4124 | 50 | T | F | if (nx < 2) |
| 4128 | 50 | T | F | Newx(xd, nx, double); |
| 4129 | 50 | T | F | Newx(yd, ny, double); |
| 4131 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 4133 | 50 | T | F | xd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 50 | T | F | xd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 50 | T | F | xd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 4135 | 100 | T | F | for (size_t i = 0; i < ny; i++) { |
| 4137 | 50 | T | F | yd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 50 | T | F | yd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 50 | T | F | yd[i] = (tv && SvOK(*tv) && looks_like_number(*tv)) ? SvNV(*tv) : NAN; |
| 4146 | 50 | T | F | if (!x_is_matrix) |
| 4151 | 50 | T | F | if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV) |
| 50 | T | F | if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV) |
| 50 | T | F | if (!xr0 || !SvROK(*xr0) || SvTYPE(SvRV(*xr0)) != SVt_PVAV) |
| 4155 | 50 | T | F | if (ncols_x == 0) croak("cor: x matrix has zero columns"); |
| 4160 | 100 | T | F | for (size_t i = 0; i < nrows; i++) { |
| 4162 | 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 4166 | 50 | T | F | if (has_y && y_is_matrix) { |
| 50 | T | F | if (has_y && y_is_matrix) { |
| 4167 | 50 | T | F | if (ny != nrows) croak("cor: x and y must have the same number of rows (%lu vs %lu)", nrows, ny); |
| 4168 | 100 | T | F | for (size_t i = 0; i < nrows; i++) { |
| 4170 | 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 50 | T | F | if (!rv || !SvROK(*rv) || SvTYPE(SvRV(*rv)) != SVt_PVAV) |
| 4177 | 50 | T | F | Newx(col_x, ncols_x, double*); |
| 4179 | 100 | T | F | for (size_t j = 0; j < ncols_x; j++) { |
| 4180 | 50 | T | F | Newx(col_x[j], nrows, double); |
| 4181 | 100 | T | F | for (size_t i = 0; i < nrows; i++) { |
| 4185 | 50 | T | F | col_x[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 50 | T | F | col_x[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 50 | T | F | col_x[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 4195 | 50 | T | F | if (has_y && y_is_matrix) { |
| 50 | T | F | if (has_y && y_is_matrix) { |
| 4199 | 50 | T | F | if (ncols_y == 0) croak("cor: y matrix has zero columns"); |
| 4201 | 50 | T | F | Newx(col_y, ncols_y, double*); |
| 4202 | 100 | T | F | for (size_t j = 0; j < ncols_y; j++) { |
| 4203 | 50 | T | F | Newx(col_y[j], nrows, double); |
| 4204 | 100 | T | F | for (size_t i = 0; i < nrows; i++) { |
| 4208 | 50 | T | F | col_y[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 50 | T | F | col_y[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 50 | T | F | col_y[j][i] = (cv && SvOK(*cv) && looks_like_number(*cv)) ? SvNV(*cv) : NAN; |
| 4216 | 50 | T | F | if (nrows < 2) |
| 4223 | 50 | T | F | Newx(rows_out, ncols_x, AV*); |
| 4224 | 100 | T | F | for (size_t i = 0; i < ncols_x; i++) { |
| 4228 | 50 | T | F | if (symmetric) { |
| 4231 | 0 | T | F | Newx(r_cache, ncols_x, double*); |
| 4232 | 0 | T | F | for (size_t i = 0; i < ncols_x; i++) |
| 4233 | 0 | T | F | Newx(r_cache[i], ncols_x, double); |
| 4235 | 0 | T | F | for (size_t i = 0; i < ncols_x; i++) { |
| 4237 | 0 | T | F | for (size_t j = i + 1; j < ncols_x; j++) { |
| 4244 | 0 | T | F | for (size_t i = 0; i < ncols_x; i++) |
| 4245 | 0 | T | F | for (size_t j = 0; j < ncols_x; j++) |
| 4248 | 0 | T | F | for (size_t i = 0; i < ncols_x; i++) Safefree(r_cache[i]); |
| 4252 | 100 | T | F | for (size_t i = 0; i < ncols_x; i++) |
| 4253 | 100 | T | F | for (size_t j = 0; j < ncols_y; j++) |
| 4257 | 100 | T | F | for (size_t i = 0; i < ncols_x; i++) |
| 4261 | 100 | T | F | for (size_t j = 0; j < ncols_x; j++) Safefree(col_x[j]); |
| 4263 | 50 | T | F | if (!symmetric) { |
| 4264 | 100 | T | F | for (size_t j = 0; j < ncols_y; j++) Safefree(col_y[j]); |
| 4280 | 50 | T | F | if (items > 0) { |
| 4282 | 100 | T | F | if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) { |
| 100 | T | F | if (SvROK(last_arg) && SvTYPE(SvRV(last_arg)) == SVt_PVHV) { |
| 4287 | 50 | T | F | if (center_sv) { |
| 4289 | 50 | T | F | if (!SvOK(val_sv)) { |
| 4294 | 50 | T | F | if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 50 | T | F | if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 100 | T | F | if (strcasecmp(str, "mean") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 4296 | 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 4298 | 0 | T | F | } else if (looks_like_number(val_sv)) { |
| 4300 | 0 | T | F | } else if (SvTRUE(val_sv)) { |
| 4309 | 100 | T | F | if (scale_sv) { |
| 4311 | 50 | T | F | if (!SvOK(val_sv)) { |
| 4315 | 50 | T | F | if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 50 | T | F | if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 50 | T | F | if (strcasecmp(str, "sd") == 0 || strcasecmp(str, "true") == 0 || strcmp(str, "1") == 0) { |
| 4317 | 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 50 | T | F | } else if (strcasecmp(str, "none") == 0 || strcasecmp(str, "false") == 0 || strcmp(str, "0") == 0 || strcmp(str, "") == 0) { |
| 4319 | 0 | T | F | } else if (looks_like_number(val_sv)) { |
| 4321 | 0 | T | F | if (scale_val == 0.0) scale_val = 1.0; /* Prevent Division By Zero */ |
| 4322 | 0 | T | F | } else if (SvTRUE(val_sv)) { |
| 4333 | 100 | T | F | if (data_items == 1) { |
| 4335 | 100 | T | F | if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(first_arg) && SvTYPE(SvRV(first_arg)) == SVt_PVAV) { |
| 4337 | 50 | T | F | if (av_len(av) >= 0) { |
| 4339 | 50 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 50 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 50 | T | F | if (first_elem && SvROK(*first_elem) && SvTYPE(SvRV(*first_elem)) == SVt_PVAV) { |
| 4345 | 100 | T | F | if (is_matrix) { |
| 4355 | 50 | T | F | if (nrow == 0 || ncol == 0) croak("scale requires non-empty matrix"); |
| 50 | T | F | if (nrow == 0 || ncol == 0) croak("scale requires non-empty matrix"); |
| 4361 | 100 | T | F | for (size_t r = 0; r < nrow; r++) { |
| 4367 | 100 | T | F | for (size_t c = 0; c < ncol; c++) { |
| 4370 | 50 | T | F | Newx(col_data, nrow, double); |
| 4372 | 100 | T | F | for (size_t r = 0; r < nrow; r++) { |
| 4374 | 50 | T | F | if (row_sv && SvROK(*row_sv)) { |
| 50 | T | F | if (row_sv && SvROK(*row_sv)) { |
| 4377 | 50 | T | F | col_data[r] = (cell_sv && SvOK(*cell_sv)) ? SvNV(*cell_sv) : 0.0; |
| 50 | T | F | col_data[r] = (cell_sv && SvOK(*cell_sv)) ? SvNV(*cell_sv) : 0.0; |
| 4384 | 50 | T | F | double col_center = do_center_mean ? (col_sum / nrow) : center_val; |
| 4387 | 50 | T | F | if (do_scale_sd) { |
| 4388 | 50 | T | F | if (nrow <= 1) { |
| 4394 | 100 | T | F | for (size_t r = 0; r < nrow; r++) { |
| 4401 | 100 | T | F | for (size_t r = 0; r < nrow; r++) { |
| 4403 | 50 | T | F | double final_val = (col_scale == 0.0) ? (0.0 / 0.0) : (centered / col_scale); |
| 4410 | 50 | T | F | EXTEND(SP, 1); |
| 4419 | 100 | T | F | for (size_t i = 0; i < data_items; i++) { |
| 4421 | 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 0 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 4424 | 0 | T | F | for (unsigned int j = 0; j < len; j++) { |
| 4426 | 0 | T | F | if (tv && SvOK(*tv)) { total_count++; } |
| 0 | T | F | if (tv && SvOK(*tv)) { total_count++; } |
| 4428 | 50 | T | F | } else if (SvOK(arg)) { |
| 4432 | 50 | T | F | if (total_count == 0) croak("scale requires at least 1 numeric element"); |
| 4433 | 50 | T | F | Newx(nums, total_count, double); |
| 4434 | 100 | T | F | for (size_t i = 0; i < data_items; i++) { |
| 4436 | 50 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 0 | T | F | if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) { |
| 4439 | 0 | T | F | for (size_t j = 0; j < len; j++) { |
| 4441 | 0 | T | F | if (tv && SvOK(*tv)) { |
| 0 | T | F | if (tv && SvOK(*tv)) { |
| 4446 | 50 | T | F | } else if (SvOK(arg)) { |
| 4452 | 100 | T | F | if (do_center_mean) center_val = sum / total_count; |
| 4454 | 100 | T | F | if (do_scale_sd) { |
| 4455 | 100 | T | F | if (total_count <= 1) { |
| 4460 | 100 | T | F | for (size_t i = 0; i < total_count; i++) { |
| 4466 | 50 | T | F | EXTEND(SP, total_count); |
| 4467 | 100 | T | F | for (size_t i = 0; i < total_count; i++) { |
| 4469 | 50 | T | F | double final_val = (scale_val == 0.0) ? (0.0 / 0.0) : (centered / scale_val); |
| 4479 | 50 | T | F | if (items % 2 != 0) { |
| 4486 | 100 | T | F | for (size_t i = 0; i < items; i += 2) { |
| 4489 | 100 | T | F | if (strEQ(key, "data")) { |
| 4491 | 100 | T | F | } else if (strEQ(key, "nrow")) { |
| 4494 | 50 | T | F | } else if (strEQ(key, "ncol")) { |
| 4497 | 0 | T | F | } else if (strEQ(key, "byrow")) { |
| 4504 | 50 | T | F | if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) { |
| 100 | T | F | if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) { |
| 50 | T | F | if (!data_sv || !SvROK(data_sv) || SvTYPE(SvRV(data_sv)) != SVt_PVAV) { |
| 4508 | 50 | T | F | size_t data_len = (UV)(av_top_index(data_av) + 1); |
| 4509 | 100 | T | F | if (data_len == 0) { |
| 4513 | 50 | T | F | if (!nrow_set && !ncol_set) { |
| 0 | T | F | if (!nrow_set && !ncol_set) { |
| 4516 | 50 | T | F | } else if (nrow_set && !ncol_set) { |
| 100 | T | F | } else if (nrow_set && !ncol_set) { |
| 4518 | 50 | T | F | } else if (!nrow_set && ncol_set) { |
| 0 | T | F | } else if (!nrow_set && ncol_set) { |
| 4522 | 100 | T | F | if (nrow == 0 || ncol == 0) { |
| 50 | T | F | if (nrow == 0 || ncol == 0) { |
| 4530 | 100 | T | F | for (r = 0; r < nrow; r++) { |
| 4537 | 100 | T | F | for (size_t i = 0; i < total_cells; i++) { |
| 4540 | 50 | T | F | SV*restrict val = fetched ? newSVsv(*fetched) : newSV(0); |
| 4541 | 50 | T | F | if (byrow) { |
| 4584 | 50 | T | F | if (items % 2 != 0) croak("Usage: lm(formula => 'mpg ~ wt * hp', data => \\%%mtcars)"); |
| 4586 | 100 | T | F | for (unsigned short i_arg = 0; i_arg < items; i_arg += 2) { |
| 4589 | 100 | T | F | if (strEQ(key, "formula")) formula = SvPV_nolen(val); |
| 4590 | 50 | T | F | else if (strEQ(key, "data")) data_sv = val; |
| 4593 | 100 | T | F | if (!formula) croak("lm: formula is required"); |
| 4594 | 100 | T | F | if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference"); |
| 100 | T | F | if (!data_sv || !SvROK(data_sv)) croak("lm: data is required and must be a reference"); |
| 4600 | 50 | T | F | if (SvTYPE(ref) == SVt_PVHV) { |
| 4602 | 50 | T | F | if (hv_iterinit(hv) == 0) croak("lm: Data hash is empty"); |
| 4604 | 50 | T | F | if (entry) { |
| 4606 | 50 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 100 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 4609 | 50 | T | F | Newx(row_names, n, char*); |
| 4610 | 100 | T | F | for (i = 0; i < n; i++) { |
| 4615 | 50 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 50 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 4617 | 50 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 50 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 4619 | 100 | T | F | while ((entry = hv_iternext(hv))) { |
| 4627 | 0 | T | F | } else if (SvTYPE(ref) == SVt_PVAV) { |
| 4629 | 0 | T | F | Newx(row_names, n, char*); |
| 4630 | 0 | T | F | Newx(row_hashes, n, HV*); |
| 4631 | 0 | T | F | for (i = 0; i < n; i++) { |
| 4633 | 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 4638 | 0 | T | F | for (k = 0; k < i; k++) Safefree(row_names[k]); |
| 4649 | 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 50 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 4653 | 100 | T | F | if (!tilde) { |
| 4654 | 100 | T | F | for (i = 0; i < n; i++) Safefree(row_names[i]); |
| 4655 | 50 | T | F | Safefree(row_names); if (row_hashes) Safefree(row_hashes); |
| 4667 | 100 | T | F | while (*p_idx) { |
| 4669 | 50 | T | F | if (p_idx[0] == 'I' && p_idx[1] == '(') { |
| 0 | T | F | if (p_idx[0] == 'I' && p_idx[1] == '(') { |
| 4671 | 0 | T | F | while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; } |
| 0 | T | F | while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; } |
| 0 | T | F | while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; } |
| 0 | T | F | while (*p_idx) { if (*p_idx == '(') depth++; else if (*p_idx == ')') { depth--; if (depth == 0) { p_idx++; break; } } p_idx++; } |
| 4675 | 100 | T | F | if (p_idx[0] == '-' && p_idx[1] == '1' && |
| 50 | T | F | if (p_idx[0] == '-' && p_idx[1] == '1' && |
| 4676 | 50 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 4682 | 100 | T | F | if (p_idx[0] == '+' && p_idx[1] == '0' && |
| 50 | T | F | if (p_idx[0] == '+' && p_idx[1] == '0' && |
| 4683 | 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 4689 | 100 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') { |
| 50 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') { |
| 0 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '+') { |
| 4695 | 100 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') { |
| 50 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') { |
| 0 | T | F | if (p_idx == rhs && p_idx[0] == '0' && p_idx[1] == '\0') { |
| 4699 | 100 | T | F | if (p_idx[0] == '+' && p_idx[1] == '1' && |
| 50 | T | F | if (p_idx[0] == '+' && p_idx[1] == '1' && |
| 4700 | 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 0 | T | F | (p_idx[2] == '\0' || p_idx[2] == '+' || p_idx[2] == '-')) { |
| 4705 | 100 | T | F | if (p_idx == rhs) { |
| 4706 | 50 | T | F | if (p_idx[0] == '1' && p_idx[1] == '\0') { p_idx[0] = '\0'; break; } |
| 0 | T | F | if (p_idx[0] == '1' && p_idx[1] == '\0') { p_idx[0] = '\0'; break; } |
| 4707 | 50 | T | F | if (p_idx[0] == '1' && p_idx[1] == '+') { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); continue; } |
| 0 | T | F | if (p_idx[0] == '1' && p_idx[1] == '+') { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); continue; } |
| 4716 | 50 | T | F | while ((p_idx = strstr(rhs, "++")) != NULL) |
| 4718 | 50 | T | F | if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1); |
| 4720 | 50 | T | F | if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0'; |
| 50 | T | F | if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0'; |
| 4727 | 100 | T | F | while (chunk != NULL) { |
| 4728 | 100 | T | F | if (strcmp(chunk, ".") == 0) { |
| 4730 | 100 | T | F | for (size_t c = 0; c <= (size_t)av_len(cols); c++) { |
| 4732 | 50 | T | F | if (col_sv && SvOK(*col_sv)) { |
| 50 | T | F | if (col_sv && SvOK(*col_sv)) { |
| 4734 | 100 | T | F | if (strcmp(col_name, lhs) != 0) { |
| 4736 | 50 | T | F | if (rhs_len + slen + 2 < sizeof(rhs_expanded)) { |
| 4737 | 100 | T | F | if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; } |
| 4747 | 50 | T | F | if (rhs_len + slen + 2 < sizeof(rhs_expanded)) { |
| 4748 | 100 | T | F | if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; } |
| 4760 | 100 | T | F | if (has_intercept) { terms[num_terms++] = savepv("Intercept"); } |
| 4762 | 50 | T | F | if (strlen(rhs_expanded) > 0) { |
| 4764 | 100 | T | F | while (chunk != NULL) { |
| 4765 | 50 | T | F | if (num_terms >= term_cap - 3) { |
| 4770 | 100 | T | F | if (star) { |
| 4775 | 50 | T | F | if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 0 | T | F | if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 4777 | 50 | T | F | if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 50 | T | F | if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 4785 | 50 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 0 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 4792 | 100 | T | F | for (i = 0; i < num_terms; i++) { |
| 4794 | 50 | T | F | for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = true; break; } } |
| 100 | T | F | for (j = 0; j < num_uniq; j++) { if (strcmp(terms[i], uniq_terms[j]) == 0) { found = true; break; } } |
| 4795 | 50 | T | F | if (!found) uniq_terms[num_uniq++] = savepv(terms[i]); |
| 4802 | 100 | T | F | for (j = 0; j < p; j++) { |
| 4803 | 50 | T | F | if (p_exp + 32 >= exp_cap) { |
| 4808 | 100 | T | F | if (strcmp(uniq_terms[j], "Intercept") == 0) { |
| 4811 | 100 | T | F | if (is_column_categorical(data_hoa, row_hashes, n, uniq_terms[j])) { |
| 4815 | 100 | T | F | for (i = 0; i < n; i++) { |
| 4817 | 50 | T | F | if (str_val) { |
| 4819 | 100 | T | F | for (l = 0; l < num_levels; l++) { if (strcmp(levels[l], str_val) == 0) { found = true; break; } } |
| 100 | T | F | for (l = 0; l < num_levels; l++) { if (strcmp(levels[l], str_val) == 0) { found = true; break; } } |
| 4820 | 100 | T | F | if (!found) { |
| 4821 | 50 | T | F | if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); } |
| 4827 | 50 | T | F | if (num_levels > 0) { |
| 4828 | 100 | T | F | for (l1 = 0; l1 < num_levels - 1; l1++) |
| 4829 | 100 | T | F | for (l2 = l1 + 1; l2 < num_levels; l2++) |
| 4830 | 100 | T | F | if (strcmp(levels[l1], levels[l2]) > 0) { char *tmp = levels[l1]; levels[l1] = levels[l2]; levels[l2] = tmp; } |
| 4831 | 100 | T | F | for (l = 1; l < num_levels; l++) { |
| 4832 | 50 | T | F | if (p_exp >= exp_cap) { |
| 4845 | 100 | T | F | for (l = 0; l < num_levels; l++) Safefree(levels[l]); |
| 4856 | 50 | T | F | Newx(X, n * p, double); Newx(Y, n, double); |
| 50 | T | F | Newx(X, n * p, double); Newx(Y, n, double); |
| 4857 | 50 | T | F | Newx(valid_row_names, n, char*); |
| 4862 | 100 | T | F | for (i = 0; i < n; i++) { |
| 4864 | 100 | T | F | if (isnan(y_val)) { Safefree(row_names[i]); continue; } |
| 4868 | 100 | T | F | for (j = 0; j < p; j++) { |
| 4869 | 100 | T | F | if (strcmp(exp_terms[j], "Intercept") == 0) { |
| 4871 | 100 | T | F | } else if (is_dummy[j]) { |
| 4873 | 50 | T | F | if (str_val) { |
| 4874 | 100 | T | F | row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0; |
| 4879 | 50 | T | F | if (isnan(row_x[j])) { row_ok = false; break; } |
| 4882 | 50 | T | F | if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; } |
| 4885 | 100 | T | F | for (j = 0; j < p; j++) X[valid_n * p + j] = row_x[j]; |
| 4892 | 100 | T | F | if (valid_n <= p) { |
| 4893 | 100 | T | F | for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms); |
| 4894 | 100 | T | F | for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms); |
| 4895 | 100 | T | F | for (j = 0; j < p_exp; j++) { |
| 4897 | 50 | T | F | if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); } |
| 4901 | 50 | T | F | if (row_hashes) Safefree(row_hashes); |
| 4909 | 100 | T | F | for (i = 0; i < p; i++) |
| 4910 | 100 | T | F | for (j = 0; j < p; j++) { |
| 4912 | 100 | T | F | for (k = 0; k < valid_n; k++) sum += X[k * p + i] * X[k * p + j]; |
| 4916 | 100 | T | F | for (i = 0; i < p; i++) { |
| 4918 | 100 | T | F | for (k = 0; k < valid_n; k++) sum += X[k * p + i] * Y[k]; |
| 4924 | 100 | T | F | for (i = 0; i < p; i++) { |
| 4925 | 100 | T | F | if (aliased[i]) { beta[i] = NAN; } |
| 4928 | 100 | T | F | for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j]; |
| 100 | T | F | for (j = 0; j < p; j++) if (!aliased[j]) sum += XtX[i * p + j] * XtY[j]; |
| 4943 | 100 | T | F | for (i = 0; i < valid_n; i++) sum_y += Y[i]; |
| 4946 | 100 | T | F | for (i = 0; i < valid_n; i++) { |
| 4948 | 100 | T | F | for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j]; |
| 100 | T | F | for (j = 0; j < p; j++) if (!aliased[j]) y_hat += X[i * p + j] * beta[j]; |
| 4951 | 100 | T | F | double diff_m = has_intercept ? (y_hat - mean_y) : y_hat; |
| 4960 | 50 | T | F | rse_sq = (df_res > 0) ? (rss / (double)df_res) : NAN; |
| 4966 | 50 | T | F | if (final_rank != df_int && (mss + rss) > 0.0) { |
| 50 | T | F | if (final_rank != df_int && (mss + rss) > 0.0) { |
| 4969 | 50 | T | F | if (rse_sq > 0.0 && numdf > 0) { |
| 50 | T | F | if (rse_sq > 0.0 && numdf > 0) { |
| 4972 | 0 | T | F | } else if (rse_sq == 0.0) { |
| 4976 | 0 | T | F | } else if (final_rank == df_int) { |
| 4980 | 100 | T | F | for (j = 0; j < p; j++) { |
| 4984 | 100 | T | F | if (aliased[j]) { |
| 4991 | 50 | T | F | double t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0)); |
| 0 | T | F | double t_val = (se > 0.0) ? (beta[j] / se) : (INFINITY * (beta[j] >= 0.0 ? 1.0 : -1.0)); |
| 5011 | 50 | T | F | if (!isnan(f_stat)) { |
| 5021 | 100 | T | F | for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms); |
| 5022 | 100 | T | F | for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms); |
| 5023 | 100 | T | F | for (j = 0; j < p_exp; j++) { |
| 5025 | 100 | T | F | if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); } |
| 5030 | 100 | T | F | if (row_hashes) Safefree(row_hashes); |
| 5044 | 50 | T | F | if (by == 0.0) { |
| 5045 | 0 | T | F | if (from == to) { |
| 5046 | 0 | T | F | EXTEND(SP, 1); |
| 5054 | 100 | T | F | if ((from < to && by < 0.0) || (from > to && by > 0.0)) { |
| 50 | T | F | if ((from < to && by < 0.0) || (from > to && by > 0.0)) { |
| 100 | T | F | if ((from < to && by < 0.0) || (from > to && by > 0.0)) { |
| 50 | T | F | if ((from < to && by < 0.0) || (from > to && by > 0.0)) { |
| 5062 | 50 | T | F | if (n_elements_d < 0.0) n_elements_d = 0.0; |
| 5065 | 50 | T | F | EXTEND(SP, n_elements); |
| 5066 | 100 | T | F | for (size_t i = 0; i < n_elements; i++) { |
| 5076 | 100 | T | F | AUTO_SEED_PRNG(); |
| 5083 | 50 | T | F | if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) { |
| 50 | T | F | if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) { |
| 0 | T | F | if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) { |
| 0 | T | F | if (items > 0 && SvIOK(ST(0)) && (items == 1 || items % 2 != 0)) { |
| 5089 | 50 | T | F | if ((items - arg_start) % 2 != 0) { |
| 5093 | 100 | T | F | for (int i = arg_start; i < items; i += 2) { |
| 5097 | 100 | T | F | if (strEQ(key, "n")) n = (unsigned int)SvUV(val); |
| 5098 | 100 | T | F | else if (strEQ(key, "mean")) mean = SvNV(val); |
| 5099 | 50 | T | F | else if (strEQ(key, "sd")) sd = SvNV(val); |
| 5103 | 100 | T | F | if (sd < 0.0) croak("rnorm: standard deviation must be non-negative"); |
| 5106 | 50 | T | F | if (n > 0) { |
| 5109 | 100 | T | F | for (size_t i = 0; i < n; ) { |
| 5116 | 100 | T | F | } while (s >= 1.0 || s == 0.0); |
| 50 | T | F | } while (s >= 1.0 || s == 0.0); |
| 5121 | 100 | T | F | if (i < n) { |
| 5156 | 50 | T | F | if (!SvROK(data_sv)) croak("aov: data is required and must be a reference"); |
| 5162 | 50 | T | F | if (SvTYPE(ref) == SVt_PVHV) { |
| 5164 | 50 | T | F | if (hv_iterinit(hv) == 0) croak("aov: Data hash is empty"); |
| 5166 | 50 | T | F | if (entry) { |
| 5168 | 50 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 50 | T | F | if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVAV) { |
| 5171 | 50 | T | F | Newx(row_names, n, char*); |
| 5172 | 100 | T | F | for(i = 0; i < n; i++) { |
| 5176 | 0 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 0 | T | F | } else if (SvROK(val) && SvTYPE(SvRV(val)) == SVt_PVHV) { |
| 5178 | 0 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 0 | T | F | Newx(row_names, n, char*); Newx(row_hashes, n, HV*); |
| 5180 | 0 | T | F | while ((entry = hv_iternext(hv))) { |
| 5188 | 0 | T | F | } else if (SvTYPE(ref) == SVt_PVAV) { |
| 5191 | 0 | T | F | Newx(row_names, n, char*); |
| 5192 | 0 | T | F | Newx(row_hashes, n, HV*); |
| 5193 | 0 | T | F | for (i = 0; i < n; i++) { |
| 5195 | 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 0 | T | F | if (val && SvROK(*val) && SvTYPE(SvRV(*val)) == SVt_PVHV) { |
| 5201 | 0 | T | F | for (size_t k = 0; k < i; k++) Safefree(row_names[k]); |
| 5212 | 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 100 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 50 | T | F | while (*src && (dst - f_cpy < 511)) { if (!isspace(*src)) { *dst++ = *src; } src++; } |
| 5216 | 100 | T | F | if (!tilde) { |
| 5217 | 100 | T | F | for (i = 0; i < n; i++) Safefree(row_names[i]); |
| 5218 | 50 | T | F | Safefree(row_names); if (row_hashes) Safefree(row_hashes); |
| 5226 | 50 | T | F | while ((p_idx = strstr(rhs, "-1")) != NULL) { has_intercept = false; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); } |
| 5227 | 50 | T | F | while ((p_idx = strstr(rhs, "+0")) != NULL) { has_intercept = false; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); } |
| 5228 | 50 | T | F | while ((p_idx = strstr(rhs, "0+")) != NULL) { has_intercept = false; memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); } |
| 5229 | 50 | T | F | if (rhs[0] == '0' && rhs[1] == '\0') { has_intercept = false; rhs[0] = '\0'; } |
| 0 | T | F | if (rhs[0] == '0' && rhs[1] == '\0') { has_intercept = false; rhs[0] = '\0'; } |
| 5230 | 50 | T | F | while ((p_idx = strstr(rhs, "+1")) != NULL) { memmove(p_idx, p_idx + 2, strlen(p_idx + 2) + 1); } |
| 5231 | 50 | T | F | if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; } |
| 0 | T | F | if (rhs[0] == '1' && rhs[1] == '\0') { rhs[0] = '\0'; } |
| 5232 | 50 | T | F | else if (rhs[0] == '1' && rhs[1] == '+') { memmove(rhs, rhs + 2, strlen(rhs + 2) + 1); } |
| 0 | T | F | else if (rhs[0] == '1' && rhs[1] == '+') { memmove(rhs, rhs + 2, strlen(rhs + 2) + 1); } |
| 5234 | 50 | T | F | while ((p_idx = strstr(rhs, "++")) != NULL) memmove(p_idx, p_idx + 1, strlen(p_idx + 1) + 1); |
| 5235 | 50 | T | F | if (rhs[0] == '+') memmove(rhs, rhs + 1, strlen(rhs + 1) + 1); |
| 5237 | 50 | T | F | if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0'; |
| 50 | T | F | if (len_rhs > 0 && rhs[len_rhs - 1] == '+') rhs[len_rhs - 1] = '\0'; |
| 5242 | 100 | T | F | while (chunk != NULL) { |
| 5243 | 100 | T | F | if (strcmp(chunk, ".") == 0) { |
| 5245 | 100 | T | F | for (size_t c = 0; c <= av_len(cols); c++) { |
| 5247 | 50 | T | F | if (col_sv && SvOK(*col_sv)) { |
| 50 | T | F | if (col_sv && SvOK(*col_sv)) { |
| 5249 | 100 | T | F | if (strcmp(col_name, lhs) != 0) { |
| 5251 | 50 | T | F | if (rhs_len + slen + 2 < sizeof(rhs_expanded)) { |
| 5252 | 100 | T | F | if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; } |
| 5262 | 50 | T | F | if (rhs_len + slen + 2 < sizeof(rhs_expanded)) { |
| 5263 | 100 | T | F | if (rhs_len > 0) { strcat(rhs_expanded, "+"); rhs_len++; } |
| 5279 | 50 | T | F | if (has_intercept) { terms[num_terms++] = savepv("Intercept"); } |
| 5281 | 50 | T | F | if (strlen(rhs_expanded) > 0) { |
| 5283 | 100 | T | F | while (chunk != NULL) { |
| 5284 | 50 | T | F | if (num_terms >= term_cap - 3) { |
| 5289 | 100 | T | F | if (star) { |
| 5294 | 50 | T | F | if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 0 | T | F | if (c_l && strncmp(left, "I(", 2) != 0) *c_l = '\0'; |
| 5295 | 50 | T | F | char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 0 | T | F | char *restrict c_r = strchr(right, '^'); if (c_r && strncmp(right, "I(", 2) != 0) *c_r = '\0'; |
| 5303 | 50 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 0 | T | F | if (c_chunk && strncmp(chunk, "I(", 2) != 0) *c_chunk = '\0'; |
| 5310 | 100 | T | F | for (i = 0; i < num_terms; i++) { |
| 5312 | 100 | T | F | for (size_t k = 0; k < num_uniq; k++) { |
| 5313 | 50 | T | F | if (strcmp(terms[i], uniq_terms[k]) == 0) { found = true; break; } |
| 5315 | 50 | T | F | if (!found) uniq_terms[num_uniq++] = savepv(terms[i]); |
| 5322 | 100 | T | F | for (j = 0; j < p; j++) { |
| 5323 | 100 | T | F | if (p_exp + 64 >= exp_cap) { |
| 5331 | 100 | T | F | if (strcmp(uniq_terms[j], "Intercept") == 0) { |
| 5341 | 100 | T | F | if (colon) { |
| 5349 | 100 | T | F | for (size_t e = 0; e < p_exp; e++) { |
| 5350 | 100 | T | F | if (strcmp(parent_term[e], left) == 0) l_indices[l_count++] = e; |
| 5351 | 100 | T | F | if (strcmp(parent_term[e], right) == 0) r_indices[r_count++] = e; |
| 5354 | 100 | T | F | if (l_count == 0 || r_count == 0) { |
| 50 | T | F | if (l_count == 0 || r_count == 0) { |
| 5358 | 100 | T | F | for (int li = 0; li < l_count; li++) { |
| 5359 | 100 | T | F | for (int ri = 0; ri < r_count; ri++) { |
| 5360 | 50 | T | F | if (p_exp >= exp_cap) { |
| 5381 | 100 | T | F | if (is_column_categorical(data_hoa, row_hashes, n, uniq_terms[j])) { |
| 5385 | 100 | T | F | for (i = 0; i < n; i++) { |
| 5387 | 50 | T | F | if (str_val) { |
| 5389 | 100 | T | F | for (size_t l = 0; l < num_levels; l++) { |
| 5390 | 100 | T | F | if (strcmp(levels[l], str_val) == 0) { found = true; break; } |
| 5392 | 100 | T | F | if (!found) { |
| 5393 | 50 | T | F | if (num_levels >= levels_cap) { levels_cap *= 2; Renew(levels, levels_cap, char*); } |
| 5400 | 50 | T | F | if (num_levels > 0) { |
| 5401 | 100 | T | F | for (size_t l1 = 0; l1 < num_levels - 1; l1++) { |
| 5402 | 100 | T | F | for (size_t l2 = l1 + 1; l2 < num_levels; l2++) { |
| 5403 | 100 | T | F | if (strcmp(levels[l1], levels[l2]) > 0) { |
| 5408 | 100 | T | F | for (size_t l = 1; l < num_levels; l++) { |
| 5409 | 50 | T | F | if (p_exp >= exp_cap) { |
| 5426 | 100 | T | F | for (size_t l = 0; l < num_levels; l++) Safefree(levels[l]); |
| 5446 | 100 | T | F | for(i = 0; i < n; i++) X_mat[i] = (double*)safemalloc(p_exp * sizeof(double)); |
| 5447 | 50 | T | F | Newx(Y, n, double); |
| 5451 | 100 | T | F | for (i = 0; i < n; i++) { |
| 5453 | 50 | T | F | if (isnan(y_val)) { Safefree(row_names[i]); continue; } |
| 5456 | 100 | T | F | for (j = 0; j < p_exp; j++) { |
| 5457 | 100 | T | F | if (strcmp(exp_terms[j], "Intercept") == 0) { |
| 5459 | 100 | T | F | } else if (is_interact[j]) { |
| 5461 | 100 | T | F | } else if (is_dummy[j]) { |
| 5463 | 50 | T | F | if (str_val) { |
| 5464 | 100 | T | F | row_x[j] = (strcmp(str_val, dummy_level[j]) == 0) ? 1.0 : 0.0; |
| 5469 | 50 | T | F | if (isnan(row_x[j])) { row_ok = false; break; } |
| 5472 | 50 | T | F | if (!row_ok) { Safefree(row_names[i]); Safefree(row_x); continue; } |
| 5475 | 100 | T | F | for (j = 0; j < p_exp; j++) X_mat[valid_n][j] = row_x[j]; |
| 5481 | 100 | T | F | if (valid_n <= p_exp) { |
| 5483 | 100 | T | F | for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms); |
| 5484 | 100 | T | F | for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms); |
| 5485 | 100 | T | F | for (j = 0; j < p_exp; j++) { |
| 5487 | 50 | T | F | if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); } |
| 5493 | 100 | T | F | for(i = 0; i < n; i++) Safefree(X_mat[i]); |
| 5495 | 50 | T | F | if (row_hashes) Safefree(row_hashes); |
| 5509 | 100 | T | F | for (i = 0; i < p_exp; i++) { |
| 5510 | 100 | T | F | if (strcmp(exp_terms[i], "Intercept") == 0) continue; |
| 5511 | 100 | T | F | if (aliased_qr[i]) continue; |
| 5518 | 100 | T | F | for (i = 0; i < p_exp; i++) { |
| 5519 | 100 | T | F | if (!aliased_qr[i]) rank++; |
| 5522 | 100 | T | F | for (i = rank; i < valid_n; i++) { |
| 5526 | 50 | T | F | double ms_res = (res_df > 0) ? rss_prev / res_df : 0.0; |
| 5529 | 100 | T | F | for (j = 0; j < num_uniq; j++) { |
| 5530 | 100 | T | F | if (strcmp(uniq_terms[j], "Intercept") == 0) continue; |
| 5534 | 100 | T | F | double ms = (df > 0) ? ss / df : 0.0; |
| 5539 | 50 | T | F | if (ms_res > 0.0 && df > 0) { |
| 100 | T | F | if (ms_res > 0.0 && df > 0) { |
| 5557 | 100 | T | F | for (i = 0; i < num_terms; i++) Safefree(terms[i]); Safefree(terms); |
| 5558 | 100 | T | F | for (i = 0; i < num_uniq; i++) Safefree(uniq_terms[i]); Safefree(uniq_terms); |
| 5559 | 100 | T | F | for (j = 0; j < p_exp; j++) { |
| 5561 | 100 | T | F | if (is_dummy[j]) { Safefree(dummy_base[j]); Safefree(dummy_level[j]); } |
| 5568 | 100 | T | F | for (i = 0; i < n; i++) Safefree(X_mat[i]); |
| 5571 | 50 | T | F | if (row_hashes) Safefree(row_hashes); |
| 5582 | 100 | T | F | if (items < 1) croak("fisher_test requires at least a data reference"); |
| 5589 | 100 | T | F | for (unsigned short int i = 1; i < items; i += 2) { |
| 5590 | 50 | T | F | if (i + 1 >= items) croak("fisher_test: odd number of arguments"); |
| 5593 | 50 | T | F | if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) { |
| 50 | T | F | if (strEQ(key, "conf_level") || strEQ(key, "conf.level")) { |
| 5595 | 50 | T | F | } else if (strEQ(key, "alternative")) { |
| 5600 | 50 | T | F | if (!SvROK(data_ref)) croak("fisher_test requires a reference to an Array or Hash"); |
| 5604 | 100 | T | F | if (SvTYPE(deref) == SVt_PVAV) { |
| 5606 | 50 | T | F | if (av_len(outer) != 1) croak("Outer array must have exactly 2 rows"); |
| 5609 | 50 | T | F | if (row1_ptr && row2_ptr && SvROK(*row1_ptr) && SvROK(*row2_ptr)) { |
| 50 | T | F | if (row1_ptr && row2_ptr && SvROK(*row1_ptr) && SvROK(*row2_ptr)) { |
| 50 | T | F | if (row1_ptr && row2_ptr && SvROK(*row1_ptr) && SvROK(*row2_ptr)) { |
| 50 | T | F | if (row1_ptr && row2_ptr && SvROK(*row1_ptr) && SvROK(*row2_ptr)) { |
| 5616 | 50 | T | F | a = (a_ptr && SvOK(*a_ptr)) ? SvIV(*a_ptr) : 0; |
| 50 | T | F | a = (a_ptr && SvOK(*a_ptr)) ? SvIV(*a_ptr) : 0; |
| 5617 | 50 | T | F | b = (b_ptr && SvOK(*b_ptr)) ? SvIV(*b_ptr) : 0; |
| 50 | T | F | b = (b_ptr && SvOK(*b_ptr)) ? SvIV(*b_ptr) : 0; |
| 5618 | 50 | T | F | c = (c_ptr && SvOK(*c_ptr)) ? SvIV(*c_ptr) : 0; |
| 50 | T | F | c = (c_ptr && SvOK(*c_ptr)) ? SvIV(*c_ptr) : 0; |
| 5619 | 50 | T | F | d = (d_ptr && SvOK(*d_ptr)) ? SvIV(*d_ptr) : 0; |
| 50 | T | F | d = (d_ptr && SvOK(*d_ptr)) ? SvIV(*d_ptr) : 0; |
| 5623 | 50 | T | F | } else if (SvTYPE(deref) == SVt_PVHV) { |
| 5626 | 50 | T | F | if (hv_iterinit(outer) != 2) croak("Outer hash must have exactly 2 keys"); |
| 5629 | 50 | T | F | if (!he1 || !he2) croak("Invalid outer hash"); |
| 50 | T | F | if (!he1 || !he2) croak("Invalid outer hash"); |
| 5632 | 100 | T | F | HE*restrict row1_he = (strcmp(k1, k2) < 0) ? he1 : he2; |
| 5633 | 100 | T | F | HE*restrict row2_he = (strcmp(k1, k2) < 0) ? he2 : he1; |
| 5636 | 50 | T | F | if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV || |
| 50 | T | F | if (!SvROK(row1_sv) || SvTYPE(SvRV(row1_sv)) != SVt_PVHV || |
| 5637 | 50 | T | F | !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV) { |
| 50 | T | F | !SvROK(row2_sv) || SvTYPE(SvRV(row2_sv)) != SVt_PVHV) { |
| 5642 | 50 | T | F | if (hv_iterinit(in1) != 2 || hv_iterinit(in2) != 2) croak("Inner hashes must have exactly 2 keys"); |
| 50 | T | F | if (hv_iterinit(in1) != 2 || hv_iterinit(in2) != 2) croak("Inner hashes must have exactly 2 keys"); |
| 5647 | 100 | T | F | HE*restrict in1_c1 = (strcmp(in1_k1, in1_k2) < 0) ? in1_he1 : in1_he2; |
| 5648 | 100 | T | F | HE*restrict in1_c2 = (strcmp(in1_k1, in1_k2) < 0) ? in1_he2 : in1_he1; |
| 5653 | 100 | T | F | HE*restrict in2_c1 = (strcmp(in2_k1, in2_k2) < 0) ? in2_he1 : in2_he2; |
| 5654 | 100 | T | F | HE*restrict in2_c2 = (strcmp(in2_k1, in2_k2) < 0) ? in2_he2 : in2_he1; |
| 5655 | 50 | T | F | a = (hv_iterval(in1, in1_c1) && SvOK(hv_iterval(in1, in1_c1))) ? SvIV(hv_iterval(in1, in1_c1)) : 0; |
| 50 | T | F | a = (hv_iterval(in1, in1_c1) && SvOK(hv_iterval(in1, in1_c1))) ? SvIV(hv_iterval(in1, in1_c1)) : 0; |
| 5656 | 50 | T | F | b = (hv_iterval(in1, in1_c2) && SvOK(hv_iterval(in1, in1_c2))) ? SvIV(hv_iterval(in1, in1_c2)) : 0; |
| 50 | T | F | b = (hv_iterval(in1, in1_c2) && SvOK(hv_iterval(in1, in1_c2))) ? SvIV(hv_iterval(in1, in1_c2)) : 0; |
| 5657 | 50 | T | F | c = (hv_iterval(in2, in2_c1) && SvOK(hv_iterval(in2, in2_c1))) ? SvIV(hv_iterval(in2, in2_c1)) : 0; |
| 50 | T | F | c = (hv_iterval(in2, in2_c1) && SvOK(hv_iterval(in2, in2_c1))) ? SvIV(hv_iterval(in2, in2_c1)) : 0; |
| 5658 | 50 | T | F | d = (hv_iterval(in2, in2_c2) && SvOK(hv_iterval(in2, in2_c2))) ? SvIV(hv_iterval(in2, in2_c2)) : 0; |
| 50 | T | F | d = (hv_iterval(in2, in2_c2) && SvOK(hv_iterval(in2, in2_c2))) ? SvIV(hv_iterval(in2, in2_c2)) : 0; |
| 5700 | 50 | T | F | if (items % 2 != 0) croak("Usage: power_t_test(n => 30, delta => 0.5, sd => 1.0, ...)"); |
| 5701 | 100 | T | F | for (unsigned short int i = 0; i < items; i += 2) { |
| 5705 | 100 | T | F | if (strEQ(key, "n")) sv_n = val; |
| 5706 | 100 | T | F | else if (strEQ(key, "delta")) sv_delta = val; |
| 5707 | 100 | T | F | else if (strEQ(key, "sd")) sv_sd = val; |
| 5708 | 50 | T | F | else if (strEQ(key, "sig.level") || strEQ(key, "sig_level")) sv_sig_level = val; |
| 100 | T | F | else if (strEQ(key, "sig.level") || strEQ(key, "sig_level")) sv_sig_level = val; |
| 5709 | 100 | T | F | else if (strEQ(key, "power")) sv_power = val; |
| 5710 | 100 | T | F | else if (strEQ(key, "type")) type = SvPV_nolen(val); |
| 5711 | 50 | T | F | else if (strEQ(key, "alternative")) alternative = SvPV_nolen(val); |
| 5712 | 0 | T | F | else if (strEQ(key, "strict")) strict = SvTRUE(val); |
| 5713 | 0 | T | F | else if (strEQ(key, "tol")) tol = SvNV(val); |
| 5717 | 100 | T | F | bool is_null_n = (!sv_n || !SvOK(sv_n)); |
| 50 | T | F | bool is_null_n = (!sv_n || !SvOK(sv_n)); |
| 5718 | 50 | T | F | bool is_null_delta = (!sv_delta || !SvOK(sv_delta)); |
| 50 | T | F | bool is_null_delta = (!sv_delta || !SvOK(sv_delta)); |
| 5719 | 100 | T | F | bool is_null_power = (!sv_power || !SvOK(sv_power)); |
| 50 | T | F | bool is_null_power = (!sv_power || !SvOK(sv_power)); |
| 5720 | 50 | T | F | bool is_null_sd = (sv_sd && !SvOK(sv_sd)); |
| 50 | T | F | bool is_null_sd = (sv_sd && !SvOK(sv_sd)); |
| 5721 | 100 | T | F | bool is_null_sig_level = (sv_sig_level && !SvOK(sv_sig_level)); |
| 50 | T | F | bool is_null_sig_level = (sv_sig_level && !SvOK(sv_sig_level)); |
| 5724 | 100 | T | F | if (is_null_n) missing_count++; |
| 5725 | 50 | T | F | if (is_null_delta) missing_count++; |
| 5726 | 100 | T | F | if (is_null_power) missing_count++; |
| 5727 | 50 | T | F | if (is_null_sd) missing_count++; |
| 5728 | 50 | T | F | if (is_null_sig_level) missing_count++; |
| 5730 | 50 | T | F | if (missing_count != 1) { |
| 5734 | 100 | T | F | double n = is_null_n ? 0.0 : SvNV(sv_n); |
| 5735 | 50 | T | F | double delta = is_null_delta ? 0.0 : SvNV(sv_delta); |
| 5736 | 50 | T | F | double sd = (!sv_sd || is_null_sd) ? 1.0 : SvNV(sv_sd); |
| 50 | T | F | double sd = (!sv_sd || is_null_sd) ? 1.0 : SvNV(sv_sd); |
| 5737 | 100 | T | F | double sig_level = (!sv_sig_level || is_null_sig_level) ? 0.05 : SvNV(sv_sig_level); |
| 50 | T | F | double sig_level = (!sv_sig_level || is_null_sig_level) ? 0.05 : SvNV(sv_sig_level); |
| 5738 | 100 | T | F | double power = is_null_power ? 0.0 : SvNV(sv_power); |
| 5739 | 100 | T | F | short int tsample = (strEQ(type, "one.sample") || strEQ(type, "paired")) ? 1 : 2; |
| 100 | T | F | short int tsample = (strEQ(type, "one.sample") || strEQ(type, "paired")) ? 1 : 2; |
| 5740 | 100 | T | F | short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2; |
| 50 | T | F | short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2; |
| 50 | T | F | short int tside = (strEQ(alternative, "one.sided") || strEQ(alternative, "greater") || strEQ(alternative, "less")) ? 1 : 2; |
| 5741 | 100 | T | F | if (tside == 2 && !is_null_delta) delta = fabs(delta); |
| 50 | T | F | if (tside == 2 && !is_null_delta) delta = fabs(delta); |
| 5742 | 100 | T | F | if (is_null_power) { |
| 5744 | 50 | T | F | } else if (is_null_n) { |
| 5746 | 50 | T | F | while (p_body(high, delta, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0; |
| 0 | T | F | while (p_body(high, delta, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0; |
| 5747 | 100 | T | F | while (high - low > tol) { |
| 5749 | 100 | T | F | if (p_body(mid, delta, sd, sig_level, tsample, tside, strict) < power) low = mid; |
| 5753 | 0 | T | F | } else if (is_null_sd) { |
| 5755 | 0 | T | F | while (high - low > tol) { |
| 5757 | 0 | T | F | if (p_body(n, delta, mid, sig_level, tsample, tside, strict) > power) low = mid; |
| 5761 | 0 | T | F | } else if (is_null_delta) { |
| 5763 | 0 | T | F | while (p_body(n, high, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0; |
| 0 | T | F | while (p_body(n, high, sd, sig_level, tsample, tside, strict) < power && high < 1e12) high *= 2.0; |
| 5764 | 0 | T | F | while (high - low > tol) { |
| 5766 | 0 | T | F | if (p_body(n, mid, sd, sig_level, tsample, tside, strict) < power) low = mid; |
| 5770 | 0 | T | F | } else if (is_null_sig_level) { |
| 5772 | 0 | T | F | while (high - low > tol) { |
| 5774 | 0 | T | F | if (p_body(n, delta, sd, mid, tsample, tside, strict) < power) low = mid; |
| 5786 | 100 | T | F | 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"; |
| 100 | T | F | 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"; |
| 5788 | 100 | T | F | 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" : ""); |
| 100 | T | F | 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" : ""); |
| 5789 | 100 | T | F | if (n_str[0] != '\0') hv_stores(ret, "note", newSVpv(n_str, 0)); |
| 5803 | 50 | T | F | if (arg_idx < items && SvROK(ST(arg_idx))) { |
| 100 | T | F | if (arg_idx < items && SvROK(ST(arg_idx))) { |
| 5805 | 100 | T | F | if (t == SVt_PVAV) { |
| 5807 | 50 | T | F | } else if (t == SVt_PVHV) { |
| 5811 | 100 | T | F | if (!h_sv && arg_idx < items |
| 50 | T | F | if (!h_sv && arg_idx < items |
| 5812 | 100 | T | F | && SvROK(ST(arg_idx)) |
| 5813 | 50 | T | F | && SvTYPE(SvRV(ST(arg_idx))) == SVt_PVAV) { |
| 5817 | 100 | T | F | for (; arg_idx < items; arg_idx += 2) { |
| 5820 | 100 | T | F | if (strEQ(key, "x")) x_sv = val; |
| 5821 | 50 | T | F | else if (strEQ(key, "g")) g_sv = val; |
| 5822 | 0 | T | F | else if (strEQ(key, "h")) h_sv = val; |
| 5826 | 100 | T | F | if (h_sv && (x_sv || g_sv)) |
| 50 | T | F | if (h_sv && (x_sv || g_sv)) |
| 50 | T | F | if (h_sv && (x_sv || g_sv)) |
| 5838 | 100 | T | F | if (h_sv) { |
| 5839 | 50 | T | F | if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV) |
| 50 | T | F | if (!SvROK(h_sv) || SvTYPE(SvRV(h_sv)) != SVt_PVHV) |
| 5846 | 100 | T | F | while ((he = hv_iternext(h_hv))) { |
| 5848 | 50 | T | F | if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) |
| 50 | T | F | if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV) |
| 5852 | 50 | T | F | if (total < 2) croak("not enough observations"); |
| 5859 | 100 | T | F | while ((he = hv_iternext(h_hv))) { |
| 5862 | 100 | T | F | for (size_t i = 0; i < n_g; i++) { |
| 5864 | 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 50 | T | F | if (el && SvOK(*el) && looks_like_number(*el)) { |
| 5878 | 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 50 | T | F | if (!x_sv || !SvROK(x_sv) || SvTYPE(SvRV(x_sv)) != SVt_PVAV) |
| 5880 | 50 | T | F | if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV) |
| 50 | T | F | if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV) |
| 50 | T | F | if (!g_sv || !SvROK(g_sv) || SvTYPE(SvRV(g_sv)) != SVt_PVAV) |
| 5887 | 50 | T | F | if (nx != ng) croak("kruskal_test: 'x' and 'g' must have the same length"); |
| 5888 | 50 | T | F | if (nx < 2) croak("not enough observations"); |
| 5896 | 100 | T | F | for (size_t i = 0; i < nx; i++) { |
| 5899 | 50 | T | F | if (x_el && SvOK(*x_el) && looks_like_number(*x_el) |
| 50 | T | F | if (x_el && SvOK(*x_el) && looks_like_number(*x_el) |
| 50 | T | F | if (x_el && SvOK(*x_el) && looks_like_number(*x_el) |
| 5900 | 50 | T | F | && g_el && SvOK(*g_el)) { |
| 50 | T | F | && g_el && SvOK(*g_el)) { |
| 5905 | 100 | T | F | if (id_sv) { |
| 5923 | 50 | T | F | if (valid_n < 2) { Safefree(ri); croak("not enough observations"); } |
| 5924 | 50 | T | F | if (k < 2) { Safefree(ri); croak("all observations are in the same group"); } |
| 5933 | 100 | T | F | for (size_t i = 0; i < valid_n; i++) { |
| 5941 | 100 | T | F | for (size_t i = 0; i < k; i++) { |
| 5942 | 50 | T | F | if (group_counts[i] > 0) |
| 5950 | 50 | T | F | if (tie_adj > 0.0) { |