23 return std::erfc(-x / std::sqrt(2)) / 2;
27 linear_interp(
const double& x,
28 const std::vector<double>& grid,
29 const std::vector<double>& values)
37 double w = (x - grid[i - 1]) / (grid[i] - grid[i - 1]);
38 return w * values[i - 1] + (1 - w) * values[i];
42 check_sizes(
const std::vector<double>& x,
43 const std::vector<double>& y,
44 const std::vector<double>& weights)
46 if (y.size() != x.size())
47 throw std::runtime_error(
"x and y must have the same size.");
48 if ((weights.size() > 0) && (weights.size() != y.size()))
49 throw std::runtime_error(
"x, y, and weights must have the same size.");
56 inline std::vector<double>
57 pow(
const std::vector<double>& x,
size_t n)
59 std::vector<double> res(x.size(), 1.0);
61 for (
size_t i = 0; i < x.size(); i++) {
62 for (
size_t j = 0; j < n; j++) {
74 sum(
const std::vector<double>& x)
77 for (
size_t i = 0; i < x.size(); i++)
87 perm_sum(
const std::vector<double>& x,
size_t k)
92 for (
size_t i = 1; i <= k; i++)
93 s += std::pow(-1.0, i - 1) * perm_sum(x, k - i) * sum(pow(x, i));
101 effective_sample_size(
size_t n,
const std::vector<double>& weights)
104 if (weights.size() == 0) {
105 n_eff =
static_cast<double>(n);
107 n_eff = std::pow(sum(weights), 2);
108 n_eff /= sum(pow(weights, 2));
117 inline std::vector<size_t>
118 invert_permutation(
const std::vector<size_t>& perm)
120 std::vector<size_t> inv_perm(perm.size());
121 for (
size_t i = 0; i < perm.size(); i++)
122 inv_perm[perm[i]] = i;
129 inline std::vector<size_t>
130 get_order(
const std::vector<double>& x,
bool ascending =
true)
133 std::vector<size_t> perm(n);
134 for (
size_t i = 0; i < n; i++)
136 auto sorter = [&](
size_t i,
size_t j) {
138 return (x[i] < x[j]);
140 return (x[i] > x[j]);
142 std::sort(perm.begin(), perm.end(), sorter);
150 sort_all(std::vector<double>& x,
151 std::vector<double>& y,
152 std::vector<double>& weights)
155 std::vector<size_t> order(n);
156 for (
size_t i = 0; i < n; i++)
158 auto sorter_with_tie_break = [&](
size_t i,
size_t j) {
159 return (x[i] < x[j]) || ((x[i] == x[j]) && (y[i] < y[j]));
161 std::sort(order.begin(), order.end(), sorter_with_tie_break);
163 std::vector<double> xx(n), yy(n);
164 for (
size_t i = 0; i < n; i++) {
170 std::vector<double> w = weights;
171 if (weights.size() > 0) {
172 for (
size_t i = 0; i < n; i++) {
173 w[i] = weights[order[i]];
188 count_ties_v(
const std::vector<double>& x,
const std::vector<double>& weights)
190 bool weighted = (weights.size() > 0);
191 double count = 0.0, w1 = 0.0, w2 = 0.0;
193 for (
size_t i = 1; i < x.size(); i++) {
194 if ((x[i] == x[i - 1])) {
201 w2 += std::pow(weights[i], 2);
204 }
else if (reps > 1) {
206 count += (w1 * w1 - w2) * (2 * w1 + 5);
208 count += reps * (reps - 1) * (2 * reps + 5);
216 count += (w1 * w1 - w2) * (2 * w1 + 5);
218 count += reps * (reps - 1) * (2 * reps + 5);
230 count_tied_pairs(
const std::vector<double>& x,
231 const std::vector<double>& weights)
233 bool weighted = (weights.size() > 0);
234 double count = 0.0, w1 = 0.0, w2 = 0.0;
236 for (
size_t i = 1; i < x.size(); i++) {
237 if ((x[i] == x[i - 1])) {
244 w2 += std::pow(weights[i], 2);
247 }
else if (reps > 1) {
249 count += (w1 * w1 - w2) / 2.0;
251 count += reps * (reps - 1) / 2.0;
259 count += (w1 * w1 - w2) / 2.0;
261 count += reps * (reps - 1) / 2.0;
274 count_tied_triplets(
const std::vector<double>& x,
275 const std::vector<double>& weights)
277 bool weighted = (weights.size() > 0);
278 double count = 0.0, w1 = 0.0, w2 = 0.0, w3 = 0.0;
280 for (
size_t i = 2; i < x.size(); i++) {
281 if ((x[i] == x[i - 1]) && (x[i] == x[i - 2])) {
285 w2 = std::pow(weights[i - 1], 2);
286 w3 = std::pow(weights[i - 1], 3);
289 w2 += std::pow(weights[i], 2);
290 w3 += std::pow(weights[i], 3);
293 }
else if (reps > 2) {
295 count += (std::pow(w1, 3) - 3 * w2 * w1 + 2 * w3) / 6.0;
297 count += reps * (reps - 1) * (reps - 2) / 6.0;
305 count += (std::pow(w1, 3) - 3 * w2 * w1 + 2 * w3) / 6.0;
307 count += reps * (reps - 1) * (reps - 2) / 6.0;
320 count_joint_ties(
const std::vector<double>& x,
321 const std::vector<double>& y,
322 const std::vector<double>& weights)
324 bool weighted = (weights.size() > 0);
325 double count = 0.0, w1 = 0.0, w2 = 0.0;
327 for (
size_t i = 1; i < x.size(); i++) {
328 if ((x[i] == x[i - 1]) && (y[i] == y[i - 1])) {
332 w2 = weights[i - 1] * weights[i - 1];
335 w2 += weights[i] * weights[i];
338 }
else if (reps > 1) {
340 count += (w1 * w1 - w2) / 2.0;
342 count += reps * (reps - 1) / 2.0;
350 count += (w1 * w1 - w2) / 2.0;
352 count += reps * (reps - 1) / 2.0;
368 merge(std::vector<double>& vec,
369 const std::vector<double>& vec1,
370 const std::vector<double>& vec2,
371 std::vector<double>& weights,
372 const std::vector<double>& weights1,
373 const std::vector<double>& weights2,
376 double w_acc = 0.0, w1_sum = 0.0;
377 bool weighted = (weights.size() > 0);
379 for (
size_t i = 0; i < weights1.size(); i++)
380 w1_sum += weights1[i];
383 for (i = 0, j = 0, k = 0; i < vec1.size() && j < vec2.size(); k++) {
384 if (vec1[i] <= vec2[j]) {
387 weights[k] = weights1[i];
388 w_acc += weights1[i];
394 weights[k] = weights2[j];
395 count += weights2[j] * (w1_sum - w_acc);
397 count += vec1.size() - i;
403 while (i < vec1.size()) {
406 weights[k] = weights1[i];
411 while (j < vec2.size()) {
414 weights[k] = weights2[j];
426 merge_sort(std::vector<double>& vec,
427 std::vector<double>& weights,
430 if (vec.size() > 1) {
431 size_t n = vec.size();
432 std::vector<double> vec1(vec.begin(), vec.begin() + n / 2);
433 std::vector<double> vec2(vec.begin() + n / 2, vec.end());
436 std::vector<double> weights1(weights.begin(), weights.begin() + n / 2);
437 std::vector<double> weights2(weights.begin() + n / 2, weights.end());
439 merge_sort(vec1, weights1, count);
440 merge_sort(vec2, weights2, count);
441 merge(vec, vec1, vec2, weights, weights1, weights2, count);
457 merge_count_per_element(std::vector<double>& vec,
458 const std::vector<double>& vec1,
459 const std::vector<double>& vec2,
460 std::vector<double>& weights,
461 const std::vector<double>& weights1,
462 const std::vector<double>& weights2,
463 std::vector<double>& counts,
464 const std::vector<double>& counts1,
465 const std::vector<double>& counts2)
468 bool weighted = (weights.size() > 0);
471 for (
size_t i = 0; i < weights1.size(); i++)
472 w1_sum += weights1[i];
475 for (i = 0, j = 0, k = 0; i < vec1.size() && j < vec2.size(); k++) {
476 if (vec1[i] > vec2[j]) {
478 counts[k] = counts1[i];
480 weights[k] = weights1[i];
481 w_acc += weights1[i];
487 counts[k] = counts2[j] + w1_sum - w_acc;
488 weights[k] = weights2[j];
490 counts[k] = counts2[j] + vec1.size() - i;
496 while (i < vec1.size()) {
499 weights[k] = weights1[i];
500 counts[k] = counts1[i];
505 while (j < vec2.size()) {
508 weights[k] = weights2[j];
509 counts[k] = counts2[j];
523 merge_sort_count_per_element(std::vector<double>& vec,
524 std::vector<double>& weights,
525 std::vector<double>& counts)
527 if (vec.size() > 1) {
528 size_t n = vec.size();
529 std::vector<double> vec1(vec.begin(), vec.begin() + n / 2);
530 std::vector<double> vec2(vec.begin() + n / 2, vec.end());
533 std::vector<double> weights1(weights.begin(), weights.begin() + n / 2);
534 std::vector<double> weights2(weights.begin() + n / 2, weights.end());
537 std::vector<double> counts1(counts.begin(), counts.begin() + n / 2);
538 std::vector<double> counts2(counts.begin() + n / 2, counts.end());
540 merge_sort_count_per_element(vec1, weights1, counts1);
541 merge_sort_count_per_element(vec2, weights2, counts2);
542 merge_count_per_element(
543 vec, vec1, vec2, weights, weights1, weights2, counts, counts1, counts2);
Weighted dependence measures.
Definition: wdm.hpp:19