Respond immediately to ponder on/off commands
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 5 Dec 2012 11:05:59 +0000 (12:05 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Wed, 5 Dec 2012 11:11:20 +0000 (12:11 +0100)
Rather than just setting the flag that causes a ponder search to start
after the engine moves, we start the search on receiving the 'hard' command.
When a ponder search is in progress, it is stopped on receiving 'easy'.
This requires saving a ponder move even with ponder off, (because it might
be switched on later), and more strict clearing of the move beyond the last
one, toprevent it can be accidentally used as ponder move (e.g. after undo).

UCI2WB.c

index fbd9d74..256150c 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -109,6 +109,15 @@ LoadPos(int moveNr)
        for(j=0; j<moveNr; j++) { fprintf(toE, " %s", move[j]); DPRINT(" %s", move[j]); }\r
 }\r
 \r
+void\r
+StartPonder()\r
+{\r
+       if(!move[moveNr][0]) return; // no ponder move\r
+       LoadPos(moveNr+1);\r
+       pondering = 1; lastDepth = 1;\r
+       StartSearch(" ponder");\r
+}\r
+\r
 char *Convert(char *pv)\r
 {   // convert Shogi coordinates to WB\r
     char *p, *q, c;\r
@@ -166,16 +175,13 @@ Engine2GUI()
            if(mps && ((moveNr+1)/2) % mps == 0) myTime += tc; if(sTime) myTime = sTime; // new session or move starts\r
            // first start a new ponder search, if pondering is on and we have a move to ponder on\r
            if(p = strstr(line+9, "ponder")) {\r
+             sscanf(p+7, "%s", move[moveNr]);\r
              if(computer != NONE && ponder) {\r
-               sscanf(p+7, "%s", move[moveNr]);\r
                DPRINT("# ponder on %s\n", move[moveNr]);\r
-               LoadPos(moveNr+1); // load position\r
-               // and set engine pondering\r
-               pondering = 1; lastDepth = 1;\r
-               StartSearch(" ponder");\r
+               StartPonder();\r
              }\r
              p[-1] = '\n'; *p = 0; // strip off ponder move\r
-           }\r
+           } else move[moveNr][0] = 0;\r
            Move4GUI(line+9);\r
            printf("move %s\n", line+9); // send move to GUI\r
            if(lastScore == 100001 && iniPos[0] != 'f') { printf("%s {mate}\n", stm == WHITE ? "1-0" : "0-1"); computer = NONE; }\r
@@ -299,7 +305,7 @@ GUI2Engine()
        line[++i] = 0; if(x == EOF) { printf("# EOF\n"); exit(-1); }\r
        sscanf(line, "%s", command);\r
        if(!strcmp(command, "new")) {\r
-           computer = BLACK; moveNr = 0; depth = -1;\r
+           computer = BLACK; moveNr = 0; depth = -1; move[0][0] = 0;\r
            stm = WHITE; strcpy(iniPos, "position startpos");\r
            if(memory != oldMem && hasHash) fprintf(toE, "setoption name %s value %d\n", hashOpt, memory);\r
            oldMem = memory;\r
@@ -382,11 +388,7 @@ GUI2Engine()
            suspended = 1 + pondering, StopPonder(1); // remember if we were pondering, and stop search ignoring bestmove\r
        }\r
        else if(!strcmp(command, "resume")) {\r
-           if(suspended == 2) { // restart interrupted ponder search\r
-               LoadPos(moveNr+1);\r
-               pondering = 1; lastDepth = 1;\r
-               StartSearch(" ponder");\r
-           }\r
+           if(suspended == 2) StartPonder(); // restart interrupted ponder search\r
            suspended = 0; // causes thinking to start in normal way if on move or analyzing\r
        }\r
        else if(!strcmp(command, "xboard")) ;\r
@@ -398,8 +400,8 @@ GUI2Engine()
        else if(!strcmp(command, "otim"))   sscanf(line+4, "%d", &hisTime), hisTime *= 10;\r
        else if(!strcmp(command, "post"))   post = 1;\r
        else if(!strcmp(command, "nopost")) post = 0;\r
-       else if(!strcmp(command, "easy"))   ponder = 0;\r
-       else if(!strcmp(command, "hard"))   ponder = 1;\r
+       else if(!strcmp(command, "easy"))   ponder = 0, StopPonder(pondering);\r
+       else if(!strcmp(command, "hard"))   ponder = 1, StartPonder();\r
        else if(!strcmp(command, "ping"))   pause = 1, fprintf(toE, "isready\n"), fflush(toE), Sync(PAUSE), printf("pong %s", line+5);\r
        else if(!strcmp(command, "memory")) sscanf(line, "memory %d", &memory);\r
        else if(!strcmp(command, "cores"))  sscanf(line, "cores %d", &cores);\r