internal void EndPositionDiscovered(GWPosition <PositionData, ActionData> position)
        {
            if (position.IsEndPosition)
            {
                CategoryEvaluationLogic.AddPositionFound(position);
                position.Score = EndPositionEvaluator.Evaluate(position);

                if (BestResult == null || position.Score > BestResult.Score)
                {
                    BestResult = position;
                    NewBestResult.Enter(position);
                }
            }
        }
        private void Prepare()
        {
            random = new Random(2016);
            ComputationInfo.Progress = 0;
            BestResult = null;
            RunnerPool.Clear();
            CheckPoints.Clear();
            CategoryEvaluationLogic.Reset();
            LastGeneration = new List <PreSolution <PositionData, ActionData, CheckPointType> >();
            PreSolutions   = new List <PreSolution <PositionData, ActionData, CheckPointType> >();
            var startPos = MandatoryActionExecuter.ExecuteMandatoryActions(new GWPosition <PositionData, ActionData>(Input.CreateStartPosition(), 0, null));

            PreSolutions.AddRange(startPos.Select(pos => new PreSolution <PositionData, ActionData, CheckPointType>(pos)));
            ProgressEstimator.Init(PreSolutions.First().Position.Data);
        }
        private CategoryEvaluation EvaluateCategory(GWPosition <PositionData, ActionData> pos)
        {
            var score = CategoryEvaluationLogic.Evaluate(pos);

            return(score);
        }