GP-2906_James_exhaust_function_interiors

This commit is contained in:
James 2022-12-01 18:02:28 +00:00
parent 703043dbf2
commit d6352a3247
2 changed files with 35 additions and 3 deletions

View file

@ -277,15 +277,18 @@ public class RandomForestTrainingTask extends Task {
monitor.setMessage( monitor.setMessage(
"Selecting " + numEntries * factor + " random addresses within function interiors"); "Selecting " + numEntries * factor + " random addresses within function interiors");
start = System.nanoTime(); start = System.nanoTime();
AddressSetView randomFuncInteriors = long numInteriors = numEntries * factor;
RandomSubsetUtils.randomSubset(selectableInteriors, numEntries * factor, monitor);
AddressSetView randomFuncInteriors = numInteriors < selectableInteriors.getNumAddresses()
? RandomSubsetUtils.randomSubset(selectableInteriors, numInteriors, monitor)
: selectableInteriors;
end = System.nanoTime(); end = System.nanoTime();
Msg.info(this, String.format("factor: %d elapsed selecting random interiors: %g seconds", Msg.info(this, String.format("factor: %d elapsed selecting random interiors: %g seconds",
factor, (end - start) / NANOSECONDS_PER_SECOND)); factor, (end - start) / NANOSECONDS_PER_SECOND));
trainingNegative = trainingNegative.union(randomFuncInteriors); trainingNegative = trainingNegative.union(randomFuncInteriors);
if (trainingNegative.isEmpty()) { if (trainingNegative.isEmpty()) {
Msg.showError(this, null, "Data Gathering Error", Msg.showError(this, null, "Data Gathering Error",
"No function interiors in training set"); "No non-starts in training set for sampling factor " + factor);
return null; return null;
} }
if (trainingPositive.intersects(trainingNegative)) { if (trainingPositive.intersects(trainingNegative)) {

View file

@ -358,4 +358,33 @@ public class RandomForestTrainingTaskTest extends AbstractProgramBasedTest {
assertTrue(data.getTestNegative().contains(definedData)); assertTrue(data.getTestNegative().contains(definedData));
} }
@Test
public void testExhaustingFunctionInteriors() throws CancelledException {
params = new FunctionStartRFParams(program);
params.setMaxStarts(5);
int tooBig = 10;
Address begin = program.getSymbolTable().getSymbols("entry").next().getAddress();
AddressSet entries = new AddressSet();
for (int i = 0; i < 10; ++i) {
entries.add(begin.add(i));
}
AddressSet interiors = new AddressSet();
for (int i = 10; i < 25; ++i) {
interiors.add(begin.add(i));
}
AddressSet definedData = new AddressSet();
for (int i = 25; i < 30; ++i) {
definedData.add(begin.add(i));
}
RandomForestTrainingTask task = new RandomForestTrainingTask(program, params, null,
RandomForestFunctionFinderPlugin.TEST_SET_MAX_SIZE_DEFAULT);
TrainingAndTestData data =
task.getTrainingAndTestData(entries, interiors, definedData, tooBig, TaskMonitor.DUMMY);
assertTrue(data.getTrainingPositive().getNumAddresses() == 5);
assertTrue(data.getTestPositive().getNumAddresses() == 5);
assertTrue(data.getTestPositive().union(data.getTrainingPositive()).equals(entries));
assertTrue(data.getTrainingNegative().equals(interiors));
assertTrue(data.getTestNegative().equals(definedData));
}
} }