Skip to content

Releases: fatorius/capizero

beta2.5.0

27 Apr 15:29
d44f77d

Choose a tag to compare

beta2.5.0

O que foi adicionado:

Possíveis melhorias

  • Ainda é possível criar uma redução mais agressiva para o null-move pruning com uma função continua, porém não consigo realizar testes para verificar a eficácia de uma poda mais agressiva.

Full Changelog: beta2.4.1...beta2.5.0

beta2.4.1

24 Apr 03:06
5135601

Choose a tag to compare

beta2.4.1

O que foi corrigido nessa versão?

  • Adicionado opção de recover automático nos testes SPRT
  • Gera underpromotion de Q+N by @fatorius in #21
  • Altera representação lances para struct de 8 bytes (+50% de ganho de memória) by @fatorius in #22

Ganhos de ELO

Nenhum ganho de ELO registrado nessa versão, apenas pequenas correções e melhoras neutras

beta2.4.0

17 Apr 14:15

Choose a tag to compare

beta2.4.0

Correções

  • Corrigido bug no tamanho de memória alocado para hash zobrist

Melhorias na pesquisa

  • Implementado TT Cut-off

Melhorias na arquitetura do projeto

  • Adicionado testes de SPRT
  • Adicionado testes de gaunlet

Ganho de performance

Resultado de SPRT vs versão beta2.3.0

Results of candidate vs baseline (10+0.1, 1t, 64MB, UHO_Lichess_4852_v1.epd):
Elo: 64.54 +/- 17.78, nElo: 82.50 +/- 22.19
LOS: 100.00 %, DrawRatio: 35.67 %, PairsRatio: 2.22
Games: 942, Wins: 402, Losses: 229, Draws: 311, Points: 557.5 (59.18 %)
Ptnml(0-2): [25, 69, 168, 126, 83], WL/DD Ratio: 1.90
LLR: 2.95 (100.2%) (-2.94, 2.94) [0.00, 5.00]

beta2.3.0

16 Apr 18:34
31a1160

Choose a tag to compare

beta2.3.0

  • Adicionado suporte ao protocolo UCI

Importante

  • O loop UCI ainda é executado em uma única thread
  • Não há suporte ao comando stop

beta2.1.2

04 May 14:21
86a375e

Choose a tag to compare

beta2.1.2

Patch para corrigir erro na geração de roques a partir de uma posição dada por um FEN

beta 2.1.1

02 May 22:03
1c3ea77

Choose a tag to compare

Versão beta 2.1.1

Uma pequena versão trazendo algumas correções de bugs e pequenas melhoras

Bugfixes

  • Corrigi erro na obtenção de direitos de roque a partir de um FEN personalizado - Os valores do bitboard de direitos de roque estavam errados.
  • Reduzi a quantidade de ifs redundantes na função de realizar lances - O tipo da peça estava sendo verificado mais de uma vez para saber se era um peão.

Optimizações

  • Substituido ffsll por ctzll - O que elimina a necessidade de uma operação extra de subtração ao fazer um bitscan

Recursos adicionados (em fase de testes)

  • Bitboards PEXT

Ganhos de ELO

As alterações realizadas corrigiram bugs e não apresentaram nenhum ganho de rating

beta 2.1.0

07 Nov 19:11
492ce75

Choose a tag to compare

Versão beta 2.1.0

Mais um release trazendo diversos recursos novos.
Dessa vez, esse release está totalmente focado em recursos para melhorar a pesquisa de lances, tornando-a mais rápida e mais eficiente na poda de lances

