helics  2.8.1
Player.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 "../application_api/Endpoints.hpp"
10 #include "../application_api/HelicsPrimaryTypes.hpp"
11 #include "../application_api/Publications.hpp"
12 #include "helicsApp.hpp"
13 
14 #include <map>
15 #include <memory>
16 #include <set>
17 #include <string>
18 #include <vector>
19 
20 namespace helics {
21 namespace apps {
22  struct ValueSetter {
23  Time time;
24  int iteration = 0;
25  int index;
26  std::string type;
27  std::string pubName;
28  defV value;
29  };
30 
31  struct MessageHolder {
32  Time sendTime;
33  int index;
34  Message mess;
35  };
36 
42  class HELICS_CXX_EXPORT Player: public App {
43  public:
45  Player() = default;
49  explicit Player(std::vector<std::string> args);
54  Player(int argc, char* argv[]);
59  explicit Player(const std::string& name, const FederateInfo& fi);
65  Player(const std::string& name, const std::shared_ptr<Core>& core, const FederateInfo& fi);
71  Player(const std::string& name, CoreApp& core, const FederateInfo& fi);
77  Player(const std::string& appName, const std::string& configString);
78 
80  Player(Player&& other_player) = default;
82  Player& operator=(Player&& fed) = default;
83 
90  virtual void initialize() override;
91 
95  virtual void runTo(Time stopTime_input) override;
96 
102  void addPublication(const std::string& key,
103  data_type type,
104  const std::string& pubUnits = std::string());
105 
110  template<class valType>
111  typename std::enable_if_t<helicsType<valType>() != data_type::helics_custom>
112  addPublication(const std::string& key, const std::string& pubUnits = std::string())
113  {
114  if (!useLocal) {
115  publications.push_back(
116  Publication(GLOBAL, fed.get(), key, helicsType<valType>(), pubUnits));
117  } else {
118  publications.push_back(
119  Publication(fed.get(), key, helicsType<valType>(), pubUnits));
120  }
121 
122  pubids[key] = static_cast<int>(publications.size()) - 1;
123  }
124 
129  void addEndpoint(const std::string& endpointName,
130  const std::string& endpointType = std::string());
136  template<class valType>
137  void addPoint(Time pubTime, const std::string& key, const valType& val)
138  {
139  points.resize(points.size() + 1);
140  points.back().time = pubTime;
141  points.back().pubName = key;
142  points.back().value = val;
143  }
144 
151  template<class valType>
152  void addPoint(Time pubTime, int iteration, const std::string& key, const valType& val)
153  {
154  points.resize(points.size() + 1);
155  points.back().time = pubTime;
156  points.back().iteration = iteration;
157  points.back().pubName = key;
158  points.back().value = val;
159  }
166  void addMessage(Time sendTime,
167  const std::string& src,
168  const std::string& dest,
169  const std::string& payload);
170 
178  void addMessage(Time sendTime,
179  Time actionTime,
180  const std::string& src,
181  const std::string& dest,
182  const std::string& payload);
183 
185  auto pointCount() const { return points.size(); }
187  auto messageCount() const { return messages.size(); }
189  auto publicationCount() const { return publications.size(); }
191  auto endpointCount() const { return endpoints.size(); }
193  const auto& getPoint(int index) const { return points[index]; }
195  const auto& getMessage(int index) const { return messages[index]; }
196 
197  private:
198  std::unique_ptr<helicsCLI11App> generateParser();
200  void processArgs();
204  virtual void loadJsonFile(const std::string& jsonString) override;
206  virtual void loadTextFile(const std::string& filename) override;
208  void sortTags();
210  void generatePublications();
212  void generateEndpoints();
214  void cleanUpPointList();
215 
217  void sendInformation(Time sendTime, int iteration = 0);
218 
223  helics::Time extractTime(const std::string& str, int lineNumber = 0) const;
224 
225  private:
226  std::vector<ValueSetter> points;
227  std::vector<MessageHolder> messages;
228  std::map<std::string, std::string> tags;
229  std::set<std::string> epts;
230  std::vector<Publication> publications;
231  std::vector<Endpoint> endpoints;
232  std::map<std::string, int> pubids;
233  std::map<std::string, int> eptids;
234  helics::data_type defType =
235  helics::data_type::helics_string;
236  size_t pointIndex = 0;
237  size_t messageIndex = 0;
238  time_units units = time_units::sec;
239  double timeMultiplier =
240  1.0;
241  Time nextPrintTimeStep =
243  };
244 } // namespace apps
245 } // namespace helics
helics::timeZero
constexpr Time timeZero
Definition: helics-time.hpp:31
helics::apps::Player
Definition: Player.hpp:42
helics::apps::MessageHolder
Definition: Player.hpp:31
helics::apps::Player::addMessage
void addMessage(Time sendTime, const std::string &src, const std::string &dest, const std::string &payload)
Definition: Player.cpp:142
helics::apps::Player::getPoint
const auto & getPoint(int index) const
Definition: Player.hpp:193
loadJsonTime
helics::Time loadJsonTime(const Json::Value &timeElement, time_units defaultUnits=time_units::sec)
Definition: JsonProcessingFunctions.cpp:64
helics::apps::Player::Player
Player()=default
helics::apps::Player::getMessage
const auto & getMessage(int index) const
Definition: Player.hpp:195
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helics-time.hpp:27
helics::iteration_request::force_iteration
@ force_iteration
force an iteration whether it is needed or not
helics::apps::ValueSetter
Definition: Player.hpp:22
helics::apps::Player::addPublication
std::enable_if_t< helicsType< valType >) !=data_type::helics_custom > addPublication(const std::string &key, const std::string &pubUnits=std::string())
Definition: Player.hpp:112
helics::apps::App::masterFileName
std::string masterFileName
the name of the master file used to do the construction
Definition: helicsApp.hpp:129
helics::apps::App::loadJsonFileConfiguration
void loadJsonFileConfiguration(const std::string &appName, const std::string &jsonString)
Definition: helicsApp.cpp:159
helics::apps::Player::initialize
virtual void initialize() override
Definition: Player.cpp:618
helics::apps::Player::addPublication
void addPublication(const std::string &key, data_type type, const std::string &pubUnits=std::string())
Definition: Player.cpp:733
helics::FederateInfo
Definition: FederateInfo.hpp:20
loadJson
Json::Value loadJson(const std::string &jsonString)
Definition: JsonProcessingFunctions.cpp:24
helics::Federate::modes::startup
@ startup
when created the federate is in startup state
loadJsonStr
Json::Value loadJsonStr(const std::string &jsonString)
Definition: JsonProcessingFunctions.cpp:50
helics_flag_source_only
@ helics_flag_source_only
Definition: helics_enums.h:92
fed
@ fed
special logging command for message coming from a fed
Definition: loggingHelper.hpp:32
helics::defV
mpark::variant< double, int64_t, std::string, std::complex< double >, std::vector< double >, std::vector< std::complex< double > >, NamedPoint > defV
Definition: HelicsPrimaryTypes.hpp:34
helics::apps::Player::addPoint
void addPoint(Time pubTime, int iteration, const std::string &key, const valType &val)
Definition: Player.hpp:152
helics::apps::Player::endpointCount
auto endpointCount() const
Definition: Player.hpp:191
helics::Publication
Definition: Publications.hpp:23
helics::apps::App::loadTextFile
virtual void loadTextFile(const std::string &textFile)
Definition: helicsApp.cpp:134
helics::apps::Player::addEndpoint
void addEndpoint(const std::string &endpointName, const std::string &endpointType=std::string())
Definition: Player.cpp:752
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::apps::Player::runTo
virtual void runTo(Time stopTime_input) override
Definition: Player.cpp:662
helics::data_type
data_type
Definition: helicsTypes.hpp:275
helics::apps::Player::addPoint
void addPoint(Time pubTime, const std::string &key, const valType &val)
Definition: Player.hpp:137
helics::apps::App::fed
std::shared_ptr< CombinationFederate > fed
the federate created for the Player
Definition: helicsApp.hpp:127
helics::apps::Player::publicationCount
auto publicationCount() const
Definition: Player.hpp:189
helics::apps::App
Definition: helicsApp.hpp:28
helics::getTypeFromString
data_type getTypeFromString(const std::string &typeName)
Definition: helicsTypes.cpp:187
helics::apps::Player::pointCount
auto pointCount() const
Definition: Player.hpp:185
helics::loadTimeFromString
Time loadTimeFromString(const std::string &timeString)
Definition: timeOperations.cpp:19
helics::apps::App::loadFile
void loadFile(const std::string &filename)
Definition: helicsApp.cpp:124
helics::Message
Definition: core-data.hpp:146
helics::Federate::modes::executing
@ executing
entered after the enterExectuationState call has returned
helics::isValidIndex
bool isValidIndex(sizeType testSize, const SizedDataType &vec)
Definition: core-data.hpp:249
helics::apps::Player::messageCount
auto messageCount() const
Definition: Player.hpp:187