Skip to content

Commit fe09e4b

Browse files
committed
1. optimize LRI::cal() with LRI_Cal_Tools::filter_Ds_Ab01()
1 parent 3fcf8fc commit fe09e4b

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

include/RI/ri/LRI-cal.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ void LRI<TA,Tcell,Ndim,Tdata>::cal(
7171
for(std::size_t ib01=0; ib01<list_Ab01.size(); ++ib01)
7272
{
7373
const TAC &Ab01 = list_Ab01[ib01];
74+
const std::vector<Label::ab_ab> labels_filter_Ab01 = tools.filter_Ds_Ab01(labels, Aa01, Aa2, Ab01);
75+
if(labels_filter_Ab01.empty()) continue;
76+
7477
std::unordered_map<Label::ab_ab, Tensor<Tdata>> Ds_b01;
7578
std::unordered_map<Label::ab_ab, Tdata_real> Ds_b01_csm;
7679
Ds_b01.reserve(Label::array_ab_ab.size());
@@ -85,7 +88,7 @@ void LRI<TA,Tcell,Ndim,Tdata>::cal(
8588
? Ds_b_transpose.at(Ab01.first).at({Ab2.first, (Ab2.second-Ab01.second)%this->period})
8689
: Tensor<Tdata>{};
8790

88-
for(const Label::ab_ab &label : labels)
91+
for(const Label::ab_ab &label : labels_filter_Ab01)
8992
{
9093
this->cal_funcs[label](
9194
label,

include/RI/ri/LRI_Cal_Tools.h

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,64 @@ class LRI_Cal_Tools
5555
return this->Ds_result[icoef][Aa.first][TAC{Ab.first, (Ab.second-Aa.second)%period}];
5656
}
5757

58+
inline static std::vector<Label::ab> split_b01(const Label::ab_ab &label)
59+
{
60+
switch(label)
61+
{
62+
case Label::ab_ab::a0b0_a2b2: case Label::ab_ab::a0b0_a1b2: return {Label::ab::a0b0};
63+
case Label::ab_ab::a0b1_a1b2: case Label::ab_ab::a0b1_a2b2: return {Label::ab::a0b1};
64+
case Label::ab_ab::a1b0_a2b2: case Label::ab_ab::a0b2_a1b0: return {Label::ab::a1b0};
65+
case Label::ab_ab::a1b1_a2b2: case Label::ab_ab::a0b2_a1b1: return {Label::ab::a1b1};
66+
case Label::ab_ab::a0b2_a2b0: case Label::ab_ab::a1b2_a2b0: return {Label::ab::a2b0};
67+
case Label::ab_ab::a0b2_a2b1: case Label::ab_ab::a1b2_a2b1: return {Label::ab::a2b1};
68+
case Label::ab_ab::a1b0_a2b1: return {Label::ab::a1b0, Label::ab::a2b1};
69+
case Label::ab_ab::a1b1_a2b0: return {Label::ab::a1b1, Label::ab::a2b0};
70+
case Label::ab_ab::a0b0_a2b1: return {Label::ab::a0b0, Label::ab::a2b1};
71+
case Label::ab_ab::a0b1_a2b0: return {Label::ab::a0b1, Label::ab::a2b0};
72+
case Label::ab_ab::a0b0_a1b1: return {Label::ab::a0b0, Label::ab::a1b1};
73+
case Label::ab_ab::a0b1_a1b0: return {Label::ab::a0b1, Label::ab::a1b0};
74+
default: throw std::invalid_argument(std::string(__FILE__)+" line "+std::to_string(__LINE__));
75+
}
76+
}
77+
78+
std::vector<Label::ab_ab> filter_Ds_Ab01(
79+
const std::vector<Label::ab_ab> &labels,
80+
const TA &Aa01, const TAC &Aa2, const TAC &Ab01) const
81+
{
82+
const auto judge_label = [this, &Aa01, &Aa2, &Ab01](const Label::ab_ab &label_ab_ab) -> bool
83+
{
84+
const std::vector<Label::ab> &labels_ab = split_b01(label_ab_ab);
85+
for(const Label::ab &label_ab : labels_ab)
86+
{
87+
const int a = Label::get_a(label_ab);
88+
switch(a)
89+
{
90+
case 0: case 1:
91+
if(!this->get_Ds_ab(label_ab, Aa01, Ab01).empty())
92+
return true;
93+
else
94+
continue;
95+
case 2:
96+
if(!this->get_Ds_ab(label_ab, Aa2, Ab01).empty())
97+
return true;
98+
else
99+
continue;
100+
default:
101+
throw std::invalid_argument(std::string(__FILE__)+" line "+std::to_string(__LINE__));
102+
}
103+
}
104+
return false;
105+
};
106+
107+
std::vector<Label::ab_ab> labels_filter;
108+
for(const Label::ab_ab &label : labels)
109+
{
110+
if(judge_label(label))
111+
labels_filter.push_back(label);
112+
}
113+
return labels_filter;
114+
}
115+
58116
public: // private:
59117
const TC &period;
60118
const std::unordered_map<Label::ab, std::map<TA, std::map<TAC, Tensor<Tdata>>>> &Ds_ab;

0 commit comments

Comments
 (0)