Programma: gafs - Finali di scacchi Versione: 1.42 - Dicembre 2006 Autore: Guido Antonelli - Email:rigel_g@iol.it Il programma gafs gestisce tutte le possibili funzioni riguardanti i finali di scacchi. Poiche' tali funzioni sono numerose e complesse, gafs impone che nel- la linea di comando la prima opzione che segue il nome dell'archivio eseguibile determini la tipologia della funzione richiesta e stabilisca il significato delle successive opzioni ed il formato degli altri parametri. Le opzioni successive alla prima possono presentarsi in qualsiasi ordine. ISTRUZIONI D'USO Menu' delle prime opzioni valide: -b - generazione delle tabelle compatte da quelle standard -e - esecuzione manuale simulata di un finale -g - generazione delle tabelle dei finali -i - informazioni relative ad una data disposizione dei pezzi -l - lista delle posizioni di un assegnato finale selezionate in base al risultato -m - valutazione memoria richiesta per le tabelle dei finali -t - lista delle posizioni di un assegnato finale selezionate in base ai risultati ottenuti per mossa al Bianco e mossa al Nero -v - verifica di congruenza delle tabelle Per avere i dettagli sulle opzioni specifiche di ogni funzione battere gafs seguito da una delle precedenti opzioni. Esempio: gafs -g (da' informazioni sulla generazione delle tabelle) NOTA Questo menu' si ottiene battendo semplicemente: gafs Menu' opzioni valide per linea di comando: gafs -b ...: -a - specifica il direttorio, e relativo percorso, dove verranno scritte le tabelle a 2 bit da generare, se diverso da quello corrente -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle a 8 o piu' bit da utilizzarsi, se diverso da quello corrente -l - lingua usata per scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se -r - forza il ricalcolo di una tabella gia' esistente -R - genera le tabelle a 2 bit del finale e di tutti i fi- nali che si ottengono da per cattura e/o promozione - nome del finale da generare Il nome di un finale e' formato dalla sequenza di caratteri minuscoli indi- canti IN LINGUA ITALIANA i pezzi presenti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri Le tabelle compatte contengono solo 2 bit (vittoria, patta, sconfitta, posi- zione illegale) per ciascuna posizione dei pezzi e hanno i seguenti nomi: .tcb = finale con mossa al Bianco .tcn = finale con mossa al Nero .tcf = finale con mossa al Nero Le tabelle a 2 bit per un dato finale vengono prodotte solamente se le cor- rispondenti tabelle a 8 o piu' bit di quel finale sono state in precedenza generate. Questo si applica anche al caso in cui si utilizzi l'opzione -R. I tempi di calcolo e la memoria RAM utilizzata dal programma sono minimi in quanto sono richieste semplicemente operazioni di lettura e scrittura su disco, che sono eseguite trattando blocchi di alcuni Mbyte per volta. Esempio: gafs -b -d tab8bit -a tab2bit -R rprp (partendo dalle tabelle standard presenti in ./tab8bit, il comando produce nel direttorio ./tab2bit la tabella rprp e tutte quelle ottenibili da rprp per cattura e/o promozione). Menu' opzioni valide per linea di comando: gafs -e ...: -b - mossa iniziale al Bianco (omissione) -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle necessarie al finale richiesto -l - lingua usata per designare i pezzi e scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se -n - mossa iniziale al Nero -p - indica la presenza di pedone catturabile en passant in colonna - pezzo + colonna + riga I pezzi con le loro posizioni devono essere forniti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri e indicati con la lettera dell'alfabeto che li contraddistingue in base alla lingua selezionata. Esempi: gafs -e -d tabelle rd4 dh8 rg2 tg1 (gioca manualmente il finale di R+D contro R+T con mossa al Bianco accedendo alle tabelle dei finali contenute nel direttorio tabelle) gafs -e -d tabelle -l en -pc -n kc2 pc4 ke5 pd4 (gioca manualmente con simbologia inglese il finale di R+P contro R+P con mossa al Nero con il Pedone Bianco in colonna c catturabile en passant accedendo alle tabelle dei finali contenute nel direttorio tabelle) Sottomenu' interno valido durante il gioco manuale: ? / a[iuto] = questo menu' f[ine] = fine del programma l[ista] = lista le mosse legali con i rispettivi risultati m[ostra] = mostra la scacchiera sullo schermo - = ritorna indietro di semimosse (n > 0) s[alva] [file] = salva su file la sequenza delle mosse (omissione: visualizza la sequenza su schermo) = mossa da eseguire in notazione numerica Es.: Rc4-d4 Ta1-a8+ Pc7-c8D+ Da2xa4 Legenda risultati: v = vittoria in mosse p = patta s = sconfitta in mosse Menu' opzioni valide per linea di comando: gafs -g ...: -1 - utilizza l'algoritmo a mossa diretta (lento ma sicuro) -2 - utilizza l'algoritmo a mossa mista (intermedio per velocita' e sicurezza, scelto in caso di omissione) -3 - utilizza l'algoritmo a mossa retrograda (piu' veloce, ma meno sicuro) -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle esistenti o da generare, se diverso da quello corrente -i - specifica il numero di secondi dell'intervallo di tempo fisico tra due salvataggi successivi su disco delle tabelle normali -l - lingua usata per scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se -m - indica la memoria in Mbyte a disposizione del programma -r - forza il ricalcolo di una tabella normale gia' esistente -v - verifica la legalita' delle posizioni mediante mossa retrograda - nome del finale da generare o utilizzare Il nome di un finale e' formato dalla sequenza di caratteri minuscoli indican- ti IN LINGUA ITALIANA i pezzi presenti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri Le tabelle normali contengono 1 byte per ciascuna posizione dei pezzi al quale si aggiunge 1 o piu' bit di riporto per posizione. I bit di riporto si trovano al fondo degli archivi del finale. Le tabelle normali generate hanno i seguenti nomi: .tbb = finale con mossa al Bianco .tbn = finale con mossa al Nero .stf = informazioni statistiche (ASCII) sul finale Le opzioni -1, -2 e -3 sono tra loro mutuamente esclusive. L'opzione -i riguarda il salvataggio intermedio delle tabelle normali du- rante la fase di calcolo permettendone la successiva continuazione in caso di interruzione. Se l'opzione viene omessa viene assunto -i 3600, che e' anche il valore minimo ammesso. Per proseguire il calcolo interrotto e' sufficiente ripetere il comando inizia- le di generazione, in quanto il programma controlla automaticamente la presen- za di particolari archivi ausiliari e determina automaticamente la situazione attuale del calcolo. L'OPZIONE -m E' OBBLIGATORIA. E' fortemente consigliabile indicare solo la MEMORIA FISICA (per i dettagli vedere piu' avanti). L'opzione -v rende piu' rigoroso il controllo di legalita' delle posizioni, ma ne aumenta i tempi di calcolo; in compenso la successiva generazione delle ta- belle risulta un po' piu' veloce. Per motivi tecnici l'opzione -v non puo' essere usata con l'algoritmo a mossa retrograda. Esempi: gafs -g -d tabelle -i 7200 -m 210 rtard (genera nel direttorio ./tabelle le 2 tabelle del finale R+T+A contro R+D e tutte le eventuali tabelle derivate per cattura o promozione, se non gia' presenti, salvando il risultato alla fine del ciclo di elabo- razione in corso ogni 2 ore di tempo fisico dall'inizio o dal prece- dente salvataggio; la memoria assegnata e' pari a 210 Mb) gafs -g -d tabelle -i 7200 -m 210 rtard (comando identico al precedente: se pero' il calcolo del finale rtard era stato gia' iniziato ed interrotto dopo almeno un salvataggio, que- sto comando fa ripartire il calcolo a partire dall'ultimo salvataggio) NOTE La generazione di una tabella normale (8 o piu' bit per posizione) avviene so- lamente se la tabella non è stata generata in precedenza, a meno che il rical- colo non venga forzato mediante l'opzione -r. In ogni caso verranno generate automaticamente anche le tabelle normali ottenibili da essa per cattura e/o promozione, che non fossero state già generate in precedenza, e questo processo viene applicato ricorsivamente ad ogni tabella da generare. Durante il calcolo delle tabelle, in funzione anche della memoria RAM disponi- bile e dell'algoritmo usato, sono presenti parecchi archivi ausiliari di tipo .??? che vengono distrutti solo alla fine dell'elaborazione. NON MODIFICARE MAI TALI ARCHIVI. Qualora il calcolo fosse stato interrotto, il comando di continuazione deve ri- guardare specificamente la sola tabella non terminata. Menu' opzioni valide per linea di comando: gafs -i ...: -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle necessarie al finale specificato -l - lingua usata per designare i pezzi e scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se - pezzo + colonna + riga I pezzi con le loro posizioni devono essere forniti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri e indicati con la lettera dell'alfabeto che li contraddistingue in base alla lingua selezionata. Esempio: gafs -i -d tabelle rd4 dh8 rg2 tg1 (mostra i risultati migliori e quelli ottenuti da tutte le mosse le- gali della posizione indicata sia con mossa al Bianco che con mossa al Nero; se il finale contiene Pedoni indica pure i risultati che si ottengono tenendo conto di tutte le possibili catture en passant; le tabelle dei finali sono ricercate nel direttorio ./tabelle) Menu' opzioni valide per linea di comando: gafs -l ...: -c - stampa compressa senza numerazione, sigle pezzi e separatori -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle necessarie al finale specificato -f - stampa in formato FEN (vedi nota di commento) -l - lingua usata per designare i pezzi e scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se - - risultato . - nome della tabella a 8 o piu' bit da utilizzare con suffisso - archivio in uscita (omissione = schermo) Valori ammessi per : -p - patte (tutte) -p0 - patte per stallo -s - sconfitte -s - sconfitta in n mosse (n >= 0) -t - tutte le posizioni legali -T - tutte le posizioni legali ed illegali -v - vittoria -v - vittoria in n mosse (n >= 1) L'opzione -f produce una stampa in formato FEN standard, ma in combinazione con l'opzione -c produce una stampa in formato FEN piu' compatta in cui sono elimi- nati: - le eventuali cifre '8' presenti nella stringa - il numero delle caselle vuote alla fine di ogni riga - le righe successive all'ultimo pezzo presente sulla scacchiera. L'eventuale opzione -l produce il risultato con i simboli dei pezzi nella lingua selezionata. L'opzione -t e -T sono incompatibili con le altre, escluse la specifica di di- rettorio e/o di lingua. Il nome della tabella e' costituito da una sequenza continua di caratteri minu- scoli indicanti in lingua italiana il Re bianco e relativi Pezzi/Pedoni bianchi seguiti dal Re nero e relativi Pezzi/Pedoni neri, seguita da punto e suffisso. Il suffisso e' tbb per mossa al Bianco, e tbn per mossa al Nero. Il nome della tabella DEVE PRECEDERE l'eventuale archivio in uscita. Esempio: gafs -l -d tabelle -v9 rdr.tbb rdr.txt (scrive sull'archivio rdr.txt la lista di tutte le posizioni del fina- le R+D contro R con mossa al Bianco in cui il risultato e' una vitto- ria del Bianco in 9 mosse; le tabelle dei finali sono ricercate nel direttorio ./tabelle) NOTA I file creabili con questo comando applicati a finali a 5 o piu' pezzi potreb- bero avere occupazioni dell'ordine dei Gbyte se non si mettono criteri limita- tivi. L'opzione -c e' prevista allo scopo di ridurre lo spazio occupato nel caso di liste molto lunghe. Menu' opzioni valide per linea di comando: gafs -m ...: -1 - specifica l'uso dell'algoritmo a mossa diretta -2 - specifica l'uso dell'algoritmo a mossa mista -3 - specifica l'uso dell'algoritmo a mossa retrograda (omissione) -b - calcola la memoria RAM necessaria con elaborazione a blocchi -l - lingua usata per scrivere i messaggi sullo schermo. Possibili scelte per : : it (omissione), cz, dk, nl, en (inglese), ee, fi,\n" fr, de, hu, is, no, pl, pt, ro, es, se\n" -p - valutazione del numero di posizioni legali del finale -v - verifica la legalita' di una posizione mediante mossa retrograda - nome del finale a cui si applica il comando Il nome di un finale e' formato dalla sequenza di caratteri minuscoli indican- ti IN LINGUA ITALIANA i pezzi presenti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri\n Le opzioni -1, -2 e -3 sono tra loro mutuamente esclusive ed hanno effetto so- lo se associate all'opzione -b. L'opzione -v, associata all'opzione -p, rende piu' rigoroso il controllo di le- galita' delle posizioni, ma ne aumenta sensibilmente i tempi di calcolo. Esempi: gafs -m -p -v rprp (fornisce le dimensioni di memoria RAM e disco richiesta per il cal- colo del finale rprp senza divisione in blocchi, qualora tale finale venisse risolto con l'algoritmo a mossa retrograda; inoltre calcola il numero di posizioni legali utilizzando la mossa retrograda) gafs -m -2 -b rttrta (fornisce la dimensione di memoria RAM e disco richiesta utilizzando la divisione in blocchi delle tabelle qualora il finale rttrta ve- nisse risolto con l'algoritmo a mossa mista) NOTA Questo comando opera con finali fino a 8 pezzi, assumendo convenzionalmente che 1 byte rappresenti una posizione. Menu' opzioni valide per linea di comando: gafs -t ...: -c - stampa compressa senza numerazione, sigle pezzi e separatori -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle necessarie al finale specificato -f - stampa in formato FEN (vedi nota di commento) -l - lingua usata per designare i pezzi e scrivere i messaggi sullo schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se - - risultato con mossa al Bianco - - risultato con mossa al Nero - nome del finale da utilizzare - archivio in uscita (omissione = schermo) Valori ammessi per e : -p - patte (tutte) -p0 - patte per stallo -s - sconfitte -s - sconfitta in n (0 <= n < 127) mosse -v - vittoria -v - vittoria in n (0 < n < 128) mosse L'opzione -f produce una stampa in formato FEN standard, ma in combinazione con l'opzione -c produce una stampa in formato FEN piu' compatta in cui sono elimi- nati: - le eventuali cifre '8' presenti nella stringa - il numero delle caselle vuote alla fine di ogni riga - le righe successive all'ultimo pezzo presente sulla scacchiera. L'eventuale opzione -l produce il risultato con i simboli dei pezzi nella lingua selezionata. Nella riga di comando i due risultati - e - devono sempre essere forniti ed il risultato - deve comunque precedere il risultato -. Il nome di un finale e' formato dalla sequenza di caratteri minuscoli indican- ti in lingua italiana i pezzi presenti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri Il nome del finale deve precedere l'eventuale archivio in uscita. Esempio: gafs -t -d tabelle -v5 -v7 rdrd rdrd.txt (scrive sull'archivio rdrd.txt la lista di tutte le posizioni del fi- nale R+D contro R+D i cui risultati con mossa al Bianco e con mossa al Nero sono rispettivamente vittorie in 5 ed in 7 mosse; le tabelle dei finali sono ricercate nel direttorio tabelle) NOTA I file creabili con questo comando applicati a finali a 5 o piu' pezzi potrebbe- ro avere occupazioni dell'ordine dei Gbyte se non si mettono criteri limitativi. L'opzione -c e' prevista allo scopo di ridurre lo spazio occupato nel caso di liste molto lunghe. Menu' opzioni valide per linea di comando: gafs -v ...: -d - specifica il direttorio, e relativo percorso, dove si trovano le tabelle necessarie al finale specificato -l - lingua usata per scrivere i messaggi su schermo. Possibili scelte per : it (omissione), cz, dk, nl, en (inglese), ee, fi, fr, de, hu, is, no, pl, pt, ro, es, se -m - indica la memoria in Mbyte a disposizione del programma -R - verifica la correttezza della tabella specificata e delle tabelle sottostanti ottenute ricorsivamente per cattura o promozione -s - riscrive le statistiche del finale su schermo e nell'archivio di nome .stv nel direttorio specificato -x - in caso di errore esegue la correzione sulle tabelle binarie - nome del finale da verificare Il nome di un finale e' formato dalla sequenza di caratteri minuscoli indican- ti IN LINGUA ITALIANA i pezzi presenti nel seguente ordine: Re bianco Pezzi/Pedoni bianchi Re nero Pezzi/Pedoni neri L'OPZIONE -m E' OBBLIGATORIA. E' consigliabile usare solo la MEMORIA FISICA (per i dettagli vedere piu' avanti). L'opzione -s permette di rigenerare l'archivio statistico al termine del con- trollo, in quanto tale archivio, scritto di norma nella fase di generazione (in formato ASCII e con suffisso .stf), risulta talvolta errato quando l'ela- borazione di un finale sia stata interrotta e ripresa in tempi successivi. Questo tuttavia non inficia la correttezza delle tabelle binarie ottenute. Il nuovo archivio statistico viene prodotto con suffisso .vst in modo da per- metterne il confronto con quello errato. Quando si prevede che il tempo di verifica sia elevato si consiglia di usare sempre l'opzione -s. L'opzione -x ha unicamente finalità di debugging in quanto e' in grado di cor- reggere gli archivi binari sulla base dei risultati della verifica; qualche volta, ma non sempre, quest'opzione, usata ripetutamente, riesce ad ottenere una completa eliminazione degli errori, utilizzabile per ricercare l'errore di programmazione commesso. Le opzioni -s e -x sono incompatibili tra loro. Esempio: gafs -v -d tabelle -m 210 -R rtard (verifica la correttezza delle 2 tabelle del finale R+T+A contro R+D e di tutte le tabelle da essa derivate; le tabelle dei finali sono ricercate nel direttorio ./tabelle) NOTA La verifica non ha carattere assoluto, ma in generale rileva gli errori che normalmente si commettono programmando, in quanto controlla la congruenza tra i risultati di tutte le posizioni legali. OSSERVAZIONE IMPORTANTE - Si suggerisce di utilizzare unicamente la MEMORIA FISICA, che deve esse- re dichiarata quando si usano i comandi gafs -g di generazione e gafs -v di verifica, tenendo presente che il programma RICHIEDE ma NON CONTROLLA la dimensione di memoria indicata dall'utente. Si tenga presente che quando la memoria dichiarata non e' sufficiente a contenere in RAM tutte le tabelle necessarie, il programma automaticamen- te spezza le tabelle in blocchi ed utilizza la memoria su disco per la lettura e scrittura dei blocchi, simulando in tal modo una memoria virtua- le sotto controllo del programma stesso. Di conseguenza dichiarare come memoria un valore maggiore di quello reale e' del tutto sconsigliabile e puo' provocare conseguenze negative anche gra- vi non prevedibili. Con la suddivisione in blocchi l'utilizzo dei dischi magnetici cresce in ogni caso enormemente e questo puo' rappresentare un rischio di rottura per il sistema di elaborazione. Prendendo in analisi i tre metodi disponibili (opzioni -1, -2 e -3), il tempo di calcolo va diminuendo drasticamente dal primo al terzo metodo, ma con la divisione in blocchi aumenta pesantemente l'utilizzo del disco nella proporzione dei numeri 1, 2, 10. Percio' dalle mie prime esperienze con finali a 6 pezzi il secondo metodo rappresenta forse la soluzione migliore, tenuto anche conto che il terzo metodo presenta ancora alcuni problemi irrisolti. Esso e' stato tuttavia mantenuto come default, perche' se la RAM e' suffi- ciente e non viene utilizzata la suddivisione in blocchi, esso appare in- dubbiamente come il piu' veloce. RESPONSABILITA' PER QUANTO DETTO SI SOTTOLINEA CHE GUIDO ANTONELLI NON ASSUME IN NESSUN CASO ALCUNA RESPONSABILITA' PER EVENTUALI DANNI DERIVANTI DALL'USO IN GE- NERALE DEL PROGRAMMA E, IN PARTICOLARE, IN RELAZIONE AL PROBLEMA DESCRITTO AL PUNTO PRECEDENTE. ALTRE OSSERVAZIONI - Il programma contiene un controllo interno che rileva eventuali modifiche al proprio codice. A questo scopo dopo essere stato caricato in memoria, il co- dice eseguibile viene riletto dal programma stesso. Si sottolinea che sotto Unix/Linux il programma dovra' risiedere obbligatoriamente nel direttorio corrente perche' il percorso completo non viene trasmesso al programma stes- so come parametro della linea di comando. - Il programma e' stato accuratamente verificato per evitare qualsiasi danno agli archivi degli utenti eventualmente gia' presenti e al sistema in gene- rale; si suggerisce tuttavia di eseguirlo in maniera controllata con adegua- te protezioni gestite dal sistema operativo. - Per quanto mi risulta, il programma opera correttamente nella generazione delle tabelle quando il numero totale dei pezzi e' <= 5 e si dispone di un processore con almeno 2 Gb di RAM (il mio PC). Si e' da poco iniziato ad utilizzarlo con successo anche per finali a 6 pezzi di tipo semplice. Il metodo consigliato per minimizzare i tempi in questi casi e' quello rap- presentato dall'opzione -2 che rende minore il tempo complessivo, somma dei tempi di CPU e di I/O. Tuttavia, poiche' e' statisticamente certo che il programma contenga errori, potrà accadere che la generazione di determinati finali vada in errore anche dopo giorni, settimane o periodi ancora più lunghi di calcolo con la conse- guenza della perdita di tutto il lavoro svolto fino a quel momento. - I pezzi potrebbero essere indicati nelle seguenti lingue: it = italiano cz = ceco dk = danese nl = olandese en = inglese ee = estone fi = finlandese fr = francese de = tedesco hu = ungherese is = islandese no = norvegese pl = polacco pt = portoghese ro = rumeno es = spagnolo se = svedese. ma attualmente e' possibile utilizzare solo la lingua italiana ed inglese. SVILUPPI FUTURI Al momento il programma e' quasi completamente realizzato secondo le mie at- tuali idee e quindi gli sviluppi dovrebbero riguardare: - Eliminazione di eventuali errori. - Miglioramento del codice per accelerare i calcoli. - Verifica del funzionamento nel caso che il numero delle mosse superi 126 (e successivamente 252). Questo e' stato fatto per il solo caso rpprp e sembra che funzioni correttamente. - Realizzazione di un programma che generi direttamente le tabelle a 2 bit. - Trovare ... qualche idea nuova! RINGRAZIAMENTI Ringrazio fin d'ora tutti coloro che mi forniranno suggerimenti e mi segnale- ranno eventuali errori. Se avete domande, commenti od altro, scrivetemi al- l'indirizzo riportato all'inizio di questo testo. E buon divertimento! Guido