private Verticle PerformTransition(Verticle from, C chr) { var transition = aTransition; if (chr == C.B) { transition = bTransition; } foreach (var(t, i) in from.State.Select((t, i) => (t, i))) { if (t && transition[i] is null) { return(null); } } var res = new bool[N]; foreach (var(s, i) in from.State.Select((s, i) => (s, i))) { if (s) { res[transition[i].Value] = true; } } return(new Verticle(res)); }
public C[] Sync() { var start = new Verticle(Enumerable.Range(0, N).Select(_ => true).ToArray()); Verticle fin = null; var passed = new HashSet <Verticle> { start }; var pred = new Dictionary <Verticle, Tuple <Verticle, C> >(); var collection = new Queue <Verticle>(); collection.Enqueue(start); while (fin is null && collection.Count != 0) { var v = collection.Dequeue(); foreach (var c in _letters) { var u = PerformTransition(v, c); if (u is null || passed.Contains(u)) { continue; } pred[u] = Tuple.Create(v, c); if (u.Count == 1) { fin = u; } passed.Add(u); collection.Enqueue(u); } } if (fin is null) { return new C[] { } } ; var res = new List <C>(); while (!fin.Equals(start)) { var(v, c) = pred[fin]; res.Add(c); fin = v; } res.Reverse(); return(res.ToArray()); }