

Supra chess engine
O primeiro motor de xadrez Português

Introdução
Supra Chess é o primeiro motor de xadrez português. O código fonte é totalmente original, com copyright ©, aberto, escrito em c++ e está disponível para download no final da página. ↓
Criador e Programador: Pedro Mourão Soares Correia.
Novidades
Supra 30.0 disponível para download em baixo na página↓
A maior atualização da história do Supra. Num match de teste contra a versão anterior (Supra 29.1, 10 minutos por jogo, 50 aberturas jogadas com as duas cores), Supra 30.0 fez +82 =12 -6 em 100 jogos (88%), cerca de +350 Elo. (Teste com 8 núcleos para o Supra 30.0 e 1 núcleo para o Supra 29.1.)
- Pesquisa até 40 níveis de profundidade
O Supra passa a pesquisar até 40 níveis (meios-lances). Com o multiprocessamento e a pesquisa de quiescência chega muito mais fundo no mesmo tempo, e os 40 níveis permitem tirar todo o partido disso.
- Multiprocessamento (Lazy SMP) **
O Supra pode usar até 8 núcleos do processador (opção Threads; por omissão usa 1). Os threads pesquisam em paralelo e partilham a tabela de hash (e, como opção experimental, os valores de alfa à mesma profundidade). No fim, o Supra escolhe o lance do thread que chegou mais fundo, aceitando ciclos incompletos mas descartando o lance cortado pelo tempo, e as profundidades iniciais são distribuídas de forma equilibrada pelos threads. * **
- Avaliação mais rápida **
Avaliação preguiçosa dos dois lados e memória de avaliações: cerca de 13% mais rápido até à mesma profundidade, com exatamente a mesma pesquisa.
- Pesquisa de quiescência **
Nas folhas da árvore, o Supra analisa as sequências de capturas e promoções até a posição acalmar. Assim deixa de avaliar posições a meio de uma troca, o que elimina muitos erros táticos.
- Janela de quiescência adaptativa * **
No meio-jogo, a quiescência usa uma janela alfa-beta, o que a torna muito mais rápida. Nos finais (menos de 1/3 do material), a janela fecha-se e a quiescência passa a ser exata, para máxima precisão nos finais técnicos. (Ideia do autor, implementada com a ajuda de Claude.)
- Mop-up **
Nos finais contra o rei sozinho, o Supra empurra o rei adversário para a borda e aproxima o seu próprio rei. Agora dá mate com torre com facilidade.
- Tabela de hash (transposições) **
As posições já analisadas ficam guardadas e são reaproveitadas, e a tabela é partilhada por todos os threads. É limpa no início de cada jogo novo.
- Personalidades
Nova opção "Personality", com cinco estilos:
custom: mandam as opções individuais (por omissão);
hyper-romantic: ataque total, aceita sacrificar até uma dama;
romantic: jogo ofensivo, aceita sacrificar até uma torre;
dynamic: o estilo clássico do Supra;
positional: jogo sólido e posicional.
Cada personalidade ajusta sete parâmetros de uma vez (agressividade, ataque ao rei, mobilidade, relevância posicional, quociente material e limite de sacrifício). Inspirado nas ideias de Alexander Shashin.
- Novo livro de aberturas romântico **
Livro interno com 350 posições: todas as linhas do livro anterior e gambitos clássicos como o Gambito de Rei (com o Muzio), o Gambito Evans, o Fried Liver, o Contra-Ataque Traxler, o Ataque Marshall, o Gambito Schliemann, o Gambito Letão, o Gambito de Budapeste, o Contra-Gambito Albin, o Alien Gambit, o Martian Gambit e a Variante Portuguesa da Escandinava. O livro pode ser editado: basta colocar o ficheiro supra_livro.txt na pasta do executável (ou escolher outro com a opção "Book file"). Cada lance pode ter um peso, e o Supra escolhe entre várias opções.
- Opções UCI reorganizadas por assunto: sistema, tempo, livro e memória, pesquisa, avaliação e estilo, interface e testes. As opções "OwnBook" e "Hash" passam a usar os nomes padrão do protocolo UCI.
- Correções
Correção de um erro que, em certos jogos, limitava a pesquisa a profundidades baixas. Melhor comunicação com as GUIs.
Ficha Técnica
Tipo: motor UCI, sem interface gráfica própria. Liga-se a programas de xadrez como o Fritz, o ChessBase, o Arena, o Hiarcs ou o Cute Chess.
Linguagem: C++
Tamanho: Supra 1.0: cerca de 15 000 linhas de código (executável com cerca de 1,5 MB). Supra 30.0: cerca de 539 000 linhas de código (executável com cerca de 12 MB).
Profundidade: até 40 níveis (meios-lances)
Processadores: até 8 núcleos (Lazy SMP)
Criador: Pedro Mourão Soares Correia
Ano de criação: 2010 (Supra 1.0)

