public string NextTransition(DirectedTransitions _dt = null)
 {
     if (_dt == null)
     {
         _dt = dt;
     }
     return(reachableTransitions.FirstOrDefault(t => _dt.Test(t) && unplacedTransitions.Contains(t)));
 }
        public string ForceTransition(DirectedTransitions _dt = null)
        {
            if (_dt == null)
            {
                _dt = dt;
            }

            List <string> candidateTransitions = new List <string>();

            candidateTransitions.AddRange(unplacedTransitions);
            candidateTransitions.AddRange(standbyTransitions.Keys);
            candidateTransitions = candidateTransitions.Except(reachableTransitions).Where(transition => _dt.Test(transition)).ToList();
            bool Test(string transition)
            {
                HashSet <string> tempProgression = FakeUpdateReachableTransitions(transition);

                tempProgression.Remove(transition);
                tempProgression.IntersectWith(candidateTransitions);
                return(tempProgression.Any());
            }

            return(candidateTransitions.FirstOrDefault(t => Test(t)));
        }