Merge branch 'pairing2' of http://gitlab.jeudego.org/tournois/pairgoth into pairing2

This commit is contained in:
Theo Barollet
2023-12-17 14:12:07 +01:00
7 changed files with 2281 additions and 1311 deletions

View File

@@ -116,8 +116,16 @@ object OpenGotha {
else -> throw Error("missing byoyomi type")
},
pairing = when (handParams.hdCeiling) {
0 -> Swiss(pairingParams = pairgothPairingParams, placementParams = pairgothPlacementParams)
else -> MacMahon(pairingParams = pairgothPairingParams, placementParams = pairgothPlacementParams)
0 -> Swiss(
pairingParams = pairgothPairingParams,
placementParams = pairgothPlacementParams
)
else -> MacMahon(
pairingParams = pairgothPairingParams,
placementParams = pairgothPlacementParams,
mmFloor = Pairable.parseRank(genParams.genMMFloor),
mmBar = Pairable.parseRank(genParams.genMMBar)
)
},
rounds = genParams.numberOfRounds
)
@@ -241,7 +249,15 @@ object OpenGotha {
TimeSystem.TimeSystemType.STANDARD -> "STDBYOYOMI"
TimeSystem.TimeSystemType.CANADIAN -> "CANBYOYOMI"
TimeSystem.TimeSystemType.FISCHER -> "FISCHER"
} }" director="" endDate="${tournament.endDate}" fischerTime="${tournament.timeSystem.increment}" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="9D" genMMFloor="30K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="${tournament.komi}" location="${tournament.location}" name="${tournament.name}" nbMovesCanTime="${tournament.timeSystem.stones}" numberOfCategories="1" numberOfRounds="${tournament.rounds}" shortName="${tournament.shortName}" size="${tournament.gobanSize}" stdByoYomiTime="${tournament.timeSystem.byoyomi}"/>
} }" director="" endDate="${tournament.endDate}" fischerTime="${tournament.timeSystem.increment}" genCountNotPlayedGamesAsHalfPoint="false" genMMBar="${
displayRank(
if (tournament.pairing is MacMahon) tournament.pairing.mmBar else 8
).uppercase(Locale.ROOT)
}" genMMFloor="${
displayRank(
if (tournament.pairing is MacMahon) tournament.pairing.mmFloor else -30
).uppercase(Locale.ROOT)
}" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="0" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="${tournament.komi}" location="${tournament.location}" name="${tournament.name}" nbMovesCanTime="${tournament.timeSystem.stones}" numberOfCategories="1" numberOfRounds="${tournament.rounds}" shortName="${tournament.shortName}" size="${tournament.gobanSize}" stdByoYomiTime="${tournament.timeSystem.byoyomi}"/>
<HandicapParameterSet hdBasedOnMMS="${tournament.pairing.pairingParams.handicap.useMMS}" hdCeiling="${tournament.pairing.pairingParams.handicap.ceiling}" hdCorrection="${tournament.pairing.pairingParams.handicap.correction}" hdNoHdRankThreshold="${displayRank(tournament.pairing.pairingParams.handicap.rankThreshold)}"/>
<PlacementParameterSet>
<PlacementCriteria>

View File