Recursos novos

  • Killer move heuristic: Adicionado a heuristica do killer move, que acrescenta um bonus na ordenação de lances para lances de não captura que causaram um beta-cutoff em posições semelhantes, dessa forma, a ordenação de lances consegue encontrar mais rapidamente os principais lances a serem pesquisados e ao mesmo tempo, mantém na memória planos de curto prazo na posição.
  • Internal Iterative Deepening: Em posições onde não há lances armazenados na tabela de transposição, o algoritmo performa uma pré-pesquisa a uma pequena profundidade apenas com a intenção de optimizar a ordenação de lances.
  • Aspiration windows: O algoritmo inicia a pesquisa alpha-beta com estimativas dos valores de alpha e beta baseados na avaliação da última iteração da pesquisa. Isso faz com que o algoritmo consiga efetuar mais beta-cutoffs.
  • Late-move-reductions: Os últimos lances a serem pesquisados recebem uma redução em sua profundidade caso se encaixem em critérios pré-definidos

Optimizações

  • Removido a soma de bonus do historico para lances de heuristicas: Lances que já caíram em alguma heuristica de ordenação de lances não recebem mais o acréscimo da tabela de histórico, uma vez que esse acréscimo é insignificante para ordenação de lances.

Bugfixes

  • Corrigido erro na pesquisa em posições de mate forçado: O valor padrão para posições de xeque-mate era maior que o valor inicial de alpha, sendo assim, quando a pesquisa encontrava uma posição de xeque-mate, esta causava um fail-high, portanto, o algoritmo evitava essa continuação.

Comparações

Em comparação com a última versão o capizero demonstrou grandes melhoras na pesquisa de lances, avaliando o dobro de posições por segundo: capizero beta2.0.2 = 3869K e capizero beta2.1.0 = 6818K e pesquisando cerca de 45% a menos de lances por profundidade em profundidades maiores que 10.
Além disso, é notável a melhora do capizero em posições de mate, que na versões anteriores ele não conseguia encontrar, causando empates em posições ganhas. Essa evolução pode ser percebida nos jogos de teste disponibilizados em capizero.xyz

Ganhos de ELO

De acordo com os calculos realizados em 300 partidas através do CuteChess, essa versão do Capizero ganhou 8 pontos de rating em relação a versão anterior

beta 2.0.2

01 Nov 07:55
e82d597

Choose a tag to compare

Versão beta 2.0.2

Mais outra atualização rápida com algumas funcionalidades novas e correções de bugs

O que há de novo

Comando fen / setboard

Com esse comando agora é possível configurar a engine para calcular a partir de posições especificas informando o FEN da posição desejada.
O comando fen funciona no modo normal e é equivalente ao comando setboard do modo xboard

Alguns outros comandos xboard

