Crafty 19 - Comandos e Configurações

Robert Hyatt
2004



Introdução

O Crafty não é mais que um hobby antigo meu, da época do Blitz e do Cray Blitz que o seguiu. As pessoas me perguntam como eu continuo fazendo isto, e esta é uma questão que geralmente me deixa sem palavras.

Talvez a pergunta mais comum que me fazem é "esta versão do Crafty é alguma versão 'emburrecida' do que você joga no ICC ou que você usa em eventos de xadrez de computador?" A resposta é um sonoro NÃO. A versão atual é exatamente o que está rodando no ICC com este número de versão. Note que uma nova versão pode, ocasionalmente, introduzir fraquezas ou bugs medonhos que não estavam persente na versão "gold" anterior. Por isto, você deve ser cuidadoso para fazer cópias de sua versão "favorita" antes de tentar a última e melhor. Se você não estiver satisfeito com a nova versão, pode voltar para o que você acredita ser uma versão melhor.

Se você está procurando pelo programa de xadrez mais forte disponível, provavelmente deve procurar o Fritz, Rebel, Tiger, e as outras opções comerciais. Lá você vai encontrar oponentes fortes com interfaces buriladas que foram testados de forma sistemática e cuidadosa. Se você está procurando por um programa que joga um bom xadrez, tem um razoável conjunto de funções para o teu uso, está disponível na forma de código fonte, e um em que o autor aceita feedback, código ou sugestões, então você está no lugar certo. Eu aceito comentários e sugestões, bem como feedback de idéias que você mesmo tentou e que parece funcionar.

O Crafty é um programa de xadrez que está no estado-da-arte, e usa todos os algoritmos de busca que você provavelmente já ouviu, pesquisa negascout, ordenamento de lances killer/history, ordenamento de lances quiescentes e "poda" SEE (Static Exchange Evaluation), tabelas hash (transposição/refutação) bem como caches de avaliações, extensões seletivas, pesquisa recursiva de lances nulos, e muitas funcionalidades que tem sido u sada e ainda são usadas na maioria dos programas de xadrez por computador. Se não está no Crafty, então ou está na lista "to do", ou foi tentado, deixou a desejar, e foi descartado.

O Conhecimento em Xadrez está crescendo, e sugestões (ou mesmo código melhorado, real) são bem-vindas. Este é o melhor lugar para contribuir com idéias, por que o conhecimento pode ser usado para suplantar a pesquisa e fazer com que ele jogue melhor. A avaliação é provavelmente o lugar mais fácil para começar a estudar o Crafty por causa dos comentários e a simplicidade do uso dos bitmaps, desde que você "entre" neles.

Meu objetivo ao fazer isto é um exercício em eficiência no xadrez de computador. Eu não posso começar a contar o número de pessoas que conheço que iniciaram do zero a escrever um programa de xadrez. Maior ainda é o grupo que começou do zero, e desistiu antes de terminar, por causa do tamanho básico do projeto.

O Crafty oferece a todo mundo um ponto de início bem limpo, se você é fascinado pela implementação de tabuleiro de xadrez de bitmap (como eu sou). O código de pesquisa e quiescência é razoavelmente direto, bem como a avaliação.

Ele oferece um excelente ponto de início, assim, se você está interessado em tentar uma nova extensão de pesquisa, pode começar os testes amanhã, em vez de no próximo ano, por que você começa com um mecanismo de xadrez plenamente funcional que não é uma aplicação "de brinquedo", mas um jogador de xadrez funcional e "perigoso". Ele oferece um início rápido, apesar de que você pode certamente substituir o mesmo peça por peça até que ele seja "seu", se você quiser. Ele também oferece um conjunto bastante completo de comandos e uma interface para uma GUI bem como suporte para jogar em servidores de xadrez, de forma que o teste e depuração de suas novas idéias é bastante simplificado.

Se você gostaria de ter mais informações, verifique o documento read.me e o crafty.FAQ que são distribuídos com o Crafty. Estes contém novidades e instruções específicas para perguntas feitas frequentemente, como "onde eu consigo obter arquivos de tablebase e como eu uso os mesmos?"

Como Jogar

Quando você executa o Crafty, irá imediatamente ser recebido pela string de prompt "white(1): " e o Crafty irá aguardar por comandos. Este prompt significa que é a vez das brancas jogarem, e que é o lance no. 1 para as brancas. Você pode usar qualquer um dos comandos da lista alfabética de comandos abaixo para modificar o jogo ao seu gosto (controle de tempo, tamanho da tabela de hash, aleatoriedade do livro, etc.) e então tem duas escolhas. Se você quiser jogar com as brancas, basta entrar seu lance, e o Crafty vai ler o mesmo e fazer um lance em resposta. Você então receberá o prompt "white(2): " e é novamente sua vez. Se você preferir jogar com as pretas, basta entrar "move" ou "go" no prompt e o Crafty fará o lance para aquele lado em vez de aceitar um lance seu. Após ele fazer o lance das brancas, você verá então o prompt "black(1): " indicando que é agora a vez do primeiro lance das pretas. Você pode entrar um lance, ou pode mais uma vez entrar "move" ou "go" e o Crafty irá novamente fazer o lance do lado atual, trocar os lados, e oferecer o prompt para você, para o que deve ser feito a seguir.

Se você usa sempre um conjunto de comandos para configurar o Crafty para que o mesmo jogue do jeito que você quer, pode colocar estes comandos em um arquivo de início chamado .craftyrc (Unix) ou crafty.rc (DOS/Windows). O formato deste arquivo é exatamente como você iria escrever os comandos no teclado, com a exigência que a última linha do arquivo deve ser "exit", sozinho na linha. Usando isto, cada vez que você começar o Crafty, ele irá primeiro executar os comandos deste arquivo antes de oferecer o prompt para seus comandos.

Enquanto o Crafty está em execução, você pode controlar o que ele apresenta, mas aqui estão alguns exemplos para explicar o que ele está dizendo e por quê:

             depth   time   score    variation (1)
              book moves {d4, c3, Nc3, d3, b3, c4, g3, b4, Be2, Bb5}
              book   0.0s     70%    d4
  
  White(3): d4
              time used:   0.01

Esta é a saída normal para aqueles casos em que o Crafty está usando o livro. As linhas de lances do livro dão o conjunto de lances de livro que fazem o primeiro corte de seleção (veja a explicação sobre seleção de livro dada mais adiante), seguida pelo lance realmente jogado, neste caso, d4.

Se o Crafty estiver fora do livro, então a saída parece um pouco diferente, como pode ser visto abaixo:

     depth   time   score    variation (1)
       4->   0.81    2.09    6. dxe4 Bxe4 7. Rad8 Qf2 8. Qb5
       5     1.37    2.41    6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5
       5->   1.88    2.41    6. dxe4 Bxe4 7. Ne5 Qf4 8. Bxe4+ Qxe4 9. f5
       6     7.38      --    6. dxe4
       6    11.90    1.97    6. dxe4 Bxe4 7. Rab8 Qf2 8. Qc7 Nc5 9. Qe5
       6    12.92      ++    6. Ne5
       6    13.71    2.23    6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
       6->  15.59    2.23    6. Ne5 Qg2 7. Ng6 h5 8. Nh4 Qg4
     time: 15.60  cpu:99%  mat:1  n:246565  nps:15927
     ext-> checks:4706 recaps:1336 pawns:0 1rep:301
     nodes  full:45951  quiescence:200614  evals:104657
     endgame tablebase-> probes done: 0  successful: 0

Vamos examinar isto uma linha por vez. As linhas que tem algo como 4-> na coluna depth são escritas quando uma iteração (depth ou profundidade) é terminada completamente. As colunas time (tempo) e score (pontuação) devem ser óbvias quanto ao seu significado bm como é a PV, a seqüência de lances que levaram a este escore. Uma nota sobre a coluna "score". Como na versão 18, o Crafty mostra o escore com + para valores bons para as brancas, - para valores bons para as pretas, não importando qual lado está jogando no momento. Toda a saída agora segue esta convenção, para jogar, para o modo de análise, para a anotação de jogos, para "cochichar"/sapear nos servidores de xadrez, e assim por diante. Isto é diferente de outras máquinas de xadrez, mas assim que você se acostuma, se torna muito menos confuso quando você lembra que escores negativos são bom para as pretas e ruins para as brancas, e vice-versa.

A linha que tem um -- na coluna de escore significa que quando foi iniciado o nível 6, dxe4 acabou tornando-se pior que o pensado (note que o escore caiu de 2.411 na última pesquisa para 1.972 para este lance nesta pesquisa). Para resolver isto, o Crafty diminui o limite inferior de pesquisa (alpha) e refaz a pesquisa do lance para encontrar o escore. A linha com ++ significa que este lance (Ne5) é melhor que o melhor lance até agora, de forma que o Crafty aumenta o limite superior da pesquia (beta) e refaz a pesquisa deste lance para encontrar o novo escore.

A primeira linha de estatística dá o tempo total que tomou esta pesquisa, a percentagem de cpu que deve ficar em torno de 98-100%, a menos que sua máquina esteja sobrecarregada ou a menos que o Crafty esteja em um final que tem muitos contatos com bancos de dados de finais. Se este valor cair abaixo de 98%, isto significa que o Crafty não está conseguindo usar toda a CPU e deverá estar jogando mais fraco que o normal. O mat:1 é simplesmente o escore material real, já que os escores posicionais do Crafty são geralmente superiores que um peão.

Comandos

alarm on|of
Este comando é usado para controlar o bipe do Crafty após este ter feito um lance. Desligar o mesmo fará com que o Crafty fique "quieto" quando joga, mas também torna fácil perder um lance se você estiver usando o Crafty para jogar em um torneio. Este comando foi projetado primariamente para tornar o Crafty tolerável durante jogos tarde da noite.

analyze
Este comando coloca o Crafty no modo análise. Neste modo, o Crafty começa a computar para qualquer lado que tenha a vez, e continua computando e mostrando sua análise até que um lance seja informado. Quando o lance é feito, o Crafty muda o lado, e começa a pensar e escrever a análise tudo de novo, mas para o outro lado agora.

Este comando é útil para um jogo, por que se obtém feedback instantâneo quando você tenta fazer um lance. Se você tentar um lance diferente do que você acabou de entrar, use o comando back para voltar um lance, ou use "back <n>" para voltar <n> lances. Note que um lance é um movimento do último jogador, e não um movimento dos dois lados. Para desfazer os dois últimos lances (um das pretas, e outro das brancas), use "back 2".

