Etterna 0.74.4
Loading...
Searching...
No Matches
MinaCalcHelpers.h
1#pragma once
2#include <vector>
3#include <algorithm>
4
5/* enums and other definitions that only the calcmain and its components need */
6
7constexpr float max_rating = 100.F;
8constexpr float min_rating = 0.F;
9constexpr float default_score_goal = 0.93F;
10constexpr float low_acc_cutoff = 0.9F;
11constexpr float ssr_goal_cap = 0.965F;
12
13static const std::vector<float> dimples_the_all_zero_output{
14 min_rating, min_rating, min_rating, min_rating,
15 min_rating, min_rating, min_rating, min_rating
16};
17
19static const std::vector<float> gertrude_the_all_max_output{
20 max_rating, max_rating, max_rating, max_rating,
21 max_rating, max_rating, max_rating, max_rating
22};
23
24inline auto
25downscale_low_accuracy_scores(const float f, const float sg) -> float
26{
27 return sg >= low_acc_cutoff
28 ? f
29 : std::min(std::max(f / powf(1.F + (low_acc_cutoff - sg), 3.25F),
30 min_rating),
31 max_rating);
32}
33
34inline auto
35aggregate_skill(const std::vector<float>& v,
36 double delta_multiplier,
37 float result_multiplier,
38 float rating = 0.0F,
39 float resolution = 10.24F) -> float
40{
41 // this algorithm is roughly a binary search
42 // 11 iterations is enough to satisfy
43 for (int i = 0; i < 11; i++) {
44 double sum;
45
46 // at least 1 repeat iteration of:
47 // accumulate a sum of the input values
48 // after applying a function to the values initially
49 // when threshold is reached, this iteration of the search concludes
50 do {
51 rating += resolution;
52 sum = 0.0;
53 for (const auto& vv : v) {
54 sum += std::max(
55 0.0, 2.F / erfc(delta_multiplier * (vv - rating)) - 2);
56 }
57 } while (pow(2, rating * 0.1) < sum);
58
59 // binary searching: move backwards and proceed forward half as quickly
60 rating -= resolution;
61 resolution /= 2.F;
62 }
63 rating += resolution * 2.F;
64
65 return rating * result_multiplier;
66}