/// <summary> /// Evaluates a position with stop parameters. /// </summary> /// <param name="evalReq">The eval request.</param> public void Evaluate(StartEvaluationRequest evalReq) { if (evalReq.EngineOptions != null) { foreach (var op in evalReq.EngineOptions) { this.SetOption(op.Key, op.Value.ToUciValueString()); } } var position = StartPositionExtrapolator.ExtrapolateStartingPosition(evalReq.Position); this.SetPosition(position.Fen); var goCmd = evalReq.ToGoString(); this.bridgeLogger.LogInformation($"Using gocmd: '{goCmd}'."); this.engineProcess.WriteCommand(goCmd); if (evalReq?.CompletionCriteria?.Infinite ?? false) { // infinite } else { this.engineProcess.WaitForText("bestmove", int.MaxValue); } this.engineProcess.PopOutputBuffer(); }
/// <summary> /// Gets the move filter string for "searchmoves". /// </summary> /// <param name="req">The evaluation request.</param> /// <returns>The "searchmoves" string.</returns> /// <exception cref="ArgumentException">If an invalid SAN move is given.</exception> internal static string GetMoveFilterString(this StartEvaluationRequest req) { var sb = new StringBuilder(); sb.Append("searchmoves "); var startFen = StartPositionExtrapolator.ExtrapolateStartingPosition(req.Position).Fen; var board = Board.NewFromFen(startFen); var moves = board.GetPossibleMoves(board.MoveHistory.Count % 2 == 0 ? PieceColor.White : PieceColor.Black); foreach (var m in req.SearchMoves) { if (!string.IsNullOrEmpty(m.UCI)) { sb.Append($"{m.UCI} "); } else if (!string.IsNullOrEmpty(m.SAN)) { var correspondingMove = moves.FirstOrDefault(mov => mov.ToContextualSANString(board) == m.SAN); if (correspondingMove == default(Move)) { throw new ArgumentException($"Cannot create go string with move filter with SAN '{m.SAN}' as no corresponding UCI move can be found."); } sb.Append($"{correspondingMove.ToUciString()} "); } } return(sb.ToString().TrimEnd()); }
public ActionResult <StartEvaluationResponse> StartEvaluation(StartEvaluationRequest request) { string requestBody = JsonConvert.SerializeObject(request); this.logger.LogDebug(requestBody); return(this.engineBridge.StartEvaluation(request)); }
public async Task EvalWithMaxTimeWorks() { var startTime = DateTime.UtcNow; var evalReq = new StartEvaluationRequest() { Position = new StartingPosition() { Fen = "4kbnr/8/8/8/8/8/8/1N1QK3 w - - 0 1", }, CompletionCriteria = new CompletionCriteria() { PonderTime = TimeSpan.FromMinutes(1) }, }; var setResponse = await Client.StartEvaluationAsync(evalReq); // Made in time var actualDuration = DateTime.UtcNow - startTime; Assert.True((actualDuration - evalReq.CompletionCriteria.PonderTime !.Value).TotalMilliseconds < 1000); // Move Correct var line = setResponse.Lines[1]; Assert.StartsWith("Nc6", line.LineSan); Assert.StartsWith("d4c6", line.LineUci); }
/// <inheritdoc cref="IMakiClient" /> public async Task <StartEvaluationResponse> StartEvaluationAsync(StartEvaluationRequest request, CancellationToken cancellationToken) { using var httpRequest = this.CreatePostRequest <StartEvaluationRequest>(request, "evaluation"); using var httpResponse = await this.httpClient.SendAsync(httpRequest, cancellationToken); return(await this.ReadHttpResponseAsync <StartEvaluationResponse>(httpResponse)); }
/// <summary> /// Start the engine evaluation at the current position. /// </summary> /// <param name="startEvaluationRequest">The evaluation response.</param> /// <returns>The response object containing the results of the evaluation.</returns> public StartEvaluationResponse StartEvaluation(StartEvaluationRequest startEvaluationRequest) { this.logger.LogInformation($"Starting evaluation:"); this.logger.LogInformation($"{JsonConvert.SerializeObject(startEvaluationRequest)}"); this.isEval = true; this.bestLines.Clear(); var position = StartPositionExtrapolator.ExtrapolateStartingPosition(startEvaluationRequest.Position); this.PositionFen = position.Fen; this.engineManager.Evaluate(startEvaluationRequest); this.isEval = false; return(new StartEvaluationResponse() { Lines = this.bestLines, }); }
/// <summary> /// Creates the UCI "go" string based on the start eval request. /// </summary> /// <param name="req">The evaluation request.</param> /// <returns>The "go" string.</returns> public static string ToGoString(this StartEvaluationRequest req) { var sb = new StringBuilder(); sb.Append("go "); if (req !.CompletionCriteria?.MaxDepth != null) { sb.Append($"depth {req.CompletionCriteria.MaxDepth.Value} "); } if (req !.CompletionCriteria?.MaxNodes != null) { sb.Append($"nodes {req.CompletionCriteria.MaxNodes.Value} "); } if (req !.CompletionCriteria?.Mate != null) { sb.Append($"mate {req.CompletionCriteria.Mate.Value} "); } if (req !.CompletionCriteria?.PonderTime != null) { sb.Append($"movetime {req.CompletionCriteria.PonderTime.Value.TotalMilliseconds} "); } if (req !.CompletionCriteria?.Infinite ?? false) { sb.Append($"infinite "); } if (req !.Clock != null) { var clock = req.Clock; if (clock.WhiteTime != null) { sb.Append($"wtime {(long)clock.WhiteTime.Value.TotalMilliseconds} "); } if (clock.BlackTime != null) { sb.Append($"btime {(long)clock.BlackTime.Value.TotalMilliseconds} "); } if (clock.WhiteIncrement != null) { sb.Append($"winc {(long)clock.WhiteIncrement.Value.TotalMilliseconds} "); } if (clock.BlackIncrement != null) { sb.Append($"binc {(long)clock.BlackIncrement.Value.TotalMilliseconds} "); } if (clock.MovesToGo != null) { sb.Append($"movestogo {clock.MovesToGo} "); } } if (req.SearchMoves != null && req.SearchMoves.Count > 0) { string searchMoveString = GetMoveFilterString(req); sb.Append($"{searchMoveString} "); } return(sb.ToString().TrimEnd()); }
/// <inheritdoc cref="IMakiClient" /> public async Task <StartEvaluationResponse> StartEvaluationAsync(StartEvaluationRequest request) => await this.StartEvaluationAsync(request, CancellationToken.None);