annotate|annotateh <filename> <colors|name> <moves> <margin> <time>
Este comando é usado para anotar (colocar comentários) em um jogo que já foi terminado.

O comando annotate produz um arquivo com a extensão .can acrescentado ao nome original. Este arquivo conterá informações em ASCII puro para o passo de anotação. "annotateh" produz um arquivo HTML (com a extensão .html). Este inclui a saída normal, mais um bonito tabuleiro gráfico de bitmap para cada posição que o Crafty tem "algo a dizer".

<filename> é o nome do arquivo que tem os lances do jogo. Deve ser um arquivo compatível com o PGN, apesar de o Crafty poder ler praticamente qualquer arquivo com lances de xadrez e converter o mesmo para PGN usando os comandos "read" e "savegame" para fazer a conversão.

<colors|name> indica qual lado o Crafty irá anotar. As escolhas válidas são w, b e wb/bw para só as brancas, só as pretas, e as duas, respectivamente. O Crafty irá examinar e produzir os resultados somente para a cor indicada, fazendo os lances para o outro lado silenciosamente conforme são lidos.

Alternativamente, pode-se especificar o nome do jogador (útil se você quer anotar vários jogos em um grande arquivo PGN, por exemplo, e se você alternou as cores de forma que você não pode escolher a correta facilmente). O Crafty irá então descobrir qual lado deve ser anotado em cada jogo. Note que o nome é sensível a caso, mas você só precisa informar uma string que seja única no campo nome. Por exemplo, se um nome é "Anatoly Karpov", e o outro é "unknown", então especificar "Karpov" para o nome deve ser suficiente. Se a mesma "string" aparece nos dois nomes, o Crafty irá reclamar.

<moves> indica os lances que devem ser anotados. Se for um único número inteiro, a anotação começa com este número de lance (para a cor dada acima) e egue para o resto do jogo. Se um intervalo é informado, como (20-33), então só os lances 20-33 inclusive serão anotados. Para anotar o jogo todo, pode-se usar 1-999.

<margin> dá uma "janela" de escore que controla quando o Crafty irá produzir comentários (veja abaixo). Quanto maior é este número, menos anotações o Crafty irá produzir. Um número negativo irá resultar em uma anotação para cada lance selecionado.

<time> indica o limite de tempo para cada pesquisa. Como cada lance selecionado pede duas pesquisas, você pode pegar o número de lances, dobrar este número e multiplicar por <time> para determinar quanto tempo o processo de anotação vai levar. Este tempo é dado em segundos.

Como isto funciona? Suponha que você use o comando "annotate game1 w 1-999 1.000 30". Este comando pede ao Crafty para ler o arquivo "game1", e anotar os lances das brancas em todo o jogo. A margem é 1 peão e o tempo de pesquisa está limitado a 30 segundos. A saída do comando annotate é encontrada em <filename>.can, neste caso, game1.can.

O Crafty primeiro pesquisa o lance que foi feito no jogo para determinar seu escore. O Crafty então examina a mesma posição, mas tenta todos os lances legais. Se o escore para o melhor lance encontrado nesta pesquisa é maior que o escore do lance jogado mais a margem, então um comentário é acrescentado no arquivo de saída. Este arquivo de saída é bastante curto, com todos os lances do jogo (mais quaisquer tags PGN do original, para identificação), mais os breves comentários. Uma anotação se parece com isto:

  {real_value (depth:best_value PV moves)}

real_value é o escore do lance que foi jogado, depth é a profundidade que o Crafty pesquisou para produzir o best_value e PV para o que ele pensa que seja a melhor seqüência de lances para os dois lados. Se você mudar <margin> para 1.000, você está pedindo ao Crafty para só anotar os lances que perdem um peão ou mais, ou lances que perderam um peão ou mais. Se você mudar <margin> para .300, você está pedindo anotações para qualquer lance que faça o escore cair cerca de 1/3 de peão abaixo do valor do melhor lance que o Crafty encontrou.

Se você tiver outros lances que gostaria de ter analizados durante este processo de anotação, no ponto que o lance pode ser jogado, acrescente no arquivo PGN um comentário de anális, entre () ou {}. O Crafty irá produzir análises para este lance também. Se mais que um lance aparecer dentro de um único conjunto de delimitadores, somente o primeiro será analizado. Para forçar o Crafty a analizar mais que um lance, entre então desta forma, ou parecido: (move1)(move2) como se fossem dois comentários separados.

ANSI on|off
Este comando é usado para controlar se o Crafty tentará ou não apresentar seu lance em vídeo reverso. Para PCs, Linux, e a maioria dos equipamentos Unix, ista opção funciona bem. Se você estiver jogando o Crafty em um terminal burro, esta opção pode bagunçar o terminal e interferir com sua capacidade de ver ou informar lances. Se os lances não forem apresentados em vídeo reverso, provavelmente é melhor desligar esta opção para evitar pendurar o terminal que você está usando.

black|white
Este comando simplesmente muda o lado que tem a vez. Se for a vez das brancas, e você informar white, nada acontece. Se é a vez das brancas jogar e você entrar black, então imediatamente passa a ser a vez das pretas, com a mesma posição. Usado raramente.

book
(veja a explicação sobre o livro no fim deste documento para uma explicação completa deste comando e suas muitas opções) Note que existem comandos especiais disponíveis (somente na linha de comando, não nos arquivos crafty.rc/.craftyrc) para direcionar o Crafty para diretórios específicos para os arquivos de book (bookpath=/a/b/c), as tablebases (tbpath=/i/j/k), e os arquivos de log (logpath=/x/y/z). Note que estes comandos pode ser usados somente na linha de comando, por que devem ser executados antes que o engine seja inicializado. Colocar os mesmos no arquivo crafty.rc/.craftyrc irá produzir mensagens de erro sem afetar como os arquivos são abertos.

Se você precisar especificar múltiplos diretórios (tbpath somente) você pode fazê-lo usando "tbpath=path1:path2:paht3:etc" ou então usar a opção mais Unix-lik "tbpath-(path1:path2:path3:etc)". Os diretórios são separados por ":" (dois-pontos) e tudo é sensível ao caso como normal. Para usuários DOS/Windows, o separador pode ser um ponto-e-vírgula (;) ou uma vírgula (,) para evitar a ambiguidade na designação de drive.

cache=N
Este comando é usado para alterar o tamanho do cache usado para pesquisas em bancos de dados de finais. N pode ser um inteiro simples, representando o número de bytes a usar ou pode ser especificado como nK ou nM, representando n * 1024 ou n * 1024 * 1024 bytes. Esta opção deve estar em múltiplos do tamanho dos "pedaços" do banco de dados, que podem variar. O uso da forma nM garante que você terá um número razoável.

clock <ctime> <otime>
Este comando foi feito para uso quando o Crafty está jogando em um torneio, como os eventos WMCCC ou WCCC. Se o operador for um pouco lento para informar os lances, ou esquecer de parar o relógio após ter feito um lance para o Crafty, o relógio de xadrez do jogo irá apresentar diferenças em relação ao que o Crafty mantém internamente. <ctime> é o tempo (em minutos ou no formato hh:mm) queo o Crafty tem até o próximo controle de tempo, e <otime> é o tempo restante no relógio do oponente. Este comando pode ser usado a qualquer momento, mas irá afetar somente o tempo por lance após o Crafty fazer o lance atual e começar a pensar sobre o que o oponente poderá fazer a seguir.

computer
Este comando normalmente vem do xboard/winboard, mas pode ser usado a qualquer momento para informar ao Crafty que está jogando com um computador. Isto irá evitar que certas coisas aconteçam, como um escore de empate que varie, bem como irá ajustar o código de seleção de livro para ser mais seletivo no que irá jogar.

display
Este comando é usado para apresentar o tabuleiro. Este tabuleiro é apresentado usando o estilo #1 do ICS para display ASCII, com as brancas sempre na parte de baixo da tela, e as pretas em cima. Muito impraticável para jogar uma partida, mas bom para verificar uma posição após a mesma ter sido configurada.

Este comando também é usado para apresentar as várias peças/casas, escrevendo "display <piece>" onde <piece> é substituído por pawn (peão), knight (cavalo), bishop (bispo), rook (torre), queen (dama), ou king (Rei). O tabuleiro é orientado da mesma forma que o tabuleiro apresentado com uma correspondência um-a-um entre as casas. Talvez útil por curiosidade, mas para nada mais. Estes valores não pdoem ser modificados pelo usuário.

A versão final deste comando é usada para controlar que tipo de saída será vista quando o crafty estiver executando. Atualmente as seguintes opções estão disponíveis:

display time
esta opção fará que o Crafty moster o tempo de cada lado após fazer um lance.

display changes
esta opção fará que o Crafty mostre o PV cada vez que o mesmo mudar durante a pesquisa, incluindo quando um lance falha ou torna-se o novo melhor lance.

display variation
esta opção fará que o Crafty apresente o PV ao fim de cada iteração, mas ele irá mostra apenas a melhor PV para toda a iteração, não todas as alterações.

display stats
esta opção permite várias estatísticas básicas da pesquisa, incluindo tempo, nós, e assim por diante.

display extstats
esta opção permite o uso de estatísticas extendidas de pesquisa, incluindo estatísticas de hashing, estatísticas de pesquisas extendidas, e assim por diante.

display movenum
faz com que toda saída PV tenha números de lances dentro delas para tornar o PV possivelmente mais fácil de ler. Isto faz que o PV pareça com algo assim: 12. ... Nxe4 13. Bxe4 h6 em vez de simplesmente Nxe4 Bxe4 h6. É bastante útil quando estiver jogando em um servidor e "cochichando" ou "sapeando" análises. Também é útil quando o Crafty é executado de dentro de um programa de banco de dados, já que o número dos lances estarão sincronizados com o jogo.

display moves
irá mostrar cada lance raiz conforme é pesquisado, além de atualizar o tempo de pesquisa na parte de baixo da tela, de forma que possa-se ver qual lance está sendo analisado atualmente.

display general
irá apresentar mensagens gerais de informação sempre que o Crafty quizer informar alguma coisa (como "clearing hash tables" ou outras coisas como "Mate in n moves").

Se for colocado um "no" em frente de qualquer destas opções, a mesma irá desabilitar aquele tipo particular de saída.

