Send again all the PV lines in multiPV searching
authorMarco Costalba <mcostalba@gmail.com>
Sat, 8 Oct 2011 08:25:38 +0000 (09:25 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 8 Oct 2011 09:24:54 +0000 (10:24 +0100)
Partially revert 1036cadcecc43737 because UCI protocol
in case of multipv explicitly requires:

for the best move/pv add "multipv 1" in the string when you send the pv.
in k-best mode always send all k variants in k strings together.

Thanks to Justin Blanchard for pointing this out.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/search.cpp

index b22e82fe577ffbbd480fb11985956f0cbbbcdad2..4bb701a216b0c907b7ae94c990a695868b6b2f47 100644 (file)
@@ -584,16 +584,27 @@ namespace {
                     break;
 
                 // Send full PV info to GUI if we are going to leave the loop or
-                // if we have a fail high/low and we are deep in the search.
-                if ((value > alpha && value < beta) || current_search_time() > 2000)
-                    for (int i = 0; i < Min(UCIMultiPV, MultiPVIteration + 1); i++)
+                // if we have a fail high/low and we are deep in the search. Note
+                // that UCI protol requires to send all the PV lines also if are
+                // still to be searched and so refer to the previous search's score.
+                if ((value > alpha && value < beta) || current_search_time() > 5000)
+                    for (int i = 0; i < Min(UCIMultiPV, (int)Rml.size()); i++)
+                    {
+                        bool updated = (i <= MultiPVIteration);
+
+                        if (depth == 1 && !updated)
+                            continue;
+
+                        Depth d = (updated ? depth : depth - 1) * ONE_PLY;
+                        Value s = (updated ? Rml[i].score : Rml[i].prevScore);
+
                         cout << "info"
-                             << depth_to_uci(depth * ONE_PLY)
-                             << (i == MultiPVIteration ? score_to_uci(Rml[i].score, alpha, beta) :
-                                                         score_to_uci(Rml[i].score))
+                             << depth_to_uci(d)
+                             << (i == MultiPVIteration ? score_to_uci(s, alpha, beta) : score_to_uci(s))
                              << speed_to_uci(pos.nodes_searched())
                              << pv_to_uci(&Rml[i].pv[0], i + 1, pos.is_chess960())
                              << endl;
+                    }
 
                 // In case of failing high/low increase aspiration window and research,
                 // otherwise exit the fail high/low loop.