Option to use baseMMS+round/2 for SOS

This commit is contained in:
Claude Brisson
2024-03-11 06:15:10 +01:00
parent ea12fda4b7
commit 412a80f7dd
5 changed files with 34 additions and 13 deletions

View File

@@ -38,13 +38,15 @@ fun Tournament<*>.getSortedPairables(round: Int): List<Json.Object> {
else pairables.mapValues {
it.value.let { pairable ->
val mmBase = pairable.mmBase()
val score = roundScore(mmBase +
(nbW(pairable) ?: 0.0) + // TODO take tournament parameter into account
(1..round).map { round ->
if (playersPerRound.getOrNull(round - 1)?.contains(pairable.id) == true) 0 else 1
}.sum() * pairing.pairingParams.main.mmsValueAbsent)
Pair(
mmBase,
roundScore(mmBase +
(nbW(pairable) ?: 0.0) + // TODO take tournament parameter into account
(1..round).map { round ->
if (playersPerRound.getOrNull(round - 1)?.contains(pairable.id) == true) 0 else 1
}.sum() * pairing.pairingParams.main.mmsValueAbsent)
if (pairing.pairingParams.main.sosValueAbsentUseBase) mmBase
else roundScore(mmBase + round/2),
score
)
}
}

View File

@@ -51,7 +51,8 @@ data class MainCritParams(
val additionalPlacementCritSystem1: Criterion = Criterion.RATING,
val additionalPlacementCritSystem2: Criterion = Criterion.NONE,
val mmsValueAbsent: Double = 0.5,
val roundDownScore: Boolean = true
val roundDownScore: Boolean = true,
val sosValueAbsentUseBase: Boolean = true
) {
enum class DrawUpDown { TOP, MIDDLE, BOTTOM }
enum class SeedMethod { SPLIT_AND_FOLD, SPLIT_AND_RANDOM, SPLIT_AND_SLIP }
@@ -245,7 +246,8 @@ fun MainCritParams.Companion.fromJson(json: Json.Object, localDefault: MainCritP
additionalPlacementCritSystem1 = json.getString("firstSeedAddCrit")?.let { Criterion.valueOf(it) } ?: localDefault?.additionalPlacementCritSystem1 ?: default.additionalPlacementCritSystem1,
additionalPlacementCritSystem2 = json.getString("secondSeedAddCrit")?.let { Criterion.valueOf(it) } ?: localDefault?.additionalPlacementCritSystem2 ?: default.additionalPlacementCritSystem2,
mmsValueAbsent = json.getDouble("mmsValueAbsent") ?: localDefault?.mmsValueAbsent ?: default.mmsValueAbsent,
roundDownScore = json.getBoolean("roundDownScore") ?: localDefault?.roundDownScore ?: default.roundDownScore
roundDownScore = json.getBoolean("roundDownScore") ?: localDefault?.roundDownScore ?: default.roundDownScore,
sosValueAbsentUseBase = json.getBoolean("sosValueAbsentUseBase") ?: localDefault?.sosValueAbsentUseBase ?: default.sosValueAbsentUseBase
)
fun MainCritParams.toJson() = Json.Object(
@@ -262,7 +264,8 @@ fun MainCritParams.toJson() = Json.Object(
"firstSeedAddCrit" to additionalPlacementCritSystem1,
"secondSeedAddCrit" to additionalPlacementCritSystem2,
"mmsValueAbsent" to mmsValueAbsent,
"roundDownScore" to roundDownScore
"roundDownScore" to roundDownScore,
"sosValueAbsentUseBase" to sosValueAbsentUseBase
)
fun SecondaryCritParams.Companion.fromJson(json: Json.Object, localDefault: SecondaryCritParams? = null) = SecondaryCritParams(

View File

@@ -20,11 +20,14 @@ class MacMahonSolver(round: Int,
val pairing = pairables.map { it.id }.toSet()
pairablesMap.mapValues {
it.value.let { pairable ->
Pair(
pairable.mmBase,
roundScore(pairable.mmBase +
val score = roundScore(pairable.mmBase +
pairable.nbW + // TODO take tournament parameter into account
pairable.missedRounds(round, pairing) * pairingParams.main.mmsValueAbsent))
pairable.missedRounds(round, pairing) * pairingParams.main.mmsValueAbsent)
Pair(
if (pairingParams.main.sosValueAbsentUseBase) pairable.mmBase
else roundScore(pairable.mmBase + round/2),
score
)
}
}
}

View File

@@ -216,6 +216,7 @@ onLoad(() => {
main: {
mmsValueAbsent: form.val('mmsValueAbsent'),
roundDownScore: form.val('roundDownScore'),
sosValueAbsentUseBase: form.val('sosValueAbsentUseBase'),
firstSeedLastRound: form.val('firstSeedLastRound'),
firstSeedAddCrit: form.val('firstSeedAddRating') ? 'RATING' : 'NONE', // TODO use client side boolean
firstSeed: form.val('firstSeed'),

View File

@@ -36,6 +36,18 @@
</label>
</div>
</div>
<div class="inline fields">
<div class="field">
<label>
For SOS/SOSOS calculations, use
<select name="sosValueAbsentUseBase">
<option value="true" #if($tour.pairing.main.sosValueAbsentUseBase) selected #end>base MMS</option>
<option value="false" #if(!$tour.pairing.main.sosValueAbsentUseBase) selected #end>base MMS + rounds/2</option>
</select>
of self player when absent from rounds
</label>
</div>
</div>
#end
<div class="ui fluid styled accordion">
<div class="title"><i class="dropdown icon"></i>Seeding methods inside groups of same score</div>