helics  3.3.0
application_api/ValueFederate.hpp
1 /*
2 Copyright (c) 2017-2022,
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 <string_view>
20 #include <vector>
21 
22 namespace helics {
24 class ValueFederateManager;
26 class HELICS_CXX_EXPORT ValueFederate:
27  public virtual Federate // using virtual inheritance to allow combination federate
28 {
29  public:
35  ValueFederate(std::string_view fedName, const FederateInfo& fi);
36 
44  ValueFederate(std::string_view fedName,
45  const std::shared_ptr<Core>& core,
46  const FederateInfo& fi = FederateInfo{});
47 
53  ValueFederate(std::string_view fedName, CoreApp& core, const FederateInfo& fi = FederateInfo{});
54 
59  explicit ValueFederate(const std::string& configString);
60 
66  ValueFederate(std::string_view fedName, const std::string& configString);
67 
69  explicit ValueFederate();
70 
73  explicit ValueFederate(bool res);
74 
77  explicit ValueFederate(const char* configString);
78 
80  ValueFederate(const ValueFederate& fed) = delete;
82  ValueFederate(ValueFederate&& fed) noexcept;
84  virtual ~ValueFederate();
85 
87  ValueFederate& operator=(ValueFederate&& fed) noexcept;
89  ValueFederate& operator=(const ValueFederate& fed) = delete;
97  Publication& registerPublication(std::string_view name,
98  std::string_view type,
99  std::string_view units = std::string_view{});
106  template<typename X>
107  Publication& registerPublication(std::string_view name,
108  std::string_view units = std::string_view{})
109  {
110  return registerPublication(name, ValueConverter<X>::type(), units);
111  }
112 
120  Publication& registerGlobalPublication(std::string_view name,
121  std::string_view type,
122  std::string_view units = std::string_view{});
129  template<typename X>
130  Publication& registerGlobalPublication(std::string_view name,
131  std::string_view units = std::string_view{})
132  {
133  return registerGlobalPublication(name, ValueConverter<X>::type(), units);
134  }
135 
144  template<typename X>
145  Publication& registerIndexedPublication(std::string_view name,
146  int index1,
147  std::string_view units = std::string_view{})
148  {
149  return registerGlobalPublication<X>(std::string(name) + '_' + std::to_string(index1),
150  units);
151  }
161  template<typename X>
162  Publication& registerIndexedPublication(std::string_view name,
163  int index1,
164  int index2,
165  std::string_view units = std::string_view{})
166  {
167  return registerGlobalPublication<X>(std::string(name) + '_' + std::to_string(index1) + '_' +
168  std::to_string(index2),
169  units);
170  }
171 
178  Input& registerInput(std::string_view name,
179  std::string_view type,
180  std::string_view units = std::string_view{});
181 
189  Input& registerGlobalInput(std::string_view name,
190  std::string_view type,
191  std::string_view units = std::string_view{});
194  template<typename X>
195  Input& registerInput(std::string_view name, std::string_view units = std::string_view{})
196  {
197  return registerInput(name, ValueConverter<X>::type(), units);
198  }
201  template<typename X>
202  Input& registerGlobalInput(std::string_view name, std::string_view units = std::string_view{})
203  {
204  return registerGlobalInput(name, ValueConverter<X>::type(), units);
205  }
206 
214  template<typename X>
215  Input& registerIndexedInput(std::string_view name,
216  int index1,
217  std::string_view units = std::string_view())
218  {
219  return registerGlobalInput<X>(std::string(name) + '_' + std::to_string(index1), units);
220  }
221 
231  template<typename X>
232  Input& registerIndexedInput(std::string_view name,
233  int index1,
234  int index2,
235  std::string_view units = std::string_view())
236  {
237  return registerGlobalInput<X>(std::string(name) + '_' + std::to_string(index1) + '_' +
238  std::to_string(index2),
239  units);
240  }
241 
246  Input& registerSubscription(std::string_view target,
247  std::string_view units = std::string_view{});
248 
255  Input& registerIndexedSubscription(std::string_view target,
256  int index1,
257  std::string_view units = std::string_view{})
258  {
259  return registerSubscription(std::string(target) + '_' + std::to_string(index1), units);
260  }
261 
269  Input& registerIndexedSubscription(std::string_view target,
270  int index1,
271  int index2,
272  std::string_view units = std::string_view{})
273  {
274  return registerSubscription(std::string(target) + '_' + std::to_string(index1) + '_' +
275  std::to_string(index2),
276  units);
277  }
278 
279  using Federate::addAlias;
286  void addAlias(const Input& inp, std::string_view shortcutName);
287 
294  void addAlias(const Publication& pub, std::string_view shortcutName);
295 
296  virtual void setFlagOption(int flag, bool flagValue = true) override;
297 
304  void setDefaultValue(const Input& inp, data_view block);
305 
312  virtual void registerInterfaces(const std::string& configString) override;
313 
320  void registerValueInterfaces(const std::string& configString);
321 
322  private:
324  void registerValueInterfacesJson(const std::string& jsonString);
326  void registerValueInterfacesToml(const std::string& tomlString);
327 
328  public:
334  data_view getBytes(const Input& inp);
335 
341  bool forceCoreUpdate(Input& inp);
342 
348  void publishBytes(const Publication& pub, data_view block);
349 
356  void publishBytes(const Publication& pub, const char* data, size_t data_size)
357  {
358  publishBytes(pub, data_view{data, data_size});
359  }
360 
364  void registerFromPublicationJSON(const std::string& jsonString);
365 
369  void publishJSON(const std::string& jsonString);
370 
375  void addTarget(const Publication& pub, std::string_view target);
380  void addTarget(const Input& inp, std::string_view target);
385  void removeTarget(const Publication& pub, std::string_view target);
390  void removeTarget(const Input& inp, std::string_view target);
391 
399  template<class iType>
400  void addIndexedTarget(const iType& iObject, std::string_view target, int index1)
401  {
402  addTarget(iObject, std::string(target) + '_' + std::to_string(index1));
403  }
404 
412  template<class iType>
413  void addIndexedTarget(const iType& iObject, std::string_view target, int index1, int index2)
414  {
415  addTarget(iObject,
416  std::string(target) + '_' + std::to_string(index1) + '_' +
417  std::to_string(index2));
418  }
419 
422  bool isUpdated(const Input& inp) const;
424  Time getLastUpdateTime(const Input& inp) const;
425 
426  virtual void disconnect() override;
429  void clearUpdates();
432  void clearUpdate(const Input& inp);
433 
434  protected:
435  virtual void updateTime(Time newTime, Time oldTime) override;
436  virtual void startupToInitializeStateTransition() override;
437  virtual void initializeToExecuteStateTransition(IterationResult result) override;
438  virtual std::string localQuery(std::string_view queryStr) const override;
439 
440  public:
444  std::vector<int> queryUpdates();
445 
448  const std::string& getTarget(const Input& inp) const;
452  const Input& getInput(std::string_view name) const;
456  Input& getInput(std::string_view name);
460  const Input& getInput(int index) const;
464  Input& getInput(int index);
468  const Input& getInput(std::string_view name, int index1) const;
472  const Input& getInput(std::string_view name, int index1, int index2) const;
473 
477  const Input& getSubscription(std::string_view target) const;
478 
483  Input& getSubscription(std::string_view target);
484 
489  Publication& getPublication(std::string_view name);
494  const Publication& getPublication(std::string_view name) const;
499  Publication& getPublication(int index);
503  const Publication& getPublication(int index) const;
504 
509  const Publication& getPublication(std::string_view name, int index1) const;
515  const Publication& getPublication(std::string_view name, int index1, int index2) const;
516 
521  void setInputNotificationCallback(std::function<void(Input&, Time)> callback);
526  void setInputNotificationCallback(Input& inp, std::function<void(Input&, Time)> callback);
527 
529  int getPublicationCount() const;
531  int getInputCount() const;
532 
533  private:
535  std::unique_ptr<ValueFederateManager> vfManager;
536 };
537 
546 template<class... Us>
547 void publish(ValueFederate& fed, std::string_view pubName, Us... pargs)
548 {
549  fed.getPublication(pubName).publish(pargs...);
550 }
551 
552 } // namespace helics
helics::Input
Definition: Inputs.hpp:38
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(std::string_view name, int index1, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:145
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(std::string_view name, int index1, int index2, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:162
helics::ValueFederate
Definition: application_api/ValueFederate.hpp:26
helics::ValueFederate::registerGlobalPublication
Publication & registerGlobalPublication(std::string_view name, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:130
helics::ValueConverter
Definition: ValueConverter.hpp:113
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
helics::data_view
Definition: data_view.hpp:22
helics::ValueFederate::addIndexedTarget
void addIndexedTarget(const iType &iObject, std::string_view target, int index1, int index2)
Definition: application_api/ValueFederate.hpp:413
helics::Federate::addAlias
void addAlias(std::string_view interfaceName, std::string_view alias)
Definition: Federate.cpp:1415
helics::ValueFederate::getPublication
Publication & getPublication(std::string_view name)
Definition: ValueFederate.cpp:589
helics::CoreApp
Definition: application_api/CoreApp.hpp:25
helics::FederateInfo
Definition: FederateInfo.hpp:24
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(std::string_view target, int index1, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:255
helics::IterationResult
IterationResult
Definition: CoreTypes.hpp:83
helics::ValueFederate::addIndexedTarget
void addIndexedTarget(const iType &iObject, std::string_view target, int index1)
Definition: application_api/ValueFederate.hpp:400
helics::Publication
Definition: Publications.hpp:25
helics::ValueFederate::registerPublication
Publication & registerPublication(std::string_view name, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:107
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::registerInput
Input & registerInput(std::string_view name, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:195
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(std::string_view name, int index1, std::string_view units=std::string_view())
Definition: application_api/ValueFederate.hpp:215
helics::Federate
Definition: application_api/Federate.hpp:48
helics::ValueFederate::registerGlobalInput
Input & registerGlobalInput(std::string_view name, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:202
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(std::string_view name, int index1, int index2, std::string_view units=std::string_view())
Definition: application_api/ValueFederate.hpp:232
helics::ValueFederate::publishBytes
void publishBytes(const Publication &pub, const char *data, size_t data_size)
Definition: application_api/ValueFederate.hpp:356
ValueConverter.hpp
helics::publish
void publish(ValueFederate &fed, std::string_view pubName, Us... pargs)
Definition: application_api/ValueFederate.hpp:547
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(std::string_view target, int index1, int index2, std::string_view units=std::string_view{})
Definition: application_api/ValueFederate.hpp:269