Algoritmos usados:
Algoritmo Principal:
Algoritmo base * (equivalente a minimax): Algoritmo recursivo que para cada nó, encontra o filho mais forte (min ou max) de acordo com a perspetiva do lado a ser jogado. Este algoritmo Base foi desenhado por mim em 2011 na Versão Supra 2.0. Mais tarde percebi que já havia sido descoberto muito antes!
Algoritmos relacionados ao algoritmo base:
- Algoritmo alfa beta: quando Supra analisa os filhos de um determinado nó, ele interrompe a pesquisa sempre que beta <= alfa, pois mesmo que beta ainda possa diminuir mais, não importa, porque não será relevante para crescer alfa. Quando este corte ocorre, significa que o nó em questão não é melhor que o nó mais forte neste nível de profundidade e secção da árvore.
- Wormhole *: Este algoritmo aplica a mesma condição que o algoritmo alfa beta, mas a estende a todos os níveis anteriores: Por exemplo, no nível deph=5: a condição em vez de "if (beta5 <= alfa4)" é "if (beta5 <= alfa4 || beta5 <= alfa2 || beta5 <= alfa0)". O ganho é avassalador!
Algoritmos de ordenação de dados para acelerar cortes no algoritmo alfa beta:
- Internal Iterative Deepening: Este algoritmo faz varreduras completas sucessivas com profundidade crescente a cada varredura. Isso permite agrupar melhor os nós em ordem (aprimorando o corte alfa beta) e gerenciar melhor o tempo gasto em pesquisa.
- Killer moves: Permite que Supra analise sempre primeiro o movimento que fez o corte alfa beta na seção anterior no mesmo nível de profundidade. Muitas vezes, mesmo em posições diferentes, o mesmo movimento da peça produz corte alfa beta, se anteriormente também produzia.
- Tabela de hash (transposições) **: Guarda o melhor lance e o valor de cada posição analisada. Quando a mesma posição volta a aparecer (por outra ordem de lances), o Supra reaproveita o trabalho já feito.
- Filtro vertical *: Filtro poderoso de variantes francamente ruins de deph>=3.
- Filtro turbo *: Permite que Supra use um método de pesquisa um pouco mais rápido por incrementos escalonados de alfa.
- Null move pruning: O lado a mover não se move e deixa o adversário jogar: se o resultado desta análise (com deph = deph-2) ainda for ruim para o adversário existe um corte total neste nó.
- Late move reductions: Este algoritmo faz com que Supra analise os primeiros filhos de um nó com profundidade normal. Se após a análise destes primeiros (cerca de 5) nós não houver corte alfa beta a pesquisa continua mas agora com uma profundidade menor. Este procedimento economiza muito tempo na pesquisa, pois o corte alfa beta normalmente não é produzido a não ser nos primeiros nós. Se um corte for produzido, Supra terá que reanalisar os nós restantes com profundidade normal. Supra usa uma versão mais radical deste algoritmo e só varre novamente esse nó com deph normal se esse nó produziu corte alfa beta e não todos os nós indiscriminadamente. Em outras palavras, se o corte alfa beta com menor deph for produzido em um determinado nó (após o 5 inicial), então supra analisa esse nó com deph normal. Se não for confirmado o corte alfa beta, Supra analisa o próximo nó com menor deph e executa o mesmo procedimento.
Principal Variation Search: Supra para cada nó começa com uma varredura com janela de tamanho muito reduzido (<1) se o valor beta não sair da janela a pesquisa com janela ilimitada não é realizada e Supra economiza muito tempo varrendo o ramo desse nó.
Algoritmos de filtragem por condição:
Algoritmos de filtragem com pré-pesquisa com menor nível de profundidade:
PESQUISA NAS FOLHAS
- Pesquisa de quiescência **
Nas folhas, o Supra continua a analisar só capturas e promoções até a posição acalmar, com "stand pat" (o lado que joga pode não capturar), ordenação MVV-LVA (vítima mais valiosa, atacante menos valioso) e avaliação só de material, o que a torna muito rápida.
- Janela de quiescência adaptativa * **
Janela alfa-beta no meio-jogo (mais rápida) e quiescência exata nos finais (mais precisa).
FINAIS
- Mop-up **
Contra o rei sozinho: o rei adversário é empurrado para a borda e o rei atacante aproxima-se.
MULTIPROCESSAMENTO
- Lazy SMP **
Vários threads pesquisam a mesma posição em paralelo, desfasados nas profundidades, partilhando a tabela de hash e os valores de alfa. Cada um aproveita o trabalho dos outros.
- Melhor thread por profundidade * **
O lance escolhido é o do thread com a pesquisa válida mais profunda. Um ciclo incompleto vale assim que o primeiro lance da raiz termina; o lance cortado pelo tempo é descartado; em empate, ganha quem acabou mais lances da raiz.
- Partilha de alfas por profundidade (opção experimental, desligada por omissão) * **
Os threads que estão na mesma profundidade partilham os valores de alfa e cortam mais cedo.
- Distribuição equilibrada das profundidades * **
Com 4 threads, dois começam ao nível do primeiro e dois um ciclo à frente; com 8, três ao mesmo nível, quatro um ciclo à frente e um dois ciclos à frente.
VELOCIDADE DA AVALIAÇÃO
- Avaliação preguiçosa dos dois lados **
Se o material, só por si, já garante o corte ou a irrelevância da folha, a avaliação completa não é feita.
- Memória de avaliações **
As avaliações repetidas na mesma pesquisa (cerca de 17%) são guardadas e reaproveitadas, com exatamente o mesmo resultado.
AVALIAÇÃO E ESTILO
- Algoritmo de Shashin
Classifica as posições em zonas de ataque (Tal), de equilíbrio (Capablanca) e de defesa (Petrosian), e ajusta os critérios posicionais a cada zona.
- Quociente material *
A vantagem material é avaliada pelo logaritmo da proporção entre o material dos dois lados, e não só pela diferença. Assim, um peão a mais vale mais num final do que no meio-jogo, e o Supra procura trocas quando está à frente e evita-as quando está atrás.
- Personalidades
Cinco estilos de jogo (custom, hyper-romantic, romantic, dynamic e positional) que ajustam de uma vez a agressividade, o ataque ao rei, ataque por xeque ao rei, a mobilidade, a relevância posicional, o quociente material e o limite de sacrifício.
* Algoritmos descobertos por mim, ou redescobertos por mim de forma independente.
** Algoritmos implementados no Supra 30.0 com a preciosa e imprescindível ajuda de Claude, inteligência artificial da Anthropic.