Implementado alguns comandos que foram deixados de lado na versão beta1.2.0 (versão que introduziu o protocolo xboard), esses novos comandos são: ping e protover (para mais informações a respeito desses comandos, consulte a documentação oficial do protocolo xboard

Correções de bugs

  • Corrigido bug na deteção de legalidade do roque menor das pretas.

beta 2.0.1

29 Oct 02:59
0b92a38

Choose a tag to compare

Versão beta 2.0.1

Uma rápida atualização para correção de bugs

Correções

  • Alterado código para que os lances de promoção sejam notados corretamente no modo xboard. Atualmente o capizero ignora sub-promoções, mas isso pode ser tópico de futuras atualizações, por enquanto não há planos de mudar essa catecteristica.

beta 2.0.0

27 Oct 06:03

Choose a tag to compare

Versão beta 2.0.0

Depois de vários meses sem atualizações aqui no projeto, finalmente uma nova versão com grandes novidades!

O que há de novo nessa versão

Todos os esforços desde a última versão foram para melhorar a performance da geração de lances, principalmente com o uso de bitboards mágicos.

Geração de lances com bitboards mágicos

Essa técnica visa eliminar os loops excessivos na geração de lances para bispos e torres.
A abordagem antiga consistia em loopar na direção do ataque da peça, casa por casa, verificando se há uma peça ocupando aquela casa.
Caso a peça seja do adversário, ela pode ser capturada e o loop se encerra, caso contrário, o loop se encerra sem adicionar a captura.
Caso não haja nenhuma peça ocupando a casa em questão, o loop continua.

for (direcao = NORTE; direcao < NO + 1; direcao += 2){
    if (mask_vetores[casa][direcao] & bit_total){
        for (casa_destino = casa;;){
            casa_destino = dtb_moves[casa_destino][direcao];
            if (mask[casa_destino] & bit_total){
                if (mask[casa_destino] & bit_lados[contraLado]){
                    adicionar_captura(casa, casa_destino, tx[tabuleiro[casa_destino]]);
                }
                break;
            }
            adicionar_lance(casa, casa_destino);
        }
    }
    else{
        for (casa_destino = casa;;){
            casa_destino = dtb_moves[casa_destino][direcao];
            if (casa_destino == -1){
                break;
            }
            adicionar_lance(casa, casa_destino);
        }
    }
}

Essa quantidade de loops acaba sendo muito intensa para o processador na hora de gerar esses lances, portanto a técnica de geração de lances com bitboard mágicos consiste em pré-gerar o bitboard de lances legais de bispo e torre por casa para cada combinação possível de peças bloqueadoras. Esses bitboards serão armazenados em uma tabela hash indexadas pela casa e por um número mágico obtido através de uma multiplicação do bitboard de peças bloqueadoras por um número mágico.
Para isso, apenas as peças no raio de ação da torre ou bispo em questão são levadas em conta, pois essas são as únicas peças que interferem no conjunto de lances possíveis dessas peças.

Sendo assim, o processo de geração de lances para bispos e torres acaba sendo o processo de obter o bitboard de peças bloqueadoras, calculando o hash a partir de uma multiplicação por um número mágico (o que graças às instruções de multiplicação rápida de inteiros de 64 bits, acaba sendo um processo muito veloz), e o acesso do bitboard de lances legais a partir do hash:

bloqueadores = bit_total & bit_casas_relevantes_torres[casa];
chave_hash = (bloqueadores * magicas_torres[casa]) >> (64 - bits_indices_torres[casa]);
ataques = bit_magicas_torre[casa][chave_hash];

Para maiores referências a respeito da geração de lances, estou deixando dois links ótimos que explicam mais a fundo essa técnica.

Resultados

Poda de lances

capizero beta2.0.0 pesquisa em média 8% de lances a menos do que capiezero beta1.3.0para chegar na mesma profundidade.

Velocidade de pesquisa

capizero beta2.0.0 pesquisa 4 vezes mais lances por segundo do que a versão capizero beta1.3.0. Isso se deve pelo aumento na velocidade de geração de lances.
Como base de comparação, a versão atual do capizero chega na profunidade 12 em 1.9 segundos, enquanto o versão anterior demorava cerca de 5.4 segundos.

Avaliação de posições

Apesar de não ter sido o foco dessa versão, a avaliação de posições também se tornou mais rápida devido às novas flags de optimização do gcc que foram adicionadas: --march=native -O3 -flto.
Essas optimizações do compilador impactaram significativamente a velocidade da avaliação de posições, ficando mais de 4 vezes mais veloz do que a versão anterior.

Geração de lances

A geração de lances também teve um aumento enorme em sua performance. Cerca de 4 vezes mais rápido do que a versão anterior.
Como base de comparação, a versão capizero beta1.3.0 gerava em média 9356K de lances por segundo de acordo com o binário stats. A versão atual capizero beta2.0.0 consegue gerar em média 31694K de lances por segundo.

Notas pessoais

Estou focado em implementar uma por uma das funcionalidades listadas no arquivo README desse repositório, mas por questões de tempo não é possível trabalhar nesse projeto com uma frequência boa, sendo assim, pode ser bem comum de agora em diante, meses parados sem desenvolvimento até que eu finalmente volte para implementar um novo algoritmo nesse projeto.
Não pretendo abandonar o desenvolvimento desta engine de xadrez, inclusive estou com várias ideas para continuar aprimorando sua performance, portanto, mesmo que demore, ainda há muita coisa interessante por vir!