@@ -180,11 +180,13 @@ class MacMahon(
),
placementParams: PlacementParams = PlacementParams(
Criterion.NBW, Criterion.SOSW, Criterion.SOSOSW
)
),
var mmFloor: Int = -20,
var mmBar: Int = 0
): Pairing(MAC_MAHON, pairingParams, placementParams) {
companion object {}
override fun pair(tournament: Tournament<*>, round: Int, pairables: List<Pairable>): List<Game> {
return MacMahonSolver(round, tournament.historyBefore(round), pairables, pairingParams, placementParams).pair()
return MacMahonSolver(round, tournament.historyBefore(round), pairables, pairingParams, placementParams, mmFloor, mmBar).pair()
}
}
@@ -305,12 +307,15 @@ fun Pairing.Companion.fromJson(json: Json.Object): Pairing {
val placementParams = json.getArray("placement")?.let { PlacementParams.fromJson(it) } ?: defaultParams.placementParams
return when (type) {
SWISS -> Swiss(pairingParams, placementParams)
MAC_MAHON -> MacMahon(pairingParams, placementParams)
MAC_MAHON -> MacMahon(pairingParams, placementParams).also { mm ->
mm.mmFloor = json.getInt("mmFloor") ?: -20
mm.mmBar = json.getInt("mmBar") ?: 0
}
ROUND_ROBIN -> RoundRobin(pairingParams, placementParams)
}
}
fun Pairing.toJson() = Json.Object(
fun Pairing.toJson(): Json.Object = Json.MutableObject(
"type" to type.name,
"base" to pairingParams.base.toJson(),
"main" to pairingParams.main.toJson(),
@@ -318,4 +323,9 @@ fun Pairing.toJson() = Json.Object(
"geo" to pairingParams.geo.toJson(),
"handicap" to pairingParams.handicap.toJson(),
"placement" to placementParams.toJson()
)
).also { ret ->
if (this is MacMahon) {
ret["mmFloor"] = mmFloor
ret["mmBar"] = mmBar
}
}

View File

@@ -29,6 +29,7 @@ sealed class BaseSolver(
companion object {
val rand = Random(/* seed from properties - TODO */)
val DEBUG_EXPORT_WEIGHT = true
var byePlayers: MutableList<Pairable> = mutableListOf()
}
open fun openGothaWeight(p1: Pairable, p2: Pairable) =
@@ -68,6 +69,7 @@ sealed class BaseSolver(
var byePlayerIndex = 0
for (p in nameSortedPairables){
weightForBye = p.rank + 2*p.main
if (p in byePlayers) weightForBye += 1000
if (weightForBye <= minWeight){
minWeight = weightForBye
chosenByePlayer = p
@@ -75,6 +77,7 @@ sealed class BaseSolver(
println("choose Bye: " + p.nameSeed() + " " + weightForBye)
}
println("Bye player : " + chosenByePlayer.nameSeed())
byePlayers.add(chosenByePlayer)
nameSortedPairables.remove(chosenByePlayer)
}
@@ -83,8 +86,8 @@ sealed class BaseSolver(
for (j in i + 1 until nameSortedPairables.size) {
val p = nameSortedPairables[i]
val q = nameSortedPairables[j]
weight(p, q).let { if (it != Double.NaN) builder.addEdge(p, q, it) }
weight(q, p).let { if (it != Double.NaN) builder.addEdge(q, p, it) }
weight(p, q).let { if (it != Double.NaN) builder.addEdge(p, q, it/1e6) }
weight(q, p).let { if (it != Double.NaN) builder.addEdge(q, p, it/1e6) }
if (DEBUG_EXPORT_WEIGHT)
{
File(WEIGHTS_FILE).appendText("Player1Name="+p.nameSeed()+"\n")
@@ -116,11 +119,16 @@ sealed class BaseSolver(
if (chosenByePlayer != ByePlayer) sorted.add(listOf(chosenByePlayer, ByePlayer))
println(sorted.size)*/
val result = sorted.flatMap { games(white = it[0], black = it[1]) }
var result = sorted.flatMap { games(white = it[0], black = it[1]) }
// add game for ByePlayer
if (chosenByePlayer != ByePlayer) result += Game(id = Store.nextGameId, white = ByePlayer.id, black = chosenByePlayer.id, result = Game.Result.fromSymbol('b'))
if (DEBUG_EXPORT_WEIGHT) {
println("DUDD debug")
println(nameSortedPairables[2].nameSeed() + " " + nameSortedPairables[6].nameSeed())
pairing.main.applyDUDD(nameSortedPairables[2],nameSortedPairables[6], debug=true)
var sumOfWeights = 0.0
println("name place ID colorBal group DUDD vs name place ID colorBal group DUDD")
for (it in sorted) {
println(it[0].nameSeed() + " " + it[0].place.toString()
+ " " + it[0].id.toString()
@@ -237,7 +245,7 @@ sealed class BaseSolver(
return score
}
open fun MainCritParams.applyDUDD(p1: Pairable, p2: Pairable): Double {
open fun MainCritParams.applyDUDD(p1: Pairable, p2: Pairable, debug: Boolean =false): Double {
var score = 0.0
// TODO apply Drawn-Up/Drawn-Down if needed
@@ -282,12 +290,16 @@ sealed class BaseSolver(
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 upperSP = if (p1.group < p2.group) p2 else p1
val lowerSP = if (p1.group < p2.group) p1 else p2
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) {
@@ -313,8 +325,20 @@ sealed class BaseSolver(
} else if (scenario == 4) {
score += 4 * duddWeight
}
if(debug){
println("Names "+upperSP.nameSeed()+" "+lowerSP.nameSeed())
println("DUDD scenario, GroupDiff = "+scenario.toString()+" "+(upperSP.group-lowerSP.group).toString())
println("DUDD Upper/Lower modes = "+pairing.main.drawUpDownUpperMode.toString()+" "+pairing.main.drawUpDownLowerMode.toString())
println("u/lSPgroupsize = "+uSPgroupSize.toString()+" "+lSPgroupSize.toString())
println("u/lSPplaceingroup = "+upperSP.placeInGroup.first.toString()+" "+lowerSP.placeInGroup.first.toString())
println("score = " + score.toString())
}
}
// 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))

View File

@@ -1,12 +1,15 @@
package org.jeudego.pairgoth.pairing.solver
import org.jeudego.pairgoth.model.*
import kotlin.math.max
import kotlin.math.min
class MacMahonSolver(round: Int,
history: List<List<Game>>,
pairables: List<Pairable>,
pairingParams: PairingParams,
placementParams: PlacementParams):
placementParams: PlacementParams,
private val mmFloor: Int, private val mmBar: Int):
BaseSolver(round, history, pairables, pairingParams, placementParams) {
override val scores: Map<ID, Double> by lazy {
@@ -16,11 +19,11 @@ class MacMahonSolver(round: Int,
}
}
}
val Pairable.mmBase: Double get() = rank + 30.0 // TODO use params
val Pairable.mmBase: Double get() = min(max(rank, mmFloor), mmBar) + mmsZero
val Pairable.mms: Double get() = scores[id] ?: 0.0
// CB TODO - configurable criteria
override val mainLimits get() = Pair(0.0, 100.0) // TODO
override val mainLimits get() = Pair(mmFloor.toDouble(), 100.0) // TODO ?
override fun evalCriterion(pairable: Pairable, criterion: Criterion) = when (criterion) {
Criterion.MMS -> pairable.mms
Criterion.SOSM -> pairable.sos
@@ -30,4 +33,8 @@ class MacMahonSolver(round: Int,
else -> super.evalCriterion(pairable, criterion)
}
companion object {
const val mmsZero = 30.0
}
}

View File

@@ -246,6 +246,11 @@ class PairingTests: TestBase() {
var firstGameID: Int
var playersList = mutableListOf<Long>()
var forcedPairingList = mutableListOf<Int>(1)
var forcedPairing = mutableListOf<Json>()
var forcedGames: Json.Array
var game: Json
for (i in 0..34){
playersList.add(players.getJson(i)!!.asObject()["id"] as Long)
}
@@ -254,15 +259,31 @@ class PairingTests: TestBase() {
for (round in 1..7) {
//games = TestAPI.post("/api/tour/$id/pair/$round", Json.Array(playersList.filter{it != byePlayerList[round-1]})).asArray()
if (round in forcedPairingList){
// games must be created and then modified by PUT
games = TestAPI.post("/api/tour/$id/pair/$round", Json.Array("all")).asArray()
forcedPairing = mutableListOf<Json>()
forcedGames = Json.parse(pairingsR1)!!.asArray()
for (j in 0..forcedGames.size-1) {
game = forcedGames.getJson(j)!!.asObject()
TestAPI.put("/api/tour/$id/pair/$round", game)
}
games = TestAPI.get("/api/tour/$id/res/$round").asArray()
}
else {
//games = TestAPI.post("/api/tour/$id/pair/$round", Json.Array(playersList.filter{it != byePlayerList[round-1]})).asArray()
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/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")
}
logger.info("games for round $round: {}", games.toString())
firstGameID = (games.getJson(0)!!.asObject()["id"] as Long?)!!.toInt()
for (gameID in firstGameID..firstGameID + 15) {
for (gameID in firstGameID..firstGameID + 16) {
resp = TestAPI.put("/api/tour/$id/res/$round", Json.parse("""{"id":$gameID,"result":"b"}""")).asObject()
assertTrue(resp.getBoolean("success") == true, "expecting success")
}

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Tournament externalIPAddress="&lt;!DOCTYPE html&gt;" fullVersionNumber="3.51.05" macAddress="C8-E2-65-6F-80-E7" privateTournament="true" runningMode="SAL" saveDT="20210711010727">
<Players>
<Player agaExpirationDate="" agaId="" club="31To" country="FR" egfPin="" ffgLicence="1100278" ffgLicenceStatus="L" firstName="Andéol" grade="1K" name="Evain" participating="11111111111111111111" rank="1K" rating="1982" ratingOrigin="FFG : -68" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="0013006" ffgLicenceStatus="L" firstName="Philippe" grade="1D" name="Guerre-Genton" participating="11111111111111111111" rank="1D" rating="2080" ratingOrigin="FFG : 30" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1000229" ffgLicenceStatus="L" firstName="Ariane" grade="4D" name="Ougier" participating="11111000000000000000" rank="4D" rating="2392" ratingOrigin="FFG : 342" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31To" country="FR" egfPin="" ffgLicence="2100122" ffgLicenceStatus="C" firstName="Annabel" grade="20K" name="Fourcade" participating="11110000000000000000" rank="20K" rating="-900" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="2100112" ffgLicenceStatus="L" firstName="Benoit" grade="10K" name="Bonetti" participating="11111111111111111111" rank="10K" rating="-900" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="94Ca" country="FR" egfPin="" ffgLicence="1800050" ffgLicenceStatus="L" firstName="Bastien" grade="5K" name="Frappart" participating="11111000000000000000" rank="5K" rating="1598" ratingOrigin="FFG : -452" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75Op" country="FR" egfPin="" ffgLicence="9425017" ffgLicenceStatus="L" firstName="Simon" grade="1K" name="Rosenblatt" participating="11111000000000000000" rank="1K" rating="2022" ratingOrigin="FFG : -28" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="2000113" ffgLicenceStatus="L" firstName="Warren" grade="2K" name="Aim" participating="11111000000000000000" rank="2K" rating="1877" ratingOrigin="FFG : -173" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1900263" ffgLicenceStatus="L" firstName="Thibaut" grade="4K" name="Perrin" participating="11111111111111111111" rank="4K" rating="1652" ratingOrigin="FFG : -398" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1600034" ffgLicenceStatus="L" firstName="Benoit" grade="1K" name="Robichon" participating="11111111111111111111" rank="1K" rating="2046" ratingOrigin="FFG : -4" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1100032" ffgLicenceStatus="L" firstName="Elodie" grade="7K" name="Ronayette" participating="11111111111111111111" rank="7K" rating="1436" ratingOrigin="FFG : -614" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="92An" country="FR" egfPin="" ffgLicence="1200269" ffgLicenceStatus="L" firstName="Kevin" grade="4K" name="Houari" participating="11111111111111111111" rank="4K" rating="1674" ratingOrigin="FFG : -376" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75OB" country="FR" egfPin="" ffgLicence="9625036" ffgLicenceStatus="L" firstName="Daniel" grade="7K" name="Stockholm" participating="11100000000000000000" rank="7K" rating="1391" ratingOrigin="FFG : -659" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="1800152" ffgLicenceStatus="L" firstName="Tâm_Loup" grade="6K" name="le" participating="11111111111111111111" rank="6K" rating="1492" ratingOrigin="FFG : -558" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="1600070" ffgLicenceStatus="L" firstName="Abdallah" grade="2D" name="Mezouar" participating="11111111111111111111" rank="2D" rating="2198" ratingOrigin="FFG : 148" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="0900460" ffgLicenceStatus="L" firstName="Florent" grade="3D" name="Rioland" participating="11111000000000000000" rank="3D" rating="2342" ratingOrigin="FFG : 292" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="1800162" ffgLicenceStatus="L" firstName="Lubin" grade="1K" name="Wilhelm" participating="11111000000000000000" rank="1K" rating="2045" ratingOrigin="FFG : -5" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="92An" country="FR" egfPin="" ffgLicence="1000230" ffgLicenceStatus="L" firstName="Guillaume" grade="4D" name="Ougier" participating="11111111111111111111" rank="4D" rating="2418" ratingOrigin="FFG : 368" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="76Ha" country="FR" egfPin="" ffgLicence="2100074" ffgLicenceStatus="C" firstName="Anaïs" grade="20K" name="Wargny" participating="11111000000000000000" rank="20K" rating="-900" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="1700199" ffgLicenceStatus="L" firstName="Sylvie" grade="22K" name="Goossens" participating="11111000000000000000" rank="22K" rating="-101" ratingOrigin="FFG : -2151" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="2100126" ffgLicenceStatus="L" firstName="Louis" grade="10K" name="Vieille" participating="11111111111111111111" rank="10K" rating="-900" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75OB" country="FR" egfPin="" ffgLicence="2100058" ffgLicenceStatus="L" firstName="Rose-Marie" grade="8K" name="Bouisset" participating="11100000000000000000" rank="8K" rating="1280" ratingOrigin="FFG : -770" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="34Mo" country="FR" egfPin="" ffgLicence="2100033" ffgLicenceStatus="L" firstName="Hugo" grade="11K" name="Johnson" participating="11111111111111111111" rank="11K" rating="1028" ratingOrigin="FFG : -1022" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="66Pe" country="FR" egfPin="" ffgLicence="0473000" ffgLicenceStatus="L" firstName="Arnaud" grade="1K" name="Beltran" participating="11111111111111111111" rank="1K" rating="1989" ratingOrigin="FFG : -61" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="42Se" country="FR" egfPin="" ffgLicence="8590600" ffgLicenceStatus="L" firstName="Jean-Paul" grade="2K" name="Gaschignard" participating="11111111111111111111" rank="2K" rating="1925" ratingOrigin="FFG : -125" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="00St" country="FR" egfPin="" ffgLicence="1900244" ffgLicenceStatus="L" firstName="Gregoire" grade="3K" name="Thomazeau" participating="11111111111111111111" rank="3K" rating="1774" ratingOrigin="FFG : -276" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="91Or" country="FR" egfPin="" ffgLicence="1800220" ffgLicenceStatus="L" firstName="Etienne" grade="1K" name="Perroux" participating="11111111111111111111" rank="1K" rating="1978" ratingOrigin="FFG : -72" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="00St" country="FR" egfPin="" ffgLicence="2100119" ffgLicenceStatus="L" firstName="Jonathan" grade="6K" name="Pittonet" participating="11111000000000000000" rank="6K" rating="-900" ratingOrigin="FFG : -9999" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="10Tr" country="FR" egfPin="" ffgLicence="1800226" ffgLicenceStatus="L" firstName="Oscar" grade="4K" name="Yung" participating="11111111111111111111" rank="4K" rating="1689" ratingOrigin="FFG : -361" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="06Ni" country="FR" egfPin="" ffgLicence="1900160" ffgLicenceStatus="L" firstName="Nicolas" grade="13K" name="Lidureau" participating="11111111111111111111" rank="13K" rating="777" ratingOrigin="FFG : -1273" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="06Ni" country="FR" egfPin="" ffgLicence="2000223" ffgLicenceStatus="L" firstName="Andrea" grade="24K" name="Lidureau" participating="11111111111111111111" rank="24K" rating="-298" ratingOrigin="FFG : -2348" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="9177001" ffgLicenceStatus="L" firstName="Olivier" grade="2D" name="Clergue" participating="11111111111111111111" rank="2D" rating="2158" ratingOrigin="FFG : 108" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75Ju" country="FR" egfPin="" ffgLicence="1500138" ffgLicenceStatus="L" firstName="Abel" grade="9K" name="Mir" participating="11111111111111111111" rank="9K" rating="1174" ratingOrigin="FFG : -876" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="" ffgLicenceStatus="-" firstName="Jean-Romain" grade="8K" name="Grange-Praderas" participating="11111000000000000000" rank="8K" rating="1250" ratingOrigin="MAN" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="44Na" country="FR" egfPin="" ffgLicence="0437002" ffgLicenceStatus="L" firstName="Brigitte" grade="12K" name="Doisneau" participating="11111000000000000000" rank="12K" rating="883" ratingOrigin="FFG : -1167" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1300156" ffgLicenceStatus="L" firstName="Elian" grade="1D" name="Mangin" participating="11111111111111111111" rank="1D" rating="2118" ratingOrigin="FFG : 68" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="0514106" ffgLicenceStatus="L" firstName="Fabien" grade="4D" name="Lips" participating="11111111111111111111" rank="4D" rating="2408" ratingOrigin="FFG : 358" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="42Se" country="FR" egfPin="" ffgLicence="0700382" ffgLicenceStatus="L" firstName="Léo" grade="1D" name="Battin" participating="11111000000000000000" rank="1D" rating="2097" ratingOrigin="FFG : 47" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="73Ch" country="FR" egfPin="" ffgLicence="0414403" ffgLicenceStatus="L" firstName="Gérald" grade="4K" name="Garlatti" participating="11111000000000000000" rank="4K" rating="1745" ratingOrigin="FFG : -305" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="84Av" country="FR" egfPin="" ffgLicence="1500265" ffgLicenceStatus="L" firstName="Antonin" grade="15K" name="Teissier" participating="11111000000000000000" rank="15K" rating="605" ratingOrigin="FFG : -1445" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="49An" country="FR" egfPin="" ffgLicence="1800102" ffgLicenceStatus="L" firstName="Theo" grade="2D" name="Lemoine" participating="11111111100000000000" rank="2D" rating="2172" ratingOrigin="FFG : 122" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="59Li" country="FR" egfPin="" ffgLicence="1900260" ffgLicenceStatus="L" firstName="Raphaël" grade="11K" name="Robert" participating="11111111100000000000" rank="11K" rating="1008" ratingOrigin="FFG : -1042" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="30LV" country="FR" egfPin="" ffgLicence="1900261" ffgLicenceStatus="-" firstName="Bruno" grade="10K" name="Martin-Vallas" participating="11111000000000000000" rank="10K" rating="1050" ratingOrigin="FFG : -1000" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="9777001" ffgLicenceStatus="-" firstName="Christian" grade="4K" name="Chauvin" participating="11111100000000000000" rank="4K" rating="1650" ratingOrigin="FFG : -400" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="9737213" ffgLicenceStatus="L" firstName="Alain" grade="4K" name="Papazoglou" participating="11100000000000000000" rank="4K" rating="1704" ratingOrigin="FFG : -346" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="34Mo" country="FR" egfPin="" ffgLicence="1000483" ffgLicenceStatus="L" firstName="Sylvain" grade="3K" name="Col" participating="11111000000000000000" rank="3K" rating="1796" ratingOrigin="FFG : -254" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="0700101" ffgLicenceStatus="L" firstName="Jean-Yves" grade="7K" name="Papazoglou" participating="11100000000000000000" rank="7K" rating="1356" ratingOrigin="FFG : -694" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="21Di" country="FR" egfPin="" ffgLicence="9183002" ffgLicenceStatus="L" firstName="Henri" grade="1D" name="Gauthier" participating="11111000000000000000" rank="1D" rating="2094" ratingOrigin="FFG : 44" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="1700336" ffgLicenceStatus="L" firstName="Lucien" grade="2K" name="Radal" participating="11111000000000000000" rank="2K" rating="1878" ratingOrigin="FFG : -172" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38GJ" country="FR" egfPin="" ffgLicence="2000028" ffgLicenceStatus="L" firstName="Léonard" grade="12K" name="Paret" participating="11111111111111111111" rank="12K" rating="910" ratingOrigin="FFG : -1140" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="1300253" ffgLicenceStatus="L" firstName="Florent" grade="7K" name="Saint-Paul" participating="11111000000000000000" rank="7K" rating="1410" ratingOrigin="FFG : -640" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="1500206" ffgLicenceStatus="L" firstName="Mikaël" grade="6K" name="Goffard" participating="11111111111111111111" rank="6K" rating="1490" ratingOrigin="FFG : -560" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="42Se" country="FR" egfPin="" ffgLicence="1500013" ffgLicenceStatus="L" firstName="Thomas" grade="12K" name="Bisaccia" participating="11111000000000000000" rank="12K" rating="918" ratingOrigin="FFG : -1132" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="13Ma" country="FR" egfPin="" ffgLicence="1700001" ffgLicenceStatus="-" firstName="Antoine" grade="11K" name="Willenbucher" participating="11111111111111111111" rank="11K" rating="950" ratingOrigin="FFG : -1100" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="92An" country="FR" egfPin="" ffgLicence="1700074" ffgLicenceStatus="L" firstName="Gaultier" grade="4K" name="Bernard" participating="11111111111111111111" rank="4K" rating="1710" ratingOrigin="FFG : -340" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="2100063" ffgLicenceStatus="L" firstName="Baptiste" grade="6K" name="Fiorina" participating="11111111111111111111" rank="6K" rating="1474" ratingOrigin="FFG : -576" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31To" country="FR" egfPin="" ffgLicence="1800214" ffgLicenceStatus="L" firstName="Octave" grade="12K" name="Hautefeuille" participating="11111000000000000000" rank="12K" rating="868" ratingOrigin="FFG : -1182" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="77ML" country="FR" egfPin="" ffgLicence="1900164" ffgLicenceStatus="L" firstName="Adam" grade="28K" name="Bakri" participating="11111000000000000000" rank="28K" rating="-738" ratingOrigin="FFG : -2788" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="64Pa" country="FR" egfPin="" ffgLicence="1100109" ffgLicenceStatus="L" firstName="Siméon" grade="3D" name="Girousse" participating="11111000000000000000" rank="3D" rating="2273" ratingOrigin="FFG : 223" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="0614107" ffgLicenceStatus="L" firstName="Denis" grade="3D" name="Kuperberg" participating="11111111000000000000" rank="3D" rating="2250" ratingOrigin="FFG : 200" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="75Al" country="FR" egfPin="" ffgLicence="1800175" ffgLicenceStatus="L" firstName="Sophie" grade="8K" name="Lebas_de_Saint_Martin" participating="11111111111111111111" rank="8K" rating="1302" ratingOrigin="FFG : -748" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="1200092" ffgLicenceStatus="L" firstName="Christele" grade="13K" name="Derrien" participating="11111111111111111111" rank="13K" rating="835" ratingOrigin="FFG : -1215" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="91Or" country="FR" egfPin="" ffgLicence="0426802" ffgLicenceStatus="L" firstName="Stéphan" grade="3D" name="Kunne" participating="11111111111111111111" rank="3D" rating="2320" ratingOrigin="FFG : 270" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="69Ly" country="FR" egfPin="" ffgLicence="1700097" ffgLicenceStatus="L" firstName="Gilles" grade="17K" name="Forissier" participating="11111111111111111111" rank="17K" rating="402" ratingOrigin="FFG : -1648" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="92Le" country="FR" egfPin="" ffgLicence="0424601" ffgLicenceStatus="L" firstName="Sylvain" grade="3K" name="Ravera" participating="11111000000000000000" rank="3K" rating="1761" ratingOrigin="FFG : -289" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31To" country="FR" egfPin="" ffgLicence="1500255" ffgLicenceStatus="L" firstName="Siméon" grade="7K" name="Grosdoy" participating="11111000000000000000" rank="7K" rating="1375" ratingOrigin="FFG : -675" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="25Be" country="FR" egfPin="" ffgLicence="2000239" ffgLicenceStatus="L" firstName="Raphaël" grade="4K" name="Valot" participating="11111000000000000000" rank="4K" rating="1718" ratingOrigin="FFG : -332" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="34Mo" country="FR" egfPin="" ffgLicence="0677401" ffgLicenceStatus="L" firstName="Patrice" grade="1K" name="Barcelo" participating="11111000000000000000" rank="1K" rating="1979" ratingOrigin="FFG : -71" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="00St" country="FR" egfPin="" ffgLicence="1700134" ffgLicenceStatus="L" firstName="Christophe" grade="7K" name="Levointurier" participating="11111111111111111111" rank="7K" rating="1365" ratingOrigin="FFG : -685" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="92An" country="FR" egfPin="" ffgLicence="9333003" ffgLicenceStatus="L" firstName="Jean-François" grade="3K" name="Bocquet" participating="11111111111111111111" rank="3K" rating="1820" ratingOrigin="FFG : -230" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="63Ce" country="FR" egfPin="" ffgLicence="" ffgLicenceStatus="" firstName="Soufiane" grade="13K" name="Gzhal" participating="11111111111111111111" rank="13K" rating="750" ratingOrigin="MAN" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="84Av" country="FR" egfPin="" ffgLicence="1500264" ffgLicenceStatus="L" firstName="Samuel" grade="4D" name="Teissier" participating="11111000000000000000" rank="4D" rating="2351" ratingOrigin="FFG : 301" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31To" country="FR" egfPin="" ffgLicence="1000349" ffgLicenceStatus="C" firstName="Cyriel" grade="11K" name="Paris" participating="11110000000000000000" rank="11K" rating="950" ratingOrigin="FFG : -1100" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="38Gr" country="FR" egfPin="" ffgLicence="0682002" ffgLicenceStatus="-" firstName="Frédéric" grade="1D" name="Streicher" participating="11111111111111111111" rank="1D" rating="2050" ratingOrigin="FFG : 0" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="31Ba" country="FR" egfPin="" ffgLicence="8210000" ffgLicenceStatus="L" firstName="Denis" grade="7K" name="Puaud" participating="11111111111111111111" rank="7K" rating="1360" ratingOrigin="FFG : -690" registeringStatus="FIN" smmsCorrection="0"/>
<Player agaExpirationDate="" agaId="" club="35Re" country="FR" egfPin="" ffgLicence="2000123" ffgLicenceStatus="L" firstName="Benjamin" grade="5K" name="Loizance" participating="11111000000000000000" rank="5K" rating="1603" ratingOrigin="FFG : -447" registeringStatus="FIN" smmsCorrection="0"/>
</Players>
<Games/>
<TournamentParameterSet>
<GeneralParameterSet bInternetGame="false" basicTime="60" beginDate="2021-07-10" canByoYomiTime="300" complementaryTimeSystem="STDBYOYOMI" director="Claude brisson" endDate="2021-07-24" fischerTime="10" genCountNotPlayedGamesAsHalfPoint="true" genMMBar="1D" genMMFloor="20K" genMMS2ValueAbsent="1" genMMS2ValueBye="2" genMMZero="30K" genNBW2ValueAbsent="1" genNBW2ValueBye="2" genRoundDownNBWMMS="true" komi="7.5" location="Montcabrier" name="stage ffg" nbMovesCanTime="15" numberOfBZHGroups="1" numberOfCategories="1" numberOfRounds="10" shortName="stage-v3" size="19" stdByoYomiTime="30"/>
<HandicapParameterSet hdBase="MMS" hdCeiling="9" hdCorrection="1" hdNoHdRankThreshold="1D"/>
<PlacementParameterSet>
<PlacementCriteria>
<PlacementCriterion name="MMS" number="1"/>
<PlacementCriterion name="SOSM" number="2"/>
<PlacementCriterion name="SOSOSM" 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="NULL" paiMaAvoidMixingCategories="0" paiMaCompensateDUDD="true" paiMaDUDDLowerMode="MID" paiMaDUDDUpperMode="MID" paiMaDUDDWeight="100000000" paiMaLastRoundForSeedSystem1="2" paiMaMaximizeSeeding="5000000" paiMaMinimizeScoreDifference="100000000000" paiMaSeedSystem1="SPLITANDRANDOM" paiMaSeedSystem2="SPLITANDSLIP" paiSeAvoidSameGeo="100000000000" paiSeBarThresholdActive="true" paiSeDefSecCrit="100000000000" paiSeMinimizeHandicap="0" paiSeNbWinsThresholdActive="false" paiSePreferMMSDiffRatherThanSameClub="3" paiSePreferMMSDiffRatherThanSameCountry="1" paiSeRankThreshold="1D" paiStandardNX1Factor="0.5"/>
<DPParameterSet displayClCol="true" displayCoCol="true" displayIndGamesInMatches="true" displayNPPlayers="false" displayNumCol="true" displayPlCol="true" gameFormat="full" playerSortType="name" showByePlayer="true" showNotFinallyRegisteredPlayers="true" showNotPairedPlayers="true" showNotParticipatingPlayers="false" showPlayerClub="true" showPlayerCountry="false" showPlayerGrade="true"/>
<PublishParameterSet exportToLocalFile="true" htmlAutoScroll="false" print="true"/>
</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>

File diff suppressed because it is too large Load Diff