draw
Oferece empate ao Crafty. O mesmo geralmente irá examinar o valor retornado pela última pequisa, e comparar com o valor retornado pela função interna DrawScore(). Se o valor de pesquisa não for maior que este resultado, então o Crafty irá aceitar a oferta de empate. Se o valor de pesquisa for acima do valor teórico de um empate, o Crafty irá recusar o empate. Note que o Crafty irá oferecer empate baseado em análises internas. Quando ele oferece um empate, você pode responder com "draw" apesar do jogo realmente não terminar enquanto você não sair do Crafty.

drawscore N
Muda o escore do empate (ou fator de rejeição) para N. Se você quer que o Crafty evite empates, passe este número para um valor negativo. Por exemplo, -50 diz que uma repetição (empate) é o mesmo que estar 1/2 peão atrás. Configurar ele para +100 fará com que ele tente de todas as formas empatar, pois vai lhe parecer que estará ganhando um peão quando estiver fazendo isto. Note que é perigoso (de qualquer forma) deixar como -50, por que um final de Rei e Peão é muito provavelmente uma derrota... e a repetição é melhor.

echo <text>
Este comando é normalmente usado em um arquivo de comandos que será usado para "alimentar" o Crafty com algumas posições para análise ou algo assim. Como o Crafty depende do sistema operacional para mostrar os comandos à medida que são executados, os comandos lidos de um arquivo são "invisíveis". Este comando dá ao usuário a capacidade de inserir comandos em um arquivo destes de forma que o Crafty mostre uma mensagem na tela para dar uma idéia de onde ele está no processamento do arquivo.

edit
Este comando foi "clonado" do GnuChess para fornecer uma interface com o Xboard. Após entrar o comando "edit", você vai estar no modo "edit.white", onde qualquer combinação de peças/casas que for entrada irá acrescentar a peça indicada na casa informada. A combinação peça/casa é informada, por exemplo, como "qa3", ou "bc4". Estas combinações colocam uma dama branca em a3 e um bispo branco em c4. Uma vez que todas as peças brancas sejam informadas, entrar um "c" muda para o modo "edit.black", onde as combinações peça/casa são agora para as peças pretas. Escrever um caracter "." sai do modo de edição. Para limpar o tabuleiro inicial, use o caracter "#".

Aqui está um exemplo para configurar a posição inicial original, após as brancas terem jogado 1.e4, mas nenhum outro lance foi feito.

  edit
  #
  ra1 nb1 bc1 qd1 ke1 bf1 ng1 rh1
  pa2 pb2 pc2 pd2 pe4 pf2 pg2 ph2
  c
  ra8 nb8 bc8 qd8 ke8 bf8 ng8 rh8
  pa7 pb7 pc7 pd7 pe7 pf7 pg7 ph7
  .

Note que a entrada é em formato livre, assim, as peças/casas podem ser entradas uma por linha ou todas em uma linha. O mesmo para os caracteres especiais #, c, e .. Note também que não há forma de informar o estado de roque aqui. É muito melhor usar o comando "setboard" que usa uma sintaxe semelhante à FEN e permite que se informe a situação dos dois roques e da tomada /en passant/.

egtb
Este comando habilita o uso de bancos de dados de finais. O Crafty irá usar o diretório "tbpath" (se for fornecido) para localizar e registrar todos os bancos de dados que foram copiados. Ele irá reportar a maior classe encontrada, com em "5 piece tablebase files found" se você fizer o download de pelo menos um arquivo de 5 peças. Se você usar este comando para habilitar bancos de dados, também deve considerar usar o comando "cache" para especificar o tamanho de cache egtb.

end|quit
Estes comandos são usados para terminar o Crafty. Note que pode-se retornar a um jogo mais tarde sem precisar fazer o replay dos lances, iniciando o Crafty com o comando "crafty c". Ele irá imediatamente ler os lances do último jogo, mas você terá de acertar os controles de tempo e o tempo restante você mesmo.

evaluation option <value>
Este comando é usado para modificar os escores de avaliação.

A opção "asymmetry" é usada para fazer com que o Crafty avalie a segurança do Rei de forma diferente para cada lado. "evaluation asymmetry 25" irá aumentar os escores de segurança do rei somente para o oponente, significando que ele dará menos atenção à segurança do seu próprio Rei do que à do seu oponente. Isto fará com que jogue mais agressivamente. "`evaluation asymmetry -25`" irá reduzir o escore de segurança do Rei para o oponente em 25%, fazendo com que tome mais cuidado sobre a segurança do próprio Rei que do seu oponente. Isto fará com que jogue mais defensivamente.

A opção "bscale" irá ajustar os escores dos peões bloqueados. O valor padrão é 100. Aumentar este valor fará com que o Crafty goste menos ainda de posições com peões bloqueados, o que irá levar a posições mais abertas. Note que isto irá afetar os lances somente depois que o livro de aberturas tiver sido seguido, o que significa que a posição pode estar bloqueada antes que o termo da avaliação tenha alguma chance de afetar o jogo.

A opção "kscale" irá ajustar todos os escores de segurança do rei baseado no 'valor' entrado. Por exemplo, "evaluation kscale 50" irá reduzir todos os escores de segurança do Rei para 50% do seu valor normal. "`evaluation kscale 133`" irá aumentar todos os escores de segurança do Rei para 133% do seu valor normal.

A opção "tropism" é usada para mudar os escores de tropismo do Rei. Isto irá atrair as peças em direção aos Reis. Um valor de 100 significa não alterar. Outros valores são tratados como uma porcentagem (como uma escala) para aumentar (>100) ou diminuir (<100) os escores de tropismo do Rei.

Quando você usa este comando, verá algo assim:

  modified king-safety values:
  white: 0 4 16 26 39 45 58 77 87 90 93 96 100 103 106 109
      112 116 119 122 125 128 128 128 128 128 128 128 128 128 128 128
  
  black: 0 5 20 32 48 56 72 96 108 112 116 120 124 128 132 136
      140 144 148 152 156 160 160 160 160 160 160 160 160 160 160 160

Estes valores repersentam a avaliação da segurança do Rei à medida que o Rei fica mais e mais exposto. Este é sempre baseado no quão rápido que "crafty" estará no lado que faz o lance quando a pesquisa inicia. Nos dados acima, era a vez das brancas fazerem o lance, significando que parece que o crafty irá jogar com as pretas. Note que os números de segurança do Rei branco sofreram uma modificação de escala de 20% para fazer com que o mesmo fique um pouco mais cuidadoso com o seu próprio Rei. Se você escrever "go" nesta posição, os escores serão revertidos, já que os escores do Crafty sempre são deixados sozinhos (com a opção asymmetry) e os escores do oponente são escalados para baixo, como indicado.

Você verá números similares (mas não conjuntos preto e branco) que representam os escores atuais produzidos pelo tropismo do Rei. Note que as peças interagem para escolher qual elemento deste vetor é usado, mas, em geral, quanto mais peças estão próximas do Rei, maior é o elemento deste array.

A opção "pscale" é usada para colocar uma escala no escore da estrutura de peões da mesma forma que outras opções de escala. 100 é o valor padrão. Valores menores que 100 irão reduzir este termo, e valores maiores que 100 irão aumentar os mesmos.

A opção "ppscale" é usada para colocar uma escala no escore dos peões passados da mesma forma que as outras opções de escala. 100 é o valor padrão. Valores inferiores a 100 irão reduzir este termo, valores superiores a 100 irão inflacionar o mesmo. Este fator afeta principalmente peões passaos e peões passados protegidos. O escore normal de peões computa o valor de um peão passado. Este termo é então usado para fazer escala dos termos que modificam este valor, como dois peões passados conectados na 6a, ou um peão passado com o suporte do Rei em um final.

extensions type value
Este comando é usado para controlar a profundidade das várias extensões feitas na pesquisa do Crafty. Estas extensões são dadas como números decimais que representam plies (ou frações de plies) para extender para cada razão em particular. Os valores em geral são padrão 1.0 e 0.75, mas qualquer valor pode ser usado. Note que valores > 1.0 são muito perigosos já que podem fazer com que a pesquisa se torne não-terminante (o Crafty irá parar quando terminar o tempo do lance, mas ele pode não conseguir qualquer coisa útil a partir desta pesquisa).

Estas extensões estão atualmente limitadas ao máximo de uma ply de extensões em qualquer ponto da árvore. Ou seja, não importa quais os valores que você escolhe, eles não podem exceder uma ply atualmente.

incheck - Este é o total a extender quando o lado a fazer lances faz um lance que deixa o oponente em xeque. Note que o Crafty extende no ply quando o xeque é feito, não na próxima ply onde o lado oponente está em xeque.

onerep - Esta é a extensão 'uma-resposta-ao-xeque', e é feita no ponto em que um lado está em xeque e tem exatamente um lance legal para escapar do xeque.

pushpp - Esta é a extensão usada para avançar certos peões passados no final do jogo.

recapture - Esta é a extensão recapture, e é aplicada quando o lance atual recaptura uma peça de valor iqual aquela que fez uma captura no ply anterior. Por exemplo, BxN, PxB. Note que isto só pode ser aplicado uma vez a cada duas plias, de forma que BxN, BxB, NxB, NxN não é visto como três recapturas.

mate - Esta é a extensão de ameaça de mate e é aplicada quando uma pesquisa de lance nulo retorna -MATED, que sifnifica que não fazer nada faz com que o lado que tem a vez fique em mate. O oponente deve ter alguma ameaça séria de mate nesta posição.

flag on|off
Este comando é usado para forçar o Crafty a terminar um jogo onde o oponente perdeu no relógio com o winboard/xboard (on) ou para ignorar isto (off) se desejado.

force [move]
Este comando é usado para forçar o Crafty a jogar um lance que é diferente do que foi escolhido e jogado pela àrvore de pesquisa. Se [move] é informado, e é um lance legal, o Crafty irá desfazer o seu último lance e fazer este lance. Isto não muda o lado que tem de jogar, mas muda a posição do tabuleiro, obviamente. Se [move] não for informado, o Crafty irá pedir a você por um lance a ser jogado.

help
Este comando apresenta várias páginas de ajuda de uma linha por comando, um comando por linha. Se uma linha termina com [help], então você pode usar o comando help seguido pelo comando específico para obter ajuda mais detalhada.

history
Este comando apresenta o histórico em uma coluna vertical com um lance para as brancas e um para as pretas por linha. Existem outras formas de mostrar os lances atuais do jogo e também salvá-los em arquivos que são explicadas mais adiante.

