1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.experiment;
11
12 import java.io.Serializable;
13 import java.rmi.RemoteException;
14
15 import javax.naming.Context;
16 import javax.naming.InitialContext;
17
18 import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
19 import nl.tudelft.simulation.event.Event;
20 import nl.tudelft.simulation.event.EventInterface;
21 import nl.tudelft.simulation.event.EventListenerInterface;
22 import nl.tudelft.simulation.event.EventProducer;
23 import nl.tudelft.simulation.event.EventProducerInterface;
24 import nl.tudelft.simulation.event.EventType;
25 import nl.tudelft.simulation.logger.Logger;
26
27 /***
28 * The RunControl specifies all parameters for the simulator. <br>
29 * (c) copyright 2003 <a href="http://www.simulation.tudelft.nl">Delft
30 * University of Technology </a>, the Netherlands. <br>
31 * See for project information <a
32 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a> <br>
33 * License of use: <a href="http://www.gnu.org/copyleft/gpl.html">General Public
34 * License (GPL) </a>, no warranty <br>
35 *
36 * @version 2.0 21.09.2003 <br>
37 * @author <a href="http://www.tbm.tudelft.nl/webstaf/peterja/index.htm">Peter
38 * Jacobs </a>, <a
39 * href="http://www.tbm.tudelft.nl/webstaf/alexandv/index.htm">Alexander
40 * Verbraeck </a>
41 */
42 public class RunControl extends EventProducer implements Serializable,
43 EventListenerInterface
44 {
45 /*** END_OF_RUN_EVENT is fired at the end of a run */
46 public static final EventType END_OF_RUN_EVENT = new EventType(
47 "END_OF_RUN_EVENT");
48
49 /***
50 * treatment reflects the treatment to which this runcontrol belongs
51 *
52 * @uml.property name="treatment"
53 */
54 protected Treatment treatment = null;
55
56 /***
57 * replications are the replications of this runControl
58 *
59 * @uml.property name="replications"
60 */
61 private Replication[] replications;
62
63 /***
64 * warmupPeriod is the warmup period
65 *
66 * @uml.property name="warmupPeriod"
67 */
68 private double warmupPeriod = 0.0;
69
70 /***
71 * runLength reflects the runLength of the runControl
72 *
73 * @uml.property name="runLength"
74 */
75 private double runLength = Double.NaN;
76
77
78 /*** replication refers to the current replication */
79 private int replication = 0;
80
81 /***
82 * Constructs a new RunControl object.
83 *
84 * @param treatment The parent treatment
85 */
86 public RunControl(final Treatment treatment)
87 {
88 super();
89 this.treatment = treatment;
90 this.addListener(treatment.getRunControl(),
91 RunControl.END_OF_RUN_EVENT, false);
92 }
93
94 /***
95 * starts the runControl
96 *
97 * @param simulator is the simulator
98 * @throws RemoteException on network failure
99 */
100 public void start(final SimulatorInterface simulator)
101 throws RemoteException
102 {
103
104
105 simulator.addListener(this,
106 SimulatorInterface.END_OF_REPLICATION_EVENT,
107 EventProducerInterface.LAST_POSITION, false);
108 this.replication = 0;
109 this.notify(new Event(SimulatorInterface.END_OF_REPLICATION_EVENT,
110 simulator, null));
111 }
112
113 /***
114 * returns the treatment
115 *
116 * @return treatment
117 *
118 * @uml.property name="treatment"
119 */
120 public Treatment getTreatment()
121 {
122 return this.treatment;
123 }
124
125 /***
126 * returns the replications defined in this runControl
127 *
128 * @return Replication the replications
129 *
130 * @uml.property name="replications"
131 */
132 public Replication[] getReplications()
133 {
134 return this.replications;
135 }
136
137 /***
138 * returns the runLength
139 *
140 * @return double the runlength
141 *
142 * @uml.property name="runLength"
143 */
144 public double getRunLength()
145 {
146 return this.runLength;
147 }
148
149 /***
150 * returns the warmupPeriod
151 *
152 * @return double the warmup period
153 *
154 * @uml.property name="warmupPeriod"
155 */
156 public double getWarmupPeriod()
157 {
158 return this.warmupPeriod;
159 }
160
161
162 /***
163 * @see nl.tudelft.simulation.event.EventListenerInterface
164 * #notify(nl.tudelft.simulation.event.EventInterface)
165 */
166 public void notify(final EventInterface event)
167 {
168 try
169 {
170 if (event.getType().equals(
171 SimulatorInterface.END_OF_REPLICATION_EVENT))
172 {
173 SimulatorInterface simulator = (SimulatorInterface) event
174 .getSource();
175 if (this.replication < this.replications.length)
176 {
177 Context context = (Context) new InitialContext()
178 .lookup(this.treatment.getExperiment().getRun()
179 + "/treatment("
180 + this.treatment.getNumber() + ")");
181 context.createSubcontext("replication(" + this.replication
182 + ")");
183 context.createSubcontext("replication(" + this.replication
184 + ")/animation");
185 context.createSubcontext("replication(" + this.replication
186 + ")/animation/2D");
187 context.createSubcontext("replication(" + this.replication
188 + ")/animation/3D");
189 simulator.initialize(this.replications[this.replication]);
190 this.replication++;
191 simulator.start();
192 } else
193 {
194 this.fireEvent(new Event(RunControl.END_OF_RUN_EVENT, this,
195 null));
196 }
197 }
198 } catch (Exception exception)
199 {
200 Logger.warning(this, "notify", exception);
201 }
202 }
203
204 /***
205 * resets the RunControl
206 */
207 public synchronized void reset()
208 {
209 this.replication = 0;
210 for (int i = 0; i < this.replications.length; i++)
211 {
212 this.replications[i].reset();
213 }
214 }
215
216 /***
217 * sets the replications
218 *
219 * @param replications the replications of the runControl
220 *
221 * @uml.property name="replications"
222 */
223 public void setReplications(final Replication[] replications)
224 {
225 this.replications = replications;
226 }
227
228 /***
229 * sets the runLength
230 *
231 * @param runLength which is the runLength
232 *
233 * @uml.property name="runLength"
234 */
235 public void setRunLength(final double runLength)
236 {
237 this.runLength = runLength;
238 }
239
240 /***
241 * sets the warmupPeriod
242 *
243 * @param warmupPeriod reflects the warmupPeriod
244 *
245 * @uml.property name="warmupPeriod"
246 */
247 public void setWarmupPeriod(final double warmupPeriod)
248 {
249 this.warmupPeriod = warmupPeriod;
250 }
251
252 /***
253 * @see java.lang.Object#toString()
254 */
255 public String toString()
256 {
257 String result = super.toString() + " ; RL=" + this.getRunLength()
258 + " ; WP=" + this.getWarmupPeriod() + " ; replications=[";
259 for (int i = 0; i < this.replications.length; i++)
260 {
261 result = result + this.replications[i].toString() + " ; ";
262 }
263 result = result.substring(0, result.length() - 2) + "]";
264 return "[" + result;
265 }
266 }