public void Clear() { toPropagate.Clear(); compatible = new int[indexCount, patternCount, directionsCount]; for (int index = 0; index < indexCount; index++) { if (!topology.ContainsIndex(index)) { continue; } for (int pattern = 0; pattern < patternCount; pattern++) { for (int d = 0; d < directionsCount; d++) { if (topology.TryMove(index, (Direction)d, out var dest, out var _, out var el)) { var compatiblePatterns = propagatorArray[pattern][(int)el].Length; compatible[index, pattern, d] = compatiblePatterns; if (compatiblePatterns == 0 && propagator.Wave.Get(index, pattern)) { if (propagator.InternalBan(index, pattern)) { propagator.SetContradiction(); } break; } } } } } }
public void Propagate() { while (toPropagate.Count > 0) { var item = toPropagate.Pop(); var index = item.Index; var pattern = item.Pattern; int x, y, z; topology.GetCoord(index, out x, out y, out z); for (var d = 0; d < directionsCount; d++) { if (!topology.TryMove(x, y, z, (Direction)d, out var i2, out Direction id, out EdgeLabel el)) { continue; } var patternsDense = propagatorArrayDense[pattern][(int)el]; for (var p = 0; p < patternCount; p++) { if (patternsDense[p]) { continue; } if (wave.Get(i2, p)) { if (propagator.InternalBan(i2, p)) { propagator.SetContradiction(); } } } } } }