protected (uint[], string[], uint[]) RemovedStateTranslateTables(params uint[] keepStates) { bool[] fromStartReachable = ReachableStates(keepStates); uint[] translate = new uint[fromStartReachable.Count((b) => b)]; for (uint i = 0; i < translate.Length; i++) { uint j = i; if (i > 0) { j = System.Math.Max(i, translate[i - 1] + 1); } while (!fromStartReachable[j]) { j++; } translate[i] = j; } if (translate.ArrayIndex(StartState) > this.StatesCount) { throw new Uni.Automat.StateException(StartState, "removed with too high start state"); } string[] names = new string[translate.Length]; for (int i = 0; i < translate.Length; i++) { names[i] = translate[i].ToString(); } var astates = new List <uint>(AcceptedStates.Length); foreach (var accept in AcceptedStates) { if (translate.Contains(accept)) { astates.Add(translate.ArrayIndex(accept)); } } return(translate, names, astates.ToArray()); }