10 static ex expl_TR_diff2(
const ex & arg,
const symbol & s) {
11 auto ret = arg.diff(s);
12 if(!is_a<add>(ret)) ret = lst{ret};
14 for(
auto item : ret) {
15 if(!is_a<mul>(item)) res += TR(item);
28 static ex expl_TR_diff(
const ex & arg,
const symbol & s) {
29 auto ret = arg.diff(s);
30 auto nd = numer_denom(ret.normal());
31 auto num = collect_common_factors(nd.op(0));
32 if(!is_a<mul>(num))
return TR(num)/nd.op(1);
39 return c*TR(v)/nd.op(1);
60 return make_return_type_t<clifford>(
rl);
74 if(!is_a<DGamma>(other))
throw Error(
"DGamma::compare_same_type");
76 if (
rl != o.
rl)
return rl < o.
rl ? -1 : 1;
77 return pi.compare(o.
pi);
81 if(!is_a<DGamma>(other))
throw Error(
"DGamma::is_equal_same_type");
83 if (
rl != o.
rl)
return false;
84 return pi.is_equal(o.
pi);
88 if(int_1567c==
int(
'C'))
pi = int(
'c');
89 if(
pi!=1 &&
pi!=5 &&
pi!=6 &&
pi!=7 &&
pi!=
int(
'c'))
throw Error(
"1/5/6/7/'c'/'C' only supported in DGamma.");
98 else if(i==1)
return rl;
103 static ex ex_rl = numeric(
rl);
104 ensure_if_modifiable();
110 if(flags & status_flags::evaluated)
return *
this;
111 else if(is_zero(
pi-
int(
'C')))
return GAS(
int(
'c'),
rl);
112 else if(is_zero(
pi) || is_zero(
pi-1) || is_zero(
pi-5) || is_zero(
pi-6) || is_zero(
pi-7) || is_zero(
pi-
int(
'c')))
return this->hold();
113 else if(!is_a<Vector>(
pi) && !is_a<Index>(
pi))
return GAS(
pi,
rl);
114 else return this->hold();
120 if(
isTr) c.s <<
"\u1D40";
122 }
else if(is_zero(
pi-5) || is_zero(
pi-6) || is_zero(
pi-7)) {
124 if(
isTr) c.s <<
"\u1D40";
125 if(is_a<numeric>(
pi)) c.s <<
pi;
126 else c.s <<
"." <<
pi;
128 }
else if(is_zero(
pi-
int(
'c')) || is_zero(
pi-
int(
'C'))) {
130 if(
isTr) c.s <<
"\u1D40";
133 c.s <<
"(" <<
"\u0263";
134 if(
isTr) c.s <<
"\u1D40";
135 if(is_a<numeric>(
pi)) c.s <<
pi;
136 else c.s <<
"." <<
pi;
141 if(
isTr)
throw Error(
"Transposed not supported in DGamma::form_print.");
142 if(!is_a<numeric>(
pi)) c <<
"g_(" <<
rl <<
"," <<
pi <<
")";
143 else if(is_zero(
pi-1)) c <<
"gi_(" <<
rl <<
")";
144 else if(is_zero(
pi-5)) c <<
"g5_(" <<
rl <<
")";
145 else if(is_zero(
pi-6)) c <<
"g6_(" <<
rl <<
")";
146 else if(is_zero(
pi-7)) c <<
"g7_(" <<
rl <<
")";
147 else if(is_zero(
pi-
int(
'c')))
throw Error(
"C not supported @ DGamma::form_print.");
148 else throw Error(
"DGamma::form_print unexpected region.");
155 }
else if(is_zero(
pi-
int(
'c'))) {
156 if(
isTr) c <<
"Transpose@";
157 c <<
"ChargeConjugationMatrix";
160 if(
isTr) c <<
"Transpose@";
161 if(is_a<Vector>(
pi)) c <<
"GSD";
163 c <<
"[" <<
pi <<
"]";
167 inherited::archive(n);
169 n.add_unsigned(
"rl",
rl);
170 n.add_unsigned(
"tr",
isTr ? 1 : 0);
174 inherited::read_archive(n);
175 n.find_unsigned(
"rl",
rl);
178 n.find_unsigned(
"rl",
rl);(
"tr", tr);
179 if(tr>0)
isTr =
true;
188 if(is_a<Index>(
pi) || is_a<Vector>(
pi))
return *
this;
189 else if(is_zero(
pi-5))
return (-1)*
DGamma(5,
rl);
193 else if(is_zero(
pi-
int(
'c')))
return DGamma(
int(
'c'),
rl);
194 throw Error(
"invalid Dirac Gamma Found.");
202 Index a(
"g5Idx"+to_string(i));
203 Index b(
"g5Idx"+to_string(i+1));
204 Index c(
"g5Idx"+to_string(i+2));
205 Index d(
"g5Idx"+to_string(i+3));
213 void TR_form_print(
const ex &arg,
const print_context &c0) {
215 c <<
"(" << arg <<
")";
217 void TR_fc_print(
const ex &arg,
const print_context &c0) {
218 auto c =
static_cast<const FCFormat &
>(c0);
219 c <<
"DiracTrace[" << arg <<
"]";
221 ex tr_conj(
const ex & e) {
222 return TR(e.conjugate());
225 void TTR_form_print(
const ex &arg,
const print_context &c0) {
226 auto c =
static_cast<const FormFormat &
>(c0);
227 if(!is_a<lst>(arg)) c <<
"TTR(" << arg <<
")";
230 for(
auto item : arg) {
231 if(first) { first=
false; c <<
"TTR(" << item; }
232 else c <<
"," << item;
237 void TTR_fc_print(
const ex &arg,
const print_context &c0) {
238 auto c =
static_cast<const FCFormat &
>(c0);
239 if(!is_a<lst>(arg)) c <<
"SUNTrace[SUNT[" << arg <<
"]]";
242 for(
auto item : arg) {
243 if(first) { first=
false; c <<
"SUNTrace[SUNT[" << item; }
244 else c <<
"," << item;
249 ex ttr_conj(
const ex & e) {
251 if(!is_a<lst>(e))
return TTR(e);
252 else argv = ex_to<lst>(e);
254 for(
auto it=argv.rbegin(); it!=argv.rend(); ++it)
as.append(*it);
260 conjugate_func(tr_conj).
261 print_func<FormFormat>(&TR_form_print).
262 print_func<FCFormat>(&TR_fc_print).
263 set_return_type(return_types::commutative).
264 expl_derivative_func(expl_TR_diff)
268 conjugate_func(ttr_conj).
269 print_func<FormFormat>(&TTR_form_print).
270 print_func<FCFormat>(&TTR_fc_print)
281 ex
GAS(
const ex &expr,
unsigned rl) {
282 if(is_zero(expr))
return 0;
283 else if(is_zero(expr-1))
return DGamma(1,rl);
284 else if(is_zero(expr-5))
return DGamma(5,rl);
285 else if(is_zero(expr-6))
return DGamma(6,rl);
286 else if(is_zero(expr-7))
return DGamma(7,rl);
287 else if(is_zero(expr-
int(
'c')) || is_zero(expr-
int(
'C')))
return DGamma(
int(
'c'),rl);
289 ex tmp = expand(expr);
292 for(
auto item : tmp) ex_lst.append(item);
293 }
else ex_lst.append(tmp);
295 for(
auto item : ex_lst) {
297 if(is_a<mul>(item)) {
298 for(
auto ii : item) mul_lst.append(ii);
299 }
else mul_lst.append(item);
301 for(
auto ii : mul_lst) {
302 if(is_a<Vector>(ii)) {
303 if(is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @1, g="+
ex2str(g));
304 g =
DGamma(ex_to<Vector>(ii),rl);
305 }
else if(is_a<Index>(ii)) {
306 if(is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @2, g="+
ex2str(g));
307 g =
DGamma(ex_to<Index>(ii),rl);
312 if(!is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @3, g="+
ex2str(g)+
", in="+
ex2str(expr));
324 ex
GAS(
const initializer_list<ex> & expr_lst,
unsigned rl) {
326 for(
auto item : expr_lst) res *=
GAS(item);
327 if(res.is_equal(1)) res =
GAS(1);
#define IMPLEMENT_HAS(classname)
#define DEFAULT_CTOR(classname)
#define IMPLEMENT_ALL(classname)
class for Dirac Gamma object
bool match_same_type(const basic &other) const override
return_type_t return_type_tinfo() const override
ex derivative(const symbol &s) const override
void archive(archive_node &n) const override
void form_print(const FormFormat &c, unsigned level=0) const
void accept(GiNaC::visitor &v) const override
ex conjugate() const override
static GiNaC::registered_class_info & get_class_info_static()
void read_archive(const archive_node &n) override
static ex sigma(const ex &mu, const ex &nu)
size_t nops() const override
ex op(size_t i) const override
int compare_same_type(const GiNaC::basic &other) const override
void print(const print_dflt &c, unsigned level=0) const
static ex G5Eps(int i=0, int rl=0)
static bool has(const ex &e)
void fc_print(const FCFormat &c, unsigned level=0) const
const GiNaC::registered_class_info & get_class_info() const override
bool is_equal_same_type(const basic &other) const override
DGamma * duplicate() const override
ex & let_op(size_t i) override
const char * class_name() const override
class used to wrap error message
static bool has(const ex &e)
ex GAS(const ex &expr, unsigned rl)
function similar to GAD/GSD in FeynClac
string ex2str(const ex &expr)
convert ex to output string, the defalut printer format will be used
REGISTER_FUNCTION(GMat, do_not_evalf_params().print_func< FCFormat >(&GMat_fc_print).conjugate_func(mat_conj).set_return_type(return_types::commutative)) bool IsZero(const ex &e)
ex LC(ex pi1, ex pi2, ex pi3, ex pi4)
function similar to LCD in FeynCalc