@Override
	public Boolean process(Address item, TaskMonitor monitor) throws Exception {
		List<Feature> trainingVector = ModelTrainingUtils.getFeatureVector(program, item,
			numPreBytes, numInitialBytes, includeBitFeatures);
		if (trainingVector.isEmpty()) {
			return null;
		}
		ArrayExample<Label> vec = new ArrayExample<>(label, trainingVector);

		int numAgree = 0;
		int numDisagree = 0;
		for (int i = 0; i < numModels; i++) {
			Model<Label> model = ensemble.getModels().get(i);
			Prediction<Label> pred = model.predict(vec);
			if (pred.getOutput().equals(label)) {
				numAgree += 1;
			}
			else {
				numDisagree += 1;
			}
			if (numAgree == (numModels + 1) / 2) {
				return true;
			}
			if (numDisagree == (numModels / 2) + 1) {
				return false;
			}
		}
		throw new AssertionError("did not return value");
	}
Create a new evaluator
@param ensemble ensemble to evaluate
@param p program containing addresses to test
@param numPreBytes number of bytes before address
@param numInitialBytes number of bytes after and including address
@param includeBitFeatures whether to include bit-level features
@param label target label
Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/EnsembleEvaluatorCallback.java