調べたところ、両方とも盲点みたいなことが原因になっていました。以下ちょっと説明が長くなります。
まず、2行目の評価値が採用されない問題について。 将棋所でエンジンの思考情報を表示する部分は、予想手・現在の探索手・探索局面数などを表示する部分があり、その下に、読み筋ごとの思考時間・探索深さ・探索局面数などをリスト項目で追加して表示する部分があります。 この、リスト項目の部分は、現状の将棋所では、読み筋がない場合は追加しないようにしてあります。その場合、探索深さや探索局面数は上記の表示部に表示できるし、読み筋のない項目をリストに追加しても意味がないと判断しているためです。 ただ、評価値に関しては独立した表示部がないので、表示するのであれば、必ずリスト項目の部分になります。なので、リスト項目に追加されない行の評価値は表示されません。 つまり、2行目のように読み筋がなくて評価値のある情報を返した場合、将棋所ではその行の情報をリスト項目として追加しないので、その評価値が保存されず、グラフ表示にも採用されません。エンジンが手を指したとき、もし、その評価値を採用してグラフに表示すると、それを見ている側からすると、どこにも表示されなかった評価値が突然グラフに表示されて、この評価値はどこから来た?ということになります。 送っている評価値が採用されないのはおかしいという意見ももっともなので、読み筋がなくてもリスト項目に追加して表示するか、あるいは評価値にも独立した表示部を設けるという方法もありますが、どちらもちょっと気の進まないところがあります。
次に、3行目の評価値が採用されない問題ですが、これはmultipvを使う行と使わない行が混在することが原因でした。 1行目でmultipv 1を使っていますが、この場合、将棋所では、multipvの数字ごとに、それに対応した読み筋と評価値を保存します。multipvの数に応じて読み筋が複数存在する可能性があるので、エンジンが手を指したとき、その手と初手が一致する読み筋を探して、それに対応する評価値をグラフ表示などに使うためです。 その後、3行目でmultipvを使わずに読み筋を返すと、この行の評価値は、multipvの数字ごとに保存する部分とは別に保存されるのですが、そのあとで手を指すと、将棋所ではmultipvの数字に対応した評価値を先に見に行ってしまうので、3行目で返した評価値が無視されていました。 これに関しては、multipvを使わない行での評価値がmultipvの行よりもあとに返って来たなら、それを優先して表示すべきかもしれません。ただこれも、同一局面の思考表示において、multipvを使う行と使わない行が混在すること自体どうなのか、ということがあります。 (別の話ですが、infoコマンドを返す時、同じ行の中でpvとstringを同時使用するのは規約違反です。USIプロトコルの解説にも、「pvとstringの同時使用は不可」と明記してあります。今回の問題とは関係ないのでこれ以上触れませんが)
以上、将棋所の問題と言えばそうなのですが、エンジンの返すコマンドの使い方がかなり想定から外れていて、それに対する動作として大きな欠陥があるとも思えないので、修正すべきかどうか迷っています。
|