public WeightSetCollection(ITopoArray <int> weightSetByIndex, IDictionary <int, IDictionary <Tile, PriorityAndWeight> > weightSets, TileModelMapping tileModelMapping) { this.weightSetByIndex = weightSetByIndex; this.weightSets = weightSets; this.tileModelMapping = tileModelMapping; frequencySets = new Dictionary <int, FrequencySet>(); }
public TilePropagator(TileModel tileModel, ITopology topology, TilePropagatorOptions options) { this.tileModel = tileModel; this.topology = topology; var overlapping = tileModel as OverlappingModel; tileModelMapping = tileModel.GetTileModelMapping(topology); var patternTopology = tileModelMapping.PatternTopology; var patternModel = tileModelMapping.PatternModel; var waveConstraints = (options.Constraints?.Select(x => new TileConstraintAdaptor(x, this)).ToArray() ?? Enumerable.Empty <IWaveConstraint>()) .ToArray(); var waveFrequencySets = options.Weights == null ? null : GetFrequencySets(options.Weights, tileModelMapping); #pragma warning disable CS0618 // Type or member is obsolete this.wavePropagator = new WavePropagator( patternModel, patternTopology, options.BackTrackDepth, waveConstraints, options.RandomDouble ?? (options.Random == null ? (Func <double>)null : options.Random.NextDouble), waveFrequencySets, clear: false); #pragma warning restore CS0618 // Type or member is obsolete wavePropagator.Clear(); }
public SelectedTracker(TilePropagator tilePropagator, WavePropagator wavePropagator, TileModelMapping tileModelMapping, TilePropagatorTileSet tileSet) { this.tilePropagator = tilePropagator; this.wavePropagator = wavePropagator; this.tileModelMapping = tileModelMapping; this.tileSet = tileSet; patternCounts = new int[tilePropagator.Topology.IndexCount]; }
internal SelectedChangeTracker(TilePropagator tilePropagator, WavePropagator wavePropagator, TileModelMapping tileModelMapping, TilePropagatorTileSet tileSet, IQuadstateChanged onChange) { this.tilePropagator = tilePropagator; this.wavePropagator = wavePropagator; this.tileModelMapping = tileModelMapping; this.tileSet = tileSet; this.onChange = onChange; patternCounts = new int[tilePropagator.Topology.IndexCount]; values = new Quadstate[tilePropagator.Topology.IndexCount]; }
internal IPickHeuristic GetHeuristic( IRandomPicker randomPicker, Func <double> randomDouble, TilePropagator propagator, TileModelMapping tileModelMapping, IPickHeuristic fallbackHeuristic) { return(new FollowPathHeuristic( randomPicker, randomDouble, propagator, tileModelMapping, fallbackHeuristic, this)); }
public FollowPathHeuristic( IRandomPicker randomPicker, Func <double> randomDouble, TilePropagator propagator, TileModelMapping tileModelMapping, IPickHeuristic fallbackHeuristic, EdgedPathView edgedPathView) { this.randomPicker = randomPicker; this.randomDouble = randomDouble; this.propagator = propagator; this.tileModelMapping = tileModelMapping; this.fallbackHeuristic = fallbackHeuristic; this.edgedPathView = edgedPathView; }
internal IPickHeuristic GetHeuristic( IRandomPicker randomPicker, Func <double> randomDouble, TilePropagator propagator, TileModelMapping tileModelMapping, IPickHeuristic fallbackHeuristic) { pathView = PathSpec.MakeView(propagator); pathViewIsFresh = true; if (pathView is EdgedPathView epv) { return(new FollowPathHeuristic( randomPicker, randomDouble, propagator, tileModelMapping, fallbackHeuristic, epv)); } else { throw new NotImplementedException(); } }
public TilePropagator(TileModel tileModel, ITopology topology, TilePropagatorOptions options) { this.tileModel = tileModel; this.topology = topology; var overlapping = tileModel as OverlappingModel; tileModelMapping = tileModel.GetTileModelMapping(topology); var patternTopology = tileModelMapping.PatternTopology; var patternModel = tileModelMapping.PatternModel; var waveConstraints = (options.Constraints?.Select(x => new TileConstraintAdaptor(x, this)).ToArray() ?? Enumerable.Empty <IWaveConstraint>()) .ToArray(); #pragma warning disable CS0618 // Type or member is obsolete var randomDouble = options.RandomDouble ?? (options.Random ?? new Random()).NextDouble; #pragma warning restore CS0618 // Type or member is obsolete var(indexPicker, patternPicker) = MakePickers(options); var wavePropagatorOptions = new WavePropagatorOptions { BacktrackPolicy = MakeBacktrackPolicy(options), MaxBacktrackDepth = options.MaxBacktrackDepth, RandomDouble = randomDouble, Constraints = waveConstraints, IndexPicker = indexPicker, PatternPicker = patternPicker, Clear = false, ModelConstraintAlgorithm = options.ModelConstraintAlgorithm, }; this.wavePropagator = new WavePropagator( patternModel, patternTopology, wavePropagatorOptions); wavePropagator.Clear(); }
private static FrequencySet[] GetFrequencySets(ITopoArray <IDictionary <Tile, PriorityAndWeight> > weights, TileModelMapping tileModelMapping) { var frequencies = new FrequencySet[tileModelMapping.PatternTopology.IndexCount]; foreach (var patternIndex in tileModelMapping.PatternTopology.GetIndices()) { // TODO if (tileModelMapping.PatternCoordToTileCoordIndexAndOffset != null) { throw new NotImplementedException(); } // TODO: Detect duplicate dictionaries by reference and share the frequency sets? var tileIndex = patternIndex; var offset = 0; var weightDict = weights.Get(tileIndex); var newWeights = new double[tileModelMapping.PatternModel.PatternCount]; var newPriorities = new int[tileModelMapping.PatternModel.PatternCount]; foreach (var kv in weightDict) { var pattern = tileModelMapping.TilesToPatternsByOffset[offset][kv.Key].Single(); newWeights[pattern] = kv.Value.Weight; newPriorities[pattern] = kv.Value.Priority; } frequencies[patternIndex] = new FrequencySet(newWeights, newPriorities); } return(frequencies); }
internal ChangeTracker(TileModelMapping tileModelMapping) { this.tileModelMapping = tileModelMapping; }
private static FrequencySet GetFrequencySet(IDictionary <Tile, PriorityAndWeight> weights, TileModelMapping tileModelMapping) { // TODO: Handle overlapped if (tileModelMapping.PatternCoordToTileCoordIndexAndOffset != null) { throw new NotImplementedException(); } var offset = 0; var newWeights = new double[tileModelMapping.PatternModel.PatternCount]; var newPriorities = new int[tileModelMapping.PatternModel.PatternCount]; foreach (var kv in weights) { var pattern = tileModelMapping.TilesToPatternsByOffset[offset][kv.Key].Single(); newWeights[pattern] = kv.Value.Weight; newPriorities[pattern] = kv.Value.Priority; } return(new FrequencySet(newWeights, newPriorities)); }
public TilePropagator(TileModel tileModel, ITopology topology, TilePropagatorOptions options) { this.tileModel = tileModel; this.topology = topology; var overlapping = tileModel as OverlappingModel; tileModelMapping = tileModel.GetTileModelMapping(topology); var patternTopology = tileModelMapping.PatternTopology; var patternModel = tileModelMapping.PatternModel; var waveConstraints = (options.Constraints?.Select(x => new TileConstraintAdaptor(x, this)).ToArray() ?? Enumerable.Empty <IWaveConstraint>()) .ToArray(); var waveFrequencySets = options.Weights == null ? null : GetFrequencySets(options.Weights, tileModelMapping); #pragma warning disable CS0618 // Type or member is obsolete var randomDouble = options.RandomDouble ?? (options.Random ?? new Random()).NextDouble; #pragma warning restore CS0618 // Type or member is obsolete IPickHeuristic MakePickHeuristic(WavePropagator wavePropagator) { IRandomPicker randomPicker; if (options.PickHeuristicType == PickHeuristicType.Ordered) { randomPicker = new OrderedRandomPicker(wavePropagator.Wave, wavePropagator.Frequencies, patternTopology.Mask); } else if (waveFrequencySets != null) { var entropyTracker = new ArrayPriorityEntropyTracker(wavePropagator.Wave, waveFrequencySets, patternTopology.Mask); entropyTracker.Reset(); wavePropagator.AddTracker(entropyTracker); randomPicker = entropyTracker; } else { var entropyTracker = new EntropyTracker(wavePropagator.Wave, wavePropagator.Frequencies, patternTopology.Mask); entropyTracker.Reset(); wavePropagator.AddTracker(entropyTracker); randomPicker = entropyTracker; } IPickHeuristic heuristic = new RandomPickerHeuristic(randomPicker, randomDouble); var pathConstraint = options.Constraints?.OfType <EdgedPathConstraint>().FirstOrDefault(); if (pathConstraint != null && pathConstraint.UsePickHeuristic) { heuristic = pathConstraint.GetHeuristic( randomPicker, randomDouble, this, tileModelMapping, heuristic); } var connectedConstraint = options.Constraints?.OfType <ConnectedConstraint>().FirstOrDefault(); if (connectedConstraint != null && connectedConstraint.UsePickHeuristic) { heuristic = connectedConstraint.GetHeuristic( randomPicker, randomDouble, this, tileModelMapping, heuristic); } return(heuristic); } var wavePropagatorOptions = new WavePropagatorOptions { BackTrackDepth = options.BackTrackDepth, RandomDouble = randomDouble, Constraints = waveConstraints, PickHeuristicFactory = MakePickHeuristic, Clear = false, ModelConstraintAlgorithm = options.ModelConstraintAlgorithm, }; this.wavePropagator = new WavePropagator( patternModel, patternTopology, wavePropagatorOptions); wavePropagator.Clear(); }
internal ChangeTracker(TileModelMapping tileModelMapping, int indexCount) { this.tileModelMapping = tileModelMapping; this.indexCount = indexCount; }
internal ChangeTracker(TileModelMapping tileModelMapping) : this(tileModelMapping, tileModelMapping.PatternTopology.IndexCount) { }