private void matchViaOperator(ArrayList<DataNGram> ngrams) {
		DataNGram firstNGram = ngrams.get(0);
		for (DataNGram ngram : ngrams) {
			DataVertex vertLeft = ngram.root;
			if (vertLeft.graph.side != Side.LEFT) {
				continue;
			}
			for (int j = 0; j < vertLeft.sinks.size(); ++j) {
				DataVertex opVertLeft = vertLeft.sinks.get(j);
				if (!opVertLeft.isOp() || !opVertLeft.isCommutative() || !opVertLeft.paired) {
					continue;
				}
				DataVertex opVertRight = pinMap.get(opVertLeft);
				if (opVertLeft.sources.size() != opVertRight.sources.size()) {
					continue;
				}
				for (int i = 0; i < opVertLeft.sources.size(); ++i) {
					DataVertex tVertLeft = opVertLeft.sources.get(i);
					DataVertex tVertRight = opVertRight.sources.get(i);
					if (tVertLeft.paired || tVertRight.paired) {
						continue;
					}
					int index = tVertLeft.ngrams.size() - 1;
					if (!tVertLeft.ngrams.get(index).equalHash(firstNGram)) {
						continue;
					}
					if (!tVertRight.ngrams.get(index).equalHash(firstNGram)) {
						continue;
					}
					ngramPinner(tVertLeft, tVertRight, firstNGram.depth);
				}
			}
		}
	}
Try to pair vertices that are inputs to the same commutative operator.
Reaching here, the vertices could not be distinguished by any other method, so
we order the vertices based on their input slot to the operator.
@param ngrams is the set of matching n-grams
Ghidra/Features/CodeCompare/src/main/java/ghidra/features/codecompare/graphanalysis/Pinning.java