@@ -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+
58116public: // private:
59117 const TC .
60118 const std::unordered_map<Label::ab, std::map<TA, std::map<TAC, Tensor<Tdata>>>> &Ds_ab;
0 commit comments