public static List<Feature> getFeatureVector(Program program, Address address, int numPreBytes,
			int numInitialBytes, boolean includeBitFeatures) {
		MemoryBlock block = program.getMemory().getBlock(address);
		byte[] preBytesArray = new byte[numPreBytes];
		byte[] initialBytesArray = new byte[numInitialBytes];
		List<Feature> trainingVector = new ArrayList<>();
		try {
			Address preStart = address.add(-numPreBytes);
			block.getBytes(preStart, preBytesArray);
			block.getBytes(address, initialBytesArray);
		}
		catch (MemoryAccessException | AddressOutOfBoundsException e) {
			//most likely an exception means that you are trying to read beyond a block
			//boundary.  This will happen occasionally when the sliding window is near the
			//begining or end of a block.  
			Msg.warn(RandomForestTrainingTask.class,
				"MemoryAccessException at " + address.toString());
			return trainingVector;
		}

		for (int i = 0; i < numPreBytes; i++) {
			int currentByte = Byte.toUnsignedInt(preBytesArray[i]);
			trainingVector.add(new Feature("pbyte_" + i, currentByte));
			if (!includeBitFeatures) {
				continue;
			}
			for (int bit = 7; bit >= 0; bit--) {
				String featureName = "pbit_" + i + "_" + bit;
				double val = ((currentByte & (1 << bit)) > 0) ? ONE : ZERO;
				trainingVector.add(new Feature(featureName, val));
			}
		}
		for (int i = 0; i < numInitialBytes; i++) {
			int currentByte = Byte.toUnsignedInt(initialBytesArray[i]);
			trainingVector.add(new Feature("ibyte_" + i, currentByte));
			if (!includeBitFeatures) {
				continue;
			}
			for (int bit = 7; bit >= 0; bit--) {
				String featureName = "ibit_" + i + "_" + bit;
				double val = ((currentByte & (1 << bit)) > 0) ? ONE : ZERO;
				trainingVector.add(new Feature(featureName, val));
			}
		}
		return trainingVector;
	}
Creates a feature vector consisting of byte-level and optionally bit-level features around 
{@code address}
@param program source program
@param address address
@param numPreBytes number of bytes to use preceding {@code address}
@param numInitialBytes number of bytes to use including and after address
@param includeBitFeatures whether to include bit-level features
@return feature vector
Ghidra/Extensions/MachineLearning/src/main/java/ghidra/machinelearning/functionfinding/ModelTrainingUtils.java