1#ifndef TATOOINE_EINSTEIN_NOTATION_CONTRACTED_DYNAMIC_TENSOR_H
2#define TATOOINE_EINSTEIN_NOTATION_CONTRACTED_DYNAMIC_TENSOR_H
8template <
typename... IndexedTensors>
11 common_type<
typename IndexedTensors::tensor_type::value_type...>;
13 template <std::
size_t I>
20 static auto constexpr rank() {
return free_indices::size; }
22 template <
typename E, std::size_t ...Is>
23 auto constexpr dimension(std::index_sequence<Is...>)
const {
26 [&](
auto const& indexed_tensor) {
27 if constexpr (IndexedTensors::template contains<E>()) {
28 s = indexed_tensor.template dimension<E>();
37 return dimension<E>(std::make_index_sequence<
sizeof...(IndexedTensors)>{});
46 template <std::
size_t I>
50 template <std::
size_t I>
54 constexpr auto num_tensors() {
return sizeof...(IndexedTensors); }
56 template <std::size_t... ContractedIndexSequence,
57 std::size_t... ContractedTensorsSequence>
59 std::index_sequence<ContractedIndexSequence...> ,
60 std::index_sequence<ContractedTensorsSequence...> )
const {
61 using map_t = std::map<std::size_t, std::size_t>;
65 auto const contracted_indices_map = map_t{map_t::value_type{
66 contracted_indices::template at<ContractedIndexSequence>::get(),
67 ContractedIndexSequence,
69 auto const tensor_index_maps = std::tuple{IndexedTensors::index_map()...};
71 std::tuple{make_array<std::size_t, IndexedTensors::rank()>()...};
78 auto const contracted_index_array =
83 std::get<ContractedTensorsSequence>(index_arrays);
84 auto const& tensor_index_map =
85 std::get<ContractedTensorsSequence>(tensor_index_maps);
86 auto index_arr_it =
begin(index_array);
87 auto tensor_index_map_it =
begin(tensor_index_map);
89 for (; tensor_index_map_it !=
end(tensor_index_map);
90 ++tensor_index_map_it, ++index_arr_it) {
91 if (contracted_indices_map.contains(*tensor_index_map_it)) {
93 contracted_index_array[contracted_indices_map.at(
94 *tensor_index_map_it)];
101 acc += (at<ContractedTensorsSequence>().tensor()(
102 std::get<ContractedTensorsSequence>(index_arrays)) *
105 contracted_dynamic_tensor::template
dimension<
106 typename contracted_indices::template
at<
107 ContractedIndexSequence>>()...);
112 if constexpr (free_indices::empty) {
113 return to_scalar(std::make_index_sequence<contracted_indices::dimension>{},
114 std::make_index_sequence<
sizeof...(IndexedTensors)>{});
typename type_list_at_impl< TypeList, I >::type type_list_at
Access to the Ith element of TypeList.
Definition: type_list.h:56
Definition: added_contracted_dynamic_tensor.h:4
static auto constexpr s
Definition: index.h:23
typename contracted_indices_aux< indexed_tensors_to_index_list< Indices... > >::type contracted_indices
Definition: type_traits.h:90
typename free_indices_aux< indexed_tensors_to_index_list< Indices... > >::type free_indices
Definition: type_traits.h:59
typename common_type_impl< Ts... >::type common_type
Definition: common_type.h:23
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
constexpr auto for_loop(Iteration &&iteration, execution_policy::sequential_t, Ranges(&&... ranges)[2]) -> void
Use this function for creating a sequential nested loop.
Definition: for_loop.h:336
Definition: contracted_dynamic_tensor.h:9
type_list_at< indices_per_tensor, I > indices_of_tensor
Definition: contracted_dynamic_tensor.h:14
common_type< typename IndexedTensors::tensor_type::value_type... > value_type
Definition: contracted_dynamic_tensor.h:11
static auto constexpr rank()
Definition: contracted_dynamic_tensor.h:20
::empty auto to_scalar(std::index_sequence< ContractedIndexSequence... >, std::index_sequence< ContractedTensorsSequence... >) const
Definition: contracted_dynamic_tensor.h:58
contracted_dynamic_tensor(IndexedTensors... tensors)
Definition: contracted_dynamic_tensor.h:44
auto constexpr dimension() const
Definition: contracted_dynamic_tensor.h:36
auto at()
Definition: contracted_dynamic_tensor.h:51
auto at() const
Definition: contracted_dynamic_tensor.h:47
std::tuple< IndexedTensors... > m_tensors
Definition: contracted_dynamic_tensor.h:41
auto constexpr dimension(std::index_sequence< Is... >) const
Definition: contracted_dynamic_tensor.h:23
tatooine::einstein_notation::contracted_indices< IndexedTensors... > contracted_indices
Definition: contracted_dynamic_tensor.h:18
tatooine::einstein_notation::free_indices< IndexedTensors... > free_indices
Definition: contracted_dynamic_tensor.h:16
constexpr auto num_tensors()
Definition: contracted_dynamic_tensor.h:54
An empty struct that holds types.
Definition: type_list.h:248