From a6b6d4134a9142ed0541acb94cef053fd1f5ab78 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Tue, 24 Sep 2013 20:09:54 +0200 Subject: [PATCH] Let exclude command also work outside analyze mode This adds native Bonanza commands exclude and include, so that the XBoard commands can be translated to them, and then executed after aborting the search. --- proce.c | 66 ++++++++++++++++++++++++++++++++++++++++-------------------- readme.txt | 14 ++++++++++-- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/proce.c b/proce.c index cb98efa..896963d 100644 --- a/proce.c +++ b/proce.c @@ -94,6 +94,7 @@ static int CONV cmd_undo( tree_t * restrict ptree ); // [HGM] undo static int CONV cmd_time( char **lasts ); static int CONV cmd_undo( tree_t * restrict ptree ); // [HGM] undo static int CONV cmd_analyze( tree_t * restrict ptree ); // [HGM] analyze +static int CONV cmd_inex( tree_t * restrict ptree, int inex, char **last ); // [HGM] exclude static int CONV cmd_exit( void ); @@ -138,11 +139,11 @@ int myTime, hisTime, movesPerSession, inc, plyNr; char xboard_mode; int root_pos[nsquare]; -int -xboard_to_CSA( tree_t * restrict ptree, char *in, char *out, int status ) +void +xboard_to_CSA( tree_t * restrict ptree, char *in, char *out ) { char fromX=in[0], fromY=in[1], toX=in[2], toY=in[3], promo=in[4]; - int piece=0, bonanza_move=0; + int piece=0; if(fromY == '@') { // drop (contains all info needed to convert it) if(fromX >= 'a') fromX += 'A' - 'a'; switch(fromX) { // encode piece @@ -154,48 +155,43 @@ xboard_to_CSA( tree_t * restrict ptree, char *in, char *out, int status ) case 'B': piece = bishop; break; case 'R': piece = rook; break; } - bonanza_move = Drop2Move(piece) | To2Move( ('9' - toY)*9 + (toX - 'a') ); sprintf(out, "00%c%c%s", 'a'+'9'-toX, '1'+'9'-toY, astr_table_piece[piece]); } else { // board move (need to figure out moved piece) int from = ('9' - fromY)*9 + (fromX - 'a'); int flag = (promo == '+' ? FLAG_PROMO : 0); - piece = abs( BOARD[from] ); // this only works when not searching! + piece = abs( BOARD[from] ); // this only works when no search in progress! printf("# piece from board: %d\n", piece);fflush(stdout); - if( status & flag_thinking ) { - int i, to = ('9' - toY)*9 + (toX - 'a'), l = (status == (flag_pondering | flag_thinking)); + if( game_status & flag_thinking ) { + int i, to = ('9' - toY)*9 + (toX - 'a'); piece = 0; // kludge to force illegal CSA move - for( i = 0; l ? all_moves[i] : i < root_nmove; i++ ) { // determine the piece from the move list - int move = (l ? all_moves[i] : root_move_list[i].move); + for( i = 0; i < root_nmove; i++ ) { // determine the piece from the move list + int move = root_move_list[i].move; if( I2To(move) != to ) continue; if( I2From(move) != from ) continue; if( (move & FLAG_PROMO) != flag ) continue; piece = I2PieceMove( move ); // we found the move; take the piece from it - bonanza_move = move; - break; + break; } - } else if( status & ( flag_pondering | flag_puzzling ) ) piece = abs( root_pos[from] ); // we have valid copy! + } else if( game_status & ( flag_pondering | flag_puzzling ) ) piece = abs( root_pos[from] ); // we have valid copy! printf("# piece corrected to %d\n", piece);fflush(stdout); - if( promo ) piece += promote; + if( promo == '+') piece += promote; sprintf(out, "%c%c%c%c%s", 'a'+'9'-fromX, '1'+'9'-fromY, 'a'+'9'-toX, '1'+'9'-toY, astr_table_piece[piece]); } - return bonanza_move; } static void -update_exclude_list( tree_t * restrict ptree, int add, char *move_str ) +update_exclude_list( tree_t * restrict ptree, int add, unsigned int move ) { // [HGM] exclude: manage list of excluded moves - char dummy[20]; int i; if( moves_ignore[0] == MOVE_NA ) { // nothing is excluded yet; make a copy of root move list; for( i = 0; i < root_nmove; i++) all_moves[i] = root_move_list[i].move; - all_moves[i] = 0; + all_moves[i] = MOVE_NA; } - if ( ! strcmp(move_str, "all") ) { // all moves + if ( move == MOVE_NA ) { // all moves if( add ) { // copy entire list of legal moves for( i = 0; i < root_nmove; i++ ) moves_ignore[i] = all_moves[i]; } else moves_ignore[0] = MOVE_NA; // clear list } else { // single move - int move = xboard_to_CSA( ptree, move_str, dummy, flag_pondering | flag_thinking); // kludge with impossible flag for( i = 0; moves_ignore[i] != MOVE_NA; i++ ) if( move == moves_ignore[i] ) break; if( add ) { // we must add the move if( moves_ignore[i] != MOVE_NA ) return; // but it was already in list @@ -268,7 +264,7 @@ Out("# command = '%s'\n", line); min = 60*min + sec; myTime = hisTime = 100*min; inc = 100 * fsec; } IF("usermove") { char buf[20]; - xboard_to_CSA( ptree, line+9, buf, game_status ); + xboard_to_CSA( ptree, line+9, buf ); if(forceMode || analyze_mode) strcpy(line, "move "), line += 5; else plyNr++, SetTimes(); strcpy( line, buf ); plyNr++; @@ -277,8 +273,8 @@ Out("# command = '%s'\n", line); IF("undo") { return 0; } IF("remove") { ; } IF("ping") { Out("pong %d\n", value); } - IF("exclude") { update_exclude_list( ptree, 1, line+8 ); strcpy(line, "analyze"); return 0; } - IF("include") { update_exclude_list( ptree, 0, line+8 ); strcpy(line, "analyze"); return 0; } + IF("exclude") { xboard_to_CSA( ptree, line+8, line+8 ); line[7] = ' '; return 0; } + IF("include") { xboard_to_CSA( ptree, line+8, line+8 ); line[7] = ' '; return 0; } return 1; } #endif @@ -305,6 +301,8 @@ static int CONV proce_cui( tree_t * restrict ptree ) if ( ! strcmp( token, "exit" ) ) { return cmd_exit(); } // [HGM] analyze if ( ! strcmp( token, "move" ) ) { return cmd_move( ptree, &last ); } if ( ! strcmp( token, "undo" ) ) { return cmd_undo( ptree ); } // [HGM] undo + if ( ! strcmp( token, "include" ) ) { return cmd_inex( ptree , 0, &last); } // [HGM] exclude + if ( ! strcmp( token, "exclude" ) ) { return cmd_inex( ptree , 1, &last); } // [HGM] exclude #if defined(MPV) if ( ! strcmp( token, "mpv" ) ) { return cmd_mpv( ptree, &last ); } #endif @@ -582,6 +580,7 @@ do_analyze( tree_t * restrict ptree ) time_limit = time_max_limit = 1e9; // kludge: use huge time to mimic infinity #ifdef XBOARD if(xboard_mode) Out("1 0 0 0 New Search\n"); // make sure lower depth is emitted, so XBoard undestand new search started + for( iret = 0; iret < nsquare; iret++ ) root_pos[iret] = BOARD[iret]; #endif game_status |= flag_pondering; iret = iterate( ptree ); @@ -626,6 +625,29 @@ cmd_analyze( tree_t * restrict ptree ) static int CONV +cmd_inex( tree_t * restrict ptree, int inex, char **last ) +{ // [HGM] analyze: switch off analysis mode + const char *str = strtok_r( NULL, str_delimiters, last ); + int iret; + unsigned int move; + + AbortDifficultCommand; + + if( ! strcmp( str, "all" ) ) { + move = MOVE_NA; + } else { + iret = interpret_CSA_move( ptree, &move, str ); + if ( iret < 0 ) { return iret; } + } + + update_exclude_list( ptree, inex, move ); + + if ( ! analyze_mode ) return 1; + return do_analyze( ptree ); +} + + +static int CONV cmd_exit( void ) { // [HGM] analyze: switch off analysis mode if ( !analyze_mode ) { diff --git a/readme.txt b/readme.txt index 91ac240..631a415 100644 --- a/readme.txt +++ b/readme.txt @@ -368,9 +368,10 @@ directory to dump log files. - analyze Starts to ponder on the current position, until a command is - received. After a 'move' or 'undo' command pondering will continue - in the new position. To get out of this mode without side effects, - you can use the 'exit' command. + received. After a 'move', 'undo' command pondering will continue + in the new position, while 'excdude', 'include' and 'mpv' will + continue analysis of the same position in the new mode. To get out + of this mode without side effects, you can use the 'exit' command. - beep on - beep off @@ -438,6 +439,13 @@ directory to dump log files. becomes effective when DFPN_CLIENT macro is defined in the Makefile. +- exclude ['str'] +- include ['str'] + The move 'str' will be excluded from search in the current + position, or included again. The list of excluded move will + be cleared as soon as we alter the position by the move, undo, + or new command. + - display ['num'] This command prints the shogi board. If you want to flip the board, set 'num' to 2. If not, set it to 1. -- 1.7.0.4