I miei errori


Questa pagina ha una gerarchia - Pagina madre:Programmazione

Home Forum Programmazione I miei errori

Questo argomento contiene 40 risposte, ha 8 partecipanti, ed è stato aggiornato da stegemma stegemma 2 settimane, 3 giorni fa.

Stai vedendo 11 articoli - dal 31 a 41 (di 41 totali)
  • Autore
    Articoli
  • #8056
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Bellino come bug 🙂
    penso anche difficile da intercettare, a meno di avere un lampo di genio che ti dica: ‘e se fosse…?’

    Io ce ne ho un’altro carino dell’altra settimana, spero di non aver cancellato i sorci sbagliati per riproporlo nella sua ‘bellezza’, mo lo cerco.

    Bye!

    LL

    #8057
    stegemma
    stegemma
    Moderatore

    Sì, a volte invece sono più semplici da trovare ma richiedono una pazienza certosina. In questa semplice posizione, stamattina sbagliava il perft 8, mentre lo faceva giusto fino al 7:

    [FEN]k1K5/p7/8/8/8/8/8/8 w[/FEN]

    Qui sono stato fortunato fortunato, perché confrontando il divide con Sharper (ottimo programma, per verificare il perft) ho potuto ridurre l’errore mossa dopo mossa, fino ad arrivare a:

    [FEN]8/pK6/8/k7/8/8/8/8 b[/FEN]

    e qui il nero gioca la stupenda a7Y5!!!

    Non l’ho ancora corretto ma così è facile, perché ti trovi in una posizione con 4 mosse legali. I bachi difficili sono quelli dell’altro esempio, dove il baco scompare se riduci la profondità muovendo.

    #8058

    marco belli
    Membro

    se non ricordo male Sharper è velocissimo e implementa il comando “divide”, ma mi pare che quando debuggavo il mio move generator sono arrivato ad una posizione in cui i risultati di sharper e vajolet non erano uguali, e alla fine vajolet aveva ragione. quando hai dubbi usa il perft di stockfish come riprova.

    #8365
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Questa è bella: guardate l’ultima mossa di neuro su fics 😀

    E’ successo perchè dopo la cattura en passant è convinto che nella casa c3 non ci sia il pedone nero, ma un suo bianco!
    Di conseguenza, dopo c4 e la ‘cattura’ dxc (ep) lui è nella possibilità di… cxb!! (cattura il cavallo nero).
    Neuro mi sorprende sempre 😀

    In pratica nella funzione per il calcolo dell’en passant ho attribuito la casa di destinazione al bianco (non ho invertito i colori).
    Adesso è ok.

    Ovviamente neuro ha poi perso la partita.

    Alla prossima castroneria!

    LL

    #8395
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ultimamente ho corretto un paio di bachi (cosa buona e giusta) e ho subito fatto dei test contro altre versioni del motore (altra cosa buona e giusta).
    Stranamente sembra che ci sia stata una regressione (brutta cosa).
    Controllo e ricontrollo, ma non riesco a trovare nulla di sbagliato nelle correzioni. Faccio dei test più numerosi e niente, sempre la stessa regressione rispetto alla versione appena precedente alle modifiche (-35 elo circa).
    In genere queste cose succedono se si perde in velocità di elaborazione e se la ricorrenza dell’errore è ininfluente. Ma non è nemmeno questo il caso.

    Vago quasi per caso nella cartella dei books e… tadaaaannn! Trovato l’arcano! L’ultima versione corretta di Neurone giocava con un libro vecchio, rispetto alle altre che avevano il libro aggiornato!
    Allineato il libro per tutti adesso l’ultima versione è sopra le altre di 3-4 punti elo circa.

    Un consiglio: non fate i miei errori; verificate sempre il libro usato per il test!

    Bye!

    LL

    #10357
    Lissandrello Luca
    Lissandrello Luca
    Moderatore

    Ci ho messo due mesiiiii! Me ne sono uscito solo adesso! 😀

    Mi spiego:
    Al recente igt ho dovuto disattivare il ponder a Neurone perchè se usato in contesti multicore ogni tanto tirava fuori una mossa a depth 1 anzicchè procedere verso depth più consoni.

    Che cos’era?
    Dovete sapere che ogni processo eredita dal processo padre una serie di informazioni e tra questi anche il parametro ini_ponder ossia il parametro che uso per capire se neuro deve usare il ponder o no.
    Io ponsavo che all’attivazione di ogni singolo processo tale parametro fosse sempre 0 invece no! In pratica i processi andavano in ponder anche dopo la ‘consegna’ della bestmove al processo padre! Conseguenze: casini su ht e dati sporchi un po’ dappertutto.

    Bug fissato, detto così sembra semplice, ma vi assicuro che trovare cause di questo tipo quando si lavora sui processi non è mica semplice. Ho dovuto fare tutti i giri all’inverso prima di capire che il problema stava a monte.

    Bye!

    LL

    #12136
    stegemma
    stegemma
    Moderatore

    Stavo verificando la portabilità dei miei sorgenti da Windows a Mac/Linux ed ho attivato il livello di Warning 4, su Visual Studio, per essere certo che il codice sia il più possibile libero da Warning. Tra le varie correzioni, ecco un baco da dilettante:

    
    	uint64_t clsBoard::BuildHash()
    	{
    		bits.boHash = 0; // zobcol;		
    		uint64_t colors[2];
    		colors[white] = IsWhite() ? bits.boFriends : bits.boEnemies;
    		colors[black] = colors[white] ^ bits.boFriends ^ bits.boEnemies;
    		uint64_t *pbits = &(bits.boPawns);
    		for (int c = 0; c < 2; c++)
    		{
    			for (int i = 0; i < 8 /* ex 6 */; i++, pbits++)
    			{
    				uint64_t k = *pbits & colors[c];
    				while (k != boEmpty)
    				{
    					uint64_t boPiece = PopFirstBit(k);
    					int idx = GetSquareIndex(boPiece);
    					bits.boHash ^= ZOB(c, i, idx);
    				}
    			}
    		}
    		return bits.boHash;
    	}
    

    Devo verificare come “impatta” sulle prestazioni del motore… ma pare che la hash generata abbia potenzialmente un valore parzialmente casuale!

    Trovato il baco? 😉

    PS:

    
    		uint64_t boFriends;
    		uint64_t boEnemies;
    		uint64_t boPawns;
    		uint64_t boKnights;
    		uint64_t boBishops;
    		uint64_t boRooks;
    		uint64_t boQueens;
    		uint64_t boKings;
    		uint64_t boCastlings;
    		uint64_t boEnpPawn;
    		uint64_t boAllPieces;
    		uint64_t boHash;
    
    #12138

    Per usare un puntatore in quel modo bisognerebbe definire i pezzi su di un array.

    #12139
    stegemma
    stegemma
    Moderatore

    Purtroppo il C++ non ha il concetto di elemento di un array con nome. Sarebbe bello poter accedere sia con boBits[2] che con boBits[pawns] o boBits.pawns e sintassi simili. Inizialmente c’era una union ma l’ho tolta perché il gcc segnala un warning, sulle union anonime. Dare un nome anche alla union, avrebbe complicato ancor di più la sintassi. C’è anche l’alternativa di definire delle “property” ma non sono portabili (devo poter compilare anche col vecchio Borland). Questa soluzione è “sporca”, perché presuppone l’allineamento degli elementi del non-array ma la sostituirò con un enum, per definire gli indici di un array di uint64_t:

    
    enum tt{ boFriends, boEnemies, boPawns, boKnights, boBishops, boRooks, boQueens, boKings, boCastlings, boEnpPawn, boAllPieces, boHash, boCount };
    uint64_t bits[boCount];
    

    Anche questa soluzione non è “pulita”, perché non c’è controllo sugli indici ma questo è accettabile, dovendo privilegiare la velocità.

    Il baco però è un altro…

    #12140

    Manca anche il tratto nel calcolo della chiave.

    #12141
    stegemma
    stegemma
    Moderatore

    Non era questo il baco che avevo visto io ma grazie per avermelo segnalato! Questo baco che mi hai fatto notare, potrebbe effettivamente fare grossi danni, soprattutto nei finali.

    Quello che avevo trovato io era più “da dilettanti”: l’inizializzazione di pbits va spostata all’interno del primo ciclo for, altrimenti dal secondo colore si prosegue oltre la fine delle bitboard.

    PS: in realtà ho verificato che il baco sul colore di chi ha la mossa non c’era, perché uso il valore “statico” calcolato sulla posizione adeguandolo agli altri parametri significativi (forse anche troppo), in questo modo:

    
    return bits.boHash ^ bits.boAllPieces ^ (bits.boEnpPawn - bits.boCastlings) ^ zobcol;
    

    zobcol sono due valori random (fissi) dipendenti dal colore.

Stai vedendo 11 articoli - dal 31 a 41 (di 41 totali)

Devi essere loggato per rispondere a questa discussione.

© 2018 G 6 Tutti i diritti riservati - Buon divertimento!

By continuing to use the site, you agree to the use of cookies. more information

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi