ZIO
Python and C++ interface to ZeroMQ and Zyre
tens.cpp
Go to the documentation of this file.
1 #include "zio/tens.hpp"
2 #include <complex>
3 #include <typeinfo>
4 
5 // stolen from cnpy
6 const char* zio::tens::type_name(const std::type_info& t)
7 {
8  if(t == typeid(float) ) return "f";
9  if(t == typeid(double) ) return "f";
10  if(t == typeid(long double) ) return "f";
11 
12  if(t == typeid(int) ) return "i";
13  if(t == typeid(char) ) return "i";
14  if(t == typeid(short) ) return "i";
15  if(t == typeid(long) ) return "i";
16  if(t == typeid(long long) ) return "i";
17 
18  if(t == typeid(unsigned char) ) return "u";
19  if(t == typeid(unsigned short) ) return "u";
20  if(t == typeid(unsigned long) ) return "u";
21  if(t == typeid(unsigned long long) ) return "u";
22  if(t == typeid(unsigned int) ) return "u";
23 
24  if(t == typeid(bool) ) return "b";
25 
26  if(t == typeid(std::complex<float>) ) return "c";
27  if(t == typeid(std::complex<double>) ) return "c";
28  if(t == typeid(std::complex<long double>) ) return "c";
29 
30  else return "?";
31 }
32 
33 
35  const std::vector<size_t>& shape,
36  size_t word_size, const char* tn)
37 {
39  zio::json lobj = zio::json::value_t::object;
40  std::string label = msg.label();
41  if (! label.empty()) {
42  lobj = zio::json::parse(label);
43  }
44  zio::json md = {
45  {"shape", shape},
46  {"word", word_size},
47  {"dtype", tn},
48  {"part", msg.payload().size()}
49  // no order as this is C++
50  };
51  lobj[zio::tens::form]["tensors"].push_back(md);
52  msg.set_label_object(lobj);
53  msg.add(std::move(data));
54 }
55 
56 const zio::message_t& zio::tens::at(const Message& msg, size_t index)
57 {
58  static const zio::message_t bogus;
59 
60  auto lobj = msg.label_object();
61  auto ta = lobj[zio::tens::form];
62  auto md = ta["tensors"][index];
63 
64  if (md.is_null()) {
65  return bogus;
66  }
67  size_t part = index;
68  if (md["part"].is_number()) {
69  part = md["part"].get<size_t>();
70  }
71  if (part < 0 or part >= msg.payload().size()) {
72  return bogus;
73  }
74  return msg.payload()[part];
75 }
std::string label() const
Definition: message.cpp:102
const zio::message_t & at(const Message &msg, size_t index)
Definition: tens.hpp:58
const char * form
Definition: tens.hpp:15
zio::json label_object() const
Helper, when label holds a JSON object.
Definition: message.cpp:80
void add(message_t &&spmsg)
Definition: message.hpp:112
void set_form(const std::string &form)
Definition: message.cpp:93
const multipart_t & payload() const
Access payload(s)
Definition: message.hpp:110
int get(int property_)
Definition: zmq.hpp:517
void append(Message &msg, message_t &&data, const std::vector< size_t > &shape, size_t word_size, const char *tn)
Definition: tens.cpp:34
def parse(rule_object, params)
Definition: rules.py:11
a ZIO message
Definition: message.hpp:59
const char * type_name(const std::type_info &t)
Definition: tens.cpp:6
void set_label_object(const zio::json &lobj)
Definition: message.cpp:84
nlohmann::json json
Definition: interned.hpp:9