helics  3.5.2
TimeCoordinator.hpp
1 /*
2 Copyright (c) 2017-2024,
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 "../common/GuardedTypes.hpp"
10 #include "ActionMessage.hpp"
11 #include "BaseTimeCoordinator.hpp"
12 
13 #include "json/forwards.h"
14 #include <atomic>
15 #include <functional>
16 #include <string>
17 #include <utility>
18 #include <vector>
19 
20 namespace helics {
21 
23 class tcoptions {
24  public:
25  Time timeDelta = Time::epsilon();
26  Time inputDelay = timeZero;
27  Time outputDelay = timeZero;
28  Time offset = timeZero;
29  Time period = timeZero;
30  // Time rtLag = timeZero;
31  // Time rtLead = timeZero;
32  // bool observer = false;
33  // bool realtime = false;
34  // bool source_only = false;
35  bool wait_for_current_time_updates = false;
36  bool uninterruptible = false;
37  bool restrictive_time_policy = false;
40  bool event_triggered = false;
41  int maxIterations = 50;
42 };
43 
49  protected:
52  TimeData total;
53  mutable TimeData lastSend;
54  // the variables for time coordination
55  Time time_granted{Time::minVal()};
56  Time time_requested{Time::maxVal()};
60  Time time_allow{Time::minVal()};
61  Time time_exec{Time::maxVal()};
62  Time time_message{Time::maxVal()};
63  Time time_value{Time::maxVal()};
66  Time time_grantBase{Time::minVal()};
68  Time time_block{Time::maxVal()};
69  Time maxTime{Time::maxVal()};
75  std::vector<std::pair<Time, int32_t>> timeBlocks;
78  std::uint8_t currentRestrictionLevel{0};
79 
80  public:
83 
85  bool hasInitUpdates{false};
87  bool hasIterationData{false};
90  bool needSendAll{false};
92  mutable bool triggered{false};
94  bool globalTime{false};
95 
96  protected:
98  bool dynamicJoining{false};
99 
100  std::atomic<int32_t> iteration{0};
101 
102  public:
104  TimeCoordinator() = default;
106  explicit TimeCoordinator(std::function<void(const ActionMessage&)> userSendMessageFunction):
107  BaseTimeCoordinator(std::move(userSendMessageFunction))
108  {
109  }
110 
112  void setProperty(int timeProperty, Time propertyVal);
114  void setProperty(int intProperty, int propertyVal);
116  void setOptionFlag(int optionFlag, bool value);
119 
121  Time getTimeProperty(int timeProperty) const;
123  bool getOptionFlag(int optionFlag) const;
125  int getIntegerProperty(int intProperty) const;
126 
128  Time getGrantedTime() const { return time_granted; }
132  Time allowedSendTime() const { return time_granted + info.outputDelay; }
134  std::vector<GlobalFederateId> getDependencies() const;
136  std::vector<GlobalFederateId> getDependents() const
137  {
138  return *dependent_federates.lock_shared();
139  }
140  const auto& getBarriers() const { return timeBlocks; }
144  int32_t getCurrentIteration() const { return iteration.load(); }
148  virtual bool updateTimeFactors() override;
152  void updateValueTime(Time valueUpdateTime, bool allowRequestSend);
156  void updateMessageTime(Time messageUpdateTime, bool allowRequestSend);
157 
158  void specifyNonGranting(bool value = true) { nonGranting = value; }
159 
160  private:
162  bool updateNextExecutionTime();
165  void updateNextPossibleEventTime();
167  Time getNextPossibleTime() const;
168  Time generateAllowedTime(Time testTime) const;
169  /* return true,true if the message was sent and skip federate was detected
170  true,false if the message was sent and skip federate was not detected
171  false,false, if the message was not sent
172  */
173  std::pair<bool, bool> checkAndSendTimeRequest(ActionMessage& upd, GlobalFederateId skip) const;
174 
175  void sendTimeRequest(GlobalFederateId triggerFed) const;
176  void updateTimeGrant();
178  bool transmitTimingMessages(ActionMessage& msg,
179  GlobalFederateId skipFed = GlobalFederateId{}) const;
180 
181  TimeProcessingResult processTimeBlockMessage(const ActionMessage& cmd);
182 
183  Time updateTimeBlocks(int32_t blockId, Time newTime);
184 
185  public:
186  virtual TimeProcessingResult processTimeMessage(const ActionMessage& cmd) override;
187 
191  void processConfigUpdateMessage(const ActionMessage& cmd);
195  virtual bool addDependency(GlobalFederateId fedID) override;
199  virtual bool addDependent(GlobalFederateId fedID) override;
202  virtual void removeDependency(GlobalFederateId fedID) override;
205  virtual void removeDependent(GlobalFederateId fedID) override;
206 
209  checkExecEntry(GlobalFederateId triggerFed = GlobalFederateId{}) override;
210 
212  void sendUpdatedExecRequest(GlobalFederateId target = GlobalFederateId{},
213  GlobalFederateId minFed = GlobalFederateId{},
214  std::int32_t responseSequenceCounter = 0);
221  void timeRequest(Time nextTime,
222  IterationRequest iterate,
223  Time newValueTime,
224  Time newMessageTime);
225 
226  virtual void enteringExecMode(IterationRequest mode) override;
228  MessageProcessingResult checkTimeGrant(GlobalFederateId triggerFed = GlobalFederateId{});
230  void localError();
232  virtual std::string printTimeStatus() const override;
234  void generateConfig(Json::Value& base) const;
235 
237  virtual void generateDebuggingTimeInfo(Json::Value& base) const override;
238 
240  std::pair<GlobalFederateId, Time> getMinGrantedDependency() const;
242  void enterInitialization();
244  void requestTimeCheck();
245 
246  virtual Time getNextTime() const override;
247 };
248 
249 } // namespace helics
Definition: application_api/Federate.hpp:27
Definition: ActionMessage.hpp:30
Definition: BaseTimeCoordinator.hpp:25
bool nonGranting
Definition: BaseTimeCoordinator.hpp:42
Definition: TimeCoordinator.hpp:48
Time time_requested
the most recent time requested
Definition: TimeCoordinator.hpp:56
virtual std::string printTimeStatus() const override
Definition: TimeCoordinator.cpp:880
Time time_message
the time of the earliest message event
Definition: TimeCoordinator.hpp:62
virtual bool updateTimeFactors() override
Definition: TimeCoordinator.cpp:429
std::vector< std::pair< Time, int32_t > > timeBlocks
blocks for a particular timeblocking link
Definition: TimeCoordinator.hpp:75
virtual MessageProcessingResult checkExecEntry(GlobalFederateId triggerFed=GlobalFederateId{}) override
Definition: TimeCoordinator.cpp:993
virtual void removeDependent(GlobalFederateId fedID) override
Definition: TimeCoordinator.cpp:923
std::vector< GlobalFederateId > getDependencies() const
Definition: TimeCoordinator.cpp:934
bool needSendAll
Definition: TimeCoordinator.hpp:90
void processConfigUpdateMessage(const ActionMessage &cmd)
Definition: TimeCoordinator.cpp:1472
void setOptionFlag(int optionFlag, bool value)
Definition: TimeCoordinator.cpp:1403
virtual bool addDependency(GlobalFederateId fedID) override
Definition: TimeCoordinator.cpp:894
tcoptions info
basic time control information
Definition: TimeCoordinator.hpp:77
void enterInitialization()
Definition: TimeCoordinator.cpp:304
void updateMessageTime(Time messageUpdateTime, bool allowRequestSend)
Definition: TimeCoordinator.cpp:395
TimeData upstream
the variables for time coordination
Definition: TimeCoordinator.hpp:51
void updateValueTime(Time valueUpdateTime, bool allowRequestSend)
Definition: TimeCoordinator.cpp:210
bool hasInitUpdates
flag indicating that a value or message was received during initialization stage
Definition: TimeCoordinator.hpp:85
bool dynamicJoining
if set to true the time coordinator is joining an ongoing co-simulation
Definition: TimeCoordinator.hpp:98
Time getRequestedTime() const
Definition: TimeCoordinator.hpp:130
MessageProcessingResult checkTimeGrant(GlobalFederateId triggerFed=GlobalFederateId{})
Definition: TimeCoordinator.cpp:479
virtual void removeDependency(GlobalFederateId fedID) override
Definition: TimeCoordinator.cpp:912
Time time_block
a blocking time to not grant time >= the specified time
Definition: TimeCoordinator.hpp:68
int getIntegerProperty(int intProperty) const
Definition: TimeCoordinator.cpp:1442
std::pair< GlobalFederateId, Time > getMinGrantedDependency() const
Definition: TimeCoordinator.cpp:1203
std::atomic< int32_t > iteration
current number of iterations
Definition: TimeCoordinator.hpp:100
void setProperty(int timeProperty, Time propertyVal)
Definition: TimeCoordinator.cpp:1367
virtual void enteringExecMode(IterationRequest mode) override
Definition: TimeCoordinator.cpp:24
Time time_next
the next possible internal event time
Definition: TimeCoordinator.hpp:57
TimeCoordinator(std::function< void(const ActionMessage &)> userSendMessageFunction)
Definition: TimeCoordinator.hpp:106
void timeRequest(Time nextTime, IterationRequest iterate, Time newValueTime, Time newMessageTime)
Definition: TimeCoordinator.cpp:103
bool globalTime
true if using a global time manager parent
Definition: TimeCoordinator.hpp:94
Time getGrantedTime() const
Definition: TimeCoordinator.hpp:128
bool hasIterationData
flag indicating that a value or message was received during iteration
Definition: TimeCoordinator.hpp:87
bool triggered
indicator the federate was triggered recently
Definition: TimeCoordinator.hpp:92
std::vector< GlobalFederateId > getDependents() const
Definition: TimeCoordinator.hpp:136
Time time_value
the time of the earliest value event
Definition: TimeCoordinator.hpp:63
Time time_allow
the current allowable time
Definition: TimeCoordinator.hpp:60
shared_guarded_m< std::vector< GlobalFederateId > > dependency_federates
these are to maintain an accessible record of dependency federates
Definition: TimeCoordinator.hpp:73
virtual void generateDebuggingTimeInfo(Json::Value &base) const override
Definition: TimeCoordinator.cpp:269
void setDynamicJoining()
Definition: TimeCoordinator.hpp:118
void sendUpdatedExecRequest(GlobalFederateId target=GlobalFederateId{}, GlobalFederateId minFed=GlobalFederateId{}, std::int32_t responseSequenceCounter=0)
Definition: TimeCoordinator.cpp:958
void generateConfig(Json::Value &base) const
Definition: TimeCoordinator.cpp:244
Time time_grantBase
Definition: TimeCoordinator.hpp:66
shared_guarded_m< std::vector< GlobalFederateId > > dependent_federates
these are to maintain an accessible record of dependent federates
Definition: TimeCoordinator.hpp:71
void localError()
Definition: TimeCoordinator.cpp:60
virtual bool addDependent(GlobalFederateId fedID) override
Definition: TimeCoordinator.cpp:903
IterationRequest iterating
indicator that the coordinator should be iteratingif need be
Definition: TimeCoordinator.hpp:82
Time time_granted
the most recent time granted
Definition: TimeCoordinator.hpp:55
virtual Time getNextTime() const override
Definition: TimeCoordinator.cpp:322
virtual TimeProcessingResult processTimeMessage(const ActionMessage &cmd) override
Definition: TimeCoordinator.cpp:1221
void requestTimeCheck()
Definition: TimeCoordinator.cpp:327
Time getTimeProperty(int timeProperty) const
Definition: TimeCoordinator.cpp:1424
Time time_exec
the time of the next targeted execution
Definition: TimeCoordinator.hpp:61
bool getOptionFlag(int optionFlag) const
Definition: TimeCoordinator.cpp:1454
Time time_minminDe
the minimum of the minimum dependency event Time
Definition: TimeCoordinator.hpp:58
Time allowedSendTime() const
Definition: TimeCoordinator.hpp:132
int32_t getCurrentIteration() const
Definition: TimeCoordinator.hpp:144
Time time_minDe
the minimum event time of the dependencies
Definition: TimeCoordinator.hpp:59
Definition: TimeDependencies.hpp:62
Definition: TimeCoordinator.hpp:23
bool event_triggered
Definition: TimeCoordinator.hpp:40
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
MessageProcessingResult
Definition: CoreTypes.hpp:74
constexpr Time timeZero
Definition: helicsTime.hpp:31
IterationRequest
Definition: CoreTypes.hpp:102
@ NO_ITERATIONS
indicator that the iterations have completed
TimeProcessingResult
Definition: TimeDependencies.hpp:42
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27