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)) {
125 if(
isTr) c.s <<
"\u1D40";
127 }
else if(is_zero(
pi-
int(
'c')) || is_zero(
pi-
int(
'C'))) {
129 if(
isTr) c.s <<
"\u1D40";
132 c.s <<
"(" <<
"\u0263";
133 if(
isTr) c.s <<
"\u1D40";
134 if(is_a<numeric>(
pi)) c.s <<
pi;
135 else c.s <<
"." <<
pi;
140 if(
isTr)
throw Error(
"Transposed not supported in DGamma::form_print.");
141 if(!is_a<numeric>(
pi)) c <<
"g_(" <<
rl <<
"," <<
pi <<
")";
142 else if(is_zero(
pi-1)) c <<
"gi_(" <<
rl <<
")";
143 else if(is_zero(
pi-5)) c <<
"g5_(" <<
rl <<
")";
144 else if(is_zero(
pi-6)) c <<
"g6_(" <<
rl <<
")";
145 else if(is_zero(
pi-7)) c <<
"g7_(" <<
rl <<
")";
146 else if(is_zero(
pi-
int(
'c')))
throw Error(
"C not supported @ DGamma::form_print.");
147 else throw Error(
"DGamma::form_print unexpected region.");
154 }
else if(is_zero(
pi-
int(
'c'))) {
155 if(
isTr) c <<
"Transpose@";
156 c <<
"ChargeConjugationMatrix";
159 if(
isTr) c <<
"Transpose@";
160 if(is_a<Vector>(
pi)) c <<
"GSD";
162 c <<
"[" <<
pi <<
"]";
166 inherited::archive(n);
168 n.add_unsigned(
"rl",
rl);
169 n.add_unsigned(
"tr",
isTr ? 1 : 0);
173 inherited::read_archive(n);
174 n.find_unsigned(
"rl",
rl);
177 n.find_unsigned(
"rl",
rl);(
"tr", tr);
178 if(tr>0)
isTr =
true;
187 if(is_a<Index>(
pi) || is_a<Vector>(
pi))
return *
this;
188 else if(is_zero(
pi-5))
return (-1)*
DGamma(5,
rl);
192 else if(is_zero(
pi-
int(
'c')))
return DGamma(
int(
'c'),
rl);
193 throw Error(
"invalid Dirac Gamma Found.");
201 Index a(
"g5Idx"+to_string(i));
202 Index b(
"g5Idx"+to_string(i+1));
203 Index c(
"g5Idx"+to_string(i+2));
204 Index d(
"g5Idx"+to_string(i+3));
212 void TR_form_print(
const ex &arg,
const print_context &c0) {
214 c <<
"(" << arg <<
")";
216 void TR_fc_print(
const ex &arg,
const print_context &c0) {
217 auto c =
static_cast<const FCFormat &
>(c0);
218 c <<
"DiracTrace[" << arg <<
"]";
220 ex tr_conj(
const ex & e) {
221 return TR(e.conjugate());
224 void TTR_form_print(
const ex &arg,
const print_context &c0) {
225 auto c =
static_cast<const FormFormat &
>(c0);
226 if(!is_a<lst>(arg)) c <<
"TTR(" << arg <<
")";
229 for(
auto item : arg) {
230 if(first) { first=
false; c <<
"TTR(" << item; }
231 else c <<
"," << item;
236 void TTR_fc_print(
const ex &arg,
const print_context &c0) {
237 auto c =
static_cast<const FCFormat &
>(c0);
238 if(!is_a<lst>(arg)) c <<
"SUNTrace[SUNT[" << arg <<
"]]";
241 for(
auto item : arg) {
242 if(first) { first=
false; c <<
"SUNTrace[SUNT[" << item; }
243 else c <<
"," << item;
248 ex ttr_conj(
const ex & e) {
250 if(!is_a<lst>(e))
return TTR(e);
251 else argv = ex_to<lst>(e);
253 for(
auto it=argv.rbegin(); it!=argv.rend(); ++it)
as.append(*it);
259 conjugate_func(tr_conj).
260 print_func<FormFormat>(&TR_form_print).
261 print_func<FCFormat>(&TR_fc_print).
262 set_return_type(return_types::commutative).
263 expl_derivative_func(expl_TR_diff)
267 conjugate_func(ttr_conj).
268 print_func<FormFormat>(&TTR_form_print).
269 print_func<FCFormat>(&TTR_fc_print)
280 ex
GAS(
const ex &expr,
unsigned rl) {
281 if(is_zero(expr))
return 0;
282 else if(is_zero(expr-1))
return DGamma(1,rl);
283 else if(is_zero(expr-5))
return DGamma(5,rl);
284 else if(is_zero(expr-6))
return DGamma(6,rl);
285 else if(is_zero(expr-7))
return DGamma(7,rl);
286 else if(is_zero(expr-
int(
'c')) || is_zero(expr-
int(
'C')))
return DGamma(
int(
'c'),rl);
288 ex tmp = expand(expr);
291 for(
auto item : tmp) ex_lst.append(item);
292 }
else ex_lst.append(tmp);
294 for(
auto item : ex_lst) {
296 if(is_a<mul>(item)) {
297 for(
auto ii : item) mul_lst.append(ii);
298 }
else mul_lst.append(item);
300 for(
auto ii : mul_lst) {
301 if(is_a<Vector>(ii)) {
302 if(is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @1, g="+
ex2str(g));
303 g =
DGamma(ex_to<Vector>(ii),rl);
304 }
else if(is_a<Index>(ii)) {
305 if(is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @2, g="+
ex2str(g));
306 g =
DGamma(ex_to<Index>(ii),rl);
311 if(!is_a<DGamma>(g))
throw Error(
"Something Wrong with GAS @3, g="+
ex2str(g)+
", in="+
ex2str(expr));
323 ex
GAS(
const initializer_list<ex> & expr_lst,
unsigned rl) {
325 for(
auto item : expr_lst) res *=
GAS(item, rl);
326 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