private PotentialPair analyze(FunctionPair pair, NeighborGenerator[] generatorList) {
		FunctionNode sourceNode = pair.getSourceNode();
		FunctionNode destNode = pair.getDestNode();
		double confResult = pair.getConfResult();

		double implicationScore = 0;
		PotentialPair bestImplied = null;

		for (NeighborGenerator generator : generatorList) {
			NeighborhoodPair nPair = generator.generate(sourceNode, destNode);
			PotentialPair srcToDestPair =
				calculateBestNeighbor(nPair.srcNeighbors, nPair.destNeighbors, confResult);
			if (srcToDestPair.getScore() > implicationScore) {
				implicationScore = srcToDestPair.getScore();
				bestImplied = srcToDestPair;
			}
			PotentialPair destToSrcPair =
				calculateBestNeighbor(nPair.destNeighbors, nPair.srcNeighbors, confResult);
			destToSrcPair.swap();		// PotentialPair is returned with opposite from and to nodes
			if (destToSrcPair.getScore() > implicationScore) {
				implicationScore = destToSrcPair.getScore();
				bestImplied = destToSrcPair;
			}
		}
		if (bestImplied != null) {
			bestImplied.setOrigin(pair);
		}
		return bestImplied;
	}
Given an accepted FunctionPair and methods for generating neighborhoods,
For each generation method, generate a source neighborhood and a dest neighborhood
and search for pairs between the two neighborhoods with the highest confidence score.

@param pair is the accepted FunctionPair
@param generatorList is the list of neighborhood generators
@return the highest confidence pair across all pairs of neighborhoods
Ghidra/Features/VersionTrackingBSim/src/main/java/ghidra/feature/vt/api/BSimProgramCorrelatorMatching.java