Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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());
        }
Ejemplo n.º 3
0
        public ActionResult <StartEvaluationResponse> StartEvaluation(StartEvaluationRequest request)
        {
            string requestBody = JsonConvert.SerializeObject(request);

            this.logger.LogDebug(requestBody);
            return(this.engineBridge.StartEvaluation(request));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        /// <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));
        }
Ejemplo n.º 6
0
        /// <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,
            });
        }
Ejemplo n.º 7
0
        /// <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());
        }
Ejemplo n.º 8
0
 /// <inheritdoc cref="IMakiClient" />
 public async Task <StartEvaluationResponse> StartEvaluationAsync(StartEvaluationRequest request) => await this.StartEvaluationAsync(request, CancellationToken.None);