28 std::vector<std::string> get_names()
const
30 std::vector<std::string> names;
31 for (
const auto& itr : m_data) {
32 names.push_back(itr.first);
37 size_t get_size()
const {
return m_data.size(); }
39 bool has(
const std::string& name)
const {
return m_data.find(name) != m_data.end(); }
41 void add(
const std::string& name)
43 m_data.emplace(name, std::make_unique<IndexedAttribute>());
46 template <
typename ValueDerived,
typename IndexDerived>
47 void add(
const std::string& name, ValueDerived&& values, IndexDerived&& indices)
49 auto attr = std::make_unique<IndexedAttribute>(
50 std::forward<ValueDerived>(values),
51 std::forward<IndexDerived>(indices));
52 m_data.emplace(name, std::move(attr));
55 template <
typename ValueDerived,
typename IndexDerived>
56 void set(
const std::string& name, ValueDerived&& values, IndexDerived&& indices)
58 auto itr = m_data.find(name);
59 la_runtime_assert(itr != m_data.end(),
"Indexed attribute " + name +
" does not exist.");
60 if (itr->second ==
nullptr) {
61 itr->second = std::make_unique<IndexedAttribute>(
62 std::forward<ValueDerived>(values),
63 std::forward<IndexDerived>(indices));
65 itr->second->set_values(std::forward<ValueDerived>(values));
66 itr->second->set_indices(std::forward<IndexDerived>(indices));
72 auto itr = m_data.find(name);
73 la_runtime_assert(itr != m_data.end(),
"Indexed attribute " + name +
" does not exist.");
74 return itr->second.get();
79 auto itr = m_data.find(name);
80 la_runtime_assert(itr != m_data.end(),
"Indexed attribute " + name +
" does not exist.");
81 return itr->second.get();
84 template <
typename Derived>
85 decltype(
auto) get_values(
const std::string& name)
89 return ptr->get_values<Derived>();
92 template <
typename Derived>
93 decltype(
auto) get_values(
const std::string& name)
const
95 const auto ptr = get(name);
97 return ptr->get_values<Derived>();
100 template <
typename Derived>
101 decltype(
auto) get_indices(
const std::string& name)
103 auto ptr = get(name);
105 return ptr->get_indices<Derived>();
108 template <
typename Derived>
109 decltype(
auto) get_indices(
const std::string& name)
const
111 const auto ptr = get(name);
113 return ptr->get_indices<Derived>();
116 template <
typename Derived>
117 decltype(
auto) view_values(
const std::string& name)
119 auto ptr = get(name);
121 return ptr->view_values<Derived>();
124 template <
typename Derived>
125 decltype(
auto) view_values(
const std::string& name)
const
127 const auto ptr = get(name);
129 return ptr->view_values<Derived>();
132 template <
typename Derived>
133 decltype(
auto) view_indices(
const std::string& name)
135 auto ptr = get(name);
137 return ptr->view_indices<Derived>();
140 template <
typename Derived>
141 decltype(
auto) view_indices(
const std::string& name)
const
143 const auto ptr = get(name);
145 return ptr->view_indices<Derived>();
148 template <
typename ValueDerived,
typename IndexDerived>
149 void import_data(
const std::string& name, ValueDerived&& values, IndexDerived&& indices)
151 set(name, std::move(values.derived()), std::move(indices.derived()));
154 template <
typename ValueDerived,
typename IndexDerived>
156 const std::string& name,
157 Eigen::PlainObjectBase<ValueDerived>& values,
158 Eigen::PlainObjectBase<IndexDerived>& indices)
160 auto attr = get(name);
162 auto value_array = attr->get_values();
163 auto index_array = attr->get_indices();
168 bool validate =
true;
170 void* index_ptr = index_array->data();
173 ValueDerived& value_matrix = value_array->template get<ValueDerived>();
174 IndexDerived& index_matrix = index_array->template get<IndexDerived>();
175 values.swap(value_matrix);
176 indices.swap(index_matrix);
177 }
catch (std::runtime_error& e) {
180 logger().warn(
"Export cannot be done without coping: {}", e.what());
181 values = value_array->view<ValueDerived>();
182 indices = index_array->view<IndexDerived>();
191 la_runtime_assert(index_ptr == indices.data(),
"Export indices fall back to copying.");
196 void remove(
const std::string& name)
198 auto itr = m_data.find(name);
199 la_runtime_assert(itr != m_data.end(),
"Attribute " + name +
" does not exist.");
203 template <
typename Archive>
204 void serialize_impl(Archive& ar)
208 ar.object([&](
auto& ar) { ar(
"data", DATA) & m_data; });
209 LA_IGNORE_SHADOW_WARNING_END
213 std::map<std::string, std::unique_ptr<IndexedAttribute>> m_data;