public HM3A001Model( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM3AInputContext HM3AInputContext) : base( constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM3AInputContext) { // Objective function this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateObjectiveFunction001Factory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.sr, this.y) .Value); }
public IIndexElementsAbstractFactory CreateIndexElementsAbstractFactory() { IIndexElementsAbstractFactory abstractFactory = null; try { abstractFactory = new IndexElementsAbstractFactory(); } catch (Exception exception) { this.Log.Error("Exception message: " + exception.Message + " and stacktrace " + exception.StackTrace); } return(abstractFactory); }
public IIndexElementsAbstractFactory CreateIndexElementsAbstractFactory() { IIndexElementsAbstractFactory abstractFactory = null; try { abstractFactory = new IndexElementsAbstractFactory(); } catch (Exception exception) { this.Log.Error( exception.Message, exception); } return(abstractFactory); }
public IHM4Model Create( ICalculationsAbstractFactory calculationsAbstractFactory, IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM4InputContext HM4InputContext) { IHM4Model model = null; try { model = new HM4Model( calculationsAbstractFactory, constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM4InputContext); } catch (Exception exception) { this.Log.Error( exception.Message, exception); } return(model); }
public HM3B001Model( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM3BInputContext HM3BInputContext) : base( constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM3BInputContext) { // v(m, r) this.v = parametersAbstractFactory.CreatevFactory().Create( this.Context.MachineOperatingRoomAssignments .Select(x => parameterElementsAbstractFactory.CreatevParameterElementFactory().Create( this.m.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // w(j, r) this.w = parametersAbstractFactory.CreatewFactory().Create( this.Context.SurgicalSpecialtyOperatingRoomAssignments .Select(x => parameterElementsAbstractFactory.CreatewParameterElementFactory().Create( this.j.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // y(s, r) this.y = variablesAbstractFactory.CreateyFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value)); // Constraints 1 this.Model.AddConstraints( this.mr.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1ConstraintElementFactory().Create( x.mIndexElement, x.rIndexElement, this.m, this.s, this.v, this.ζ, this.y) .Value)); // Constraints 5L this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5LConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, this.b, this.y) .Value)); // Constraints 5M this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5MConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, this.Bs, this.b, this.y) .Value)); // Constraints 5U this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5UConstraintElementFactory().Create( x.jIndexElement, x.rIndexElement, x.sIndexElement, this.BBar, this.Bs, this.w, this.y) .Value)); // Constraints 10 this.Model.AddConstraints( this.srt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints10ConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, x.tIndexElement, this.x, this.y) .Value)); }
public HM4Model( ICalculationsAbstractFactory calculationsAbstractFactory, IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM4InputContext HM4InputContext) { this.Context = HM4InputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // d this.d = indicesAbstractFactory.CreatedFactory().Create( this.Context.Weekdays .Select(x => indexElementsAbstractFactory.CreatedIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // j this.j = indicesAbstractFactory.CreatejFactory().Create( this.Context.SurgicalSpecialties .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatejIndexElementFactory().Create(x)) .ToImmutableList()); // l this.l = indicesAbstractFactory.CreatelFactory().Create( this.Context.LengthOfStayDays .Select(x => indexElementsAbstractFactory.CreatelIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.Context.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.Context.Surgeons .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // t this.t = indicesAbstractFactory.CreatetFactory().Create( this.Context.PlanningHorizon .Select(x => indexElementsAbstractFactory.CreatetIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // Λ this.Λ = indicesAbstractFactory.CreateΛFactory().Create( this.Context.Scenarios .Select(x => indexElementsAbstractFactory.CreateΛIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // Cross joins // dt this.dt = crossJoinsAbstractFactory.CreatedtFactory().Create( this.d.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatedtCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rt this.rt = crossJoinsAbstractFactory.CreatertFactory().Create( this.r.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatertCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // slΛ this.slΛ = crossJoinsAbstractFactory.CreateslΛFactory().Create( this.s.Value .SelectMany(b => this.l.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslΛCrossJoinElementFactory().Create(a.sIndexElement, a.lIndexElement, b)) .ToImmutableList()); // sr this.sr = crossJoinsAbstractFactory.CreatesrFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // srd this.srd = crossJoinsAbstractFactory.CreatesrdFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrdCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // srt this.srt = crossJoinsAbstractFactory.CreatesrtFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrtCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // st this.st = crossJoinsAbstractFactory.CreatestFactory().Create( this.s.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatestCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sΛ this.sΛ = crossJoinsAbstractFactory.CreatesΛFactory().Create( this.s.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // tΛ this.tΛ = crossJoinsAbstractFactory.CreatetΛFactory().Create( this.t.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatetΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // H this.H = parametersAbstractFactory.CreateHFactory().Create( this.Context.TimeBlockLength); // h(s, Λ) this.h = parametersAbstractFactory.CreatehFactory().Create( this.Context.SurgeonScenarioWeightedAverageSurgicalDurations .Select(x => parameterElementsAbstractFactory.CreatehParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), x.Item3)) .ToImmutableList()); // L(s) this.L = parametersAbstractFactory.CreateLFactory().Create( this.Context.SurgeonLengthOfStayMaximums .Select(x => parameterElementsAbstractFactory.CreateLParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // n(s, Λ) this.n = parametersAbstractFactory.CreatenFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatients .Select(x => parameterElementsAbstractFactory.CreatenParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (PositiveInt)x.Item3)) .ToImmutableList()); // p(s, l, Λ) this.p = parametersAbstractFactory.CreatepFactory().Create( this.Context.SurgeonDayScenarioLengthOfStayProbabilities .Select(x => parameterElementsAbstractFactory.CreatepParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), this.Λ.GetElementAt((PositiveInt)x.Item3), (FhirDecimal)x.Item4)) .ToImmutableList()); // W this.W = parametersAbstractFactory.CreateWFactory().Create( (PositiveInt)this.Context.NumberDaysPerWeek); // y(s, r) this.y = parametersAbstractFactory.CreateyFactory().Create( this.Context.SurgeonOperatingRoomAssignments .Select(x => parameterElementsAbstractFactory.CreateyParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // β(s, r, d) this.β = parametersAbstractFactory.CreateβFactory().Create( this.Context.SurgeonOperatingRoomDayNumberAssignedTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateβParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), this.d.GetElementAt((PositiveInt)x.Item3), (PositiveInt)x.Item4)) .ToImmutableList()); // γ(r, t) this.γ = parametersAbstractFactory.CreateγFactory().Create( this.Context.OperatingRoomDayAssignedAvailabilities .Select(x => parameterElementsAbstractFactory.CreateγParameterElementFactory().Create( this.r.GetElementAt(x.Item1), this.t.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // Δ(j) this.Δ = parametersAbstractFactory.CreateΔFactory().Create( this.Context.SurgicalSpecialties .Select(x => parameterElementsAbstractFactory.CreateΔParameterElementFactory().Create( this.j.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // δ1(s, r, d) this.δ1 = calculationsAbstractFactory.Createδ1CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.Createδ1ParameterElementFactory(), parametersAbstractFactory.Createδ1Factory(), calculationsAbstractFactory.Createδ1ParameterElementCalculationFactory().Create(), this.srd, this.t, this.W, this.β, this.γ); // δ2(s, r, d) this.δ2 = calculationsAbstractFactory.Createδ2CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.Createδ2ParameterElementFactory(), parametersAbstractFactory.Createδ2Factory(), calculationsAbstractFactory.Createδ2ParameterElementCalculationFactory().Create(), this.srd, this.t, this.W, this.β, this.γ); // δ3(s, r, d) this.δ3 = calculationsAbstractFactory.Createδ3CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.Createδ3ParameterElementFactory(), parametersAbstractFactory.Createδ3Factory(), calculationsAbstractFactory.Createδ3ParameterElementCalculationFactory().Create(), this.srd, this.t, this.W, this.β, this.γ); // δ4(s, r, d, t) this.δ4 = calculationsAbstractFactory.Createδ4CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.Createδ4ParameterElementFactory(), parametersAbstractFactory.Createδ4Factory(), calculationsAbstractFactory.Createδ4ParameterElementCalculationFactory().Create(), this.srd, this.t, this.W, this.δ3, this.γ); // μ(s, Λ) this.μ = parametersAbstractFactory.CreateμFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientMeans .Select(x => parameterElementsAbstractFactory.CreateμParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // Ρ(Λ) this.Ρ = parametersAbstractFactory.CreateΡFactory().Create( this.Context.ScenarioProbabilities .Select(x => parameterElementsAbstractFactory.CreateΡParameterElementFactory().Create( this.Λ.GetElementAt((PositiveInt)x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // σ(s, Λ) this.σ = parametersAbstractFactory.CreateσFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientStandardDeviations .Select(x => parameterElementsAbstractFactory.CreateσParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // ΦHat(s, l, Λ) this.ΦHat = parametersAbstractFactory.CreateΦHatFactory().Create( this.Context.SurgeonDayScenarioCumulativeNumberPatients .Select(x => parameterElementsAbstractFactory.CreateΦHatParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), this.Λ.GetElementAt((PositiveInt)x.Item3), (FhirDecimal)x.Item4)) .ToImmutableList()); // Ω this.Ω = parametersAbstractFactory.CreateΩFactory().Create( (PositiveInt)this.Context.MaximumNumberRecoveryWardBeds); // Variables // IHat(t, Λ) this.IHat = variablesAbstractFactory.CreateIHatFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.t.Value, indexSet2: this.Λ.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // x(s, r, t) this.x = variablesAbstractFactory.CreatexFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, indexSet3: this.t.Value)); // z(s, t) this.z = variablesAbstractFactory.CreatezFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.t.Value)); // Constraints // Constraints 1 this.Model.AddConstraints( this.srd.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1ConstraintElementFactory().Create( x.dIndexElement, x.rIndexElement, x.sIndexElement, this.t, this.W, this.β, this.x) .Value)); // Constraints 2 this.Model.AddConstraints( this.st.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints2ConstraintElementFactory().Create( x.sIndexElement, x.tIndexElement, this.r, this.x, this.z) .Value)); // Constraints 3 this.Model.AddConstraints( this.rt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( x.rIndexElement, x.tIndexElement, this.s, this.γ, this.x) .Value)); // Constraints 4 this.Model.AddConstraints( this.srt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints4ConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, x.tIndexElement, this.y, this.x) .Value)); // Constraints 5L this.Model.AddConstraints( this.srd.Value .SelectMany(b => this.t.GetNthElementsAt( b.dIndexElement.Value.Value.Value, this.t.GetT() - this.W.Value.Value.Value + b.dIndexElement.Value.Value.Value, this.W.Value.Value.Value), (a, b) => Tuple.Create(a.sIndexElement, a.rIndexElement, a.dIndexElement, b)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5LConstraintElementFactory().Create( x.Item3, x.Item2, x.Item1, x.Item4, this.t, this.W, this.δ1, this.δ4, this.x) .Value)); // Constraints 5U this.Model.AddConstraints( this.srd.Value .SelectMany(b => this.t.GetNthElementsAt( b.dIndexElement.Value.Value.Value, this.t.GetT() - this.W.Value.Value.Value + b.dIndexElement.Value.Value.Value, this.W.Value.Value.Value), (a, b) => Tuple.Create(a.sIndexElement, a.rIndexElement, a.dIndexElement, b)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5UConstraintElementFactory().Create( x.Item3, x.Item2, x.Item1, x.Item4, this.t, this.W, this.δ2, this.δ4, this.x) .Value)); // Constraints 6 this.Model.AddConstraints( this.tΛ.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints6ConstraintElementFactory().Create( x.tIndexElement, x.ΛIndexElement, this.l, this.t, this.st, this.ΦHat, this.IHat, this.z) .Value)); // Objective function this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateObjectiveFunctionFactory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.t, this.Λ, this.Ρ, this.IHat) .Value); }
public Task <IHM5OutputContext> Solve( ICalculationsAbstractFactory calculationsAbstractFactory, IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, IContextsAbstractFactory contextsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IModelsAbstractFactory modelsAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IResultElementsAbstractFactory resultElementsAbstractFactory, IResultsAbstractFactory resultsAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM5Configuration HM5Configuration, IHM5InputContext HM5InputContext, ISolverConfiguration solverConfiguration) { IHM5OutputContext HM5OutputContext = null; return(Task.Run(() => { using (ModelScope modelScope = dependenciesAbstractFactory.CreateModelScopeFactory().Create(HM5Configuration.Value)) { IHM5Model model = modelsAbstractFactory.CreateHM5ModelFactory().Create( calculationsAbstractFactory, constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM5InputContext); using (ISolver solver = dependenciesAbstractFactory.CreateSolverFactory().Create(solverConfiguration)) { Solution solution = solver?.Solve(model?.Model); if (solution?.ModelStatus == OPTANO.Modeling.Optimization.Solver.ModelStatus.Feasible) { model.Model.VariableCollections.ForEach(vc => vc.SetVariableValues(solution.VariableValues)); HM5OutputContext = contextsAbstractFactory.CreateHM5OutputContextFactory().Create( calculationsAbstractFactory, dependenciesAbstractFactory, resultElementsAbstractFactory, resultsAbstractFactory, model, solution); } } } return HM5OutputContext; })); }
public IHM3AModel Create( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM3AInputContext HM3AInputContext, HM3AEncodingEnum HM3AEncodingEnum) { IHM3AModel model = null; try { model = HM3AEncodingEnum switch { HM3AEncodingEnum.E001 => new HM3A001Model( constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM3AInputContext), HM3AEncodingEnum.E010 => new HM3A010Model( constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM3AInputContext), HM3AEncodingEnum.E100 => new HM3A100Model( constraintElementsAbstractFactory, constraintsAbstractFactory, crossJoinElementsAbstractFactory, crossJoinsAbstractFactory, dependenciesAbstractFactory, indexElementsAbstractFactory, indicesAbstractFactory, objectiveFunctionsAbstractFactory, parameterElementsAbstractFactory, parametersAbstractFactory, variablesAbstractFactory, HM3AInputContext), { } => throw new ArgumentException(nameof(HM3AEncodingEnum)), };
public TPModel( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, ITPInputContext TPInputContext) { this.TPInputContext = TPInputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // a this.a = indicesAbstractFactory.CreateaFactory().Create( this.TPInputContext.ActiveDays .Select(x => indexElementsAbstractFactory.CreateaIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // d this.d = indicesAbstractFactory.CreatedFactory().Create( this.TPInputContext.Days .Select(x => indexElementsAbstractFactory.CreatedIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // k this.k = indicesAbstractFactory.CreatekFactory().Create( this.TPInputContext.BlockTypes .Select(x => indexElementsAbstractFactory.CreatekIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // l this.l = indicesAbstractFactory.CreatelFactory().Create( this.TPInputContext.LengthOfStayDays .Select(x => indexElementsAbstractFactory.CreatelIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // p this.p = indicesAbstractFactory.CreatepFactory().Create( this.TPInputContext.PatientGroups .Select(x => indexElementsAbstractFactory.CreatepIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.TPInputContext.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.TPInputContext.SurgeonGroups .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // w this.w = indicesAbstractFactory.CreatewFactory().Create( this.TPInputContext.Wards .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatewIndexElementFactory().Create(x)) .ToImmutableList()); // Cross joins // ar this.ar = crossJoinsAbstractFactory.CreatearFactory().Create( this.a.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatearCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // pa this.pa = crossJoinsAbstractFactory.CreatepaFactory().Create( this.p.Value .SelectMany(b => this.a.Value, (a, b) => crossJoinElementsAbstractFactory.CreatepaCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rk this.rk = crossJoinsAbstractFactory.CreaterkFactory().Create( this.r.Value .SelectMany(b => this.k.Value, (a, b) => crossJoinElementsAbstractFactory.CreaterkCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sa this.sa = crossJoinsAbstractFactory.CreatesaFactory().Create( this.s.Value .SelectMany(b => this.a.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesaCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sark this.sark = crossJoinsAbstractFactory.CreatesarkFactory().Create( this.s.Value .SelectMany(b => this.a.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesaCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesarCrossJoinElementFactory().Create(a.sIndexElement, a.aIndexElement, b)) .SelectMany(b => this.k.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesarkCrossJoinElementFactory().Create(a.sIndexElement, a.aIndexElement, a.rIndexElement, b)) .ToImmutableList()); // sk this.sk = crossJoinsAbstractFactory.CreateskFactory().Create( this.s.Value .SelectMany(b => this.k.Value, (a, b) => crossJoinElementsAbstractFactory.CreateskCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // wd this.wd = crossJoinsAbstractFactory.CreatewdFactory().Create( this.w.Value .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatewdCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // BEDS this.BEDS = parametersAbstractFactory.CreateBEDSFactory().Create( (PositiveInt)this.TPInputContext.NumberBeds); // dur(p) this.dur = parametersAbstractFactory.CreatedurFactory().Create( this.TPInputContext.PatientGroupSurgeryDurations .Select(x => parameterElementsAbstractFactory.CreatedurParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), x.Value)) .ToImmutableList()); // Length(k) this.Length = parametersAbstractFactory.CreateLengthFactory().Create( this.TPInputContext.BlockTypeTimeBlockLengths .Select(x => parameterElementsAbstractFactory.CreateLengthParameterElementFactory().Create( this.k.GetElementAt((PositiveInt)x.Key), x.Value)) .ToImmutableList()); // ORday(a, r) this.ORday = parametersAbstractFactory.CreateORdayFactory().Create( this.TPInputContext.DayOperatingRoomOperatingCapacities .Select(x => parameterElementsAbstractFactory.CreateORdayParameterElementFactory().Create( this.a.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), x.Item3)) .ToImmutableList()); // P(s) this.Ps = parametersAbstractFactory.CreatePsFactory().Create( this.TPInputContext.SurgeonGroupSubsetPatientGroups .Select(x => parameterElementsAbstractFactory.CreatePsParameterElementFactory().Create( this.s.GetElementAt(x.Key), this.p.GetElementAt((PositiveInt)x.Value))) .ToImmutableList()); // P(w) this.Pw = parametersAbstractFactory.CreatePwFactory().Create( this.TPInputContext.WardSubsetPatientGroups .Select(x => parameterElementsAbstractFactory.CreatePwParameterElementFactory().Create( this.w.GetElementAt(x.Key), this.p.GetElementAt((PositiveInt)x.Value))) .ToImmutableList()); // prob(p, l) this.prob = parametersAbstractFactory.CreateprobFactory().Create( this.TPInputContext.PatientGroupDayLengthOfStayProbabilities .Select(x => parameterElementsAbstractFactory.CreateprobParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), x.Item3)) .ToImmutableList()); // THR(p) this.THR = parametersAbstractFactory.CreateTHRFactory().Create( this.TPInputContext.PatientGroupThroughputs .Select(x => parameterElementsAbstractFactory.CreateTHRParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // W this.W = parametersAbstractFactory.CreateWFactory().Create( this.TPInputContext.Wards .Select(x => parameterElementsAbstractFactory.CreateWParameterElementFactory().Create( this.w.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // α(w) this.α = parametersAbstractFactory.CreateαFactory().Create( this.TPInputContext.Wardα .Select(x => parameterElementsAbstractFactory.CreateαParameterElementFactory().Create( this.w.GetElementAt(x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // β(w) this.β = parametersAbstractFactory.CreateβFactory().Create( this.TPInputContext.Wardβ .Select(x => parameterElementsAbstractFactory.CreateβParameterElementFactory().Create( this.w.GetElementAt(x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // γ(w) this.γ = parametersAbstractFactory.CreateγFactory().Create( this.TPInputContext.Wardγ .Select(x => parameterElementsAbstractFactory.CreateγParameterElementFactory().Create( this.w.GetElementAt(x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // Variables // x(p, a) this.x = variablesAbstractFactory.CreateTPxFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.p.Value, indexSet2: this.a.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => int.MaxValue, variableTypeGenerator: (a, b) => VariableType.Integer)); // y(w) this.y = variablesAbstractFactory.CreateTPyFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, lowerBoundGenerator: (a) => 0, upperBoundGenerator: (a) => int.MaxValue, variableTypeGenerator: (a) => VariableType.Integer)); // z(s, a, r, k) this.z = variablesAbstractFactory.CreateTPzFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.a.Value, indexSet3: this.r.Value, indexSet4: this.k.Value, lowerBoundGenerator: (a, b, c, d) => 0, upperBoundGenerator: (a, b, c, d) => 1, variableTypeGenerator: (a, b, c, d) => VariableType.Binary)); // δMinus(w, d) this.δMinus = variablesAbstractFactory.CreateδMinusFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, indexSet2: this.d.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // δPlus(w) this.δPlus_w = variablesAbstractFactory.CreateδPluswFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, lowerBoundGenerator: (a) => 0, upperBoundGenerator: (a) => double.MaxValue, variableTypeGenerator: (a) => VariableType.Continuous)); // δPlus(w, d) this.δPlus_wd = variablesAbstractFactory.CreateδPluswdFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, indexSet2: this.d.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // μ(w, d) this.μ = variablesAbstractFactory.CreateμFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, indexSet2: this.d.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // Variance(w) this.Variance_w = variablesAbstractFactory.CreateVariancewFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, lowerBoundGenerator: (a) => 0, upperBoundGenerator: (a) => double.MaxValue, variableTypeGenerator: (a) => VariableType.Continuous)); // Variance(w, d) this.Variance_wd = variablesAbstractFactory.CreateVariancewdFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, indexSet2: this.d.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // Constraints // Constraint (2′′) this.Model.AddConstraint( constraintsAbstractFactory.CreateTPConstraint2Factory().Create( this.w, this.BEDS, this.y) .Value); // Constraints (9′) this.Model.AddConstraints( this.p.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints9ConstraintElementFactory().Create( i, this.a, this.THR, this.x) .Value)); // Constraints (11) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints11ConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.d, this.l, this.pa, this.Pw, this.prob, this.x, this.μ) .Value)); // Constraints (12) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints12ConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.d, this.l, this.pa, this.Pw, this.prob, this.x, this.Variance_wd) .Value)); // Constraints (13L) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints13LConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.y, this.δMinus, this.μ) .Value)); // Constraints (13M) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints13MConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.y, this.δPlus_wd, this.μ) .Value)); // Constraints (13U) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints13UConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.δPlus_w, this.δPlus_wd) .Value)); // Constraints (14) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints14ConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.Variance_w, this.Variance_wd) .Value)); // Constraints (15) this.Model.AddConstraints( this.ar.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints15ConstraintElementFactory().Create( i.aIndexElement, i.rIndexElement, this.sk, this.Length, this.ORday, this.z) .Value)); // Constraints (16) this.Model.AddConstraints( this.sa.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints16ConstraintElementFactory().Create( i.aIndexElement, i.sIndexElement, this.p, this.rk, this.dur, this.Length, this.Ps, this.x, this.z) .Value)); // Objective Function (10) this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateTPObjectiveFunctionFactory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.d, this.w, this.α, this.β, this.γ, this.δMinus, this.δPlus_w, this.Variance_w) .Value); }
public HM5Model( ICalculationsAbstractFactory calculationsAbstractFactory, IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM5InputContext HM5InputContext) { this.Context = HM5InputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // d1 this.d1 = indicesAbstractFactory.Created1Factory().Create( this.Context.Weekdays .Select(x => indexElementsAbstractFactory.Created1IndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // d2 this.d2 = indicesAbstractFactory.Created2Factory().Create( this.Context.Weekdays .Select(x => indexElementsAbstractFactory.Created2IndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // j this.j = indicesAbstractFactory.CreatejFactory().Create( this.Context.SurgicalSpecialties .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatejIndexElementFactory().Create(x)) .ToImmutableList()); // l this.l = indicesAbstractFactory.CreatelFactory().Create( this.Context.LengthOfStayDays .Select(x => indexElementsAbstractFactory.CreatelIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.Context.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.Context.Surgeons .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // t this.t = indicesAbstractFactory.CreatetFactory().Create( this.Context.PlanningHorizon .Select(x => indexElementsAbstractFactory.CreatetIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // Λ this.Λ = indicesAbstractFactory.CreateΛFactory().Create( this.Context.Scenarios .Select(x => indexElementsAbstractFactory.CreateΛIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // Cross joins // rd1 this.rd1 = crossJoinsAbstractFactory.Createrd1Factory().Create( this.r.Value .SelectMany(b => this.d1.Value, (a, b) => crossJoinElementsAbstractFactory.Createrd1CrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rd1d2 this.rd1d2 = crossJoinsAbstractFactory.Createrd1d2Factory().Create( this.r.Value .SelectMany(b => this.d1.Value, (a, b) => crossJoinElementsAbstractFactory.Createrd1CrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.d2.Value, (a, b) => crossJoinElementsAbstractFactory.Createrd1d2CrossJoinElementFactory().Create(a.rIndexElement, a.d1IndexElement, b)) .ToImmutableList()); // rd2 this.rd2 = crossJoinsAbstractFactory.Createrd2Factory().Create( this.r.Value .SelectMany(b => this.d2.Value, (a, b) => crossJoinElementsAbstractFactory.Createrd2CrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rt this.rt = crossJoinsAbstractFactory.CreatertFactory().Create( this.r.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatertCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // slΛ this.slΛ = crossJoinsAbstractFactory.CreateslΛFactory().Create( this.s.Value .SelectMany(b => this.l.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslΛCrossJoinElementFactory().Create(a.sIndexElement, a.lIndexElement, b)) .ToImmutableList()); // srd2 this.srd2 = crossJoinsAbstractFactory.Createsrd2Factory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.d2.Value, (a, b) => crossJoinElementsAbstractFactory.Createsrd2CrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // srd2t this.srd2t = crossJoinsAbstractFactory.Createsrd2tFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.d2.Value, (a, b) => crossJoinElementsAbstractFactory.Createsrd2CrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.Createsrd2tCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, a.d2IndexElement, b)) .ToImmutableList()); // srt this.srt = crossJoinsAbstractFactory.CreatesrtFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrtCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // st this.st = crossJoinsAbstractFactory.CreatestFactory().Create( this.s.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatestCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sΛ this.sΛ = crossJoinsAbstractFactory.CreatesΛFactory().Create( this.s.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // tΛ this.tΛ = crossJoinsAbstractFactory.CreatetΛFactory().Create( this.t.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatetΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // H this.H = parametersAbstractFactory.CreateHFactory().Create( this.Context.TimeBlockLength); // h(s, Λ) this.h = parametersAbstractFactory.CreatehFactory().Create( this.Context.SurgeonScenarioWeightedAverageSurgicalDurations .Select(x => parameterElementsAbstractFactory.CreatehParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), x.Item3)) .ToImmutableList()); // L(s) this.L = parametersAbstractFactory.CreateLFactory().Create( this.Context.SurgeonLengthOfStayMaximums .Select(x => parameterElementsAbstractFactory.CreateLParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // n(s, Λ) this.n = parametersAbstractFactory.CreatenFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatients .Select(x => parameterElementsAbstractFactory.CreatenParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (PositiveInt)x.Item3)) .ToImmutableList()); // p(s, l, Λ) this.p = parametersAbstractFactory.CreatepFactory().Create( this.Context.SurgeonDayScenarioLengthOfStayProbabilities .Select(x => parameterElementsAbstractFactory.CreatepParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), this.Λ.GetElementAt((PositiveInt)x.Item3), (FhirDecimal)x.Item4)) .ToImmutableList()); // Δ(j) // Must be populated before S1 this.Δ = parametersAbstractFactory.CreateΔFactory().Create( this.Context.SurgicalSpecialties .Select(x => parameterElementsAbstractFactory.CreateΔParameterElementFactory().Create( this.j.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // x(s, r, t) // Must be populated before S1 this.x = parametersAbstractFactory.CreatexFactory().Create( this.Context.SurgeonOperatingRoomDayAssignments .Select(x => parameterElementsAbstractFactory.CreatexParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), this.t.GetElementAt(x.Item3), (FhirBoolean)x.Item4)) .ToImmutableList()); // S1 this.S1 = calculationsAbstractFactory.CreateS1CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.CreateS1ParameterElementFactory(), parametersAbstractFactory.CreateS1Factory(), this.r, this.x, this.Δ); // W // Must be populated before S2 this.W = parametersAbstractFactory.CreateWFactory().Create( (PositiveInt)this.Context.NumberDaysPerWeek); // S2 this.S2 = calculationsAbstractFactory.CreateS2CalculationFactory().Create().Calculate( parameterElementsAbstractFactory.CreateS2ParameterElementFactory(), parametersAbstractFactory.CreateS2Factory(), this.d1, this.d2, this.r, this.t, this.rd1d2, this.W, this.x, this.Δ); // y(s, r) this.y = parametersAbstractFactory.CreateyFactory().Create( this.Context.SurgeonOperatingRoomAssignments .Select(x => parameterElementsAbstractFactory.CreateyParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.r.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // γ(r, t) this.γ = parametersAbstractFactory.CreateγFactory().Create( this.Context.OperatingRoomDayAssignedAvailabilities .Select(x => parameterElementsAbstractFactory.CreateγParameterElementFactory().Create( this.r.GetElementAt(x.Item1), this.t.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // μ(s, Λ) this.μ = parametersAbstractFactory.CreateμFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientMeans .Select(x => parameterElementsAbstractFactory.CreateμParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // Ρ(Λ) this.Ρ = parametersAbstractFactory.CreateΡFactory().Create( this.Context.ScenarioProbabilities .Select(x => parameterElementsAbstractFactory.CreateΡParameterElementFactory().Create( this.Λ.GetElementAt((PositiveInt)x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // σ(s, Λ) this.σ = parametersAbstractFactory.CreateσFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientStandardDeviations .Select(x => parameterElementsAbstractFactory.CreateσParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // ΦHat(s, l, Λ) this.ΦHat = parametersAbstractFactory.CreateΦHatFactory().Create( this.Context.SurgeonDayScenarioCumulativeNumberPatients .Select(x => parameterElementsAbstractFactory.CreateΦHatParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), this.Λ.GetElementAt((PositiveInt)x.Item3), (FhirDecimal)x.Item4)) .ToImmutableList()); // Ω this.Ω = parametersAbstractFactory.CreateΩFactory().Create( (PositiveInt)this.Context.MaximumNumberRecoveryWardBeds); // Variables // IHat(t, Λ) this.IHat = variablesAbstractFactory.CreateIHatFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.t.Value, indexSet2: this.Λ.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => double.MaxValue, variableTypeGenerator: (a, b) => VariableType.Continuous)); // xHat(s, r, t) this.xHat = variablesAbstractFactory.CreatexHatFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, indexSet3: this.t.Value, lowerBoundGenerator: (a, b, c) => 0, upperBoundGenerator: (a, b, c) => 1, variableTypeGenerator: (a, b, c) => VariableType.Binary)); // z(s, t) this.z = variablesAbstractFactory.CreatezFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.t.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => 1, variableTypeGenerator: (a, b) => VariableType.Binary)); // α(r, d1, d2) this.α = variablesAbstractFactory.CreateαFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.r.Value, indexSet2: this.d1.Value, indexSet3: this.d2.Value, lowerBoundGenerator: (a, b, c) => 0, upperBoundGenerator: (a, b, c) => 1, variableTypeGenerator: (a, b, c) => VariableType.Binary)); // Constraints // Constraints 1 this.Model.AddConstraints( this.st.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1ConstraintElementFactory().Create( x.sIndexElement, x.tIndexElement, this.r, this.xHat, this.z) .Value)); // Constraints 2 this.Model.AddConstraints( this.rt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints2ConstraintElementFactory().Create( x.rIndexElement, x.tIndexElement, this.s, this.γ, this.xHat) .Value)); // Constraints 3 this.Model.AddConstraints( this.srt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, x.tIndexElement, this.y, this.xHat) .Value)); // Constraints 4 this.Model.AddConstraints( this.tΛ.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints4ConstraintElementFactory().Create( x.tIndexElement, x.ΛIndexElement, this.l, this.t, this.st, this.ΦHat, this.IHat, this.z) .Value)); // Constraints 5 this.Model.AddConstraints( this.rd1.Value .Where(x => this.S1.IsThereElementAt(x.rIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5ConstraintElementFactory().Create( x.d1IndexElement, x.rIndexElement, this.d2, this.α) .Value)); // Constraints 6 this.Model.AddConstraints( this.rd2.Value .Where(x => this.S1.IsThereElementAt(x.rIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints6ConstraintElementFactory().Create( x.d2IndexElement, x.rIndexElement, this.d1, this.α) .Value)); // Constraints 7 this.Model.AddConstraints( this.rd1d2.Value .Where(x => this.S1.IsThereElementAt(x.rIndexElement)) .Where(x => this.S2.IsThereElementAt( x.rIndexElement, x.d1IndexElement, x.d2IndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints7ConstraintElementFactory().Create( x.rIndexElement, x.d1IndexElement, x.d2IndexElement, this.α) .Value)); // Constraints 8 this.Model.AddConstraints( this.srd2.Value .Where(x => this.S1.IsThereElementAt(x.rIndexElement)) .SelectMany(b => this.t.GetNthElementsAt( 0, this.W.Value.Value.Value * ((this.t.GetT() / this.W.Value.Value.Value) - 1), this.W.Value.Value.Value), (a, b) => Tuple.Create(a.sIndexElement, a.rIndexElement, a.d2IndexElement, b)) .Select( x => constraintElementsAbstractFactory.CreateConstraints8ConstraintElementFactory().Create( x.Item3, x.Item2, x.Item1, x.Item4, this.d1, this.t, this.x, this.xHat, this.α) .Value)); // Constraints 9 this.Model.AddConstraints( this.srt.Value .Where(x => !this.S1.IsThereElementAt(x.rIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints9ConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, x.tIndexElement, this.x, this.xHat) .Value)); // Objective function this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateObjectiveFunctionFactory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.t, this.Λ, this.Ρ, this.IHat) .Value); }
public HM1BModel( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM1BInputContext HM1BInputContext) { this.Context = HM1BInputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // j this.j = indicesAbstractFactory.CreatejFactory().Create( this.Context.SurgicalSpecialties .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatejIndexElementFactory().Create(x)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.Context.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.Context.Surgeons .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // t this.t = indicesAbstractFactory.CreatetFactory().Create( this.Context.PlanningHorizon .Select(x => indexElementsAbstractFactory.CreatetIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // Λ this.Λ = indicesAbstractFactory.CreateΛFactory().Create( this.Context.Scenarios .Select(x => indexElementsAbstractFactory.CreateΛIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // υ1 this.υ1 = indicesAbstractFactory.Createυ1Factory().Create( this.Context.OperatingRoomServiceLevels .Select(x => indexElementsAbstractFactory.Createυ1IndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // Cross joins // sΛ this.sΛ = crossJoinsAbstractFactory.CreatesΛFactory().Create( this.s.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // A(s, υ1) this.A = parametersAbstractFactory.CreateAFactory().Create( this.Context.SurgeonServiceLevelNumberTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateAParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.υ1.GetElementAt((PositiveInt)x.Item2), (PositiveInt)x.Item3)) .ToImmutableList()); // N(s) this.N = parametersAbstractFactory.CreateNFactory().Create( this.Context.SurgeonStrategicTargets .Select(x => parameterElementsAbstractFactory.CreateNParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // n(s, Λ) this.n = parametersAbstractFactory.CreatenFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatients .Select(x => parameterElementsAbstractFactory.CreatenParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (PositiveInt)x.Item3)) .ToImmutableList()); // Δ(j) this.Δ = parametersAbstractFactory.CreateΔFactory().Create( this.Context.SurgicalSpecialties .Select(x => parameterElementsAbstractFactory.CreateΔParameterElementFactory().Create( this.j.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // Ρ(Λ) this.Ρ = parametersAbstractFactory.CreateΡFactory().Create( this.Context.ScenarioProbabilities .Select(x => parameterElementsAbstractFactory.CreateΡParameterElementFactory().Create( this.Λ.GetElementAt((PositiveInt)x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // υ1Star this.υ1Star = parametersAbstractFactory.Createυ1StarFactory().Create( this.υ1.GetElementAt((PositiveInt)this.Context.OptimalOperatingRoomServiceLevel)); // υ1StarPlus1 this.υ1StarPlus1 = parametersAbstractFactory.Createυ1StarPlus1Factory().Create( this.υ1.GetElementAt((PositiveInt)this.Context.NextOperatingRoomServiceLevel)); // ψ(t) this.ψ = parametersAbstractFactory.CreateψFactory().Create( this.Context.DayAvailabilities .Select(x => parameterElementsAbstractFactory.CreateψParameterElementFactory().Create( this.t.GetElementAt(x.Key), (FhirBoolean)x.Value)) .ToImmutableList()); // ω(s) this.ω = parametersAbstractFactory.CreateωFactory().Create( this.Context.SurgeonPenaltyWeights .Select(x => parameterElementsAbstractFactory.CreateωParameterElementFactory().Create( this.s.GetElementAt(x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // Variables // B(s) this.B = variablesAbstractFactory.CreateBFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, lowerBoundGenerator: (a) => 0, upperBoundGenerator: (a) => int.MaxValue, variableTypeGenerator: (a) => VariableType.Integer)); // e1Minus(s, Λ) this.e1Minus = variablesAbstractFactory.Createe1MinusFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.Λ.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => int.MaxValue, variableTypeGenerator: (a, b) => VariableType.Integer)); // e1Plus(s, Λ) this.e1Plus = variablesAbstractFactory.Createe1PlusFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.Λ.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => int.MaxValue, variableTypeGenerator: (a, b) => VariableType.Integer)); // Constraints // Constraints 1L this.Model.AddConstraints( this.s.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1LConstraintElementFactory().Create( x, this.υ1Star.Value, this.A, this.B) .Value)); // Constraints 1U this.Model.AddConstraints( this.s.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1UConstraintElementFactory().Create( x, this.υ1StarPlus1.Value, this.A, this.B) .Value)); // Constraint 2 this.Model.AddConstraint( constraintsAbstractFactory.CreateConstraint2Factory().Create( this.r, this.s, this.t, this.ψ, this.B) .Value); // Constraints 3 this.Model.AddConstraints( this.sΛ.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( x.sIndexElement, x.ΛIndexElement, this.N, this.n, this.B, this.e1Minus, this.e1Plus) .Value)); }
public HM3AModel( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM3AInputContext HM3AInputContext) { this.Context = HM3AInputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // j this.j = indicesAbstractFactory.CreatejFactory().Create( this.Context.SurgicalSpecialties .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatejIndexElementFactory().Create(x)) .ToImmutableList()); // m this.m = indicesAbstractFactory.CreatemFactory().Create( this.Context.Machines .Entry .Where(x => x.Resource is Device) .Select(x => indexElementsAbstractFactory.CreatemIndexElementFactory().Create((Device)x.Resource)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.Context.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.Context.Surgeons .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // t this.t = indicesAbstractFactory.CreatetFactory().Create( this.Context.PlanningHorizon .Select(x => indexElementsAbstractFactory.CreatetIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // Cross joins // jr this.jr = crossJoinsAbstractFactory.CreatejrFactory().Create( this.j.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatejrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // mr this.mr = crossJoinsAbstractFactory.CreatemrFactory().Create( this.m.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatemrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rt this.rt = crossJoinsAbstractFactory.CreatertFactory().Create( this.r.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatertCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sr this.sr = crossJoinsAbstractFactory.CreatesrFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // srj this.srj = crossJoinsAbstractFactory.CreatesrjFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.j.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrjCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // Parameters // BBar(j) this.BBar = parametersAbstractFactory.CreateBBarFactory().Create( this.Context.SurgicalSpecialtyNumberAssignedTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateBBarParameterElementFactory().Create( this.j.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // B(s) this.Bs = parametersAbstractFactory.CreateBsFactory().Create( this.Context.SurgeonNumberAssignedTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateBsParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // C(m) this.C = parametersAbstractFactory.CreateCFactory().Create( this.Context.MachineCosts .Select(x => parameterElementsAbstractFactory.CreateCParameterElementFactory().Create( this.m.GetElementAt(x.Key), x.Value)) .ToImmutableList()); // Δ(j) this.Δ = parametersAbstractFactory.CreateΔFactory().Create( this.Context.SurgicalSpecialties .Select(x => parameterElementsAbstractFactory.CreateΔParameterElementFactory().Create( this.j.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // ζ(s, m) this.ζ = parametersAbstractFactory.CreateζFactory().Create( this.Context.SurgeonMachineRequirements .Select(x => parameterElementsAbstractFactory.CreateζParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.m.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // ψ(t) this.ψ = parametersAbstractFactory.CreateψFactory().Create( this.Context.DayAvailabilities .Select(x => parameterElementsAbstractFactory.CreateψParameterElementFactory().Create( this.t.GetElementAt(x.Key), (FhirBoolean)x.Value)) .ToImmutableList()); // Variables // b(s, r) this.b = variablesAbstractFactory.CreatebFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => int.MaxValue, variableTypeGenerator: (a, b) => VariableType.Integer)); // v(m, r) this.v = variablesAbstractFactory.CreatevFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.m.Value, indexSet2: this.r.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => 1, variableTypeGenerator: (a, b) => VariableType.Binary)); // w(j, r) this.w = variablesAbstractFactory.CreatewFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.j.Value, indexSet2: this.r.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => 1, variableTypeGenerator: (a, b) => VariableType.Binary)); // y(s, r) this.y = variablesAbstractFactory.CreateyFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => 1, variableTypeGenerator: (a, b) => VariableType.Binary)); // γ(r, t) this.γ = variablesAbstractFactory.CreateγFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.r.Value, indexSet2: this.t.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => 1, variableTypeGenerator: (a, b) => VariableType.Binary)); // Constraints // Constraints 1 this.Model.AddConstraints( this.mr.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints1ConstraintElementFactory().Create( x.mIndexElement, x.rIndexElement, this.m, this.s, this.ζ, this.v, this.y) .Value)); // Constraints 2 this.Model.AddConstraints( this.s.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints2ConstraintElementFactory().Create( x, this.r, this.Bs, this.b) .Value)); // Constraints 3 this.Model.AddConstraints( this.r.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( x, this.s, this.t, this.b, this.γ) .Value)); // Constraints 4 this.Model.AddConstraints( this.rt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints4ConstraintElementFactory().Create( x.rIndexElement, x.tIndexElement, this.ψ, this.γ) .Value)); // Constraints 5L this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5LConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, this.b, this.y) .Value)); // Constraints 5M this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5MConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, this.Bs, this.b, this.y) .Value)); // Constraints 5U this.Model.AddConstraints( this.srj.Value .Where( x => this.Δ.IsSurgeonMemberOfSurgicalSpecialty( x.jIndexElement, x.sIndexElement)) .Select( x => constraintElementsAbstractFactory.CreateConstraints5UConstraintElementFactory().Create( x.jIndexElement, x.rIndexElement, x.sIndexElement, this.BBar, this.Bs, this.w, this.y) .Value)); }
public SPModel( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, ISPInputContext SPInputContext) { this.SPInputContext = SPInputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // a this.a = indicesAbstractFactory.CreateaFactory().Create( this.SPInputContext.ActiveDays .Select(x => indexElementsAbstractFactory.CreateaIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // d this.d = indicesAbstractFactory.CreatedFactory().Create( this.SPInputContext.Days .Select(x => indexElementsAbstractFactory.CreatedIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // p this.p = indicesAbstractFactory.CreatepFactory().Create( this.SPInputContext.PatientGroups .Select(x => indexElementsAbstractFactory.CreatepIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.SPInputContext.SurgeonGroups .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // w this.w = indicesAbstractFactory.CreatewFactory().Create( this.SPInputContext.Wards .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatewIndexElementFactory().Create(x)) .ToImmutableList()); // Cross joins // pa this.pa = crossJoinsAbstractFactory.CreatepaFactory().Create( this.p.Value .SelectMany(b => this.a.Value, (a, b) => crossJoinElementsAbstractFactory.CreatepaCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sa this.sa = crossJoinsAbstractFactory.CreatesaFactory().Create( this.s.Value .SelectMany(b => this.a.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesaCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // wd this.wd = crossJoinsAbstractFactory.CreatewdFactory().Create( this.w.Value .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatewdCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // A(p, d) this.A = parametersAbstractFactory.CreateAFactory().Create( this.SPInputContext.PatientGroupDaySubsetActiveDays .Select(x => parameterElementsAbstractFactory.CreateAParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Item1), this.d.GetElementAt(x.Item2), this.a.GetElementAt(x.Item3))) .ToImmutableList()); // BEDS this.BEDS = parametersAbstractFactory.CreateBEDSFactory().Create( (PositiveInt)this.SPInputContext.NumberBeds); // BLOCKS this.BLOCKS = parametersAbstractFactory.CreateBLOCKSFactory().Create( (PositiveInt)this.SPInputContext.NumberBlocks); // dur(p) this.dur = parametersAbstractFactory.CreatedurFactory().Create( this.SPInputContext.PatientGroupSurgeryDurations .Select(x => parameterElementsAbstractFactory.CreatedurParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), x.Value)) .ToImmutableList()); // LB(p) this.LB = parametersAbstractFactory.CreateLBFactory().Create( this.SPInputContext.PatientGroupNumberPatientLowerBounds .Select(x => parameterElementsAbstractFactory.CreateLBParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // LENGTH this.LENGTH = parametersAbstractFactory.CreateLENGTHFactory().Create( this.SPInputContext.TimeBlockLength); // P(s) this.Ps = parametersAbstractFactory.CreatePsFactory().Create( this.SPInputContext.SurgeonGroupSubsetPatientGroups .Select(x => parameterElementsAbstractFactory.CreatePsParameterElementFactory().Create( this.s.GetElementAt(x.Key), this.p.GetElementAt((PositiveInt)x.Value))) .ToImmutableList()); // P(w) this.Pw = parametersAbstractFactory.CreatePwFactory().Create( this.SPInputContext.WardSubsetPatientGroups .Select(x => parameterElementsAbstractFactory.CreatePwParameterElementFactory().Create( this.w.GetElementAt(x.Key), this.p.GetElementAt((PositiveInt)x.Value))) .ToImmutableList()); // r this.r = parametersAbstractFactory.CreaterFactory().Create( this.SPInputContext.PatientGroupProfits .Select(x => parameterElementsAbstractFactory.CreaterParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), x.Value)) .ToImmutableList()); // UB(p) this.UB = parametersAbstractFactory.CreateUBFactory().Create( this.SPInputContext.PatientGroupNumberPatientUpperBounds .Select(x => parameterElementsAbstractFactory.CreateUBParameterElementFactory().Create( this.p.GetElementAt((PositiveInt)x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // Variables // x(p, a) this.x = variablesAbstractFactory.CreateSPxFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.p.Value, indexSet2: this.a.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: null, variableTypeGenerator: (a, b) => VariableType.Integer)); // y(w) this.y = variablesAbstractFactory.CreateSPyFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.w.Value, lowerBoundGenerator: (a) => 0, upperBoundGenerator: null, variableTypeGenerator: (a) => VariableType.Integer)); // z(s, a) this.z = variablesAbstractFactory.CreateSPzFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.a.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: null, variableTypeGenerator: (a, b) => VariableType.Integer)); // Constraints (2) this.Model.AddConstraint( constraintsAbstractFactory.CreateSPConstraint2Factory().Create( this.w, this.BEDS, this.y) .Value); // Constraints (3) this.Model.AddConstraints( this.wd.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( i.dIndexElement, i.wIndexElement, this.pa, this.A, this.Pw, this.x, this.y) .Value)); // Constraints (4) this.Model.AddConstraints( this.a.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints4ConstraintElementFactory().Create( i, this.s, this.BLOCKS, this.z) .Value)); // Constraints (5) this.Model.AddConstraints( this.sa.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints5ConstraintElementFactory().Create( i.aIndexElement, i.sIndexElement, this.p, this.dur, this.LENGTH, this.Ps, this.x, this.z) .Value)); // Constraints (6L) this.Model.AddConstraints( this.p.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints6LConstraintElementFactory().Create( i, this.a, this.LB, this.x) .Value)); // Constraints (6U) this.Model.AddConstraints( this.p.Value .Select( i => constraintElementsAbstractFactory.CreateConstraints6UConstraintElementFactory().Create( i, this.a, this.UB, this.x) .Value)); // Objective Function (1) this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateSPObjectiveFunctionFactory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.pa, this.r, this.x) .Value); }
public HM3BModel( IConstraintElementsAbstractFactory constraintElementsAbstractFactory, IConstraintsAbstractFactory constraintsAbstractFactory, ICrossJoinElementsAbstractFactory crossJoinElementsAbstractFactory, ICrossJoinsAbstractFactory crossJoinsAbstractFactory, IDependenciesAbstractFactory dependenciesAbstractFactory, IIndexElementsAbstractFactory indexElementsAbstractFactory, IIndicesAbstractFactory indicesAbstractFactory, IObjectiveFunctionsAbstractFactory objectiveFunctionsAbstractFactory, IParameterElementsAbstractFactory parameterElementsAbstractFactory, IParametersAbstractFactory parametersAbstractFactory, IVariablesAbstractFactory variablesAbstractFactory, IHM3BInputContext HM3BInputContext) { this.Context = HM3BInputContext; this.Model = dependenciesAbstractFactory.CreateModelFactory().Create(); // Indices // d this.d = indicesAbstractFactory.CreatedFactory().Create( this.Context.Weekdays .Select(x => indexElementsAbstractFactory.CreatedIndexElementFactory().Create( (PositiveInt)x)) .ToImmutableList()); // j this.j = indicesAbstractFactory.CreatejFactory().Create( this.Context.SurgicalSpecialties .Select(x => x.Item1) .Select(x => indexElementsAbstractFactory.CreatejIndexElementFactory().Create(x)) .ToImmutableList()); // l this.l = indicesAbstractFactory.CreatelFactory().Create( this.Context.LengthOfStayDays .Select(x => indexElementsAbstractFactory.CreatelIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // m this.m = indicesAbstractFactory.CreatemFactory().Create( this.Context.Machines .Entry .Where(x => x.Resource is Device) .Select(x => indexElementsAbstractFactory.CreatemIndexElementFactory().Create((Device)x.Resource)) .ToImmutableList()); // r this.r = indicesAbstractFactory.CreaterFactory().Create( this.Context.OperatingRooms .Entry .Where(x => x.Resource is Location) .Select(x => indexElementsAbstractFactory.CreaterIndexElementFactory().Create((Location)x.Resource)) .ToImmutableList()); // s this.s = indicesAbstractFactory.CreatesFactory().Create( this.Context.Surgeons .Entry .Where(x => x.Resource is Organization) .Select(x => indexElementsAbstractFactory.CreatesIndexElementFactory().Create((Organization)x.Resource)) .ToImmutableList()); // t this.t = indicesAbstractFactory.CreatetFactory().Create( this.Context.PlanningHorizon .Select(x => indexElementsAbstractFactory.CreatetIndexElementFactory().Create( x.Key.Value.Value, x.Value)) .ToImmutableList()); // Λ this.Λ = indicesAbstractFactory.CreateΛFactory().Create( this.Context.Scenarios .Select(x => indexElementsAbstractFactory.CreateΛIndexElementFactory().Create((PositiveInt)x)) .ToImmutableList()); // Cross joins // dt this.dt = crossJoinsAbstractFactory.CreatedtFactory().Create( this.d.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatedtCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // mr this.mr = crossJoinsAbstractFactory.CreatemrFactory().Create( this.m.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatemrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // rt this.rt = crossJoinsAbstractFactory.CreatertFactory().Create( this.r.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatertCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sd this.sd = crossJoinsAbstractFactory.CreatesdFactory().Create( this.s.Value .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesdCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sdt this.sdt = crossJoinsAbstractFactory.CreatesdtFactory().Create( this.s.Value .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesdCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesdtCrossJoinElementFactory().Create(a.sIndexElement, a.dIndexElement, b)) .ToImmutableList()); // slΛ this.slΛ = crossJoinsAbstractFactory.CreateslΛFactory().Create( this.s.Value .SelectMany(b => this.l.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreateslΛCrossJoinElementFactory().Create(a.sIndexElement, a.lIndexElement, b)) .ToImmutableList()); // sr this.sr = crossJoinsAbstractFactory.CreatesrFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // srd this.srd = crossJoinsAbstractFactory.CreatesrdFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.d.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrdCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // srj this.srj = crossJoinsAbstractFactory.CreatesrjFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.j.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrjCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // srt this.srt = crossJoinsAbstractFactory.CreatesrtFactory().Create( this.s.Value .SelectMany(b => this.r.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrCrossJoinElementFactory().Create(a, b)) .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesrtCrossJoinElementFactory().Create(a.sIndexElement, a.rIndexElement, b)) .ToImmutableList()); // st this.st = crossJoinsAbstractFactory.CreatestFactory().Create( this.s.Value .SelectMany(b => this.t.Value, (a, b) => crossJoinElementsAbstractFactory.CreatestCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // sΛ this.sΛ = crossJoinsAbstractFactory.CreatesΛFactory().Create( this.s.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatesΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // tΛ this.tΛ = crossJoinsAbstractFactory.CreatetΛFactory().Create( this.t.Value .SelectMany(b => this.Λ.Value, (a, b) => crossJoinElementsAbstractFactory.CreatetΛCrossJoinElementFactory().Create(a, b)) .ToImmutableList()); // Parameters // BBar(j) this.BBar = parametersAbstractFactory.CreateBBarFactory().Create( this.Context.SurgicalSpecialtyNumberAssignedTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateBBarParameterElementFactory().Create( this.j.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // B(s) this.Bs = parametersAbstractFactory.CreateBsFactory().Create( this.Context.SurgeonNumberAssignedTimeBlocks .Select(x => parameterElementsAbstractFactory.CreateBsParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // H this.H = parametersAbstractFactory.CreateHFactory().Create( this.Context.TimeBlockLength); // h(s, Λ) this.h = parametersAbstractFactory.CreatehFactory().Create( this.Context.SurgeonScenarioWeightedAverageSurgicalDurations .Select(x => parameterElementsAbstractFactory.CreatehParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), x.Item3)) .ToImmutableList()); // L(s) this.L = parametersAbstractFactory.CreateLFactory().Create( this.Context.SurgeonLengthOfStayMaximums .Select(x => parameterElementsAbstractFactory.CreateLParameterElementFactory().Create( this.s.GetElementAt(x.Key), (PositiveInt)x.Value)) .ToImmutableList()); // n(s, Λ) this.n = parametersAbstractFactory.CreatenFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatients .Select(x => parameterElementsAbstractFactory.CreatenParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (PositiveInt)x.Item3)) .ToImmutableList()); // p(s, l, Λ) this.p = parametersAbstractFactory.CreatepFactory().Create( this.Context.SurgeonDayScenarioLengthOfStayProbabilities .Select(x => parameterElementsAbstractFactory.CreatepParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.l.GetElementAt((PositiveInt)x.Item2), this.Λ.GetElementAt((PositiveInt)x.Item3), (FhirDecimal)x.Item4)) .ToImmutableList()); // W this.W = parametersAbstractFactory.CreateWFactory().Create( (PositiveInt)this.Context.NumberDaysPerWeek); // Δ(j) this.Δ = parametersAbstractFactory.CreateΔFactory().Create( this.Context.SurgicalSpecialties .Select(x => parameterElementsAbstractFactory.CreateΔParameterElementFactory().Create( this.j.GetElementAt(x.Item1), x.Item2.Select(i => this.s.GetElementAt(i)).ToImmutableList())) .ToImmutableList()); // ζ(s, m) this.ζ = parametersAbstractFactory.CreateζFactory().Create( this.Context.SurgeonMachineRequirements .Select(x => parameterElementsAbstractFactory.CreateζParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.m.GetElementAt(x.Item2), (FhirBoolean)x.Item3)) .ToImmutableList()); // μ(s, Λ) this.μ = parametersAbstractFactory.CreateμFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientMeans .Select(x => parameterElementsAbstractFactory.CreateμParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // Ρ(Λ) this.Ρ = parametersAbstractFactory.CreateΡFactory().Create( this.Context.ScenarioProbabilities .Select(x => parameterElementsAbstractFactory.CreateΡParameterElementFactory().Create( this.Λ.GetElementAt((PositiveInt)x.Key), (FhirDecimal)x.Value)) .ToImmutableList()); // σ(s, Λ) this.σ = parametersAbstractFactory.CreateσFactory().Create( this.Context.SurgeonScenarioMaximumNumberPatientStandardDeviations .Select(x => parameterElementsAbstractFactory.CreateσParameterElementFactory().Create( this.s.GetElementAt(x.Item1), this.Λ.GetElementAt((PositiveInt)x.Item2), (FhirDecimal)x.Item3)) .ToImmutableList()); // ψ(t) this.ψ = parametersAbstractFactory.CreateψFactory().Create( this.Context.DayAvailabilities .Select(x => parameterElementsAbstractFactory.CreateψParameterElementFactory().Create( this.t.GetElementAt(x.Key), (FhirBoolean)x.Value)) .ToImmutableList()); // Ω this.Ω = parametersAbstractFactory.CreateΩFactory().Create( (PositiveInt)this.Context.MaximumNumberRecoveryWardBeds); // Variables // b(s, r) this.b = variablesAbstractFactory.CreatebFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, lowerBoundGenerator: (a, b) => 0, upperBoundGenerator: (a, b) => int.MaxValue, variableTypeGenerator: (a, b) => VariableType.Integer)); // u(s, d) this.u = variablesAbstractFactory.CreateuFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.d.Value)); // x(s, r, t) this.x = variablesAbstractFactory.CreatexFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, indexSet3: this.t.Value)); // z(s, t) this.z = variablesAbstractFactory.CreatezFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.s.Value, indexSet2: this.t.Value)); // β(s, r, d) this.β = variablesAbstractFactory.CreateβFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().Create( model: this.Model, indexSet1: this.s.Value, indexSet2: this.r.Value, indexSet3: this.d.Value, lowerBoundGenerator: (a, b, c) => 0, upperBoundGenerator: (a, b, c) => int.MaxValue, variableTypeGenerator: (a, b, c) => VariableType.Integer)); // γ(r, t) this.γ = variablesAbstractFactory.CreateγFactory().Create( dependenciesAbstractFactory.CreateVariableCollectionFactory().CreateBinary( model: this.Model, indexSet1: this.r.Value, indexSet2: this.t.Value)); // Constraints // 1 (v, y), 5 L/M/U (v, w, y), 10 (y) // 2, 3, 4, 6, 7, 8, 9 // Constraints 2 this.Model.AddConstraints( this.s.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints2ConstraintElementFactory().Create( x, this.r, this.Bs, this.b) .Value)); // Constraints 3 this.Model.AddConstraints( this.r.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints3ConstraintElementFactory().Create( x, this.s, this.t, this.b, this.γ) .Value)); // Constraints 4 this.Model.AddConstraints( this.rt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints4ConstraintElementFactory().Create( x.rIndexElement, x.tIndexElement, this.ψ, this.γ) .Value)); // Constraints 6 this.Model.AddConstraints( this.sr.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints6ConstraintElementFactory().Create( x.rIndexElement, x.sIndexElement, this.d, this.b, this.β) .Value)); // Constraints 7 this.Model.AddConstraints( this.srd.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints7ConstraintElementFactory().Create( x.dIndexElement, x.rIndexElement, x.sIndexElement, this.t, this.W, this.x, this.β) .Value)); // Constraints 8L this.Model.AddConstraints( this.sd.Value .SelectMany(b => this.t.GetNthElementsAt( b.dIndexElement.Value.Value.Value, this.t.GetT() - this.W.Value.Value.Value + b.dIndexElement.Value.Value.Value, this.W.Value.Value.Value), (a, b) => Tuple.Create(a.sIndexElement, a.dIndexElement, b)) .Select( x => constraintElementsAbstractFactory.CreateConstraints8LConstraintElementFactory().Create( x.Item2, x.Item1, x.Item3, this.r, this.x, this.z) .Value)); // Constraints 8U this.Model.AddConstraints( this.sd.Value .SelectMany(b => this.t.GetNthElementsAt( b.dIndexElement.Value.Value.Value, this.t.GetT() - this.W.Value.Value.Value + b.dIndexElement.Value.Value.Value, this.W.Value.Value.Value), (a, b) => Tuple.Create(a.sIndexElement, a.dIndexElement, b)) .Select( x => constraintElementsAbstractFactory.CreateConstraints8UConstraintElementFactory().Create( x.Item2, x.Item1, x.Item3, this.u, this.z) .Value)); // Constraints 9 this.Model.AddConstraints( this.rt.Value .Select( x => constraintElementsAbstractFactory.CreateConstraints9ConstraintElementFactory().Create( x.rIndexElement, x.tIndexElement, this.s, this.x, this.γ) .Value)); // Objective function this.Model.AddObjective( objectiveFunctionsAbstractFactory.CreateObjectiveFunctionFactory().Create( dependenciesAbstractFactory.CreateObjectiveFactory(), this.sd, this.u) .Value); }