helics  2.8.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 "ValueConverter.hpp"
12 #include "data_view.hpp"
13 
14 #include <functional>
15 #include <memory>
16 #include <string>
17 #include <vector>
18 
19 namespace helics {
20 class Publication;
21 class Input;
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& key,
99  const std::string& type,
100  const std::string& units = std::string());
107  template<typename X>
108  Publication& registerPublication(const std::string& key,
109  const std::string& units = std::string())
110  {
111  return registerPublication(key, ValueConverter<X>::type(), units);
112  }
113 
121  Publication& registerGlobalPublication(const std::string& key,
122  const std::string& type,
123  const std::string& units = std::string());
130  template<typename X>
131  Publication& registerGlobalPublication(const std::string& key,
132  const std::string& units = std::string())
133  {
134  return registerGlobalPublication(key, ValueConverter<X>::type(), units);
135  }
136 
145  template<typename X>
146  Publication& registerIndexedPublication(const std::string& key,
147  int index1,
148  const std::string& units = std::string())
149  {
150  return registerGlobalPublication<X>(key + '_' + std::to_string(index1), units);
151  }
161  template<typename X>
162  Publication& registerIndexedPublication(const std::string& key,
163  int index1,
164  int index2,
165  const std::string& units = std::string())
166  {
167  return registerGlobalPublication<X>(key + '_' + std::to_string(index1) + '_' +
168  std::to_string(index2),
169  units);
170  }
171 
180  template<typename X>
181  Publication& registerPublicationIndexed(const std::string& key,
182  int index1,
183  const std::string& units = std::string())
184  {
185  return registerGlobalPublication<X>(key + '_' + std::to_string(index1), units);
186  }
196  template<typename X>
197  Publication& registerPublicationIndexed(const std::string& key,
198  int index1,
199  int index2,
200  const std::string& units = std::string())
201  {
202  return registerGlobalPublication<X>(key + '_' + std::to_string(index1) + '_' +
203  std::to_string(index2),
204  units);
205  }
206 
213  Input& registerInput(const std::string& key,
214  const std::string& type,
215  const std::string& units = std::string());
216 
224  Input& registerGlobalInput(const std::string& key,
225  const std::string& type,
226  const std::string& units = std::string());
229  template<typename X>
230  Input& registerInput(const std::string& key, const std::string& units = std::string())
231  {
232  return registerInput(key, ValueConverter<X>::type(), units);
233  }
236  template<typename X>
237  Input& registerGlobalInput(const std::string& key, const std::string& units = std::string())
238  {
239  return registerGlobalInput(key, ValueConverter<X>::type(), units);
240  }
241 
249  template<typename X>
250  Input& registerIndexedInput(const std::string& key,
251  int index1,
252  const std::string& units = std::string())
253  {
254  return registerGlobalInput<X>(key + '_' + std::to_string(index1), units);
255  }
256 
266  template<typename X>
267  Input& registerIndexedInput(const std::string& key,
268  int index1,
269  int index2,
270  const std::string& units = std::string())
271  {
272  return registerGlobalInput<X>(key + '_' + std::to_string(index1) + '_' +
273  std::to_string(index2),
274  units);
275  }
276 
284  template<typename X>
285  Input& registerInputIndexed(const std::string& key,
286  int index1,
287  const std::string& units = std::string())
288  {
289  return registerGlobalInput<X>(key + '_' + std::to_string(index1), units);
290  }
291 
301  template<typename X>
302  Input& registerInputIndexed(const std::string& key,
303  int index1,
304  int index2,
305  const std::string& units = std::string())
306  {
307  return registerGlobalInput<X>(key + '_' + std::to_string(index1) + '_' +
308  std::to_string(index2),
309  units);
310  }
311 
316  Input& registerSubscription(const std::string& target,
317  const std::string& units = std::string());
318 
325  Input& registerIndexedSubscription(const std::string& target,
326  int index1,
327  const std::string& units = std::string())
328  {
329  return registerSubscription(target + '_' + std::to_string(index1), units);
330  }
331 
339  Input& registerIndexedSubscription(const std::string& target,
340  int index1,
341  int index2,
342  const std::string& units = std::string())
343  {
344  return registerSubscription(target + '_' + std::to_string(index1) + '_' +
345  std::to_string(index2),
346  units);
347  }
348 
355  Input& registerSubscriptionIndexed(const std::string& target,
356  int index1,
357  const std::string& units = std::string())
358  {
359  return registerSubscription(target + '_' + std::to_string(index1), units);
360  }
361 
369  Input& registerSubscriptionIndexed(const std::string& target,
370  int index1,
371  int index2,
372  const std::string& units = std::string())
373  {
374  return registerSubscription(target + '_' + std::to_string(index1) + '_' +
375  std::to_string(index2),
376  units);
377  }
384  void addAlias(const Input& inp, const std::string& shortcutName);
385 
392  void addAlias(const Publication& pub, const std::string& shortcutName);
393 
398  virtual void setFlagOption(int flag, bool flagValue = true) override;
399 
406  void setDefaultValue(const Input& inp, data_view block);
407 
414  virtual void registerInterfaces(const std::string& configString) override;
415 
422  void registerValueInterfaces(const std::string& configString);
423 
424  private:
426  void registerValueInterfacesJson(const std::string& jsonString);
428  void registerValueInterfacesToml(const std::string& tomlString);
429 
430  public:
436  data_view getValueRaw(const Input& inp);
437 
439  static double getDouble(Input& inp);
441  static const std::string& getString(Input& inp);
447  void publishRaw(const Publication& pub, data_view block);
448 
455  void publishRaw(const Publication& pub, const char* data, size_t data_size)
456  {
457  publishRaw(pub, data_view{data, data_size});
458  }
459 
465  static void publish(Publication& pub, const std::string& str);
466 
472  static void publish(Publication& pub, double val);
473 
477  void registerFromPublicationJSON(const std::string& jsonString);
478 
482  void publishJSON(const std::string& jsonString);
483 
488  void addTarget(const Publication& pub, const std::string& target);
493  void addTarget(const Input& inp, const std::string& target);
498  void removeTarget(const Publication& pub, const std::string& target);
503  void removeTarget(const Input& inp, const std::string& target);
504 
512  template<class iType>
513  void addIndexedTarget(const iType& iObject, const std::string& target, int index1)
514  {
515  addTarget(iObject, target + '_' + std::to_string(index1));
516  }
517 
525  template<class iType>
526  void addIndexedTarget(const iType& iObject, const std::string& target, int index1, int index2)
527  {
528  addTarget(iObject, target + '_' + std::to_string(index1) + '_' + std::to_string(index2));
529  }
530 
533  bool isUpdated(const Input& inp) const;
535  Time getLastUpdateTime(const Input& inp) const;
536 
537  virtual void disconnect() override;
540  void clearUpdates();
543  void clearUpdate(const Input& inp);
544 
545  protected:
546  virtual void updateTime(Time newTime, Time oldTime) override;
547  virtual void startupToInitializeStateTransition() override;
548  virtual void initializeToExecuteStateTransition(iteration_result result) override;
549  virtual std::string localQuery(const std::string& queryStr) const override;
550 
551  public:
555  std::vector<int> queryUpdates();
556 
559  const std::string& getTarget(const Input& inp) const;
563  const Input& getInput(const std::string& key) const;
567  Input& getInput(const std::string& key);
571  const Input& getInput(int index) const;
575  Input& getInput(int index);
579  const Input& getInput(const std::string& key, int index1) const;
583  const Input& getInput(const std::string& key, int index1, int index2) const;
584 
588  const Input& getSubscription(const std::string& target) const;
589 
594  Input& getSubscription(const std::string& target);
595 
600  Publication& getPublication(const std::string& key);
605  const Publication& getPublication(const std::string& key) const;
610  Publication& getPublication(int index);
614  const Publication& getPublication(int index) const;
615 
620  const Publication& getPublication(const std::string& key, int index1) const;
626  const Publication& getPublication(const std::string& key, int index1, int index2) const;
627 
632  void setInputNotificationCallback(std::function<void(Input&, Time)> callback);
637  void setInputNotificationCallback(Input& inp, std::function<void(Input&, Time)> callback);
638 
640  int getPublicationCount() const;
642  int getInputCount() const;
643 
644  private:
646  std::unique_ptr<ValueFederateManager> vfManager;
647 };
648 
649 } // namespace helics
helics::Input
Definition: Inputs.hpp:37
data
@ data
print timing+data transmissions
Definition: loggingHelper.hpp:30
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:526
helics::ValueFederate::registerInputIndexed
Input & registerInputIndexed(const std::string &key, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:285
helics::ValueFederate::registerInput
Input & registerInput(const std::string &key, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:230
helics::ValueFederate::registerSubscriptionIndexed
Input & registerSubscriptionIndexed(const std::string &target, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:369
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(const std::string &key, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:267
helics::ValueFederate::registerSubscriptionIndexed
Input & registerSubscriptionIndexed(const std::string &target, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:355
helics::iteration_result
iteration_result
Definition: core-types.hpp:81
helics::ValueConverter
Definition: ValueConverter.hpp:26
helics::ValueFederate::registerPublicationIndexed
Publication & registerPublicationIndexed(const std::string &key, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:181
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helics-time.hpp:27
helics::data_view
Definition: data_view.hpp:22
helics::ValueFederate::registerGlobalPublication
Publication & registerGlobalPublication(const std::string &key, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:131
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(const std::string &target, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:325
helics::CoreApp
Definition: application_api/CoreApp.hpp:25
helics::ValueFederate::registerGlobalInput
Input & registerGlobalInput(const std::string &key, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:237
helics::ValueFederate::registerPublication
Publication & registerPublication(const std::string &key, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:108
helics::FederateInfo
Definition: FederateInfo.hpp:20
fed
@ fed
special logging command for message coming from a fed
Definition: loggingHelper.hpp:32
helics::ValueFederate::registerPublicationIndexed
Publication & registerPublicationIndexed(const std::string &key, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:197
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(const std::string &key, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:162
helics::ValueFederate::registerIndexedInput
Input & registerIndexedInput(const std::string &key, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:250
helics::Publication
Definition: Publications.hpp:23
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::ValueFederate::registerInputIndexed
Input & registerInputIndexed(const std::string &key, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:302
helics::ValueFederate::registerIndexedSubscription
Input & registerIndexedSubscription(const std::string &target, int index1, int index2, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:339
helics::Federate
Definition: application_api/Federate.hpp:44
helics::publish
void publish(ValueFederate &fed, const std::string &pubKey, Us... pargs)
Definition: Publications.hpp:491
helics::ValueFederate::registerIndexedPublication
Publication & registerIndexedPublication(const std::string &key, int index1, const std::string &units=std::string())
Definition: application_api/ValueFederate.hpp:146
helics::ValueFederate::addIndexedTarget
void addIndexedTarget(const iType &iObject, const std::string &target, int index1)
Definition: application_api/ValueFederate.hpp:513
ValueConverter.hpp
helics::ValueFederate::publishRaw
void publishRaw(const Publication &pub, const char *data, size_t data_size)
Definition: application_api/ValueFederate.hpp:455