ppap4lmp  0.7.2
pro_value_array.cpp
Go to the documentation of this file.
1 
9 #include <functional>
10 #include <alias/pybind.h>
11 
12 #include "pro_value_array.h"
13 #include "../utils/runtime_error.h"
14 #include "../utils/pyargs_to_vec.h"
15 
16 namespace ut = utils;
17 
18 /* ------------------------------------------------------------------ */
19 
21  const ElPtr &elem)
22 {
23  register_generator(elem);
24 }
25 
26 /* ------------------------------------------------------------------ */
27 
29  const Vec<ElPtr> &elems)
30 {
31  register_generators(elems);
32 }
33 
34 /* ------------------------------------------------------------------ */
35 
37  const int index)
38 {
39  if (selected_keys.empty())
40  {
41  ut::runtime_error("No selected value(s) for ProValueArray");
42  }
43 
44  auto elem = generators[index]->get_element();
45 
46  // NOTE: `id` property is check_required_keys to ensure data is sorted.
47  elem->check_required_keys("id");
48 
49  elem->check_required_keys(selected_keys);
50 
51  auto &map_key_to_row = value_trajectories[index];
52 
53  auto &data = elem->get_data();
54 
55  auto row_length = data.is_array() ? data.size() : 1;
56 
57  for (const auto &key : selected_keys)
58  {
59  map_key_to_row[key].resize(row_length);
60  }
61 
62  int irow = 0;
63 
64  for (const auto &d : data.is_array() ? data : Json::array({data}))
65  {
66  for (const auto &key : selected_keys)
67  {
68  map_key_to_row[key](irow) = d[key].get<double>();
69  }
70 
71  irow++;
72  }
73 }
74 
75 /* ------------------------------------------------------------------ */
76 
78 {
80 }
81 
82 /* ------------------------------------------------------------------ */
83 
85 {
86  auto front_key = selected_keys.front();
87 
88  auto row_length = value_trajectories.front()[front_key].size();
89 
90  for (const auto &trajectory : value_trajectories)
91  {
92  if (row_length != trajectory.at(front_key).size())
93  {
94  ut::runtime_error("Length of trajectories must be the same");
95  }
96  }
97 
98  for (const auto &key : selected_keys)
99  {
100  auto &array = results[key];
101  array.resize(n_generators, row_length);
102 
103  int irow = 0;
104 
105  for (const auto &trajectory : value_trajectories)
106  {
107  array.row(irow++) = trajectory.at(key);
108  }
109  }
110 
111  value_trajectories.clear();
112  value_trajectories.shrink_to_fit();
113 }
114 
115 /* ------------------------------------------------------------------ */
116 
118  const py::args &args)
119 {
121 }
122 
123 /* ------------------------------------------------------------------ */
124 
126 {
127  return results;
128 }
Vec< ShPtr< Generator > > generators
Definition: processor.h:37
ProValueArray(const ElPtr &elem)
Constructor of ProValueArray class for one Element object.
ShPtr< Element > ElPtr
An alias for a shared pointer of Element class.
Definition: element.h:378
virtual void run_impl(const int index) override
Implementation of analysis using an element of generators.
Map< Str, ArrayXXd > results
const Map< Str, ArrayXXd > & get_results()
Get dictionary from keys for property to two-dimensional arrays of values for the property...
Vec< Map< Str, RowArrayXd > > value_trajectories
int n_generators
Definition: processor.h:31
void pyargs_to_vec(const py::args &args, Vec< T > &vec)
Convert a py::args (a variable number arguments) object to a Vec object.
virtual void finish() override
Make results from value_trajectories.
std::vector< T > Vec
Vec is an alias for vector (same as list in Python).
Definition: std.h:27
void register_generator(const ShPtr< GEN > &gen)
Definition: processor.cpp:16
void runtime_error(const Str &msg)
Raise (for Python) and throw (for C++) a runtime error.
This file has a definition of ProValueArray class, which is a subclass of Processor class...
virtual void prepare() override
Resize value_trajectories.
Namespace for utility functions.
Definition: join.h:14
void select(const py::args &args)
Specify string keys for properties. To use this object, at least one key must be specified. Note that new keys overwrite old keys.
Vec< Str > selected_keys
std::unordered_map< T, U > Map
Map is an alias for unordered map (same as dict in Python).
Definition: std.h:38
void register_generators(const Vec< ShPtr< GEN >> &gens)
Definition: processor.cpp:36
This file includes pybind11 and defines an alias for the namespace pybind11.