helics 3.7.0
Loading...
Searching...
No Matches
BaseTimeCoordinator.hpp
1/*
2Copyright (c) 2017-2026,
3Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Energy
4Innovation LLC. See the top-level NOTICE for additional details. All rights reserved.
5SPDX-License-Identifier: BSD-3-Clause
6*/
7#pragma once
8
9#include "ActionMessage.hpp"
10#include "CoreFederateInfo.hpp"
11#include "TimeDependencies.hpp"
12#include "nlohmann/json_fwd.hpp"
13
14#include <atomic>
15#include <cstdint>
16#include <functional>
17#include <limits>
18#include <string>
19#include <utility>
20#include <vector>
21
22namespace helics {
23
28 protected:
31 std::function<void(const ActionMessage&)> sendMessageFunction;
33
35 std::int32_t sequenceCounter{0};
36 bool noParent{true};
37 bool federatesOnly{false};
38 bool checkingExec{false};
39 bool executionMode{false};
44 bool nonGranting{false};
45 bool delayedTiming{false};
46 bool disconnected{false};
47
48 public:
49 static constexpr std::int32_t TIME_COORDINATOR_VERSION{1};
50
51 protected:
52 // Timing sequence counters are echoed through several compatibility paths; keep them in the
53 // positive signed 16-bit range even though ActionMessage stores the counter as uint16_t.
54 static constexpr auto maxTimingSequenceCounter = std::numeric_limits<std::int16_t>::max();
55
56 static void incrementSequenceCounter(std::int32_t& counter)
57 {
58 ++counter;
59 if (counter > maxTimingSequenceCounter) {
60 counter = 1;
61 }
62 }
63
64 static void normalizeSequenceCounter(std::int32_t& counter)
65 {
66 if (counter > maxTimingSequenceCounter) {
67 counter = 1;
68 }
69 }
70
71 public:
72 BaseTimeCoordinator();
73 explicit BaseTimeCoordinator(std::function<void(const ActionMessage&)> userSendMessageFunction);
74 virtual ~BaseTimeCoordinator() = default;
76 void setMessageSender(std::function<void(const ActionMessage&)> userSendMessageFunction);
77
78 void setRestrictivePolicy(bool policy) { restrictive_time_policy = policy; }
80 std::vector<GlobalFederateId> getDependencies() const;
82 std::vector<GlobalFederateId> getDependents() const;
84 Time getLastGrant(GlobalFederateId fedId) const;
86 void setSourceId(GlobalFederateId sourceId) { mSourceId = sourceId; }
87 GlobalFederateId sourceId() const { return mSourceId; }
91 virtual bool updateTimeFactors() = 0;
92
98 bool isDependency(GlobalFederateId ofed) const;
100 bool empty() const { return dependencies.empty(); }
101
102 protected:
106 std::int32_t responseCode) const;
108 void sendTimingInfo();
109
110 public:
115
121 virtual bool addDependency(GlobalFederateId fedID);
125 virtual bool addDependent(GlobalFederateId fedID);
128 virtual void removeDependency(GlobalFederateId fedID);
131 virtual void removeDependent(GlobalFederateId fedID);
134 virtual void resetDependency(GlobalFederateId fedID);
135
136 void setAsChild(GlobalFederateId fedID);
137 void setAsParent(GlobalFederateId fedID);
138 void setVersion(GlobalFederateId fedID, std::int8_t version);
139 GlobalFederateId getParent() const;
140
142 void disconnect();
146
151
153 virtual std::string printTimeStatus() const = 0;
155 virtual void generateDebuggingTimeInfo(nlohmann::json& base) const;
156
158 bool hasActiveTimeDependencies() const;
159
161 int dependencyCount() const;
164
167 nlohmann::json grantTimeoutCheck(const ActionMessage& cmd);
169 virtual Time getNextTime() const = 0;
170};
171} // namespace helics
Definition ActionMessage.hpp:30
Definition BaseTimeCoordinator.hpp:27
const DependencyInfo * getDependencyInfo(GlobalFederateId ofed) const
Definition BaseTimeCoordinator.cpp:238
bool executionMode
Definition BaseTimeCoordinator.hpp:39
virtual void enteringExecMode(IterationRequest mode=IterationRequest::NO_ITERATIONS)
Definition BaseTimeCoordinator.cpp:45
bool noParent
indicator that the coordinator does not have parents
Definition BaseTimeCoordinator.hpp:36
virtual bool addDependency(GlobalFederateId fedID)
Definition BaseTimeCoordinator.cpp:163
virtual void generateDebuggingTimeInfo(nlohmann::json &base) const
Definition BaseTimeCoordinator.cpp:125
virtual void resetDependency(GlobalFederateId fedID)
Definition BaseTimeCoordinator.cpp:233
virtual bool addDependent(GlobalFederateId fedID)
Definition BaseTimeCoordinator.cpp:177
bool hasActiveTimeDependencies() const
Definition BaseTimeCoordinator.cpp:271
nlohmann::json grantTimeoutCheck(const ActionMessage &cmd)
Definition BaseTimeCoordinator.cpp:143
void sendTimingInfo()
Definition BaseTimeCoordinator.cpp:286
virtual MessageProcessingResult checkExecEntry(GlobalFederateId triggerFed=GlobalFederateId{})=0
void processDependencyUpdateMessage(const ActionMessage &cmd)
Definition BaseTimeCoordinator.cpp:413
bool isDependency(GlobalFederateId ofed) const
Definition BaseTimeCoordinator.cpp:158
TimeDependencies dependencies
Definition BaseTimeCoordinator.hpp:29
Time getLastGrant(GlobalFederateId fedId) const
Definition BaseTimeCoordinator.cpp:265
void disconnect()
Definition BaseTimeCoordinator.cpp:80
bool empty() const
Definition BaseTimeCoordinator.hpp:100
std::function< void(const ActionMessage &)> sendMessageFunction
callback used to send the messages
Definition BaseTimeCoordinator.hpp:31
ActionMessage generateTimeRequest(const TimeData &dep, GlobalFederateId fed, std::int32_t responseCode) const
Definition BaseTimeCoordinator.cpp:306
std::vector< GlobalFederateId > getDependents() const
Definition BaseTimeCoordinator.cpp:254
bool restrictive_time_policy
flag indicating that a restrictive time policy should be used
Definition BaseTimeCoordinator.hpp:41
GlobalFederateId mSourceId
the identifier for inserting into the source id field of any generated messages;
Definition BaseTimeCoordinator.hpp:34
void setSourceId(GlobalFederateId sourceId)
Definition BaseTimeCoordinator.hpp:86
GlobalFederateId getMinDependency() const
Definition BaseTimeCoordinator.cpp:281
virtual TimeProcessingResult processTimeMessage(const ActionMessage &cmd)
Definition BaseTimeCoordinator.cpp:385
virtual bool updateTimeFactors()=0
virtual void removeDependent(GlobalFederateId fedID)
Definition BaseTimeCoordinator.cpp:228
std::int32_t sequenceCounter
storage for sequence counter
Definition BaseTimeCoordinator.hpp:35
bool federatesOnly
indicator that the forwarder only operates with federates
Definition BaseTimeCoordinator.hpp:37
virtual std::string printTimeStatus() const =0
virtual Time getNextTime() const =0
void setMessageSender(std::function< void(const ActionMessage &)> userSendMessageFunction)
Definition BaseTimeCoordinator.cpp:36
std::vector< GlobalFederateId > getDependencies() const
Definition BaseTimeCoordinator.cpp:243
virtual void removeDependency(GlobalFederateId fedID)
Definition BaseTimeCoordinator.cpp:223
int dependencyCount() const
Definition BaseTimeCoordinator.cpp:276
bool nonGranting
Definition BaseTimeCoordinator.hpp:44
Definition TimeDependencies.hpp:98
Definition GlobalFederateId.hpp:75
Definition TimeDependencies.hpp:62
Definition TimeDependencies.hpp:129
bool empty() const
Definition TimeDependencies.hpp:173
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:75
IterationRequest
Definition CoreTypes.hpp:103
@ NO_ITERATIONS
indicator that the iterations have completed
TimeProcessingResult
Definition TimeDependencies.hpp:42
TimeRepresentation< count_time< 9 > > Time
Definition helicsTime.hpp:27