helics  3.0.1
application_api/ValueFederate.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 "../core/core-data.hpp"
10 #include "Federate.hpp"
11 #include "Inputs.hpp"
12 #include "Publications.hpp"
13 #include "ValueConverter.hpp"
14 #include "data_view.hpp"
15 
16 #include <functional>
17 #include <memory>
18 #include <string>
19 #include <vector>
20 
21 namespace helics {
23 class ValueFederateManager;
25 class HELICS_CXX_EXPORT ValueFederate:
26  public virtual Federate // using virtual inheritance to allow combination federate
27 {
28  public:
34  ValueFederate(const std::string& fedName, const FederateInfo& fi);
35 
43  ValueFederate(const std::string& fedName,
44  const std::shared_ptr<Core>& core,
45  const FederateInfo& fi = FederateInfo{});
46 
52  ValueFederate(const std::string& fedName,
53  CoreApp& core,
54  const FederateInfo& fi = FederateInfo{});
55 
60  explicit ValueFederate(const std::string& configString);
61 
67  ValueFederate(const std::string& fedName, const std::string& configString);
68 
70  explicit ValueFederate();
71 
74  explicit ValueFederate(bool res);
75 
78  explicit ValueFederate(const char* configString);
79 
81  ValueFederate(const ValueFederate& fed) = delete;
83  ValueFederate(ValueFederate&& fed) noexcept;
85  virtual ~ValueFederate();
86 
88  ValueFederate& operator=(ValueFederate&& fed) noexcept;
90  ValueFederate& operator=(const ValueFederate& fed) = delete;
98  Publication& registerPublication(const std::string& name,
99  const std::string& type,
100  const std::string& units = std::string());
107  template<typename X>
108  Publication& registerPublication(const std::string& name,
109  const std::string& units = std::string())
110  {
111  return registerPublication(name, ValueConverter<X>::type(), units);
112  }
113 
121  Publication& registerGlobalPublication(const std::string& name,
122  const std::string& type,
123  const std::string& units = std::string());
130  template<typename X>
131  Publication& registerGlobalPublication(const std::string& name,
132  const std::string& units = std::string())
133  {
134  return registerGlobalPublication(name, ValueConverter<X>::type(), units);
135  }
136 
145  template<typename X>
146  Publication& registerIndexedPublication(const std::string& name,
147  int index1,
148  const std::string& units = std::string())
149  {
150  return registerGlobalPublication<X>(name + '_' + std::to_string(index1), units);
151  }
161  template<typename X>
162  Publication& registerIndexedPublication(const std::string& name,
163  int index1,
164  int index2,
165  const std::string& units = std::string())
166  {
167  return registerGlobalPublication<X>(name + '_' + std::to_string(index1) + '_' +
168  std::to_string(index2),
169  units);
170  }
171 
178  Input& registerInput(const std::string& name,
179  const std::string& type,
180  const std::string& units = std::string());
181 
189  Input& registerGlobalInput(const std::string& name,
190  const std::string& type,
191  const std::string& units = std::string());
194  template<typename X>
195  Input& registerInput(const std::string& name, const std::string& units = std::string())
196  {
197  return registerInput(name, ValueConverter<X>::type(), units);
198  }
201  template<typename X>
202  Input& registerGlobalInput(const std::string& name, const std::string& units = std::string())
203  {
204  return registerGlobalInput(name, ValueConverter<X>::type(), units);
205  }
206 
214  template<typename X>
215  Input& registerIndexedInput(const std::string& name,
216  int index1,
217  const std::string& units = std::string())
218  {
219  return registerGlobalInput<X>(name + '_' + std::to_string(index1), units);
220  }
221 
231  template<typename X>
232  Input& registerIndexedInput(const std::string& name,
233  int index1,
234  int index2,
235  const std::string& units = std::string())
236  {
237  return registerGlobalInput<X>(name + '_' + std::to_string(index1) + '_' +
238  std::to_string(index2),
239  units);
240  }
241 
246  Input& registerSubscription(const std::string& target,
247  const std::string& units = std::string());
248 
255  Input& registerIndexedSubscription(const std::string& target,
256  int index1,
257  const std::string& units = std::string())
258  {
259  return registerSubscription(target + '_' + std::to_string(index1), units);
260  }
261 
269  Input& registerIndexedSubscription(const std::string& target,
270  int index1,
271  int index2,
272  const std::string& units = std::string())
273  {
274  return registerSubscription(target + '_' + std::to_string(index1) + '_' +
275  std::to_string(index2),
276  units);
277  }
278 
285  void addAlias(const Input& inp, const std::string& shortcutName);
286 
293  void addAlias(const Publication& pub, const std::string& shortcutName);
294 
295  virtual void setFlagOption(int flag, bool flagValue = true) override;
296 
303  void setDefaultValue(const Input& inp, data_view block);
304 
311  virtual void registerInterfaces(const std::string& configString) override;
312 
319  void registerValueInterfaces(const std::string& configString);
320 
321  private:
323  void registerValueInterfacesJson(const std::string& jsonString);
325  void registerValueInterfacesToml(const std::string& tomlString);
326 
327  public:
333  data_view getBytes(const Input& inp);
334 
340  bool forceCoreUpdate(Input& inp);
341 
347  void publishBytes(const Publication& pub, data_view block);
348 
355  void publishBytes(const Publication& pub, const char* data, size_t data_size)
356  {
357  publishBytes(pub, data_view{data, data_size});
358  }
359 
363  void registerFromPublicationJSON(const std::string& jsonString);
364 
368  void publishJSON(const std::string& jsonString);
369 
374  void addTarget(const Publication& pub, const std::string& target);
379  void addTarget(const Input& inp, const std::string& target);
384  void removeTarget(const Publication& pub, const std::string& target);
389  void removeTarget(const Input& inp, const std::string& target);
390 
398  template<class iType>
399  void addIndexedTarget(const iType& iObject, const std::string& target, int index1)
400  {
401  addTarget(iObject, target + '_' + std::to_string(index1));
402  }
403 
411  template<class iType>
412  void addIndexedTarget(const iType& iObject, const std::string& target, int index1, int index2)
413  {
414  addTarget(iObject, target + '_' + std::to_string(index1) + '_' + std::to_string(index2));
415  }
416 
419  bool isUpdated(const Input& inp) const;
421  Time getLastUpdateTime(const Input& inp) const;
422 
423  virtual void disconnect() override;
426  void clearUpdates();
429  void clearUpdate(const Input& inp);
430 
431  protected:
432  virtual void updateTime(Time newTime, Time oldTime) override;
433  virtual void startupToInitializeStateTransition() override;
434  virtual void initializeToExecuteStateTransition(IterationResult result) override;
435  virtual std::string localQuery(const std::string& queryStr) const override;
436 
437  public:
441  std::vector<int> queryUpdates();
442 
445  const std::string& getTarget(const Input& inp) const;
449  const Input& getInput(const std::string& name) const;
453  Input& getInput(const std::string& name);
457  const Input& getInput(int index) const;
461  Input& getInput(int index);
465  const Input& getInput(const std::string& name, int index1) const;
469  const Input& getInput(const std::string& name, int index1, int index2) const;
470 
474  const Input& getSubscription(const std::string& target) const;
475 
480  Input& getSubscription(const std::string& target);
481 
486  Publication& getPublication(const std::string& name);
491  const Publication& getPublication(const std::string& name) const;
496  Publication& getPublication(int index);
500  const Publication& getPublication(int index) const;
501 
506  const Publication& getPublication(const std::string& name, int index1) const;
512  const Publication& getPublication(const std::string& name, int index1, int index2) const;
513 
518  void setInputNotificationCallback(std::function<void(Input&, Time)> callback);
523  void setInputNotificationCallback(Input& inp, std::function<void(Input&, Time)> callback);
524 
526  int getPublicationCount() const;
528  int getInputCount() const;
529 
530  private:
532  std::unique_ptr<ValueFederateManager> vfManager;
533 };
534 
543 template<class... Us>
544 void publish(ValueFederate& fed, const std::string& pubName, Us... pargs)
545 {
546  fed.getPublication(pubName).publish(pargs...);
547 }
548 
549 } // namespace helics
helics::Input
Definition: Inputs.hpp:38
helics::ValueFederate::getPublication
Publication & getPublication(const std::string &name)
Definition: ValueFederate.cpp:576
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(const std::string &name, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:146
helics::ValueFederate
Definition: application_api/ValueFederate.hpp:25
helics::ValueFederate::addIndexedTarget
void addIndexedTarget(const iType &iObject, const std::string &target, int index1, int index2)
Definition: application_api/ValueFederate.hpp:412
helics::ValueConverter
Definition: ValueConverter.hpp:98
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
helics::data_view
Definition: data_view.hpp:22
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(const std::string &target, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:255
helics::CoreApp
Definition: application_api/CoreApp.hpp:25
helics::FederateInfo
Definition: FederateInfo.hpp:20
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(const std::string &name, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:162
helics::ValueFederate::registerInput
Input & registerInput(const std::string &name, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:195
helics::IterationResult
IterationResult
Definition: CoreTypes.hpp:80
helics::ValueFederate::registerGlobalInput
Input & registerGlobalInput(const std::string &name, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:202
helics::Publication
Definition: Publications.hpp:24
helics::publish
void publish(ValueFederate &fed, const std::string &pubName, Us... pargs)
Definition: application_api/ValueFederate.hpp:544
helics::Publication::publish
void publish(double val)
Definition: Publications.cpp:71
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(const std::string &target, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:269
helics::Federate
Definition: application_api/Federate.hpp:47
helics::ValueFederate::addIndexedTarget
void addIndexedTarget(const iType &iObject, const std::string &target, int index1)
Definition: application_api/ValueFederate.hpp:399
helics::ValueFederate::publishBytes
void publishBytes(const Publication &pub, const char *data, size_t data_size)
Definition: application_api/ValueFederate.hpp:355
ValueConverter.hpp
helics::ValueFederate::registerGlobalPublication
Publication & registerGlobalPublication(const std::string &name, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:131
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(const std::string &name, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:232
helics::ValueFederate::registerPublication
Publication & registerPublication(const std::string &name, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:108
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(const std::string &name, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:215