LotSizingDataModel.Solution 2.0.1
Solution objects for production, setup, inventory and related decisions.
Loading...
Searching...
No Matches
ClosedLoopDecision.cs
Go to the documentation of this file.
1using System;
2using System.Linq;
3using System.Xml.Serialization;
4using LotSizingDataModel.Core.Common;
5
7
8[Serializable]
9[XmlType(TypeName = "closedLoopDecision")]
10public sealed class ClosedLoopDecision :
11 ModelObject,
12 IPlanningHorizonAware
13{
14 private int _returnStreamId;
15 private DoubleTimeSeries _recoveryInputs = new();
16 private DoubleTimeSeries _disposalQuantities = new();
17 private DoubleTimeSeries _recoveredOutputs = new();
18
20 {
21 }
22
24 int returnStreamId,
25 int planningHorizon)
26 {
27 if (returnStreamId <= 0)
28 {
29 throw new ArgumentOutOfRangeException(
30 nameof(returnStreamId));
31 }
32
33 ReturnStreamId = returnStreamId;
34 ResizeTimeSeries(planningHorizon);
35 }
36
37 [XmlAttribute("returnStreamId")]
38 public int ReturnStreamId
39 {
40 get => _returnStreamId;
41 set
42 {
43 if (value < 0)
44 {
45 throw new ArgumentOutOfRangeException(
46 nameof(value));
47 }
48
49 SetProperty(
50 ref _returnStreamId,
51 value);
52 }
53 }
54
55 [XmlElement("recoveryInputs")]
56 public DoubleTimeSeries RecoveryInputs
57 {
58 get => _recoveryInputs;
59 set => _recoveryInputs =
60 value ??
61 new DoubleTimeSeries();
62 }
63
64 [XmlElement("disposalQuantities")]
65 public DoubleTimeSeries DisposalQuantities
66 {
67 get => _disposalQuantities;
68 set => _disposalQuantities =
69 value ??
70 new DoubleTimeSeries();
71 }
72
73 [XmlElement("recoveredOutputs")]
74 public DoubleTimeSeries RecoveredOutputs
75 {
76 get => _recoveredOutputs;
77 set => _recoveredOutputs =
78 value ??
79 new DoubleTimeSeries();
80 }
81
82 [XmlIgnore]
83 public int PlanningHorizon =>
84 RecoveryInputs.PeriodCount;
85
86 [XmlIgnore]
88 DisposalQuantities.PeriodCount == PlanningHorizon &&
89 RecoveredOutputs.PeriodCount == PlanningHorizon;
90
91 [XmlIgnore]
92 public bool IsInternallyValid =>
93 ReturnStreamId > 0 &&
94 PlanningHorizon > 0 &&
97 value =>
98 double.IsFinite(value) &&
99 value >= 0.0) &&
101 value =>
102 double.IsFinite(value) &&
103 value >= 0.0) &&
105 value =>
106 double.IsFinite(value) &&
107 value >= 0.0);
108
109 public void ResizeTimeSeries(
110 int periodCount)
111 {
112 if (periodCount < 0)
113 {
114 throw new ArgumentOutOfRangeException(
115 nameof(periodCount));
116 }
117
118 RecoveryInputs.Resize(
119 periodCount,
120 0.0);
121
122 DisposalQuantities.Resize(
123 periodCount,
124 0.0);
125
126 RecoveredOutputs.Resize(
127 periodCount,
128 0.0);
129 }
130}
ClosedLoopDecision(int returnStreamId, int planningHorizon)