/// <summary> /// 思考を開始する。思考中であるなら、queueに積んで、いまの思考が停止してから思考を開始する。 /// </summary> /// <param name="position"></param> /// <param name="goCommand"></param> public void Think(Kifu.KifuNode node, string position, string goCommand) { // 思考中であれば、いまのを停止させて、queueに積む if (Thinking) { Stop(); nextPosition = position; nextGoCommand = goCommand; nextNode = node; } else { if (nextMultiPv != 0) { // このタイミングでMultiPVを設定してしまう。 SendCommand($"setoption name MultiPV value {nextMultiPv}"); nextMultiPv = 0; } SendCommand(position); SendCommand(goCommand); Thinking = true; StopSent = false; bestMove = Move.NONE; ponderMove = Move.NONE; CurrentNode = node; // Stopwatchも回しておく。 think_timer.Reset(); think_timer.Start(); } }
/// <summary> /// エンジンに思考させる。 /// Thinkingの時に呼び出された場合、現在のThinkに対してstopを呼び出して、 /// bestmoveが返ってきてから次のthinkを行う。 /// </summary> /// <param name="usiPositionString"></param> public void Think(Kifu.KifuNode node, string usiPositionString, UsiThinkLimit limit, Color sideToMove) { if (State != UsiEngineState.InTheGame) { // ゲーム中以外でThinkを呼び出している。 // 駒を持ち上げて、その状態で検討ボタンを押すとNotifyTurnChanged()が呼び出されて、 // エンジン側が未初期化なのにこのメソッドが呼び出されるなど…。 // このあと、エンジンの初期化が終わったタイミングで再度、NotifyTurnChanged()から // このメソッドが呼び出されるはずなので、今回は単に無視しておくだけで良い。 Log.Write(LogInfoType.UsiServer, "InTheGameではないのにThink()を呼び出している。"); return; } if (IsMateSearch) { ThinkingBridge.Think(node, $"position {usiPositionString}", $"go {limit.ToUsiMateString(sideToMove)}"); } else { ThinkingBridge.Think(node, $"position {usiPositionString}", $"go {limit.ToUsiString(sideToMove)}"); } }
public void Think(Kifu.KifuNode node, string usiPosition, UsiThinkLimit limit, Color sideToMove) { Engine.Think(node, usiPosition, limit, sideToMove); }
public void Think(Kifu.KifuNode node, string usiPosition, UsiThinkLimit limit, Color sideToMove) { }
public void Think(Kifu.KifuNode node, string usiPosition, UsiThinkLimit limit, Color sideToMove) { BestMove = Move.NONE; // いったんこのタイミングでクリアする。 }