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); }
private static double GetEvaluationAverage(TreeMove treeMove) { return(treeMove.EngineEvaluations.Average(x => x.EvaluationCentipawns)); }