View Javadoc
1   package org.opentrafficsim.core.perception;
2   
3   import org.djunits.value.vdouble.scalar.Time;
4   import org.opentrafficsim.base.parameters.ParameterException;
5   import org.opentrafficsim.base.parameters.ParameterSet;
6   import org.opentrafficsim.base.parameters.ParameterType;
7   import org.opentrafficsim.base.parameters.Parameters;
8   import org.opentrafficsim.core.perception.HistoricalParameters.ParameterEvent;
9   import org.opentrafficsim.core.perception.HistoricalParameters.ParameterValueSet;
10  
11  /**
12   * Historical representation of {@code Parameters}.
13   * <p>
14   * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
15   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
16   * <p>
17   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 19 jan. 2018 <br>
18   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
19   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
20   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
21   */
22  public class HistoricalParameters extends AbstractHistorical<ParameterValueSet, ParameterEvent> implements Parameters
23  {
24  
25      /** Current parameter set. */
26      private final Parameters params;
27  
28      /**
29       * Constructor.
30       * @param manager HistoryManager; history manager
31       * @param parameters Parameters; initial parameter set
32       */
33      public HistoricalParameters(final HistoryManager manager, final Parameters parameters)
34      {
35          super(manager);
36          this.params = parameters;
37      }
38  
39      /**
40       * Get the parameters at the current simulation time.
41       * @return Parameters; parameters at the current simulation time
42       */
43      public Parameters getParameters()
44      {
45          return new ParameterSet(this.params);
46      }
47  
48      /**
49       * Get the parameters at the given simulation time.
50       * @param time Time; simulation time
51       * @return Parameters; parameters at the given simulation time
52       */
53      public Parameters getParameters(final Time time)
54      {
55          Parameters parameters = getParameters();
56          for (ParameterEvent event : getEvents(time))
57          {
58              event.resetEvent(parameters);
59          }
60          return parameters;
61      }
62  
63      /** {@inheritDoc} */
64      @Override
65      public <T> void setParameter(final ParameterType<T> parameterType, final T value) throws ParameterException
66      {
67          addEvent(new ParameterEvent(now().si, parameterType, this.params));
68          this.params.setParameter(parameterType, value);
69      }
70  
71      /** {@inheritDoc} */
72      @Override
73      public <T> void setParameterResettable(final ParameterType<T> parameterType, final T value) throws ParameterException
74      {
75          addEvent(new ParameterEvent(now().si, parameterType, this.params));
76          this.params.setParameterResettable(parameterType, value);
77      }
78  
79      /** {@inheritDoc} */
80      @Override
81      public void resetParameter(final ParameterType<?> parameterType) throws ParameterException
82      {
83          addEvent(new ParameterEvent(now().si, parameterType, this.params));
84          this.params.resetParameter(parameterType);
85      }
86  
87      /** {@inheritDoc} */
88      @Override
89      public <T> T getParameter(final ParameterType<T> parameterType) throws ParameterException
90      {
91          return this.params.getParameter(parameterType);
92      }
93  
94      /** {@inheritDoc} */
95      @Override
96      public <T> T getParameterOrNull(final ParameterType<T> parameterType)
97      {
98          return this.params.getParameterOrNull(parameterType);
99      }
100 
101     /** {@inheritDoc} */
102     @Override
103     public boolean contains(final ParameterType<?> parameterType)
104     {
105         return this.params.contains(parameterType);
106     }
107 
108     /** {@inheritDoc} */
109     @Override
110     public void setAllIn(final Parameters parameters)
111     {
112         this.params.setAllIn(parameters);
113     }
114 
115     /**
116      * Value for a parameter event, which contains a parameter type and (the previous) value.
117      * <p>
118      * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
119      * <br>
120      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
121      * <p>
122      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 19 jan. 2018 <br>
123      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
124      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
125      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
126      */
127     public static class ParameterValueSet
128     {
129 
130         /** Parameter type. */
131         private final ParameterType<?> parameter;
132 
133         /** Previous parameter value. */
134         private final Object value;
135 
136         /**
137          * @param parameter ParameterType&lt;T&gt;; parameter
138          * @param value T; parameter value
139          * @param <T> parameter value type
140          */
141         public <T> ParameterValueSet(final ParameterType<T> parameter, final T value)
142         {
143             this.value = value;
144             this.parameter = parameter;
145         }
146 
147         /**
148          * @return value.
149          */
150         public Object getValue()
151         {
152             return this.value;
153         }
154 
155         /**
156          * @return parameter.
157          */
158         public ParameterType<?> getParameter()
159         {
160             return this.parameter;
161         }
162 
163         /** {@inheritDoc} */
164         @Override
165         public String toString()
166         {
167             return "ParameterValueSet [parameter=" + this.parameter + ", value=" + this.value + "]";
168         }
169 
170     }
171 
172     /**
173      * Parameter event, which will restore the previous value.
174      * <p>
175      * Copyright (c) 2013-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved.
176      * <br>
177      * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
178      * <p>
179      * @version $Revision$, $LastChangedDate$, by $Author$, initial version 19 jan. 2018 <br>
180      * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
181      * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
182      * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
183      */
184     public static class ParameterEvent extends AbstractHistorical.EventValue<ParameterValueSet> // import is removed
185     {
186 
187         /**
188          * Constructor. New value is not required, as it's not required to restore the state from before the change.
189          * @param time double; time of event
190          * @param parameterType ParameterType&lt;T&gt;; parameter type
191          * @param parameters Parameters; parameters
192          * @param <T> parameter value type
193          */
194         public <T> ParameterEvent(final double time, final ParameterType<T> parameterType, final Parameters parameters)
195         {
196             super(time, new ParameterValueSet(parameterType, parameters.getParameterOrNull(parameterType)));
197         }
198 
199         /**
200          * Resets the parameter type to it's value before the change.
201          * @param parameters Parameters; parameters
202          * @param <T> parameter value type
203          */
204         @SuppressWarnings("unchecked")
205         public final <T> void resetEvent(final Parameters parameters)
206         {
207             try
208             {
209                 parameters.setParameter((ParameterType<T>) getValue().getParameter(), (T) getValue().getValue());
210             }
211             catch (ParameterException exception)
212             {
213                 // should not happen
214                 throw new RuntimeException(exception);
215             }
216         }
217 
218         /** {@inheritDoc} */
219         @Override
220         public String toString()
221         {
222             return "ParameterEvent []";
223         }
224 
225     }
226 
227     /** {@inheritDoc} */
228     @Override
229     public String toString()
230     {
231         return "HistoricalParameters [params=" + this.params + "]";
232     }
233 
234 }