Welcome to Cadabra Q&A, where you can ask questions and receive answers from other members of the community.
+1 vote

Hi.

I am having trouble using join_gamma() with expand=False and use_gendelta=True. I am using these conditions to reduce the number of terms resulting from gamma arithmetic (particularly in a function calculating various gamma products), but in certain situations in which symmetrizations/generalized deltas contract out, the coefficients seem incorrect, and inconsistent with the coefficients given by join_gamma() with expand=True and use_gendelta=False (i.e., the default conditions). For example, the code below with the default conditions (and the usual post_process() in the documentation)

ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex)
    distribute(ex)
ex;

gives

-Γ_{a}^{b} Γ^{d}_{b}
9Γ_{a}^{d} + 10δ_{a}^{d}

but

ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex, expand=False, use_gendelta=True)
    distribute(ex)
ex;
expand_delta(ex);

gives

-Γ_{a}^{b} Γ^{d}_{b}
-4Γ_{a}^{d} + 2δ_{a}^{d b}_{b}
-4Γ_{a}^{d} + 10δ_{a}^{d}

Setting expand=True resolves the issue (but will obviously not reduce terms in the other products handled by my function), as in the code below,

ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex, use_gendelta=True)
    distribute(ex)
ex;
expand_delta(ex);

which gives

-Γ_{a}^{b} Γ^{d}_{b}
9Γ_{a}^{d} + 2δ_{a}^{d b}_{b}
9Γ_{a}^{d} + 10δ_{a}^{d}

It seems as though the implicit (anti)symmetrization given with expand=False is not being recognized by the next loop of join_gamma(). Am I making a mistake in handling implicit symmetrization in Cadabra? Is there a way to avoid this coefficient inconsistency while still using expand=False more or less indiscriminately?

The full code for the above tests is shown below.

{a,b,c,d,e}::Indices(vector);
{a,b,c,d,e}::Integer(0..11-1);
\Gamma_{#}::GammaMatrix(metric=\delta);
\delta{#}::KroneckerDelta

def post_process(ex):
    sort_product(ex)
    eliminate_kronecker(ex)
    canonicalise(ex)
    collect_terms(ex)

print('\ntest 1')
ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex)
    distribute(ex)
ex;

print('\ntest 2')
ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex, expand=False, use_gendelta=True)
    distribute(ex)
ex;
expand_delta(ex);

print('\ntest 3')
ex := \Gamma_{a b} \Gamma^{b d};
converge(ex):
    join_gamma(ex, use_gendelta=True)
    distribute(ex)
ex;
expand_delta(ex);

Thanks in advance.

-Simon

in General questions by (250 points)

1 Answer

+2 votes
 
Best answer

It seems as though the implicit (anti)symmetrization given with expand=False is not being recognized by the next loop of join_gamma().

That's correct. There is no such thing as 'an expression with implicit anti-symmetrisation' in the sense that Cadabra still knows about it. I have had this on the todo list for a long time, and there has been some basic infrastructure for that internally, but it never really materialised. So in effect, you can only use expand=False at the very last step of a gamma join.

by (76.4k points)
selected by
...