1
from sympy.tensor.tensor import tensor_indices, TensorIndexType, tensorhead, TensorManager, TensMul, TensAdd, get_lines, TensExpr
2
from sympy import simplify, trace
3
from sympy.physics.hep.gamma_matrices import GammaMatrix as G, GammaMatrixHead, DiracSpinorIndex
4
from sympy.utilities.pytest import XFAIL, raises
6
def _is_tensor_eq(arg1, arg2):
7
if isinstance(arg1, TensExpr):
8
return arg1.equals(arg2)
9
elif isinstance(arg2, TensExpr):
10
return arg2.equals(arg1)
13
def execute_gamma_simplify_tests_for_function(tfunc, D):
15
Perform tests to check if sfunc is able to simplify gamma matrix expressions.
20
`sfunc` a function to simplify a `TIDS`, shall return the simplified `TIDS`.
21
`D` the number of dimension (in most cases `D=4`).
25
mu, nu, rho, sigma = tensor_indices("mu, nu, rho, sigma", G.LorentzIndex)
26
a1, a2, a3, a4, a5, a6 = tensor_indices("a1:7", G.LorentzIndex)
27
mu11, mu12, mu21, mu31, mu32, mu41, mu51, mu52 = tensor_indices("mu11, mu12, mu21, mu31, mu32, mu41, mu51, mu52", G.LorentzIndex)
28
mu61, mu71, mu72 = tensor_indices("mu61, mu71, mu72", G.LorentzIndex)
29
m0, m1, m2, m3, m4, m5, m6 = tensor_indices("m0:7", G.LorentzIndex)
32
return (G(xx)*G(yy) + G(yy)*G(xx))/2
34
# Some examples taken from Kahane's paper, 4 dim only:
36
t = (G(a1)*G(mu11)*G(a2)*G(mu21)*G(-a1)*G(mu31)*G(-a2))
37
assert _is_tensor_eq(tfunc(t), -4*G(mu11)*G(mu31)*G(mu21) - 4*G(mu31)*G(mu11)*G(mu21))
39
t = (G(a1)*G(mu11)*G(mu12)*\
41
G(a3)*G(mu31)*G(mu32)*\
43
G(-a2)*G(mu51)*G(mu52)*\
45
G(-a3)*G(mu71)*G(mu72)*\
47
assert _is_tensor_eq(tfunc(t), \
48
16*G(mu31)*G(mu32)*G(mu72)*G(mu71)*G(mu11)*G(mu52)*G(mu51)*G(mu12)*G(mu61)*G(mu21)*G(mu41) + 16*G(mu31)*G(mu32)*G(mu72)*G(mu71)*G(mu12)*G(mu51)*G(mu52)*G(mu11)*G(mu61)*G(mu21)*G(mu41) + 16*G(mu71)*G(mu72)*G(mu32)*G(mu31)*G(mu11)*G(mu52)*G(mu51)*G(mu12)*G(mu61)*G(mu21)*G(mu41) + 16*G(mu71)*G(mu72)*G(mu32)*G(mu31)*G(mu12)*G(mu51)*G(mu52)*G(mu11)*G(mu61)*G(mu21)*G(mu41))
50
# Fully G.Lorentz-contracted expressions, these return scalars:
53
return ne * DiracSpinorIndex.delta(DiracSpinorIndex.auto_left, -DiracSpinorIndex.auto_right)
57
assert _is_tensor_eq(tfunc(t), ts)
59
t = (G(mu)*G(nu)*G(-mu)*G(-nu))
60
ts = add_delta(2*D - D**2) # -8
61
assert _is_tensor_eq(tfunc(t), ts)
63
t = (G(mu)*G(nu)*G(-nu)*G(-mu))
64
ts = add_delta(D**2) # 16
65
assert _is_tensor_eq(tfunc(t), ts)
67
t = (G(mu)*G(nu)*G(-rho)*G(-nu)*G(-mu)*G(rho))
68
ts = add_delta(4*D - 4*D**2 + D**3) # 16
69
assert _is_tensor_eq(tfunc(t), ts)
71
t = (G(mu)*G(nu)*G(rho)*G(-rho)*G(-nu)*G(-mu))
72
ts = add_delta(D**3) # 64
73
assert _is_tensor_eq(tfunc(t), ts)
75
t = (G(a1)*G(a2)*G(a3)*G(a4)*G(-a3)*G(-a1)*G(-a2)*G(-a4))
76
ts = add_delta(-8*D + 16*D**2 - 8*D**3 + D**4) # -32
77
assert _is_tensor_eq(tfunc(t), ts)
79
t = (G(-mu)*G(-nu)*G(-rho)*G(-sigma)*G(nu)*G(mu)*G(sigma)*G(rho))
80
ts = add_delta(-16*D + 24*D**2 - 8*D**3 + D**4) # 64
81
assert _is_tensor_eq(tfunc(t), ts)
83
t = (G(-mu)*G(nu)*G(-rho)*G(sigma)*G(rho)*G(-nu)*G(mu)*G(-sigma))
84
ts = add_delta(8*D - 12*D**2 + 6*D**3 - D**4) # -32
85
assert _is_tensor_eq(tfunc(t), ts)
87
t = (G(a1)*G(a2)*G(a3)*G(a4)*G(a5)*G(-a3)*G(-a2)*G(-a1)*G(-a5)*G(-a4))
88
ts = add_delta(64*D - 112*D**2 + 60*D**3 - 12*D**4 + D**5) # 256
89
assert _is_tensor_eq(tfunc(t), ts)
91
t = (G(a1)*G(a2)*G(a3)*G(a4)*G(a5)*G(-a3)*G(-a1)*G(-a2)*G(-a4)*G(-a5))
92
ts = add_delta(64*D - 120*D**2 + 72*D**3 - 16*D**4 + D**5) # -128
93
assert _is_tensor_eq(tfunc(t), ts)
95
t = (G(a1)*G(a2)*G(a3)*G(a4)*G(a5)*G(a6)*G(-a3)*G(-a2)*G(-a1)*G(-a6)*G(-a5)*G(-a4))
96
ts = add_delta(416*D - 816*D**2 + 528*D**3 - 144*D**4 + 18*D**5 - D**6) # -128
97
assert _is_tensor_eq(tfunc(t), ts)
99
t = (G(a1)*G(a2)*G(a3)*G(a4)*G(a5)*G(a6)*G(-a2)*G(-a3)*G(-a1)*G(-a6)*G(-a4)*G(-a5))
100
ts = add_delta(416*D - 848*D**2 + 584*D**3 - 172*D**4 + 22*D**5 - D**6) # -128
101
assert _is_tensor_eq(tfunc(t), ts)
103
# Expressions with free indices:
105
t = (G(mu)*G(nu)*G(rho)*G(sigma)*G(-mu))
106
assert _is_tensor_eq(tfunc(t), (-2*G(sigma)*G(rho)*G(nu) + (4-D)*G(nu)*G(rho)*G(sigma)))
108
t = (G(mu)*G(nu)*G(-mu))
109
assert _is_tensor_eq(tfunc(t), (2-D)*G(nu))
111
t = (G(mu)*G(nu)*G(rho)*G(-mu))
112
assert _is_tensor_eq(tfunc(t), 2*G(nu)*G(rho) + 2*G(rho)*G(nu) - (4-D)*G(nu)*G(rho))
114
t = 2*G(m2)*G(m0)*G(m1)*G(-m0)*G(-m1)
116
assert _is_tensor_eq(st, (D*(-2*D + 4))*G(m2))
118
t = G(m2)*G(m0)*G(m1)*G(-m0)*G(-m2)
120
assert _is_tensor_eq(st, ((-D + 2)**2)*G(m1))
122
t = G(m0)*G(m1)*G(m2)*G(m3)*G(-m1)
124
assert _is_tensor_eq(st, (D - 4)*G(m0)*G(m2)*G(m3) + 4*G(m0)*g(m2, m3))
126
t = G(m0)*G(m1)*G(m2)*G(m3)*G(-m1)*G(-m0)
128
assert _is_tensor_eq(st, ((D - 4)**2)*G(m2)*G(m3) + (8*D - 16)*g(m2, m3))
130
t = G(m2)*G(m0)*G(m1)*G(-m2)*G(-m0)
132
assert _is_tensor_eq(st, ((-D + 2)*(D - 4) + 4)*G(m1))
134
t = G(m3)*G(m1)*G(m0)*G(m2)*G(-m3)*G(-m0)*G(-m2)
136
assert _is_tensor_eq(st, (-4*D + (-D + 2)**2*(D - 4) + 8)*G(m1))
138
t = 2*G(m0)*G(m1)*G(m2)*G(m3)*G(-m0)
140
assert _is_tensor_eq(st, ((-2*D + 8)*G(m1)*G(m2)*G(m3) - 4*G(m3)*G(m2)*G(m1)))
142
t = G(m5)*G(m0)*G(m1)*G(m4)*G(m2)*G(-m4)*G(m3)*G(-m0)
144
assert _is_tensor_eq(st, (((-D + 2)*(-D + 4))*G(m5)*G(m1)*G(m2)*G(m3) + (2*D - 4)*G(m5)*G(m3)*G(m2)*G(m1)))
146
t = -G(m0)*G(m1)*G(m2)*G(m3)*G(-m0)*G(m4)
148
assert _is_tensor_eq(st, ((D - 4)*G(m1)*G(m2)*G(m3)*G(m4) + 2*G(m3)*G(m2)*G(m1)*G(m4)))
150
t = G(-m5)*G(m0)*G(m1)*G(m2)*G(m3)*G(m4)*G(-m0)*G(m5)
153
result1 = ((-D + 4)**2 + 4)*G(m1)*G(m2)*G(m3)*G(m4) +\
154
(4*D - 16)*G(m3)*G(m2)*G(m1)*G(m4) + (4*D - 16)*G(m4)*G(m1)*G(m2)*G(m3)\
155
+ 4*G(m2)*G(m1)*G(m4)*G(m3) + 4*G(m3)*G(m4)*G(m1)*G(m2) +\
156
4*G(m4)*G(m3)*G(m2)*G(m1)
158
# Kahane's algorithm yields this result, which is equivalent to `result1`
159
# in four dimensions, but is not automatically recognized as equal:
160
result2 = 8*G(m1)*G(m2)*G(m3)*G(m4) + 8*G(m4)*G(m3)*G(m2)*G(m1)
163
assert _is_tensor_eq(st, (result1)) or _is_tensor_eq(st, (result2))
165
assert _is_tensor_eq(st, (result1))
167
# and a few very simple cases, with no contracted indices:
171
assert _is_tensor_eq(st, t)
175
assert _is_tensor_eq(st, t)
177
t = 224*G(m0)*G(m1)*G(-m2)*G(m3)
179
assert _is_tensor_eq(st, t)
182
def test_kahane_algorithm():
183
# Wrap this function to convert to and from TIDS:
186
return GammaMatrixHead._simplify_single_line(e)
188
execute_gamma_simplify_tests_for_function(tfunc, D=4)
190
def test_kahane_simplify1():
191
i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15 = tensor_indices('i0:16', G.LorentzIndex)
192
mu, nu, rho, sigma = tensor_indices("mu, nu, rho, sigma", G.LorentzIndex)
193
KD = DiracSpinorIndex.delta
194
sl = DiracSpinorIndex.auto_left
195
sr = DiracSpinorIndex.auto_right
197
s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16 = \
198
tensor_indices('s0:17', DiracSpinorIndex)
199
t = DiracSpinorIndex.delta(s0,s1)
201
r = G._kahane_simplify(t.coeff, t._tids)
204
t = G(i0)*G(i1)*G(-i0)
205
r = G._kahane_simplify(t.coeff, t._tids)
206
assert r.equals(-2*G(i1))
207
t = G(i0,s0,-s1)*G(i1,s1,-s2)*G(-i0,s2,-s3)
208
r = G._kahane_simplify(t.coeff, t._tids)
209
assert r.equals(-2*G(i1, s0, -s3))
211
t = G(i0, s0, -s1)*G(i1, s1, -s2)
212
r = G._kahane_simplify(t.coeff, t._tids)
214
t = G(i0, s0, -s1)*G(i1, s1, -s0)
215
r = G._kahane_simplify(t.coeff, t._tids)
218
r = G._kahane_simplify(t.coeff, t._tids)
219
assert r.equals(4*KD(sl, -sr))
220
t = G(i0,s0,-s1)*G(-i0,s1,-s2)
221
r = G._kahane_simplify(t.coeff, t._tids)
222
assert r.equals(4*KD(s0, -s2))
223
t = G(i0,s0,-s1)*G(-i0,s1,-s0)
224
r = G._kahane_simplify(t.coeff, t._tids)
226
t = G(i0)*G(i1)*G(-i0)
227
r = G._kahane_simplify(t.coeff, t._tids)
228
assert r.equals(-2*G(i1))
229
t = G(i0)*G(i1)*G(-i0)*G(-i1)
230
r = G._kahane_simplify(t.coeff, t._tids)
231
assert r.equals((2*D - D**2)*KD(sl, -sr))
232
t = G(i0,s0,-s1)*G(i1,s1,-s2)*G(-i0,s2,-s3)*G(-i1,s3,-s0)
233
r = G._kahane_simplify(t.coeff, t._tids)
234
assert r.equals(4*(2*D - D**2))
235
t = G(i0,s0,-s1)*G(-i0,s2,-s3)*G(i1,s1,-s2)*G(-i1,s3,-s0)
236
raises(ValueError, lambda: G._kahane_simplify(t.coeff, t._tids))
237
t = (G(mu)*G(nu)*G(-nu)*G(-mu))
238
r = G._kahane_simplify(t.coeff, t._tids)
239
assert r.equals(D**2*KD(sl, -sr))
240
t = (G(mu,s0,-s1)*G(nu,s1,-s2)*G(-nu,s2,-s3)*G(-mu,s3,-s4))
241
r = G._kahane_simplify(t.coeff, t._tids)
242
assert r.equals(D**2*KD(s0, -s4))
243
t = (G(mu,s0,-s1)*G(nu,s1,-s2)*G(-nu,s2,-s3)*G(-mu,s3,-s0))
244
r = G._kahane_simplify(t.coeff, t._tids)
245
assert r.equals(4*D**2)
246
t = (G(mu)*G(nu)*G(-rho)*G(-nu)*G(-mu)*G(rho))
247
r = G._kahane_simplify(t.coeff, t._tids)
248
assert r.equals((4*D - 4*D**2 + D**3)*KD(sl, -sr))
249
t = (G(-mu)*G(-nu)*G(-rho)*G(-sigma)*G(nu)*G(mu)*G(sigma)*G(rho))
250
r = G._kahane_simplify(t.coeff, t._tids)
251
assert r.equals((-16*D + 24*D**2 - 8*D**3 + D**4)*KD(sl, -sr))
252
t = (G(-mu)*G(nu)*G(-rho)*G(sigma)*G(rho)*G(-nu)*G(mu)*G(-sigma))
253
r = G._kahane_simplify(t.coeff, t._tids)
254
assert r.equals((8*D - 12*D**2 + 6*D**3 - D**4)*KD(sl, -sr))
256
# Expressions with free indices:
257
t = (G(mu)*G(nu)*G(rho)*G(sigma)*G(-mu))
258
r = G._kahane_simplify(t.coeff, t._tids)
259
assert r.equals(-2*G(sigma)*G(rho)*G(nu))
260
t = (G(mu,s0,-s1)*G(nu,s1,-s2)*G(rho,s2,-s3)*G(sigma,s3,-s4)*G(-mu,s4,-s5))
261
r = G._kahane_simplify(t.coeff, t._tids)
262
assert r.equals(-2*G(sigma,s0,-s1)*G(rho,s1,-s2)*G(nu,s2,-s5))
265
def test_gamma_matrix_class():
266
i, j, k = tensor_indices('i,j,k', G.LorentzIndex)
268
# define another type of TensorHead to see if exprs are correctly handled:
269
A = tensorhead('A', [G.LorentzIndex], [[1]])
273
assert _is_tensor_eq(ts, 4*A(k)*DiracSpinorIndex.delta(DiracSpinorIndex.auto_left, -DiracSpinorIndex.auto_right))
277
assert _is_tensor_eq(ts, A(k)*G(i)*G(j))
279
execute_gamma_simplify_tests_for_function(simplify, D=4)
281
def test_gamma_matrix_trace():
282
gamma_trace = G.gamma_trace
283
g = G.LorentzIndex.metric
285
m0, m1, m2, m3, m4, m5, m6 = tensor_indices('m0:7', G.LorentzIndex)
286
n0, n1, n2, n3, n4, n5 = tensor_indices('n0:6', G.LorentzIndex)
288
# working in D=4 dimensions
291
# traces of odd number of gamma matrices are zero:
296
t = G(m0)*G(m1)*G(m2)
300
t = G(m0)*G(m1)*G(-m0)
304
t = G(m0)*G(m1)*G(m2)*G(m3)*G(m4)
308
# traces without internal contractions:
311
assert _is_tensor_eq(t1, 4*g(m0, m1))
313
t = G(m0)*G(m1)*G(m2)*G(m3)
315
t2 = -4*g(m0, m2)*g(m1, m3) + 4*g(m0, m1)*g(m2, m3) + 4*g(m0, m3)*g(m1, m2)
317
assert _is_tensor_eq(t1, t2)
319
t = G(m0)*G(m1)*G(m2)*G(m3)*G(m4)*G(m5)
322
t2 = t2.contract_metric(g)
323
assert _is_tensor_eq(t2, D*gamma_trace(G(m1)*G(m2)*G(m3)*G(m4)))
325
# traces of expressions with internal contractions:
328
assert t1.equals(4*D)
330
t = G(m0)*G(m1)*G(-m0)*G(-m1)
332
assert t1.equals(8*D - 4*D**2)
334
t = G(m0)*G(m1)*G(m2)*G(m3)*G(m4)*G(-m0)
336
t2 = (-4*D)*g(m1, m3)*g(m2, m4) + (4*D)*g(m1, m2)*g(m3, m4) + \
337
(4*D)*g(m1, m4)*g(m2, m3)
340
t = G(-m5)*G(m0)*G(m1)*G(m2)*G(m3)*G(m4)*G(-m0)*G(m5)
342
t2 = (32*D + 4*(-D + 4)**2 - 64)*(g(m1, m2)*g(m3, m4) - \
343
g(m1, m3)*g(m2, m4) + g(m1, m4)*g(m2, m3))
346
t = G(m0)*G(m1)*G(-m0)*G(m3)
348
assert t1.equals((-4*D + 8)*g(m1, m3))
354
# t1 = gamma_trace(t)
355
# assert t1 == 8*p(m0)*q(-m0)*p(m1)*q(-m1) - 4*p(m0)*p(-m0)*q(m1)*q(-m1)
357
t = G(m0)*G(m1)*G(m2)*G(m3)*G(m4)*G(m5)*G(-m0)*G(-m1)*G(-m2)*G(-m3)*G(-m4)*G(-m5)
359
assert t1.equals(-4*D**6 + 120*D**5 - 1040*D**4 + 3360*D**3 - 4480*D**2 + 2048*D)
361
t = G(m0)*G(m1)*G(n1)*G(m2)*G(n2)*G(m3)*G(m4)*G(-n2)*G(-n1)*G(-m0)*G(-m1)*G(-m2)*G(-m3)*G(-m4)
363
tresu = -7168*D + 16768*D**2 - 14400*D**3 + 5920*D**4 - 1232*D**5 + 120*D**6 - 4*D**7
364
assert t1.equals(tresu)
366
# checked with Mathematica
369
# In[3]:= GammaTrace[l, {m0},{m1},{n1},{m2},{n2},{m3},{m4},{n3},{n4},{m0},{m1},{m2},{m3},{m4}]
370
t = G(m0)*G(m1)*G(n1)*G(m2)*G(n2)*G(m3)*G(m4)*G(n3)*G(n4)*G(-m0)*G(-m1)*G(-m2)*G(-m3)*G(-m4)
372
# t1 = t1.expand_coeff()
373
c1 = -4*D**5 + 120*D**4 - 1200*D**3 + 5280*D**2 - 10560*D + 7808
374
c2 = -4*D**5 + 88*D**4 - 560*D**3 + 1440*D**2 - 1600*D + 640
375
assert _is_tensor_eq(t1, c1*g(n1, n4)*g(n2, n3) + c2*g(n1, n2)*g(n3, n4) + \
376
(-c1)*g(n1, n3)*g(n2, n4))
378
p, q = tensorhead('p,q', [G.LorentzIndex], [[1]])
386
assert _is_tensor_eq(r, 8*pq*pq - 4*p2*q2)
387
t = ps*qs*ps*qs*ps*qs
389
assert r.equals(-12*p2*pq*q2 + 16*pq*pq*pq)
390
t = ps*qs*ps*qs*ps*qs*ps*qs
392
assert r.equals(-32*pq*pq*p2*q2 + 32*pq*pq*pq*pq + 4*p2*p2*q2*q2)
394
t = 4*p(m1)*p(m0)*p(-m0)*q(-m1)*q(m2)*q(-m2)
395
assert _is_tensor_eq(gamma_trace(t), t)
396
t = ps*ps*ps*ps*ps*ps*ps*ps
398
assert r.equals(4*p2*p2*p2*p2)
400
def test_simple_trace_cases_symbolic_dim():
401
from sympy import symbols
403
G = GammaMatrixHead(dim=D)
405
m0, m1, m2, m3 = tensor_indices('m0:4', G.LorentzIndex)
406
g = G.LorentzIndex.metric
409
t1 = G._trace_single_line(t)
410
assert _is_tensor_eq(t1, 4 * G.LorentzIndex.metric(m0, m1))
412
t = G(m0)*G(m1)*G(m2)*G(m3)
413
t1 = G._trace_single_line(t)
414
t2 = -4*g(m0, m2)*g(m1, m3) + 4*g(m0, m1)*g(m2, m3) + 4*g(m0, m3)*g(m1, m2)
415
assert _is_tensor_eq(t1, t2)
417
def test_get_lines():
418
i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13 = \
419
tensor_indices('i0:14', G.LorentzIndex)
420
s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16 = \
421
tensor_indices('s0:17', DiracSpinorIndex)
422
t = G(i1,s1,-s2)*G(i2,s3,-s4)*G(i4,s2,-s6)*G(i3,s4,-s3)
423
r = get_lines(t, DiracSpinorIndex)
424
assert r == ([[0, 2]], [[1, 3]], [])
425
t = G(i1,s1,-s2)*G(i2,s2,-s3)*G(i3,s3,-s4)*G(i4,s4,-s5)*\
426
G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*G(i8,s9,-s6)
427
r = get_lines(t, DiracSpinorIndex)
428
assert r == ([[0, 1, 2, 3]], [[4, 5, 6, 7]], [])
429
t = G(i1,s1,-s2)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\
430
G(i4,s4,-s5)*G(i5,s6,-s7)*G(i6,s7,-s8)*G(i7,s8,-s9)*\
431
G(i8,s9,-s6)*G(i9,s10,-s0)
432
r = get_lines(t, DiracSpinorIndex)
433
assert r == ([[0, 2, 3, 4]], [[5, 6, 7, 8], [1, 9]], [])
434
t = G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)*\
435
G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\
436
G(i8,s9,-s6)*G(i9,s10,-s0)
437
r = get_lines(t, DiracSpinorIndex)
438
assert r == ([[0, 3, 4, 5], [7, 1]], [[6, 8, 9, 10], [2, 11]], [])
439
t = G(i4,s4,-s5)*G(i5,s6,-s7)*G(i10,s11,-s12)*G(i6,s7,-s8)*G(i7,s8,-s9)*\
440
G(i8,s9,-s6)*G(i9,s10,-s0)*\
441
G(i1,s1,-s2)*G(i11,s12,-s13)*G(i0,s0,-s10)*G(i2,s2,-s3)*G(i3,s3,-s4)
442
r = get_lines(t, DiracSpinorIndex)
443
assert r == ([[2, 8], [7, 10, 11, 0]], [[1, 3, 4, 5], [6, 9]], [])
444
t = G(i8,s9,-s6)*G(i9,s10,-s0)*G(i4,s4,-s5)*G(i13,s14,-s15)*\
445
G(i10,s11,-s12)*G(i1,s1,-s2)*G(i11,s12,-s13)*\
446
G(i0,s0,-s10)*G(i6,s7,-s8)*G(i7,s8,-s9)*\
447
G(i2,s2,-s3)*G(i12,s13,-s14)*G(i3,s3,-s4)*G(i5,s6,-s7)
448
r = get_lines(t, DiracSpinorIndex)
449
assert r == ([[4, 6, 11, 3], [5, 10, 12, 2]], [[1, 7], [0, 13, 8, 9]], [])
451
def test_simplify_lines():
452
i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12 = tensor_indices('i0:13', G.LorentzIndex)
453
s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16 = \
454
tensor_indices('s0:17', DiracSpinorIndex)
456
g = G.LorentzIndex.metric
457
Sdelta = DiracSpinorIndex.delta
458
t = G(i1,s1,-s2)*G(i2,s2,-s1)*G(i3,s4,-s5)*G(i4,s5,-s6)*G(i5,s7,-s8)
459
r = G.simplify_lines(t)
460
assert r.equals(4*G(i5, s7, -s8)*G(i3, s4, -s0)*G(i4, s0, -s6)*g(i1, i2))
462
t = G(i1,s1,-s2)*G(i2,s2,-s1)*G(i3,s4,-s5)*G(-i3,s5,-s6)*G(i5,s7,-s8)
463
r = G.simplify_lines(t)
464
assert r.equals(16*G(i5, s7, -s8)*Sdelta(s4, -s6)*g(i1, i2))
465
t = G(i1,s1,-s2)*G(i2,s2,-s1)*G(i3,s4,-s5)*G(i4,s5,-s6)*G(i5,s7,-s8)
466
r = G.simplify_lines(t)
467
assert r.equals(4*G(i5, s7, -s8)*G(i3, s4, s0)*G(i4, -s0, -s6)*g(i1, i2))
468
t = G(i5,s7,-s8)*G(i6,s9,-s10)*G(i1,s1,-s2)*G(i3,s4,-s5)*G(i2,s2,-s1)*G(i4,s5,-s6)*G(-i6,s10,-s9)
469
r = G.simplify_lines(t)
470
assert r.equals(64*G(i5, s7, -s8)*G(i3, s4, s0)*G(i4, -s0, -s6)*g(i1, i2))
471
t = G(i5,s7,-s8)*G(i6,s9,-s10)*G(i1,s1,-s2)*G(i7,s12,-s11)*G(i3,s4,-s5)*\
472
G(i2,s2,-s1)*G(i4,s5,-s6)*G(-i6,s10,-s9)*G(-i7,s11,-s13)
473
r = G.simplify_lines(t)
474
assert r.equals(256*G(i5, s7, -s8)*G(i3, s4, s0)*G(i4, -s0, -s6)*\
475
g(i1, i2)*Sdelta(s12,-s13))