37template <
typename _Scalar>
44 std::vector<std::map<size_t, size_t>> indices_implicit_to_dense;
61 indices_implicit_to_dense {indices_implicit_to_dense},
65 const auto dimensions = T.dimensions();
66 for (
size_t axis_index = 0; axis_index < 4; axis_index++) {
67 if (this->indices_implicit_to_dense[axis_index].size() != dimensions[axis_index]) {
68 throw std::invalid_argument(
"ImplicitRankFourTensorSlice(const std::vector<std::map<size_t, size_t>>&, const Tensor<Scalar, 4>&): The given dense representation of the slice has an incompatible dimension for axis number " + std::to_string(axis_index) +
".");
104 std::vector<size_t> axis1_indices(axis1_end - axis1_start);
105 std::iota(axis1_indices.begin(), axis1_indices.end(), axis1_start);
107 std::vector<size_t> axis2_indices(axis2_end - axis2_start);
108 std::iota(axis2_indices.begin(), axis2_indices.end(), axis2_start);
110 std::vector<size_t> axis3_indices(axis3_end - axis3_start);
111 std::iota(axis3_indices.begin(), axis3_indices.end(), axis3_start);
113 std::vector<size_t> axis4_indices(axis4_end - axis4_start);
114 std::iota(axis4_indices.begin(), axis4_indices.end(), axis4_start);
131 std::vector<std::map<size_t, size_t>> indices_maps;
132 for (
size_t axis_index = 0; axis_index < 4; axis_index++) {
133 size_t dense_index = 0;
135 std::map<size_t, size_t> axis_map {};
136 for (
const auto& implicit_index : axes_indices[axis_index]) {
137 axis_map[implicit_index] = dense_index;
140 indices_maps.push_back(axis_map);
161 std::vector<std::vector<size_t>> axes_indices {axis1_indices, axis2_indices, axis3_indices, axis4_indices};
184 const auto axis1_dimension =
static_cast<long>(axis1_end - axis1_start);
185 const auto axis2_dimension =
static_cast<long>(axis2_end - axis2_start);
186 const auto axis3_dimension =
static_cast<long>(axis3_end - axis3_start);
187 const auto axis4_dimension =
static_cast<long>(axis4_end - axis4_start);
189 Tensor<Scalar, 4> T {axis1_dimension, axis2_dimension, axis3_dimension, axis4_dimension};
209 const auto axis1_dimension =
static_cast<long>(axis1_indices.size());
210 const auto axis2_dimension =
static_cast<long>(axis2_indices.size());
211 const auto axis3_dimension =
static_cast<long>(axis3_indices.size());
212 const auto axis4_dimension =
static_cast<long>(axis4_indices.size());
214 Tensor<Scalar, 4> T {axis1_dimension, axis2_dimension, axis3_dimension, axis4_dimension};
235 Scalar operator()(
const size_t index1,
const size_t index2,
const size_t index3,
const size_t index4)
const {
238 const auto dense_index1 = this->denseIndexOf<0>(index1);
239 const auto dense_index2 = this->denseIndexOf<1>(index2);
240 const auto dense_index3 = this->denseIndexOf<2>(index3);
241 const auto dense_index4 = this->denseIndexOf<3>(index4);
243 return this->T(dense_index1, dense_index2, dense_index3, dense_index4);
256 Scalar&
operator()(
const size_t index1,
const size_t index2,
const size_t index3,
const size_t index4) {
259 const auto dense_index1 = this->denseIndexOf<0>(index1);
260 const auto dense_index2 = this->denseIndexOf<1>(index2);
261 const auto dense_index3 = this->denseIndexOf<2>(index3);
262 const auto dense_index4 = this->denseIndexOf<3>(index4);
264 return this->T(dense_index1, dense_index2, dense_index3, dense_index4);
291 template <
size_t Axis>
292 size_t denseIndexOf(
const size_t index)
const {
return this->indices_implicit_to_dense[Axis].at(index); }
297 const std::vector<std::map<size_t, size_t>>&
indexMaps()
const {
return this->indices_implicit_to_dense; }
Definition: ImplicitRankFourTensorSlice.hpp:38
_Scalar Scalar
Definition: ImplicitRankFourTensorSlice.hpp:40
size_t denseIndexOf(const size_t index) const
Definition: ImplicitRankFourTensorSlice.hpp:292
static ImplicitRankFourTensorSlice< Scalar > FromIndices(const std::vector< std::vector< size_t > > &axes_indices, const Tensor< Scalar, 4 > &T)
Definition: ImplicitRankFourTensorSlice.hpp:128
const Tensor< Scalar, 4 > & asTensor() const
Definition: ImplicitRankFourTensorSlice.hpp:280
MatrixX< Scalar > asMatrix() const
Definition: ImplicitRankFourTensorSlice.hpp:275
ImplicitRankFourTensorSlice(const std::vector< std::map< size_t, size_t > > &indices_implicit_to_dense, const Tensor< Scalar, 4 > &T)
Definition: ImplicitRankFourTensorSlice.hpp:60
ImplicitRankFourTensorSlice()
Definition: ImplicitRankFourTensorSlice.hpp:77
static ImplicitRankFourTensorSlice< Scalar > ZeroFromIndices(const std::vector< size_t > &axis1_indices, const std::vector< size_t > &axis2_indices, const std::vector< size_t > &axis3_indices, const std::vector< size_t > &axis4_indices)
Definition: ImplicitRankFourTensorSlice.hpp:206
Scalar operator()(const size_t index1, const size_t index2, const size_t index3, const size_t index4) const
Definition: ImplicitRankFourTensorSlice.hpp:235
Scalar & operator()(const size_t index1, const size_t index2, const size_t index3, const size_t index4)
Definition: ImplicitRankFourTensorSlice.hpp:256
static ImplicitRankFourTensorSlice< Scalar > FromBlockRanges(const size_t axis1_start, const size_t axis1_end, const size_t axis2_start, const size_t axis2_end, const size_t axis3_start, const size_t axis3_end, const size_t axis4_start, const size_t axis4_end, const Tensor< Scalar, 4 > &T)
Definition: ImplicitRankFourTensorSlice.hpp:101
const std::vector< std::map< size_t, size_t > > & indexMaps() const
Definition: ImplicitRankFourTensorSlice.hpp:297
static ImplicitRankFourTensorSlice< Scalar > ZeroFromBlockRanges(const size_t axis1_start, const size_t axis1_end, const size_t axis2_start, const size_t axis2_end, const size_t axis3_start, const size_t axis3_end, const size_t axis4_start, const size_t axis4_end)
Definition: ImplicitRankFourTensorSlice.hpp:181
static ImplicitRankFourTensorSlice< Scalar > FromIndices(const std::vector< size_t > &axis1_indices, const std::vector< size_t > &axis2_indices, const std::vector< size_t > &axis3_indices, const std::vector< size_t > &axis4_indices, const Tensor< Scalar, 4 > &T)
Definition: ImplicitRankFourTensorSlice.hpp:158
Definition: Matrix.hpp:47
Definition: Tensor.hpp:46
enable_if_t< Z==4, Matrix< Scalar > > pairWiseReduced(const size_t start_i=0, const size_t start_j=0, const size_t start_k=0, const size_t start_l=0) const
Definition: Tensor.hpp:219
Definition: BaseOneElectronIntegralBuffer.hpp:25