| 34 | void StatisticsBrowser::setContest(Contest *contest) { curContest = contest; } |
| 35 | |
| 36 | auto StatisticsBrowser::getScoreNormalChart(const QMap<int, int> &scoreCount, int listSize, |
| 37 | int totalScore) -> QString { |
| 38 | QString buffer = ""; |
| 39 | long long overallScoreSum = 0; |
| 40 | double scoreDiscrim = 0; |
| 41 | double scoreStandardDevia = 0; |
| 42 | int scoreTierPrefix = 0; |
| 43 | int lastScoreTier = -1; |
| 44 | int lastScoreTierNum = -1; |
| 45 | |
| 46 | for (auto i = scoreCount.constEnd(); i != scoreCount.constBegin();) { |
| 47 | i--; |
| 48 | int curScoreTier = i.key(); |
| 49 | int curScoreTierNum = i.value(); |
| 50 | |
| 51 | if (curScoreTier < 0) |
| 52 | continue; |
| 53 | |
| 54 | overallScoreSum += 1LL * curScoreTier * curScoreTierNum; |
| 55 | |
| 56 | if (lastScoreTier >= 0) |
| 57 | scoreDiscrim += qLn(1 + 10.00 * (lastScoreTier - curScoreTier) / totalScore) * |
| 58 | (1.00 - 1.00 * lastScoreTierNum * curScoreTierNum / listSize / listSize); |
| 59 | |
| 60 | lastScoreTier = curScoreTier; |
| 61 | lastScoreTierNum = curScoreTierNum; |
| 62 | } |
| 63 | |
| 64 | double scoreAverage = 1.00 * overallScoreSum / listSize; |
| 65 | buffer += "<table border=\"-1\">"; |
| 66 | buffer += |
| 67 | QString(R"(<tr><th>%1</th><th>%2</th><th>%3</th><th colspan="2">%4</th><th colspan="2">%5</th></tr>)") |
| 68 | .arg(tr("Score")) |
| 69 | .arg(tr("Count")) |
| 70 | .arg(tr("Ratio")) |
| 71 | .arg(tr("Prefix")) |
| 72 | .arg(tr("Suffix")); |
| 73 | |
| 74 | for (auto i = scoreCount.constEnd(); i != scoreCount.constBegin();) { |
| 75 | i--; |
| 76 | int curScoreTier = i.key(); |
| 77 | int curScoreTierNum = i.value(); |
| 78 | scoreStandardDevia += qPow(curScoreTier - scoreAverage, 2) * curScoreTierNum; |
| 79 | buffer += "<tr>"; |
| 80 | buffer += QString("<td align=\"right\"><nobr>%1 Pt</nobr></td>") |
| 81 | .arg(curScoreTier < 0 ? QString("N/A") : QString::number(curScoreTier)); |
| 82 | buffer += QString("<td align=\"right\"><nobr>%1</nobr></td>").arg(curScoreTierNum); |
| 83 | buffer += QString("<td align=\"right\"><nobr>%1%</nobr></td>") |
| 84 | .arg(QString::number(100.00 * curScoreTierNum / listSize, 'f', 3)); |
| 85 | buffer += QString("<td align=\"right\"><nobr>%1</nobr></td>").arg(listSize - scoreTierPrefix); |
| 86 | buffer += QString("<td align=\"right\"><nobr>%1%</nobr></td>") |
| 87 | .arg(QString::number(100.00 - 100.00 * scoreTierPrefix / listSize, 'f', 3)); |
| 88 | scoreTierPrefix += curScoreTierNum; |
| 89 | buffer += QString("<td align=\"right\"><nobr>%1</nobr></td>").arg(scoreTierPrefix); |
| 90 | buffer += QString("<td align=\"right\"><nobr>%1%</nobr></td>") |
| 91 | .arg(QString::number(100.00 * scoreTierPrefix / listSize, 'f', 3)); |
| 92 | buffer += "</tr>"; |
| 93 | } |
nothing calls this directly
no outgoing calls
no test coverage detected