helics  3.5.2
application_api/Federate.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 #include "../core/LocalFederateId.hpp"
9 #include "../core/helicsTime.hpp"
10 #include "../helics_enums.h"
11 #include "FederateInfo.hpp"
12 #include "helics/helics-config.h"
13 #include "helicsTypes.hpp"
14 #include "helics_cxx_export.h"
15 
16 #include <atomic>
17 #include <functional>
18 #include <memory>
19 #include <mutex>
20 #include <optional>
21 #include <stdexcept>
22 #include <string>
23 #include <utility>
24 
25 namespace gmlc::libguarded {
26 template<class T, class M>
28 } // namespace gmlc::libguarded
29 
33 namespace helics {
34 class Core;
35 class CoreApp;
36 class AsyncFedCallInfo;
37 class MessageOperator;
38 class ConnectorFederateManager;
39 class PotentialInterfacesManager;
40 class Filter;
41 class Translator;
42 class CloningFilter;
43 class Federate;
44 enum class FilterTypes;
45 
48 class HELICS_CXX_EXPORT Federate {
49  public:
51  enum class Modes : char {
53  STARTUP = 0,
55  INITIALIZING = 1,
57  EXECUTING = 2,
59  FINALIZE = 3,
61  ERROR_STATE = 4,
62  // the following states are for asynchronous operations
64  PENDING_INIT = 5,
66  PENDING_EXEC = 6,
68  PENDING_TIME = 7,
70  PENDING_ITERATIVE_TIME = 8,
72  PENDING_FINALIZE = 9,
74  FINISHED = 10,
75 
77  PENDING_ITERATIVE_INIT = 12,
78  };
79 
80  protected:
81  std::atomic<Modes> currentMode{Modes::STARTUP};
82  char nameSegmentSeparator = '/';
84  bool strictConfigChecking{true};
86  bool useJsonSerialization{false};
88  bool observerMode{false};
90  bool retriggerTimeRequest{false};
91  /*** specify that the federate will only be used on a single thread*/
92  bool singleThreadFederate{false};
93  /*** specify that the federate has potential interfaces*/
94  bool hasPotentialInterfaces{false};
95 
96  private:
97  LocalFederateId fedID;
98  protected:
99  std::shared_ptr<Core> coreObject;
100  Time mCurrentTime = Time::minVal();
101  Time mStopTime = Time::maxVal();
102  std::string configFile;
103  private:
105  std::unique_ptr<gmlc::libguarded::shared_guarded<AsyncFedCallInfo, std::mutex>> asyncCallInfo;
106  std::unique_ptr<ConnectorFederateManager> cManager;
108  std::unique_ptr<PotentialInterfacesManager> potManager;
109  std::atomic<int> potInterfacesSequence{0};
110  std::string mName;
111  std::function<void(Time, Time, bool)> timeRequestEntryCallback;
112  std::function<void(Time, bool)> timeUpdateCallback;
113  std::function<void(Modes, Modes)> modeUpdateCallback;
114  std::function<void(Time, bool)> timeRequestReturnCallback;
115  std::function<void(bool)> initializingEntryCallback;
116  std::function<void()> executingEntryCallback;
117  std::function<void()> cosimulationTerminationCallback;
118  std::function<void(int, std::string_view)> errorHandlerCallback;
119 
120  public:
125  Federate(std::string_view fedname, const FederateInfo& fedInfo);
131  Federate(std::string_view fedname,
132  const std::shared_ptr<Core>& core,
133  const FederateInfo& fedInfo = FederateInfo{});
134 
140  Federate(std::string_view fedname, CoreApp& core, const FederateInfo& fedInfo = FederateInfo{});
144  explicit Federate(const std::string& configString);
150  Federate(std::string_view fedname, const std::string& configString);
152  Federate() noexcept;
154  Federate(Federate&& fed) noexcept;
156  Federate(const Federate& fed) = delete;
158  virtual ~Federate();
160  Federate& operator=(Federate&& fed) noexcept;
162  Federate& operator=(const Federate& fed) = delete;
166  void enterInitializingMode();
167 
172  void enterInitializingModeAsync();
177  bool isAsyncOperationCompleted() const;
181  void enterInitializingModeComplete();
182 
188  void enterInitializingModeIterative();
189 
194  void enterInitializingModeIterativeAsync();
195 
200  void enterInitializingModeIterativeComplete();
201 
206  IterationResult enterExecutingMode(IterationRequest iterate = IterationRequest::NO_ITERATIONS);
212  void enterExecutingModeAsync(IterationRequest iterate = IterationRequest::NO_ITERATIONS);
217  IterationResult enterExecutingModeComplete();
221  void finalize();
224  void finalizeAsync();
226  void finalizeComplete();
230  void processCommunication(std::chrono::milliseconds period = std::chrono::milliseconds(0));
233  virtual void disconnect();
234 
239  void localError(int errorcode, std::string_view message);
240 
246  void globalError(int errorcode, std::string_view message);
247 
251  void localError(int errorcode);
252 
256  void globalError(int errorcode);
257 
265  void setSeparator(char separator) { nameSegmentSeparator = separator; }
269  Time requestTime(Time nextInternalTimeStep);
270 
273  Time requestNextStep() { return requestTime(timeZero); }
274 
278  Time requestTimeAdvance(Time timeDelta) { return requestTime(mCurrentTime + timeDelta); }
279 
284  iteration_time requestTimeIterative(Time nextInternalTimeStep, IterationRequest iterate);
285 
290  void requestTimeAsync(Time nextInternalTimeStep);
291 
298  void requestTimeIterativeAsync(Time nextInternalTimeStep, IterationRequest iterate);
299 
302  Time requestTimeComplete();
303 
307  iteration_time requestTimeIterativeComplete();
308 
314  void setTag(std::string_view tag, std::string_view value);
321  const std::string& getTag(std::string_view tag) const;
322 
327  virtual void setProperty(int32_t option, double timeValue);
328 
333  virtual void setProperty(int32_t option, Time timeValue);
334 
339  virtual void setFlagOption(int flag, bool flagValue = true);
344  virtual void setProperty(int32_t option, int32_t optionValue);
345 
349  virtual Time getTimeProperty(int32_t option) const;
350 
354  virtual bool getFlagOption(int flag) const;
358  virtual int getIntegerProperty(int32_t option) const;
359 
366  void setLoggingCallback(
367  const std::function<void(int, std::string_view, std::string_view)>& logFunction);
368 
376  void setInitializingEntryCallback(std::function<void(bool)> callback);
377 
383  void setExecutingEntryCallback(std::function<void()> callback);
384 
392  void setTimeRequestEntryCallback(std::function<void(Time, Time, bool)> callback);
393 
402  void setTimeUpdateCallback(std::function<void(Time, bool)> callback);
403 
412  void setModeUpdateCallback(std::function<void(Modes, Modes)> callback);
413 
421  void setTimeRequestReturnCallback(std::function<void(Time, bool)> callback);
422 
428  void setCosimulationTerminatedCallback(std::function<void()> callback);
429 
436  void setErrorHandlerCallback(std::function<void(int, std::string_view)> errorHandlerCallback);
437 
451  std::string query(std::string_view target,
452  std::string_view queryStr,
454 
467  std::string query(std::string_view queryStr,
469 
481  QueryId queryAsync(std::string_view target,
482  std::string_view queryStr,
484 
494  QueryId queryAsync(std::string_view queryStr,
496 
506  std::string queryComplete(QueryId queryIndex);
507 
511  bool isQueryCompleted(QueryId queryIndex) const;
512 
521  void setQueryCallback(const std::function<std::string(std::string_view)>& queryFunction);
522 
528  void setGlobal(std::string_view valueName, std::string_view value);
533  void addAlias(std::string_view interfaceName, std::string_view alias);
542  void sendCommand(
543  std::string_view target,
544  std::string_view commandStr,
546 
551  std::pair<std::string, std::string> getCommand();
552 
557  std::pair<std::string, std::string> waitCommand();
558 
563  void addDependency(std::string_view fedName);
564 
570  Filter& registerGlobalFilter(std::string_view filterName,
571  std::string_view inputType = std::string_view{},
572  std::string_view outputType = std::string_view{});
573 
580  CloningFilter& registerGlobalCloningFilter(std::string_view filterName,
581  std::string_view inputType = std::string_view{},
582  std::string_view outputType = std::string_view{});
583 
590  Filter& registerFilter(std::string_view filterName,
591  std::string_view inputType = std::string_view{},
592  std::string_view outputType = std::string_view{});
593 
602  CloningFilter& registerCloningFilter(std::string_view filterName,
603  std::string_view inputType = std::string_view{},
604  std::string_view outputType = std::string_view{});
605 
609  {
610  return registerGlobalFilter(std::string(), std::string_view{}, std::string_view{});
611  }
612 
619  Translator& registerGlobalTranslator(std::int32_t translatorType,
620  std::string_view translatorName,
621  std::string_view endpointType = std::string_view{},
622  std::string_view units = std::string_view{});
623 
631  Translator& registerTranslator(std::int32_t translatorType,
632  std::string_view translatorName,
633  std::string_view endpointType = std::string_view{},
634  std::string_view units = std::string_view{});
635 
641  Translator& registerGlobalTranslator(std::string_view translatorName,
642  std::string_view endpointType = std::string_view{},
643  std::string_view units = std::string_view{})
644  {
645  return registerGlobalTranslator(0, translatorName, endpointType, units);
646  }
647 
654  Translator& registerTranslator(std::string_view translatorName,
655  std::string_view endpointType = std::string_view{},
656  std::string_view units = std::string_view{})
657  {
658  return registerTranslator(0, translatorName, endpointType, units);
659  }
660 
663  Translator& registerTranslator() { return registerGlobalTranslator(""); }
667  {
668  return registerGlobalCloningFilter(std::string(), std::string(), std::string());
669  }
670 
674  const Filter& getFilter(std::string_view filterName) const;
675 
679  const Filter& getFilter(int index) const;
680 
684  Filter& getFilter(std::string_view filterName);
685 
689  Filter& getFilter(int index);
690 
698  void setFilterOperator(const Filter& filt, std::shared_ptr<FilterOperator> filtOp);
699 
701  int getFilterCount() const;
702 
703  // translator retrieval
708  const Translator& getTranslator(std::string_view translatorName) const;
709 
714  const Translator& getTranslator(int index) const;
715 
720  Translator& getTranslator(std::string_view translatorName);
721 
726  Translator& getTranslator(int index);
727 
735  void setTranslatorOperator(const Translator& trans,
736  std::shared_ptr<TranslatorOperator> transOp);
737 
739  int getTranslatorCount() const;
741  const std::string& getConfigFile() const { return configFile; }
742 
743  protected:
745  void enteringInitializingMode(IterationResult iterating);
746 
748  void enteringExecutingMode(iteration_time res);
750  void finalizeOperations();
751  void preTimeRequestOperations(Time nextStep, bool iterating);
752  void postTimeRequestOperations(Time newTime, bool iterating);
754  virtual void updateTime(Time newTime, Time oldTime);
757  virtual void startupToInitializeStateTransition();
760  virtual void initializeToExecuteStateTransition(iteration_time iterate);
762  virtual void disconnectTransition();
765  virtual std::string localQuery(std::string_view queryStr) const;
768  std::string localNameGenerator(std::string_view addition) const;
770  void handleError(int errorCode, std::string_view errorString, bool noThrow);
771  void setAsyncCheck(std::function<bool()> asyncCheck);
772 
773  public:
779  virtual void registerInterfaces(const std::string& configString);
785  void registerConnectorInterfaces(const std::string& configString);
791  void registerFilterInterfaces(const std::string& configString)
792  {
793  registerConnectorInterfaces(configString);
794  }
796  auto getID() const noexcept { return fedID; }
798  Modes getCurrentMode() const noexcept { return currentMode.load(); }
801  Time getCurrentTime() const noexcept { return mCurrentTime; }
803  const std::string& getName() const { return mName; }
805  const std::shared_ptr<Core>& getCorePointer() { return coreObject; }
806 
811  void logMessage(int level, std::string_view message) const;
812 
816  void logErrorMessage(std::string_view message) const
817  {
818  logMessage(HELICS_LOG_LEVEL_ERROR, message);
819  }
823  void logWarningMessage(std::string_view message) const
824  {
825  logMessage(HELICS_LOG_LEVEL_WARNING, message);
826  }
830  void logInfoMessage(std::string_view message) const
831  {
832  logMessage(HELICS_LOG_LEVEL_SUMMARY, message);
833  }
837  void logDebugMessage(std::string_view message) const
838  {
839  logMessage(HELICS_LOG_LEVEL_DEBUG, message);
840  }
842  void completeOperation();
843 
844  private:
845  void getCore(const FederateInfo& fedInfo);
847  void verifyCore();
849  void registerFederate(const FederateInfo& fedInfo);
850 
852  void updateFederateMode(Modes newMode);
854  void potentialInterfacesStartupSequence();
856  void updateSimulationTime(Time newTime, Time oldTime, bool iterating);
861  void registerConnectorInterfacesJson(const std::string& jsonString);
866  void registerConnectorInterfacesToml(const std::string& tomlString);
869  void registerConnectorInterfacesJsonDetail(Json::Value& json);
870  bool
871  checkValidFilterType(bool useTypes, FilterTypes opType, const std::string& operation) const;
872 };
873 
875 class HELICS_CXX_EXPORT Interface {
876  protected:
877  Core* mCore{nullptr};
878  InterfaceHandle handle{};
879  std::string mName;
880  public:
881  Interface() = default;
882  Interface(Federate* federate, InterfaceHandle hid, std::string_view actName);
883  Interface(Core* core, InterfaceHandle hid, std::string_view actName):
884  mCore(core), handle(hid), mName(actName)
885  {
886  }
887  virtual ~Interface() = default;
890  InterfaceHandle getHandle() const { return handle; }
892  operator InterfaceHandle() const { return handle; }
894  bool isValid() const { return handle.isValid(); }
895  bool operator<(const Interface& inp) const { return (handle < inp.handle); }
896  bool operator>(const Interface& inp) const { return (handle > inp.handle); }
897  bool operator==(const Interface& inp) const { return (handle == inp.handle); }
898  bool operator!=(const Interface& inp) const { return (handle != inp.handle); }
901  const std::string& getLocalName() const { return mName; }
904  const std::string& getName() const;
906  [[deprecated]] const std::string& getTarget() const;
908  void addSourceTarget(std::string_view newTarget, InterfaceType hint = InterfaceType::UNKNOWN);
910  void addDestinationTarget(std::string_view newTarget,
911  InterfaceType hint = InterfaceType::UNKNOWN);
913  void removeTarget(std::string_view targetToRemove);
915  void addAlias(std::string_view alias);
917  const std::string& getInfo() const;
919  void setInfo(std::string_view info);
925  void setTag(std::string_view tag, std::string_view value);
932  const std::string& getTag(std::string_view tag) const;
934  virtual void setOption(int32_t option, int32_t value = 1);
935 
937  virtual int32_t getOption(int32_t option) const;
938 
944  const std::string& getInjectionType() const;
945 
951  const std::string& getExtractionType() const;
952 
958  const std::string& getInjectionUnits() const;
959 
964  const std::string& getExtractionUnits() const;
967  virtual const std::string& getDisplayName() const = 0;
970  const std::string& getSourceTargets() const;
973  const std::string& getDestinationTargets() const;
975  std::size_t getSourceTargetCount() const;
977  std::size_t getDestinationTargetCount() const;
979  void close();
981  void disconnectFromCore();
982 };
983 
987 HELICS_CXX_EXPORT void cleanupHelicsLibrary();
988 } // namespace helics
Definition: application_api/Federate.hpp:27
Definition: Filters.hpp:100
Definition: core/Core.hpp:41
Definition: FederateInfo.hpp:29
Definition: application_api/Federate.hpp:48
Modes getCurrentMode() const noexcept
Definition: application_api/Federate.hpp:798
Translator & registerTranslator(std::string_view translatorName, std::string_view endpointType=std::string_view{}, std::string_view units=std::string_view{})
Definition: application_api/Federate.hpp:654
const std::string & getName() const
Definition: application_api/Federate.hpp:803
const std::string & getConfigFile() const
Definition: application_api/Federate.hpp:741
void logErrorMessage(std::string_view message) const
Definition: application_api/Federate.hpp:816
Time requestNextStep()
Definition: application_api/Federate.hpp:273
const std::shared_ptr< Core > & getCorePointer()
Definition: application_api/Federate.hpp:805
auto getID() const noexcept
Definition: application_api/Federate.hpp:796
void logDebugMessage(std::string_view message) const
Definition: application_api/Federate.hpp:837
CloningFilter & registerCloningFilter()
Definition: application_api/Federate.hpp:666
std::shared_ptr< Core > coreObject
reference to the core simulation API
Definition: application_api/Federate.hpp:99
std::string configFile
any config file used
Definition: application_api/Federate.hpp:102
void registerFilterInterfaces(const std::string &configString)
Definition: application_api/Federate.hpp:791
void logWarningMessage(std::string_view message) const
Definition: application_api/Federate.hpp:823
Time getCurrentTime() const noexcept
Definition: application_api/Federate.hpp:801
Translator & registerTranslator()
Definition: application_api/Federate.hpp:663
Modes
Definition: application_api/Federate.hpp:51
Time requestTimeAdvance(Time timeDelta)
Definition: application_api/Federate.hpp:278
Filter & registerFilter()
Definition: application_api/Federate.hpp:608
Translator & registerGlobalTranslator(std::string_view translatorName, std::string_view endpointType=std::string_view{}, std::string_view units=std::string_view{})
Definition: application_api/Federate.hpp:641
void logInfoMessage(std::string_view message) const
Definition: application_api/Federate.hpp:830
Definition: Filters.hpp:39
Definition: LocalFederateId.hpp:65
Definition: application_api/Federate.hpp:875
InterfaceHandle handle
the id as generated by the Federate
Definition: application_api/Federate.hpp:878
const std::string & getLocalName() const
Definition: application_api/Federate.hpp:901
bool isValid() const
Definition: application_api/Federate.hpp:894
InterfaceHandle getHandle() const
Definition: application_api/Federate.hpp:890
std::string mName
the name or key of the interface
Definition: application_api/Federate.hpp:879
Definition: application_api/Translator.hpp:35
@ HELICS_LOG_LEVEL_ERROR
Definition: helics_enums.h:206
@ HELICS_LOG_LEVEL_SUMMARY
Definition: helics_enums.h:212
@ HELICS_LOG_LEVEL_DEBUG
Definition: helics_enums.h:223
@ HELICS_LOG_LEVEL_WARNING
Definition: helics_enums.h:210
HelicsSequencingModes
Definition: helics_enums.h:425
@ HELICS_SEQUENCING_MODE_FAST
Definition: helics_enums.h:427
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
bool operator!=(const SmallBuffer &sb1, const SmallBuffer &sb2)
Definition: SmallBuffer.hpp:412
IterationResult
Definition: CoreTypes.hpp:93
@ FINISHED
the federation has finished its execution
@ EXECUTING
the federation has entered execution state and it now advancing in time
constexpr Time timeZero
Definition: helicsTime.hpp:31
void cleanupHelicsLibrary()
Definition: Federate.cpp:40
IterationRequest
Definition: CoreTypes.hpp:102
InterfaceType
Definition: CoreTypes.hpp:111
FilterTypes
Definition: Filters.hpp:21
bool operator==(const SmallBuffer &sb1, const SmallBuffer &sb2)
Definition: SmallBuffer.hpp:406
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
Definition: helicsTime.hpp:43