hash=x e hashp=x
Estes comandos são usados para ajustar o tamanho das tabelas de hash no Crafty. hash modifica o tamanho da tabela de transposição/refutação, enquanto que hashp modifica o tamanho da tabela de has de estrutura de peões/segurança do Rei. Os tamanhos podem ser informados como um dos seguintes tipos de valores: nnnK, onde nnn é um inteiro indicando quantos Kbytes o Crafty deve usar para sua tabela de hash; nnnM, onde nnn é um inteiro indicando quantos Mbytes o Crafty deve usar.

A tabela de transposição/refutação é a mais crítica das duas, por que ela afeta diretamente a eficiência das buscas, particularmente nos finais. Por esta razão ela deve ser maximizada. O tamanho mais efetivo para esta tabela é 3/4 de sua memória disponível. Se você não sabe como descobrir este valor, mas sabe que tem 16 Mbytes, por exemplo, então você pode usar hash=16M que o Crafty irá arredondar a mesma para 12M, que é 3/4 de um tamanho de potência de dois. Se você estudar os tamanhos possíveis, vai encontrar que 3M, 6M, 12M, 24M, 48M, e assim por diante. Qualquer coisa até, mas não incluindo, o próximo tamanho será arredondado para o valor menor seguinte. hashp deve ser configurado para aproximadamente 1/2 do que sobrar. Por exemplo, o P6 Crafty, quando está jogando no ICC, geralmente usa hash=48M e hashp=8M. A única coisa a cuidar é que se você escolher valores muito grandes, particularmente sob o Windows, a performance vai cair bastante, por causa do overhead de E/S da paginação. Quando o Crafty está examinando uma posição normal (não é do livro de aberturas, e nem do banco de dados de finais), a luz do disco rígido não deve ligar, o que indicaria muita atividade de E/S.

Não há o perigo de fazer esta tabela muito grande, apesar de você ter que cuidar por que se o Crafty mal cabe na memória, fazer qualquer outra coisa na memória fará que o Crafty seja passado completa ou parcialmente para disco ("swapped"), dependendo do sistema operacional em uso. Se você pretende usar a máquina para outra coisa enquanto o Crafty estiver sendo executar, é melhor "fazer de conta" que a máquina só tem metade da memória que realmente tem, quando estiver computando o tamanho das tabelas de has que pretendes usar.

import <filename> [clear]
Este comando é usado para importar qualquer tipo de dado de aprendizado que o Crafty suporte, o que atualmente inclui dados de aprendizagem de livros e dados de aprendizagem de posição. Este comando lê o arquivo <filename> e importa o dado aprendido, da mesma forma que o Crafty teria aprendido jogando as partidas. A opção [clear], se especificada, fará que todos os resultados aprendidos sejam liberados anes da operação de importação, caso contrário os dados importados são simplesmente acrescentado para o que já existe.

input <filename>
Este comando é usado para redirecionar a stream de entrada de E/S de console do teclado para um arquivo. O Crafty irá ler então os comandos daquele arquivo, em vez do teclado, e executálos como se tivessem sido digitados. Este tipo de arquivo de comandos deve terminar com um comando "exit" (sem as aspas) como o último comando do arquivo. Isto fará que a stream de entrada seja retornada para o teclado, e pede por um outro comando ou lance.

Este comando deve ser usado para configurar o Crafty para algum controle de tempo específico, colocando os comandos de controle de tempo apropriados no arquivo, ou para personalizar os tamanhos de tabela de hash conforme necessário.

info
Este comando é usado para mostrar informações sobre o Crafty e o jogo atual. Coisas como o controle de tempo, o tempo que resta nos relógios, e outras informações é apresentada.

learn n
Controla as funcionalidade de aprendizado do Crafty. Atualmente, esta é uma chave booleana de 3 bits, onde o bit 1 (001) controla o aprendizado de livros, o bit 2 (010) controla o aprendizado de posições, e o bit 3 (100) controla o aprendizado de resultados. learn=0 desabilita todo o aprendizado, learn=1 habilita somente o aprendizado de livros, learn=2 habilita somente o aprendizado de posições, e learn=4 habilita o aprendizado de resultados. Some estes valores para habilitar mais de um tipo de aprendizado (o default 7 habilita tudo).

level <m> <t> <inc>
Este comando foi copiado direto do GnuChess de forma que a interface Xboard/WinBoard irá funcionar com o Crafty. Existem outras formas melhores de configurar o relógio, mas esta é bem conhecida. Os três parâmetros são <m> número de lances no jogo, <t> tempo inicial do relógio. Após <m> lances serem feitos, esta quantia de tempo é acrescetnada ao relógio novamente. <inc> é o incremento Fischer-Clock que é acrescentado a cada relógio após um lance ter sido feito. Ele pode ser zero para um jogo sem incremento.

Exemplos:

  level 0 5 0     (jogo ICS 5 0)
  level 0 5 3     (jogo ICS 5 3)
  level 0 15 30   (jogo ICS 15 30)

list GM|IM|C|AK|S +name [+name ...] -name [-name ...]
Este comando é usado para manter as "listas" internas que o Crafty usa para auto-configurar-se quando está jogando em um servidor de xadrez. Existem três listas, GM, IM e C. Se o oponente do Crafty está em alguma destas listas, o Crafty ajusta os controles internos que afetam como/quando ele abandona ou oferece empate, e a aleatoriedade com que ele irá escolher lances do livro de aberturas. Por exemplo, o Crafty abandona muito mais cedo contra um GM, por que ele assume que ele sabe como ganhar um final com uma Torre de vantagem, não importando quanto tempo há. Pela mesma informação, quando estiver jogando contra um computador, o Crafty sempre irá assumir que um empate é 0.000, de forma que ele não irá estragar sua posição tentando evitar uma posição repetida.

A lista AK irá automaticamente espiar escores/PV se o oponente está na lista. A lista S irá ligar o escore especial para oponentes nesta lista. O único membro atual é "mercilous".

A sintaxe +name1 +name2 simplesmente acrescenta estes jogadores à lista especificada. Para remover um nome, use -name1 -name2. Você pode usar um comando por nome para remover ou acrescentar, ou você pode usar um comando para acrescentar e remover múltiplos nomes. Note que todos os nomes devem ser informados em caracteres minúsculas, o uso de qualquer caracter maiúsculo irá prejudicar o algoritmo de pesquisa.

log off|on|<n>
Este comando é usado para desabilitar o log. O padrão é log on, o que faz que o crafty produza um novo arquivo log.nnn para cada partida jogada. Se você está rodando o Crafty em um servidor, você deve usar log off, que desabilita a criação destes arquivos bem como os arquivos game.nnn usados para reiniciar um ogo após você sair do Crafty e retornar mais tarde. Se você usar a forma "log n", o Crafty irá simplesmente mostrar as últimas n linhas do log na tela. Se você usar "log n file", o Crafty irá copiar as últimas n linhas do log para o arquivo "file" que pode estar no seu disco rígido, ou em um disquete.

Note que se você estiver rodando o Crafty com log off, você não vai poder descobrir o que o Crafty estava pensando já que ele não vai ter outro registro do jogo. Você sempre verá um arquivo game.001 por que, conforme o Crafty joga uma partida, este arquivo contém todos os lances jogados, de forma que você pode fazer um backup do mesmo se necessário. Você também irá ver um arquivo log.001, mas ele estará vazio.

ls <filename>
Irá listar todos os arquivos que combinam com a máscara filename (os caracteres coringa dependem do sistema que você estiver usando, mas geralmente * e ? funcionarão bem). Você também pode fornecer informações de diretório em filename se você deseja listar o conteúdo de um diretório diferente. Use a mesma sintaxe que você usaria se estivesse usando o comando "ls" no Unix ou o comando "dir" no Windows.

mode tournament|normal
Este comando é usado principalmente para colocar o Crafty no modo "torneio", que foi criado para quando o Crafty estiver jogando em eventos de xadrez de computador. Ele faz duas coisa: (1) faz com que todos os empates retornem um escore de 0.000, e (2) faz que o Crafty envie uma mensagem após cada lance, mostrando seu relógio de xadrez interno, e solicitando que o operador verifique e ajuste conforme necessário usando o comando "clock". Isto faz com que o Crafty esteja de acordo com as regras de xadrez de computador que dizem que o operador não pode fazer nada que não seja especificamente solicitado pelo programa.

name <name>
Este comando é específico para jogos ICS. O Xboard/WinBoard usam este para informar o Crafty do nome do seu oponente. O Crafty usa o nome, procura nas suas listas de GM/IM/C, e, se for encontrado, faz os ajustes de acordo. Este comando não é usado pelo código PGN e não fará que o jogador <name> apareça na seção de tags PGN.

new
Este comando apaga tudo e começa um jogo novo. Ele fecha o velho arquivo log e game, e abre o próximo arquivo na seqüência numérica. Ele também reinicia o jogo para o início e prepara-se para inciar um novo jogo. Este comando foi acrescentado para o Xboard, mas o Xboard não usa o mesmo, em vez disto, ele reinicia o Crafty para cada novo jogo, terminando primeiro a cópia antiga e então iniciando uma nova. Não é tão eficiente quanto usar o "new", mas é mais seguro já que o programa não pode ter certeza de reiniciar tudo para o estado inicial.

noise <n>
Este comando altera o nível de "ruído" do Crafty. Basicamente, até que <n> nós tenham sido examinados, o Crafty ficará quieto e não irá apresentar a análise.

Isto é útil de duas formas. Primeiro, em finais, mais de 20 ply de pesquisas não são incomuns, e a análise para as primeiras plies chegam tão rapidamente que são um distrativo. Segundo, quando observando jogos (nova interface, somente) em servidores ICS, isto pode ser usado para evitar que o Crafty gere muitas análises paralelas. Um valor de 100.000 irá basicamente retirar toda a saída para o primeiro segundo ou em torno (em um P6/200). De forma similar, 1.000.000 irá eliminar qualquer saída por cerca dos 10 primeiros segundos. Quando estiver examinando jogos como os jogos do Campeonato Mundial no ICC, eu geralmente uso 5.000.000, que é quase um minuto de silêncio, de forma que as primeiras PV que ele aponta já são de uma pesquisa bem profunda.

noise 0 fará que toda a análise seja apresentada, o que não causa problemas em máquinas rápidas. Em uma máquina mais lenta, ou em uma conexão lenta no telefone, isto pode causar um grande backlog de comunicação. O padrão é mais ou menos um segundo em um P6/200 (100.000), mas pode ser modificado por este comando.

