fix(knockout): aplicar tabla del Anexo C para el sembrado de terceros#28
Open
mverab wants to merge 1 commit into
Open
fix(knockout): aplicar tabla del Anexo C para el sembrado de terceros#28mverab wants to merge 1 commit into
mverab wants to merge 1 commit into
Conversation
El constructor del cuadro de octavos (assign_third_slots en
scripts/update_qualified.py) NO aplicaba la tabla de combinaciones del
Anexo C del Reglamento FIFA. Usaba un backtracking ingenuo de
satisfaccion de restricciones que encuentra UNA asignacion valida (que
respeta "no jugar contra tu propio grupo") pero NO la asignacion oficial.
Con los 8 terceros clasificados reales ({B,D,E,F,I,J,K,L}) el backtracking
producia un emparejamiento incorrecto. Segun el Anexo C el emparejamiento
correcto es:
1A(MEX) vs 3E(ECU) -> M79
1B(SUI) vs 3J(ALG) -> M85 (antes erroneo: SWE)
1D(USA) vs 3B(BIH) -> M81 (antes erroneo: ALG)
1E(GER) vs 3D(PAR) -> M74 (antes erroneo: BIH)
1G(BEL) vs 3I(SEN) -> M82
1I(FRA) vs 3F(SWE) -> M77 (antes erroneo: PAR)
1K(COL) vs 3L(GHA) -> M87
1L(ENG) vs 3K(COD) -> M80
Es una rotacion cerrada de 4 terceros sobre los slots
M74 B->D, M77 D->F, M85 F->J, M81 J->B.
Impacto real: M74 ya se jugo (GER-PAR, PAR avanzo). Como reconcile une
resultados con partidos por par de equipos {GER,PAR}, la lectura erronea
del slot {GER,BIH} no coincidia y el resultado quedaba con match_id null.
Cambios:
- Nuevo data/annex_c_third_place.json: 495 combinaciones del Anexo C
(parseadas de la tabla oficial), indexadas por las 8 letras de grupo
ordenadas -> {etiqueta_slot: letra_grupo}.
- assign_third_slots reescrito: intenta primero la tabla del Anexo C
(_assign_from_annex_c). Si la combinacion no existe o el cuadro no trae
etiquetas de ganador reales (1A..1L), cae al backtracking previo
(_assign_third_slots_backtrack), preservando el contrato de retorno
{match_id_str: letra_grupo}.
- Regenerados data/tournament.json y docs/data/*.json (byte-coherentes):
bracket de octavos ahora M74=GER/PAR, M77=FRA/SWE, M81=USA/BIH,
M85=SUI/ALG.
- Reconcile vuelve a mapear GER-PAR a M74 con la orientacion correcta
(match_id null -> 74, anadido round round_of_32).
- Nuevos tests (tests/test_annex_c.py, 9 casos): el archivo tiene 495
combinaciones, todas son biyecciones validas, la fila real coincide,
assign_third_slots sobre el cuadro real da {74:D,77:F,79:E,80:K,81:B,
82:I,85:J,87:L}, GER enfrenta al grupo D (no B), y GER-PAR reconcilia a
match_id 74. 67 tests en verde.
No se modifico ninguna prediccion (predictions/pre-tournament/*.json
intactas).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
El constructor del cuadro de octavos (
assign_third_slotsenscripts/update_qualified.py) no aplicaba la tabla de combinaciones del Anexo C del Reglamento de la FIFA. En su lugar usaba un backtracking ingenuo de satisfacción de restricciones que encuentra una asignación válida (respeta "ningún tercero juega contra un primero de su propio grupo"), pero no la asignación oficial.Con los 8 terceros clasificados reales — grupos {B, D, E, F, I, J, K, L} — el backtracking producía un emparejamiento incorrecto.
Emparejamiento correcto (Anexo C)
Los 4 errores forman una rotación cerrada de terceros sobre los slots: M74 B→D, M77 D→F, M85 F→J, M81 J→B.
Impacto real
M74 ya se jugó (GER–PAR, con Paraguay avanzando). Como
reconcileune resultados con partidos por par de equipos{GER, PAR}(nunca por sede/fecha), la lectura errónea del slot{GER, BIH}no coincidía y el resultado quedaba atascado conmatch_id: null.Cambios
data/annex_c_third_place.json: las 495 combinaciones del Anexo C (parseadas de la tabla oficial), indexadas por las 8 letras de grupo ordenadas →{etiqueta_slot: letra_grupo}.assign_third_slotsreescrito: primero intenta la tabla del Anexo C (_assign_from_annex_c). Si la combinación no existe o el cuadro no trae etiquetas reales de ganador (1A..1L), cae al backtracking previo (_assign_third_slots_backtrack), preservando el contrato de retorno{match_id_str: letra_grupo}que usaresolve_slot.data/tournament.jsonydocs/data/*.json(byte-coherentes entredata/ydocs/data/): el cuadro de octavos ahora muestra M74=GER/PAR, M77=FRA/SWE, M81=USA/BIH, M85=SUI/ALG.match_idnull → 74, añadidoround: "round_of_32").tests/test_annex_c.py, 9 casos): el archivo tiene 495 combinaciones; todas son biyecciones válidas; la fila real coincide con el emparejamiento esperado;assign_third_slotssobre el cuadro real da{74:D, 77:F, 79:E, 80:K, 81:B, 82:I, 85:J, 87:L}; GER enfrenta al grupo D (no B); y GER–PAR reconcilia amatch_id 74.Verificación
predictions/pre-tournament/*.jsonintactas (regla inviolable respetada).docs/data/*.jsonbyte-coherentes condata/.