Merge from webview2

This commit is contained in:
Claude Brisson
2023-10-29 14:11:38 +01:00
23 changed files with 37465 additions and 389 deletions

View File

@@ -3,8 +3,6 @@ package org.jeudego.pairgoth.api
import com.republicate.kson.Json
import com.republicate.kson.toJsonArray
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.toID
import org.jeudego.pairgoth.model.toJson
@@ -29,7 +27,7 @@ object PairingHandler: PairgothApiHandler {
val round = getSubSelector(request)?.toIntOrNull() ?: badRequest("invalid round number")
val payload = getArrayPayload(request)
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 {
listOf(it.black, it.white)
}.toSet()

View File

@@ -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) {
companion object {
val MIN_RANK: Int = -30 // 30k
val MAX_RANK: Int = 20
}
abstract fun toJson(): Json.Object
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
}
val skip = mutableSetOf<Int>() // skipped rounds
fun equals(other: Pairable): Boolean {
return id == other.id
}
}
object ByePlayer: Pairable(0, "bye", 0, Int.MIN_VALUE) {

View File

@@ -4,8 +4,8 @@ import com.republicate.kson.Json
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
import org.jeudego.pairgoth.model.MainCritParams.SeedMethod.SPLIT_AND_SLIP
import org.jeudego.pairgoth.model.PairingType.*
import org.jeudego.pairgoth.pairing.MacMahonSolver
import org.jeudego.pairgoth.pairing.SwissSolver
import org.jeudego.pairgoth.pairing.solver.MacMahonSolver
import org.jeudego.pairgoth.pairing.solver.SwissSolver
// base pairing parameters
data class BaseCritParams(
@@ -14,7 +14,8 @@ data class BaseCritParams(
val dupWeight: Double = MAX_AVOIDDUPGAME,
val random: Double = 0.0,
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 {
if (nx1 < 0.0 || nx1 > 1.0) throw Error("invalid standardNX1Factor")
@@ -25,6 +26,7 @@ data class BaseCritParams(
companion object {
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_COLOR_BALANCE = 1000000.0 // 1e6
val default = BaseCritParams()

View File

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

View File

@@ -20,6 +20,7 @@ open class HistoryHelper(protected val history: List<List<Game>>, scoresGetter:
// Generic helper functions
open fun playedTogether(p1: Pairable, p2: Pairable) = paired.contains(Pair(p1.id, p2.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]
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 {
mutableMapOf<ID, Double>().apply {
history.flatten().forEach { game ->

View File

@@ -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
## Base criteria
- avoiddup

View File

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

View File

@@ -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.Criterion.*
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.jgrapht.alg.matching.blossom.v5.KolmogorovWeightedPerfectMatching
import org.jgrapht.alg.matching.blossom.v5.ObjectiveSense
@@ -16,99 +18,19 @@ import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
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
}
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
) {
sealed class BaseSolver(
val round: Int, // Round number
history: List<List<Game>>, // History of all games played for each round
pairables: List<Pairable>, // All pairables for this round, it may include the bye player
pairing: PairingParams,
placement: PlacementParams,
) : BasePairingHelper(history, pairables, pairing, placement) {
companion object {
val rand = Random(/* seed from properties - TODO */)
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) =
1.0 + // 1 is minimum value because 0 means "no matching allowed"
pairing.base.apply(p1, p2) +
@@ -118,15 +40,12 @@ sealed class Solver(
open fun weight(p1: Pairable, p2: Pairable) =
openGothaWeight(p1, p2) +
//pairing.base.applyByeWeight(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> {
weightLogs.clear()
// 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")
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("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 solution = matching.matching
fun gamesSort(p1:Pairable, p2:Pairable) = 0.5*(p1.place + p2.place)
var sorted = solution.map{
val sorted = solution.map{
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
}
var weightLogs: MutableMap<String, Array<DoubleArray>> = mutableMapOf()
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
// Base criteria
open fun BaseCritParams.apply(p1: Pairable, p2: Pairable): Double {
var score = 0.0
// Base Criterion 1 : Avoid Duplicating Game
@@ -215,14 +136,12 @@ sealed class Solver(
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
else dupWeight
logWeights("avoiddup", p1, p2, score)
return score
}
open fun BaseCritParams.applyRandom(p1: Pairable, p2: Pairable): Double {
val score = if (deterministic) detRandom(random, p1, p2)
else nonDetRandom(random)
logWeights("random", p1, p2, score)
return score
}
@@ -237,10 +156,22 @@ sealed class Solver(
if (wb1 * wb2 < 0) colorBalanceWeight
else if (wb1 == 0 && abs(wb2) >= 2 || wb2 == 0 && abs(wb1) >= 2) colorBalanceWeight / 2 else 0.0
} else 0.0
logWeights("color", p1, p2, 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
open fun MainCritParams.apply(p1: Pairable, p2: Pairable): Double {
var score = 0.0
@@ -274,11 +205,9 @@ sealed class Solver(
// TODO check category equality if category are used in SwissCat
if (scoreRange!=0){
val x = abs(p1.group - p2.group).toDouble() / scoreRange.toDouble()
val k: Double = pairing.base.nx1
score = scoreWeight * (1.0 - x) * (1.0 + k * x)
score = concavityFunction(x, scoreWeight)
}
logWeights("score", p1, p2, score)
return score
}
@@ -286,6 +215,84 @@ sealed class Solver(
var score = 0.0
// 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
}
@@ -324,7 +331,6 @@ sealed class Solver(
}
}
}
logWeights("seed", p1, p2, score)
return Math.round(score).toDouble()
}
@@ -434,9 +440,9 @@ sealed class Solver(
val hd = pairing.handicap.handicap(p1,p2)
if(hd==0){
if (p1.colorBalance > p2.colorBalance) {
score = 1.0
score = - 1.0
} else if (p1.colorBalance < p2.colorBalance) {
score = -1.0
score = 1.0
} else { // choose color from a det random
if (detRandom(1.0, p1, p2) === 0.0) {
score = 1.0
@@ -448,74 +454,14 @@ sealed class Solver(
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> {
// 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
//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}")
return listOf(Game(id = Store.nextGameId, black = black.id, white = white.id, handicap = pairing.handicap.handicap(black, white), drawnUpDown = white.group-black.group))
}
}

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.pairing
package org.jeudego.pairgoth.pairing.solver
import org.jeudego.pairgoth.model.*
@@ -7,7 +7,7 @@ class MacMahonSolver(round: Int,
pairables: List<Pairable>,
pairingParams: PairingParams,
placementParams: PlacementParams):
Solver(round, history, pairables, pairingParams, placementParams) {
BaseSolver(round, history, pairables, pairingParams, placementParams) {
override val scores: Map<ID, Double> by lazy {
historyHelper.wins.mapValues {

View File

@@ -1,14 +1,13 @@
package org.jeudego.pairgoth.pairing
package org.jeudego.pairgoth.pairing.solver
import org.jeudego.pairgoth.model.*
import kotlin.properties.Delegates
class SwissSolver(round: Int,
history: List<List<Game>>,
pairables: List<Pairable>,
pairingParams: PairingParams,
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

View File

@@ -7,7 +7,6 @@ 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.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
@@ -206,151 +205,4 @@ class BasicTests: TestBase() {
// 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")
}
}

View 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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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="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="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="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="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="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"/>
@@ -51,6 +51,38 @@
<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="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="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"/>
@@ -117,7 +149,7 @@
<Game blackPlayer="BOYARTCHRISTIAN" handicap="0" knownColor="true" result="RESULT_BLACKWINS" roundNumber="2" tableNumber="16" whitePlayer="JEGOUMARC"/>
</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="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"/>
<PlacementParameterSet>
<PlacementCriteria>

View File

@@ -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="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="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="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="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="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"/>
@@ -36,7 +36,7 @@
</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="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"/>
<PlacementParameterSet>
<PlacementCriteria>

View File

@@ -5952,36 +5952,3 @@ mainSeedCost=4824219
secHandiCost=0
secGeoCost=0
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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff