Skip to content

Commit e161abc

Browse files
committed
fix: remove remains of normal distribution score calculation
1 parent 2dd7a76 commit e161abc

File tree

6 files changed

+26
-61
lines changed

6 files changed

+26
-61
lines changed

prisma/schema.prisma

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ model CodamCoalitionScore {
9797
model CodamCoalitionSeasonResult {
9898
id Int @id @default(autoincrement())
9999
coalition_id Int
100-
score Int // NOT the same as the sum of all scores, but the score after applying the normal distribution
100+
score Int // NOT the same as the sum of all scores, but the average score of all active contributors at the end of the season
101101
bloc_deadline_id Int
102102
103103
created_at DateTime @default(now())

src/routes/charts.ts

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -151,35 +151,6 @@ export const generateChartCoalitionScoreHistory = async function(prisma: PrismaC
151151
// @ts-ignore
152152
tension: 0.25,
153153
},
154-
/*
155-
{
156-
label: 'Average points',
157-
data: Object.values(dataPoints).map((score) => score.avgPoints),
158-
// borderColor: coalition.color ? coalition.color : '#808080',
159-
// backgroundColor: coalition.color ? coalition.color : '#808080',
160-
fill: false,
161-
// @ts-ignore
162-
tension: 0.25,
163-
},
164-
{
165-
label: 'Standard deviation',
166-
data: Object.values(dataPoints).map((score) => score.stdDevPoints),
167-
// borderColor: coalition.color ? coalition.color : '#808080',
168-
// backgroundColor: coalition.color ? coalition.color : '#808080',
169-
fill: false,
170-
// @ts-ignore
171-
tension: 0.25,
172-
},
173-
{
174-
label: 'Min active points',
175-
data: Object.values(dataPoints).map((score) => score.minActivePoints),
176-
// borderColor: coalition.color ? coalition.color : '#808080',
177-
// backgroundColor: coalition.color ? coalition.color : '#808080',
178-
fill: false,
179-
// @ts-ignore
180-
tension: 0.25,
181-
},
182-
*/
183154
],
184155
},
185156
options: {

src/sync/results.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Fast42 from '@codam/fast42';
22
import { NODE_ENV } from '../env';
3-
import { getRanking, getScoresNormalDistribution, getUsersScores, RANKING_MAX } from '../utils';
3+
import { getRanking, getScoreStatistics, getUsersScores, RANKING_MAX } from '../utils';
44
import { prisma } from './base';
55

66
export const calculateResults = async function(api: Fast42): Promise<void> {
@@ -56,7 +56,7 @@ export const calculateResults = async function(api: Fast42): Promise<void> {
5656
}
5757

5858
// Entire coalition score
59-
const score = await getScoresNormalDistribution(prisma, coalition.id, season.end_at);
59+
const score = await getScoreStatistics(prisma, coalition.id, season.end_at);
6060
console.log(` - Final score for coalition ${coalition.name} in season ${seasonName}: ${score.mean}`);
6161
const result = await prisma.codamCoalitionSeasonResult.create({
6262
data: {

src/utils.ts

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,11 @@ export const getUserSeasonRanking = async function(prisma: PrismaClient, userId:
338338
return userRanking + 1;
339339
};
340340

341-
export interface NormalDistribution {
341+
export interface ScoreStatistics {
342342
dataPoints: number[];
343+
sum: number;
343344
mean: number;
344345
median: number;
345-
stdDev: number;
346346
min: number;
347347
max: number;
348348
};
@@ -424,21 +424,21 @@ export const getUserScores = async function(prisma: PrismaClient, userId: number
424424
return { userScores, totalScore };
425425
};
426426

427-
const getEmptyNormalDistribution = function(): NormalDistribution {
427+
const getEmptyScoreStatistics = function(): ScoreStatistics {
428428
return {
429429
dataPoints: [],
430+
sum: 0,
430431
mean: 0,
431432
median: 0,
432-
stdDev: 0,
433433
min: 0,
434434
max: 0,
435435
};
436436
};
437437

438-
export const getScoresNormalDistribution = async function(prisma: PrismaClient, coalitionId: number, untilDate: Date = new Date()): Promise<NormalDistribution> {
438+
export const getScoreStatistics = async function(prisma: PrismaClient, coalitionId: number, untilDate: Date = new Date()): Promise<ScoreStatistics> {
439439
const bloc = await getBlocAtDate(prisma, untilDate);
440440
if (!bloc) { // No season currently ongoing
441-
return getEmptyNormalDistribution();
441+
return getEmptyScoreStatistics();
442442
}
443443
const scores = await prisma.codamCoalitionScore.groupBy({
444444
by: ['user_id'],
@@ -459,22 +459,20 @@ export const getScoresNormalDistribution = async function(prisma: PrismaClient,
459459
},
460460
});
461461
if (scores.length === 0) { // No scores for this coalition
462-
return getEmptyNormalDistribution();
462+
return getEmptyScoreStatistics();
463463
}
464464
// console.log(scores);
465465
const scoresArray = scores.map(s => s._sum.amount ? s._sum.amount : 0);
466466
const scoresSum = scoresArray.reduce((a, b) => a + b, 0);
467467
const scoresMean = scoresSum / scoresArray.length;
468468
const scoresMedian = scoresArray[Math.floor(scoresArray.length / 2)];
469-
const scoresVariance = scoresArray.reduce((a, b) => a + Math.pow(b - scoresMean, 2), 0) / scoresArray.length;
470-
const scoresStdDev = Math.sqrt(scoresVariance);
471469
const scoresMin = Math.min(...scoresArray);
472470
const scoresMax = Math.max(...scoresArray);
473471
return {
474472
dataPoints: scoresArray,
473+
sum: scoresSum,
475474
mean: scoresMean,
476475
median: scoresMedian,
477-
stdDev: scoresStdDev,
478476
min: scoresMin,
479477
max: scoresMax,
480478
};
@@ -486,19 +484,14 @@ export interface CoalitionScore {
486484
totalPoints: number;
487485
avgPoints: number;
488486
medianPoints: number;
489-
stdDevPoints: number;
490-
minActivePoints: number; // Minimum score for a user to be considered active
487+
totalMembers: number;
491488
totalContributors: number;
492-
activeContributors: number;
493489
};
494490

495491
export const getCoalitionScore = async function(prisma: PrismaClient, coalitionId: number, atDateTime: Date = new Date()): Promise<CoalitionScore> {
496-
const normalDist = await getScoresNormalDistribution(prisma, coalitionId, atDateTime);
497-
const minScore = Math.floor(normalDist.mean - normalDist.stdDev);
498-
const activeScores = normalDist.dataPoints.filter(s => s >= minScore);
499-
const fairScore = Math.floor(activeScores.reduce((a, b) => a + b, 0) / activeScores.length);
492+
const scoreStatistics = await getScoreStatistics(prisma, coalitionId, atDateTime);
500493

501-
const totalActiveMembers = await prisma.intraCoalitionUser.count({
494+
const totalMembers = await prisma.intraCoalitionUser.count({
502495
where: {
503496
coalition_id: coalitionId,
504497
user: {
@@ -513,16 +506,16 @@ export const getCoalitionScore = async function(prisma: PrismaClient, coalitionI
513506
},
514507
});
515508

509+
const totalContributors = Math.min(scoreStatistics.dataPoints.length, totalMembers);
510+
516511
return {
517512
coalition_id: coalitionId,
518-
totalPoints: normalDist.dataPoints.reduce((a, b) => a + b, 0),
519-
avgPoints: normalDist.mean,
520-
medianPoints: normalDist.median,
521-
stdDevPoints: normalDist.stdDev,
522-
minActivePoints: minScore,
523-
score: Math.floor(normalDist.mean), // fairScore can jump down too easily when there are a couple of really well scoring students on top of the leaderboard (scores dataset is not a normal distribution)
524-
totalContributors: Math.min(normalDist.dataPoints.length, totalActiveMembers),
525-
activeContributors: Math.min(activeScores.length, totalActiveMembers),
513+
totalPoints: scoreStatistics.sum,
514+
avgPoints: scoreStatistics.mean,
515+
medianPoints: scoreStatistics.median,
516+
score: Math.floor(scoreStatistics.sum / totalContributors),
517+
totalMembers: totalMembers,
518+
totalContributors: totalContributors,
526519
};
527520
};
528521

templates/admin/dashboard.njk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
<li>Score: {{ coalitionScores[coalition.id].score | thousands }}</li>
4646
<li>Total points: {{ coalitionScores[coalition.id].totalPoints | thousands }}</li>
4747
<li>Total contributor count: {{ coalitionScores[coalition.id].totalContributors | thousands }}</li>
48+
<li>Total member count: {{ coalitionScores[coalition.id].totalMembers | thousands }}</li>
4849
<li>Average points: {{ coalitionScores[coalition.id].avgPoints | toFixed(2) | thousands }}</li>
4950
<li>Median points: {{ coalitionScores[coalition.id].medianPoints | toFixed(2) | thousands }}</li>
50-
<li>Standard deviation points: {{ coalitionScores[coalition.id].stdDevPoints | toFixed(2) | thousands }}</li>
5151
</ul>
5252
<ul>
5353
{% for fixedType, score in coalitionScoresPerFixedType[coalition.id] %}

templates/coalition.njk

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,9 @@
203203
<div class="card-body p-2">
204204
<ul>
205205
<li>Total points: {{ coalitionScore.totalPoints | thousands }}</li>
206-
<li>Active contributors: {{ coalitionScore.activeContributors | thousands }} <small class="text-muted">(any member who has contributed at least 1 point this season)</small></li>
207-
<li>Average points: {{ coalitionScore.score | thousands }} <small class="text-muted">(this becomes the coalition score)</small></li>
206+
<li>Total contributors: {{ coalitionScore.totalContributors | thousands }} <small class="text-muted">(any member who has contributed at least 1 point this season)</small></li>
207+
<li>Average points: {{ coalitionScore.score | thousands }} <small class="text-muted">(this becomes the coalition score: total points / total contributors)</small></li>
208+
<li>Total members: {{ coalitionScore.totalMembers | thousands }}</li>
208209
</ul>
209210
</div>
210211
</div>

0 commit comments

Comments
 (0)