Skip to content

Commit 7840df6

Browse files
committed
refactoring: Domino Sorting is now a sequence extractor; Interface for SequenceExtractors
1 parent bb6a9b1 commit 7840df6

9 files changed

Lines changed: 362 additions & 267 deletions

File tree

src/main/java/de/variantsync/evolution/Main.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
import de.variantsync.evolution.util.functional.MonadTransformer;
1616
import de.variantsync.evolution.util.functional.Unit;
1717
import de.variantsync.evolution.util.list.NonEmptyList;
18-
import de.variantsync.evolution.variability.*;
18+
import de.variantsync.evolution.variability.EvolutionStep;
19+
import de.variantsync.evolution.variability.SPLCommit;
20+
import de.variantsync.evolution.variability.VariabilityDataset;
21+
import de.variantsync.evolution.variability.VariabilityHistory;
22+
import de.variantsync.evolution.variability.sequenceextraction.LongestNonOverlappingSequences;
1923
import de.variantsync.evolution.variants.VariantsRepository;
2024
import de.variantsync.evolution.variants.VariantsRevision;
2125
import de.variantsync.evolution.variants.sampling.SampleOnceAtBeginStrategy;
@@ -107,7 +111,7 @@ public static void main(final String[] args) throws IOException, Resources.Resou
107111
final VariabilityDatasetLoader datasetLoader = new VariabilityDatasetLoader();
108112
assert datasetLoader.canLoad(variabilityDatasetDir);
109113
variabilityDataset = datasetLoader.load(variabilityDatasetDir).getSuccess();
110-
final Set<EvolutionStep<SPLCommit>> evolutionSteps = variabilityDataset.getCommitPairsForEvolutionStudy();
114+
final Set<EvolutionStep<SPLCommit>> evolutionSteps = variabilityDataset.getEvolutionSteps();
111115
Logger.info("The dataset contains " + variabilityDataset.getSuccessCommits().size() + " commits for which the variability extraction succeeded.");
112116
Logger.info("The dataset contains " + variabilityDataset.getErrorCommits().size() + " commits for which the variability extraction failed.");
113117
Logger.info("The dataset contains " + variabilityDataset.getPartialSuccessCommits().size() + " commits that for which the file presence conditions are missing.");
@@ -118,7 +122,7 @@ public static void main(final String[] args) throws IOException, Resources.Resou
118122
Logger.debug("<<PARENT> " + pair.parent().id() + "> -- <<SPL_COMMIT> " + pair.parent().id() + ">");
119123
Logger.debug("");
120124
}
121-
final VariabilityHistory history = variabilityDataset.getVariabilityHistory(SequenceExtractors.longestNonOverlappingSequences());
125+
final VariabilityHistory history = variabilityDataset.getVariabilityHistory(new LongestNonOverlappingSequences());
122126
final NonEmptyList<NonEmptyList<SPLCommit>> sequencesInHistory = history.commitSequences();
123127
Logger.info("The dataset contains " + sequencesInHistory.size() + " sequences.");
124128
for (int i = 0; i < sequencesInHistory.size(); i++) {

src/main/java/de/variantsync/evolution/variability/DominoSortedEvolutionSteps.java

Lines changed: 0 additions & 115 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package de.variantsync.evolution.variability;
2+
3+
import de.variantsync.evolution.util.list.NonEmptyList;
4+
5+
import java.util.Collection;
6+
import java.util.List;
7+
8+
@FunctionalInterface
9+
public interface SequenceExtractor {
10+
List<NonEmptyList<SPLCommit>> extract(final Collection<SPLCommit> commits);
11+
}

src/main/java/de/variantsync/evolution/variability/SequenceExtractors.java

Lines changed: 0 additions & 110 deletions
This file was deleted.

src/main/java/de/variantsync/evolution/variability/VariabilityDataset.java

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import de.variantsync.evolution.util.Logger;
44
import de.variantsync.evolution.util.list.NonEmptyList;
5+
import de.variantsync.evolution.variability.sequenceextraction.CleaningEvolutionStepsStream;
56
import org.jetbrains.annotations.NotNull;
67

78
import java.util.*;
8-
import java.util.function.Function;
9+
import java.util.stream.Collectors;
10+
import java.util.stream.Stream;
911

1012
public class VariabilityDataset {
1113
private final Set<SPLCommit> allCommits;
@@ -67,9 +69,9 @@ public List<SPLCommit> getPartialSuccessCommits() {
6769
*
6870
* @return All sequences of commits that are usable in our evolution study.
6971
*/
70-
public VariabilityHistory getVariabilityHistory(final Function<Collection<SPLCommit>, List<NonEmptyList<SPLCommit>>> sequenceExtractor) {
72+
public VariabilityHistory getVariabilityHistory(final SequenceExtractor sequenceExtractor) {
7173
// Build a VariabilityHistory instance by applying the provided function to the set of success commits
72-
final List<NonEmptyList<SPLCommit>> history = sequenceExtractor.apply(this.successCommits);
74+
final List<NonEmptyList<SPLCommit>> history = sequenceExtractor.extract(this.successCommits);
7375

7476
if (history.isEmpty()) {
7577
Logger.error("There is no valid sequence of commits from which a VariabilityHistory can be built!");
@@ -79,6 +81,33 @@ public VariabilityHistory getVariabilityHistory(final Function<Collection<SPLCom
7981
}
8082
}
8183

84+
/**
85+
* Collects all evolution steps into a set.
86+
* @see #streamEvolutionSteps()
87+
*/
88+
public Set<EvolutionStep<SPLCommit>> getEvolutionSteps() {
89+
return streamEvolutionSteps().collect(Collectors.toSet());
90+
}
91+
92+
93+
/**
94+
* Streams all valid pairs of success commits of this dataset.
95+
* @see #streamEvolutionSteps(Collection)
96+
*/
97+
public Stream<EvolutionStep<SPLCommit>> streamEvolutionSteps() {
98+
return streamEvolutionSteps(successCommits);
99+
}
100+
101+
/**
102+
* Returns a sorted stream of {@link EvolutionStep<SPLCommit>}. Pairs of commits that
103+
* have one commits in common will be returned sequentially (similar to playing domino).
104+
* Visited SPLCommit's will be cleaned via {@link SPLCommit#forget()}.
105+
* @see #streamEvolutionSteps(Collection)
106+
*/
107+
public CleaningEvolutionStepsStream<SPLCommit> tidyStreamEvolutionSteps() {
108+
return new CleaningEvolutionStepsStream<>(streamEvolutionSteps()::iterator);
109+
}
110+
82111
/**
83112
* Return the set of commit pairs (childCommit, parentCommit) for which the following holds:
84113
* <ul>
@@ -95,28 +124,22 @@ public VariabilityHistory getVariabilityHistory(final Function<Collection<SPLCom
95124
*
96125
* @return Set of commit pairs that can be used in a variability evolution study
97126
*/
98-
public DominoSortedEvolutionSteps<SPLCommit> getCommitPairsForEvolutionStudy() {
99-
Logger.debug("Retrieving commit pairs for study...");
100-
final var steps = new DominoSortedEvolutionSteps<>(
101-
successCommits.stream()
102-
.map(c -> {
103-
if (c.parents().isPresent()) {
104-
final SPLCommit[] parents = c.parents().get();
105-
// We only consider commits that did not process a merge
106-
final boolean notAMerge = parents.length == 1;
107-
final SPLCommit p = parents[0];
108-
// We only consider commits that processed an SPL commit whose parent was also processed
109-
final boolean parentSuccess = successCommits.contains(p);
110-
if (notAMerge && parentSuccess) {
111-
return new EvolutionStep<>(p, c);
112-
}
113-
}
114-
return null;
115-
})
116-
.filter(Objects::nonNull)
117-
);
118-
Logger.debug("Done.");
119-
return steps;
127+
public static Stream<EvolutionStep<SPLCommit>> streamEvolutionSteps(final Collection<SPLCommit> successCommits) {
128+
return successCommits.stream()
129+
.map(c -> {
130+
if (c.parents().isPresent()) {
131+
final SPLCommit[] parents = c.parents().get();
132+
// We only consider commits that did not process a merge
133+
final boolean notAMerge = parents.length == 1;
134+
final SPLCommit p = parents[0];
135+
// We only consider commits that processed an SPL commit whose parent was also processed
136+
final boolean parentSuccess = successCommits.contains(p);
137+
if (notAMerge && parentSuccess) {
138+
return new EvolutionStep<>(p, c);
139+
}
140+
}
141+
return null;
142+
})
143+
.filter(Objects::nonNull);
120144
}
121-
122145
}

0 commit comments

Comments
 (0)