22template <
typename Tdata>
23extern RI::Tensor<Tdata>
cal_I(
const RI::Tensor<Tdata>& m,
26 const double& threshold_condition_number = 0.);
27template <
typename Tdata>
28extern std::vector<std::vector<RI::Tensor<Tdata>>>
cal_I(
const std::vector<std::vector<RI::Tensor<Tdata>>>& ms,
31 const double& threshold_condition_number = 0.);
33template <
typename Tdata>
34inline RI::Tensor<Tdata>
transform_Rm(
const RI::Tensor<Tdata>& V);
35template <
typename Tdata>
36inline std::array<RI::Tensor<Tdata>, 3>
transform_Rm(
const std::array<RI::Tensor<Tdata>, 3>& dV);
45template <
typename Tdata>
46inline bool exist(
const RI::Tensor<Tdata>& V);
47template <
typename T, std::
size_t N>
48inline bool exist(
const std::array<T, N>& dV);
50template <
typename Tdata>
51extern RI::Tensor<Tdata>
mul1(
const RI::Tensor<Tdata>& t1,
const RI::Tensor<Tdata>& t2);
53extern std::array<T, 3>
mul1(
const std::array<T, 3>& t1,
const T& t2);
55template <
typename Tdata>
56extern std::vector<RI::Tensor<Tdata>>
mul2(
const std::vector<std::vector<RI::Tensor<Tdata>>>& mat,
57 const std::vector<RI::Tensor<Tdata>>& vec);
58template <
typename T1,
typename T2>
59extern std::array<T2, 3>
mul2(
const T1& t1,
const std::array<T2, 3>& t2);
61extern RI::Tensor<T>
mul2(
const T& t1,
const RI::Tensor<T>& t2);
62template <
typename T,
typename TkeyA,
typename TkeyB,
typename Tvalue>
63extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
mul2(
const T& t1,
const std::map<TkeyA, std::map<TkeyB, Tvalue>>& t2);
69template <
typename T, std::
size_t N>
70extern std::vector<std::array<T, N>>
minus(
const std::vector<std::array<T, N>>& v1,
71 const std::vector<std::array<T, N>>& v2);
72template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
73extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
minus(
74 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
75 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2);
76template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
77inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
minus(
78 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
79 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
80template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
81extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
minus(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
82 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
84template <
typename T, std::
size_t N>
85extern std::vector<std::array<T, N>>
add(
const std::vector<std::array<T, N>>& v1,
86 const std::vector<std::array<T, N>>& v2);
87template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
88extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
add(
89 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v1,
90 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>& v2);
91template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
92inline std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
add(
93 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v1,
94 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>& v2);
95template <
typename TkeyA,
typename TkeyB,
typename Tvalue>
96extern std::map<TkeyA, std::map<TkeyB, Tvalue>>
add(std::map<TkeyA, std::map<TkeyB, Tvalue>>& v1,
97 std::map<TkeyA, std::map<TkeyB, Tvalue>>& v2);
99template <
typename T, std::
size_t N>
100extern std::array<T, N>
negative(
const std::array<T, N>& v_in);
103template <
typename Tdata>
104RI::Tensor<Tdata>
transpose12(
const RI::Tensor<Tdata>& c_in);
105template <
typename T, std::
size_t N>
106std::array<T, N>
transpose12(
const std::array<T, N>& c_in);
108template <
typename T, std::
size_t N>
109extern std::array<std::vector<T>,
N>
change_order(std::vector<std::array<T, N>>&& ds_in);
110template <
typename T, std::
size_t N>
111std::vector<std::array<T, N>>
change_order(std::array<std::vector<T>,
N>&& ds_in);
112template <
typename T, std::
size_t N>
113extern std::array<std::vector<std::vector<T>>,
N>
change_order(std::vector<std::vector<std::array<T, N>>>&& ds_in);
114template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
115extern std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>
change_order(
116 std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>&& ds_in);
117template <
typename TkeyA,
typename TkeyB,
typename Tvalue, std::
size_t N>
118extern std::map<TkeyA, std::map<TkeyB, std::array<Tvalue, N>>>
change_order(
119 std::array<std::map<TkeyA, std::map<TkeyB, Tvalue>>,
N>&& ds_in);
121template <
typename Tcell>
124 const std::vector<double>& orb_cutoff);
126template <
typename TA,
typename Tcell,
typename Tdata>
127extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, RI::Tensor<Tdata>>>>
get_CVws(
129 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, RI::Tensor<Tdata>>>& CVs);
130template <
typename TA,
typename Tcell,
typename Tdata>
131extern std::map<int, std::map<int, std::map<Abfs::Vector3_Order<double>, std::array<RI::Tensor<Tdata>, 3>>>>
get_dCVws(
133 const std::map<TA, std::map<std::pair<TA, std::array<Tcell, 3>>, std::array<RI::Tensor<Tdata>, 3>>>& dCVs);
134template <
typename TA,
typename TC,
typename Tdata>
135extern std::array<std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>, 3>
cal_dMRs(
137 const std::array<std::map<TA, std::map<std::pair<TA, TC>, RI::Tensor<Tdata>>>, 3>& dMs);
139using TC = std::array<int, 3>;
140using TAC = std::pair<int, TC>;
142using TLRI = std::map<int, std::map<TAC, RI::Tensor<T>>>;
156template <
typename T, std::
size_t N>
169template <
typename Tout>
178template <
typename T, std::
size_t N>
184template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value>>
185inline void init_elem(Tdata& data,
const size_t ndim0,
const size_t ndim1)
187 data = Tdata({ndim0, ndim1});
189template <
typename T, std::
size_t N>
190extern void init_elem(std::array<RI::Tensor<T>,
N>& data,
const size_t ndim0,
const size_t ndim1);
192template <typename Tdata, typename = std::enable_if_t<!is_std_array<Tdata>::value && !is_tensor<Tdata>::value>>
193inline void add_elem(Tdata& data,
const Tdata& val,
const Tdata& frac)
197template <
typename T, std::
size_t N>
198extern void add_elem(std::array<T, N>& data,
const T& val,
const T& frac);
199template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
206 data(lmp, lmq) += frac * val;
208template <
typename T, std::
size_t N>
209extern void add_elem(std::array<RI::Tensor<T>,
N>& data,
212 const std::array<T, N>& val,
214template <typename Tdata, typename = std::enable_if_t<is_tensor<Tdata>::value>>
223 data(lmp0, lmq0) += frac * val(lmp1, lmq1);
225template <
typename T, std::
size_t N>
226extern void add_elem(std::array<RI::Tensor<T>,
N>& data,
229 const std::array<RI::Tensor<T>,
N>& val,
234template <
typename Tout,
typename Tin>
235inline RI::Tensor<Tout>
convert(RI::Tensor<Tin>&& data);
236template <
typename Tout,
typename Tin, std::
size_t N>
237extern std::array<RI::Tensor<Tout>,
N>
convert(std::array<RI::Tensor<Tin>,
N>&& data);
268 using namespace RI::Array_Operator;