final Tensor dimension) {
checkUnitaryInput(unitaryMatrix, structureConstant, symmetricConstant, dimension);
final IndexType[] types = extractTypesFromMatrix(unitaryMatrix);
ChangeIndicesTypesAndTensorNames tokenTransformer = new ChangeIndicesTypesAndTensorNames(new TypesAndNamesTransformer() {
@Override
public IndexType newType(IndexType oldType, NameAndStructureOfIndices old) {
if (oldType == IndexType.LatinLower)
return types[0];
if (oldType == IndexType.Matrix1)
return types[1];
return oldType;
}
@Override
public String newName(NameAndStructureOfIndices old) {
switch (old.getName()) {
case unitaryMatrixName:
return unitaryMatrix.getStringName();
case structureConstantName:
return structureConstant.getStringName();
case symmetricConstantName:
return symmetricConstant.getStringName();
case dimensionName:
if (!(dimension instanceof Complex))
return dimension.toString(OutputFormat.Redberry);
default:
return old.getName();
}
}
});
//simplifications with SU(N) combinations
ArrayList<Transformation> unitarySimplifications = new ArrayList<>();
if (dimension instanceof Complex) {
Transformation nSub = parseExpression("N = " + dimension);
for (ParseToken substitution : unitarySimplificationsTokens)
unitarySimplifications.add((Transformation) nSub.transform(tokenTransformer.transform(substitution).toTensor()));
} else
for (ParseToken substitution : unitarySimplificationsTokens)
unitarySimplifications.add((Transformation) tokenTransformer.transform(substitution).toTensor());
//all simplifications
ArrayList<Transformation> simplifications = new ArrayList<>();
simplifications.add(EliminateMetricsTransformation.ELIMINATE_METRICS);
simplifications.addAll(unitarySimplifications);