TableauSymmetry with symmetrisation and antisymmetrisation exchanged

The command

$\texttt{K_{i j k}::TableauSymmetry( shape={2,1}, indices={1,2,0} );}$

defines a tensor which is antisymmetric in $i$ and $j$ and satisfies the Bianchi identity. How can I define a tensor which is symmetric in $i$ and $j$ and satisfies the Bianchi identity?

Apparently, $\texttt{cadabra}$ uses the convention "first symmetrise over rows, then antisymmetrise over columns" for filled Young tableaux, whereas I need the opposite convention, i.e."first antisymmetrise over columns, then symmetrise over rows".

edited

+1 vote

At the moment this is baked in, but it wouldn't be difficult (and probably a good idea) to add an option to choose between the two conventions. I will put it on the TODO list, but in case you want to give it a shot yourself (given our email correspondence), here are some pointers.

The actual projector logic used by e.g. young_project sits in core/YoungTab.hh, see

You would then also need to give TableauSymmetry an extra optional argument to choose between the two conventions. That's done in

You would then propagate the value of that option to the tableaux stored in the TableauSymmetry.tabs vector.
There is some independent logic in core/algorithms/canonicalise.cc for the signs; that either needs changing as well or simply needs tidying up (canonicalise.cc deduces simple (mono-term) symmetries from tableaux by itself because it does not know how to deal with the more general multi-term (Garnir) symmetries, and I was lazy to abstract that logic and move it into YoungTab.hh).