10#include <similie/tensor/tensor_impl.hpp>
17template <tensor::TensorIndex HeadTensorIndex, tensor::TensorNatIndex... TailTensorIndex>
21 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...> m_domain;
22 std::vector<std::size_t> m_coalesc_idx;
23 std::array<std::vector<std::size_t>,
sizeof...(TailTensorIndex)> m_idx;
24 std::vector<double> m_values;
36 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain,
38 std::array<std::vector<std::size_t>,
sizeof...(TailTensorIndex)>
idx,
39 std::vector<double>
values)
47 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain()
57 std::array<std::vector<std::size_t>,
sizeof...(TailTensorIndex)>
idx()
70 ddc::DiscreteDomain<TailTensorIndex...>,
72 Kokkos::DefaultHostExecutionSpace::memory_space> dense)
74 m_coalesc_idx.push_back(m_coalesc_idx.back());
75 ddc::for_each(dense.domain(), [&](ddc::DiscreteElement<TailTensorIndex...> elem) {
76 if (dense(elem) != 0) {
77 m_coalesc_idx.back() += 1;
78 (m_idx[ddc::type_seq_rank_v<
80 ddc::detail::TypeSeq<TailTensorIndex...>>]
81 .push_back(elem.template uid<TailTensorIndex>()),
83 m_values.push_back(dense(elem));
90 ddc::DiscreteElement<HeadTensorIndex>
id)
const
92 const std::size_t id_begin = m_coalesc_idx[
id.uid()];
93 const std::size_t id_end = m_coalesc_idx[
id.uid() + 1];
94 std::vector<std::size_t> new_coalesc_idx {0, id_end - id_begin};
95 std::array<std::vector<std::size_t>,
sizeof...(TailTensorIndex)> new_idx;
96 ((new_idx[ddc::type_seq_rank_v<TailTensorIndex, ddc::detail::TypeSeq<TailTensorIndex...>>]
97 = std::vector<std::size_t>(
98 m_idx[ddc::type_seq_rank_v<
100 ddc::detail::TypeSeq<TailTensorIndex...>>]
103 m_idx[ddc::type_seq_rank_v<
105 ddc::detail::TypeSeq<TailTensorIndex...>>]
107 + id_begin + id_end)),
110 new_values(m_values.begin() + id_begin, m_values.begin() + id_begin + id_end);
112 return CsrDynamic<HeadTensorIndex, TailTensorIndex...>(
113 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>(m_domain),
122 .write(
reinterpret_cast<const char*
>(coalesc_idx().data()),
123 coalesc_idx().size() *
sizeof(std::size_t));
125 for (std::size_t i = 0; i <
sizeof...(TailTensorIndex); ++i) {
127 .write(
reinterpret_cast<const char*
>(idx()[i].data()),
128 idx()[i].size() *
sizeof(std::size_t));
132 .write(
reinterpret_cast<const char*
>(values().data()),
133 m_values.size() *
sizeof(
double));
142 ddc::DiscreteDomain<HeadId, TailId...>,
143 Kokkos::layout_right,
144 Kokkos::DefaultHostExecutionSpace::memory_space>
148 ddc::DiscreteDomain<HeadId, TailId...>,
149 Kokkos::layout_right,
150 Kokkos::DefaultHostExecutionSpace::memory_space> dense,
153 ddc::parallel_fill(dense, 0.);
154 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1; ++i) {
156 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
157 Kokkos::parallel_for(
159 Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(j_begin, j_end),
161 dense(ddc::DiscreteElement<HeadId>(i),
162 ddc::DiscreteElement<TailId...>(csr.
idx()[ddc::type_seq_rank_v<
164 ddc::detail::TypeSeq<TailId...>>][j]...))
171template <
class... TensorIndex>
174 os <<
"----------\n";
175 for (std::size_t i = 0; i < csr.
coalesc_idx().size(); ++i) {
179 for (std::size_t i = 0; i < csr.
idx()[0].size(); ++i) {
180 for (std::size_t j = 0; j <
sizeof...(TensorIndex) - 1; ++j) {
181 os << csr.
idx()[j][i] <<
" ";
CsrDynamic(ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain)
CsrDynamic(ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain, std::vector< std::size_t > coalesc_idx, std::array< std::vector< std::size_t >, sizeof...(TailTensorIndex)> idx, std::vector< double > values)
std::array< std::vector< std::size_t >, sizeof...(TailTensorIndex)> idx() const
void write(std::ofstream &file)
std::vector< double > values() const
CsrDynamic< HeadTensorIndex, TailTensorIndex... > get(ddc::DiscreteElement< HeadTensorIndex > id) const
ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain()
void push_back(sil::tensor::Tensor< double, ddc::DiscreteDomain< TailTensorIndex... >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > dense)
std::vector< std::size_t > coalesc_idx() const
sil::tensor::Tensor< double, ddc::DiscreteDomain< HeadId, TailId... >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > csr2dense(sil::tensor::Tensor< double, ddc::DiscreteDomain< HeadId, TailId... >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > dense, CsrDynamic< HeadId, TailId... > csr)
std::ostream & operator<<(std::ostream &os, Csr< N, TensorIndex... > const &csr)
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
The top-level namespace of SimiLie.