Skip to content

Commit

Permalink
Remove aggregated averages for TLR / ID
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed Aug 21, 2024
1 parent ad6fe32 commit dce83a9
Show file tree
Hide file tree
Showing 12 changed files with 65 additions and 239 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ private ResultCalculatorUtil() {
throw new IllegalAccessError();
}

public static <T> EvaluationResults<T> calculateAverageResults(ImmutableList<EvaluationResults<T>> results) {
public static <T> EvaluationResults<T> calculateMacroAverageResults(ImmutableList<EvaluationResults<T>> results) {
var averages = getAverages(results);
if (averages == null)
return null;
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import static edu.kit.kastel.mcse.ardoco.tlr.tests.integration.TraceLinkEvaluationIT.DATA_MAP;
import static edu.kit.kastel.mcse.ardoco.tlr.tests.integration.TraceLinkEvaluationIT.OUTPUT;
import static edu.kit.kastel.mcse.ardoco.tlr.tests.integration.TraceLinkEvaluationIT.PROJECT_RESULTS;
import static edu.kit.kastel.mcse.ardoco.tlr.tests.integration.TraceLinkEvaluationIT.RESULTS;

import java.io.File;
Expand All @@ -12,7 +11,6 @@
import java.nio.file.Path;
import java.util.stream.Stream;

import org.eclipse.collections.api.collection.ImmutableCollection;
import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.ImmutableList;
import org.eclipse.collections.api.list.MutableList;
Expand Down Expand Up @@ -104,13 +102,6 @@ protected int getConfusionMatrixSum(ArDoCoResult arDoCoResult) {
return sentences * modelElements;
}

@Override
protected EvaluationResults<String> calculateEvaluationResults(ArDoCoResult arDoCoResult, ImmutableCollection<String> goldStandard) {
var results = super.calculateEvaluationResults(arDoCoResult, goldStandard);
PROJECT_RESULTS.add(results);
return results;
}

public ArDoCoResult getArDoCoResult(T project) {
String name = project.getProjectName();
var inputModel = project.getModelFile();
Expand Down Expand Up @@ -169,7 +160,6 @@ private static void logAndSaveProjectResult(GoldStandardProject project, ArDoCoR
RESULTS.add(Tuples.pair(project, TestUtil.compareTLR(DATA_MAP.get(project), TLRUtil.getTraceLinks(data), TLGoldStandardFile.loadLinks(project)
.toImmutable())));
DATA_MAP.put(project, arDoCoResult);
PROJECT_RESULTS.add(results);
} catch (IOException e) {
// failing to save project results is irrelevant for test success
logger.warn("Failed to load file for gold standard", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;

import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.MutableList;
import org.eclipse.collections.api.tuple.Pair;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
Expand All @@ -32,13 +30,11 @@
import edu.kit.kastel.mcse.ardoco.core.common.RepositoryHandler;
import edu.kit.kastel.mcse.ardoco.core.common.util.DataRepositoryHelper;
import edu.kit.kastel.mcse.ardoco.core.execution.ArDoCo;
import edu.kit.kastel.mcse.ardoco.core.tests.TestUtil;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.CodeProject;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.GoldStandardProject;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.Project;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.EvaluationResults;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.calculator.ResultCalculatorUtil;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.TestLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.ModelSentenceLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLDiffFile;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLLogFile;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLModelFile;
Expand All @@ -47,7 +43,7 @@
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLSummaryFile;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class TraceLinkEvaluationIT<T extends GoldStandardProject> {
class TraceLinkEvaluationIT<T extends GoldStandardProject> {

protected static final Logger logger = LoggerFactory.getLogger(TraceLinkEvaluationIT.class);

Expand All @@ -56,8 +52,7 @@ public class TraceLinkEvaluationIT<T extends GoldStandardProject> {
protected static final String LOGGING_ARDOCO_CORE = "org.slf4j.simpleLogger.log.edu.kit.kastel.mcse.ardoco.core";
protected static AtomicBoolean analyzeCodeDirectly = ANALYZE_CODE_DIRECTLY;

protected static final List<Pair<GoldStandardProject, EvaluationResults<TestLink>>> RESULTS = new ArrayList<>();
protected static final MutableList<EvaluationResults<String>> PROJECT_RESULTS = Lists.mutable.empty();
protected static final List<Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>>> RESULTS = new ArrayList<>();
protected static final Map<GoldStandardProject, ArDoCoResult> DATA_MAP = new LinkedHashMap<>();

@BeforeAll
Expand All @@ -67,28 +62,14 @@ static void beforeAll() {

@AfterAll
static void afterAll() {
logOverallResultsForSadSamTlr();
writeOutputForSadSamTlr();

System.setProperty(LOGGING_ARDOCO_CORE, "error");
}

private static void cleanUpCodeRepository(CodeProject codeProject) {
RepositoryHandler.removeRepository(codeProject.getCodeLocation());
}

private static void logOverallResultsForSadSamTlr() {
if (logger.isInfoEnabled()) {
var name = "Overall Weighted";
var results = ResultCalculatorUtil.calculateWeightedAverageResults(PROJECT_RESULTS.toImmutable());
TestUtil.logResults(logger, name, results);

name = "Overall Macro";
results = ResultCalculatorUtil.calculateAverageResults(PROJECT_RESULTS.toImmutable());
TestUtil.logResults(logger, name, results);
}
}

private static void writeOutputForSadSamTlr() {
var evalDir = Path.of(OUTPUT).resolve("ardoco_eval_tl");
try {
Expand Down Expand Up @@ -136,7 +117,7 @@ private static <T extends Enum<T>> List<T> filterForProjects(Collection<T> unfil
@ParameterizedTest(name = "{0}")
@MethodSource("getNonHistoricalCodeProjects")
@Order(1)
protected void evaluateSadSamCodeTlrFullIT(CodeProject project) {
void evaluateSadSamCodeTlrFullIT(CodeProject project) {
analyzeCodeDirectly.set(true);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);
Expand All @@ -151,7 +132,7 @@ protected void evaluateSadSamCodeTlrFullIT(CodeProject project) {
@ParameterizedTest(name = "{0}")
@EnumSource(value = CodeProject.class, mode = EnumSource.Mode.MATCH_NONE, names = "^.*HISTORICAL$")
@Order(2)
protected void evaluateSamCodeTlrFullIT(CodeProject project) {
void evaluateSamCodeTlrFullIT(CodeProject project) {
analyzeCodeDirectly.set(true);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);
Expand All @@ -165,7 +146,7 @@ protected void evaluateSamCodeTlrFullIT(CodeProject project) {
@ParameterizedTest(name = "{0}")
@MethodSource("getNonHistoricalCodeProjects")
@Order(9)
protected void evaluateSadSamCodeTlrIT(CodeProject codeProject) {
void evaluateSadSamCodeTlrIT(CodeProject codeProject) {
analyzeCodeDirectly.set(false);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(codeProject);
Expand All @@ -181,7 +162,7 @@ protected void evaluateSadSamCodeTlrIT(CodeProject codeProject) {
@ParameterizedTest(name = "{0}")
@MethodSource("getNonHistoricalCodeProjects")
@Order(10)
protected void evaluateSamCodeTlrIT(CodeProject project) {
void evaluateSamCodeTlrIT(CodeProject project) {
analyzeCodeDirectly.set(false);
if (analyzeCodeDirectly.get())
cleanUpCodeRepository(project);
Expand All @@ -195,7 +176,7 @@ protected void evaluateSamCodeTlrIT(CodeProject project) {
@ParameterizedTest(name = "{0}")
@MethodSource("getNonHistoricalCodeProjects")
@Order(20)
protected void evaluateSadSamTlrIT(T project) {
void evaluateSadSamTlrIT(T project) {
var evaluation = new SadSamTraceabilityLinkRecoveryEvaluation<>();
var results = evaluation.runTraceLinkEvaluation(project);
Assertions.assertNotNull(results);
Expand All @@ -206,7 +187,7 @@ protected void evaluateSadSamTlrIT(T project) {
@ParameterizedTest(name = "{0}")
@MethodSource("getHistoricalProjects")
@Order(21)
protected void evaluateSadSamTlrHistoricalIT(T project) {
void evaluateSadSamTlrHistoricalIT(T project) {
var evaluation = new SadSamTraceabilityLinkRecoveryEvaluation<>();
ArDoCoResult arDoCoResult = evaluation.getArDoCoResult(project);
Assertions.assertNotNull(arDoCoResult);
Expand All @@ -225,7 +206,7 @@ protected void evaluateSadSamTlrHistoricalIT(T project) {
@ParameterizedTest(name = "{0}")
@EnumSource(value = Project.class)
@Order(29)
protected void compareSadSamTlRForPcmAndUmlIT(Project project) {
void compareSadSamTlRForPcmAndUmlIT(Project project) {
String name = project.name();
var inputText = project.getTextFile();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import edu.kit.kastel.mcse.ardoco.core.tests.eval.GoldStandardProject;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.EvaluationResults;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.calculator.ResultCalculatorUtil;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.TestLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.ModelSentenceLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLDiffFile;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLLogFile;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.files.TLModelFile;
Expand All @@ -46,7 +46,7 @@ class TraceLinkEvaluationSadCodeDirectIT {

protected static final String LOGGING_ARDOCO_CORE = "org.slf4j.simpleLogger.log.edu.kit.kastel.mcse.ardoco.core";

protected static final List<Pair<GoldStandardProject, EvaluationResults<TestLink>>> RESULTS = new ArrayList<>();
protected static final List<Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>>> RESULTS = new ArrayList<>();
protected static final MutableList<EvaluationResults<String>> PROJECT_RESULTS = Lists.mutable.empty();
protected static final Map<GoldStandardProject, ArDoCoResult> DATA_MAP = new LinkedHashMap<>();

Expand Down Expand Up @@ -97,7 +97,7 @@ private static void logOverallResultsForSadSamTlr() {
TestUtil.logResults(logger, name, results);

name = "Overall Macro";
results = ResultCalculatorUtil.calculateAverageResults(PROJECT_RESULTS.toImmutable());
results = ResultCalculatorUtil.calculateMacroAverageResults(PROJECT_RESULTS.toImmutable());
TestUtil.logResults(logger, name, results);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
/**
* Represents a simple trace link by the id of the model and number of the sentence involved.
*/
public record TestLink(String modelId, int sentenceNr) implements Comparable<TestLink> {
public record ModelSentenceLink(String modelId, int sentenceNr) implements Comparable<ModelSentenceLink> {

public TestLink(SadSamTraceLink traceLink) {
public ModelSentenceLink(SadSamTraceLink traceLink) {
this(traceLink.getModelElementUid(), traceLink.getSentenceNumber());
}

@Override
public int compareTo(TestLink o) {
return Comparator.comparing(TestLink::modelId).thenComparing(TestLink::sentenceNr).compare(this, o);
public int compareTo(ModelSentenceLink o) {
return Comparator.comparing(ModelSentenceLink::modelId).thenComparing(ModelSentenceLink::sentenceNr).compare(this, o);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ private TLRUtil() {
* @param data the {@link EvaluationResults}
* @return the trace links
*/
public static ImmutableList<TestLink> getTraceLinks(DataRepository data) {
var traceLinks = Lists.mutable.<TestLink>empty();
public static ImmutableList<ModelSentenceLink> getTraceLinks(DataRepository data) {
var traceLinks = Lists.mutable.<ModelSentenceLink>empty();
var connectionStates = data.getData(ConnectionStates.ID, ConnectionStates.class).orElseThrow();
var modelStates = data.getData(ModelStates.ID, ModelStates.class).orElseThrow();

Expand All @@ -40,7 +40,7 @@ public static ImmutableList<TestLink> getTraceLinks(DataRepository data) {
.map(connectionStates::getConnectionState)
.toList();
for (var connectionState : connectionStatesList) {
traceLinks.addAll(connectionState.getTraceLinks().stream().map(TestLink::new).toList());
traceLinks.addAll(connectionState.getTraceLinks().stream().map(ModelSentenceLink::new).toList());
}
return traceLinks.toImmutable();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import edu.kit.kastel.mcse.ardoco.core.common.util.CommonUtilities;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.GoldStandardProject;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.EvaluationResults;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.TestLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.ModelSentenceLink;

/**
* This is a helper class to write out a diff-file for the evaluation results of TLR.
Expand All @@ -40,8 +40,8 @@ private TLDiffFile() {
* @param dataMap the mapping of Project to ArDoCoResult of the new run
* @throws IOException if writing fails
*/
public static void save(Path targetFile, Collection<Pair<GoldStandardProject, EvaluationResults<TestLink>>> newProjectResults,
Collection<Pair<GoldStandardProject, EvaluationResults<TestLink>>> oldProjectResults, Map<GoldStandardProject, ArDoCoResult> dataMap)
public static void save(Path targetFile, Collection<Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>>> newProjectResults,
Collection<Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>>> oldProjectResults, Map<GoldStandardProject, ArDoCoResult> dataMap)
throws IOException {
// Assumption: Both collections contain the same projects

Expand Down Expand Up @@ -71,7 +71,7 @@ public static void save(Path targetFile, Collection<Pair<GoldStandardProject, Ev
builder.append(LINE_SEPARATOR).append(LINE_SEPARATOR);

// Append project specific details
for (Pair<GoldStandardProject, EvaluationResults<TestLink>> oldProjectResult : oldProjectResults) {
for (Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>> oldProjectResult : oldProjectResults) {
var project = oldProjectResult.getOne();
var newResultOptional = newProjectResults.stream().filter(r -> r.getOne().equals(project)).findAny();
if (newResultOptional.isEmpty()) {
Expand Down Expand Up @@ -107,15 +107,15 @@ public static void save(Path targetFile, Collection<Pair<GoldStandardProject, Ev
Files.writeString(targetFile, builder.toString(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
}

private static List<TestLink> findNewLinks(List<TestLink> oldLinks, List<TestLink> newLinks) {
private static List<ModelSentenceLink> findNewLinks(List<ModelSentenceLink> oldLinks, List<ModelSentenceLink> newLinks) {
return newLinks.stream().filter(link -> !oldLinks.contains(link)).toList();
}

private static List<TestLink> findMissingLinks(List<TestLink> oldLinks, List<TestLink> newLinks) {
private static List<ModelSentenceLink> findMissingLinks(List<ModelSentenceLink> oldLinks, List<ModelSentenceLink> newLinks) {
return oldLinks.stream().filter(link -> !newLinks.contains(link)).toList();
}

private static void appendList(StringBuilder builder, String description, List<TestLink> links, ArDoCoResult arDoCoResult) {
private static void appendList(StringBuilder builder, String description, List<ModelSentenceLink> links, ArDoCoResult arDoCoResult) {
var text = arDoCoResult.getText();
if (links.isEmpty()) {
return;
Expand All @@ -124,7 +124,7 @@ private static void appendList(StringBuilder builder, String description, List<T
builder.append(description).append(":");
builder.append(LINE_SEPARATOR);

for (TestLink link : links) {
for (ModelSentenceLink link : links) {
for (var modelId : arDoCoResult.getModelIds()) {
var dataModel = arDoCoResult.getModelState(modelId);
var line = TLSummaryFile.format(link, text, dataModel);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import org.eclipse.collections.api.list.MutableList;

import edu.kit.kastel.mcse.ardoco.core.tests.eval.GoldStandardProject;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.TestLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.ModelSentenceLink;

public class TLGoldStandardFile {

Expand All @@ -19,15 +19,15 @@ private TLGoldStandardFile() {
throw new IllegalAccessError("No instantiation allowed");
}

public static MutableList<TestLink> loadLinks(GoldStandardProject goldStandardProject) throws IOException {
public static MutableList<ModelSentenceLink> loadLinks(GoldStandardProject goldStandardProject) throws IOException {
Path path = goldStandardProject.getTlrGoldStandardFile().toPath();
List<String> lines = Files.readAllLines(path);

return Lists.mutable.ofAll(lines.stream()
.skip(1) // skip csv header
.map(line -> line.split(",")) // modelElementId,sentenceNr
.map(array -> new TestLink(array[0], Integer.parseInt(array[1])))
.map(link -> new TestLink(link.modelId(), link.sentenceNr() - 1))
.map(array -> new ModelSentenceLink(array[0], Integer.parseInt(array[1])))
.map(link -> new ModelSentenceLink(link.modelId(), link.sentenceNr() - 1))
// ^ goldstandard sentences start with 1 while ISentences are zero indexed
.toList());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import edu.kit.kastel.mcse.ardoco.core.common.util.CommonUtilities;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.GoldStandardProject;
import edu.kit.kastel.mcse.ardoco.core.tests.eval.results.EvaluationResults;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.TestLink;
import edu.kit.kastel.mcse.ardoco.tlr.tests.integration.tlrhelper.ModelSentenceLink;

/**
* This helper-class offer functionality to write out a log of the results for TLR.
Expand All @@ -35,8 +35,8 @@ private TLLogFile() {
* @param projectResults the results to write out
* @throws IOException if writing to file system fails
*/
public static void append(Path targetFile, List<Pair<GoldStandardProject, EvaluationResults<TestLink>>> projectResults) throws IOException {
List<EvaluationResults<TestLink>> results = projectResults.stream().map(Pair::getTwo).toList();
public static void append(Path targetFile, List<Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>>> projectResults) throws IOException {
List<EvaluationResults<ModelSentenceLink>> results = projectResults.stream().map(Pair::getTwo).toList();
var builder = new StringBuilder();

builder.append("- `").append(CommonUtilities.getCurrentTimeAsString()).append("` ");
Expand All @@ -50,9 +50,9 @@ public static void append(Path targetFile, List<Pair<GoldStandardProject, Evalua

var sortedResults = new ArrayList<>(projectResults);
sortedResults.sort(Comparator.comparing(x -> x.getOne().getProjectName()));
for (Pair<GoldStandardProject, EvaluationResults<TestLink>> projectResult : sortedResults) {
for (Pair<GoldStandardProject, EvaluationResults<ModelSentenceLink>> projectResult : sortedResults) {
String alias = projectResult.getOne().getAlias();
EvaluationResults<TestLink> result = projectResult.getTwo();
EvaluationResults<ModelSentenceLink> result = projectResult.getTwo();
String precision = NUMBER_FORMAT.format(result.precision());
String recall = NUMBER_FORMAT.format(result.recall());
String F1 = NUMBER_FORMAT.format(result.f1());
Expand Down
Loading

0 comments on commit dce83a9

Please sign in to comment.