protected virtual IRoomDescription GetBasicRoomDescription() { var basicRoomTemplates = MapDescriptionUtils.GetBasicRoomTemplates(Options.Scale); var basicRoomDescription = new BasicRoomDescription(basicRoomTemplates); return(basicRoomDescription); }
protected virtual IRoomDescription GetCorridorRoomDescription(List <int> corridorOffsets, int width = 1) { var corridorRoomTemplates = MapDescriptionUtils.GetCorridorRoomTemplates(corridorOffsets, width); var corridorRoomDescription = new CorridorRoomDescription(corridorRoomTemplates); return(corridorRoomDescription); }
public BetterMapDescriptionLoader(Options options, RoomTemplatesSet roomTemplatesSet, RoomTemplateRepeatMode repeatMode = RoomTemplateRepeatMode.AllowRepeat) : base(options) { this.roomTemplatesSet = roomTemplatesSet; this.repeatMode = repeatMode; roomTemplatesSmall = GetSmallRoomTemplates(); roomTemplatesMedium = GetMediumRoomTemplates(); roomTemplatesOriginal = MapDescriptionUtils.GetBasicRoomTemplates(Options.Scale); }
protected virtual RoomDescriptionGrid2D GetCorridorRoomDescription(List <int> corridorOffsets, int width = 1) { var corridorRoomTemplates = MapDescriptionUtils.GetNewCorridorRoomTemplates(corridorOffsets, width); var corridorRoomDescription = new RoomDescriptionGrid2D ( isCorridor: true, roomTemplates: corridorRoomTemplates ); return(corridorRoomDescription); }
protected virtual List <NamedMapDescription> GetMapDescriptions(NamedGraph namedGraph, List <int> corridorOffsets) { var withCorridors = corridorOffsets[0] != 0; var canTouch = Options.CanTouch || !withCorridors; var basicRoomDescription = GetBasicRoomDescription(); var corridorRoomDescription = withCorridors ? GetCorridorRoomDescription(corridorOffsets) : null; var mapDescription = MapDescriptionUtils.GetBasicMapDescription(namedGraph.Graph, basicRoomDescription, corridorRoomDescription, withCorridors); var name = MapDescriptionUtils.GetInputName(namedGraph.Name, Options.Scale, withCorridors, corridorOffsets, canTouch); return(new List <NamedMapDescription>() { new NamedMapDescription(mapDescription, name, withCorridors) }); }
protected override List <NamedMapDescription> GetMapDescriptions(NamedGraph namedGraph, List <int> corridorOffsets) { var withCorridors = corridorOffsets[0] != 0; var canTouch = Options.CanTouch || !withCorridors; var corridorRoomDescription = withCorridors ? GetCorridorRoomDescription(corridorOffsets, roomTemplatesSet == RoomTemplatesSet.Original ? 1 : 2) : null; var mapDescription = new MapDescription <int>(); var graph = namedGraph.Graph; foreach (var room in graph.Vertices) { var basicRoomDescription = GetBasicRoomDescription(graph, room); mapDescription.AddRoom(room, basicRoomDescription); } var counter = graph.VerticesCount; foreach (var connection in graph.Edges) { if (withCorridors) { mapDescription.AddRoom(counter, corridorRoomDescription); mapDescription.AddConnection(connection.From, counter); mapDescription.AddConnection(connection.To, counter); counter++; } else { mapDescription.AddConnection(connection.From, connection.To); } } var name = MapDescriptionUtils.GetInputName(namedGraph.Name, Options.Scale, withCorridors, corridorOffsets, canTouch); return(new List <NamedMapDescription>() { new NamedMapDescription(mapDescription, name, withCorridors) }); }
public static void RunOld(Options options) { // TODO: make better Directory = Path.Combine("DungeonGeneratorEvolutions", FileNamesHelper.PrefixWithTimestamp(options.Name)); System.IO.Directory.CreateDirectory(Directory); Logger = new Logger(new ConsoleLoggerHandler(), new FileLoggerHandler(Path.Combine(Directory, "log.txt"))); var allGraphs = new Dictionary <string, Tuple <string, IGraph <int> > >() { { "1", Tuple.Create("Example 1 (fig. 1)", GraphsDatabase.GetExample1()) }, { "2", Tuple.Create("Example 2 (fig. 7 top)", GraphsDatabase.GetExample2()) }, { "3", Tuple.Create("Example 3 (fig. 7 bottom)", GraphsDatabase.GetExample3()) }, { "4", Tuple.Create("Example 4 (fig. 8)", GraphsDatabase.GetExample4()) }, { "5", Tuple.Create("Example 5 (fig. 9)", GraphsDatabase.GetExample5()) }, }; var mapDescriptions = new Dictionary <string, Tuple <string, MapDescription <int> > >() { { "gungeon_1_1", Tuple.Create("Gungeon 1_1", LoadMapDescription("gungeon_1_1")) }, { "gungeon_1_2", Tuple.Create("Gungeon 1_2", LoadMapDescription("gungeon_1_2")) }, { "gungeon_2_1", Tuple.Create("Gungeon 2_1", LoadMapDescription("gungeon_2_1")) }, { "gungeon_2_2", Tuple.Create("Gungeon 2_2", LoadMapDescription("gungeon_2_2")) }, // { "gungeon_2_4", Tuple.Create("Gungeon 2_4", LoadMapDescription("gungeon_2_4")) }, }; var allAnalyzers = new Dictionary <string, Func <IMapDescription <int>, IPerformanceAnalyzer <DungeonGeneratorConfiguration <int>, Individual <int> > > >() { { "MaxStageTwoFailures", (_) => new MaxStageTwoFailuresAnalyzer <DungeonGeneratorConfiguration <int>, GeneratorData>() }, { "MaxIterations", (_) => new MaxIterationsAnalyzer <DungeonGeneratorConfiguration <int>, GeneratorData>() }, { "ChainMerge", (_) => new ChainMergeAnalyzer <DungeonGeneratorConfiguration <int>, int, GeneratorData>() }, { "ChainOrder", (_) => new ChainOrderAnalyzer <DungeonGeneratorConfiguration <int>, int, GeneratorData>() }, { "MaxBranching", (_) => new MaxBranchingAnalyzer <DungeonGeneratorConfiguration <int>, GeneratorData>() }, { "ChainDecomposition", (mapDescription) => new ChainDecompositionAnalyzer <DungeonGeneratorConfiguration <int>, int, GeneratorData>(mapDescription) }, }; // Select graphs var graphs = options.Graphs.Count() != 0 ? options .Graphs .Select(x => allGraphs[x]) .ToList() : allGraphs.Values.ToList(); graphs = options .Graphs .Select(x => allGraphs[x]) .ToList(); // Select analyzers var analyzers = options.Mutations.Count() != 0 ? options .Mutations .Select(x => allAnalyzers[x]) .ToList() : allAnalyzers.Values.ToList(); var inputs = new List <Input>(); foreach (var graphPair in graphs) { foreach (var corridorOffset in options.CorridorOffsets) { var corridorOffsets = corridorOffset.Split(",").Select(x => int.Parse(x)).ToList(); var withCorridors = corridorOffsets[0] != 0; var canTouch = options.CanTouch || !withCorridors; var name = MapDescriptionUtils.GetInputName(graphPair.Item1, options.Scale, withCorridors, corridorOffsets, canTouch); var graph = graphPair.Item2; var basicRoomTemplates = MapDescriptionUtils.GetBasicRoomTemplates(options.Scale); var basicRoomDescription = new BasicRoomDescription(basicRoomTemplates); var corridorRoomTemplates = withCorridors ? MapDescriptionUtils.GetCorridorRoomTemplates(corridorOffsets) : null; var corridorRoomDescription = withCorridors ? new CorridorRoomDescription(corridorRoomTemplates) : null; var mapDescription = MapDescriptionUtils.GetBasicMapDescription(graph, basicRoomDescription, corridorRoomDescription, withCorridors); inputs.Add(new Input() { Name = name, MapDescription = mapDescription, Configuration = new DungeonGeneratorConfiguration <int>() { RoomsCanTouch = canTouch, } }); } } foreach (var mapDescriptionKey in options.MapDescriptions) { var mapDescription = mapDescriptions[mapDescriptionKey]; inputs.Add(new Input() { Name = mapDescription.Item1, MapDescription = mapDescription.Item2, Configuration = new DungeonGeneratorConfiguration <int>() { RoomsCanTouch = options.CanTouch, } }); } var resultsDict = new Dictionary <Input, Result>(); var partitioner = Partitioner.Create(inputs, EnumerablePartitionerOptions.NoBuffering); Parallel.ForEach(partitioner, new ParallelOptions { MaxDegreeOfParallelism = options.MaxThreads }, input => { lock (Logger) { Logger.WriteLine($"Started {input.Name}"); } var result = RunEvolution(input, options, analyzers.Select(x => x(input.MapDescription)).ToList()); lock (Logger) { Logger.WriteLine($"Ended {input.Name}"); } lock (resultsDict) { resultsDict[input] = result; } }); var results = inputs.Select(x => resultsDict[x]).ToList(); Logger.WriteLine(); AnalyzeMutations(results.ToList()); var inputsNewConfigurations = results.Select(x => new DungeonGeneratorInput <int>(x.Input.Name, x.Input.MapDescription, x.NewConfiguration)); var inputsOldConfigurations = results.Select(x => new DungeonGeneratorInput <int>(x.Input.Name, x.Input.MapDescription, x.Input.Configuration)); var benchmarkRunner = new BenchmarkRunner <IMapDescription <int> >(); var benchmarkScenarioNew = new BenchmarkScenario <IMapDescription <int> >("NewConfigurations", GetGeneratorRunnerFactory); var benchmarkScenarioOld = new BenchmarkScenario <IMapDescription <int> >("OldConfigurations", GetGeneratorRunnerFactory); var resultSaver = new BenchmarkResultSaver(); var scenarioResultNew = benchmarkRunner.Run(benchmarkScenarioNew, inputsNewConfigurations, options.FinalEvaluationIterations, new BenchmarkOptions() { WithConsolePreview = false, }); resultSaver.SaveResultDefaultLocation(scenarioResultNew, directory: Directory); var scenarioResultOld = benchmarkRunner.Run(benchmarkScenarioOld, inputsOldConfigurations, options.FinalEvaluationIterations, new BenchmarkOptions() { WithConsolePreview = false, }); resultSaver.SaveResultDefaultLocation(scenarioResultOld, directory: Directory); }
public void Run() { var rectangularRoomTemplates = MapDescriptionUtils.GetRectangularRoomTemplates(new Vector2Int(1, 1)); var basicRoomDescription = new BasicRoomDescription(rectangularRoomTemplates); var inputs = new List <DungeonGeneratorInput <int> >(); inputs.AddRange(Program.GetMapDescriptionsSet(new Vector2Int(1, 1), false, null, true)); inputs.AddRange(Program.GetMapDescriptionsSet(new Vector2Int(1, 1), false, null, true, basicRoomDescription: basicRoomDescription, suffix: "rect shapes")); inputs.AddRange(Program.GetMapDescriptionsSet(new Vector2Int(1, 1), true, new List <int>() { 2 }, false)); inputs.Add(LoadInput("gungeon_1_1")); inputs.Add(LoadInput("gungeon_1_1", true)); inputs.Add(LoadInput("gungeon_1_2")); inputs.Add(LoadInput("gungeon_1_2", true)); inputs.Add(LoadInput("gungeon_2_1")); inputs.Add(LoadInput("gungeon_2_1", true)); inputs.Add(LoadInput("gungeon_2_2")); inputs.Add(LoadInput("gungeon_2_2", true)); foreach (var input in inputs) { var mapDescription = input.MapDescription; var graph = mapDescription.GetStageOneGraph(); Console.WriteLine($"{input.Name} {graph.VerticesCount} {graph.Edges.Count()}"); } if (true) { inputs.Sort((x1, x2) => string.Compare(x1.Name, x2.Name, StringComparison.Ordinal)); } inputs = inputs.Where(x => !x.Name.StartsWith("Example 4")).ToList(); var layoutDrawer = new SVGLayoutDrawer <int>(); var benchmarkRunner = new BenchmarkRunner <IMapDescription <int> >(); var benchmarkScenario = new BenchmarkScenario <IMapDescription <int> >("CorridorConfigurationSpaces", input => { var dungeonGeneratorInput = (DungeonGeneratorInput <int>)input; var layoutGenerator = new DungeonGenerator <int>(input.MapDescription, dungeonGeneratorInput.Configuration); layoutGenerator.InjectRandomGenerator(new Random(0)); return(new LambdaGeneratorRunner(() => { var simulatedAnnealingArgsContainer = new List <SimulatedAnnealingEventArgs>(); void SimulatedAnnealingEventHandler(object sender, SimulatedAnnealingEventArgs eventArgs) { simulatedAnnealingArgsContainer.Add(eventArgs); } layoutGenerator.OnSimulatedAnnealingEvent += SimulatedAnnealingEventHandler; var layout = layoutGenerator.GenerateLayout(); layoutGenerator.OnSimulatedAnnealingEvent -= SimulatedAnnealingEventHandler; var additionalData = new AdditionalRunData() { SimulatedAnnealingEventArgs = simulatedAnnealingArgsContainer, GeneratedLayoutSvg = layoutDrawer.DrawLayout(layout, 800, forceSquare: true), GeneratedLayout = layout, }; var generatorRun = new GeneratorRun <AdditionalRunData>(layout != null, layoutGenerator.TimeTotal, layoutGenerator.IterationsCount, additionalData); return generatorRun; })); });
protected override IRoomDescription GetCorridorRoomDescription(List <int> corridorOffsets, int width = 1) { var corridorRoomTemplates = MapDescriptionUtils.GetCorridorRoomTemplates(corridorOffsets); return(new BasicRoomDescription(corridorRoomTemplates)); }