Example #1
0
        public async Task <EngineEvaluation> BuildEngineEvaluations(TreeMove treeMove, params string[] previousMoves)
        {
            var engineEvaluation = await chessMetersContext.EngineEvaluations.SingleOrDefaultAsync(x => x.TreeMoveId == treeMove.Id && x.EngineId == engine.EngineId);

            if (engineEvaluation?.Depth >= engineDepth)
            {
                return(engineEvaluation);
            }

            await engine.SetPosition(previousMoves.Any()?$"{string.Join(' ', previousMoves)} {treeMove.Move}" : treeMove.Move);

            var evaluationCentipawns = await engine.GetEvaluationCentipawns(treeMove.ColorId);

            if (engineEvaluation != null)
            {
                engineEvaluation.Depth = engineDepth;
                engineEvaluation.EvaluationCentipawns = evaluationCentipawns;
                chessMetersContext.Update(engineEvaluation);
                await chessMetersContext.SaveChangesAsync();
            }
            else
            {
                await chessMetersContext.EngineEvaluations.AddAsync(new EngineEvaluation
                {
                    TreeMoveId           = treeMove.Id,
                    EngineId             = engine.EngineId,
                    Depth                = engineDepth,
                    EvaluationCentipawns = evaluationCentipawns
                });

                await chessMetersContext.SaveChangesAsync();
            }
            return(engineEvaluation);
        }
        public async Task <IEnumerable <TreeMove> > BuildTree(short analyzeDepth, Game game)
        {
            var treeMoves = new List <TreeMove>();

            try
            {
                var moves = game.Moves.Split(' ');
                if (!moves.Any())
                {
                    return(treeMoves);
                }

                var      fullPathIds    = new List <long>();
                TreeMove parentTreeMove = null;

                await engineAnalyzeEvaluator.StartNewGame(analyzeDepth);

                foreach (var move in moves)
                {
                    var parentTreeMoveId = parentTreeMove?.Id;
                    var treeMove         = await chessMetersContext.TreeMoves.SingleOrDefaultAsync(x => x.Move == move && x.ParentTreeMoveId == parentTreeMoveId);

                    if (treeMove == null)
                    {
                        treeMove = new TreeMove
                        {
                            Move             = move,
                            FullPath         = fullPathIds.Any() ? string.Join(" ", fullPathIds) : null,
                            ParentTreeMoveId = parentTreeMoveId,
                            ParentTreeMove   = parentTreeMove,
                            ColorId          = fullPathIds.Count % 2 == 0 ? ColorEnum.White : ColorEnum.Black
                        };
                        await chessMetersContext.TreeMoves.AddAsync(treeMove);

                        await chessMetersContext.SaveChangesAsync();
                    }

                    await engineAnalyzeEvaluator.BuildEngineEvaluations(treeMove, treeMoves.Select(x => x.Move).ToArray());

                    treeMoves.Add(treeMove);
                    fullPathIds.Add(treeMove.Id);
                    parentTreeMove = treeMove;
                }

                game.LastTreeMoveId = fullPathIds.LastOrDefault();
                chessMetersContext.Games.Update(game);
                await chessMetersContext.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                game.AnalyzeExceptionStackTrace = ex.ToString();
            }

            return(treeMoves);
        }
Example #3
0
 private static double GetEvaluationAverage(TreeMove treeMove)
 {
     return(treeMove.EngineEvaluations.Average(x => x.EvaluationCentipawns));
 }