operator <n>
Outro comando feito para ser usado quando o Crafty está jogando em um torneio, operado por um humano. Este comando informa ao Crafty para "esconder" <n> minutos de tempo e não usá-los. Este tempo é basicamente alocado ao operador para dar conta do tempo que ele leva para escrever lances e/ou corrigir erros. Em eventos do WMCCC, o valor normal que usamos é 5. Ao jogar em um servidor, este comando não é necessário, e também não é necessário se você estiver jogando com o Crafty sozinho.

perf
Este comando é usado primariamente para otimizar o Crafty, ou para testar a velocidade do gerador de lances e o MakeMove()/UnMakeMove() em diferentes plataformas. Ele produz dois resultados, o número de lances que pode gerar por segundo, e os lances que pode gerar e fazer/desfazer por segundo. Apesar de não ser um indicador perfeito de performance, ele dá uma "aproximação" do quão rápido o Crafty pode ser executado. Em geral, quanto maiores os números, melhor o programa irá jogar, apesar que as máquinas certamente são diferentes. Não é incomum encontrar uma máquina que faz pesquisas mais lentas que outra, mas que tem um valor "perf" maior.

perft <depth>
Este comando é geralmente utilizado para confirmar que o gerador de lances e o operador de bitmap estão funcionando bem. Ele simplesmente pega a posição atual, e gera/faz/desfaz lances e conta os mesmos. Muitos programas usam este comando com uma posição "padrão" para certificar-se que o gerador de lances não deixa de fazer lances incomuns como tomadas //en passant// e promoções e também para confirmar que os códigos de fazer/desfazer lances atualiza corretamente o tabuleiro de forma que os totais permanecem constantes para diferentes máquinas e programas, desde que não há alpha/beta ou avaliações sendo feito. Se <depth> é maior que 5 ou 6, o programa vai levar muito tempo, já que se trata basicamente de uma travessia minimax de árvore que irá visitar todos os nós dentro do horizonte <depth> de pesquisa.

pgn <tag> <value>
Este comando é usado para colocar valores com algum significado nas tags PGN. As tags reconhecidas são Event, Site, Round, Date, White, WhiteElo, Black, BlackElo, e Result, e as tags são sensíveis a maiúsculas/minúsculas (Event é reconhecida, event não). <value> pode ser qualquer entrada válida, e espaços em branco e caracteres especiais são permitidos. Note que a data é especificada claramente no padrão PGN e deve ser yyyy.mm.dd, não admitindo variações. Resultados válidos são 1-0 (as brancas ganham), 0-1 (as pretas ganham), 1/2-1/2 (empate) e * (desconhecido). Alguns exemplos:
  pgn Event 14th World MicroComputer Chess Championship
  pgn Date 1996.10.8
  pgn Site Jakarta, Indonesia
  pgn Round 1
  pgn White Crafty
  pgn WhiteElo 2400
  pgn Black assassin
  pgn BlackElo 2400
  pgn Result 1-0

A configuração destes valores irá resultar em um arquivo PGN correto quando for usado o comando savegame. Note que se você usar o comando "read" para ler um jogo PGN, esets valores serão extraídos daquele jogo se forem informados.

ponder off|on|<move>
Este comando serve a duas finalidades. Primeiro, ele pode ser usado para desabilitar (off) ou habilitar (on) o cálculo de lances durante o tempo do oponente (ou ponderação como é chamado em muitos programas, incluindo o Crafty). Desabilitar o mesmo vai enfraquecer o Crafty, já que ele não vai usar qualquer tempo de máquina disponível enquanto estiver aguardando pelo lance do oponente. Às vezes é útil, entretanto, quando o Crafty estiver jogando contra outro computador e as máquinas não são iguais. Se o Crafty estiver em uma máquina mais rápida, e você tentar corrigir isto dando mais tempo ao oponente que ao Crafty, isto não irá funcionar como esperado, por que enquanto o oponente estiver pensando, o Crafty também estará, o que permitirá que o mesmo use o tempo extra do oponente de uma forma inesperada. Em casos assim, é melhor parar a ponderação nos dois programas.

Se <move> for informado, o Crafty usa aquele lance para fazer suas ponderações, em vez do lance resultante da última pesquisa. Este comando é geralmente usado para configura o lance certo para ponderação após o Crafty ter sido parado e reiniciado, assumindo que é a vez do oponente mover quando isto acontece. Cado contrário, é provavelmente melhor não tentar influenciar as coisas, apesar que se você estiver observando e subitamente pensar "o que o Crafty faria se o oponente jogasse o lance 'X'?", você pode responder isto simplesmente escrevendo "ponder X" e observando então a análise resultante. Você deve restabelecer o lance de ponderação correto após ter feito isto, é claro.

reset <n>
Este comando permite que você retorne para qualquer lance de sua escolha no jogo atual. reset <n> retorna o jogo para o lance <n> com o mesmo lado para fazer o lance. Se você quiser primeiro mudar o lado a efetuar o lance, use o comando white/black, então use o comando reset para voltar para o lance desejado. Note que você pode também avançar, desde que existem lances no histórico do jogo atual.

resign <n>
Este comando muda o treshold do abandono. Quando estou jogando no ICC eu tipicamente uso "resign 9" o que fará que o Crafty desista cerca de 5 lances depois do escore ficar abaixo de -9.000. Para IMs eu mudo este valor para 6, e para GMs eu geralmente uso 3, de forma que ele irá desistir rapidamente e não irá arrastar um jogo perdido desnecessariamente.

read/reada [<filename>]
Este comando lerá a entrada, e extrairá os lances de xadrez, e usará os mesmos para montar a posição no fim do jogo. Ele primeiro reinicia o tabuleiro para a posição inicial (somente para o comando read) e então irá extrair as tags PGN (se houverem) da entrada. O resto da entrada é analisado atrás de lances de xadrez (comentários e coisas assim são excluidas automaticamente) e os lances são feitos e acrescentados ao histórico do jogo. Uma vez isto feito, você pode retornar, avançar, ou jogar a partir de qualquer ponto no jogo. Se você especificar um arquivo <filename> tudo é lido daquele arquivo, caso contrário é lido do teclado do console.

O comando reada lê lances, mas acrescenta os mesmos ao histórico de lances do jogo/posição atual em vez de reiniciar o tabuleiro para a posição inicial. Isto permite que você leia um jogo, então use o comando reada para acrescentar alguns lances e ver a posição resultante.

savegame <filename>
Este comando é usado para salvar o jogo atual em um arquivo PGN com as tags PGN incluídas. Note que os valores padrão das TAG podem não ser o que você quer se você não usar o comando pgn para mudá-las ou então usar um arquivo PGN com as tags já preenchidas.

Esteja avisado que este comando não checa o nome do arquivo para ver se é um nome legal, já que qualquer coisa pode ser usada no UNIX. No DOS, você pode produzir um nome de arquivo errado com muitos caracteres, muitos pontos, ou o que for, portanto, seja cuidadoso com o nome que escolhe. Note também que este arquivo será sobrescrito se ele já existir, então cuide para escolher um nome que não seja o nome de um arquivo que tenha alguma coisa que você considere importante.

savepos <filename>
Este comando escreve uma única linha em <filename> em uma notação semelhante à FEN. Isto permite que você salve uma posição, e retorne à mesma mais tarde para reexaminá-la. Você deve usar o comando "in <filename>" para ler este arquivo e configurar a posição.

search <move>
Este comando permite que você especifique um lance particular para o lado que vai fazer o lance, e então quando você disser ao Crafty para pesquisar esta posição, este é o único lance que será examinado. Ista funcionalidade é usada internamente pelo comando annotate, mas pode ser usado para investigar um lance específico. Se o lance não é o melhor lance, uma pesquisa normal não irá mostrar por quê ele é ruim, mas esta irá. Ela também é um pouco rápida já que os outros lances na posição não são examinados.

settc <moves> <ctime> <otime>
Este comando é usado principalmente em torneios, e é um comando de recuperação de erros. Se a máquina sofre uma falha e o arquivo de histórico do jogo é corrompido, frequentemente o operador tem simplesmente que configurar a posição usando o comando setboard, e então usa o comando settc para restaurar os valores de controle de tempo. <moves> é o número de lances até o próximo controle de tempo (da perspectiva do Crafty, seja cuidadoso e não olhe os lances do oponente que faltame para controle de tempo por acidente). <ctime> é a quantidade de minutos no relógio do Crafty, e <otime> os minutos que que faltam no relógio do oponente.

setboard <FEN input>
Este comando é usado para configurar uma posição de xadrez para análise e é a forma preferida de fazer isto, em vez de usar a interface EDIT gnu. Ele usa uma notação semelhante à Forsythe para codificar a posição e tem também previsão para o status de roque e captura en passant.

Os códigos padrão das peças p, n, b, r, q e k (peão, cavalo, bispo, torre, dama e rei) são usados para denotar o tipo da peça em uma casa, maiúsculas e minúsculas são usadas para indicar a cor da peça (maiúsculas para peças brancas, minúsculas para peças pretas).

As peças são informadas a partir da orientação clássica para diagrams de xadrez, com a8 sendo o canto superior esquerdo do tabuleiro, e esta casa é informada primeiro, seguido pelo restante da oitava linha, da esquerda para a direita. Para indicar casas vazias, usa-se um número de 1 a 8 para indicar quantas casas adjacentes esão vazias, usa-se / para terminar cada linha após todas as peças daquela linha terem sido informadas. Note que não é necessário informar todas as 8 casas em uma dada linha, apesar de muitos conjuntos de testes fazerem isto para claridade.

A seguinte entrada irá configurar a posição do tabuleiro que é dada abaixo:

  k2r/ppp////Q/5PPP/7K/ b

Este diagrama usa a notação em que k representa um rei branco, e -q representa uma dama preta.

  -k  *  * -r  *  *  *  *
  -p -p -p  *  *  *  *  *
   *  *  *  *  *  *  *  *
   *  *  *  *  *  *  *  *
   *  *  *  *  *  *  *  *
   q  *  *  *  *  *  *  *
   *  *  *  *  *  p  p  p
   *  *  *  *  *  *  *  k

