forked from xmnovotny/VoxelTycoon-ScheduleStopwatch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDurationsPerStationsContainer.cs
127 lines (113 loc) · 4.99 KB
/
DurationsPerStationsContainer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Text;
using VoxelTycoon.Tracks;
using VoxelTycoon.Tracks.Tasks;
namespace ScheduleStopwatch
{
public class DurationsPerStationsContainer
{
public DurationsPerStationsContainer() { }
public DurationsPerStationsContainer(VehicleScheduleData scheduleData)
{
AddTimes(scheduleData);
}
/** add times from scheduleData as new (not to the average), keeps old data when new data isn't available */
public void NewTimes(VehicleScheduleData scheduleData)
{
MarkForOverwrite();
AddTimes(scheduleData);
}
/** add times from scheduleData to the existing data for averaging */
public void AddTimes(VehicleScheduleData scheduleData)
{
foreach ((RootTask endStationTask, VehicleStationLocation startStation, VehicleStationLocation endStation, List<VehicleStationLocation> nonstopStations) in scheduleData.GetNonNonstopScheduleParts())
{
TimeSpan? duration = scheduleData.GetAverageTravelDuration(endStationTask);
if (duration != null)
{
DurationDataSet travelTime = GetOrAddTravelTimeSet(startStation, endStation, nonstopStations);
travelTime.Add(duration.Value);
}
TimeSpan? stationDuration = scheduleData.GetAverageStationLoadingDuration(endStationTask);
if (stationDuration != null)
{
DurationDataSet stationTimeSet = GetOrAddStationTimeSet(endStation);
stationTimeSet.Add(stationDuration.Value);
}
}
}
public TimeSpan? GetTravelTime(VehicleStationLocation startStation, VehicleStationLocation endStation, List<VehicleStationLocation> nonstopStations = null)
{
int? hashCode = GetLocationsHashCode(nonstopStations);
if (_travelTimes.TryGetValue((startStation, endStation, hashCode), out DurationDataSet travelTime))
{
return travelTime.TotalAverage;
}
return null;
}
public TimeSpan? GetStationTime(VehicleStationLocation station)
{
if (_stationTimes.TryGetValue(station, out DurationDataSet timeData))
{
return timeData.TotalAverage;
}
return null;
}
public void MarkForOverwrite()
{
foreach (DurationDataSet times in _travelTimes.Values)
{
times.MarkForOverwrite();
}
foreach (DurationDataSet times in _stationTimes.Values)
{
times.MarkForOverwrite();
}
}
public void DumpToLog()
{
FileLog.Log("Travel times count: " + _travelTimes.Count);
foreach (KeyValuePair<(VehicleStationLocation start, VehicleStationLocation end, int? nonstopHash), DurationDataSet> pair in _travelTimes)
{
FileLog.Log(String.Format("{0} => {1}: {2} {3}", pair.Key.start.Name, pair.Key.end.Name, pair.Value.TotalAverage.Value.TotalDays.ToString("N1"),
pair.Key.nonstopHash != null ? String.Format("hash: {0}", pair.Key.nonstopHash.ToString()) : ""));
}
}
private DurationDataSet GetOrAddStationTimeSet(VehicleStationLocation station)
{
if (!_stationTimes.TryGetValue(station, out DurationDataSet result))
{
result = new DurationDataSet(1);
_stationTimes.Add(station, result);
}
return result;
}
private DurationDataSet GetOrAddTravelTimeSet(VehicleStationLocation start, VehicleStationLocation end, List<VehicleStationLocation> nonstopList)
{
int? hashCode = GetLocationsHashCode(nonstopList);
if (!_travelTimes.TryGetValue((start, end, hashCode), out DurationDataSet travelTime))
{
travelTime = new DurationDataSet(1);
_travelTimes.Add((start, end, hashCode), travelTime);
}
return travelTime;
}
private int? GetLocationsHashCode(List<VehicleStationLocation> locations)
{
if (locations == null || locations.Count == 0)
{
return null;
}
int num = 0;
foreach (VehicleStationLocation location in locations)
{
num = num * -0x5AAAAAD7 + location.GetHashCode();
}
return num;
}
private readonly Dictionary<(VehicleStationLocation start, VehicleStationLocation end, int? nonstopHash), DurationDataSet> _travelTimes = new Dictionary<(VehicleStationLocation, VehicleStationLocation, int?), DurationDataSet>();
private readonly Dictionary<VehicleStationLocation, DurationDataSet> _stationTimes = new Dictionary<VehicleStationLocation, DurationDataSet>();
}
}