Cap. 17 - Tablas que no van en el binario por defecto
cap. 17 Finales · Opcional
Tablas que no van en el binario por defecto
El núcleo de 2012 tasa y busca. En un final de pocas piezas, esa tasación puede mentir: un rey y un peón contra rey es tabla o es gane según la oposición, y la evaluación estática no lo ve con certeza. Las bitbases (o tablebases) son un libro de finales: posiciones ya resueltas a gane, tablas o pérdida. Analogía: un tomo en la estantería. Solo se abre si se compiló con él y si el tomo está en disco.
En Mango AC ese tomo no va en el binario por defecto. Hay que definir COMPILAR_CON_EGBB. Si no, egbb.c ni se incluye y la búsqueda no sonda. No es el estilo del núcleo: es un extra. Esta entrada existe para ser honesto con el código que sí está en el árbol, no para vender finales perfectos.
De dónde sale el código
egbb.c carga una biblioteca dinámica del proyecto EGBB (sonda de hasta cinco piezas: load_egbb_5men / probe_egbb_5men). En Linux el fichero se llama egbbso.so; en Windows, egbbdll.dll. El archivo cita el motor DanaSah de Pedro Castro Elgarresta, de quien adapté la carga y la sonda. No es investigación mía de 2012 sobre tablebases: es un enchufe opcional.
El comentario en busquedad.c habla de «base de datos de finales Nalimov». La sonda concreta que enlaza es EGBB de cinco hombres. El límite interno nLimitePiezasBitBases vale 4 (dos reyes más hasta dos piezas más, en el recuento del motor). Conservador respecto a lo que la biblioteca podría dar.
Cómo se enchufa
Si se compiló con la macro, mangoac.ini entiende tres claves extra: UsarTablaFinalesNalimov, RutaEGBB, CacheEGBB (1–512 MB; por defecto 64). Al arrancar, si el flag está activo, cargaBitbases() hace dlopen (o LoadLibrary) del .so/.dll en esa ruta. Si falla, el motor sigue: imprime que no pudo cargar y juega sin tomo.
#ifdef COMPILAR_CON_EGBB
if (usar_egbb)
cargaBitbases();
#endif
Analogía: la estantería puede estar vacía. El motor no se niega a jugar. Solo no consulta el tomo.
Cuándo se pregunta durante la búsqueda
Dentro de alfabetaNegado(), y solo con la macro, si hay bitbases cargadas, si no es la raíz, y si la capa no pasa de profundidadEgbb = (profundidadActual * 2) / 3. Además se pide que la jugada anterior fuera captura o promoción (o que la capa sea menor que 3): no se sonda en cada nudo tranquilo. Si el recuento de piezas cabe en el límite, probe_bitbases traduce el tablero al convenio de EGBB (a8 = 0 en su mundo; el motor usa a1 = 0, de ahí el FLIP) y pide un entero.
Si la biblioteca responde _NOTFOUND (99999), se sigue buscando. Si responde, ese valor se ajusta un poco con la capa y el material (para no empatar un gane técnico por desidia) y se guarda en la tabla hash como EXACTO a profundidad 256: un recuerdo que no se pisa.
EGBB numera las casillas al revés que yo: allí a8 = 0, aquí a1 = 0. probe_bitbases aplica FLIP(sq) = sq ^ 0x38 (espejo de filas) a reyes y piezas antes de llamar a probe_egbb. Pasa como mucho tres piezas además de los dos reyes. Si el tablero tiene más, no entra en la sonda.
*score = probe_egbb(player, w_ksq, b_ksq,
piece[0], square[0],
piece[1], square[1],
piece[2], square[2]);
if (*score != _NOTFOUND) return 1;
Al salir, UCI y la consola llaman a cerrarBitbases() si la macro estaba definida. Sin macro, esas líneas no existen.
Qué no es
No sustituye a la evaluación del medio juego. No está en el binario que publico por defecto. No he retocado los pesos de 2012 porque existan tablebases. Quien compile con EGBB y ponga los ficheros en disco tendrá finales más limpios; quien no, tiene el mismo motor que escribí entonces.
Qué archivos leer
| Archivo | Qué hay |
|---|---|
egbb.c |
Carga egbbso.so; probe_bitbases; DanaSah / Castro |
busquedad.c |
#ifdef COMPILAR_CON_EGBB: sonda y hash EXACTO |
bitmma3.c / variables.h |
Claves ini; nLimitePiezasBitBases = 4 |
El repositorio del motor: GitHub.
Cierre
Las bitbases son un tomo opcional. Por defecto la estantería está vacía y el núcleo de 2012 se basta. Quien compile con COMPILAR_CON_EGBB enchufa EGBB de cinco hombres, con límite interno de cuatro piezas en el recuento, y la búsqueda puede dejar de tasar un final ya resuelto. Encaja con el resto de la serie así: el motor que he descrito cabe sin este tomo. El tomo, si se abre, no cambia cómo se generan las jugadas ni cómo se poda.
Con esta entrada cierra el mapa del código que quedaba por contar: memoria, orden, hacer/deshacer, SEE, libro, reloj, las dos puertas, Perft, el portero del rey, FEN y este extra. El repositorio sigue siendo el mismo.
Correo de contacto: comprasmangocomputer@gmail.com

Comentarios
Publicar un comentario