9#include "../common/GuardedTypes.hpp"
10#include "../common/JsonBuilder.hpp"
11#include "ActionMessage.hpp"
14#include "FederateIdExtra.hpp"
15#include "HandleManager.hpp"
16#include "gmlc/concurrency/DelayedObjects.hpp"
17#include "gmlc/concurrency/TriggerVariable.hpp"
18#include "gmlc/containers/AirLock.hpp"
19#include "gmlc/containers/DualStringMappedVector.hpp"
20#include "gmlc/containers/MappedPointerVector.hpp"
21#include "gmlc/containers/SimpleQueue.hpp"
22#include "helics/helics-config.h"
35#include <unordered_map>
44class FilterCoordinator;
47class TranslatorFederate;
52enum class OperatingState : std::uint8_t { OPERATING = 0, ERROR_STATE = 5, DISCONNECTED = 10 };
66 const FederateState* operator->()
const noexcept {
return fed; }
67 operator bool()
const noexcept {
return (fed !=
nullptr); }
82 explicit CommonCore(std::string_view coreName);
85 virtual void configure(std::string_view configureString)
override final;
90 virtual bool hasError()
const override final;
93 std::string_view errorString)
override final;
96 std::string_view errorString)
override final;
116 std::chrono::milliseconds msToWait)
override final;
122 int16_t propertyValue)
override final;
125 int32_t property)
const override final;
128 bool flagValue =
true)
override final;
132 std::string_view key,
133 std::string_view type,
134 std::string_view units)
override final;
136 std::string_view key)
const override final;
138 std::string_view key,
139 std::string_view type,
140 std::string_view units)
override final;
143 std::string_view key)
const override final;
149 int32_t option_value)
override final;
154 std::string_view targetToRemove)
override final;
156 std::string_view dest,
159 std::string_view name,
170 uint32_t* inputIndex)
override final;
171 virtual const std::vector<std::shared_ptr<const SmallBuffer>>&
173 virtual const std::vector<InterfaceHandle>&
176 std::string_view name,
177 std::string_view type)
override final;
180 std::string_view name,
181 std::string_view type)
override final;
183 std::string_view name)
const override final;
186 std::string_view name)
override final;
189 std::string_view name)
const override final;
192 std::string_view type_in,
193 std::string_view type_out)
override final;
195 std::string_view type_in,
196 std::string_view type_out)
override final;
198 std::string_view endpointType,
199 std::string_view units)
override final;
203 std::string_view federateName)
override final;
204 virtual void linkEndpoints(std::string_view source, std::string_view dest)
override final;
205 virtual void addAlias(std::string_view interfaceKey, std::string_view alias)
override final;
207 virtual void dataLink(std::string_view source, std::string_view target)
override final;
209 std::string_view endpoint)
override final;
211 std::string_view endpoint)
override final;
217 Time time)
override final;
221 std::string_view destination)
override final;
225 std::string_view destination,
226 Time time)
override final;
228 std::unique_ptr<Message> message)
override final;
236 std::string_view messageToLog)
override final;
238 std::shared_ptr<FilterOperator> callback)
override final;
241 std::shared_ptr<TranslatorOperator> callbacks)
override final;
243 std::shared_ptr<FederateOperator> callback)
override;
247 virtual const std::string&
getIdentifier()
const override final;
248 virtual const std::string&
getAddress()
const override final;
249 const std::string& getFederateNameNoThrow(
GlobalFederateId federateID)
const noexcept;
255 std::function<
void(
int, std::string_view, std::string_view)> logFunction)
override final;
257 virtual void setLogFile(std::string_view lfile)
override final;
259 virtual std::string
query(std::string_view target,
260 std::string_view queryStr,
263 std::function<std::string(std::string_view)> queryFunction,
265 virtual void setGlobal(std::string_view valueName, std::string_view value)
override;
267 std::string_view commandStr,
268 std::string_view source,
274 virtual bool connect()
override final;
278 std::chrono::milliseconds msToWait = std::chrono::milliseconds(0))
const override final;
295 std::string_view tag,
296 std::string_view value)
override final;
298 std::string_view tag)
const override final;
301 std::string_view tag,
302 std::string_view value)
override final;
304 std::string_view tag)
const override final;
309 virtual bool brokerConnect() = 0;
312 virtual void brokerDisconnect() = 0;
363 FederateState* getFederateCore(std::string_view federateName);
370 std::atomic<double> simTime{BrokerBase::mInvalidSimulationTime};
372 std::string prevIdentifier;
374 std::map<GlobalFederateId, route_id> routing_table;
376 gmlc::containers::SimpleQueue<ActionMessage> delayTransmitQueue;
378 std::unordered_map<std::string, route_id> knownExternalEndpoints;
379 std::vector<std::pair<std::string, std::string>> tags;
381 std::unique_ptr<TimeoutMonitor> timeoutMon;
383 void transmitDelayedMessages();
385 void errorRespondDelayedMessages(std::string_view estring);
389 void transmitDelayedMessages(GlobalFederateId source);
392 void routeMessage(ActionMessage& cmd, GlobalFederateId dest);
395 void routeMessage(
const ActionMessage& cmd);
398 void routeMessage(ActionMessage&& cmd, GlobalFederateId dest);
401 void routeMessage(ActionMessage&& cmd);
404 checkNewInterface(LocalFederateId federateID, std::string_view key,
InterfaceType type);
406 void checkDependencies();
408 void processQueryResponse(
const ActionMessage& message);
410 void checkQueryTimeouts();
412 void processCommandsForCore(
const ActionMessage& cmd);
414 void processCoreConfigureCommands(ActionMessage& cmd);
416 void processInitRequest(ActionMessage& cmd);
418 void processExecRequest(ActionMessage& cmd);
420 void processDisconnectCommand(ActionMessage& cmd);
423 void processTimingTick(ActionMessage& cmd);
425 void processQueryCommand(ActionMessage& cmd);
427 void processLogAndErrorCommand(ActionMessage& cmd);
429 void processLinkingCommand(ActionMessage& cmd);
432 bool checkForLocalPublication(ActionMessage& cmd);
434 uint16_t getNextAirlockIndex();
436 void loadBasicJsonInfo(
437 nlohmann::json& base,
438 const std::function<
void(nlohmann::json& fedval,
const FedInfo& fed)>& fedLoader)
const;
445 void initializeMapBuilder(std::string_view request,
448 bool force_ordering)
const;
450 std::string coreQuery(std::string_view queryStr,
bool force_ordering)
const;
454 std::string quickCoreQueries(std::string_view queryStr)
const;
457 std::string filteredEndpointQuery(
const FederateState* fed)
const;
459 void processCommandInstruction(ActionMessage& command);
462 int32_t mGlobalFederationSize{0};
464 std::atomic<int16_t> delayInitCounter{0};
465 bool filterTiming{
false};
469 gmlc::containers::DualStringMappedVector<FedInfo, GlobalFederateId> loopFederates;
473 std::atomic<int32_t> messageCounter{54};
474 ordered_guarded<HandleManager> handles;
476 HandleManager loopHandles;
478 std::vector<std::pair<GlobalFederateId, int32_t>> timeBlocks;
479 TranslatorFederate* translatorFed{
nullptr};
480 std::atomic<std::thread::id> translatorThread{std::thread::id{}};
481 std::atomic<GlobalFederateId> translatorFedID;
484 std::map<int32_t, std::vector<ActionMessage>> delayedTimingMessages;
487 std::atomic<int> queryCounter{1};
489 gmlc::concurrency::DelayedObjects<std::string> activeQueries;
491 std::deque<std::pair<int32_t,
decltype(std::chrono::steady_clock::now())>> queryTimeouts;
493 mutable std::vector<std::tuple<fileops::JsonMapBuilder, std::vector<ActionMessage>,
QueryReuse>>
496 FilterFederate* filterFed{
nullptr};
497 std::atomic<std::thread::id> filterThread{std::thread::id{}};
498 std::atomic<GlobalFederateId> filterFedID;
499 std::atomic<uint16_t> nextAirLock{0};
501 std::array<gmlc::containers::AirLock<std::any>, 4> dataAirlocks;
502 gmlc::concurrency::TriggerVariable disconnection;
504 std::atomic<bool> initIterations{
false};
508 void generateFilterFederate();
510 void generateTranslatorFederate();
512 void connectFilterTiming();
514 bool hasTimeBlock(GlobalFederateId federateID);
516 bool waitCoreRegistration();
518 void generateMessages(ActionMessage& message,
519 const std::vector<std::pair<GlobalHandle, std::string_view>>& targets);
521 void deliverMessage(ActionMessage& message);
523 ActionMessage& processMessage(ActionMessage& message);
527 const BasicHandleInfo& createBasicHandle(GlobalFederateId global_federateId,
528 LocalFederateId local_federateId,
530 std::string_view key,
531 std::string_view type,
532 std::string_view units,
538 bool isLocal(GlobalFederateId global_fedid)
const;
542 route_id getRoute(GlobalFederateId global_fedid)
const;
544 void checkForNamedInterface(ActionMessage& command);
546 void removeNamedTarget(ActionMessage& command);
549 void setAsUsed(BasicHandleInfo* hand);
551 void registerInterface(ActionMessage& command);
553 void addTargetToInterface(ActionMessage& command);
555 void removeTargetFromInterface(ActionMessage& command);
557 void disconnectInterface(ActionMessage& command);
559 void manageTimeBlocks(
const ActionMessage& command);
567 std::string federateQuery(
const FederateState* fed,
568 std::string_view queryStr,
569 bool force_ordering)
const;
572 void sendErrorToFederates(
int errorCode, std::string_view message);
574 bool checkAndProcessDisconnect();
578 void broadcastToFederates(ActionMessage& cmd);
580 int generateMapObjectCounter()
const;
581 friend class TimeoutMonitor;
constexpr auto NO_ITERATION
simplified alias to indicate that no iterations are needed
Definition CoreTypes.hpp:128
Definition application_api/Federate.hpp:27
Definition ActionMessage.hpp:30
Definition BasicHandleInfo.hpp:20
Definition BrokerBase.hpp:39
Definition CommonCore.hpp:74
FederateState * getHandleFederate(InterfaceHandle handle)
Definition CommonCore.cpp:371
virtual const std::string & getFederateTag(LocalFederateId fid, std::string_view tag) const override final
Definition CommonCore.cpp:5628
virtual void setIntegerProperty(LocalFederateId federateID, int32_t property, int16_t propertyValue) override final
Definition CommonCore.cpp:1085
virtual void setFlagOption(LocalFederateId federateID, int32_t flag, bool flagValue=true) override final
Definition CommonCore.cpp:1158
virtual bool waitForDisconnect(std::chrono::milliseconds msToWait=std::chrono::milliseconds(0)) const override final
Definition CommonCore.cpp:324
virtual int32_t getFederationSize() override final
Definition CommonCore.cpp:928
virtual const std::string & getExtractionType(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1459
virtual int32_t getHandleOption(InterfaceHandle handle, int32_t option) const override final
Definition CommonCore.cpp:1506
virtual uint64_t receiveCount(InterfaceHandle destination) override final
Definition CommonCore.cpp:2452
virtual void removeRoute(route_id rid)=0
virtual void transmit(route_id rid, ActionMessage &&command)=0
virtual void processPriorityCommand(ActionMessage &&command) override final
Definition CommonCore.cpp:3205
virtual InterfaceHandle registerDataSink(LocalFederateId federateID, std::string_view name) override final
Definition CommonCore.cpp:1930
virtual std::string getErrorMessage() const override final
Definition CommonCore.cpp:532
virtual const std::string & getInjectionType(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1435
virtual void sendAt(InterfaceHandle sourceHandle, const void *data, uint64_t length, Time time) override final
Definition CommonCore.cpp:2306
void unregister()
Definition CommonCore.cpp:332
virtual void sendCommand(std::string_view target, std::string_view commandStr, std::string_view source, HelicsSequencingModes mode) override
Definition CommonCore.cpp:3177
virtual InterfaceHandle getPublication(LocalFederateId federateID, std::string_view key) const override final
Definition CommonCore.cpp:1379
virtual void setValue(InterfaceHandle handle, const char *data, uint64_t len) override final
Definition CommonCore.cpp:1798
virtual InterfaceHandle registerTargetedEndpoint(LocalFederateId federateID, std::string_view name, std::string_view type) override final
Definition CommonCore.cpp:1952
const BasicHandleInfo * getHandleInfo(InterfaceHandle handle) const
Definition CommonCore.cpp:404
FederateState * getFederateAt(LocalFederateId federateID) const
Definition CommonCore.cpp:359
virtual void setFilterOperator(InterfaceHandle filter, std::shared_ptr< FilterOperator > callback) override final
Definition CommonCore.cpp:2604
bool allDisconnected() const
Definition CommonCore.cpp:597
virtual void sendMessage(InterfaceHandle sourceHandle, std::unique_ptr< Message > message) override final
Definition CommonCore.cpp:2332
virtual void setGlobal(std::string_view valueName, std::string_view value) override
Definition CommonCore.cpp:3167
virtual Time getCurrentTime(LocalFederateId federateID) const override final
Definition CommonCore.cpp:1076
virtual const std::string & getFederateName(LocalFederateId federateID) const override final
Definition CommonCore.cpp:891
virtual void closeHandle(InterfaceHandle handle) override final
Definition CommonCore.cpp:1531
virtual void dataLink(std::string_view source, std::string_view target) override final
Definition CommonCore.cpp:2127
virtual std::pair< std::string, std::string > getCommand(LocalFederateId federateID) override
Definition CommonCore.cpp:2539
virtual InterfaceHandle getTranslator(std::string_view name) const override final
Definition CommonCore.cpp:2081
virtual InterfaceHandle registerTranslator(std::string_view translatorName, std::string_view endpointType, std::string_view units) override final
Definition CommonCore.cpp:2047
virtual Time timeRequest(LocalFederateId federateID, Time next) override final
Definition CommonCore.cpp:937
virtual InterfaceHandle registerCloningFilter(std::string_view filterName, std::string_view type_in, std::string_view type_out) override final
Definition CommonCore.cpp:2018
virtual int getErrorCode() const override final
Definition CommonCore.cpp:527
virtual iteration_time requestTimeIterative(LocalFederateId federateID, Time next, IterationRequest iterate) override final
Definition CommonCore.cpp:995
virtual InterfaceHandle getFilter(std::string_view name) const override final
Definition CommonCore.cpp:2071
virtual const std::string & getSourceTargets(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1764
virtual void processDisconnect(bool skipUnregister=false) override final
Definition CommonCore.cpp:269
virtual void setQueryCallback(LocalFederateId federateID, std::function< std::string(std::string_view)> queryFunction, int order) override
Definition CommonCore.cpp:2684
virtual void addSourceTarget(InterfaceHandle handle, std::string_view name, InterfaceType hint) override final
Definition CommonCore.cpp:1661
virtual bool connect() override final
Definition CommonCore.cpp:190
virtual void setTranslatorOperator(InterfaceHandle translator, std::shared_ptr< TranslatorOperator > callbacks) override final
Definition CommonCore.cpp:2626
virtual void setFederateOperator(LocalFederateId federateID, std::shared_ptr< FederateOperator > callback) override
Definition CommonCore.cpp:2651
virtual std::unique_ptr< Message > receiveAny(LocalFederateId federateID, InterfaceHandle &endpoint_id) override final
Definition CommonCore.cpp:2474
virtual InterfaceHandle registerFilter(std::string_view filterName, std::string_view type_in, std::string_view type_out) override final
Definition CommonCore.cpp:1996
virtual InterfaceHandle getDataSink(LocalFederateId federateID, std::string_view name) const override final
Definition CommonCore.cpp:1986
CommonCore() noexcept
Definition CommonCore.cpp:133
virtual const std::string & getInjectionUnits(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1398
virtual InterfaceHandle registerEndpoint(LocalFederateId federateID, std::string_view name, std::string_view type) override final
Definition CommonCore.cpp:1903
virtual iteration_time enterExecutingMode(LocalFederateId federateID, IterationRequest iterate=NO_ITERATION) override final
Definition CommonCore.cpp:719
virtual bool isConnected() const override final
Definition CommonCore.cpp:249
virtual const std::shared_ptr< const SmallBuffer > & getValue(InterfaceHandle handle, uint32_t *inputIndex) override final
Definition CommonCore.cpp:1862
virtual Time getTimeProperty(LocalFederateId federateID, int32_t property) const override final
Definition CommonCore.cpp:1127
virtual void setInterfaceTag(InterfaceHandle handle, std::string_view tag, std::string_view value) override final
Definition CommonCore.cpp:5600
virtual void configureFromArgs(int argc, char *argv[]) override final
Definition CommonCore.cpp:158
virtual void configureFromVector(std::vector< std::string > args) override final
Definition CommonCore.cpp:174
virtual InterfaceHandle registerInput(LocalFederateId federateID, std::string_view key, std::string_view type, std::string_view units) override final
Definition CommonCore.cpp:1309
virtual ~CommonCore() override
Definition CommonCore.cpp:354
virtual double getSimulationTime() const override
Definition CommonCore.cpp:616
bool allInitReady() const
Definition CommonCore.cpp:575
virtual void sendTo(InterfaceHandle sourceHandle, const void *data, uint64_t length, std::string_view destination) override final
Definition CommonCore.cpp:2164
virtual void setLoggingLevel(int logLevel) override
Definition CommonCore.cpp:2521
virtual void setLogFile(std::string_view lfile) override final
Definition CommonCore.cpp:2530
virtual void addSourceFilterToEndpoint(std::string_view filter, std::string_view endpoint) override final
Definition CommonCore.cpp:2135
virtual bool enterInitializingMode(LocalFederateId federateID, IterationRequest request) override final
Definition CommonCore.cpp:651
virtual void processCommand(ActionMessage &&command) override final
Definition CommonCore.cpp:3474
virtual void removeTarget(InterfaceHandle handle, std::string_view targetToRemove) override final
Definition CommonCore.cpp:1548
virtual std::string query(std::string_view target, std::string_view queryStr, HelicsSequencingModes mode) override
Definition CommonCore.cpp:3076
virtual const std::string & getInterfaceTag(InterfaceHandle handle, std::string_view tag) const override final
Definition CommonCore.cpp:5591
virtual std::pair< std::string, std::string > waitCommand(LocalFederateId federateID) override
Definition CommonCore.cpp:2548
virtual void addDestinationTarget(InterfaceHandle handle, std::string_view dest, InterfaceType hint) override final
Definition CommonCore.cpp:1582
virtual InterfaceHandle getInput(LocalFederateId federateID, std::string_view key) const override final
Definition CommonCore.cpp:1340
virtual uint64_t receiveCountAny(LocalFederateId federateID) override final
Definition CommonCore.cpp:2488
virtual InterfaceHandle getEndpoint(LocalFederateId federateID, std::string_view name) const override final
Definition CommonCore.cpp:1976
virtual const std::vector< InterfaceHandle > & getValueUpdates(LocalFederateId federateID) override final
Definition CommonCore.cpp:1894
virtual int16_t getIntegerProperty(LocalFederateId federateID, int32_t property) const override final
Definition CommonCore.cpp:1136
virtual void send(InterfaceHandle sourceHandle, const void *data, uint64_t length) override final
Definition CommonCore.cpp:2281
virtual void transmit(route_id rid, const ActionMessage &command)=0
virtual void makeConnections(const std::string &file) override final
Definition CommonCore.cpp:2091
virtual bool getFlagOption(LocalFederateId federateID, int32_t flag) const override final
Definition CommonCore.cpp:1206
OperatingState minFederateState() const
Definition CommonCore.cpp:607
virtual LocalFederateId getFederateId(std::string_view name) const override final
Definition CommonCore.cpp:917
virtual void setInterfaceInfo(InterfaceHandle handle, std::string_view info) override final
Definition CommonCore.cpp:5585
virtual void finalize(LocalFederateId federateID) override final
Definition CommonCore.cpp:539
virtual const std::string & getHandleName(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1389
virtual void addDestinationFilterToEndpoint(std::string_view filter, std::string_view endpoint) override final
Definition CommonCore.cpp:2143
virtual void addDependency(LocalFederateId federateID, std::string_view federateName) override final
Definition CommonCore.cpp:2152
virtual void processCommunications(LocalFederateId federateID, std::chrono::milliseconds msToWait) override final
Definition CommonCore.cpp:1056
virtual void logMessage(LocalFederateId federateID, int logLevel, std::string_view messageToLog) override final
Definition CommonCore.cpp:2501
virtual const std::vector< std::shared_ptr< const SmallBuffer > > & getAllValues(InterfaceHandle handle) override final
Definition CommonCore.cpp:1879
virtual std::unique_ptr< Message > receive(InterfaceHandle destination) override final
Definition CommonCore.cpp:2461
virtual const std::string & getAddress() const override final
Definition CommonCore.cpp:261
const BasicHandleInfo * getLocalEndpoint(std::string_view name) const
Definition CommonCore.cpp:409
virtual void setHandleOption(InterfaceHandle handle, int32_t option, int32_t option_value) override final
Definition CommonCore.cpp:1477
virtual bool isOpenToNewFederates() const override final
Definition CommonCore.cpp:431
virtual void linkEndpoints(std::string_view source, std::string_view dest) override final
Definition CommonCore.cpp:2111
virtual void disconnect() override final
Definition CommonCore.cpp:298
void checkInFlightQueriesForDisconnect()
Definition CommonCore.cpp:5352
virtual InterfaceHandle registerPublication(LocalFederateId federateID, std::string_view key, std::string_view type, std::string_view units) override final
Definition CommonCore.cpp:1350
virtual const std::string & getInterfaceInfo(InterfaceHandle handle) const override final
Definition CommonCore.cpp:5576
virtual void configure(std::string_view configureString) override final
Definition CommonCore.cpp:142
virtual void setFederateTag(LocalFederateId fid, std::string_view tag, std::string_view value) override final
Definition CommonCore.cpp:5647
virtual void setCoreReadyToInit() override final
Definition CommonCore.cpp:621
virtual const std::string & getExtractionUnits(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1420
FederateState * getFederate(std::string_view federateName) const
Definition CommonCore.cpp:365
virtual void sendToAt(InterfaceHandle sourceHandle, const void *data, uint64_t length, std::string_view destination, Time time) override final
Definition CommonCore.cpp:2204
void setIdentifier(std::string_view name)
Definition CommonCore.cpp:2674
virtual void setTimeProperty(LocalFederateId federateID, int32_t property, Time time) override final
Definition CommonCore.cpp:1111
virtual LocalFederateId registerFederate(std::string_view name, const CoreFederateInfo &info) override final
Definition CommonCore.cpp:766
virtual void setLoggingCallback(LocalFederateId federateID, std::function< void(int, std::string_view, std::string_view)> logFunction) override final
Definition CommonCore.cpp:2557
virtual const std::string & getDestinationTargets(InterfaceHandle handle) const override final
Definition CommonCore.cpp:1733
virtual const std::string & getIdentifier() const override final
Definition CommonCore.cpp:256
virtual void addAlias(std::string_view interfaceKey, std::string_view alias) override final
Definition CommonCore.cpp:2119
virtual void addRoute(route_id rid, int interfaceId, std::string_view routeInfo)=0
virtual bool isConfigured() const override final
Definition CommonCore.cpp:426
Definition CoreFederateInfo.hpp:16
Definition core/Core.hpp:41
Definition CommonCore.hpp:58
Definition FederateState.hpp:51
Definition GlobalFederateId.hpp:75
Definition LocalFederateId.hpp:65
Definition LocalFederateId.hpp:22
Definition GlobalFederateId.hpp:187
HelicsSequencingModes
Definition helics_enums.h:429
action_t
Definition ActionMessageDefintions.hpp:20
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition AsyncFedCallInfo.hpp:14
const std::string & stateString(OperatingState state)
Definition CommonCore.cpp:116
IterationRequest
Definition CoreTypes.hpp:103
InterfaceType
Definition CoreTypes.hpp:112
QueryReuse
Enumeration of if query result is reusable.
Definition queryHelpers.hpp:39
TimeRepresentation< count_time< 9 > > Time
Definition helicsTime.hpp:27
OperatingState
Definition CommonCore.hpp:52
Definition helicsTime.hpp:46