Suppress printing duplicat PVs (for multi-PV)
authorH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 3 Jan 2017 15:27:50 +0000 (16:27 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 4 Jan 2017 18:49:29 +0000 (19:49 +0100)
UCI resends all PVs if one new PV arrives,possibly with different depths.
ow any PV of a depth less than the best depth seen from the current search
so far will be ignored. Duplicats of the same depth and score will also
be ignored.

UCI2WB.c

index 2db1424..88b1d1c 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -46,9 +46,9 @@ char move[2000][10], iniPos[256], hashOpt[20], pause, pondering, suspended, pond
 int mps, tc, inc, sTime, depth, myTime, hisTime, stm, computer = NONE, memory, oldMem=0, cores, moveNr, lastDepth, lastScore, startTime, debug, flob;\r
 int statDepth, statScore, statNodes, statTime, currNr, size, collect, nr, sm, inex, on[500], frc, byo = -1, namOpt, comp;\r
 char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20], varList[8000], anaOpt[20], backLog[10000], checkOptions[8192] = "Ponder";\r
-char board[100];  // XQ board for UCCI\r
+char pvs[99][999], board[100];  // XQ board for UCCI\r
 char *nameWord = "name ", *valueWord = "value ", *wTime = "w", *bTime = "b", *wInc = "winc", *bInc = "binc", newGame; // keywords that differ in UCCI\r
-int unit = 1, drawOffer;\r
+int unit = 1, drawOffer, scores[99], mpvSP, maxDepth;\r
 volatile int logLen, sentLen;\r
 \r
 FILE *toE, *fromE, *fromF;\r
@@ -157,7 +157,7 @@ StartSearch(char *ponder)
        if(inc && !*suffix) EPRINT((f, " %s %d %s %d", wInc, inc, bInc, inc))\r
        if(depth > 0) EPRINT((f, " depth %d", depth))\r
         if(*suffix) EPRINT((f, suffix, inc))\r
-       EPRINT((f, "\n"))\r
+       EPRINT((f, "\n")); maxDepth = mpvSP = 0;\r
 }\r
 \r
 void\r
@@ -326,9 +326,12 @@ Engine2GUI()
                if(p = strstr(line+4, " time "))       sscanf(p+6, "%d", &t), t /= 10, statTime = t;\r
                if(p = strstr(line+4, " currmove "))   sscanf(p+10,"%s", currMove);\r
                if(p = strstr(line+4, " currmovenumber ")) sscanf(p+16,"%d", &currNr);\r
-               if(pv = strstr(line+4, " pv ")) // convert PV info to WB thinking output\r
+               if(pv = strstr(line+4, " pv ")) { // convert PV info to WB thinking output\r
+                 if(d > maxDepth) maxDepth = d, mpvSP = 0; else if(d < maxDepth) continue; // ignore depth regressions\r
+                 for(i=0; i<mpvSP; i++) if(s == scores[i] && !strcmp(pvs[i], pv+4)) break; // check if duplicat\r
+                 if(i >= mpvSP) strncpy(pvs[mpvSP], pv+4, 998), scores[mpvSP++] = s,       // emit as thinking output if not\r
                    printf("%3d  %6d %6d %10d %s", lastDepth=d, lastScore=s, t, n, Convert(pv+4));\r
-               else if(s == -100000) lastScore = s; // when checkmated score is valid even without PV (which might not come)\r
+               else if(s == -100000) lastScore = s; // when checkmated score is valid even without PV (which might not come)\r
            }\r
        }\r
        else if(!strcmp(command, "option")) { // USI option: extract data fields\r
@@ -434,7 +437,7 @@ GUI2Engine()
            // and set engine thinking (note USI swaps colors!)\r
            startTime = GetTickCount(); mySide = stm; // remember side we last played for\r
            if(computer == ANALYZE) {\r
-               EPRINT((f, "# go infinite"))\r
+               EPRINT((f, "# go infinite")); maxDepth = mpvSP = 0;\r
                if(sm & 1) { // some moves are disabled\r
                    EPRINT((f, " searchmoves"))\r
                    for(i=1; i<nr; i++) if(on[i]) EPRINT((f, " %s", moveMap[i]))\r