コード例 #1
0
 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>();
 }
コード例 #2
0
        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();
        }
コード例 #3
0
 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];
 }
コード例 #4
0
 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];
 }
コード例 #5
0
 internal IPickHeuristic GetHeuristic(
     IRandomPicker randomPicker,
     Func <double> randomDouble,
     TilePropagator propagator,
     TileModelMapping tileModelMapping,
     IPickHeuristic fallbackHeuristic)
 {
     return(new FollowPathHeuristic(
                randomPicker, randomDouble, propagator, tileModelMapping, fallbackHeuristic, this));
 }
コード例 #6
0
 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;
 }
コード例 #7
0
 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();
     }
 }
コード例 #8
0
        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();
        }
コード例 #9
0
        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);
        }
コード例 #10
0
 internal ChangeTracker(TileModelMapping tileModelMapping)
 {
     this.tileModelMapping = tileModelMapping;
 }
コード例 #11
0
        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));
        }
コード例 #12
0
        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();
        }
コード例 #13
0
ファイル: ChangeTracker.cs プロジェクト: studentutu/DeBroglie
 internal ChangeTracker(TileModelMapping tileModelMapping, int indexCount)
 {
     this.tileModelMapping = tileModelMapping;
     this.indexCount       = indexCount;
 }
コード例 #14
0
ファイル: ChangeTracker.cs プロジェクト: studentutu/DeBroglie
 internal ChangeTracker(TileModelMapping tileModelMapping)
     : this(tileModelMapping, tileModelMapping.PatternTopology.IndexCount)
 {
 }