O campo após o último "/" deve ser b ou w para indicar que este lado tem a vez. Após este campo do lado que tem a vez qualquer um dos caracteres seguintes pode aparecer para indicar o seguinte: KQ: as brancas podem fazer o roque menor e maior; kq: o mesmo para as pretas; a1-h8: indicando a casa ocupada por um peão que pode ser tomado en passant.

score
Este comando simplesmente dá o escore posicional para a posição atual. O escore está na perspectiva das brancas, assim um escore + é bom para as brancas, e um escore - é bom para as pretas. O Crafty também divide o escore em duas grandes categorias (do Evaluate()) para indicar coisas como a estrutura de peões, avaliação das peças, peões passados, desenvolvimento, e assim por diante. Note que algumas das avaliações do Crafty são assimétricas, assim se você simplesmente mudar o lado ativo com o comando white/black e então usar o comando "score" novamente, pode obter um valor diferente. Isto não é um bug. :)

sd <n>
Este comando permite que você especifique um limite de profundidade de pesquisa que o Crafty não pode exceder. Ele ainda presta atenção ao relógio, entratanto, então freqüentemente você usará o comando st <n> (abaixo) em conjunto com este se a pesquisa estiver tomando muito tempo. <n> é a profundidade (em plies ou 1/2 jogadas) que a pesquisa deve atingir. Note que se o Crafty estiver ponderando, ele ainda vai horar estes limites e irá parar uma pesquisa de ponderação após esta profundidade ter sido completada também. Esta não é a forma de fazer o Crafty jogar de forma mais fraca, mas a que será coberta em uma outra seção deste documento.

show <category>
Este comando força o Crafty a apresentar informações adicionais sobre certas ações que ele toma. Atualmente a única <category> é "book" que fará que o crafty mostre informações sobre todos os lances de livro que ele encontrar no banco de dados. Mais informações são dadas na seção BOOK mais tarde neste arquivo.

smpmt=n
Este comando é usado para mudar o número de threads usadas em uma máquina com mais de um processador. Para uma performance ótima, "n" deve ser configurado para o número de processadores que você tem, apesar que usar menos irá reduzir a carga em sua máquina. Para este comando funcionar, o Crafty deve ser compilado com SMP definida. Quando compilado com SMP habilitado, mt=0 efetivamente desabilita completamente o código SMP.

Este comando também tem dois outros que são relacionados de perto, smpmin e smpmax. Os dois aceitam argumentos numéricos simples. O smpmin é usado para controlar a profundidade mínima da árvore exigida de um nó para que o mesmo seja considerado um candidato para pesquisa paralela. Por exemplo, smpmin 2 diz que não deve ser criada uma thread a menos que pelo menos duas plies a mais são deixadas para pesquisa abaixo do nó atual. smpmax configura o máximo para a mesma idéia, assim, smpmax 10 diz que não deve ser feita uma thread se mais de 10 plies restam abaixo deste nó.

sn <n>
Este comando é similar ao comando sd, mas, em vez de configurar uma profundidade de pesquisa específica, ele configura o número de nós a pesquisar. Uma vez que a pesquisa tenha atingido este número de nós (+ talvez um segundo a mais de pesquisa para verificar o tempo) a pesquisa terminará.

st <n>
Este comando permite que se especifique um limite de tempo de epesquisa para o Crafty. Novamente, esta não é a forma preferida de configurar um tempo por lance, por que este tempo é absoluto, e o Crafty nunca irá ultrapassar este limite, mesmo se ele perceber que está perdendo ou levando mate. Configurar o controle de tempo com o comando usual "time" ou "level" é muito melhor. <time> é informado em segundos, apesar de também poder ser entrado como mm:ss se for preferido.

swindle on|off
Este comando dá a você controle sobre o "modo swindle" ("modo trapaça"). Quando ativo, e estiver em um jogo, o Crafty vai tentar ganhar finais empatados (de acordo com as tablebases) se ele tiver alguma chance de vitória (como KR contra KB, por exemplo). Isto vai colocar uma certa "resistência" em aceitar o empate, enquanto que quando este modo estiver desligado, será muito fácil empatar uma posição, uma vez que as tablebases disserem "empate". Este modo está automaticamente em "off" durante a análise ou quando estiver anotando um jogo, e só é usado quando se está realmente jogando uma partida contra um oponente. Se não houver tablebases então ele não tem efeito algum no jogo.

tags
Este comando irá simplesmente mostrar as tags PGN atuais (você pode editar as mesmas com os vários comandos PGN).

test <filename> [n]
Este comando irá executar um conjunto de posições (o arquivo deve estr no formato "Crafty", como explicado abaixo) e produzir um resumo de quantas ele conseguiu resolver corretamente, erradas, etc. Ele usa o tempo por lance que você configurar (tipicamente) com o comando st <n>. O parâmetro opcional [n] é o contador para a "saída antecipada". Se o Crafty encontra, e guarda o lance solução por n iterações, ele irá terminar a pesquisa. Eu uso isto para que uma vitória no xadrez leve menos que 15 minutos, mesmo que o tempo de análise por posição seja 1 minuto, configurando n para 2. Após duas iterações corretas, o Crafty vai para o próximo problema. Para resultados absolutamente corretos, não é aconselhável usar esta opção, já que ele pode obviamente mudar de idéia mais adiante, para para fazer análises, este comando economiza muito tempo.

O conjunto de teste contém as seguintes linhas (este é um exemplo do meu conjunto de tesdes para Win At Chess):

  title wac299
  setboard 1n2rr2/1pk3pp/pNn2p2/2N1p3/8/6P1/PP2PPKP/2RR4 w
  solution Nca4
  
  title wac300
  setboard b2b1r1k/3R1ppp/4qP2/4p1PQ/4P3/5B2/4N1K1/8 w
  solution g6
  
  end

O comando title simplesmente mostra esta mensagem no arquivo de log, assim você pode olhar a saída e saber qual posição está sendo analisada. É opcional, mas bastante útil.

O comando setboard configura a posição do tabuleiro, como foi explicado antes.

O comando solution informa o conjunto de lances solução (um ou mais lances que são separados por espaços em branco) e/ou um conjunto de lances "anti-solução" (lances que não devem ser jogados para que a posição seja considerada correta). Lances "anti-solução" são simplesmente seguidos por um caracter "?", como, por exemplo:

  solution Bxa7?

O comando solution simplesmente fornece um conjunto de lances-chave, e então inicia a pesquisa. Se, após a pesquisa terminar, um dos lances-chave solução for escolhido (ou um dos lances anti-solução for escolhido) a posição é contada como correta.

A linha final deve ser "end", apesar de que um fim de arquivo ou EOF ter sido detectado neste caso.

time CPU|elapsed|<values>
Este comando controla se o programa usará o relógio da CPU ou um outro relógio para controle de tempo. Para jogos em torneios, é mais seguro usar um relógio externo, para testes pode ser mais consistente usar o controle de tempo da CPU se a máquina for usada para outras coisas concorrentemente com o teste sendo feito.

O comando time também é usado para configurar os controles básicos de tempo de pesquisa. A forma geral deste comando é como segue:

  time nmoves/ntime/[nmoves/ntime]/[increment]

Onde nmoves/ntime representa o tradicional primeiro controle de tempo onde nmoves é um inteiro representando o número de lances e ntime é o tempo total permitido para estes lances. O nmoves/ntime opcional é um controle de tempo secundário tradicional. E increment é uma funcionalidade relacionada com o jogo no ICS e emula o relógio Fischer, onde <increment> é acrescentado ao tempo remanescente cada vez que é feito um lance.

Como uma alternativa, nmovespode ser "sd", o que representa um controle de tempo de morte súbita para o restante da partida jogada em ntime. O controle de tempo secundário opcional pode ser um controle de tempo de morte súbita, como no seguinte exemplo:

  time 60/30/sd/30

Este comando configura 60 lances em 30 minutos, e então um jogo de 30 minutos adicionais. Um incremento pode ser acrescentado se desejado.

Um exemplo final:

  time sd/15

Que é uma simples configuração de jogo/15. Este comando também pode ser usado para fazer a mesma função do comando "level". por exemplo, para configurar um jogo clássico ICS 2 12, o seguinte comando deve funcionar:

  time sd/2/12

trace <n>
Este comando é usado para fazer com que o Crafty mostre a árvore à medida que pesquisa uma posição. Devido à incrível velocidade em que este programa pode fazer a pesquias, entretanto, este comando é quase inútil, já que ele pode inundar qualquer driver de display conhecido e fazer as coisas rolarem com uma velocidade incrível.

Note também que este comando está normalmente desabilitado, por qeu o Crafty é geralmente compilado com a flag -DFAST, que remove o código de saída de trace da pesquisa, para que as coisas corram um pouco mais rápido. Você terá de recompilar sem o -DFAST se quiser usar esta opção. Sua utilidade é limitada, exceto para depuração, de qualquer forma.

usage <n>
É simplesmente uma forma de modificar o uso de tempo do Crafty para adaptar-se ao seu gosto. Você pode "sugerir" um limite de tempo com qualquer das opções discutidas anteriormente, mas se você suar qualquer coisa que não o comando "st", o Crafty vai fazer o possível para usar o tempo como você sugeriu, mas ele também antecipará que irá economizar algum tempo fazendo ponderações, etc., e será, portanto, mais agressivo quando tentar usar seu tempo. Se <n> for um inteiro positivo, será interpretado como uma percentagem, e o Crafty irá computar o limite de tempo que ele pensa ser apropriado para as configurações de relógio atuais, então aumentará este limite por esta porcentagem: 50 fará que ele tome 1.5 vezes mais tempo que o normal, -50 fará com que ele leve metade do tempo que normalmente levaria.

I Crafty ajusta internamente o uso baseado no tempo que sobrou, no tempo que sobrou para o oponente, e quão rápido ou lento o oponente está fazendo seus lances, etc. Modificações posteriores com este comando é perigoso, mas possível.

whisper/kibitz <n>
(N.T.: to whisper = cochichar, sugerir, to kibitz = dar palpites) Estes comandos são usados para controlar o que o Crafty irá sugerir ou dar como palpite em um servidor de xadrez. As opções são (1) somente cochichar ou dar palpites em anúncios de mate; (2) acrescentar tempo, escorte, profundidade para a opção anterior, mas sem PV ou lances; (3) acrescenta o PV; (4) acrescenta mais informações à saída. As duas opções restantes geram muita saída e devem ser usadas com cautela. (5) mostra o PV após completar cada iteração. Eu uso esta opção quando estou usando minha interface customizada para deixar o Crafty observar/comentar os jogos em progresso no ICC. O noise pode ser usado para evitar que pesquisas superficiais gerem saída, mantendo o "ruído" baixo nos jogos sendo observados. (6) basicamente irá colocar na tela tudo que se pode ver em uma pesquisa, cada PV quando for alterado, altos e baixos, etc. Uma quantia significativa de saída que deve ser avaliada cuidadosamente antes de deixar ele "solto".

