Fix MMS computation for current round and while pairing

This commit is contained in:
Claude Brisson
2024-01-26 08:13:15 +01:00
parent 4278fe9b46
commit a4c55c82e2
4 changed files with 7 additions and 6 deletions

View File

@@ -7,6 +7,7 @@ import org.jeudego.pairgoth.model.PairingType.*
import org.jeudego.pairgoth.pairing.solver.MacMahonSolver
import org.jeudego.pairgoth.pairing.solver.SwissSolver
import java.util.*
import kotlin.math.min
// base pairing parameters
data class BaseCritParams(
@@ -135,8 +136,7 @@ sealed class Pairing(
}
internal fun Tournament<*>.historyBefore(round: Int) =
if (lastRound() == 1) emptyList()
else (1 until round).map { games(it).values.toList() }
(1 until min(round, lastRound() + 1)).map { games(it).values.toList() }
/*private fun Tournament<*>.historyBefore(round: Int) : List<List<Game>> {
println("Welcome to tournament.historyBefore !")

View File

@@ -72,7 +72,7 @@ sealed class Tournament <P: Pairable>(
fun games(round: Int) = games.getOrNull(round - 1) ?:
if (round > games.size + 1) throw Error("invalid round")
else mutableMapOf<ID, Game>().also { games.add(it) }
fun lastRound() = games.size
fun lastRound() = max(1, games.size)
fun recomputeHdAndDUDD(round: Int, gameID: ID) {
// Instantiate solver with game history

View File

@@ -91,8 +91,8 @@ abstract class BasePairingHelper(
val Pairable.sosos: Double get() = historyHelper.sosos[id] ?: 0.0
val Pairable.sodos: Double get() = historyHelper.sodos[id] ?: 0.0
val Pairable.cums: Double get() = historyHelper.cumScore[id] ?: 0.0
fun Pairable.missedRounds(upToRound: Int): Int = (1..upToRound).map { round ->
if (historyHelper.playersPerRound.getOrNull(round - 1)?.contains(id) == true) 0 else 1
fun Pairable.missedRounds(upToRound: Int, pairing: Set<ID>): Int = (1..upToRound).map { round ->
if (historyHelper.playersPerRound.getOrNull(round - 1)?.contains(id) == true || pairing.contains(id)) 0 else 1
}.sum()
fun Pairable.eval(criterion: Criterion) = evalCriterion(this, criterion)
open fun evalCriterion(pairable: Pairable, criterion: Criterion) = when (criterion) {

View File

@@ -16,11 +16,12 @@ class MacMahonSolver(round: Int,
override val scores: Map<ID, Double> by lazy {
require (mmBar > mmFloor) { "MMFloor is higher than MMBar" }
val pairing = pairables.map { it.id }.toSet()
pairablesMap.mapValues {
it.value.let { pairable ->
pairable.mmBase +
pairable.nbW + // TODO take tournament parameter into account
pairable.missedRounds(round) * pairingParams.main.mmsValueAbsent
pairable.missedRounds(round, pairing) * pairingParams.main.mmsValueAbsent
}
}
}