helics  2.8.1
TimeDependencies.hpp
1 /*
2 Copyright (c) 2017-2021,
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_core_types.hpp"
10 
11 #include "json/forwards.h"
12 #include <vector>
13 
14 namespace helics {
15 class ActionMessage;
16 
18 enum class time_state_t : uint8_t {
19  initialized = 0,
20  exec_requested_iterative = 1,
21  exec_requested = 2,
22  time_granted = 3,
23  time_requested_iterative = 4,
24  time_requested = 5,
25  error = 7
26 };
27 
28 enum class ConnectionType : uint8_t {
29  independent = 0,
30  parent = 1,
31  child = 2,
32  self = 3,
33  none = 4,
34 };
35 // helper class containing the basic timeData
36 class TimeData {
37  public:
44  time_state_t time_state{time_state_t::initialized};
45 
46  TimeData() = default;
47  explicit TimeData(Time start): next{start}, Te{start}, minDe{start}, TeAlt{start} {};
49  bool update(const TimeData& update);
50 };
51 
53 class DependencyInfo: public TimeData {
54  public:
56 
57  bool cyclic{false};
58  ConnectionType connection{ConnectionType::independent};
60  bool dependent{false};
61  bool dependency{false};
62  bool forwarding{false};
63  bool nonGranting{false};
64  bool delayedTiming{false};
65  // Time forwardEvent{Time::maxVal()}; //!< a predicted event
67  DependencyInfo() = default;
69  explicit DependencyInfo(global_federate_id id): fedID(id), forwarding{id.isBroker()} {}
70 
71  explicit DependencyInfo(Time start): TimeData(start) {}
72 };
73 
76  private:
77  std::vector<DependencyInfo> dependencies;
78  public:
80  TimeDependencies() = default;
82  bool isDependency(global_federate_id ofed) const;
84  bool isDependent(global_federate_id ofed) const;
98  bool updateTime(const ActionMessage& m);
100  auto size() const { return dependencies.size(); }
102  auto begin() { return dependencies.begin(); }
104  auto end() { return dependencies.end(); }
106  auto begin() const { return dependencies.cbegin(); }
108  auto end() const { return dependencies.cend(); }
110  auto cbegin() const { return dependencies.cbegin(); }
112  auto cend() const { return dependencies.cend(); }
113 
115  bool empty() const { return dependencies.empty(); }
118 
121 
123  bool checkIfReadyForExecEntry(bool iterating) const;
124 
130  bool checkIfReadyForTimeGrant(bool iterating, Time desiredGrantTime) const;
131 
136  void resetIteratingTimeRequests(Time requestTime);
138  void resetDependentEvents(Time grantTime);
140  bool hasActiveTimeDependencies() const;
142  int activeDependencyCount() const;
145 
146  void setDependencyVector(const std::vector<DependencyInfo>& deps) { dependencies = deps; }
147 };
148 
149 TimeData generateMinTimeUpstream(const TimeDependencies& dependencies,
150  bool restricted,
151  global_federate_id self,
152  global_federate_id ignore = global_federate_id());
153 
154 TimeData generateMinTimeDownstream(const TimeDependencies& dependencies,
155  bool restricted,
156  global_federate_id self,
157  global_federate_id ignore = global_federate_id());
158 
159 TimeData generateMinTimeTotal(const TimeDependencies& dependencies,
160  bool restricted,
161  global_federate_id self,
162  global_federate_id ignore = global_federate_id());
163 
164 void generateJsonOutputTimeData(Json::Value& output,
165  const TimeData& dep,
166  bool includeAggregates = true);
167 
168 void generateJsonOutputDependency(Json::Value& output, const DependencyInfo& dep);
169 } // namespace helics
helics::timeZero
constexpr Time timeZero
Definition: helics-time.hpp:31
helics::ActionMessage::source_id
global_federate_id source_id
12 – for federate_id or route_id
Definition: ActionMessage.hpp:36
helics::TimeDependencies::removeDependency
void removeDependency(global_federate_id id)
Definition: TimeDependencies.cpp:264
helics::TimeDependencies::isDependency
bool isDependency(global_federate_id ofed) const
Definition: TimeDependencies.cpp:201
helics::TimeDependencies::resetIteratingTimeRequests
void resetIteratingTimeRequests(Time requestTime)
Definition: TimeDependencies.cpp:421
delayed_timing_flag
constexpr uint16_t delayed_timing_flag
overload of extra_flag2 to indicate the request is from federate with delayed timing
Definition: flagOperations.hpp:55
helics::DependencyInfo::cyclic
bool cyclic
Definition: TimeDependencies.hpp:57
helics::TimeDependencies::getMinDependency
global_federate_id getMinDependency() const
Definition: TimeDependencies.cpp:362
helics::TimeDependencies::end
auto end() const
Definition: TimeDependencies.hpp:108
helics::TimeDependencies::addDependency
bool addDependency(global_federate_id id)
Definition: TimeDependencies.cpp:239
helics::TimeDependencies
Definition: TimeDependencies.hpp:75
helics::global_federate_id
Definition: global_federate_id.hpp:68
helics::DependencyInfo::fedID
global_federate_id fedID
identifier for the dependency
Definition: TimeDependencies.hpp:55
helics::TimeDependencies::resetDependentEvents
void resetDependentEvents(Time grantTime)
Definition: TimeDependencies.cpp:434
helics::DependencyInfo::DependencyInfo
DependencyInfo(global_federate_id id)
Definition: TimeDependencies.hpp:69
helics::TimeData
Definition: TimeDependencies.hpp:36
helics::DependencyInfo::dependent
bool dependent
indicator the dependency is a dependent object
Definition: TimeDependencies.hpp:60
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helics-time.hpp:27
helics::TimeData::Te
Time Te
the next currently scheduled event
Definition: TimeDependencies.hpp:39
helics::ActionMessage
Definition: ActionMessage.hpp:29
helics::TimeDependencies::resetIteratingExecRequests
void resetIteratingExecRequests()
Definition: TimeDependencies.cpp:377
iteration_requested_flag
@ iteration_requested_flag
indicator that an iteration has been requested
Definition: flagOperations.hpp:16
helics::TimeDependencies::checkIfReadyForTimeGrant
bool checkIfReadyForTimeGrant(bool iterating, Time desiredGrantTime) const
Definition: TimeDependencies.cpp:386
helics::TimeDependencies::begin
auto begin() const
Definition: TimeDependencies.hpp:106
checkActionFlag
bool checkActionFlag(uint16_t flags, FlagIndex flag)
Definition: flagOperations.hpp:75
helics::DependencyInfo::nonGranting
bool nonGranting
indicator that the dependency is a non granting time coordinator
Definition: TimeDependencies.hpp:63
helics::TimeDependencies::size
auto size() const
Definition: TimeDependencies.hpp:100
helics::global_federate_id::isValid
bool isValid() const
Definition: global_federate_id.hpp:108
helics::DependencyInfo::forwarding
bool forwarding
indicator that the dependency is a forwarding time coordinator
Definition: TimeDependencies.hpp:62
helics::TimeData::minFedActual
global_federate_id minFedActual
the actual forwarded minimum federate object
Definition: TimeDependencies.hpp:43
helics::negEpsilon
constexpr Time negEpsilon
Definition: helics-time.hpp:35
helics::TimeData::next
Time next
next possible message or value
Definition: TimeDependencies.hpp:38
helics::TimeData::TeAlt
Time TeAlt
the second min event
Definition: TimeDependencies.hpp:41
helics::TimeDependencies::activeDependencyCount
int activeDependencyCount() const
Definition: TimeDependencies.cpp:355
helics::TimeDependencies::updateTime
bool updateTime(const ActionMessage &m)
Definition: TimeDependencies.cpp:325
helics::TimeDependencies::begin
auto begin()
Definition: TimeDependencies.hpp:102
non_granting_flag
constexpr uint16_t non_granting_flag
overload of extra_flag1 to indicate the request is from a non-granting federate
Definition: flagOperations.hpp:52
helics::TimeDependencies::addDependent
bool addDependent(global_federate_id id)
Definition: TimeDependencies.cpp:277
helics::global_federate_id::isBroker
bool isBroker() const
Definition: global_federate_id.hpp:106
helics::DependencyInfo
Definition: TimeDependencies.hpp:53
helics::TimeDependencies::removeInterdependence
void removeInterdependence(global_federate_id id)
Definition: TimeDependencies.cpp:315
helics::TimeDependencies::isDependent
bool isDependent(global_federate_id ofed) const
Definition: TimeDependencies.cpp:210
helics::time_state_t
time_state_t
Definition: TimeDependencies.hpp:18
helics::TimeDependencies::checkIfReadyForExecEntry
bool checkIfReadyForExecEntry(bool iterating) const
Definition: TimeDependencies.cpp:336
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
error
@ error
only print errors
Definition: loggingHelper.hpp:22
helics::TimeDependencies::hasActiveTimeDependencies
bool hasActiveTimeDependencies() const
Definition: TimeDependencies.cpp:348
helics::TimeData::update
bool update(const TimeData &update)
Definition: TimeDependencies.cpp:95
helics::DependencyInfo::delayedTiming
bool delayedTiming
indicator that the dependency uses delayed timing
Definition: TimeDependencies.hpp:64
helics::TimeDependencies::cend
auto cend() const
Definition: TimeDependencies.hpp:112
helics::TimeDependencies::cbegin
auto cbegin() const
Definition: TimeDependencies.hpp:110
helics::DependencyInfo::DependencyInfo
DependencyInfo()=default
helics::TimeData::minDe
Time minDe
min dependency event time
Definition: TimeDependencies.hpp:40
helics::DependencyInfo::dependency
bool dependency
indicator that the dependency is an actual dependency
Definition: TimeDependencies.hpp:61
helics::TimeDependencies::end
auto end()
Definition: TimeDependencies.hpp:104
helics::ActionMessage::dest_id
global_federate_id dest_id
20 fed_id for a targeted message
Definition: ActionMessage.hpp:38
helics::ActionMessage::action
action_message_def::action_t action() const noexcept
Definition: ActionMessage.hpp:89
helics::TimeDependencies::TimeDependencies
TimeDependencies()=default
helics::TimeDependencies::empty
bool empty() const
Definition: TimeDependencies.hpp:115
flagOperations.hpp
helics::defs::other
@ other
Definition: helics_definitions.hpp:113
helics::TimeData::minFed
global_federate_id minFed
identifier for the min dependency
Definition: TimeDependencies.hpp:42
helics::TimeDependencies::getDependencyInfo
const DependencyInfo * getDependencyInfo(global_federate_id id) const
Definition: TimeDependencies.cpp:219
helics::message_processing_result::iterating
@ iterating
indicator that the iterations need to continue
helics::TimeDependencies::removeDependent
void removeDependent(global_federate_id id)
Definition: TimeDependencies.cpp:302