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
)
}
}
}