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 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 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 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); }