Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Overfitting detection as an AbstractRepairStep component #1208

Merged
merged 2 commits into from
Apr 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,19 @@ public static void registerCommonArgs(JSAP jsap) throws JSAPException {
// --sequencerRepair
jsap.registerParameter(LauncherUtils.defineArgSequencerRepairMode());

// --patchRankingMode
jsap.registerParameter(LauncherUtils.defineArgPatchRankingMode());
// --patchClassification
jsap.registerParameter(LauncherUtils.defineArgPatchClassification());
// --patchClassificationMode
jsap.registerParameter(LauncherUtils.defineArgPatchClassificationMode());

// --patchFiltering
jsap.registerParameter(LauncherUtils.defineArgPatchFiltering());
// --patchFilteringMode
jsap.registerParameter(LauncherUtils.defineArgPatchFilteringMode());

// --odsPath
jsap.registerParameter(LauncherUtils.defineArgODSPath());

}

public static void initCommonConfig(RepairnatorConfig config, JSAPResult arguments) {
Expand Down Expand Up @@ -229,7 +240,12 @@ public static void initCommonConfig(RepairnatorConfig config, JSAPResult argumen
config.setNPEScope(LauncherUtils.getArgNPEScope(arguments));
config.setNPERepairStrategy(LauncherUtils.getArgNPERepairStrategy(arguments));

config.setPatchRankingMode(LauncherUtils.getArgPatchRankingMode(arguments));
config.setPatchClassificationMode(LauncherUtils.getArgPatchClassificationMode(arguments));
config.setPatchClassification(LauncherUtils.getArgPatchClassification(arguments));
config.setPatchFiltering(LauncherUtils.getArgPatchFiltering(arguments));
config.setPatchFilteringMode(LauncherUtils.getArgPatchFilteringMode(arguments));

config.setODSPath(LauncherUtils.getArgODSPath(arguments).getAbsolutePath());
}

public static Switch defineArgHelp() {
Expand Down Expand Up @@ -947,17 +963,71 @@ public static String getArgNPERepairStrategy(JSAPResult arguments) {
return arguments.getString("npeRepairStrategy");
}

public static FlaggedOption defineArgPatchRankingMode() {
FlaggedOption opt = new FlaggedOption("patchRankingMode");
opt.setLongFlag("patchRankingMode");
public static FlaggedOption defineArgODSPath() {
FlaggedOption opt = new FlaggedOption("odsPath");
opt.setLongFlag("odsPath");
opt.setDefault("./repairnator-output/ODSPatches");
opt.setStringParser(JSAP.STRING_PARSER);
opt.setDefault(RepairnatorConfig.PATCH_RANKING_MODE.NONE.name());
opt.setHelp("Possible string values NONE, OVERFITTING.");
opt.setHelp("Path for ODS output");
return opt;
}

public static String getArgPatchRankingMode(JSAPResult arguments) {
return arguments.getString("patchRankingMode");
public static File getArgODSPath(JSAPResult arguments) {
File output = new File(arguments.getString("odsPath"));
if (!output.exists()) {
output.mkdirs();
}
return output;
}

public static Switch defineArgPatchClassification() {
Switch sw = new Switch("patchClassification");
sw.setLongFlag("patchClassification");
sw.setDefault("false");
sw.setHelp("Classify repair patches using the defined mode.");
return sw;
}

public static boolean getArgPatchClassification(JSAPResult arguments) {
return arguments.getBoolean("patchClassification");
}

public static FlaggedOption defineArgPatchClassificationMode() {
FlaggedOption opt = new FlaggedOption("patchClassificationMode");
opt.setLongFlag("patchClassificationMode");
opt.setStringParser(JSAP.STRING_PARSER);
opt.setDefault(RepairnatorConfig.PATCH_CLASSIFICATION_MODE.NONE.name());
opt.setHelp("Possible string values NONE, ODS.");
return opt;
}

public static RepairnatorConfig.PATCH_CLASSIFICATION_MODE getArgPatchClassificationMode(JSAPResult arguments) {
return RepairnatorConfig.PATCH_CLASSIFICATION_MODE.valueOf(arguments.getString("patchClassificationMode"));
}

public static Switch defineArgPatchFiltering() {
Switch sw = new Switch("patchFiltering");
sw.setLongFlag("patchFiltering");
sw.setDefault("false");
sw.setHelp("Filter repair patches using the defined mode.");
return sw;
}

public static boolean getArgPatchFiltering(JSAPResult arguments) {
return arguments.getBoolean("patchFiltering");
}

public static FlaggedOption defineArgPatchFilteringMode() {
FlaggedOption opt = new FlaggedOption("patchFilteringMode");
opt.setLongFlag("patchFilteringMode");
opt.setStringParser(JSAP.STRING_PARSER);
opt.setDefault(RepairnatorConfig.PATCH_FILTERING_MODE.NONE.name());
opt.setHelp("Possible string values NONE, ODS_CORRECT.");
return opt;
}

public static RepairnatorConfig.PATCH_FILTERING_MODE getArgPatchFilteringMode(JSAPResult arguments) {
return RepairnatorConfig.PATCH_FILTERING_MODE.valueOf(arguments.getString("patchFilteringMode"));
}

public static void checkPushUrlArg(JSAP jsap, JSAPResult arguments, LauncherType launcherType) {
Expand All @@ -969,7 +1039,6 @@ public static void checkPushUrlArg(JSAP jsap, JSAPResult arguments, LauncherType
}
}


public static void printUsage(JSAP jsap, LauncherType launcherType) {
String moduleName = "repairnator-" + launcherType.name().toLowerCase();
System.err.println("Usage: java <" + moduleName + " name> [option(s)]");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ public String getKlass() {
}
}

public enum PATCH_RANKING_MODE {
public enum PATCH_CLASSIFICATION_MODE {
NONE,
OVERFITTING
ODS
}

public enum PATCH_CLASSIFICATION_MODE {
public enum PATCH_FILTERING_MODE {
NONE,
ODS
ODS_CORRECT
}

/**
Expand Down Expand Up @@ -116,6 +116,7 @@ public enum SORALD_REPAIR_MODE {
private String localMavenRepository;
private String jTravisEndpoint;
private String travisToken;
private String ODSPath;

private String gitRepositoryUrl;
private String gitRepositoryBranch;
Expand All @@ -134,10 +135,10 @@ public enum SORALD_REPAIR_MODE {
private String npeScope;
private String npeRepairStrategy;

private PATCH_RANKING_MODE patchRankingMode;

private PATCH_CLASSIFICATION_MODE patchClassificationMode;

private PATCH_FILTERING_MODE patchFilteringMode;
private boolean patchClassification;
private boolean patchFiltering;

// Dockerpool
private String dockerImageName;
Expand Down Expand Up @@ -808,35 +809,6 @@ public void setNPERepairStrategy(String npeRepairStrategy) {
this.npeRepairStrategy = npeRepairStrategy;
}

public PATCH_RANKING_MODE getPatchRankingMode() {
return patchRankingMode;
}


public void setPatchRankingMode(String patchRankingMode) {
for (PATCH_RANKING_MODE mode: PATCH_RANKING_MODE.values()) {
if (patchRankingMode.equals(mode.name())) {
this.patchRankingMode = PATCH_RANKING_MODE.valueOf(patchRankingMode);
return;
}
}
throw new RuntimeException("unknown patch ranking mode: " + patchRankingMode);
}

public PATCH_CLASSIFICATION_MODE getPatchClassificationMode() {
return patchClassificationMode;
}

public void setPatchClassificationMode(String patchClassificationMode) {
for (PATCH_CLASSIFICATION_MODE mode: PATCH_CLASSIFICATION_MODE.values()) {
if (patchClassificationMode.equals(mode.name())) {
this.patchClassificationMode = PATCH_CLASSIFICATION_MODE.valueOf(patchClassificationMode);
return;
}
}
throw new RuntimeException("unknown patch classification mode: " + patchClassificationMode);
}

@Override
public String toString() {
String ghToken = this.getGithubToken();
Expand Down Expand Up @@ -907,7 +879,6 @@ public String toString() {
", mavenHome=" + mavenHome +
", localMavenRepository=" + localMavenRepository +
", noTravisRepair=" + noTravisRepair +
", rankPatches=" + patchRankingMode +
", jTravisEndpoint=" + jTravisEndpoint +
", travisToken=" + travisToken +
'}';
Expand Down Expand Up @@ -1006,4 +977,44 @@ public String getTravisToken() {
public void setTravisToken(String travisToken) {
this.travisToken = travisToken;
}

public String getODSPath() {
return ODSPath;
}

public void setODSPath(String ODSPath) {
this.ODSPath = ODSPath;
}

public PATCH_CLASSIFICATION_MODE getPatchClassificationMode() {
return patchClassificationMode;
}

public void setPatchClassificationMode(PATCH_CLASSIFICATION_MODE patchClassificationMode) {
this.patchClassificationMode = patchClassificationMode;
}

public boolean isPatchClassification() {
return patchClassification;
}

public void setPatchClassification(boolean patchClassification) {
this.patchClassification = patchClassification;
}

public PATCH_FILTERING_MODE getPatchFilteringMode() {
return patchFilteringMode;
}

public void setPatchFilteringMode(PATCH_FILTERING_MODE patchFilteringMode) {
this.patchFilteringMode = patchFilteringMode;
}

public boolean isPatchFiltering() {
return patchFiltering;
}

public void setPatchFiltering(boolean patchFiltering) {
this.patchFiltering = patchFiltering;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ public enum RAW_URL_SOURCE {
public final String collectorPath;
public final int contextSize;
public final RAW_URL_SOURCE rawURLSource;
public final String ODSPath;

private static SequencerConfig instance;

Expand All @@ -31,7 +30,6 @@ private SequencerConfig(){
this.collectorPath = getEnvOrDefault("SEQUENCER_COLLECTOR_PATH",
System.getProperty("user.home") + "/continuous-learning-data");
this.contextSize = Integer.parseInt(getEnvOrDefault("SEQUENCER_CONTEXT_SIZE", "3"));
this.ODSPath = (getEnvOrDefault("SEQUENCER_ODS_PATH", RepairnatorConfig.getInstance().getOutputPath() + "/ODSPatches"));
this.rawURLSource = parseRawURLSource();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ public RunnablePipelineContainer(DockerPoolManager poolManager, String imageId,
this.envValues.add("SEQUENCER_THREADS=" + sequencerConfig.threads);
this.envValues.add("SEQUENCER_BEAM_SIZE=" + sequencerConfig.beamSize);
this.envValues.add("SEQUENCER_TIMEOUT=" + sequencerConfig.timeout);
this.envValues.add("SEQUENCER_ODS_PATH=" + sequencerConfig.ODSPath);
}
}

Expand Down Expand Up @@ -167,7 +166,7 @@ public void run() {
.appendBinds(HostConfig.Bind
.builder()
.from(ODSVolume)
.to(SequencerConfig.getInstance().ODSPath)
.to(RepairnatorConfig.getInstance().getODSPath())
.build())
.build();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
package fr.inria.spirals.repairnator.process.inspectors;

import com.google.gson.JsonElement;
import fr.inria.spirals.repairnator.config.RepairnatorConfig;
import fr.inria.spirals.repairnator.config.RepairnatorConfig.PATCH_RANKING_MODE;
import fr.inria.spirals.repairnator.process.inspectors.properties.Properties;
import fr.inria.spirals.repairnator.process.inspectors.properties.features.Features;
import fr.inria.spirals.repairnator.process.inspectors.properties.tests.FailureDetail;
import fr.inria.spirals.repairnator.process.step.StepStatus;
import fr.inria.spirals.repairnator.process.testinformation.FailureLocation;
import fr.inria.spirals.repairnator.states.PushState;
import org.apache.maven.model.Plugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.maven.model.Plugin;

import java.io.File;
import java.net.URL;
import java.util.*;
Expand Down Expand Up @@ -276,23 +273,6 @@ public List<RepairPatch> getAllPatches() {
return allPatches;
}

public List<RepairPatch> getRankedPatches() {
return getRankedPatches(Features.P4J);
}

protected List<RepairPatch> getRankedPatches(Features features) {
List<RepairPatch> allPatches = getAllPatches();
PATCH_RANKING_MODE patchRankingMode = RepairnatorConfig.getInstance().getPatchRankingMode();

switch (patchRankingMode){
case OVERFITTING:
allPatches.sort(RepairPatch.rankByOverfittingWithFeatures(features));
break;
}
return allPatches;
}


protected List<RepairPatch> getCorrectnessLabeledPatches(Features features, String buildId) {
List<RepairPatch> allPatches = getAllPatches();
return RepairPatch.classifyByODSWithFeatures(allPatches, buildId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import fr.inria.coming.codefeatures.RepairnatorFeatures;
import fr.inria.coming.codefeatures.RepairnatorFeatures.ODSLabel;
import fr.inria.coming.main.ComingProperties;
import fr.inria.spirals.repairnator.config.RepairnatorConfig;
import fr.inria.spirals.repairnator.config.SequencerConfig;
import fr.inria.spirals.repairnator.process.inspectors.properties.features.Features;
import fr.inria.spirals.repairnator.process.inspectors.properties.features.Overfitting;
Expand All @@ -23,7 +24,6 @@

public class RepairPatch {

static final String ODSPath = SequencerConfig.getInstance().ODSPath;
protected static Logger log = Logger.getLogger(Thread.currentThread().getName());

/**
Expand Down Expand Up @@ -145,11 +145,6 @@ public int hashCode() {
return Objects.hash(toolname, filePath, diff);
}

// ranking algorithms
public static Comparator<RepairPatch> rankByOverfittingWithFeatures(Features features) {
return (x, y) -> overfittingSort(x, y, features);
}

private static int overfittingSort(RepairPatch patch1, RepairPatch patch2, Features features) { // ascending
double score1 = patch1.getOverfittingScore(features);
double score2 = patch2.getOverfittingScore(features);
Expand All @@ -164,9 +159,11 @@ private static int overfittingSort(RepairPatch patch1, RepairPatch patch2, Featu

// ODS classification
public static List<RepairPatch> classifyByODSWithFeatures(List<RepairPatch> allPatches, String buildId) {
String ODSPath = RepairnatorConfig.getInstance().getODSPath();

File f = new File(ODSPath);
f.mkdir();
f.mkdirs();


int len = allPatches.size();

Expand All @@ -192,8 +189,9 @@ public static List<RepairPatch> classifyByODSWithFeatures(List<RepairPatch> allP
}

private ODSLabel computeODSLabel(int patchId, String buildId) {

ODSLabel label = ODSLabel.UNKNOWN;
String ODSPath = RepairnatorConfig.getInstance().getODSPath();

ODSLabel label = ODSLabel.UNKNOWN;

try {
File buggyFile = new File(filePath);
Expand All @@ -218,7 +216,7 @@ private ODSLabel computeODSLabel(int patchId, String buildId) {

// create a directory to store the patch: "patches/"+buildId+patchId
String buggyClassName = buggyFile.getName().replace(".java", "");
String odsFilesPath = SequencerConfig.getInstance().ODSPath;
String odsFilesPath = ODSPath;

String patchPath = odsFilesPath + "/" + buildId + "-" + patchId;
Path path = Paths.get(patchPath + '/' + buggyClassName);
Expand Down
Loading