Merge branch 'pairing2' into webview2
This commit is contained in:
@@ -3,12 +3,9 @@ package org.jeudego.pairgoth.api
|
|||||||
import com.republicate.kson.Json
|
import com.republicate.kson.Json
|
||||||
import com.republicate.kson.toJsonArray
|
import com.republicate.kson.toJsonArray
|
||||||
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
|
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
|
||||||
import org.jeudego.pairgoth.model.Pairing
|
|
||||||
import org.jeudego.pairgoth.model.PairingType
|
|
||||||
import org.jeudego.pairgoth.model.getID
|
import org.jeudego.pairgoth.model.getID
|
||||||
import org.jeudego.pairgoth.model.toID
|
import org.jeudego.pairgoth.model.toID
|
||||||
import org.jeudego.pairgoth.model.toJson
|
import org.jeudego.pairgoth.model.toJson
|
||||||
import org.jeudego.pairgoth.web.Event
|
|
||||||
import org.jeudego.pairgoth.web.Event.*
|
import org.jeudego.pairgoth.web.Event.*
|
||||||
import javax.servlet.http.HttpServletRequest
|
import javax.servlet.http.HttpServletRequest
|
||||||
import javax.servlet.http.HttpServletResponse
|
import javax.servlet.http.HttpServletResponse
|
||||||
@@ -29,7 +26,7 @@ object PairingHandler: PairgothApiHandler {
|
|||||||
val round = getSubSelector(request)?.toIntOrNull() ?: badRequest("invalid round number")
|
val round = getSubSelector(request)?.toIntOrNull() ?: badRequest("invalid round number")
|
||||||
val payload = getArrayPayload(request)
|
val payload = getArrayPayload(request)
|
||||||
val allPlayers = payload.size == 1 && payload[0] == "all"
|
val allPlayers = payload.size == 1 && payload[0] == "all"
|
||||||
if (!allPlayers && tournament.pairing.type == PairingType.SWISS) badRequest("Swiss pairing requires all pairable players")
|
//if (!allPlayers && tournament.pairing.type == PairingType.SWISS) badRequest("Swiss pairing requires all pairable players")
|
||||||
val playing = (tournament.games(round).values).flatMap {
|
val playing = (tournament.games(round).values).flatMap {
|
||||||
listOf(it.black, it.white)
|
listOf(it.black, it.white)
|
||||||
}.toSet()
|
}.toSet()
|
||||||
|
@@ -9,6 +9,7 @@ import org.jeudego.pairgoth.store.Store
|
|||||||
sealed class Pairable(val id: ID, val name: String, open val rating: Int, open val rank: Int) {
|
sealed class Pairable(val id: ID, val name: String, open val rating: Int, open val rank: Int) {
|
||||||
companion object {
|
companion object {
|
||||||
val MIN_RANK: Int = -30 // 30k
|
val MIN_RANK: Int = -30 // 30k
|
||||||
|
val MAX_RANK: Int = 20
|
||||||
}
|
}
|
||||||
abstract fun toJson(): Json.Object
|
abstract fun toJson(): Json.Object
|
||||||
abstract val club: String?
|
abstract val club: String?
|
||||||
@@ -17,6 +18,10 @@ sealed class Pairable(val id: ID, val name: String, open val rating: Int, open v
|
|||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
val skip = mutableSetOf<Int>() // skipped rounds
|
val skip = mutableSetOf<Int>() // skipped rounds
|
||||||
|
|
||||||
|
fun equals(other: Pairable): Boolean {
|
||||||
|
return id == other.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object ByePlayer: Pairable(0, "bye", 0, Int.MIN_VALUE) {
|
object ByePlayer: Pairable(0, "bye", 0, Int.MIN_VALUE) {
|
||||||
|
@@ -4,8 +4,8 @@ import com.republicate.kson.Json
|
|||||||
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
|
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
|
||||||
import org.jeudego.pairgoth.model.MainCritParams.SeedMethod.SPLIT_AND_SLIP
|
import org.jeudego.pairgoth.model.MainCritParams.SeedMethod.SPLIT_AND_SLIP
|
||||||
import org.jeudego.pairgoth.model.PairingType.*
|
import org.jeudego.pairgoth.model.PairingType.*
|
||||||
import org.jeudego.pairgoth.pairing.MacMahonSolver
|
import org.jeudego.pairgoth.pairing.solver.MacMahonSolver
|
||||||
import org.jeudego.pairgoth.pairing.SwissSolver
|
import org.jeudego.pairgoth.pairing.solver.SwissSolver
|
||||||
|
|
||||||
// base pairing parameters
|
// base pairing parameters
|
||||||
data class BaseCritParams(
|
data class BaseCritParams(
|
||||||
@@ -14,7 +14,8 @@ data class BaseCritParams(
|
|||||||
val dupWeight: Double = MAX_AVOIDDUPGAME,
|
val dupWeight: Double = MAX_AVOIDDUPGAME,
|
||||||
val random: Double = 0.0,
|
val random: Double = 0.0,
|
||||||
val deterministic: Boolean = true,
|
val deterministic: Boolean = true,
|
||||||
val colorBalanceWeight: Double = MAX_COLOR_BALANCE
|
val colorBalanceWeight: Double = MAX_COLOR_BALANCE,
|
||||||
|
val byeWeight: Double = MAX_BYE_WEIGHT // This weight is not in opengotha
|
||||||
) {
|
) {
|
||||||
init {
|
init {
|
||||||
if (nx1 < 0.0 || nx1 > 1.0) throw Error("invalid standardNX1Factor")
|
if (nx1 < 0.0 || nx1 > 1.0) throw Error("invalid standardNX1Factor")
|
||||||
@@ -25,6 +26,7 @@ data class BaseCritParams(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val MAX_AVOIDDUPGAME = 500000000000000.0 // 5e14
|
const val MAX_AVOIDDUPGAME = 500000000000000.0 // 5e14
|
||||||
|
const val MAX_BYE_WEIGHT = 100000000000.0 // 1e11
|
||||||
const val MAX_RANDOM = 1000000000.0 // 1e9
|
const val MAX_RANDOM = 1000000000.0 // 1e9
|
||||||
const val MAX_COLOR_BALANCE = 1000000.0 // 1e6
|
const val MAX_COLOR_BALANCE = 1000000.0 // 1e6
|
||||||
val default = BaseCritParams()
|
val default = BaseCritParams()
|
||||||
|
@@ -0,0 +1,134 @@
|
|||||||
|
package org.jeudego.pairgoth.pairing
|
||||||
|
|
||||||
|
import org.jeudego.pairgoth.model.*
|
||||||
|
|
||||||
|
abstract class BasePairingHelper(
|
||||||
|
history: List<List<Game>>, // History of all games played for each round
|
||||||
|
var pairables: List<Pairable>, // All pairables for this round, it may include the bye player
|
||||||
|
val pairing: PairingParams,
|
||||||
|
val placement: PlacementParams,
|
||||||
|
) {
|
||||||
|
|
||||||
|
abstract val scores: Map<ID, Double>
|
||||||
|
val historyHelper = if (pairables.first().let { it is TeamTournament.Team && it.teamOfIndividuals }) TeamOfIndividualsHistoryHelper(history) { scores }
|
||||||
|
else HistoryHelper(history) { scores }
|
||||||
|
|
||||||
|
// The main criterion that will be used to define the groups should be defined by subclasses
|
||||||
|
// SOS and variants will be computed based on this score
|
||||||
|
val Pairable.main: Double get() = scores[id] ?: 0.0
|
||||||
|
abstract val mainLimits: Pair<Double, Double>
|
||||||
|
|
||||||
|
// pairables sorted using overloadable sort function
|
||||||
|
protected val sortedPairables by lazy {
|
||||||
|
pairables.sortedWith(::sort)
|
||||||
|
}
|
||||||
|
// pairables sorted for pairing purposes
|
||||||
|
protected val pairingSortedPairables by lazy {
|
||||||
|
pairables.sortedWith(::pairingSort)
|
||||||
|
}
|
||||||
|
// pairables sorted for pairing purposes
|
||||||
|
protected val nameSortedPairables by lazy {
|
||||||
|
pairables.sortedWith(::nameSort)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected val pairablesMap by lazy {
|
||||||
|
pairables.associateBy { it.id }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generic parameters calculation
|
||||||
|
//private val standingScore by lazy { computeStandingScore() }
|
||||||
|
|
||||||
|
// Decide each pairable group based on the main criterion
|
||||||
|
protected val groupsCount get() = 1 + (mainLimits.second - mainLimits.first).toInt()
|
||||||
|
private val _groups by lazy {
|
||||||
|
pairables.associate { pairable -> Pair(pairable.id, pairable.main.toInt()) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// place (among sorted pairables)
|
||||||
|
val Pairable.place: Int get() = _place[id]!!
|
||||||
|
private val _place by lazy {
|
||||||
|
pairingSortedPairables.mapIndexed { index, pairable ->
|
||||||
|
Pair(pairable.id, index)
|
||||||
|
}.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// placeInGroup (of same score) : Pair(place, groupSize)
|
||||||
|
protected val Pairable.placeInGroup: Pair<Int, Int> get() = _placeInGroup[id]!!
|
||||||
|
private val _placeInGroup by lazy {
|
||||||
|
// group by group number
|
||||||
|
pairingSortedPairables.groupBy {
|
||||||
|
it.group
|
||||||
|
// get a list { id { placeInGroup, groupSize } }
|
||||||
|
}.values.flatMap { group ->
|
||||||
|
group.mapIndexed { index, pairable ->
|
||||||
|
Pair(pairable.id, Pair(index, group.size))
|
||||||
|
}
|
||||||
|
// get a map id -> { placeInGroup, groupSize }
|
||||||
|
}.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// already paired players map
|
||||||
|
protected fun Pairable.played(other: Pairable) = historyHelper.playedTogether(this, other)
|
||||||
|
|
||||||
|
// color balance (nw - nb)
|
||||||
|
protected val Pairable.colorBalance: Int get() = historyHelper.colorBalance(this) ?: 0
|
||||||
|
|
||||||
|
protected val Pairable.group: Int get() = _groups[id]!!
|
||||||
|
|
||||||
|
protected val Pairable.drawnUpDown: Pair<Int,Int> get() = historyHelper.drawnUpDown(this) ?: Pair(0,0)
|
||||||
|
|
||||||
|
protected val Pairable.nbBye: Int get() = historyHelper.nbPlayedWithBye(this) ?: 0
|
||||||
|
|
||||||
|
// score (number of wins)
|
||||||
|
val Pairable.nbW: Double get() = historyHelper.nbW(this) ?: 0.0
|
||||||
|
|
||||||
|
val Pairable.sos: Double get() = historyHelper.sos[id] ?: 0.0
|
||||||
|
val Pairable.sosm1: Double get() = historyHelper.sosm1[id] ?: 0.0
|
||||||
|
val Pairable.sosm2: Double get() = historyHelper.sosm2[id] ?: 0.0
|
||||||
|
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.eval(criterion: Criterion) = evalCriterion(this, criterion)
|
||||||
|
open fun evalCriterion(pairable: Pairable, criterion: Criterion) = when (criterion) {
|
||||||
|
Criterion.NONE -> 0.0
|
||||||
|
Criterion.CATEGORY -> TODO()
|
||||||
|
Criterion.RANK -> pairable.rank.toDouble()
|
||||||
|
Criterion.RATING -> pairable.rating.toDouble()
|
||||||
|
Criterion.NBW -> pairable.nbW
|
||||||
|
Criterion.SOSW -> pairable.sos
|
||||||
|
Criterion.SOSWM1 -> pairable.sosm1
|
||||||
|
Criterion.SOSWM2 -> pairable.sosm2
|
||||||
|
Criterion.SOSOSW -> pairable.sosos
|
||||||
|
Criterion.SODOSW -> pairable.sodos
|
||||||
|
Criterion.CUSSW -> pairable.cums
|
||||||
|
else -> throw Error("criterion cannot be evaluated: ${criterion.name}")
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun sort(p: Pairable, q: Pairable): Int {
|
||||||
|
for (criterion in placement.criteria) {
|
||||||
|
val criterionP = p.eval(criterion)
|
||||||
|
val criterionQ = q.eval(criterion)
|
||||||
|
if (criterionP != criterionQ) {
|
||||||
|
return (criterionQ * 100 - criterionP * 100).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
open fun pairingSort(p: Pairable, q: Pairable): Int {
|
||||||
|
for (criterion in placement.criteria) {
|
||||||
|
val criterionP = p.eval(criterion)
|
||||||
|
val criterionQ = q.eval(criterion)
|
||||||
|
if (criterionP != criterionQ) {
|
||||||
|
return (criterionQ * 1e6 - criterionP * 1e6).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p.rating == q.rating) {
|
||||||
|
return if (p.name > q.name) 1 else -1
|
||||||
|
}
|
||||||
|
return q.rating - p.rating
|
||||||
|
}
|
||||||
|
open fun nameSort(p: Pairable, q: Pairable): Int {
|
||||||
|
return if (p.name > q.name) 1 else -1
|
||||||
|
}
|
||||||
|
}
|
@@ -20,6 +20,7 @@ open class HistoryHelper(protected val history: List<List<Game>>, scoresGetter:
|
|||||||
// Generic helper functions
|
// Generic helper functions
|
||||||
open fun playedTogether(p1: Pairable, p2: Pairable) = paired.contains(Pair(p1.id, p2.id))
|
open fun playedTogether(p1: Pairable, p2: Pairable) = paired.contains(Pair(p1.id, p2.id))
|
||||||
open fun colorBalance(p: Pairable) = colorBalance[p.id]
|
open fun colorBalance(p: Pairable) = colorBalance[p.id]
|
||||||
|
open fun nbPlayedWithBye(p: Pairable) = nbPlayedWithBye[p.id]
|
||||||
open fun nbW(p: Pairable) = wins[p.id]
|
open fun nbW(p: Pairable) = wins[p.id]
|
||||||
|
|
||||||
fun drawnUpDown(p: Pairable) = drawnUpDown[p.id]
|
fun drawnUpDown(p: Pairable) = drawnUpDown[p.id]
|
||||||
@@ -46,6 +47,17 @@ open class HistoryHelper(protected val history: List<List<Game>>, scoresGetter:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val nbPlayedWithBye: Map<ID, Int> by lazy {
|
||||||
|
history.flatten().flatMap { game ->
|
||||||
|
// Duplicates (white, black) into (white, black) and (black, white)
|
||||||
|
listOf(Pair(game.white, game.black), Pair(game.black, game.white))
|
||||||
|
}.groupingBy {
|
||||||
|
it.first
|
||||||
|
}.fold(0) { acc, next ->
|
||||||
|
acc + if (next.second == ByePlayer.id) 1 else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val wins: Map<ID, Double> by lazy {
|
val wins: Map<ID, Double> by lazy {
|
||||||
mutableMapOf<ID, Double>().apply {
|
mutableMapOf<ID, Double>().apply {
|
||||||
history.flatten().forEach { game ->
|
history.flatten().forEach { game ->
|
||||||
|
@@ -1,3 +1,8 @@
|
|||||||
|
# File hierarchy
|
||||||
|
- `HistoryHelper.kt` computes all the criterion for pairings and standings like number of wins, colors, sos, etc
|
||||||
|
- `BasePairingHelper.kt` extends the `Pairable` objects with attributes corresponding to these criteria. This class plays the role of the `ScoredPlayer` in OpenGotha.
|
||||||
|
- `solver` folder contains the actual solver base class and the concrete solvers for different tournaments type (Swiss, MacMahon, etc).
|
||||||
|
|
||||||
# Weights internal name
|
# Weights internal name
|
||||||
## Base criteria
|
## Base criteria
|
||||||
- avoiddup
|
- avoiddup
|
||||||
|
@@ -0,0 +1,22 @@
|
|||||||
|
package org.jeudego.pairgoth.pairing
|
||||||
|
|
||||||
|
import org.jeudego.pairgoth.model.Pairable
|
||||||
|
|
||||||
|
fun detRandom(max: Double, p1: Pairable, p2: Pairable): Double {
|
||||||
|
var inverse = false
|
||||||
|
var name1 = p1.nameSeed("")
|
||||||
|
var name2 = p2.nameSeed("")
|
||||||
|
if (name1 > name2) {
|
||||||
|
name1 = name2.also { name2 = name1 }
|
||||||
|
inverse = true
|
||||||
|
}
|
||||||
|
var nR = "$name1$name2".mapIndexed { i, c ->
|
||||||
|
c.code.toDouble() * (i + 1)
|
||||||
|
}.sum() * 1234567 % (max + 1)
|
||||||
|
if (inverse) nR = max - nR
|
||||||
|
return nR
|
||||||
|
}
|
||||||
|
|
||||||
|
fun nonDetRandom(max: Double) =
|
||||||
|
if (max == 0.0) 0.0
|
||||||
|
else Math.random() * (max + 1.0)
|
@@ -1,8 +1,10 @@
|
|||||||
package org.jeudego.pairgoth.pairing
|
package org.jeudego.pairgoth.pairing.solver
|
||||||
|
|
||||||
import org.jeudego.pairgoth.model.*
|
import org.jeudego.pairgoth.model.*
|
||||||
import org.jeudego.pairgoth.model.Criterion.*
|
|
||||||
import org.jeudego.pairgoth.model.MainCritParams.SeedMethod.*
|
import org.jeudego.pairgoth.model.MainCritParams.SeedMethod.*
|
||||||
|
import org.jeudego.pairgoth.pairing.BasePairingHelper
|
||||||
|
import org.jeudego.pairgoth.pairing.detRandom
|
||||||
|
import org.jeudego.pairgoth.pairing.nonDetRandom
|
||||||
import org.jeudego.pairgoth.store.Store
|
import org.jeudego.pairgoth.store.Store
|
||||||
import org.jgrapht.alg.matching.blossom.v5.KolmogorovWeightedPerfectMatching
|
import org.jgrapht.alg.matching.blossom.v5.KolmogorovWeightedPerfectMatching
|
||||||
import org.jgrapht.alg.matching.blossom.v5.ObjectiveSense
|
import org.jgrapht.alg.matching.blossom.v5.ObjectiveSense
|
||||||
@@ -16,99 +18,19 @@ import kotlin.math.abs
|
|||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
fun detRandom(max: Double, p1: Pairable, p2: Pairable): Double {
|
sealed class BaseSolver(
|
||||||
var inverse = false
|
val round: Int, // Round number
|
||||||
var name1 = p1.nameSeed("")
|
history: List<List<Game>>, // History of all games played for each round
|
||||||
var name2 = p2.nameSeed("")
|
pairables: List<Pairable>, // All pairables for this round, it may include the bye player
|
||||||
if (name1 > name2) {
|
pairing: PairingParams,
|
||||||
name1 = name2.also { name2 = name1 }
|
placement: PlacementParams,
|
||||||
inverse = true
|
) : BasePairingHelper(history, pairables, pairing, placement) {
|
||||||
}
|
|
||||||
var nR = "$name1$name2".mapIndexed { i, c ->
|
|
||||||
c.code.toDouble() * (i + 1)
|
|
||||||
}.sum() * 1234567 % (max + 1)
|
|
||||||
if (inverse) nR = max - nR
|
|
||||||
return nR
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun nonDetRandom(max: Double) =
|
|
||||||
if (max == 0.0) 0.0
|
|
||||||
else Math.random() * (max + 1.0)
|
|
||||||
|
|
||||||
sealed class Solver(
|
|
||||||
val round: Int,
|
|
||||||
history: List<List<Game>>,
|
|
||||||
val pairables: List<Pairable>,
|
|
||||||
val pairing: PairingParams,
|
|
||||||
val placement: PlacementParams
|
|
||||||
) {
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val rand = Random(/* seed from properties - TODO */)
|
val rand = Random(/* seed from properties - TODO */)
|
||||||
val DEBUG_EXPORT_WEIGHT = true
|
val DEBUG_EXPORT_WEIGHT = true
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract val scores: Map<ID, Double>
|
|
||||||
val historyHelper = if (pairables.first().let { it is TeamTournament.Team && it.teamOfIndividuals }) TeamOfIndividualsHistoryHelper(history) { scores }
|
|
||||||
else HistoryHelper(history) { scores }
|
|
||||||
|
|
||||||
// pairables sorted using overloadable sort function
|
|
||||||
private val sortedPairables by lazy {
|
|
||||||
pairables.sortedWith(::sort)
|
|
||||||
}
|
|
||||||
// pairables sorted for pairing purposes
|
|
||||||
private val pairingSortedPairables by lazy {
|
|
||||||
pairables.sortedWith(::pairingSort)
|
|
||||||
}
|
|
||||||
// pairables sorted for pairing purposes
|
|
||||||
private val nameSortedPairables by lazy {
|
|
||||||
pairables.sortedWith(::nameSort)
|
|
||||||
}
|
|
||||||
// Sorting for logging purpose
|
|
||||||
private val logSortedPairablesMap by lazy {
|
|
||||||
val logSortedPairables = pairables.sortedWith(::logSort)
|
|
||||||
logSortedPairables.associateWith { logSortedPairables.indexOf(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected val pairablesMap by lazy {
|
|
||||||
pairables.associateBy { it.id }
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun sort(p: Pairable, q: Pairable): Int {
|
|
||||||
for (criterion in placement.criteria) {
|
|
||||||
val criterionP = p.eval(criterion)
|
|
||||||
val criterionQ = q.eval(criterion)
|
|
||||||
if (criterionP != criterionQ) {
|
|
||||||
return (criterionP * 100 - criterionQ * 100).toInt()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
open fun pairingSort(p: Pairable, q: Pairable): Int {
|
|
||||||
for (criterion in placement.criteria) {
|
|
||||||
val criterionP = p.eval(criterion)
|
|
||||||
val criterionQ = q.eval(criterion)
|
|
||||||
if (criterionP != criterionQ) {
|
|
||||||
return (criterionP * 100 - criterionQ * 100).toInt()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (p.rating == q.rating) {
|
|
||||||
return if (p.name > q.name) 1 else -1
|
|
||||||
}
|
|
||||||
return q.rating - p.rating
|
|
||||||
|
|
||||||
}
|
|
||||||
open fun nameSort(p: Pairable, q: Pairable): Int {
|
|
||||||
return if (p.name > q.name) 1 else -1
|
|
||||||
}
|
|
||||||
// Sorting function to order the weight matrix for debugging
|
|
||||||
open fun logSort(p: Pairable, q: Pairable): Int {
|
|
||||||
if (p.rating == q.rating) {
|
|
||||||
return if (p.name > q.name) 1 else -1
|
|
||||||
}
|
|
||||||
return p.rating - q.rating
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun openGothaWeight(p1: Pairable, p2: Pairable) =
|
open fun openGothaWeight(p1: Pairable, p2: Pairable) =
|
||||||
1.0 + // 1 is minimum value because 0 means "no matching allowed"
|
1.0 + // 1 is minimum value because 0 means "no matching allowed"
|
||||||
pairing.base.apply(p1, p2) +
|
pairing.base.apply(p1, p2) +
|
||||||
@@ -118,15 +40,12 @@ sealed class Solver(
|
|||||||
|
|
||||||
open fun weight(p1: Pairable, p2: Pairable) =
|
open fun weight(p1: Pairable, p2: Pairable) =
|
||||||
openGothaWeight(p1, p2) +
|
openGothaWeight(p1, p2) +
|
||||||
|
//pairing.base.applyByeWeight(p1, p2) +
|
||||||
pairing.handicap.color(p1, p2)
|
pairing.handicap.color(p1, p2)
|
||||||
|
|
||||||
// The main criterion that will be used to define the groups should be defined by subclasses
|
|
||||||
val Pairable.main: Double get() = scores[id] ?: 0.0
|
|
||||||
abstract val mainLimits: Pair<Double, Double>
|
|
||||||
// SOS and variants will be computed based on this score
|
|
||||||
fun pair(): List<Game> {
|
fun pair(): List<Game> {
|
||||||
weightLogs.clear()
|
|
||||||
// check that at this stage, we have an even number of pairables
|
// check that at this stage, we have an even number of pairables
|
||||||
|
// The BYE player should have been added beforehand to make a number of pairables even.
|
||||||
if (pairables.size % 2 != 0) throw Error("expecting an even number of pairables")
|
if (pairables.size % 2 != 0) throw Error("expecting an even number of pairables")
|
||||||
val builder = GraphBuilder(SimpleDirectedWeightedGraph<Pairable, DefaultWeightedEdge>(DefaultWeightedEdge::class.java))
|
val builder = GraphBuilder(SimpleDirectedWeightedGraph<Pairable, DefaultWeightedEdge>(DefaultWeightedEdge::class.java))
|
||||||
|
|
||||||
@@ -162,7 +81,6 @@ sealed class Solver(
|
|||||||
File(WEIGHTS_FILE).appendText("secGeoCost="+dec.format(pairing.geo.apply(p, q))+"\n")
|
File(WEIGHTS_FILE).appendText("secGeoCost="+dec.format(pairing.geo.apply(p, q))+"\n")
|
||||||
File(WEIGHTS_FILE).appendText("totalCost="+dec.format(openGothaWeight(p,q))+"\n")
|
File(WEIGHTS_FILE).appendText("totalCost="+dec.format(openGothaWeight(p,q))+"\n")
|
||||||
|
|
||||||
logWeights("total", p, q, weight(p,q))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,34 +88,37 @@ sealed class Solver(
|
|||||||
val matching = KolmogorovWeightedPerfectMatching(graph, ObjectiveSense.MAXIMIZE)
|
val matching = KolmogorovWeightedPerfectMatching(graph, ObjectiveSense.MAXIMIZE)
|
||||||
val solution = matching.matching
|
val solution = matching.matching
|
||||||
|
|
||||||
fun gamesSort(p1:Pairable, p2:Pairable) = 0.5*(p1.place + p2.place)
|
val sorted = solution.map{
|
||||||
|
|
||||||
var sorted = solution.map{
|
|
||||||
listOf(graph.getEdgeSource(it), graph.getEdgeTarget(it))
|
listOf(graph.getEdgeSource(it), graph.getEdgeTarget(it))
|
||||||
}.sortedBy { gamesSort(it[0],it[1])}
|
}.sortedWith(compareBy({ min(it[0].place, it[1].place) }))
|
||||||
|
|
||||||
|
val result = sorted.flatMap { games(white = it[0], black = it[1]) }
|
||||||
|
|
||||||
var result = sorted.flatMap { games(white = it[0], black = it[1]) }
|
if (DEBUG_EXPORT_WEIGHT) {
|
||||||
|
var sumOfWeights = 0.0
|
||||||
|
for (it in sorted) {
|
||||||
|
println(it[0].nameSeed() + " " + it[0].place.toString()
|
||||||
|
+ " " + it[0].id.toString()
|
||||||
|
+ " " + it[0].colorBalance.toString()
|
||||||
|
+ " " + it[0].group.toString()
|
||||||
|
+ " " + it[0].drawnUpDown.toString()
|
||||||
|
+ " vs " + it[1].nameSeed()
|
||||||
|
+ " " + it[1].place.toString()
|
||||||
|
+ " " + it[1].id.toString()
|
||||||
|
+ " " + it[1].colorBalance.toString()
|
||||||
|
+ " " + it[1].group.toString()
|
||||||
|
+ " " + it[1].drawnUpDown.toString()
|
||||||
|
)
|
||||||
|
sumOfWeights += weight(it[0], it[1])
|
||||||
|
}
|
||||||
|
val dec = DecimalFormat("#.#")
|
||||||
|
println("sumOfWeights = " + dec.format(sumOfWeights))
|
||||||
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var weightLogs: MutableMap<String, Array<DoubleArray>> = mutableMapOf()
|
// Base criteria
|
||||||
fun logWeights(weightName: String, p1: Pairable, p2: Pairable, weight: Double) {
|
|
||||||
if (DEBUG_EXPORT_WEIGHT) {
|
|
||||||
if (!weightLogs.contains(weightName)) {
|
|
||||||
weightLogs[weightName] = Array(pairables.size) { DoubleArray(pairables.size) }
|
|
||||||
}
|
|
||||||
val pos1: Int = logSortedPairablesMap[p1]!!
|
|
||||||
val pos2: Int = logSortedPairablesMap[p2]!!
|
|
||||||
weightLogs[weightName]!![pos1][pos2] = weight
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// base criteria
|
|
||||||
|
|
||||||
open fun BaseCritParams.apply(p1: Pairable, p2: Pairable): Double {
|
open fun BaseCritParams.apply(p1: Pairable, p2: Pairable): Double {
|
||||||
var score = 0.0
|
var score = 0.0
|
||||||
// Base Criterion 1 : Avoid Duplicating Game
|
// Base Criterion 1 : Avoid Duplicating Game
|
||||||
@@ -215,14 +136,12 @@ sealed class Solver(
|
|||||||
open fun BaseCritParams.avoidDuplicatingGames(p1: Pairable, p2: Pairable): Double {
|
open fun BaseCritParams.avoidDuplicatingGames(p1: Pairable, p2: Pairable): Double {
|
||||||
val score = if (p1.played(p2)) 0.0 // We get no score if pairables already played together
|
val score = if (p1.played(p2)) 0.0 // We get no score if pairables already played together
|
||||||
else dupWeight
|
else dupWeight
|
||||||
logWeights("avoiddup", p1, p2, score)
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun BaseCritParams.applyRandom(p1: Pairable, p2: Pairable): Double {
|
open fun BaseCritParams.applyRandom(p1: Pairable, p2: Pairable): Double {
|
||||||
val score = if (deterministic) detRandom(random, p1, p2)
|
val score = if (deterministic) detRandom(random, p1, p2)
|
||||||
else nonDetRandom(random)
|
else nonDetRandom(random)
|
||||||
logWeights("random", p1, p2, score)
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,10 +156,22 @@ sealed class Solver(
|
|||||||
if (wb1 * wb2 < 0) colorBalanceWeight
|
if (wb1 * wb2 < 0) colorBalanceWeight
|
||||||
else if (wb1 == 0 && abs(wb2) >= 2 || wb2 == 0 && abs(wb1) >= 2) colorBalanceWeight / 2 else 0.0
|
else if (wb1 == 0 && abs(wb2) >= 2 || wb2 == 0 && abs(wb1) >= 2) colorBalanceWeight / 2 else 0.0
|
||||||
} else 0.0
|
} else 0.0
|
||||||
logWeights("color", p1, p2, score)
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun BaseCritParams.applyByeWeight(p1: Pairable, p2: Pairable): Double {
|
||||||
|
// The weight is applied if one of p1 or p2 is the BYE player
|
||||||
|
return if (p1.id == ByePlayer.id || p2.id == ByePlayer.id) {
|
||||||
|
val actualPlayer = if (p1.id == ByePlayer.id) p2 else p1
|
||||||
|
// TODO maybe use a different formula than opengotha
|
||||||
|
val x = (actualPlayer.rank - Pairable.MIN_RANK + actualPlayer.main) / (Pairable.MAX_RANK - Pairable.MIN_RANK + mainLimits.second)
|
||||||
|
concavityFunction(x, BaseCritParams.MAX_BYE_WEIGHT)
|
||||||
|
BaseCritParams.MAX_BYE_WEIGHT - (actualPlayer.rank + 2*actualPlayer.main)
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Main criteria
|
// Main criteria
|
||||||
open fun MainCritParams.apply(p1: Pairable, p2: Pairable): Double {
|
open fun MainCritParams.apply(p1: Pairable, p2: Pairable): Double {
|
||||||
var score = 0.0
|
var score = 0.0
|
||||||
@@ -274,11 +205,9 @@ sealed class Solver(
|
|||||||
// TODO check category equality if category are used in SwissCat
|
// TODO check category equality if category are used in SwissCat
|
||||||
if (scoreRange!=0){
|
if (scoreRange!=0){
|
||||||
val x = abs(p1.group - p2.group).toDouble() / scoreRange.toDouble()
|
val x = abs(p1.group - p2.group).toDouble() / scoreRange.toDouble()
|
||||||
val k: Double = pairing.base.nx1
|
score = concavityFunction(x, scoreWeight)
|
||||||
score = scoreWeight * (1.0 - x) * (1.0 + k * x)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logWeights("score", p1, p2, score)
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,6 +215,84 @@ sealed class Solver(
|
|||||||
var score = 0.0
|
var score = 0.0
|
||||||
|
|
||||||
// TODO apply Drawn-Up/Drawn-Down if needed
|
// TODO apply Drawn-Up/Drawn-Down if needed
|
||||||
|
// Main Criterion 3 : If different groups, make a directed Draw-up/Draw-down
|
||||||
|
// Modifs V3.44.05 (ideas from Tuomo Salo)
|
||||||
|
|
||||||
|
if (Math.abs(p1.group - p2.group) < 4 && (p1.group != p2.group)) {
|
||||||
|
// 5 scenarii
|
||||||
|
// scenario = 0 : Both players have already been drawn in the same sense
|
||||||
|
// scenario = 1 : One of the players has already been drawn in the same sense
|
||||||
|
// scenario = 2 : Normal conditions (does not correct anything and no previous drawn in the same sense)
|
||||||
|
// This case also occurs if one DU/DD is increased, while one is compensated
|
||||||
|
// scenario = 3 : It corrects a previous DU/DD //
|
||||||
|
// scenario = 4 : it corrects a previous DU/DD for both
|
||||||
|
var scenario = 2
|
||||||
|
val p1_DU = p1.drawnUpDown.first
|
||||||
|
val p1_DD = p1.drawnUpDown.second
|
||||||
|
val p2_DU = p2.drawnUpDown.first
|
||||||
|
val p2_DD = p2.drawnUpDown.second
|
||||||
|
|
||||||
|
if (p1_DU > 0 && p1.group > p2.group) {
|
||||||
|
scenario--
|
||||||
|
}
|
||||||
|
if (p1_DD > 0 && p1.group < p2.group) {
|
||||||
|
scenario--
|
||||||
|
}
|
||||||
|
if (p2_DU > 0 && p2.group > p1.group) {
|
||||||
|
scenario--
|
||||||
|
}
|
||||||
|
if (p2_DD > 0 && p2.group < p1.group) {
|
||||||
|
scenario--
|
||||||
|
}
|
||||||
|
if (scenario != 0 && p1_DU > 0 && p1_DD < p1_DU && p1.group < p2.group) {
|
||||||
|
scenario++
|
||||||
|
}
|
||||||
|
if (scenario != 0 && p1_DD > 0 && p1_DU < p1_DD && p1.group > p2.group) {
|
||||||
|
scenario++
|
||||||
|
}
|
||||||
|
if (scenario != 0 && p2_DU > 0 && p2_DD < p2_DU && p2.group < p1.group) {
|
||||||
|
scenario++
|
||||||
|
}
|
||||||
|
if (scenario != 0 && p2_DD > 0 && p2_DU < p2_DD && p2.group > p1.group) {
|
||||||
|
scenario++
|
||||||
|
}
|
||||||
|
val duddWeight: Double = pairing.main.drawUpDownWeight/5.0
|
||||||
|
val upperSP = if (p1.group < p2.group) p1 else p2
|
||||||
|
val lowerSP = if (p1.group < p2.group) p2 else p1
|
||||||
|
val uSPgroupSize = upperSP.placeInGroup.second
|
||||||
|
val lSPgroupSize = lowerSP.placeInGroup.second
|
||||||
|
|
||||||
|
if (pairing.main.drawUpDownUpperMode === MainCritParams.DrawUpDown.TOP) {
|
||||||
|
score += duddWeight / 2 * (uSPgroupSize - 1 - upperSP.placeInGroup.first) / uSPgroupSize
|
||||||
|
} else if (pairing.main.drawUpDownUpperMode === MainCritParams.DrawUpDown.MIDDLE) {
|
||||||
|
score += duddWeight / 2 * (uSPgroupSize - 1 - Math.abs(2 * upperSP.placeInGroup.first - uSPgroupSize + 1)) / uSPgroupSize
|
||||||
|
} else if (pairing.main.drawUpDownUpperMode === MainCritParams.DrawUpDown.BOTTOM) {
|
||||||
|
score += duddWeight / 2 * upperSP.placeInGroup.first / uSPgroupSize
|
||||||
|
}
|
||||||
|
if (pairing.main.drawUpDownLowerMode === MainCritParams.DrawUpDown.TOP) {
|
||||||
|
score += duddWeight / 2 * (lSPgroupSize - 1 - lowerSP.placeInGroup.first) / lSPgroupSize
|
||||||
|
} else if (pairing.main.drawUpDownLowerMode === MainCritParams.DrawUpDown.MIDDLE) {
|
||||||
|
score += duddWeight / 2 * (lSPgroupSize - 1 - Math.abs(2 * lowerSP.placeInGroup.first - lSPgroupSize + 1)) / lSPgroupSize
|
||||||
|
} else if (pairing.main.drawUpDownLowerMode === MainCritParams.DrawUpDown.BOTTOM) {
|
||||||
|
score += duddWeight / 2 * lowerSP.placeInGroup.first / lSPgroupSize
|
||||||
|
}
|
||||||
|
if (scenario == 0) {
|
||||||
|
// Do nothing
|
||||||
|
} else if (scenario == 1) {
|
||||||
|
score += 1 * duddWeight
|
||||||
|
} else if (scenario == 2 || (scenario > 2 && !pairing.main.compensateDrawUpDown)) {
|
||||||
|
score += 2 * duddWeight
|
||||||
|
} else if (scenario == 3) {
|
||||||
|
score += 3 * duddWeight
|
||||||
|
} else if (scenario == 4) {
|
||||||
|
score += 4 * duddWeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO adapt to Swiss with categories
|
||||||
|
/*// But, if players come from different categories, decrease score(added in 3.11)
|
||||||
|
val catGap: Int = Math.abs(p1.category(gps) - p2.category(gps))
|
||||||
|
score = score / (catGap + 1) / (catGap + 1) / (catGap + 1) / (catGap + 1)*/
|
||||||
|
|
||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
@@ -324,7 +331,6 @@ sealed class Solver(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logWeights("seed", p1, p2, score)
|
|
||||||
return Math.round(score).toDouble()
|
return Math.round(score).toDouble()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,9 +440,9 @@ sealed class Solver(
|
|||||||
val hd = pairing.handicap.handicap(p1,p2)
|
val hd = pairing.handicap.handicap(p1,p2)
|
||||||
if(hd==0){
|
if(hd==0){
|
||||||
if (p1.colorBalance > p2.colorBalance) {
|
if (p1.colorBalance > p2.colorBalance) {
|
||||||
score = 1.0
|
score = - 1.0
|
||||||
} else if (p1.colorBalance < p2.colorBalance) {
|
} else if (p1.colorBalance < p2.colorBalance) {
|
||||||
score = -1.0
|
score = 1.0
|
||||||
} else { // choose color from a det random
|
} else { // choose color from a det random
|
||||||
if (detRandom(1.0, p1, p2) === 0.0) {
|
if (detRandom(1.0, p1, p2) === 0.0) {
|
||||||
score = 1.0
|
score = 1.0
|
||||||
@@ -448,74 +454,14 @@ sealed class Solver(
|
|||||||
return score
|
return score
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun concavityFunction(x: Double, scale: Double) : Double {
|
||||||
|
val k = pairing.base.nx1
|
||||||
|
return scale * (1.0 - x) * (1.0 + k * x)
|
||||||
|
}
|
||||||
|
|
||||||
open fun games(black: Pairable, white: Pairable): List<Game> {
|
open fun games(black: Pairable, white: Pairable): List<Game> {
|
||||||
// CB TODO team of individuals pairing
|
// CB TODO team of individuals pairing
|
||||||
return listOf(Game(id = Store.nextGameId, black = black.id, white = white.id, handicap = pairing.handicap.handicap(black, white)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic parameters calculation
|
return listOf(Game(id = Store.nextGameId, black = black.id, white = white.id, handicap = pairing.handicap.handicap(black, white), drawnUpDown = white.group-black.group))
|
||||||
//private val standingScore by lazy { computeStandingScore() }
|
|
||||||
|
|
||||||
// Decide each pairable group based on the main criterion
|
|
||||||
private val groupsCount get() = 1 + (mainLimits.second - mainLimits.first).toInt()
|
|
||||||
private val _groups by lazy {
|
|
||||||
pairables.associate { pairable -> Pair(pairable.id, pairable.main.toInt()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// place (among sorted pairables)
|
|
||||||
val Pairable.place: Int get() = _place[id]!!
|
|
||||||
private val _place by lazy {
|
|
||||||
pairingSortedPairables.mapIndexed { index, pairable ->
|
|
||||||
Pair(pairable.id, index)
|
|
||||||
}.toMap()
|
|
||||||
}
|
|
||||||
|
|
||||||
// placeInGroup (of same score) : Pair(place, groupSize)
|
|
||||||
private val Pairable.placeInGroup: Pair<Int, Int> get() = _placeInGroup[id]!!
|
|
||||||
private val _placeInGroup by lazy {
|
|
||||||
// group by group number
|
|
||||||
pairingSortedPairables.groupBy {
|
|
||||||
it.group
|
|
||||||
// get a list { id { placeInGroup, groupSize } }
|
|
||||||
}.values.flatMap { group ->
|
|
||||||
group.mapIndexed { index, pairable ->
|
|
||||||
Pair(pairable.id, Pair(index, group.size))
|
|
||||||
}
|
|
||||||
// get a map id -> { placeInGroup, groupSize }
|
|
||||||
}.toMap()
|
|
||||||
}
|
|
||||||
|
|
||||||
// already paired players map
|
|
||||||
private fun Pairable.played(other: Pairable) = historyHelper.playedTogether(this, other)
|
|
||||||
|
|
||||||
// color balance (nw - nb)
|
|
||||||
private val Pairable.colorBalance: Int get() = historyHelper.colorBalance(this) ?: 0
|
|
||||||
|
|
||||||
private val Pairable.group: Int get() = _groups[id]!!
|
|
||||||
|
|
||||||
// score (number of wins)
|
|
||||||
val Pairable.nbW: Double get() = historyHelper.nbW(this) ?: 0.0
|
|
||||||
|
|
||||||
val Pairable.sos: Double get() = historyHelper.sos[id] ?: 0.0
|
|
||||||
val Pairable.sosm1: Double get() = historyHelper.sosm1[id] ?: 0.0
|
|
||||||
val Pairable.sosm2: Double get() = historyHelper.sosm2[id] ?: 0.0
|
|
||||||
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.eval(criterion: Criterion) = evalCriterion(this, criterion)
|
|
||||||
open fun evalCriterion(pairable: Pairable, criterion: Criterion) = when (criterion) {
|
|
||||||
NONE -> 0.0
|
|
||||||
CATEGORY -> TODO()
|
|
||||||
RANK -> pairable.rank.toDouble()
|
|
||||||
RATING -> pairable.rating.toDouble()
|
|
||||||
NBW -> pairable.nbW
|
|
||||||
SOSW -> pairable.sos
|
|
||||||
SOSWM1 -> pairable.sosm1
|
|
||||||
SOSWM2 -> pairable.sosm2
|
|
||||||
SOSOSW -> pairable.sosos
|
|
||||||
SODOSW -> pairable.sodos
|
|
||||||
CUSSW -> pairable.cums
|
|
||||||
else -> throw Error("criterion cannot be evaluated: ${criterion.name}")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
package org.jeudego.pairgoth.pairing
|
package org.jeudego.pairgoth.pairing.solver
|
||||||
|
|
||||||
import org.jeudego.pairgoth.model.*
|
import org.jeudego.pairgoth.model.*
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ class MacMahonSolver(round: Int,
|
|||||||
pairables: List<Pairable>,
|
pairables: List<Pairable>,
|
||||||
pairingParams: PairingParams,
|
pairingParams: PairingParams,
|
||||||
placementParams: PlacementParams):
|
placementParams: PlacementParams):
|
||||||
Solver(round, history, pairables, pairingParams, placementParams) {
|
BaseSolver(round, history, pairables, pairingParams, placementParams) {
|
||||||
|
|
||||||
override val scores: Map<ID, Double> by lazy {
|
override val scores: Map<ID, Double> by lazy {
|
||||||
historyHelper.wins.mapValues {
|
historyHelper.wins.mapValues {
|
@@ -1,14 +1,13 @@
|
|||||||
package org.jeudego.pairgoth.pairing
|
package org.jeudego.pairgoth.pairing.solver
|
||||||
|
|
||||||
import org.jeudego.pairgoth.model.*
|
import org.jeudego.pairgoth.model.*
|
||||||
import kotlin.properties.Delegates
|
|
||||||
|
|
||||||
class SwissSolver(round: Int,
|
class SwissSolver(round: Int,
|
||||||
history: List<List<Game>>,
|
history: List<List<Game>>,
|
||||||
pairables: List<Pairable>,
|
pairables: List<Pairable>,
|
||||||
pairingParams: PairingParams,
|
pairingParams: PairingParams,
|
||||||
placementParams: PlacementParams):
|
placementParams: PlacementParams):
|
||||||
Solver(round, history, pairables, pairingParams, placementParams) {
|
BaseSolver(round, history, pairables, pairingParams, placementParams) {
|
||||||
|
|
||||||
// In a Swiss tournament the main criterion is the number of wins and already computed
|
// In a Swiss tournament the main criterion is the number of wins and already computed
|
||||||
|
|
@@ -7,7 +7,6 @@ import org.junit.jupiter.api.MethodOrderer.MethodName
|
|||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import org.junit.jupiter.api.TestInstance
|
import org.junit.jupiter.api.TestInstance
|
||||||
import org.junit.jupiter.api.TestMethodOrder
|
import org.junit.jupiter.api.TestMethodOrder
|
||||||
import java.nio.charset.StandardCharsets
|
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertNotNull
|
import kotlin.test.assertNotNull
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
@@ -206,151 +205,4 @@ class BasicTests: TestBase() {
|
|||||||
// val expected = """"["id":1,"w":5,"b":6,"h":3,"r":"?"]"""
|
// val expected = """"["id":1,"w":5,"b":6,"h":3,"r":"?"]"""
|
||||||
}
|
}
|
||||||
|
|
||||||
fun compare_weights(file1:String, file2:String):Boolean {
|
|
||||||
|
|
||||||
// Maps to store name pairs and costs
|
|
||||||
val map1 = HashMap<Pair<String, String>, List<Double>>()
|
|
||||||
val map2 = HashMap<Pair<String, String>, List<Double>>()
|
|
||||||
var count: Int = 1
|
|
||||||
|
|
||||||
for (file in listOf(file1, file2)) {
|
|
||||||
|
|
||||||
// Read lines
|
|
||||||
val lines = getTestFile(file).readLines()
|
|
||||||
|
|
||||||
// Store headers
|
|
||||||
val header1 = lines[0]
|
|
||||||
val header2 = lines[1]
|
|
||||||
|
|
||||||
logger.info("Reading weights file "+file)
|
|
||||||
|
|
||||||
// Loop through sections
|
|
||||||
for (i in 2..lines.size-1 step 12) {
|
|
||||||
// Get name pair
|
|
||||||
val name1 = lines[i].split("=")[1]
|
|
||||||
val name2 = lines[i+1].split("=")[1]
|
|
||||||
|
|
||||||
// Nested loop over costs
|
|
||||||
val costs = mutableListOf<Double>()
|
|
||||||
for (j in i + 2..i + 11) {
|
|
||||||
val parts = lines[j].split("=")
|
|
||||||
costs.add(parts[1].toDouble())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add to map
|
|
||||||
if (count == 1) {
|
|
||||||
map1[Pair(name1, name2)] = costs
|
|
||||||
} else {
|
|
||||||
map2[Pair(name1, name2)] = costs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
count += 1
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
var diff_found = false
|
|
||||||
for ((key, value) in map1) {
|
|
||||||
// Check if key exists in both
|
|
||||||
if (map2.containsKey(key)) {
|
|
||||||
// Compare values
|
|
||||||
if (value != map2[key] && diff_found==false) {
|
|
||||||
// Key exists but values differ - print key
|
|
||||||
logger.info("Difference found at $key")
|
|
||||||
logger.info("baseDuplicateGameCost = "+value!![0].toString()+" "+map2[key]!![0].toString())
|
|
||||||
logger.info("baseRandomCost = "+value!![1].toString()+" "+map2[key]!![1].toString())
|
|
||||||
logger.info("baseBWBalanceCost = "+value!![2].toString()+" "+map2[key]!![2].toString())
|
|
||||||
logger.info("mainCategoryCost = "+value!![3].toString()+" "+map2[key]!![3].toString())
|
|
||||||
logger.info("mainScoreDiffCost = "+value!![4].toString()+" "+map2[key]!![4].toString())
|
|
||||||
logger.info("mainDUDDCost = "+value!![5].toString()+" "+map2[key]!![5].toString())
|
|
||||||
logger.info("mainSeedCost = "+value!![6].toString()+" "+map2[key]!![6].toString())
|
|
||||||
logger.info("secHandiCost = "+value!![7].toString()+" "+map2[key]!![7].toString())
|
|
||||||
logger.info("secGeoCost = "+value!![8].toString()+" "+map2[key]!![8].toString())
|
|
||||||
logger.info("totalCost = "+value!![9].toString()+" "+map2[key]!![9].toString())
|
|
||||||
diff_found = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return map1==map2
|
|
||||||
}
|
|
||||||
|
|
||||||
fun compare_string(string1:String, string2:String): String{
|
|
||||||
for (i in 0..string1.length) {
|
|
||||||
// Check if key exists in both
|
|
||||||
if (string1[i] != string2[i]) {
|
|
||||||
return "at position "+i.toString()+" "+string1.substring(i-10,i+2)+" != "+string2.substring(i-10,i+2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "strings are identical"
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `008 simple swiss tournament`() {
|
|
||||||
|
|
||||||
/* // read tournament with pairing
|
|
||||||
var file = getTestFile("opengotha/tournamentfiles/simpleswiss.xml")
|
|
||||||
logger.info("read from file $file")
|
|
||||||
val resource = file.readText(StandardCharsets.UTF_8)
|
|
||||||
val resp = TestAPI.post("/api/tour", resource)
|
|
||||||
val id = resp.asObject().getInt("id")
|
|
||||||
val tournament = TestAPI.get("/api/tour/$id").asObject()
|
|
||||||
logger.info(tournament.toString().slice(0..50) + "...")
|
|
||||||
val players = TestAPI.get("/api/tour/$id/part").asArray()
|
|
||||||
//logger.info(players.toString().slice(0..50) + "...")
|
|
||||||
logger.info(players.toString())
|
|
||||||
|
|
||||||
for (round in 1..tournament.getInt("rounds")!!) {
|
|
||||||
val games = TestAPI.get("/api/tour/$id/res/$round").asArray()
|
|
||||||
logger.info("games for round $round: {}", games.toString())
|
|
||||||
val players = TestAPI.get("/api/tour/$id/part").asArray()
|
|
||||||
//logger.info(players.toString().slice(0..500) + "...")
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// read tournament without pairings
|
|
||||||
var file_np = getTestFile("opengotha/tournamentfiles/simpleswiss_nopairings.xml")
|
|
||||||
logger.info("read from file $file_np")
|
|
||||||
val resource_np = file_np.readText(StandardCharsets.UTF_8)
|
|
||||||
var resp_np = TestAPI.post("/api/tour", resource_np)
|
|
||||||
val id_np = resp_np.asObject().getInt("id")
|
|
||||||
assertNotNull(id_np)
|
|
||||||
val tournament_np = TestAPI.get("/api/tour/$id_np").asObject()
|
|
||||||
logger.info(tournament_np.toString().slice(0..50) + "...")
|
|
||||||
val players_np = TestAPI.get("/api/tour/$id_np/part").asArray()
|
|
||||||
logger.info(players_np.toString().slice(0..50) + "...")
|
|
||||||
var games_np = TestAPI.post("/api/tour/$id_np/pair/1", Json.Array("all")).asArray()
|
|
||||||
// logger.info("games for round 1: {}", games_np.toString())
|
|
||||||
|
|
||||||
// logger.info("Compare weights with itself")
|
|
||||||
assertTrue(compare_weights("weights.txt", "weights.txt"), "Weights not equal to itselft")
|
|
||||||
// logger.info("Compare weights with opengotha")
|
|
||||||
assertTrue(compare_weights("weights.txt", "opengotha/simpleswiss_weightsonly_R1.txt"), "Not matching opengotha weights for round 1")
|
|
||||||
|
|
||||||
val pairings_R1 = """[{"id":843,"w":525,"b":530,"h":0,"r":"?","dd":0},{"id":844,"w":516,"b":514,"h":0,"r":"?","dd":0},{"id":845,"w":532,"b":524,"h":0,"r":"?","dd":0},{"id":846,"w":513,"b":509,"h":0,"r":"?","dd":0},{"id":847,"w":533,"b":508,"h":0,"r":"?","dd":0},{"id":848,"w":504,"b":517,"h":0,"r":"?","dd":0},{"id":849,"w":507,"b":506,"h":0,"r":"?","dd":0},{"id":850,"w":523,"b":529,"h":0,"r":"?","dd":0},{"id":851,"w":503,"b":518,"h":0,"r":"?","dd":0},{"id":852,"w":512,"b":528,"h":0,"r":"?","dd":0},{"id":853,"w":515,"b":510,"h":0,"r":"?","dd":0},{"id":854,"w":502,"b":531,"h":0,"r":"?","dd":0},{"id":855,"w":505,"b":519,"h":0,"r":"?","dd":0},{"id":856,"w":522,"b":511,"h":0,"r":"?","dd":0},{"id":857,"w":521,"b":526,"h":0,"r":"?","dd":0},{"id":858,"w":527,"b":520,"h":0,"r":"?","dd":0}]"""
|
|
||||||
val pairings_R2 = """[{"id":859,"w":526,"b":530,"h":0,"r":"?","dd":0},{"id":860,"w":524,"b":514,"h":0,"r":"?","dd":0},{"id":861,"w":509,"b":517,"h":0,"r":"?","dd":0},{"id":862,"w":508,"b":518,"h":0,"r":"?","dd":0},{"id":863,"w":510,"b":506,"h":0,"r":"?","dd":0},{"id":864,"w":531,"b":529,"h":0,"r":"?","dd":0},{"id":865,"w":511,"b":528,"h":0,"r":"?","dd":0},{"id":866,"w":520,"b":519,"h":0,"r":"?","dd":0},{"id":867,"w":532,"b":516,"h":0,"r":"?","dd":0},{"id":868,"w":513,"b":504,"h":0,"r":"?","dd":0},{"id":869,"w":503,"b":533,"h":0,"r":"?","dd":0},{"id":870,"w":515,"b":507,"h":0,"r":"?","dd":0},{"id":871,"w":523,"b":502,"h":0,"r":"?","dd":0},{"id":872,"w":522,"b":512,"h":0,"r":"?","dd":0},{"id":873,"w":527,"b":505,"h":0,"r":"?","dd":0},{"id":874,"w":521,"b":525,"h":0,"r":"?","dd":0}]"""
|
|
||||||
val pairings_R3 = """[{"id":875,"w":519,"b":530,"h":0,"r":"?","dd":0},{"id":876,"w":514,"b":517,"h":0,"r":"?","dd":0},{"id":877,"w":529,"b":506,"h":0,"r":"?","dd":0},{"id":878,"w":518,"b":528,"h":0,"r":"?","dd":0},{"id":879,"w":510,"b":509,"h":0,"r":"?","dd":0},{"id":880,"w":505,"b":504,"h":0,"r":"?","dd":0},{"id":881,"w":526,"b":511,"h":0,"r":"?","dd":0},{"id":882,"w":525,"b":520,"h":0,"r":"?","dd":0},{"id":883,"w":507,"b":508,"h":0,"r":"?","dd":0},{"id":884,"w":531,"b":512,"h":0,"r":"?","dd":0},{"id":885,"w":516,"b":502,"h":0,"r":"?","dd":0},{"id":886,"w":524,"b":533,"h":0,"r":"?","dd":0},{"id":887,"w":513,"b":532,"h":0,"r":"?","dd":0},{"id":888,"w":521,"b":515,"h":0,"r":"?","dd":0},{"id":889,"w":522,"b":503,"h":0,"r":"?","dd":0},{"id":890,"w":527,"b":523,"h":0,"r":"?","dd":0}]"""
|
|
||||||
val pairings_R4 = """[{"id":891,"w":506,"b":528,"h":0,"r":"?","dd":0},{"id":892,"w":517,"b":530,"h":0,"r":"?","dd":0},{"id":893,"w":518,"b":512,"h":0,"r":"?","dd":0},{"id":894,"w":511,"b":519,"h":0,"r":"?","dd":0},{"id":895,"w":508,"b":504,"h":0,"r":"?","dd":0},{"id":896,"w":533,"b":514,"h":0,"r":"?","dd":0},{"id":897,"w":529,"b":502,"h":0,"r":"?","dd":0},{"id":898,"w":520,"b":509,"h":0,"r":"?","dd":0},{"id":899,"w":531,"b":516,"h":0,"r":"?","dd":0},{"id":900,"w":507,"b":503,"h":0,"r":"?","dd":0},{"id":901,"w":510,"b":505,"h":0,"r":"?","dd":0},{"id":902,"w":523,"b":524,"h":0,"r":"?","dd":0},{"id":903,"w":532,"b":526,"h":0,"r":"?","dd":0},{"id":904,"w":515,"b":525,"h":0,"r":"?","dd":0},{"id":905,"w":522,"b":527,"h":0,"r":"?","dd":0},{"id":906,"w":513,"b":521,"h":0,"r":"?","dd":0}]"""
|
|
||||||
val pairings_R5 = """[{"id":907,"w":528,"b":530,"h":0,"r":"?","dd":0},{"id":908,"w":512,"b":517,"h":0,"r":"?","dd":0},{"id":909,"w":504,"b":519,"h":0,"r":"?","dd":0},{"id":910,"w":514,"b":509,"h":0,"r":"?","dd":0},{"id":911,"w":506,"b":502,"h":0,"r":"?","dd":0},{"id":912,"w":516,"b":518,"h":0,"r":"?","dd":0},{"id":913,"w":511,"b":505,"h":0,"r":"?","dd":0},{"id":914,"w":520,"b":526,"h":0,"r":"?","dd":0},{"id":915,"w":525,"b":533,"h":0,"r":"?","dd":0},{"id":916,"w":524,"b":508,"h":0,"r":"?","dd":0},{"id":917,"w":503,"b":529,"h":0,"r":"?","dd":0},{"id":918,"w":531,"b":532,"h":0,"r":"?","dd":0},{"id":919,"w":527,"b":510,"h":0,"r":"?","dd":0},{"id":920,"w":523,"b":515,"h":0,"r":"?","dd":0},{"id":921,"w":507,"b":521,"h":0,"r":"?","dd":0},{"id":922,"w":513,"b":522,"h":0,"r":"?","dd":0}]"""
|
|
||||||
|
|
||||||
//logger.info(compare_string(pairings_R1, games_np.toString()))
|
|
||||||
// val games = TestAPI.get("/api/tour/$id/res/1").asArray()
|
|
||||||
//logger.info("Compare pairings for round 1")
|
|
||||||
assertEquals(pairings_R1, games_np.toString(), "pairings for round 1 differ")
|
|
||||||
logger.info("Pairings for round 1 match OpenGotha")
|
|
||||||
|
|
||||||
//val results_R1 = ["""{"id":843,"result":"b"}""", """{"id":844,"result":"b"}"""]//,{"id":846,"w":513,"b":509,"h":0,"r":"?","dd":0},{"id":847,"w":533,"b":508,"h":0,"r":"?","dd":0},{"id":848,"w":504,"b":517,"h":0,"r":"?","dd":0},{"id":849,"w":507,"b":506,"h":0,"r":"?","dd":0},{"id":850,"w":523,"b":529,"h":0,"r":"?","dd":0},{"id":851,"w":503,"b":518,"h":0,"r":"?","dd":0},{"id":852,"w":512,"b":528,"h":0,"r":"?","dd":0},{"id":853,"w":515,"b":510,"h":0,"r":"?","dd":0},{"id":854,"w":502,"b":531,"h":0,"r":"?","dd":0},{"id":855,"w":505,"b":519,"h":0,"r":"?","dd":0},{"id":856,"w":522,"b":511,"h":0,"r":"?","dd":0},{"id":857,"w":521,"b":526,"h":0,"r":"?","dd":0},{"id":858,"w":527,"b":520,"h":0,"r":"?","dd":0}]"""
|
|
||||||
for (game_id in 843..858) {
|
|
||||||
resp_np = TestAPI.put("/api/tour/$id_np/res/1", Json.parse("""{"id":$game_id,"result":"b"}""")).asObject()
|
|
||||||
assertTrue(resp_np.getBoolean("success") == true, "expecting success")
|
|
||||||
}
|
|
||||||
logger.info("Results succesfully entered for round 1")
|
|
||||||
|
|
||||||
games_np = TestAPI.post("/api/tour/$id_np/pair/2", Json.Array("all")).asArray()
|
|
||||||
logger.info("games for round 2: {}", games_np.toString())
|
|
||||||
|
|
||||||
assertTrue(compare_weights("weights.txt", "opengotha/simpleswiss_weights_R2.txt"), "Not matching opengotha weights for round 2")
|
|
||||||
assertEquals(pairings_R2, games_np.toString(), "pairings for round 2 differ")
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
273
api-webapp/src/test/kotlin/PairingTests.kt
Normal file
273
api-webapp/src/test/kotlin/PairingTests.kt
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
package org.jeudego.pairgoth.test
|
||||||
|
|
||||||
|
import com.republicate.kson.Json
|
||||||
|
import org.jeudego.pairgoth.model.Game
|
||||||
|
import org.jeudego.pairgoth.model.ID
|
||||||
|
import org.jeudego.pairgoth.model.fromJson
|
||||||
|
import org.junit.jupiter.api.MethodOrderer.MethodName
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import org.junit.jupiter.api.TestInstance
|
||||||
|
import org.junit.jupiter.api.TestMethodOrder
|
||||||
|
import java.nio.charset.StandardCharsets
|
||||||
|
import kotlin.math.abs
|
||||||
|
import kotlin.test.assertNotNull
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
@TestMethodOrder(MethodName::class)
|
||||||
|
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
|
||||||
|
class PairingTests: TestBase() {
|
||||||
|
|
||||||
|
fun compare_weights(file1:String, file2:String):Boolean {
|
||||||
|
|
||||||
|
// Maps to store name pairs and costs
|
||||||
|
val map1 = HashMap<Pair<String, String>, List<Double>>()
|
||||||
|
val map2 = HashMap<Pair<String, String>, List<Double>>()
|
||||||
|
var count: Int = 1
|
||||||
|
|
||||||
|
for (file in listOf(file1, file2)) {
|
||||||
|
|
||||||
|
// Read lines
|
||||||
|
val lines = getTestFile(file).readLines()
|
||||||
|
|
||||||
|
// Store headers
|
||||||
|
val header1 = lines[0]
|
||||||
|
val header2 = lines[1]
|
||||||
|
|
||||||
|
logger.info("Reading weights file "+file)
|
||||||
|
|
||||||
|
// Loop through sections
|
||||||
|
for (i in 2..lines.size-1 step 12) {
|
||||||
|
// Get name pair
|
||||||
|
val name1 = lines[i].split("=")[1]
|
||||||
|
val name2 = lines[i+1].split("=")[1]
|
||||||
|
|
||||||
|
// Nested loop over costs
|
||||||
|
val costs = mutableListOf<Double>()
|
||||||
|
for (j in i + 2..i + 11) {
|
||||||
|
val parts = lines[j].split("=")
|
||||||
|
costs.add(parts[1].toDouble())
|
||||||
|
}
|
||||||
|
|
||||||
|
val tmp_pair = if (name1 > name2) Pair(name1,name2) else Pair(name2,name1)
|
||||||
|
// Add to map
|
||||||
|
if (count == 1) {
|
||||||
|
map1[tmp_pair] = costs
|
||||||
|
} else {
|
||||||
|
map2[tmp_pair] = costs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var identical = true
|
||||||
|
for ((key, value) in map1) {
|
||||||
|
// Check if key exists in both
|
||||||
|
if (map2.containsKey(key)) {
|
||||||
|
// Compare values
|
||||||
|
//logger.info("Comparing $key")
|
||||||
|
if (abs(value!![9] - map2[key]!![9])>10 && identical==true) {
|
||||||
|
// Key exists but values differ - print key
|
||||||
|
logger.info("Difference found at $key")
|
||||||
|
logger.info("baseDuplicateGameCost = "+value!![0].toString()+" "+map2[key]!![0].toString())
|
||||||
|
logger.info("baseRandomCost = "+value!![1].toString()+" "+map2[key]!![1].toString())
|
||||||
|
logger.info("baseBWBalanceCost = "+value!![2].toString()+" "+map2[key]!![2].toString())
|
||||||
|
logger.info("mainCategoryCost = "+value!![3].toString()+" "+map2[key]!![3].toString())
|
||||||
|
logger.info("mainScoreDiffCost = "+value!![4].toString()+" "+map2[key]!![4].toString())
|
||||||
|
logger.info("mainDUDDCost = "+value!![5].toString()+" "+map2[key]!![5].toString())
|
||||||
|
logger.info("mainSeedCost = "+value!![6].toString()+" "+map2[key]!![6].toString())
|
||||||
|
logger.info("secHandiCost = "+value!![7].toString()+" "+map2[key]!![7].toString())
|
||||||
|
logger.info("secGeoCost = "+value!![8].toString()+" "+map2[key]!![8].toString())
|
||||||
|
logger.info("totalCost = "+value!![9].toString()+" "+map2[key]!![9].toString())
|
||||||
|
identical = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//return map1==map2
|
||||||
|
return identical
|
||||||
|
}
|
||||||
|
|
||||||
|
fun compare_games(games:Json.Array, opengotha:Json.Array): Boolean{
|
||||||
|
if (games.size != opengotha.size) return false
|
||||||
|
val gamesPair = mutableSetOf<Pair<ID,ID>>()
|
||||||
|
val openGothaPair = mutableSetOf<Pair<ID,ID>>()
|
||||||
|
for (i in 0 until games.size) {
|
||||||
|
val tmp = Game.fromJson(games.getJson(i)!!.asObject())
|
||||||
|
gamesPair.add(Pair(tmp.white, tmp.black))
|
||||||
|
val tmpOG = Game.fromJson(opengotha.getJson(i)!!.asObject())
|
||||||
|
openGothaPair.add(Pair(tmpOG.white, tmpOG.black))
|
||||||
|
}
|
||||||
|
return gamesPair==openGothaPair
|
||||||
|
}
|
||||||
|
|
||||||
|
fun compare_string(string1:String, string2:String): String{
|
||||||
|
for (i in 0..string1.length) {
|
||||||
|
// Check if key exists in both
|
||||||
|
if (string1[i] != string2[i]) {
|
||||||
|
return "at position "+i.toString()+" "+string1.substring(i-10,i+2)+" != "+string2.substring(i-10,i+2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "strings are identical"
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `008 simple swiss tournament`() {
|
||||||
|
|
||||||
|
/* // read tournament with pairing
|
||||||
|
var fileOG = getTestFile("opengotha/pairings/simpleswiss_7R.xml")
|
||||||
|
logger.info("read from file $fileOG")
|
||||||
|
val resourceOG = fileOG.readText(StandardCharsets.UTF_8)
|
||||||
|
val respOG = TestAPI.post("/api/tour", resourceOG)
|
||||||
|
val idOG = respOG.asObject().getInt("id")
|
||||||
|
val tournamentOG = TestAPI.get("/api/tour/$idOG").asObject()
|
||||||
|
logger.info(tournamentOG.toString().slice(0..50) + "...")
|
||||||
|
val playersOG = TestAPI.get("/api/tour/$idOG/part").asArray()
|
||||||
|
//logger.info(players.toString().slice(0..50) + "...")
|
||||||
|
//logger.info(playersOG.toString())
|
||||||
|
|
||||||
|
val pairingsOG = mutableListOf<String>()
|
||||||
|
for (round in 1..tournamentOG.getInt("rounds")!!) {
|
||||||
|
val games = TestAPI.get("/api/tour/$idOG/res/$round").asArray()
|
||||||
|
logger.info("games for round $round: {}", games.toString())
|
||||||
|
pairingsOG.add(games.toString())
|
||||||
|
}*/
|
||||||
|
|
||||||
|
val pairingsR1 = """[{"id":601,"w":327,"b":332,"h":0,"r":"b","dd":0},{"id":602,"w":318,"b":316,"h":0,"r":"b","dd":0},{"id":603,"w":334,"b":326,"h":0,"r":"b","dd":0},{"id":604,"w":315,"b":311,"h":0,"r":"b","dd":0},{"id":605,"w":335,"b":310,"h":0,"r":"b","dd":0},{"id":606,"w":306,"b":319,"h":0,"r":"b","dd":0},{"id":607,"w":309,"b":308,"h":0,"r":"b","dd":0},{"id":608,"w":325,"b":331,"h":0,"r":"b","dd":0},{"id":609,"w":305,"b":320,"h":0,"r":"b","dd":0},{"id":610,"w":314,"b":330,"h":0,"r":"b","dd":0},{"id":611,"w":317,"b":312,"h":0,"r":"b","dd":0},{"id":612,"w":304,"b":333,"h":0,"r":"b","dd":0},{"id":613,"w":307,"b":321,"h":0,"r":"b","dd":0},{"id":614,"w":324,"b":313,"h":0,"r":"b","dd":0},{"id":615,"w":323,"b":328,"h":0,"r":"b","dd":0},{"id":616,"w":329,"b":322,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR2 = """[{"id":617,"w":328,"b":332,"h":0,"r":"b","dd":0},{"id":618,"w":326,"b":316,"h":0,"r":"b","dd":0},{"id":619,"w":311,"b":319,"h":0,"r":"b","dd":0},{"id":620,"w":310,"b":320,"h":0,"r":"b","dd":0},{"id":621,"w":312,"b":308,"h":0,"r":"b","dd":0},{"id":622,"w":333,"b":331,"h":0,"r":"b","dd":0},{"id":623,"w":313,"b":330,"h":0,"r":"b","dd":0},{"id":624,"w":322,"b":321,"h":0,"r":"b","dd":0},{"id":625,"w":334,"b":318,"h":0,"r":"b","dd":0},{"id":626,"w":315,"b":306,"h":0,"r":"b","dd":0},{"id":627,"w":305,"b":335,"h":0,"r":"b","dd":0},{"id":628,"w":317,"b":309,"h":0,"r":"b","dd":0},{"id":629,"w":325,"b":304,"h":0,"r":"b","dd":0},{"id":630,"w":324,"b":314,"h":0,"r":"b","dd":0},{"id":631,"w":329,"b":307,"h":0,"r":"b","dd":0},{"id":632,"w":323,"b":327,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR3 = """[{"id":633,"w":321,"b":332,"h":0,"r":"b","dd":0},{"id":634,"w":316,"b":319,"h":0,"r":"b","dd":0},{"id":635,"w":331,"b":308,"h":0,"r":"b","dd":0},{"id":636,"w":320,"b":330,"h":0,"r":"b","dd":0},{"id":637,"w":312,"b":311,"h":0,"r":"b","dd":0},{"id":638,"w":307,"b":306,"h":0,"r":"b","dd":0},{"id":639,"w":328,"b":313,"h":0,"r":"b","dd":0},{"id":640,"w":327,"b":322,"h":0,"r":"b","dd":0},{"id":641,"w":309,"b":310,"h":0,"r":"b","dd":0},{"id":642,"w":333,"b":314,"h":0,"r":"b","dd":0},{"id":643,"w":318,"b":304,"h":0,"r":"b","dd":0},{"id":644,"w":326,"b":335,"h":0,"r":"b","dd":0},{"id":645,"w":315,"b":334,"h":0,"r":"b","dd":0},{"id":646,"w":323,"b":317,"h":0,"r":"b","dd":0},{"id":647,"w":324,"b":305,"h":0,"r":"b","dd":0},{"id":648,"w":329,"b":325,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR4 = """[{"id":649,"w":308,"b":330,"h":0,"r":"b","dd":0},{"id":650,"w":319,"b":332,"h":0,"r":"b","dd":0},{"id":651,"w":320,"b":314,"h":0,"r":"b","dd":0},{"id":652,"w":313,"b":321,"h":0,"r":"b","dd":0},{"id":653,"w":310,"b":306,"h":0,"r":"b","dd":0},{"id":654,"w":335,"b":316,"h":0,"r":"b","dd":0},{"id":655,"w":331,"b":304,"h":0,"r":"b","dd":0},{"id":656,"w":322,"b":311,"h":0,"r":"b","dd":0},{"id":657,"w":333,"b":318,"h":0,"r":"b","dd":0},{"id":658,"w":309,"b":305,"h":0,"r":"b","dd":0},{"id":659,"w":312,"b":307,"h":0,"r":"b","dd":0},{"id":660,"w":325,"b":326,"h":0,"r":"b","dd":0},{"id":661,"w":334,"b":328,"h":0,"r":"b","dd":0},{"id":662,"w":317,"b":327,"h":0,"r":"b","dd":0},{"id":663,"w":324,"b":329,"h":0,"r":"b","dd":0},{"id":664,"w":315,"b":323,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR5 = """[{"id":665,"w":330,"b":332,"h":0,"r":"b","dd":0},{"id":666,"w":314,"b":319,"h":0,"r":"b","dd":0},{"id":667,"w":306,"b":321,"h":0,"r":"b","dd":0},{"id":668,"w":316,"b":311,"h":0,"r":"b","dd":0},{"id":669,"w":308,"b":304,"h":0,"r":"b","dd":0},{"id":670,"w":318,"b":320,"h":0,"r":"b","dd":0},{"id":671,"w":313,"b":307,"h":0,"r":"b","dd":0},{"id":672,"w":322,"b":328,"h":0,"r":"b","dd":0},{"id":673,"w":327,"b":335,"h":0,"r":"b","dd":0},{"id":674,"w":326,"b":310,"h":0,"r":"b","dd":0},{"id":675,"w":305,"b":331,"h":0,"r":"b","dd":0},{"id":676,"w":333,"b":334,"h":0,"r":"b","dd":0},{"id":677,"w":329,"b":312,"h":0,"r":"b","dd":0},{"id":678,"w":325,"b":317,"h":0,"r":"b","dd":0},{"id":679,"w":309,"b":323,"h":0,"r":"b","dd":0},{"id":680,"w":315,"b":324,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR6 = """[{"id":681,"w":321,"b":319,"h":0,"r":"b","dd":0},{"id":682,"w":332,"b":311,"h":0,"r":"b","dd":0},{"id":683,"w":304,"b":330,"h":0,"r":"b","dd":0},{"id":684,"w":328,"b":306,"h":0,"r":"b","dd":0},{"id":685,"w":307,"b":316,"h":0,"r":"b","dd":0},{"id":686,"w":310,"b":308,"h":0,"r":"b","dd":0},{"id":687,"w":335,"b":320,"h":0,"r":"b","dd":0},{"id":688,"w":331,"b":314,"h":0,"r":"b","dd":0},{"id":689,"w":326,"b":313,"h":0,"r":"b","dd":0},{"id":690,"w":305,"b":322,"h":0,"r":"b","dd":0},{"id":691,"w":334,"b":327,"h":0,"r":"b","dd":0},{"id":692,"w":318,"b":317,"h":0,"r":"b","dd":0},{"id":693,"w":323,"b":312,"h":0,"r":"b","dd":0},{"id":694,"w":333,"b":329,"h":0,"r":"b","dd":0},{"id":695,"w":309,"b":324,"h":0,"r":"b","dd":0},{"id":696,"w":325,"b":315,"h":0,"r":"b","dd":0}]"""
|
||||||
|
/*
|
||||||
|
2 solutions have the same sum of weights, OpenGotha pairing is
|
||||||
|
val pairingsR7 = """[{"id":697,"w":330,"b":319,"h":0,"r":"b","dd":0},{"id":698,"w":311,"b":306,"h":0,"r":"b","dd":0},{"id":699,"w":332,"b":320,"h":0,"r":"b","dd":0},{"id":700,"w":308,"b":321,"h":0,"r":"b","dd":0},{"id":701,"w":316,"b":304,"h":0,"r":"b","dd":0},{"id":702,"w":314,"b":312,"h":0,"r":"b","dd":0},{"id":703,"w":335,"b":307,"h":0,"r":"b","dd":0},{"id":704,"w":327,"b":313,"h":0,"r":"b","dd":0},{"id":705,"w":331,"b":322,"h":0,"r":"b","dd":0},{"id":706,"w":328,"b":317,"h":0,"r":"b","dd":0},{"id":707,"w":310,"b":323,"h":0,"r":"b","dd":0},{"id":708,"w":318,"b":329,"h":0,"r":"b","dd":0},{"id":709,"w":324,"b":326,"h":0,"r":"b","dd":0},{"id":710,"w":334,"b":305,"h":0,"r":"b","dd":0},{"id":711,"w":333,"b":315,"h":0,"r":"b","dd":0},{"id":712,"w":325,"b":309,"h":0,"r":"b","dd":0}]"""
|
||||||
|
*/
|
||||||
|
val pairingsR7 = """[{"id":697,"w":330,"b":319,"h":0,"r":"b","dd":0},{"id":698,"w":311,"b":314,"h":0,"r":"b","dd":0},{"id":699,"w":332,"b":320,"h":0,"r":"b","dd":0},{"id":700,"w":308,"b":321,"h":0,"r":"b","dd":0},{"id":701,"w":316,"b":304,"h":0,"r":"b","dd":0},{"id":702,"w":306,"b":312,"h":0,"r":"b","dd":0},{"id":703,"w":335,"b":307,"h":0,"r":"b","dd":0},{"id":704,"w":327,"b":313,"h":0,"r":"b","dd":0},{"id":705,"w":331,"b":322,"h":0,"r":"b","dd":0},{"id":706,"w":328,"b":317,"h":0,"r":"b","dd":0},{"id":707,"w":310,"b":323,"h":0,"r":"b","dd":0},{"id":708,"w":318,"b":329,"h":0,"r":"b","dd":0},{"id":709,"w":324,"b":326,"h":0,"r":"b","dd":0},{"id":710,"w":334,"b":305,"h":0,"r":"b","dd":0},{"id":711,"w":333,"b":315,"h":0,"r":"b","dd":0},{"id":712,"w":325,"b":309,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairings = mutableListOf<String>()
|
||||||
|
pairings.add(pairingsR1)
|
||||||
|
pairings.add(pairingsR2)
|
||||||
|
pairings.add(pairingsR3)
|
||||||
|
pairings.add(pairingsR4)
|
||||||
|
pairings.add(pairingsR5)
|
||||||
|
pairings.add(pairingsR6)
|
||||||
|
pairings.add(pairingsR7)
|
||||||
|
|
||||||
|
// read tournament without pairings
|
||||||
|
var file = getTestFile("opengotha/pairings/simpleswiss_nopairings.xml")
|
||||||
|
logger.info("read from file $file")
|
||||||
|
val resource = file.readText(StandardCharsets.UTF_8)
|
||||||
|
var resp = TestAPI.post("/api/tour", resource)
|
||||||
|
val id = resp.asObject().getInt("id")
|
||||||
|
assertNotNull(id)
|
||||||
|
val tournament = TestAPI.get("/api/tour/$id").asObject()
|
||||||
|
logger.info(tournament.toString().slice(0..50) + "...")
|
||||||
|
val players = TestAPI.get("/api/tour/$id/part").asArray()
|
||||||
|
logger.info(players.toString().slice(0..50) + "...")
|
||||||
|
|
||||||
|
var games: Json.Array
|
||||||
|
var firstGameID: Int
|
||||||
|
|
||||||
|
for (round in 1..7) {
|
||||||
|
games = TestAPI.post("/api/tour/$id/pair/$round", Json.Array("all")).asArray()
|
||||||
|
logger.info("games for round $round: {}", games.toString())
|
||||||
|
|
||||||
|
assertTrue(compare_weights("weights.txt", "opengotha/simpleswiss_weights_R$round.txt"), "Not matching opengotha weights for round $round")
|
||||||
|
assertTrue(compare_games(games, Json.parse(pairings[round - 1])!!.asArray()),"pairings for round $round differ")
|
||||||
|
logger.info("Pairings for round $round match OpenGotha")
|
||||||
|
|
||||||
|
firstGameID = (games.getJson(0)!!.asObject()["id"] as Long?)!!.toInt()
|
||||||
|
for (gameID in firstGameID..firstGameID + 15) {
|
||||||
|
resp = TestAPI.put("/api/tour/$id/res/$round", Json.parse("""{"id":$gameID,"result":"b"}""")).asObject()
|
||||||
|
assertTrue(resp.getBoolean("success") == true, "expecting success")
|
||||||
|
}
|
||||||
|
logger.info("Results succesfully entered for round $round")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `009 not so simple swiss tournament`() {
|
||||||
|
|
||||||
|
/* // read tournament with pairing
|
||||||
|
var fileOG = getTestFile("opengotha/pairings/notsosimpleswiss_10R.xml")
|
||||||
|
logger.info("read from file $fileOG")
|
||||||
|
val resourceOG = fileOG.readText(StandardCharsets.UTF_8)
|
||||||
|
val respOG = TestAPI.post("/api/tour", resourceOG)
|
||||||
|
val idOG = respOG.asObject().getInt("id")
|
||||||
|
val tournamentOG = TestAPI.get("/api/tour/$idOG").asObject()
|
||||||
|
logger.info(tournamentOG.toString().slice(0..50) + "...")
|
||||||
|
val playersOG = TestAPI.get("/api/tour/$idOG/part").asArray()
|
||||||
|
//logger.info(players.toString().slice(0..50) + "...")
|
||||||
|
//logger.info(playersOG.toString())
|
||||||
|
|
||||||
|
val pairingsOG = mutableListOf<String>()
|
||||||
|
for (round in 1..tournamentOG.getInt("rounds")!!) {
|
||||||
|
val games = TestAPI.get("/api/tour/$idOG/res/$round").asArray()
|
||||||
|
logger.info("games for round $round: {}", games.toString())
|
||||||
|
pairingsOG.add(games.toString())
|
||||||
|
}*/
|
||||||
|
|
||||||
|
val pairingsR1 = """[{"id":713,"w":367,"b":339,"h":0,"r":"b","dd":0},{"id":714,"w":351,"b":366,"h":0,"r":"b","dd":0},{"id":715,"w":344,"b":348,"h":0,"r":"b","dd":0},{"id":716,"w":369,"b":357,"h":0,"r":"b","dd":0},{"id":717,"w":345,"b":343,"h":0,"r":"b","dd":0},{"id":718,"w":342,"b":349,"h":0,"r":"b","dd":0},{"id":719,"w":361,"b":338,"h":0,"r":"b","dd":0},{"id":720,"w":360,"b":340,"h":0,"r":"b","dd":0},{"id":721,"w":341,"b":337,"h":0,"r":"b","dd":0},{"id":722,"w":365,"b":347,"h":0,"r":"b","dd":0},{"id":723,"w":353,"b":350,"h":0,"r":"b","dd":0},{"id":724,"w":346,"b":336,"h":0,"r":"b","dd":0},{"id":725,"w":355,"b":352,"h":0,"r":"b","dd":0},{"id":726,"w":358,"b":370,"h":0,"r":"b","dd":0},{"id":727,"w":356,"b":363,"h":0,"r":"b","dd":0},{"id":728,"w":368,"b":362,"h":0,"r":"b","dd":0},{"id":729,"w":364,"b":359,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR2 = """[{"id":730,"w":362,"b":348,"h":0,"r":"b","dd":0},{"id":731,"w":349,"b":343,"h":0,"r":"b","dd":0},{"id":732,"w":339,"b":338,"h":0,"r":"b","dd":0},{"id":733,"w":357,"b":340,"h":0,"r":"b","dd":0},{"id":734,"w":366,"b":370,"h":0,"r":"b","dd":0},{"id":735,"w":347,"b":337,"h":0,"r":"b","dd":0},{"id":736,"w":352,"b":336,"h":0,"r":"b","dd":0},{"id":737,"w":350,"b":354,"h":0,"r":"b","dd":0},{"id":738,"w":363,"b":367,"h":0,"r":"b","dd":0},{"id":739,"w":351,"b":360,"h":0,"r":"b","dd":0},{"id":740,"w":369,"b":346,"h":0,"r":"b","dd":0},{"id":741,"w":368,"b":342,"h":0,"r":"b","dd":0},{"id":742,"w":365,"b":353,"h":0,"r":"b","dd":0},{"id":743,"w":344,"b":355,"h":0,"r":"b","dd":0},{"id":744,"w":341,"b":358,"h":0,"r":"b","dd":0},{"id":745,"w":364,"b":356,"h":0,"r":"b","dd":0},{"id":746,"w":361,"b":345,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR3 = """[{"id":747,"w":340,"b":348,"h":0,"r":"b","dd":0},{"id":748,"w":337,"b":336,"h":0,"r":"b","dd":0},{"id":749,"w":370,"b":354,"h":0,"r":"b","dd":0},{"id":750,"w":343,"b":359,"h":0,"r":"b","dd":0},{"id":751,"w":349,"b":358,"h":0,"r":"b","dd":0},{"id":752,"w":346,"b":367,"h":0,"r":"b","dd":0},{"id":753,"w":357,"b":345,"h":0,"r":"b","dd":0},{"id":754,"w":338,"b":363,"h":0,"r":"b","dd":0},{"id":755,"w":362,"b":360,"h":0,"r":"b","dd":0},{"id":756,"w":352,"b":347,"h":0,"r":"b","dd":0},{"id":757,"w":355,"b":350,"h":0,"r":"b","dd":0},{"id":758,"w":342,"b":339,"h":0,"r":"b","dd":0},{"id":759,"w":353,"b":366,"h":0,"r":"b","dd":0},{"id":760,"w":351,"b":361,"h":0,"r":"b","dd":0},{"id":761,"w":369,"b":344,"h":0,"r":"b","dd":0},{"id":762,"w":365,"b":364,"h":0,"r":"b","dd":0},{"id":763,"w":341,"b":368,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR4 = """[{"id":985,"w":500,"b":522,"h":0,"r":"b","dd":0},{"id":986,"w":511,"b":524,"h":0,"r":"b","dd":0},{"id":987,"w":512,"b":506,"h":0,"r":"b","dd":0},{"id":988,"w":505,"b":513,"h":0,"r":"b","dd":0},{"id":989,"w":502,"b":498,"h":0,"r":"b","dd":0},{"id":990,"w":527,"b":508,"h":0,"r":"b","dd":0},{"id":991,"w":523,"b":496,"h":0,"r":"b","dd":0},{"id":992,"w":514,"b":503,"h":0,"r":"b","dd":0},{"id":993,"w":525,"b":510,"h":0,"r":"b","dd":0},{"id":994,"w":501,"b":497,"h":0,"r":"b","dd":0},{"id":995,"w":504,"b":499,"h":0,"r":"b","dd":0},{"id":996,"w":517,"b":518,"h":0,"r":"b","dd":0},{"id":997,"w":526,"b":520,"h":0,"r":"b","dd":0},{"id":998,"w":509,"b":519,"h":0,"r":"b","dd":0},{"id":999,"w":516,"b":521,"h":0,"r":"b","dd":0},{"id":1000,"w":507,"b":515,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR5 = """[{"id":1001,"w":522,"b":524,"h":0,"r":"b","dd":0},{"id":1002,"w":506,"b":511,"h":0,"r":"b","dd":0},{"id":1003,"w":498,"b":513,"h":0,"r":"b","dd":0},{"id":1004,"w":508,"b":503,"h":0,"r":"b","dd":0},{"id":1005,"w":500,"b":496,"h":0,"r":"b","dd":0},{"id":1006,"w":510,"b":512,"h":0,"r":"b","dd":0},{"id":1007,"w":505,"b":499,"h":0,"r":"b","dd":0},{"id":1008,"w":514,"b":520,"h":0,"r":"b","dd":0},{"id":1009,"w":519,"b":527,"h":0,"r":"b","dd":0},{"id":1010,"w":518,"b":502,"h":0,"r":"b","dd":0},{"id":1011,"w":497,"b":523,"h":0,"r":"b","dd":0},{"id":1012,"w":525,"b":526,"h":0,"r":"b","dd":0},{"id":1013,"w":521,"b":504,"h":0,"r":"b","dd":0},{"id":1014,"w":517,"b":509,"h":0,"r":"b","dd":0},{"id":1015,"w":501,"b":515,"h":0,"r":"b","dd":0},{"id":1016,"w":507,"b":516,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR6 = """[{"id":1017,"w":513,"b":511,"h":0,"r":"b","dd":0},{"id":1018,"w":524,"b":503,"h":0,"r":"b","dd":0},{"id":1019,"w":496,"b":522,"h":0,"r":"b","dd":0},{"id":1020,"w":520,"b":498,"h":0,"r":"b","dd":0},{"id":1021,"w":499,"b":508,"h":0,"r":"b","dd":0},{"id":1022,"w":502,"b":500,"h":0,"r":"b","dd":0},{"id":1023,"w":527,"b":512,"h":0,"r":"b","dd":0},{"id":1024,"w":523,"b":506,"h":0,"r":"b","dd":0},{"id":1025,"w":518,"b":505,"h":0,"r":"b","dd":0},{"id":1026,"w":497,"b":514,"h":0,"r":"b","dd":0},{"id":1027,"w":526,"b":519,"h":0,"r":"b","dd":0},{"id":1028,"w":510,"b":509,"h":0,"r":"b","dd":0},{"id":1029,"w":515,"b":504,"h":0,"r":"b","dd":0},{"id":1030,"w":525,"b":521,"h":0,"r":"b","dd":0},{"id":1031,"w":501,"b":516,"h":0,"r":"b","dd":0},{"id":1032,"w":517,"b":507,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR7 = """[{"id":1033,"w":522,"b":511,"h":0,"r":"b","dd":0},{"id":1034,"w":503,"b":506,"h":0,"r":"b","dd":0},{"id":1035,"w":524,"b":512,"h":0,"r":"b","dd":0},{"id":1036,"w":500,"b":513,"h":0,"r":"b","dd":0},{"id":1037,"w":508,"b":496,"h":0,"r":"b","dd":0},{"id":1038,"w":498,"b":504,"h":0,"r":"b","dd":0},{"id":1039,"w":527,"b":499,"h":0,"r":"b","dd":0},{"id":1040,"w":519,"b":505,"h":0,"r":"b","dd":0},{"id":1041,"w":523,"b":514,"h":0,"r":"b","dd":0},{"id":1042,"w":520,"b":509,"h":0,"r":"b","dd":0},{"id":1043,"w":502,"b":515,"h":0,"r":"b","dd":0},{"id":1044,"w":510,"b":521,"h":0,"r":"b","dd":0},{"id":1045,"w":516,"b":518,"h":0,"r":"b","dd":0},{"id":1046,"w":526,"b":497,"h":0,"r":"b","dd":0},{"id":1047,"w":525,"b":507,"h":0,"r":"b","dd":0},{"id":1048,"w":517,"b":501,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR8 = """[{"id":1033,"w":522,"b":511,"h":0,"r":"b","dd":0},{"id":1034,"w":503,"b":506,"h":0,"r":"b","dd":0},{"id":1035,"w":524,"b":512,"h":0,"r":"b","dd":0},{"id":1036,"w":500,"b":513,"h":0,"r":"b","dd":0},{"id":1037,"w":508,"b":496,"h":0,"r":"b","dd":0},{"id":1038,"w":498,"b":504,"h":0,"r":"b","dd":0},{"id":1039,"w":527,"b":499,"h":0,"r":"b","dd":0},{"id":1040,"w":519,"b":505,"h":0,"r":"b","dd":0},{"id":1041,"w":523,"b":514,"h":0,"r":"b","dd":0},{"id":1042,"w":520,"b":509,"h":0,"r":"b","dd":0},{"id":1043,"w":502,"b":515,"h":0,"r":"b","dd":0},{"id":1044,"w":510,"b":521,"h":0,"r":"b","dd":0},{"id":1045,"w":516,"b":518,"h":0,"r":"b","dd":0},{"id":1046,"w":526,"b":497,"h":0,"r":"b","dd":0},{"id":1047,"w":525,"b":507,"h":0,"r":"b","dd":0},{"id":1048,"w":517,"b":501,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR9 = """[{"id":1033,"w":522,"b":511,"h":0,"r":"b","dd":0},{"id":1034,"w":503,"b":506,"h":0,"r":"b","dd":0},{"id":1035,"w":524,"b":512,"h":0,"r":"b","dd":0},{"id":1036,"w":500,"b":513,"h":0,"r":"b","dd":0},{"id":1037,"w":508,"b":496,"h":0,"r":"b","dd":0},{"id":1038,"w":498,"b":504,"h":0,"r":"b","dd":0},{"id":1039,"w":527,"b":499,"h":0,"r":"b","dd":0},{"id":1040,"w":519,"b":505,"h":0,"r":"b","dd":0},{"id":1041,"w":523,"b":514,"h":0,"r":"b","dd":0},{"id":1042,"w":520,"b":509,"h":0,"r":"b","dd":0},{"id":1043,"w":502,"b":515,"h":0,"r":"b","dd":0},{"id":1044,"w":510,"b":521,"h":0,"r":"b","dd":0},{"id":1045,"w":516,"b":518,"h":0,"r":"b","dd":0},{"id":1046,"w":526,"b":497,"h":0,"r":"b","dd":0},{"id":1047,"w":525,"b":507,"h":0,"r":"b","dd":0},{"id":1048,"w":517,"b":501,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairingsR10 = """[{"id":1033,"w":522,"b":511,"h":0,"r":"b","dd":0},{"id":1034,"w":503,"b":506,"h":0,"r":"b","dd":0},{"id":1035,"w":524,"b":512,"h":0,"r":"b","dd":0},{"id":1036,"w":500,"b":513,"h":0,"r":"b","dd":0},{"id":1037,"w":508,"b":496,"h":0,"r":"b","dd":0},{"id":1038,"w":498,"b":504,"h":0,"r":"b","dd":0},{"id":1039,"w":527,"b":499,"h":0,"r":"b","dd":0},{"id":1040,"w":519,"b":505,"h":0,"r":"b","dd":0},{"id":1041,"w":523,"b":514,"h":0,"r":"b","dd":0},{"id":1042,"w":520,"b":509,"h":0,"r":"b","dd":0},{"id":1043,"w":502,"b":515,"h":0,"r":"b","dd":0},{"id":1044,"w":510,"b":521,"h":0,"r":"b","dd":0},{"id":1045,"w":516,"b":518,"h":0,"r":"b","dd":0},{"id":1046,"w":526,"b":497,"h":0,"r":"b","dd":0},{"id":1047,"w":525,"b":507,"h":0,"r":"b","dd":0},{"id":1048,"w":517,"b":501,"h":0,"r":"b","dd":0}]"""
|
||||||
|
val pairings = mutableListOf<String>()
|
||||||
|
pairings.add(pairingsR1)
|
||||||
|
pairings.add(pairingsR2)
|
||||||
|
pairings.add(pairingsR3)
|
||||||
|
pairings.add(pairingsR4)
|
||||||
|
pairings.add(pairingsR5)
|
||||||
|
pairings.add(pairingsR6)
|
||||||
|
pairings.add(pairingsR7)
|
||||||
|
pairings.add(pairingsR8)
|
||||||
|
pairings.add(pairingsR9)
|
||||||
|
pairings.add(pairingsR10)
|
||||||
|
|
||||||
|
// read tournament without pairings
|
||||||
|
var file = getTestFile("opengotha/pairings/notsosimpleswiss_nopairings.xml")
|
||||||
|
logger.info("read from file $file")
|
||||||
|
val resource = file.readText(StandardCharsets.UTF_8)
|
||||||
|
var resp = TestAPI.post("/api/tour", resource)
|
||||||
|
val id = resp.asObject().getInt("id")
|
||||||
|
assertNotNull(id)
|
||||||
|
val tournament = TestAPI.get("/api/tour/$id").asObject()
|
||||||
|
logger.info(tournament.toString().slice(0..50) + "...")
|
||||||
|
val players = TestAPI.get("/api/tour/$id/part").asArray()
|
||||||
|
logger.info(players.toString().slice(0..50) + "...")
|
||||||
|
|
||||||
|
var games: Json.Array
|
||||||
|
var firstGameID: Int
|
||||||
|
var playersList = mutableListOf<Long>()
|
||||||
|
|
||||||
|
for (i in 0..34){
|
||||||
|
playersList.add(players.getJson(i)!!.asObject()["id"] as Long)
|
||||||
|
}
|
||||||
|
|
||||||
|
val byePlayerList = mutableListOf<Long>(354, 359, 356, 357, 345, 339, 368, 344, 349, 341)
|
||||||
|
|
||||||
|
for (round in 1..7) {
|
||||||
|
games = TestAPI.post("/api/tour/$id/pair/$round", Json.Array(playersList.filter{it != byePlayerList[round-1]})).asArray()
|
||||||
|
logger.info("games for round $round: {}", games.toString())
|
||||||
|
|
||||||
|
assertTrue(compare_weights("weights.txt", "opengotha/notsosimpleswiss_weights_R$round.txt"), "Not matching opengotha weights for round $round")
|
||||||
|
assertTrue(compare_games(games, Json.parse(pairings[round - 1])!!.asArray()),"pairings for round $round differ")
|
||||||
|
logger.info("Pairings for round $round match OpenGotha")
|
||||||
|
|
||||||
|
firstGameID = (games.getJson(0)!!.asObject()["id"] as Long?)!!.toInt()
|
||||||
|
for (gameID in firstGameID..firstGameID + 15) {
|
||||||
|
resp = TestAPI.put("/api/tour/$id/res/$round", Json.parse("""{"id":$gameID,"result":"b"}""")).asObject()
|
||||||
|
assertTrue(resp.getBoolean("success") == true, "expecting success")
|
||||||
|
}
|
||||||
|
logger.info("Results succesfully entered for round $round")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,254 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<Tournament dataVersion="201" externalIPAddress="77.128.107.78" gothaMinorVersion="5" gothaVersion="348" saveDT="20191119110542">
|
||||||
|
<Players>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="84Av" country="FR" egfPin="" ffgLicence="0120001" ffgLicenceStatus="L" firstName="Bernard" grade="3K" name="Mignucci" participating="11111111111111111111" rank="3K" rating="1762" ratingOrigin="EGF : 1762" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="8414002" ffgLicenceStatus="L" firstName="Jean-Christophe" grade="3K" name="Honoré" participating="11111111111111111111" rank="3K" rating="1800" ratingOrigin="FFG : -254" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="0013006" ffgLicenceStatus="L" firstName="Philippe" grade="1K" name="Guerre-Genton" participating="11111111111111111111" rank="1K" rating="2008" ratingOrigin="EGF : 2008" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="47Ag" country="FR" egfPin="" ffgLicence="0652005" ffgLicenceStatus="L" firstName="Jean-Pierre" grade="11K" name="Ladet" participating="11111111111111111111" rank="11K" rating="993" ratingOrigin="EGF : 993" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="8312100" ffgLicenceStatus="L" firstName="Monique" grade="2K" name="Berreby" participating="11111111111111111111" rank="2K" rating="1893" ratingOrigin="EGF : 1893" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="06Pe" country="FR" egfPin="" ffgLicence="0370000" ffgLicenceStatus="L" firstName="Rémi" grade="8K" name="Butaud" participating="11111111111111111111" rank="8K" rating="1300" ratingOrigin="FFG : -725" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30Al" country="FR" egfPin="" ffgLicence="9177404" ffgLicenceStatus="L" firstName="Denis" grade="1D" name="Feldmann" participating="11111111111111111111" rank="1D" rating="2031" ratingOrigin="EGF : 2031" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="7904900" ffgLicenceStatus="L" firstName="Dominique" grade="1D" name="Cornuejols" participating="11111111111111111111" rank="1D" rating="2063" ratingOrigin="EGF : 2063" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30LV" country="FR" egfPin="" ffgLicence="1700164" ffgLicenceStatus="L" firstName="Stephan" grade="10K" name="Habuda" participating="11111111111111111111" rank="10K" rating="1126" ratingOrigin="EGF : 1126" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30LV" country="FR" egfPin="" ffgLicence="1900261" ffgLicenceStatus="L" firstName="Bruno" grade="11K" name="Martin-Vallas" participating="11111111111111111111" rank="11K" rating="938" ratingOrigin="EGF : 938" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="0013005" ffgLicenceStatus="L" firstName="Luc" grade="8K" name="Ronayette" participating="11111111111111111111" rank="8K" rating="1343" ratingOrigin="FFG : -707" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111111110000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="9791002" ffgLicenceStatus="L" firstName="Toru" grade="3D" name="Imamura-Cornuejols" participating="11111111111111111111" rank="3D" rating="2336" ratingOrigin="FFG : 286" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111111110000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="34Mo" country="FR" egfPin="" ffgLicence="2000244" ffgLicenceStatus="L" firstName="Véronique" grade="30K" name="Born" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="9251702" ffgLicenceStatus="C" firstName="Michel" grade="7K" name="Bonis" participating="11111111111111111111" rank="7K" rating="1376" ratingOrigin="EGF : 1376" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="8696800" ffgLicenceStatus="L" firstName="Christian" grade="6K" name="Boyart" participating="11111111111111111111" rank="6K" rating="1490" ratingOrigin="EGF : 1490" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="9213054" ffgLicenceStatus="-" firstName="Pierre" grade="5K" name="Labeye" participating="11111111111111111111" rank="5K" rating="1550" ratingOrigin="FFG : -500" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="2100010" ffgLicenceStatus="L" firstName="Serge" grade="5K" name="Eon" participating="11111111111111111111" rank="5K" rating="1576" ratingOrigin="EGF : 1576" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="9838001" ffgLicenceStatus="L" firstName="Chantal" grade="5K" name="Gajdos" participating="11111111111111111111" rank="5K" rating="1513" ratingOrigin="EGF : 1513" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="9721004" ffgLicenceStatus="L" firstName="Laurent" grade="3K" name="Lamôle" participating="11111111111111111111" rank="3K" rating="1800" ratingOrigin="FFG : -256" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="91Or" country="FR" egfPin="" ffgLicence="0321007" ffgLicenceStatus="C" firstName="Paul" grade="2K" name="Baratou" participating="11111111111111111111" rank="2K" rating="1862" ratingOrigin="EGF : 1862" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="7920001" ffgLicenceStatus="L" firstName="Frédéric" grade="5D" name="Donzet" participating="11111111111111111111" rank="5D" rating="2500" ratingOrigin="FFG : 435" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="91SM" country="FR" egfPin="" ffgLicence="1400089" ffgLicenceStatus="L" firstName="Nicita" grade="10K" name="Giovanni" participating="11111111111111111111" rank="10K" rating="1100" ratingOrigin="FFG : -985" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="7911800" ffgLicenceStatus="L" firstName="François" grade="2D" name="Mizessyn" participating="11111111111111111111" rank="2D" rating="2200" ratingOrigin="FFG : 178" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="0322103" ffgLicenceStatus="L" firstName="Claude" grade="7K" name="Brisson" participating="11111111111111111111" rank="7K" rating="1342" ratingOrigin="EGF : 1342" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
</Players>
|
||||||
|
<Games>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="1" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="BARATOUPAUL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="2" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="3" whitePlayer="HABUDASTEPHAN"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="4" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="5" whitePlayer="MARTIN-VALLASBRUNO"/>
|
||||||
|
<Game blackPlayer="RONAYETTELUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="6" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="7" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="8" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="9" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="10" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="11" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="12" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="13" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="BRISSONCLAUDE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="14" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="15" whitePlayer="JOLLIVETGUY"/>
|
||||||
|
<Game blackPlayer="LABEYEPIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="16" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="BORNVÉRONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="17" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="1" whitePlayer="DUPRÉWILLIAM"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="2" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="3" whitePlayer="BATAILLERPHILIPPE"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="4" whitePlayer="MIGNUCCIBERNARD"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="5" whitePlayer="CORNUEJOLSDOMINIQUE"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="6" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="7" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="8" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="GIOVANNINICITA" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="9" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="BRISSONCLAUDE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="10" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="11" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="12" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="13" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="MIZESSYNFRANÇOIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="14" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="IMAMURA-CORNUEJOLSTORU" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="15" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="BARATOUPAUL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="16" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="10" tableNumber="17" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="1" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="2" whitePlayer="JOLLIVETGUY"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="3" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="4" whitePlayer="LADETJEAN-PIERRE"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="5" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="6" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="7" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="8" whitePlayer="HABUDASTEPHAN"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="9" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="FELDMANNDENIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="10" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="GIOVANNINICITA" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="11" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="12" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="13" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="14" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="LABEYEPIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="15" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="BARATOUPAUL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="16" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="9" tableNumber="17" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="BORNVÉRONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="1" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="2" whitePlayer="DUPRÉWILLIAM"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="3" whitePlayer="HUBERTJÉRÔME"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="4" whitePlayer="CORNUEJOLSDOMINIQUE"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="5" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="6" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="7" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="8" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="9" whitePlayer="MIGNUCCIBERNARD"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="10" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="FELDMANNDENIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="11" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
<Game blackPlayer="BRISSONCLAUDE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="12" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="GIOVANNINICITA" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="13" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="MIZESSYNFRANÇOIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="14" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="BUTAUDRÉMI" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="15" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="LAMÔLELAURENT" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="16" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="8" tableNumber="17" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="1" whitePlayer="CORNUEJOLSDOMINIQUE"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="2" whitePlayer="HUBERTJÉRÔME"/>
|
||||||
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="3" whitePlayer="BATAILLERPHILIPPE"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="4" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="5" whitePlayer="HABUDASTEPHAN"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="6" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
|
<Game blackPlayer="BONISMICHEL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="7" whitePlayer="JEGOUMARC"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="8" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="9" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="10" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="11" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="12" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="13" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="14" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="IMAMURA-CORNUEJOLSTORU" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="15" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="BUTAUDRÉMI" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="16" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="LAMÔLELAURENT" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="17" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="1" whitePlayer="DUPRÉWILLIAM"/>
|
||||||
|
<Game blackPlayer="BORNVÉRONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="2" whitePlayer="MIGNUCCIBERNARD"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="3" whitePlayer="BATAILLERPHILIPPE"/>
|
||||||
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="4" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="5" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="6" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="7" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="8" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="9" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="10" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
<Game blackPlayer="FELDMANNDENIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="11" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="LABEYEPIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="12" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="13" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="14" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="15" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="IMAMURA-CORNUEJOLSTORU" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="16" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="LAMÔLELAURENT" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="17" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="1" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="2" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="3" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="4" whitePlayer="LADETJEAN-PIERRE"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="5" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="6" whitePlayer="JOLLIVETGUY"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="7" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="8" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="BONISMICHEL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="9" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="10" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="11" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
<Game blackPlayer="BRISSONCLAUDE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="12" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="RONAYETTELUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="13" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="14" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="LABEYEPIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="15" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="MIZESSYNFRANÇOIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="16" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="IMAMURA-CORNUEJOLSTORU" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="17" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="1" whitePlayer="MIGNUCCIBERNARD"/>
|
||||||
|
<Game blackPlayer="BORNVÉRONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="2" whitePlayer="HUBERTJÉRÔME"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="3" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="4" whitePlayer="MARTIN-VALLASBRUNO"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="5" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="6" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="7" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="8" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="9" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="GRIMONDPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="10" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="11" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="FELDMANNDENIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="12" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="13" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="14" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="GIOVANNINICITA" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="15" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="BUTAUDRÉMI" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="16" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="MIZESSYNFRANÇOIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="4" tableNumber="17" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="1" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="2" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="3" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="BORNVÉRONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="4" whitePlayer="CORNUEJOLSDOMINIQUE"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="5" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="6" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="7" whitePlayer="JEGOUMARC"/>
|
||||||
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="8" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
|
<Game blackPlayer="BONISMICHEL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="9" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="10" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="11" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="12" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="BARATOUPAUL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="13" whitePlayer="NEANTFABRICE"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="14" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="15" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="16" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="GIOVANNINICITA" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="3" tableNumber="17" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="1" whitePlayer="LABEYEPIERRE"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="2" whitePlayer="RONAYETTELUC"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="3" whitePlayer="LADETJEAN-PIERRE"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="4" whitePlayer="JEGOUMARC"/>
|
||||||
|
<Game blackPlayer="BRISSONCLAUDE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="5" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="6" whitePlayer="HABARTGILLES"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="7" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="8" whitePlayer="BATAILLERPHILIPPE"/>
|
||||||
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="9" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="BONISMICHEL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="10" whitePlayer="IMAMURA-CORNUEJOLSTORU"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="11" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="FELDMANNDENIS" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="12" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="13" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="14" whitePlayer="HABUDASTEPHAN"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="15" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="16" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="17" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
</Games>
|
||||||
|
<ByePlayers>
|
||||||
|
<ByePlayer player="DUPRÉWILLIAM" roundNumber="1"/>
|
||||||
|
<ByePlayer player="BORNVÉRONIQUE" roundNumber="2"/>
|
||||||
|
<ByePlayer player="JOLLIVETGUY" roundNumber="3"/>
|
||||||
|
<ByePlayer player="JEGOUMARC" roundNumber="4"/>
|
||||||
|
<ByePlayer player="MARTIN-VALLASBRUNO" roundNumber="5"/>
|
||||||
|
<ByePlayer player="LADETJEAN-PIERRE" roundNumber="6"/>
|
||||||
|
<ByePlayer player="GIOVANNINICITA" roundNumber="7"/>
|
||||||
|
<ByePlayer player="HABUDASTEPHAN" roundNumber="8"/>
|
||||||
|
<ByePlayer player="RONAYETTELUC" roundNumber="9"/>
|
||||||
|
<ByePlayer player="BUTAUDRÉMI" roundNumber="10"/>
|
||||||
|
</ByePlayers>
|
||||||
|
<TournamentParameterSet>
|
||||||
|
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="10" shortName="notsosimpleswiss_10R" size="19" stdByoYomiTime="30"/>
|
||||||
|
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
||||||
|
<PlacementParameterSet>
|
||||||
|
<PlacementCriteria>
|
||||||
|
<PlacementCriterion name="NBW" number="1"/>
|
||||||
|
<PlacementCriterion name="SOSW" number="2"/>
|
||||||
|
<PlacementCriterion name="SOSOSW" number="3"/>
|
||||||
|
<PlacementCriterion name="NULL" number="4"/>
|
||||||
|
<PlacementCriterion name="NULL" number="5"/>
|
||||||
|
<PlacementCriterion name="NULL" number="6"/>
|
||||||
|
</PlacementCriteria>
|
||||||
|
</PlacementParameterSet>
|
||||||
|
<PairingParameterSet paiBaAvoidDuplGame="500000000000000" paiBaBalanceWB="1000000" paiBaDeterministic="true" paiBaRandom="0" paiMaAdditionalPlacementCritSystem1="Rating" paiMaAdditionalPlacementCritSystem2="Rating" paiMaAvoidMixingCategories="0" paiMaCompensateDUDD="true" paiMaDUDDLowerMode="TOP" paiMaDUDDUpperMode="BOT" paiMaDUDDWeight="100000000" paiMaLastRoundForSeedSystem1="3" paiMaMaximizeSeeding="5000000" paiMaMinimizeScoreDifference="100000000000" paiMaSeedSystem1="SPLITANDRANDOM" paiMaSeedSystem2="SPLITANDFOLD" paiSeAvoidSameGeo="0" paiSeBarThresholdActive="true" paiSeDefSecCrit="20000000000000" paiSeMinimizeHandicap="0" paiSeNbWinsThresholdActive="true" paiSePreferMMSDiffRatherThanSameClub="2" paiSePreferMMSDiffRatherThanSameCountry="1" paiSeRankThreshold="5D" paiStandardNX1Factor="0.5"/>
|
||||||
|
<DPParameterSet displayClCol="true" displayCoCol="true" displayIndGamesInMatches="true" displayNPPlayers="false" displayNumCol="true" displayPlCol="true" gameFormat="short" playerSortType="name" showByePlayer="true" showNotFinallyRegisteredPlayers="true" showNotPairedPlayers="true" showNotParticipatingPlayers="false" showPlayerClub="true" showPlayerCountry="false" showPlayerGrade="true"/>
|
||||||
|
<PublishParameterSet exportToLocalFile="true" htmlAutoScroll="false" print="false"/>
|
||||||
|
</TournamentParameterSet>
|
||||||
|
<TeamTournamentParameterSet>
|
||||||
|
<TeamGeneralParameterSet teamSize="4"/>
|
||||||
|
<TeamPlacementParameterSet>
|
||||||
|
<PlacementCriteria>
|
||||||
|
<PlacementCriterion name="TEAMP" number="1"/>
|
||||||
|
<PlacementCriterion name="BDW" number="2"/>
|
||||||
|
<PlacementCriterion name="BDW3U" number="3"/>
|
||||||
|
<PlacementCriterion name="BDW2U" number="4"/>
|
||||||
|
<PlacementCriterion name="BDW1U" number="5"/>
|
||||||
|
<PlacementCriterion name="MNR" number="6"/>
|
||||||
|
</PlacementCriteria>
|
||||||
|
</TeamPlacementParameterSet>
|
||||||
|
</TeamTournamentParameterSet>
|
||||||
|
</Tournament>
|
@@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<Tournament dataVersion="201" externalIPAddress="77.128.107.78" gothaMinorVersion="5" gothaVersion="348" saveDT="20191119110542">
|
||||||
|
<Players>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="84Av" country="FR" egfPin="" ffgLicence="0120001" ffgLicenceStatus="L" firstName="Bernard" grade="3K" name="Mignucci" participating="11111111111111111111" rank="3K" rating="1762" ratingOrigin="EGF : 1762" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="8414002" ffgLicenceStatus="L" firstName="Jean-Christophe" grade="3K" name="Honoré" participating="11111111111111111111" rank="3K" rating="1800" ratingOrigin="FFG : -254" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="0013006" ffgLicenceStatus="L" firstName="Philippe" grade="1K" name="Guerre-Genton" participating="11111111111111111111" rank="1K" rating="2008" ratingOrigin="EGF : 2008" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="47Ag" country="FR" egfPin="" ffgLicence="0652005" ffgLicenceStatus="L" firstName="Jean-Pierre" grade="11K" name="Ladet" participating="11111111111111111111" rank="11K" rating="993" ratingOrigin="EGF : 993" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="8312100" ffgLicenceStatus="L" firstName="Monique" grade="2K" name="Berreby" participating="11111111111111111111" rank="2K" rating="1893" ratingOrigin="EGF : 1893" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="06Pe" country="FR" egfPin="" ffgLicence="0370000" ffgLicenceStatus="L" firstName="Rémi" grade="8K" name="Butaud" participating="11111111111111111111" rank="8K" rating="1300" ratingOrigin="FFG : -725" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30Al" country="FR" egfPin="" ffgLicence="9177404" ffgLicenceStatus="L" firstName="Denis" grade="1D" name="Feldmann" participating="11111111111111111111" rank="1D" rating="2031" ratingOrigin="EGF : 2031" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="7904900" ffgLicenceStatus="L" firstName="Dominique" grade="1D" name="Cornuejols" participating="11111111111111111111" rank="1D" rating="2063" ratingOrigin="EGF : 2063" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30LV" country="FR" egfPin="" ffgLicence="1700164" ffgLicenceStatus="L" firstName="Stephan" grade="10K" name="Habuda" participating="11111111111111111111" rank="10K" rating="1126" ratingOrigin="EGF : 1126" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="30LV" country="FR" egfPin="" ffgLicence="1900261" ffgLicenceStatus="L" firstName="Bruno" grade="11K" name="Martin-Vallas" participating="11111111111111111111" rank="11K" rating="938" ratingOrigin="EGF : 938" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="0013005" ffgLicenceStatus="L" firstName="Luc" grade="8K" name="Ronayette" participating="11111111111111111111" rank="8K" rating="1343" ratingOrigin="FFG : -707" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111111110000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="9791002" ffgLicenceStatus="L" firstName="Toru" grade="3D" name="Imamura-Cornuejols" participating="11111111111111111111" rank="3D" rating="2336" ratingOrigin="FFG : 286" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111111110000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="34Mo" country="FR" egfPin="" ffgLicence="2000244" ffgLicenceStatus="L" firstName="Véronique" grade="30K" name="Born" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="9251702" ffgLicenceStatus="C" firstName="Michel" grade="7K" name="Bonis" participating="11111111111111111111" rank="7K" rating="1376" ratingOrigin="EGF : 1376" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="8696800" ffgLicenceStatus="L" firstName="Christian" grade="6K" name="Boyart" participating="11111111111111111111" rank="6K" rating="1490" ratingOrigin="EGF : 1490" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="9213054" ffgLicenceStatus="-" firstName="Pierre" grade="5K" name="Labeye" participating="11111111111111111111" rank="5K" rating="1550" ratingOrigin="FFG : -500" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="2100010" ffgLicenceStatus="L" firstName="Serge" grade="5K" name="Eon" participating="11111111111111111111" rank="5K" rating="1576" ratingOrigin="EGF : 1576" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="9838001" ffgLicenceStatus="L" firstName="Chantal" grade="5K" name="Gajdos" participating="11111111111111111111" rank="5K" rating="1513" ratingOrigin="EGF : 1513" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="9721004" ffgLicenceStatus="L" firstName="Laurent" grade="3K" name="Lamôle" participating="11111111111111111111" rank="3K" rating="1800" ratingOrigin="FFG : -256" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="91Or" country="FR" egfPin="" ffgLicence="0321007" ffgLicenceStatus="C" firstName="Paul" grade="2K" name="Baratou" participating="11111111111111111111" rank="2K" rating="1862" ratingOrigin="EGF : 1862" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="7920001" ffgLicenceStatus="L" firstName="Frédéric" grade="5D" name="Donzet" participating="11111111111111111111" rank="5D" rating="2500" ratingOrigin="FFG : 435" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="91SM" country="FR" egfPin="" ffgLicence="1400089" ffgLicenceStatus="L" firstName="Nicita" grade="10K" name="Giovanni" participating="11111111111111111111" rank="10K" rating="1100" ratingOrigin="FFG : -985" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="7911800" ffgLicenceStatus="L" firstName="François" grade="2D" name="Mizessyn" participating="11111111111111111111" rank="2D" rating="2200" ratingOrigin="FFG : 178" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="0322103" ffgLicenceStatus="L" firstName="Claude" grade="7K" name="Brisson" participating="11111111111111111111" rank="7K" rating="1342" ratingOrigin="EGF : 1342" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
|
</Players>
|
||||||
|
<Games/>
|
||||||
|
<TournamentParameterSet>
|
||||||
|
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="10" shortName="notsosimpleswiss_nopairings" size="19" stdByoYomiTime="30"/>
|
||||||
|
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
||||||
|
<PlacementParameterSet>
|
||||||
|
<PlacementCriteria>
|
||||||
|
<PlacementCriterion name="NBW" number="1"/>
|
||||||
|
<PlacementCriterion name="SOSW" number="2"/>
|
||||||
|
<PlacementCriterion name="SOSOSW" number="3"/>
|
||||||
|
<PlacementCriterion name="NULL" number="4"/>
|
||||||
|
<PlacementCriterion name="NULL" number="5"/>
|
||||||
|
<PlacementCriterion name="NULL" number="6"/>
|
||||||
|
</PlacementCriteria>
|
||||||
|
</PlacementParameterSet>
|
||||||
|
<PairingParameterSet paiBaAvoidDuplGame="500000000000000" paiBaBalanceWB="1000000" paiBaDeterministic="true" paiBaRandom="0" paiMaAdditionalPlacementCritSystem1="Rating" paiMaAdditionalPlacementCritSystem2="Rating" paiMaAvoidMixingCategories="0" paiMaCompensateDUDD="true" paiMaDUDDLowerMode="TOP" paiMaDUDDUpperMode="BOT" paiMaDUDDWeight="100000000" paiMaLastRoundForSeedSystem1="3" paiMaMaximizeSeeding="5000000" paiMaMinimizeScoreDifference="100000000000" paiMaSeedSystem1="SPLITANDRANDOM" paiMaSeedSystem2="SPLITANDFOLD" paiSeAvoidSameGeo="0" paiSeBarThresholdActive="true" paiSeDefSecCrit="20000000000000" paiSeMinimizeHandicap="0" paiSeNbWinsThresholdActive="true" paiSePreferMMSDiffRatherThanSameClub="2" paiSePreferMMSDiffRatherThanSameCountry="1" paiSeRankThreshold="5D" paiStandardNX1Factor="0.5"/>
|
||||||
|
<DPParameterSet displayClCol="true" displayCoCol="true" displayIndGamesInMatches="true" displayNPPlayers="false" displayNumCol="true" displayPlCol="true" gameFormat="short" playerSortType="name" showByePlayer="true" showNotFinallyRegisteredPlayers="true" showNotPairedPlayers="true" showNotParticipatingPlayers="false" showPlayerClub="true" showPlayerCountry="false" showPlayerGrade="true"/>
|
||||||
|
<PublishParameterSet exportToLocalFile="true" htmlAutoScroll="false" print="false"/>
|
||||||
|
</TournamentParameterSet>
|
||||||
|
<TeamTournamentParameterSet>
|
||||||
|
<TeamGeneralParameterSet teamSize="4"/>
|
||||||
|
<TeamPlacementParameterSet>
|
||||||
|
<PlacementCriteria>
|
||||||
|
<PlacementCriterion name="TEAMP" number="1"/>
|
||||||
|
<PlacementCriterion name="BDW" number="2"/>
|
||||||
|
<PlacementCriterion name="BDW3U" number="3"/>
|
||||||
|
<PlacementCriterion name="BDW2U" number="4"/>
|
||||||
|
<PlacementCriterion name="BDW1U" number="5"/>
|
||||||
|
<PlacementCriterion name="MNR" number="6"/>
|
||||||
|
</PlacementCriteria>
|
||||||
|
</TeamPlacementParameterSet>
|
||||||
|
</TeamTournamentParameterSet>
|
||||||
|
</Tournament>
|
@@ -14,11 +14,11 @@
|
|||||||
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111000000000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111110000000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111000000000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111110000000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
@@ -51,6 +51,38 @@
|
|||||||
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="14" whitePlayer="MARTINYVAN"/>
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="14" whitePlayer="MARTINYVAN"/>
|
||||||
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="15" whitePlayer="JEGOUMARC"/>
|
<Game blackPlayer="EONSERGE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="15" whitePlayer="JEGOUMARC"/>
|
||||||
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="16" whitePlayer="GAJDOSCHANTAL"/>
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="1" tableNumber="16" whitePlayer="GAJDOSCHANTAL"/>
|
||||||
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="1" whitePlayer="LAMÔLELAURENT"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="2" whitePlayer="CORNUEJOLSDOMINIQUE"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="3" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="4" whitePlayer="BERREBYMONIQUE"/>
|
||||||
|
<Game blackPlayer="MIGNUCCIBERNARD" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="5" whitePlayer="HUBERTJÉRÔME"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="6" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
|
<Game blackPlayer="LADETJEAN-PIERRE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="7" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="8" whitePlayer="BOYARTCHRISTIAN"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="9" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="10" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="JEGOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="11" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="12" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="BONISMICHEL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="13" whitePlayer="MARTINYVAN"/>
|
||||||
|
<Game blackPlayer="HONORÉJEAN-CHRISTOPHE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="14" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="15" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="BUTAUDRÉMI" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="7" tableNumber="16" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="1" whitePlayer="GUILLOUMARC"/>
|
||||||
|
<Game blackPlayer="CORNUEJOLSDOMINIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="2" whitePlayer="DONZETFRÉDÉRIC"/>
|
||||||
|
<Game blackPlayer="LAMÔLELAURENT" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="3" whitePlayer="MIGNUCCIBERNARD"/>
|
||||||
|
<Game blackPlayer="GUERRE-GENTONPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="4" whitePlayer="EONSERGE"/>
|
||||||
|
<Game blackPlayer="HUBERTJÉRÔME" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="5" whitePlayer="LADETJEAN-PIERRE"/>
|
||||||
|
<Game blackPlayer="BERREBYMONIQUE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="6" whitePlayer="FELDMANNDENIS"/>
|
||||||
|
<Game blackPlayer="DUPRÉWILLIAM" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="7" whitePlayer="BRISSONCLAUDE"/>
|
||||||
|
<Game blackPlayer="GAILLARDJEAN-LUC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="8" whitePlayer="BARATOUPAUL"/>
|
||||||
|
<Game blackPlayer="MARTIN-VALLASBRUNO" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="9" whitePlayer="BONISMICHEL"/>
|
||||||
|
<Game blackPlayer="JOLLIVETGUY" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="10" whitePlayer="HONORÉJEAN-CHRISTOPHE"/>
|
||||||
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="11" whitePlayer="MIZESSYNFRANÇOIS"/>
|
||||||
|
<Game blackPlayer="BATAILLERPHILIPPE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="12" whitePlayer="GRIMONDPHILIPPE"/>
|
||||||
|
<Game blackPlayer="HABUDASTEPHAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="13" whitePlayer="JEGOUMARC"/>
|
||||||
|
<Game blackPlayer="GAJDOSCHANTAL" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="14" whitePlayer="GIOVANNINICITA"/>
|
||||||
|
<Game blackPlayer="MARTINYVAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="15" whitePlayer="BUTAUDRÉMI"/>
|
||||||
|
<Game blackPlayer="HABARTGILLES" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="6" tableNumber="16" whitePlayer="BORNVÉRONIQUE"/>
|
||||||
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="1" whitePlayer="LAMÔLELAURENT"/>
|
<Game blackPlayer="DONZETFRÉDÉRIC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="1" whitePlayer="LAMÔLELAURENT"/>
|
||||||
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="2" whitePlayer="GAILLARDJEAN-LUC"/>
|
<Game blackPlayer="NEANTFABRICE" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="2" whitePlayer="GAILLARDJEAN-LUC"/>
|
||||||
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="3" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
<Game blackPlayer="GUILLOUMARC" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="5" tableNumber="3" whitePlayer="GUERRE-GENTONPHILIPPE"/>
|
||||||
@@ -117,7 +149,7 @@
|
|||||||
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="16" whitePlayer="JEGOUMARC"/>
|
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="16" whitePlayer="JEGOUMARC"/>
|
||||||
</Games>
|
</Games>
|
||||||
<TournamentParameterSet>
|
<TournamentParameterSet>
|
||||||
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="5" shortName="simpleswiss" size="19" stdByoYomiTime="30"/>
|
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="7" shortName="simpleswiss_7R" size="19" stdByoYomiTime="30"/>
|
||||||
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
||||||
<PlacementParameterSet>
|
<PlacementParameterSet>
|
||||||
<PlacementCriteria>
|
<PlacementCriteria>
|
@@ -14,11 +14,11 @@
|
|||||||
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="76Ro" country="FR" egfPin="" ffgLicence="8665300" ffgLicenceStatus="L" firstName="Jean-Luc" grade="9K" name="Gaillard" participating="11111111111111111111" rank="9K" rating="1127" ratingOrigin="EGF : 1127" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Pa" country="FR" egfPin="" ffgLicence="1800039" ffgLicenceStatus="L" firstName="Gilles" grade="7K" name="Habart" participating="11111111111111111111" rank="7K" rating="1343" ratingOrigin="EGF : 1343" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="7907800" ffgLicenceStatus="L" firstName="Jérôme" grade="3D" name="Hubert" participating="11111111111111111111" rank="3D" rating="2300" ratingOrigin="FFG : 276" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111000000000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="64Ba" country="FR" egfPin="" ffgLicence="1200009" ffgLicenceStatus="C" firstName="Philippe" grade="3K" name="Batailler" participating="11111110000000000000" rank="3K" rating="1793" ratingOrigin="EGF : 1793" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0425000" ffgLicenceStatus="L" firstName="Philippe" grade="7K" name="Grimond" participating="11111111111111111111" rank="7K" rating="1378" ratingOrigin="EGF : 1378" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="86Po" country="FR" egfPin="" ffgLicence="9725084" ffgLicenceStatus="L" firstName="Fabrice" grade="7K" name="Neant" participating="11111111111111111111" rank="7K" rating="1340" ratingOrigin="EGF : 1340" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="2100032" ffgLicenceStatus="L" firstName="William" grade="30K" name="Dupré" participating="11111111111111111111" rank="30K" rating="1150" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111000000000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9237201" ffgLicenceStatus="L" firstName="Marc" grade="4K" name="Guillou" participating="11111110000000000000" rank="4K" rating="1745" ratingOrigin="EGF : 1745" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1400130" ffgLicenceStatus="L" firstName="Guy" grade="20K" name="Jollivet" participating="11111111111111111111" rank="20K" rating="160" ratingOrigin="EGF : 160" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="8004400" ffgLicenceStatus="L" firstName="Marc" grade="11K" name="Jegou" participating="11111111111111111111" rank="11K" rating="904" ratingOrigin="EGF : 904" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="1450001" ffgLicenceStatus="L" firstName="Yvan" grade="4K" name="Martin" participating="11111111111111111111" rank="4K" rating="1617" ratingOrigin="EGF : 1617" registeringStatus="FIN" smmsCorrection="0"/>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
</Players>
|
</Players>
|
||||||
<Games/>
|
<Games/>
|
||||||
<TournamentParameterSet>
|
<TournamentParameterSet>
|
||||||
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="5" shortName="simpleswiss_nopairings" size="19" stdByoYomiTime="30"/>
|
<GeneralParameterSet bInternet="false" basicTime="60" beginDate="2020-12-22" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="François Mizessyn" endDate="2021-01-07" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Internet" name="Championnat des Vieux Dragons" nbMovesCanTime="15" numberOfCategories="1" numberOfRounds="7" shortName="simpleswiss_nopairings" size="19" stdByoYomiTime="30"/>
|
||||||
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
<HandicapParameterSet hdBasedOnMMS="true" hdCeiling="0" hdCorrection="0" hdNoHdRankThreshold="30K"/>
|
||||||
<PlacementParameterSet>
|
<PlacementParameterSet>
|
||||||
<PlacementCriteria>
|
<PlacementCriteria>
|
@@ -5952,36 +5952,3 @@ mainSeedCost=4824219
|
|||||||
secHandiCost=0
|
secHandiCost=0
|
||||||
secGeoCost=0
|
secGeoCost=0
|
||||||
totalCost=500100004824220
|
totalCost=500100004824220
|
||||||
Order
|
|
||||||
PlayerNameOrder=Baratou Paul
|
|
||||||
PlayerNameOrder=Batailler Philippe
|
|
||||||
PlayerNameOrder=Berreby Monique
|
|
||||||
PlayerNameOrder=Bonis Michel
|
|
||||||
PlayerNameOrder=Born Véronique
|
|
||||||
PlayerNameOrder=Boyart Christian
|
|
||||||
PlayerNameOrder=Brisson Claude
|
|
||||||
PlayerNameOrder=Butaud Rémi
|
|
||||||
PlayerNameOrder=Cornuejols Dominique
|
|
||||||
PlayerNameOrder=Donzet Frédéric
|
|
||||||
PlayerNameOrder=Dupré William
|
|
||||||
PlayerNameOrder=Eon Serge
|
|
||||||
PlayerNameOrder=Feldmann Denis
|
|
||||||
PlayerNameOrder=Gaillard Jean-Luc
|
|
||||||
PlayerNameOrder=Gajdos Chantal
|
|
||||||
PlayerNameOrder=Giovanni Nicita
|
|
||||||
PlayerNameOrder=Grimond Philippe
|
|
||||||
PlayerNameOrder=Guerre-Genton Philippe
|
|
||||||
PlayerNameOrder=Guillou Marc
|
|
||||||
PlayerNameOrder=Habart Gilles
|
|
||||||
PlayerNameOrder=Habuda Stephan
|
|
||||||
PlayerNameOrder=Honoré Jean-Christophe
|
|
||||||
PlayerNameOrder=Hubert Jérôme
|
|
||||||
PlayerNameOrder=Jegou Marc
|
|
||||||
PlayerNameOrder=Jollivet Guy
|
|
||||||
PlayerNameOrder=Ladet Jean-Pierre
|
|
||||||
PlayerNameOrder=Lamôle Laurent
|
|
||||||
PlayerNameOrder=Martin Yvan
|
|
||||||
PlayerNameOrder=Martin-Vallas Bruno
|
|
||||||
PlayerNameOrder=Mignucci Bernard
|
|
||||||
PlayerNameOrder=Mizessyn François
|
|
||||||
PlayerNameOrder=Neant Fabrice
|
|
||||||
|
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R3.txt
Normal file
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R3.txt
Normal file
File diff suppressed because it is too large
Load Diff
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R4.txt
Normal file
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R4.txt
Normal file
File diff suppressed because it is too large
Load Diff
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R5.txt
Normal file
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R5.txt
Normal file
File diff suppressed because it is too large
Load Diff
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R6.txt
Normal file
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R6.txt
Normal file
File diff suppressed because it is too large
Load Diff
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R7.txt
Normal file
5954
api-webapp/src/test/resources/opengotha/simpleswiss_weights_R7.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user