public WavePropagator( PatternModel model, ITopology topology, WavePropagatorOptions options) { this.patternCount = model.PatternCount; this.frequencies = model.Frequencies; this.indexCount = topology.IndexCount; this.backtrack = options.BacktrackPolicy != null; this.backtrackPolicy = options.BacktrackPolicy; this.maxBacktrackDepth = options.MaxBacktrackDepth; this.constraints = options.Constraints ?? new IWaveConstraint[0]; this.topology = topology; this.randomDouble = options.RandomDouble ?? new Random().NextDouble; directionsCount = topology.DirectionsCount; this.indexPicker = options.IndexPicker ?? new EntropyTracker(); this.patternPicker = options.PatternPicker ?? new WeightedRandomPatternPicker(); switch (options.ModelConstraintAlgorithm) { case ModelConstraintAlgorithm.OneStep: patternModelConstraint = new OneStepPatternModelConstraint(this, model); break; case ModelConstraintAlgorithm.Default: case ModelConstraintAlgorithm.Ac4: patternModelConstraint = new Ac4PatternModelConstraint(this, model); break; case ModelConstraintAlgorithm.Ac3: patternModelConstraint = new Ac3PatternModelConstraint(this, model); break; default: throw new Exception(); } if (options.Clear) { Clear(); } }
internal void TestBacktracking(int size, ModelConstraintAlgorithm algorithm, IBacktrackPolicy backtrackPolicy) { // Reproduces the wang tiles found at // https://en.wikipedia.org/wiki/Wang_tile // They only have aperiodic tiling, so they are a hard set to put down. // Clockwise from top var tileBorders = new[] { "rrrg", "brbg", "rggg", "wbrb", "bbwb", "wwrw", "rgbw", "bwbr", "brwr", "ggbr", "rwrg", }; var propagator = tileBorders.Select(tile1 => tile1.Select((c, i) => { var d = new[] { 3, 0, 2, 1 }[i]; var o = (i + 2) % 4; return(Tuple.Create(d, tileBorders .Select((tile2, i2) => Tuple.Create(tile2, i2)) .Where(t => t.Item1[o] == c) .Select(t => t.Item2) .ToArray())); }) .OrderBy(x => x.Item1) .Select(x => x.Item2) .ToArray() ).ToArray(); var model = new PatternModel { Frequencies = tileBorders.Select(x => 1.0).ToArray(), Propagator = propagator, }; var topology = new GridTopology(size, size, false); var seed = Environment.TickCount; var r = new Random(seed); System.Console.WriteLine("Seed {0}", seed); var options = new WavePropagatorOptions { BacktrackPolicy = backtrackPolicy, RandomDouble = r.NextDouble, ModelConstraintAlgorithm = algorithm, }; var wavePropagator = new WavePropagator(model, topology, options); var status = wavePropagator.Run(); Assert.AreEqual(Resolution.Decided, status); System.Console.WriteLine($"Backtrack Count {wavePropagator.BacktrackCount}"); System.Console.WriteLine($"Backjump Count {wavePropagator.BackjumpCount}"); }