| 1179 | } |
| 1180 | |
| 1181 | Matrix<int> EinsumCoefficientFunction::build_index_maps( |
| 1182 | const Array<MultiIndex>& index_sets, const optional<Vector<bool>>& nz_pattern) |
| 1183 | { |
| 1184 | Matrix<int> imaps; |
| 1185 | |
| 1186 | const auto& RI = index_sets[cfs.Size()]; |
| 1187 | const auto& FI = index_sets[cfs.Size() + 1]; |
| 1188 | const auto cres = cfs.Size(); |
| 1189 | |
| 1190 | if (!nz_pattern) |
| 1191 | { |
| 1192 | imaps.SetSize(FI.TotalDim(), cfs.Size() + 1); |
| 1193 | for (size_t I: Range(imaps.Height())) |
| 1194 | { |
| 1195 | const auto I_array = split(I, FI); |
| 1196 | imaps(I, cres) = join(I_array, RI); |
| 1197 | for (size_t i: Range(cfs)) |
| 1198 | imaps(I, i) = join(I_array, index_sets[i]); |
| 1199 | } |
| 1200 | } |
| 1201 | else |
| 1202 | { |
| 1203 | auto nnz = count(nz_pattern->Data(), nz_pattern->Data() + nz_pattern->Size(), true); |
| 1204 | imaps.SetSize(nnz, cfs.Size() + 1); |
| 1205 | size_t nzi = 0; |
| 1206 | for (size_t I: Range(FI.TotalDim())) |
| 1207 | { |
| 1208 | if (!(*nz_pattern)[I]) |
| 1209 | continue; |
| 1210 | |
| 1211 | const auto I_array = split(I, FI); |
| 1212 | imaps(nzi, cres) = join(I_array, RI); |
| 1213 | for (size_t i: Range(cfs)) |
| 1214 | imaps(nzi, i) = join(I_array, index_sets[i]); |
| 1215 | ++nzi; |
| 1216 | } |
| 1217 | } |
| 1218 | return imaps; |
| 1219 | } |
| 1220 | |
| 1221 | string EinsumCoefficientFunction::GetDescription() const |
| 1222 | { |