GenerationAnalysis.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. namespace DunGen.Analysis
  4. {
  5. public class GenerationAnalysis
  6. {
  7. public static readonly GenerationStatus[] MeasurableSteps = new[]
  8. {
  9. GenerationStatus.PreProcessing,
  10. GenerationStatus.TileInjection,
  11. GenerationStatus.MainPath,
  12. GenerationStatus.Branching,
  13. GenerationStatus.BranchPruning,
  14. GenerationStatus.InstantiatingTiles,
  15. GenerationStatus.PostProcessing
  16. };
  17. public int TargetIterationCount { get; private set; }
  18. public int IterationCount { get; private set; }
  19. public NumberSetData MainPathRoomCount { get; private set; }
  20. public NumberSetData BranchPathRoomCount { get; private set; }
  21. public NumberSetData TotalRoomCount { get; private set; }
  22. public NumberSetData MaxBranchDepth { get; private set; }
  23. public NumberSetData TotalRetries { get; private set; }
  24. public Dictionary<GenerationStatus, NumberSetData> GenerationStepTimes { get; private set; }
  25. public NumberSetData TotalTime { get; private set; }
  26. public float AnalysisTime { get; private set; }
  27. public int SuccessCount { get; private set; }
  28. public float SuccessPercentage { get { return (SuccessCount / (float)TargetIterationCount) * 100; } }
  29. private readonly List<GenerationStats> statsSet = new List<GenerationStats>();
  30. public GenerationAnalysis(int targetIterationCount)
  31. {
  32. TargetIterationCount = targetIterationCount;
  33. GenerationStepTimes = new Dictionary<GenerationStatus, NumberSetData>();
  34. }
  35. public NumberSetData GetGenerationStepData(GenerationStatus step)
  36. {
  37. if (GenerationStepTimes.TryGetValue(step, out var data))
  38. return data;
  39. else
  40. return new NumberSetData(new float[0]);
  41. }
  42. public void Clear()
  43. {
  44. IterationCount = 0;
  45. AnalysisTime = 0;
  46. SuccessCount = 0;
  47. statsSet.Clear();
  48. GenerationStepTimes.Clear();
  49. }
  50. public void Add(GenerationStats stats)
  51. {
  52. statsSet.Add(stats.Clone());
  53. AnalysisTime += stats.TotalTime;
  54. IterationCount++;
  55. }
  56. public void IncrementSuccessCount()
  57. {
  58. SuccessCount++;
  59. }
  60. public void Analyze()
  61. {
  62. MainPathRoomCount = new NumberSetData(statsSet.Select(x => (float)x.MainPathRoomCount));
  63. BranchPathRoomCount = new NumberSetData(statsSet.Select(x => (float)x.BranchPathRoomCount));
  64. TotalRoomCount = new NumberSetData(statsSet.Select(x => (float)x.TotalRoomCount));
  65. MaxBranchDepth = new NumberSetData(statsSet.Select(x => (float)x.MaxBranchDepth));
  66. TotalRetries = new NumberSetData(statsSet.Select(x => (float)x.TotalRetries));
  67. foreach (var step in MeasurableSteps)
  68. GenerationStepTimes[step] = new NumberSetData(statsSet.Select(x => x.GetGenerationStepTime(step)));
  69. TotalTime = new NumberSetData(statsSet.Select(x => x.TotalTime));
  70. }
  71. }
  72. }