out0: for (PrimitiveSubgraph sg : sgs) { int[] partition = sg.getPartition(); TIntHashSet points = new TIntHashSet(partition); boolean newSg = true, newGraph = false; if (points.equals(container.points)) { if (container.graphType != sg.getGraphType() || !Arrays.equals(container.partition, partition)) { fillGraphPrint(subgraphs.get(i).partition); matched.add(i); } else if (includes(partition, container.partition) && sg.getGraphType() == container.graphType) { subgraphs.add(new SubgraphContainer(sg.getGraphType(), partition, points, type)); else if (newGraph) fillGraphPrint(partition);
return new PrimitiveSubgraph(GraphType.Cycle, new int[]{pivot}); return new PrimitiveSubgraph(GraphType.Cycle, deque2array(positions)); return processGraph(pivot); return new PrimitiveSubgraph(GraphType.Cycle, deque2array(positions)); return new PrimitiveSubgraph(GraphType.Line, deque2array(positions));
if (filter.is(partition[iPartition].getGraphType())) break; if (iSubgraphPosition == currentSubgraph.size()) { ++iPartition; iSubgraphPosition = 0; break; int p = currentSubgraph.getPosition(iSubgraphPosition); if (isGamma(content.get(p))) gPositions.add(p); if (currentSubgraph.getGraphType() == GraphType.Cycle && g5Positions.size() == 1 && gPositions.size() == currentSubgraph.size() && g5Positions.first() != currentSubgraph.size() - 1) { int g5 = g5Positions.first(), size = currentSubgraph.size(); g5Positions.set(0, size - 1); for (int i = 0; i <= g5; ++i) gPositions.set(size - g5 - 1 + i, currentSubgraph.getPosition(i)); for (int i = g5 + 1; i < size; ++i) gPositions.set(i - g5 - 1, currentSubgraph.getPosition(i)); if (currentSubgraph.getGraphType() == GraphType.Cycle && gPositions.size() == currentSubgraph.size()) graphType = GraphType.Cycle;
private Tensor expandDiracStructures(final Tensor t) { FromChildToParentIterator iterator = new FromChildToParentIterator(t); Tensor current; while ((current = iterator.next()) != null) { if (!(current instanceof Product)) continue; //early termination if (!containsGammaOr5Matrices(current)) continue; Product product = (Product) current; //positions of matrices PrimitiveSubgraph[] partition = PrimitiveSubgraphPartition.calculatePartition(product.getContent(), matrixType); //traces (expand brackets) boolean containsTraces = false; traces: for (PrimitiveSubgraph subgraph : partition) { if (subgraph.getGraphType() != GraphType.Cycle) continue traces; //expand each cycle containsTraces = true; } if (containsTraces) iterator.set(multiply(product.getIndexlessSubProduct(), expandAndEliminate.transform(product.getDataSubProduct()))); } return iterator.result(); }
boolean somethingDone = false; for (PrimitiveSubgraph ps : subgraphs) { if (ps.getGraphType() == GraphType.Graph) throw new IllegalArgumentException("Not a product of matrices."); if (ps.getGraphType() != GraphType.Line) continue; int[] partition = ps.getPartition();
for (PrimitiveSubgraph subgraph : partition) { matched.clear(); if (subgraph.getGraphType() != GraphType.Line) continue; SpinorType left = isSpinor(pc.get(subgraph.getPosition(0))), right = isSpinor(pc.get(subgraph.getPosition(subgraph.size() - 1))); if (left == null && right == null) continue; for (int i = 0; i < subgraph.size(); ++i) { if (!isGamma(pc.get(subgraph.getPosition(i)))) continue; int mIndex = withMomentum(subgraph.getPosition(i), pc, st); if (mIndex != -1) { Tensor co = pc.get(mIndex); int gSize = subgraph.size(); Tensor spinors = product.select(momentums.toArray()); if (left != null) { spinors = multiply(spinors, pc.get(subgraph.getPosition(0))); --gSize; spinors = multiply(spinors, pc.get(subgraph.getPosition(subgraph.size() - 1))); --gSize; if (right == null || (left != null && matched.first() < subgraph.size() - matched.last())) { Tensor r = pc.get(subgraph.getPosition(i)); if (!isGammaOrGamma5(r)) { gammas = null;
private PrimitiveSubgraph processGraph(int pivot) { IntArrayList positions = new IntArrayList(); positions.add(pivot); IntArrayList stack = new IntArrayList(); stack.push(pivot); used.set(pivot); long[] contractions; Indices indices; int currentPivot, index, toTensorIndex; while (!stack.isEmpty()) { currentPivot = stack.pop(); indices = pc.get(currentPivot).getIndices(); contractions = fcs.contractions[currentPivot]; for (int i = contractions.length - 1; i >= 0; --i) { index = indices.get(i); if (getType(index) != type.getType()) continue; toTensorIndex = getToTensorIndex(contractions[i]); if (toTensorIndex == -1 || used.get(toTensorIndex)) continue; used.set(toTensorIndex); positions.add(toTensorIndex); stack.push(toTensorIndex); } } return new PrimitiveSubgraph(GraphType.Graph, positions.toArray()); }
for (PrimitiveSubgraph subgraph : subgraphs) { if (subgraph.getGraphType() != GraphType.Cycle) continue; int[] partition = subgraph.getPartition(); for (int i = partition.length - 1; i >= 0; --i) { partition[i] = sizeOfIndexless + partition[i];