-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFromScenarioSimulationBuilder.cs
59 lines (49 loc) · 2.14 KB
/
FromScenarioSimulationBuilder.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
using Damona.Examples.DistributionFactories;
using Damona.Examples.Distributions;
using Damona.Examples.ScenarioFactories;
using Damona.Schemas;
using Damona.Schemas.AutoMapper;
using Damona.Simulator;
using Damona.Simulator.Builders;
using Damona.Simulator.Builders.Factories;
namespace Damona.Examples;
/// <summary>
/// A simulation builder that builds its simulation based on a <see cref="Scenario"/> schema object.
/// </summary>
public class FromScenarioSimulationBuilder(
SpecialtyMap specialtyMap,
Scenario scenario) : ISimulationBuilder
{
private readonly SpecialtyMap _specialtyMap = specialtyMap;
private readonly Scenario _scenario = scenario;
public HospitalSimulation Build()
{
var scenarioFactory = BuildScenarioFactory();
var electiveSurgeryDistribution = new ElectiveDistributionFromScenarioFactory(_specialtyMap, _scenario);
var emergencyDistribution = new EmergencyDistributionFromScenarioFactory(_specialtyMap, _scenario);
var builder = new SimulationBuilder(
_scenario.StartTime,
_scenario.EndTime,
opt =>
{
opt.ScenarioFactory = scenarioFactory;
opt.ElectiveSurgeryDistributionFactory = electiveSurgeryDistribution;
opt.EmergencyDistributionFactory = emergencyDistribution;
opt.NewEmergenciesDistributionFactory =
new NewEmergenciesNormalUniformDistributionFactory(_scenario.StartTime);
opt.NewReferralsDistributionFactory =
new NewReferralsDistributionFactory(
(rng, dist) => new NewReferralsFromOldPlanExecution(rng, dist, _specialtyMap));
});
builder.BuildWaitingList(
_scenario.InitialWaitingList?.ToDictionary(x => _specialtyMap.GetOrAdd(x.Key), x => x.Value) ?? new()
);
return builder.Build();
}
private IScenarioFactory BuildScenarioFactory()
{
if (_scenario.ResourcePlan is null)
return new BasePlanScenarioFactory(_specialtyMap);
return new FromDtoScenarioFactory(_specialtyMap, _scenario.ResourcePlan);
}
}