boolean apply(MetricWrapper mK) { for (int i = 0; i < 2; ++i) for (int j = 0; j < 2; ++j) if ((indices[i] ^ mK.indices[j]) == 0x80000000) { metric = Tensors.createMetricOrKronecker(indices[1 - i], mK.indices[1 - j]); indices[i] = mK.indices[1 - j]; Arrays.sort(this.indices); return true; } return false; }
@Override public MetricWrapper clone() { Tensor t = Tensors.createMetricOrKronecker(indices[0], indices[1]); return new MetricWrapper(indices[0], indices[1], t); }
private static Tensor average(final int[] indices) { if (indices.length == 0) return Complex.ONE; if (indices.length == 2) return Tensors.createMetricOrKronecker(indices[0], indices[1]); SumBuilder sb = new SumBuilder(); for (int i = 1; i < indices.length; ++i) { int[] suffix = new int[indices.length - 2]; System.arraycopy(indices, 1, suffix, 0, i - 1); System.arraycopy(indices, i + 1, suffix, i - 1, indices.length - i - 1); sb.put(Tensors.multiply(Tensors.createMetricOrKronecker(indices[0], indices[i]), average(suffix))); } return sb.build(); }
private Tensor metric(Tensor[] gammas) { return multiply( //metric createMetricOrKronecker(gammas[0].getIndices().get(metricType, 0), gammas[1].getIndices().get(metricType, 0)), //matrix createMetricOrKronecker(gammas[0].getIndices().getUpper().get(matrixType, 0), gammas[1].getIndices().getLower().get(matrixType, 0))); }
private Tensor traceOfArray(Tensor[] data) { //calculates trace using recursive algorithm if (data.length == 1) return Complex.ZERO; if (data.length == 2) return multiply(traceOfOne.get(1), createMetricOrKronecker(data[0].getIndices().get(metricType, 0), data[1].getIndices().get(metricType, 0))); if (data.length % 2 != 0) return Complex.ZERO; SumBuilder sb = new SumBuilder(); Tensor temp; for (int i = 0; i < data.length - 1; ++i) { temp = multiply(Complex.TWO, createMetricOrKronecker(data[i].getIndices().get(metricType, 0), data[i + 1].getIndices().get(metricType, 0)), traceOfArray(subArray(data, i, i + 1))); if (i % 2 != 0) temp = negate(temp); sb.put(temp); swap(data, i, i + 1); } return multiply(Complex.ONE_HALF, sb.build()); }
@Override protected Tensor transformLine(ProductOfGammas pg, IntArrayList modifiedElements) { //single matrix if (pg.length == 1) return null; //no g5s if (pg.g5Positions.isEmpty()) return null; if (pg.g5Positions.size() == 1) { //single g5 in trace -> nothing to do if (pg.graphType == GraphType.Cycle) return null; //single g5 at the last position -> nothing to do if (pg.g5Positions.first() == pg.length - 1) return null; } if (pg.g5Positions.size() == pg.length) {//only g5s if (pg.length % 2 == 0) { //all gammas cancel if (pg.graphType == GraphType.Cycle) return traceOfOne.get(1); else return createMetricOrKronecker(pg.getIndices().getFree()); } else { assert pg.graphType != GraphType.Cycle;//this should be already processed return setMatrixIndices((SimpleTensor) pg.pc.get(pg.gPositions.first()), pg.getIndices().getFree()); } } return simplifyProduct(pg.toList()); }
getNameWithoutType(gammas[j + 1].getIndices().get(metricType, 0))) { Tensor metric = multiply(Complex.TWO, createMetricOrKronecker(gammas[j].getIndices().get(metricType, 0), gammas[j + 1].getIndices().get(metricType, 0))); Tensor[] cadj = cutAdj(gammas, j); Tensor adj; if (cadj.length == 0) adj = createMetricOrKronecker(gammas[j].getIndices().getUpper().get(matrixType, 0), gammas[j + 1].getIndices().getLower().get(matrixType, 0)); else if (cadj.length == 1)
createMetricOrKronecker(gammas[index - 1].getIndices().get(metricType, 0), gammas[index].getIndices().get(metricType, 0))); Tensor[] cadj = cutAdj(gammas, index - 1); Tensor adj; if (cadj.length == 0) adj = createMetricOrKronecker(gammas[index - 1].getIndices().getUpper().get(matrixType, 0), gammas[index].getIndices().getLower().get(matrixType, 0)); else if (cadj.length == 1)
createMetricOrKronecker(gammas[index].getIndices().get(metricType, 0), gammas[index + 1].getIndices().get(metricType, 0))); Tensor[] cadj = cutAdj(gammas, index); Tensor adj; if (cadj.length == 0) adj = createMetricOrKronecker(gammas[index].getIndices().getUpper().get(matrixType, 0), gammas[index + 1].getIndices().getLower().get(matrixType, 0)); else if (cadj.length == 1)
ProductBuilder builder = new ProductBuilder(0, length); for (i = 0; i < length; ++i) builder.put(createMetricOrKronecker(allFreeArgIndices[i], allFreeVarIndices[i])); derivative = new SubstitutionTransformation(symmetric, builder.build()).transform(derivative); this.derivative = derivative;