public bool IsFrozen(IDependencyState <T> state)
        {
            var targets = TargetsTaken.Where(x => x.Value.Contains(state))
                          .Select(x => x.Key)
                          .Concat(state.NextTargets)
                          .ToList();

            var dependingStates = targets.SelectMany(x => DependanciesTaken.Where(d => d.Key.Equals(x)).SelectMany(d => d.Value).Concat(UnboundedDependancyTaken));

            return(dependingStates.Any(x => !x.Equals(state) && !IsCompleted(x)));
        }
        // Reset anything that has taken a dependency on this state
        public void ResetDependenciesOf(IDependencyState <T> state)
        {
            var targets = TargetsTaken.Where(x => x.Value.Contains(state))
                          .Select(x => x.Key)
                          .ToList();

            // Reset bounded dependencies taken
            foreach (var dependancy in targets.Where(DependanciesTaken.ContainsKey))
            {
                ResetSet(state, DependanciesTaken[dependancy]);
            }

            // Reset unbounded dependencies taken
            ResetSet(state, UnboundedDependancyTaken);

            // clear targets
            foreach (var target in targets)
            {
                TargetsTaken[target].Remove(state);
            }
        }
 public void Update(IDependencyState <T> state)
 {
     // Manage dependencies and targets taken
     foreach (var dependancy in state.NextDependencies)
     {
         if (!DependanciesTaken.ContainsKey(dependancy))
         {
             DependanciesTaken[dependancy] = new HashSet <IDependencyState <T> >();
         }
         DependanciesTaken[dependancy].Add(state);
     }
     if (state.NextUnboundDependency)
     {
         UnboundedDependancyTaken.Add(state);
     }
     foreach (var target in state.NextTargets)
     {
         if (!TargetsTaken.ContainsKey(target))
         {
             TargetsTaken[target] = new HashSet <IDependencyState <T> >();
         }
         TargetsTaken[target].Add(state);
     }
 }
 public override BotletMove GetMove()
 {
     if (Square.DistanceFrom(Grid.EnemySpawn) < 2)
     {
         return(GetMoveToTarget(Grid.EnemySpawn));
     }
     else if (Square.DistanceFrom(Grid.EnemySpawn) < 10 && SquareNextToEdge())
     {
         var edgeSquare = Square.GetAdjacentSquares().FirstOrDefault(x => SquareOnEdge(x) && !TargetsTaken.Contains(x));
         if (edgeSquare != null)
         {
             return(GetMoveToTarget(edgeSquare));
         }
     }
     else if (SquareOnEdge(Square))
     {
         var currentDistance  = Square.DistanceFrom(Grid.EnemySpawn);
         var nextSquareOnEdge = Square.GetAdjacentSquares().FirstOrDefault(x => SquareOnEdge(x) && x.DistanceFrom(Grid.EnemySpawn) < currentDistance);
         if (nextSquareOnEdge != null)
         {
             return(GetMoveToTarget(nextSquareOnEdge));
         }
     }
     return(GetMoveToTarget(Grid.EnemySpawn));
     //var meetupPoints = GetMeetupPoints(Grid);
     //var occupiedSquares = Army.Select(x => x.Square);
     //var unOccupiedMeetupPonts = meetupPoints.Where(x => !occupiedSquares.Contains(x));
     //var meetupsToMoveTo = unOccupiedMeetupPonts.Where(TargetsTaken.Contains).ToList();
     //if (meetupsToMoveTo.Any())
     //{
     //    return GetMoveToTarget(meetupsToMoveTo.First());
     //}
     //else
     //{
     //    if (Grid.EnemySpawn.X == 1)
     //    {
     //        var nextSquare = Grid[Square.X, Square.Y - 1];
     //        return new BotletMove(Square.LineIndex, nextSquare.LineIndex);
     //    }
     //    else
     //    {
     //        var nextSquare = Grid[Square.X, Square.Y + 1];
     //        return new BotletMove(Square.LineIndex, nextSquare.LineIndex);
     //    }
     //}
 }