X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard2uci.c;h=4ddb72e048d9b53dba026c6d7352fa4c442bf14c;hb=learn;hp=f0288d7b3e8c3fbf0a87c49492a5f5a2ea31babf;hpb=d26c5e2ae931c2b05032b1b7cccc675d2088940f;p=polyglot.git diff --git a/xboard2uci.c b/xboard2uci.c index f0288d7..4ddb72e 100644 --- a/xboard2uci.c +++ b/xboard2uci.c @@ -21,6 +21,7 @@ #include "move.h" #include "move_do.h" #include "move_legal.h" +#include "move_gen.h" #include "option.h" #include "parse.h" #include "san.h" @@ -55,6 +56,7 @@ typedef struct { bool has_feature_smp; bool has_feature_egt_nalimov; bool has_feature_egt_gaviota; + bool has_feature_egt_syzygy; bool analyse; bool computer; const char * name; @@ -149,6 +151,7 @@ void xboard2uci_init() { // This is a quick hack. XB->has_feature_egt_nalimov = (option_find(Uci->option,"NalimovPath")!=NULL); XB->has_feature_egt_gaviota = (option_find(Uci->option,"GaviotaTbPath")!=NULL); + XB->has_feature_egt_syzygy = (option_find(Uci->option,"SyzygyPath")!=NULL); XB->analyse = FALSE; XB->computer = FALSE; XB->name = NULL; @@ -177,6 +180,9 @@ void xboard2uci_init() { XB->node_rate = -1; } + +static list_t move_list[1]; + // xboard2uci_gui_step() void xboard2uci_gui_step(char string[]) { @@ -208,7 +214,49 @@ void xboard2uci_gui_step(char string[]) { if (option_get_bool(Option,"Book")) { game_get_board(Game,board); book_disp(board); + } else { // [HGM] without book, print all legal moves + int i, gen=!list_size(move_list); + game_get_board(Game,board); + if(gen) gen_legal_moves(move_list,board); + for(i=0; ivalue[i] = 0; + move_to_san(move_list->move[i],board,move_string,256); + printf(" %s%6s\n", move_list->value[i]? "* " : "", move_string); + } + // this is necessary by the xboard protocol + printf("\n"); + } + + } else if (match(string,"exclude *") || match(string,"option Polyglot exclude move=*")) { // [HGM] + + int i, all = !strcmp(Star[0], "all"), change=FALSE, cnt=0; + game_get_board(Game,board); + if(!list_size(move_list)) { + gen_legal_moves(move_list,board); + for(i=0; ivalue[i] = 0; + } + } + move = move_from_san(Star[0],board); + + for(i=0; imove[i] == move) + change |= !move_list->value[i], move_list->value[i] = 1; + cnt += !move_list->value[i]; + } + if(change && cnt) mess(); // do not relay to engine if no change or no moves left + + } else if (match(string,"include *")) { // [HGM] + + int i, all = !strcmp(Star[0], "all"), change = FALSE; + game_get_board(Game,board); + move = move_from_san(Star[0],board); + + for(i=0; imove[i] == move) + change |= move_list->value[i], move_list->value[i] = 0; } + if(change) mess(); } else if (match(string,"black")) { @@ -326,6 +374,8 @@ void xboard2uci_gui_step(char string[]) { game_clear(Game); + move_list->size = 0; // [HGM] clear all exclude moves + if (XB->analyse) { State->computer[White] = FALSE; State->computer[Black] = FALSE; @@ -341,6 +391,9 @@ void xboard2uci_gui_step(char string[]) { XB->depth_limit = FALSE; XB->node_rate=-1; + if (option_find(Uci->option,"UCI_PlayByNodes")) { + uci_send_option(Uci,"UCI_PlayByNodes","%d",0); + } XB->computer = FALSE; my_string_set(&XB->name,""); @@ -378,7 +431,12 @@ void xboard2uci_gui_step(char string[]) { gui_send(GUI,"pong %s",Star[0]); } } else if (match(string,"nps *")) { - + + if (Star[0] > 0 && option_find(Uci->option,"UCI_PlayByNodes")) { + + uci_send_option(Uci,"UCI_PlayByNodes","%d",Star[0]); + + } else // fake WB play-by-nodes mode XB->node_rate = atoi(Star[0]); } else if (match(string,"playother")) { @@ -535,6 +593,12 @@ void xboard2uci_gui_step(char string[]) { start_protected_command(); uci_send_option(Uci,"GaviotaTbPath","%s",path); end_protected_command(); + }else if(my_string_case_equal(type,"syzygy") && XB->has_feature_egt_syzygy){ + // updating SyzygyPath + my_log("POLYGLOT setting the Syzygy path to %s\n",path); + start_protected_command(); + uci_send_option(Uci,"SyzygyPath","%s",path); + end_protected_command(); }else{ // refuse gui_send(GUI,"Error (unsupported table base format): %s",string); @@ -547,17 +611,22 @@ void xboard2uci_gui_step(char string[]) { if(memory>=1){ // updating the available memory option_t *opt; + int h; my_log("POLYGLOT setting the amount of memory to %dMb\n",memory); + egt_cache=0; if(XB->has_feature_egt_nalimov && (opt=option_find(Uci->option,"NalimovCache"))){ - egt_cache=atoi(opt->value); - }else if(XB->has_feature_egt_gaviota && + h=atoi(opt->value); + if(h>egt_cache)egt_cache=h; + } + if(XB->has_feature_egt_gaviota && (opt=option_find(Uci->option,"GaviotaTbCache"))){ - egt_cache=atoi(opt->value); - }else{ - egt_cache=0; + h=atoi(opt->value); + if(h>egt_cache)egt_cache=h; } my_log("POLYGLOT EGTB Cache is %dMb\n",egt_cache); real_memory=memory-egt_cache; + opt=option_find(Uci->option,"Hash"); + if(opt && real_memory > atoi(opt->max)) real_memory = atoi(opt->max); // [HGM] top off if(real_memory>0){ start_protected_command(); uci_send_option(Uci,"Hash", "%d", real_memory); @@ -579,6 +648,8 @@ void xboard2uci_gui_step(char string[]) { if (!game_init(Game,Star[0])) my_fatal("xboard_step(): bad FEN \"%s\"\n",Star[0]); + move_list->size = 0; // [HGM] clear all exclude moves + State->computer[White] = FALSE; State->computer[Black] = FALSE; @@ -600,6 +671,8 @@ void xboard2uci_gui_step(char string[]) { } else if (match(string,"undo")) { + move_list->size = 0; // [HGM] clear all exclude moves + if (game_pos(Game) >= 1) { game_goto(Game,game_pos(Game)-1); @@ -614,6 +687,8 @@ void xboard2uci_gui_step(char string[]) { } else if (match(string,"usermove *")) { + move_list->size = 0; // [HGM] clear all exclude moves + game_get_board(Game,board); move = move_from_san(Star[0],board); @@ -879,6 +954,7 @@ static void send_xboard_options(){ gui_send(GUI,"feature done=0"); gui_send(GUI,"feature analyze=1"); + gui_send(GUI,"feature exclude=1"); gui_send(GUI,"feature colors=0"); gui_send(GUI,"feature draw=1"); gui_send(GUI,"feature ics=1"); @@ -917,8 +993,15 @@ static void send_xboard_options(){ if(tbs>0){ strncat(egtfeature,",",StringSize-strlen(egtfeature)); } + tbs++; strncat(egtfeature,"gaviota",StringSize-strlen(egtfeature)); } + if (XB->has_feature_egt_syzygy){ + if(tbs>0){ + strncat(egtfeature,",",StringSize-strlen(egtfeature)); + } + strncat(egtfeature,"syzygy",StringSize-strlen(egtfeature)); + } strncat(egtfeature,"\"",StringSize-strlen(egtfeature)); egtfeature[StringSize-1]='\0'; gui_send(GUI,egtfeature); @@ -947,10 +1030,12 @@ void xboard2uci_send_options(){ if(my_string_case_equal(opt->name,"UCI_ShredderbasesPath")) continue; if(my_string_case_equal(opt->name,"UCI_SetPositionValue")) continue; if(my_string_case_equal(opt->name,"UCI_DrawOffers")) continue; + if(my_string_case_equal(opt->name,"UCI_PlayByNodes")) continue; if(my_string_case_equal(opt->name,"Ponder")) continue; if(my_string_case_equal(opt->name,"Hash")) continue; if(my_string_case_equal(opt->name,"NalimovPath")) continue; if(my_string_case_equal(opt->name,"GaviotaTbPath")) continue; + if(my_string_case_equal(opt->name,"SyzygyPath")) continue; if((name=uci_thread_option(Uci))!=NULL && my_string_case_equal(opt->name,name)) continue; format_xboard_option_line(option_line,opt); @@ -959,6 +1044,8 @@ void xboard2uci_send_options(){ } + gui_send(GUI,"feature option=\"Polyglot exclude move -string \""); + option_start_iter(Option); while((opt=option_next(Option))){ if(opt->mode &XBOARD){ @@ -1425,8 +1512,23 @@ static void search_update() { engine_send(Engine,""); // newline } else if (State->state == ANALYSE) { - - engine_send(Engine,"go infinite"); + int i; + char move_string[256]; + + engine_send_queue(Engine,"go infinite"); + + if(list_size(move_list)) { + board_t board[1]; + game_get_board(Game,board); + engine_send_queue(Engine," searchmoves"); + for(i=0; ivalue[i]) { + move_to_can(move_list->move[i],board,move_string,256); + engine_send_queue(Engine," %s",move_string); + } + } + } + engine_send(Engine,""); // newline } else { @@ -1616,12 +1718,16 @@ static void send_info() { }else{ min_depth=1; } + if(!strncmp(Uci->info, "xboard ", 7)) gui_send(GUI,"%s",Uci->info+7); else // kludge to allow UCI engines to use WB protocol gui_send(GUI,"%d %+d %.0f "S64_FORMAT" %s",Uci->best_depth>min_depth?Uci->best_depth:min_depth, 0,0.0,U64(0),Uci->info); } // send_pv() +//define EXT_INFO_FORMAT "{%d,%.0f,"S64_FORMAT"} " +#define EXT_INFO_FORMAT " %2d %4.0f "S64_FORMAT"\t" + static void send_pv() { char pv_string[StringSize]; @@ -1643,8 +1749,11 @@ static void send_pv() { if(Uci->depth==-1) //hack to clear the engine output window gui_send(GUI,"%d %+d %.0f "S64_FORMAT" ",0,report_best_score(),Uci->time*100.0,Uci->node_nb); - - gui_send(GUI,"%d %+d %.0f "S64_FORMAT" %s",Uci->best_depth,report_best_score(),Uci->time*100.0,Uci->node_nb,pv_string); + if(option_get_bool(Option,"ShowTbHits")) + gui_send(GUI,"%d %+d %.0f "S64_FORMAT EXT_INFO_FORMAT"%s%c",Uci->best_depth,report_best_score(), + Uci->time*100.0,Uci->node_nb,Uci->sel_depth,Uci->speed/1e3,Uci->tbhit_nb,pv_string,Uci->bound_type); + else + gui_send(GUI,"%d %+d %.0f "S64_FORMAT" %s%c",Uci->best_depth,report_best_score(),Uci->time*100.0,Uci->node_nb,pv_string,Uci->bound_type); } else if (State->state == PONDER && option_get_bool(Option,"ShowPonder")) { @@ -1655,7 +1764,12 @@ static void send_pv() { if (move != MoveNone && move_is_legal(move,board)) { move_to_san(move,board,move_string,256); line_to_san(Uci->best_pv,Uci->board,pv_string,StringSize); - gui_send(GUI,"%d %+d %.0f "S64_FORMAT" (%s) %s",Uci->best_depth,report_best_score(),Uci->time*100.0,Uci->node_nb,move_string,pv_string); + if(option_get_bool(Option,"ShowTbHits")) + gui_send(GUI,"%d %+d %.0f "S64_FORMAT EXT_INFO_FORMAT"(%s) %s%c",Uci->best_depth,report_best_score(), + Uci->time*100.0,Uci->node_nb,Uci->sel_depth,Uci->speed/1e3,Uci->tbhit_nb,move_string,pv_string,Uci->bound_type); + else + gui_send(GUI,"%d %+d %.0f "S64_FORMAT" (%s) %s%c",Uci->best_depth,report_best_score(), + Uci->time*100.0,Uci->node_nb,move_string,pv_string,Uci->bound_type); } } }