helics  3.3.0
TimeDependencies.hpp
1 /*
2 Copyright (c) 2017-2022,
3 Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Sustainable
4 Energy, LLC. See the top-level NOTICE for additional details. All rights reserved.
5 SPDX-License-Identifier: BSD-3-Clause
6 */
7 #pragma once
8 
9 #include "basic_CoreTypes.hpp"
10 
11 #include "json/forwards.h"
12 #include <string>
13 #include <utility>
14 #include <vector>
15 
16 namespace helics {
17 class ActionMessage;
18 
20 enum class TimeState : std::uint8_t {
21  initialized = 0,
22  exec_requested_require_iteration = 1,
23  exec_requested_iterative = 2,
24  exec_requested = 3,
25  time_granted = 5,
26  time_requested_require_iteration = 6,
27  time_requested_iterative = 7,
28  time_requested = 8,
29  error = 10
30 };
31 
32 enum class ConnectionType : std::uint8_t {
33  independent = 0,
34  parent = 1,
35  child = 2,
36  self = 3,
37  none = 4,
38 };
39 
41 enum class DependencyProcessingResult : std::uint8_t {
42  NOT_PROCESSED = 0,
43  PROCESSED = 1,
44  PROCESSED_AND_CHECK = 2
45 };
46 
48 enum class GrantDelayMode : std::uint8_t { NONE = 0, INTERRUPTED = 1, WAITING = 2 };
49 
50 inline GrantDelayMode getDelayMode(bool waiting, bool interrupted)
51 {
52  return waiting ? GrantDelayMode::WAITING :
53  (interrupted ? GrantDelayMode::INTERRUPTED : GrantDelayMode::NONE);
54 }
55 
56 // helper class containing the basic timeData
57 class TimeData {
58  public:
65  TimeState mTimeState{TimeState::initialized};
66  bool hasData{false};
67  bool interrupted{false};
68  bool delayedTiming{false};
69  std::int8_t timingVersion{-2};
70  std::uint8_t restrictionLevel{0};
71 
72  std::int32_t timeoutCount{0};
73  std::int32_t sequenceCounter{0};
74  std::int32_t responseSequenceCounter{0};
75  std::int32_t grantedIteration{0};
77  TimeData() = default;
78  TimeData(const TimeData&) = default;
79  TimeData& operator=(const TimeData&) = default;
80  TimeData(TimeData&&) = default;
81  TimeData& operator=(TimeData&&) = default;
82  explicit TimeData(Time start,
83  TimeState startState = TimeState::initialized,
84  std::uint8_t resLevel = 0U):
85  next{start},
86  Te{start}, minDe{start}, TeAlt{start}, mTimeState{startState}, restrictionLevel{
87  resLevel} {};
89  bool update(const TimeData& update);
90 };
91 
93 class DependencyInfo: public TimeData {
94  public:
96 
97  bool cyclic{false};
98  ConnectionType connection{ConnectionType::independent};
100  bool dependent{false};
101  bool dependency{false};
102  bool forwarding{false};
103  bool nonGranting{false};
104  bool triggered{false};
105  bool updateRequested{false};
106  // Time forwardEvent{Time::maxVal()}; //!< a predicted event
108  DependencyInfo() = default;
109  DependencyInfo(const DependencyInfo&) = default;
110  DependencyInfo& operator=(const DependencyInfo&) = default;
111  DependencyInfo(DependencyInfo&&) = default;
112  DependencyInfo& operator=(DependencyInfo&&) = default;
114  explicit DependencyInfo(GlobalFederateId id): fedID(id), forwarding{id.isBroker()} {}
115 
116  template<class... Args>
117  explicit DependencyInfo(Time start, Args&&... args):
118  TimeData(start, std::forward<Args>(args)...)
119  {
120  }
121 };
122 
125  private:
126  std::vector<DependencyInfo> dependencies;
127  mutable GlobalFederateId mDelayedDependency{};
128 
129  public:
131  TimeDependencies() = default;
133  bool isDependency(GlobalFederateId ofed) const;
135  bool isDependent(GlobalFederateId ofed) const;
151  auto size() const { return dependencies.size(); }
153  auto begin() { return dependencies.begin(); }
155  auto end() { return dependencies.end(); }
157  auto begin() const { return dependencies.cbegin(); }
159  auto end() const { return dependencies.cend(); }
161  auto cbegin() const { return dependencies.cbegin(); }
163  auto cend() const { return dependencies.cend(); }
164 
166  bool empty() const { return dependencies.empty(); }
169 
172 
174  bool checkIfReadyForExecEntry(bool iterating, bool waiting) const;
176  bool checkAllPastExec(bool iterating) const;
182  bool checkIfReadyForTimeGrant(bool iterating,
183  Time desiredGrantTime,
184  GrantDelayMode delayMode) const;
185 
190  void resetIteratingTimeRequests(Time requestTime);
192  void resetDependentEvents(Time grantTime);
194  bool hasActiveTimeDependencies() const;
196  bool verifySequenceCounter(Time tmin, std::int32_t sq);
198  int activeDependencyCount() const;
201 
202  void setDependencyVector(const std::vector<DependencyInfo>& deps) { dependencies = deps; }
205  std::pair<int, std::string> checkForIssues(bool waiting) const;
206 
207  bool hasDelayedDependency() const { return mDelayedDependency.isValid(); }
208  GlobalFederateId delayedDependency() const { return mDelayedDependency; }
209 };
210 
211 inline bool checkSequenceCounter(const DependencyInfo& dep, Time tmin, std::int32_t sq)
212 {
213  return (!dep.dependency || !dep.dependent || dep.timingVersion <= 0 || dep.next > tmin ||
214  dep.next >= cBigTime || dep.responseSequenceCounter == sq);
215 }
216 
217 const DependencyInfo& getExecEntryMinFederate(const TimeDependencies& dependencies,
218  GlobalFederateId self,
219  ConnectionType ignoreType = ConnectionType::none,
220  GlobalFederateId ignore = GlobalFederateId{});
221 static constexpr GlobalFederateId NoIgnoredFederates{};
222 
223 TimeData generateMinTimeUpstream(const TimeDependencies& dependencies,
224  bool restricted,
225  GlobalFederateId self,
226  GlobalFederateId ignore,
227  std::int32_t responseCode);
228 
229 TimeData generateMinTimeDownstream(const TimeDependencies& dependencies,
230  bool restricted,
231  GlobalFederateId self,
232  GlobalFederateId ignore,
233  std::int32_t responseCode);
234 
235 TimeData generateMinTimeTotal(const TimeDependencies& dependencies,
236  bool restricted,
237  GlobalFederateId self,
238  GlobalFederateId ignore,
239  std::int32_t responseCode);
240 
241 void generateJsonOutputTimeData(Json::Value& output,
242  const TimeData& dep,
243  bool includeAggregates = true);
244 
245 void addTimeState(Json::Value& output, const TimeState state);
246 
247 void generateJsonOutputDependency(Json::Value& output, const DependencyInfo& dep);
248 } // namespace helics
helics::timeZero
constexpr Time timeZero
Definition: helicsTime.hpp:31
helics::destination_target
@ destination_target
indicator that the target is a destination target
Definition: flagOperations.hpp:43
helics::GlobalFederateId::isBroker
constexpr bool isBroker() const
Definition: GlobalFederateId.hpp:107
helics::TimeDependencies::isDependent
bool isDependent(GlobalFederateId ofed) const
Definition: TimeDependencies.cpp:317
helics::initializationTime
constexpr Time initializationTime
Definition: helicsTime.hpp:40
helics::TimeDependencies::resetIteratingTimeRequests
void resetIteratingTimeRequests(Time requestTime)
Definition: TimeDependencies.cpp:638
helics::DependencyProcessingResult
DependencyProcessingResult
Definition: TimeDependencies.hpp:41
helics::DependencyInfo::cyclic
bool cyclic
Definition: TimeDependencies.hpp:97
helics::TimeDependencies::verifySequenceCounter
bool verifySequenceCounter(Time tmin, std::int32_t sq)
Definition: TimeDependencies.cpp:596
helics::TimeData::responseSequenceCounter
std::int32_t responseSequenceCounter
Definition: TimeDependencies.hpp:74
helics::TimeState
TimeState
Definition: TimeDependencies.hpp:20
helics::TimeDependencies::removeDependent
void removeDependent(GlobalFederateId id)
Definition: TimeDependencies.cpp:409
helics::TimeDependencies::end
auto end() const
Definition: TimeDependencies.hpp:159
helics::TimeData::grantedIteration
std::int32_t grantedIteration
the iteration of the dependency when the local iteration was granted
Definition: TimeDependencies.hpp:76
helics::TimeDependencies::removeInterdependence
void removeInterdependence(GlobalFederateId id)
Definition: TimeDependencies.cpp:422
helics::TimeDependencies::checkAllPastExec
bool checkAllPastExec(bool iterating) const
Definition: TimeDependencies.cpp:443
helics::TimeDependencies
Definition: TimeDependencies.hpp:124
helics::TimeDependencies::getMinDependency
GlobalFederateId getMinDependency() const
Definition: TimeDependencies.cpp:609
helics::TimeDependencies::removeDependency
void removeDependency(GlobalFederateId id)
Definition: TimeDependencies.cpp:371
helics::TimeDependencies::resetDependentEvents
void resetDependentEvents(Time grantTime)
Definition: TimeDependencies.cpp:651
helics::TimeData
Definition: TimeDependencies.hpp:57
helics::DependencyInfo::dependent
bool dependent
indicator the dependency is a dependent object
Definition: TimeDependencies.hpp:100
helics::TimeData::interrupted
bool interrupted
indicator that the federates next event is a timing interruption
Definition: TimeDependencies.hpp:67
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
helics::DependencyInfo::triggered
bool triggered
indicator that the dependency has been triggered in some way
Definition: TimeDependencies.hpp:104
helics::cBigTime
constexpr Time cBigTime
Definition: helicsTime.hpp:37
helics::TimeData::hasData
bool hasData
indicator that data was sent in the current interval
Definition: TimeDependencies.hpp:66
helics::TimeData::Te
Time Te
the next currently scheduled event
Definition: TimeDependencies.hpp:60
helics::GlobalFederateId
Definition: GlobalFederateId.hpp:72
helics::ActionMessage
Definition: ActionMessage.hpp:30
helics::TimeData::delayedTiming
bool delayedTiming
indicator that the dependency is using delayed timing
Definition: TimeDependencies.hpp:68
helics::TimeDependencies::isDependency
bool isDependency(GlobalFederateId ofed) const
Definition: TimeDependencies.cpp:308
helics::TimeDependencies::resetIteratingExecRequests
void resetIteratingExecRequests()
Definition: TimeDependencies.cpp:624
helics::TimeDependencies::begin
auto begin() const
Definition: TimeDependencies.hpp:157
helics::DependencyInfo::nonGranting
bool nonGranting
indicator that the dependency is a non granting time coordinator
Definition: TimeDependencies.hpp:103
helics::TimeDependencies::size
auto size() const
Definition: TimeDependencies.hpp:151
helics::TimeData::minFedActual
GlobalFederateId minFedActual
the actual forwarded minimum federate object
Definition: TimeDependencies.hpp:64
helics::DependencyInfo::forwarding
bool forwarding
indicator that the dependency is a forwarding time coordinator
Definition: TimeDependencies.hpp:102
helics::TimeData::restrictionLevel
std::uint8_t restrictionLevel
timing restriction level
Definition: TimeDependencies.hpp:70
helics::TimeData::timingVersion
std::int8_t timingVersion
version indicator
Definition: TimeDependencies.hpp:69
helics::negEpsilon
constexpr Time negEpsilon
Definition: helicsTime.hpp:35
helics::TimeData::sequenceCounter
std::int32_t sequenceCounter
the sequence Counter of the request
Definition: TimeDependencies.hpp:73
helics::TimeData::next
Time next
next possible message or value
Definition: TimeDependencies.hpp:59
helics::TimeData::TeAlt
Time TeAlt
the second min event
Definition: TimeDependencies.hpp:62
helics::TimeDependencies::activeDependencyCount
int activeDependencyCount() const
Definition: TimeDependencies.cpp:602
helics::delayed_timing_flag
@ delayed_timing_flag
flag to indicate the request is from federate with delayed timing
Definition: flagOperations.hpp:30
helics::TimeDependencies::getDependencyInfo
const DependencyInfo * getDependencyInfo(GlobalFederateId id) const
Definition: TimeDependencies.cpp:326
helics::TimeDependencies::begin
auto begin()
Definition: TimeDependencies.hpp:153
helics::TimeDependencies::addDependency
bool addDependency(GlobalFederateId id)
Definition: TimeDependencies.cpp:346
helics::DependencyInfo
Definition: TimeDependencies.hpp:93
helics::TimeDependencies::updateTime
DependencyProcessingResult updateTime(const ActionMessage &m)
Definition: TimeDependencies.cpp:432
helics::non_granting_flag
@ non_granting_flag
flag to indicate the request is from a non-granting federate
Definition: flagOperations.hpp:25
helics::GlobalFederateId::isValid
constexpr bool isValid() const
Definition: GlobalFederateId.hpp:109
helics::TimeData::timeoutCount
std::int32_t timeoutCount
counter for timeout checking
Definition: TimeDependencies.hpp:72
helics::TimeDependencies::addDependent
bool addDependent(GlobalFederateId id)
Definition: TimeDependencies.cpp:384
helics::interrupted_flag
@ interrupted_flag
flag to mark an interrupted event
Definition: flagOperations.hpp:28
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::TimeDependencies::hasActiveTimeDependencies
bool hasActiveTimeDependencies() const
Definition: TimeDependencies.cpp:589
helics::TimeData::update
bool update(const TimeData &update)
Definition: TimeDependencies.cpp:168
helics::TimeDependencies::cend
auto cend() const
Definition: TimeDependencies.hpp:163
helics::DependencyInfo::fedID
GlobalFederateId fedID
identifier for the dependency
Definition: TimeDependencies.hpp:95
helics::TimeDependencies::cbegin
auto cbegin() const
Definition: TimeDependencies.hpp:161
helics::iteration_requested_flag
@ iteration_requested_flag
Definition: flagOperations.hpp:23
helics::checkActionFlag
bool checkActionFlag(uint16_t flags, FlagIndex flag)
Definition: flagOperations.hpp:138
helics::DependencyInfo::DependencyInfo
DependencyInfo()=default
helics::TimeData::minDe
Time minDe
min dependency event time
Definition: TimeDependencies.hpp:61
helics::DependencyInfo::dependency
bool dependency
indicator that the dependency is an actual dependency
Definition: TimeDependencies.hpp:101
helics::required_flag
@ required_flag
flag indicating that an action or match is required
Definition: flagOperations.hpp:45
helics::TimeDependencies::end
auto end()
Definition: TimeDependencies.hpp:155
helics::DependencyInfo::updateRequested
bool updateRequested
indicator that an update request is in process
Definition: TimeDependencies.hpp:105
helics::TimeDependencies::TimeDependencies
TimeDependencies()=default
helics::TimeDependencies::empty
bool empty() const
Definition: TimeDependencies.hpp:166
helics::TimeData::minFed
GlobalFederateId minFed
identifier for the min dependency
Definition: TimeDependencies.hpp:63
flagOperations.hpp
helics::TimeDependencies::checkIfReadyForExecEntry
bool checkIfReadyForExecEntry(bool iterating, bool waiting) const
Definition: TimeDependencies.cpp:454
helics::TimeDependencies::checkIfReadyForTimeGrant
bool checkIfReadyForTimeGrant(bool iterating, Time desiredGrantTime, GrantDelayMode delayMode) const
Definition: TimeDependencies.cpp:494
helics::GrantDelayMode
GrantDelayMode
Definition: TimeDependencies.hpp:48
helics::DependencyInfo::DependencyInfo
DependencyInfo(GlobalFederateId id)
Definition: TimeDependencies.hpp:114
helics::ActionMessage::source_id
GlobalFederateId source_id
12 – for federate_id or route_id
Definition: ActionMessage.hpp:37
helics::TimeDependencies::checkForIssues
std::pair< int, std::string > checkForIssues(bool waiting) const
Definition: TimeDependencies.cpp:661