xboard
Este comando coloca o Crafty no modo de compatibilidade com o Xboard/Winboard, e faz com que o Crafty se comporte parecido com o GnuChess. Ele é projetado para ser usado somente quando o Crafty estiver fazendo interface com o Xboard/WinBoard. O Crafty não irá funcionar com estas duas GUI sem esta opção, e não vai funcionar bem com esta opção se não estiver conectado a um deles.
Existem outros comandos que não são documentados. Eles fazem parte do protocolo xboard e não devem ser usados pelo usuário normal. Você pode encontrar todos os comandos no arquivo option.c se estiver interessado.

Configuração e Uso de Livro de Aberturas

O Crafty usa dois livros de aberturas pré-compilados, chamados "book.bin" e "books.bin".

O arquivo book.bin é usualmente construído a partir de um grande arquivo contendo jogos PGN, geralmente tomados de coleções de jogos de GM. A construção do book.bin é um exercício simples e não exige mais que o arquivo de dados brutos que será usado. Geralmente ele é ou o arquivo medium.zip ou o conjunto de quatro arquivos large[1-4].zip, todos armazenados na máquina FTP ftp.cis.uab.edu/pub/hyatt/.

Para criar o arquivo book.bin, você precisa de uma coleção PGN de jogos que seja um arquivo PGN real.

Supondo que o arquivo seja chamado "large.pgn", você vai usar o seguinte comando:

  book create large.pgn <m> [n] [wpct]

A única coisa que deve ser fornecida é <m>, um número indicando quantos lances de cada jogo devem ser armazenados no banco de dados book.bin. Eu uso tipicamente 60, que armazena os 60 primeiros lances de cada jogo. Aumentar este número aumenta levemente a probabilidade do Crafty ficar mais tempo no livrro, mas também aumenta a probabilidade que ele irá seguir um jogo por mais tempo, de forma que ele começa a atingir posições em que o lance jogado pode não ser o melhor lance, permitindo que ele caia em um buraco. Aumentar este número também aumenta o tamanho do banco de dados.

Você pode diminuir o tamanho do livro, e também reduzir o número de lances ruins especificando <n>, o que diz que a menos que um lance seja jogado em pelo menos n jogos, o lance é descartado. Isto irá diminuir substancialmente o tamanho do arquivo book.bin, e também irá eliminar lances que só aparecem em um jogo que geramente contém erros ou capivaradas significativas.

Você pode aumentar a qualidade das linhas do livro especificando <wpct>, que é a "percentagem de vitórias". Esta é especificada como uma percentagem de jogos perdidos, e é usada para descartar lances que levam principalmente à derrota. Um valor seguro é 50, que diz que se um lance de abertura em particular não ganha pelo menos 50% a mais de jogos que perde, o lance é descartado. Um valor de 100 significa que os lances são descartados se produzem mais derrotas que vitórias, e este é um critério realmente restrito.

Após criar book.bin, você precisa cria books.bin. Este é uma versão menor de book.bin, que tem o objetivo de dar mais controle sobre os lances/aberturas que o Crafty irá jogar. Ele é geralmente feito com o arquivo start.pgn na máquina FTP, mas você pode modificar este arquivo para atender às tuas preferências facilmente. Para construir o arquivo books.bin, use o seguinte comando:

  books create start.pgn 60

Novamente, 60 é o valor que eu uso, mas nenhuma das minhas linhas no start.pgn chega a tantos lances. O ponto principal aquie é que no start.pgn, você pode acrescentar um "!" a qualquer lance desejado, e quando o Crafty vai fazer um lance com aquela cor, ele irá jogar a partir do conjunto de lances que tem um "!" se houver algum, ignorando o resto dos lances do livro. Se você quiser que ele jogue apenas 1. e4 com as brancas, basta entrar o seguinte jogo curto:

  [Crafty only plays 1. e4] 1. e4!

E está feito. Você pode entrar tantos quantos quiser. Se, por outro lado, existe algum lance que você não quer que o Crafty jogue, então coloque depois do mesmo um "?" e ele nunca irá jogar o mesmo. Os lances em books.bin que não estão anotados com "!" ou "?" não tem qualquer influência nas escolhas do Crafty.

A forma que os arquivos são usadas é esta: quando está examinando uma posição, o Crafty primeiro faz a enumeração do conjunto de lances que ele pode encontrar no banco de dados de aberturas. Ele então faz o mesmo para o banco de dados books.bin, e faz uma operação de "mesclagem" para combina as flags "?" e "!". O objetivo do arquivo books.bin é dar um pequeno banco de dados que você possa facilmente modificar, reconstruir, e repetir este processo de novo e de novo. Como leva uma fração de segundo para reconstruir completamente este arquivo, é muito fácil modificar o mesmo para controlar o que o Crafty irá jogar, sem ter que reconstruir um grande banco de dados.

Uma característica importante da entrada PGN é que a tag Result tem que ser especificada na maioria das linhas, por que o Crafty conta as vitórias, derrotas e empates para cada lance do livro e usa estas contagens com algumas das opções de seleção de livro dadas abaixo.

Como as Flags São Usadas

As flags ? e ! deve aparecer somente no arquivo books.bin, apesar de não ter razão para que elas não apareçam no arquivo maior também. Para esta discussão, isto não importa já que o Crafty usa os lances dos dois arquivos e "mescla" as flags/etc em uma entrada para cada lance.

De forma simples, se algum livro legal tem uma flag !, então o Crafty irá somente jogar lances do conjunto de lances que tem todos a flag !. Se um lance tem uma flag ?, então aquele lance é imediatamente removido do conjunto de lances possíveis do livro. Se o único lance legal do livro tem uma flag ?, ele não será jogado como um lance de livro e o Crafty simplesmente vai fingir que não encontrou lances no livro e então irá executar uma pesquisa de árvore normal. Bastante simples.

Como Controlar a Freqüência da Seleção do Lance de Abertura

Uma nova funcionalidade na versão 15.15 e posteriores permiet que se acrescente um comentário PGN a qualquer lance em um arquivo texto usado para criar o books.bin, na forma {play nn%}. Isto irá forçar que o lance que segue seja jogado aquela porcentagem do tempo, não importando os valores de ordenamento normal do livro baseados em freqüência e assim por diante.

Note que {play 0%} não evitará que um lance seja jogado, já que vai parecer que se trata de um lance sem porcentagem especificada. Para evitar que um lance seja jogado, use a flag ?.

Como o Crafty Escolhe Lances de Livro?

O algoritmo de seleção de livro do Crafty depende de dois valores definidos pelo usuário que podem ser configurados a qualquer tempo durante um jogo:

  book random <n>
  
  book width <w>

O algoritmo de seleção primeiro encontra o conjunto de lances legais de livro como já foi dito. O conjunto será apenas de lances com !, ou não terá lances com !. Este conjunto é então diminuído, baseado na configuração book random. Estas são as opções:

book random 0
Este é um caso especial de seleção de livro. O Crafty simplesmente toma o conjunto de lances do livro, e faz a pesquisa somente destes lances usando uma pesquisa alpha/beta normal, mas com um limite de tempo mais curto que o normal. Ele então joga o lance que produz o melhor valor de busca. Este tem uma séria desvantagem que é a de não haver nenhuma aleatoriedade. Ele sempre irá jogar o mesmo lance na mesma posição, a menos que a avaliação seja alterada, ou o tempo por lance seja diferente o suficiente para permitir que a pesquisa encontre um lance diferente do conjunto de lances do livro.

book random 1
Esta opção permite uma forma aleatória de seleção de lances de livro, mas você tem bastante controle sobre como os lances são escolhidos aleatoriamente. Os lances são ordenados, baseados em quatro parâmetros: freqüência com que são jogados, taxa de vitória/derrota, avaliação estática e resultados aprendidos. Normalmente estes são fatorados no valor usado para ordenar os lances, baseado nas configurações padrão que você pode modificar usando o comando "bookw option N", onde "option" pode ser "freq", "ratio", "eval" e "learn". N deve ser um número entre 0 e 1.
O Crafty encontra os valores min e max para cada um dos quatro parâmetros, e então mapeia os mesmos em um intervalo 0-1000 para cada parâmetro. Cada parâmetro é multiplicado pelo "peso" correspondente que você atribuiu a ele, e o resultado é usado como o valor de ordenamento dos lances do maior para o menor. Note que o primeiro valor de ordenamento é sempre "porcentagem jogado" para colocar os mesmos para o topo da lista. Para lances com valore iguais de "porcentagem jogado", o valor de ordenamento normal é usado como variável de ordenamento de segundo nível (se os lances não tem uma porcentagem-jogado, então esta variável de segundo nível é a única a ser usada, obviamente).

Uma vez o Crafty tenha ordenado os lances como informado acima, ele a seguir exclui todos os lances de livro que tem 0 vitórias.

Isto elimina as linhas estranhas em que um jogador escolheu uma linha ruim e perdeu rapidamente. Com zero vitórias, ele não será escolhido nunca, mesmo que o Crafty seguiria a mesma do outro lado. :) Isto não é nem perdo de perfeito, entretanto, por que uma abertura pode ter uma vitória e 19 derrotas e ainda irá continuar na lista.

Se um lance tem um valor de aprendizado > 100, este lance é elevado em prioridade a um lance com um !, já que ele parece ganhar material instantaneamente. Se um valor é <-100, ele recebe um ?, já que ele parece ser um limão.

Após isto, a configuração escolhida para "book width <w>" é usada para manter os primeiros <w> lances na lista, após a extração acima ter sido completada. Quanto menor <w>, menor a aleatoriedade que se obtém, mas a chance do Crafty aparecer com um lance bizarro do livro também fica menor.

Após fazer o ordenamento, o passo final é dividir em quaisquer valores e "porcentagem jogado" obrigatórios. O que este passo faz é encontrar todos os lances no "conjunto de lances jogáveis" recém computado, que não tem nenhum valor "porcentagem-para-jogar". Ele soma os valores de ordenamento destes lances, e então ajusta os valores de ordenamento para os outros lances de forma que suas porcentagens sejam respeitadas.

Isto feito, o Crafty simplesmente usa o "valor de ordenamento" para cada lance para computar um total para todo os lances. Ele gera então um número aleatório entre 1 e este limite, e escolhe o lance cuja distribuição de probabilidade combine. Isto certamente vai evoluir com o tempo, à medida que novas idéias sejam desenvolvidas.

Para meu jogo no ICC, eu uso book random 1, e book width 5, normalmente, apesar que para jogadores com títulos eu reduzo para book width 3. Para computadores, eu reduzo mais ainda para 2, para tentar jogar aberturas razoáveis e retirar os gambitos e as coisas que não funcionam.

Como o Aprendizado de Livro Funciona e Como Posso Compartilhar Resultados Aprendidos?

  1. Todo o "conhecimento aprendido" do Crafty está no arquivo book.bin. Isto mantém o valor aprendido e a contagem aprendida no mesmo arquivo de livro para melhorar a velocidade. Você não pode modificar isto, apesar que o comando "show book" irá fazer o Crafty mostrar tudo que ele tem do livro antes de fazer um lance.

  2. O arquivo book.lrn serve a dois objetivos: (a) servir como um registro para os teus olhos, assim você pode ver o que foi aprendido, contra quem, e qual o escore que ganhou sua atenção em primeiro lugar. Os valores no fim de cada linha do livro, dentro dos caracteres {} são os seguintes:

    {value, depth, rating_difference} - valor é o valor para a pesquisa "chave" que vem dos primeiros 10 lances do livro. Está em centipeões, e + é bom, e - é ruim. depth é a profundidade da pesquias que foi atingida nesta posição "chave", quanto mais profunda a pesquisa, mais o valor é "confiável". rating_difference é o rating do Crafty - o rating do oponente; um valor negativo significa que deve prestar mais atenção ao escore já que o oponente é melhor que o Crafty, um valor positivo significa que ele deve usar o escore "com um grão de sal", por que o oponente era mais fraco que o Crafty.

Você pode apagar este livro a qualquer momento, e ele não tem efeito algum no aprendizado. Como eu mencionei, o aprendizado vai para o book.bin... Este outro arquivo está aí principalmente para você espiar se estiver interessado. Entretanto, é este também o "arquivo portátil de dados de aprendizado", e pode ser dado a outros para que importem para o seu Crafty, onde ele irá afetar o livro de abertura exatamente como se o Crafty tivesse jogado as aberturas e obtido os mesmos escores. Existem duas formas de usar estes arquivos "lrn":

  1. "import <filename>" irá ler o arquivo <filename> e importar o conhecimento dele para o seu book.bin. Como eu usei o mesmo código de aprendizado que eu usei enquanto jogando partidas, esta informação também é anexada ao seu arquivo book.lrn também, de forma que o seu arquivo book.lrn sempre reflete tudo que o seu programa já aprendeu, desde que você nunca remova este arquivo. Seria um erro usar este comando no seu próprio arquivo book.lrn, por que as coisas que ele vai obter do mesmo serão contadas duas vezes, o que pode ou não ser uma boa coisa.

  2. "import <filename> clear" lerá o arquivo <filename> e importar o conhecimento como antes, mas ele primeiro limpa todo o resultado aprendido de book.bin. Se você vai querer fazer isto se você importar o meu arquivo book.lrn e você contribuiu para meus dados do book.lrn enviando os seus dados. Eu terei o cuidado de eliminar duplicatas se você cometer erros no que você me enviar, mas uma vez que você enviar algo a mim, você corre o risco de ter isto "devolta novamente" mais tarde. Isto vai continuar sendo um problema até que todo mundo acostume-se a compartilhar alque que seja menos "paradão" que esta "informação aprendida" é...

    Por outro lado, estamos agora "abertos para negócios"... Quando a necessidade te atingir, mande por email o seu arquivo .lrn, e eu irei manter um enorme arquivo mestre aqui e o atualizarei conforme a ocasião. Provavelmente a melhor coisa a fazer é enviar-me o seu arquivo .lrn e no mesmo instante apagar o seu . Isto irá capturar qualquer coisa aprendida depois que você enviou-me o seu arquivo, mas você vai ter tudo de volta com a nova versão do book.lrn que eu distribuir. Após obter este novo book.lrn, aqui está o que você deve fazer:

  3. renomear o seu antigo book.lrn para outra coisa qualquer. Eu vou chamá-lo de "book.lrn.old" aqui.

  4. copiar meu meu blearn.dat para sua máquina, mas não coloque o mesmo no diretório que tem o seu book.bin e books.bin por que isto ficará confuso rapidamente se você o fizer. Coloque em outro lugar, por que você irá remover o mesmo rapidamente de qualquer forma. Eu chamarei ele de new.lrn para este exemplo.

  5. import new.lrn clear

  6. import book.lrn.old
E você está pronto para roncar novamente. O primeiro comando limpa os valores aprendidos, importa o meu novo arquivo de aprendizado e atualiza tudo. O segundo comando re-aprende tudo que você tenha aprendido desde que você me enviou seu último arquivo book.lrn. Apó isto o seu arquivo book.lrn terá as coisas do meu .lrn, mais o velho conteúdo .lrn seu, apenas esperando para ser enviado a mim novamente.

Se isto está ficando confuso, eu posso provavelmente acrescentar um comando automático para fazer tudo isto, renomeando o book.lrn, etc. Talvez com o tempo isto deixe de ser tão passível de erro com o passar do tempo...

O que é este novo Aprendizado de Posições que eu Ouvi Falar?

O Crafty agora tem uma tabela de hash "permanente", que é mantida de um jogo para outro. Uma posição entra neste "arquivo de hash" quando o Crafty executa uma pesquisa e o valor de pesquisa é significantemente mais baixo que o último valor de pesquisa.

Quando isto acontece, o Crafty armazena a informação atual para esta posição no arquivo de hash permanente, que pode conter até 65536 posições. Uma vez cheio, as posições são substituídas em uma base FIFO (primeiro a entrar é o primeiro a sair, ou PEPS), sempre mantendo as 64K entradas mais recentes.

Cada vez que o Crafty faz uma pesquisa, as posições/escores deste arquivo são colocadas na tabela de transposição normal, e usadas durante a pesquisa como qualquer outra entrada da tabela. É deste jeito que isto ajuda o jogo: em uma partida recentemente jogada, os seguintes lances e escores foram encontrados pelo Crafty (jogando com as brancas):

  1. Ng5 (+.277) h6 2. Nh7 (+.321) Kg8 3. Qh5 (+.133) Qg7 4. Ng5 (-2.122) hxg5

Assim, o Cavalo cai em uma armadilha em h7, e no lance 4 o Crafty descobriu que se trata de um erro e "aprendeu" este resultado/posição.

Então jogamos exatamente a mesma partida novamente, exceto que duas coisas acontecem aqui. Pode ser que Ng7 seja a única casa para a qual o Cavalo pode se mover aqui, o que significa que a coisa toda é forçada. A primeira pesquisa vai descobrir:

  1. Ng5 (-2.122) se a pesquisa pode atingir 8 plies de profundidade, o que acontece mesmo em jogos de 5 segundos. Ele aprendeu que Ng5 é ruim. Ele armazena esta posição no arquivo de hash permanente também, e na próxima vez que você tentar esta mesma armadilha, ele irá descobrir 4-5 lances antes que se o Cavalo for a g5 ele estará em apuros. Cada partida irá divergir da primeira partida 3-4 lances antes. Simples e efetivo.

  2. Ng5 pode não ser forçado, e, se não o for, o Crafty sabe que Ng5 perde uma peça para um peão, então ele prontamente irá jogar outra coisa, que é exatamente o que é desejado.
Esta funcionalidade é implementada com dois (podem contar, dois) arquivos. Um arquivo, position.bin, é um arquivo binário que contém as tentradas da tabela de hash, e tem cresce até um megabyte em tamanho, no máximo (16 bytes por entrada de hash * 65536 entradas = exatamente 1 mega, mas eu tenho 8 bytes extra para a implementação da fila FIFO e para ver quantas entradas existem atualmente no arquivo, se ele não está cheio.

O segundo arquivo é "position.lrn" e é, como você já deve ter adivinhado, um arquivo que pode ser compartilhado com outros jogadores, exatamente como o arquivo book.lrn. Ele contém toda a informação necessária para reconstruir a posição, o escore, a profundidade, etc. e também inclui as tags PGN para que informam quem estava com que cor e quando a partida foi jogada...

Estes dados podem ser importados com o novo comando "import" (o velho book learn <filename> não está mais por perto) que irá importar dados do tipo book.lrn ou do tipo position.lrn e podem descobrir qual está sendo importado sem que você precise fazer nada. A opção <clear> ainda está aí, caso você queira usar a mesma, e simplesmente os arquivos position.lrn e position.bin antes de começar o processo de importação para aprendizagem de posições.

Esta opção pode ser desligada, se você quiser, usando o comando "learn", que permite que você desligue o aprendizado de livro (como ele funciona atualmente), o aprendizado de posições, e o próximo estágio de aprendizado de livro, que irá acrescentar ao livro em adição ao aprendizado de quais linhas do livro são boas e más.

O que é este novo aprendizado de "resultado"?

O aprendizado de resultado funciona exatamente como o aprendizado normal de livro, exceto que se o Crafty sofre um xeque-mate ou desiste, ele irá voltar pela linha do livro para encontrar o último ponto em que ele tinha mais de um lance para escolher. Ele irá então marcar o lance que havia escolhido como "nunca jogue isto novamente".

Esta funcionalidade trata o caso em que os primeiros lances que não estão no livro produzem escores razoáveis, mas a posição é uma daquelas que o Crafty simplesmente não consegue tratar muito bem. Se ele perder um jogo destes, ele irá variar na próxima vez que esta abertura for jogada, caso contrário ele possívelmente irá repetir a mesma abertura, e provavelmente irá repetir o resto do jogo também.

Todos os três modos de aprendizado estão ligados por padrão, apesar que qualquer deles pode ser desabilitado com a opção apropriada ao comando "learn".


Este documento foi produzido com o auxílio do txt2tags, Versão 1.6, e é uma tradução do arquivo crafty.doc.pdf, o qual pode ser encontrado em ftp://ftp.cis.uab.edu/pub/hyatt/.

Copyright (C) 2004 - César A. K. Grossmann