Skip to content

Commit

Permalink
Remove global configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
dfuchss committed Nov 29, 2024
1 parent 3e74f00 commit 9358677
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

import java.util.Collection;

import edu.kit.kastel.mcse.ardoco.core.data.GlobalConfiguration;

/**
* Classes implementing this interface provide the functionality to determine whether an instance is similar to the provided type, and if collections of
* instances are similar to collections of the type.
Expand All @@ -16,24 +14,24 @@ public interface SimilarityComparable<T> {
* {@return whether the instance is similar to the given object} Has to return true if {@link Object#equals} returns true. The result of this function
* should be symmetric, but does not have to be transitive.
*
* @param globalConfiguration the pipeline meta data containing the similarity configuration
* @param obj some object
* @param obj some object
*/
boolean similar(GlobalConfiguration globalConfiguration, T obj);
boolean similar(T obj);

/**
* {@return both collections consist of elements, that have a corresponding similar element in the other collection} Does not care about order and should
* returns true for equal lists if {@link #similar(GlobalConfiguration, Object)} was implemented correctly.
* returns true for equal lists if {@link #similar(Object)} was implemented correctly.
*
* @param globalConfiguration the pipeline meta data containing the similarity configuration
* @param a some collection
* @param b some other collection
* @param a some collection
* @param b some other collection
*/
static <T extends SimilarityComparable<T>> boolean similar(GlobalConfiguration globalConfiguration, Collection<? extends T> a, Collection<? extends T> b) {
if (a.equals(b))
static <T extends SimilarityComparable<T>> boolean similar(Collection<? extends T> a, Collection<? extends T> b) {
if (a.equals(b)) {
return true;
if (a.size() != b.size())
}
if (a.size() != b.size()) {
return false;
return a.parallelStream().allMatch(element -> b.stream().anyMatch(other -> element.similar(globalConfiguration, other)));
}
return a.parallelStream().allMatch(element -> b.stream().anyMatch(element::similar));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,14 @@
*/
@Deterministic
public final class SimilarityUtils implements Serializable {
private static final SimilarityUtils INSTANCE = new SimilarityUtils(new WordSimUtils());

private final WordSimUtils wordSimUtils;

public static SimilarityUtils getInstance() {
return INSTANCE;
}

public SimilarityUtils(WordSimUtils wordSimUtils) {
this.wordSimUtils = wordSimUtils;
}
Expand All @@ -41,7 +47,7 @@ public ImmutableList<String> getSimilarSurfaceWords(RecommendedInstance recommen
return Lists.immutable.fromStream(recommendedInstance.getNameMappings()
.stream()
.flatMap(n -> n.getSurfaceForms().stream())
.filter(s -> wordSimUtils.areWordsSimilar(s, instance.getFullName())));
.filter(s -> this.wordSimUtils.areWordsSimilar(s, instance.getFullName())));
}

/**
Expand All @@ -68,9 +74,9 @@ public boolean areNounMappingsSimilar(NounMapping nm1, NounMapping nm2) {
if (nm1Words.size() == 1 && nm2Words.size() == 1) {
var nm1Word = nm1Words.get(0);
var nm2Word = nm2Words.get(0);
return areWordsSimilar(nm1FirstPart, nm2FirstPart) || areWordsSimilar(nm1Word, nm2Word);
return this.areWordsSimilar(nm1FirstPart, nm2FirstPart) || this.areWordsSimilar(nm1Word, nm2Word);
}
return areWordsSimilar(nm1Reference, nm2Reference);
return this.areWordsSimilar(nm1Reference, nm2Reference);
}

/**
Expand All @@ -82,13 +88,13 @@ public boolean areNounMappingsSimilar(NounMapping nm1, NounMapping nm2) {
* @return true, iff the {@link NounMapping} and {@link ModelInstance} are similar.
*/
public boolean isNounMappingSimilarToModelInstance(NounMapping nounMapping, ModelInstance instance) {
if (areWordsOfListsSimilar(instance.getNameParts(), Lists.immutable.with(nounMapping.getReference())) || areWordsSimilar(instance.getFullName(),
nounMapping.getReference())) {
if (this.areWordsOfListsSimilar(instance.getNameParts(), Lists.immutable.with(nounMapping.getReference())) || this.areWordsSimilar(instance
.getFullName(), nounMapping.getReference())) {
return true;
}

for (String name : instance.getNameParts()) {
if (areWordsSimilar(name, nounMapping.getReference())) {
if (this.areWordsSimilar(name, nounMapping.getReference())) {
return true;
}
}
Expand All @@ -104,7 +110,7 @@ public boolean isNounMappingSimilarToModelInstance(NounMapping nounMapping, Mode
*/
public boolean isWordSimilarToModelInstance(Word word, ModelInstance instance) {
var names = instance.getNameParts();
return compareWordWithStringListEntries(word, names);
return this.compareWordWithStringListEntries(word, names);
}

/**
Expand All @@ -117,7 +123,7 @@ public boolean isWordSimilarToModelInstance(Word word, ModelInstance instance) {
public boolean isRecommendedInstanceSimilarToModelInstance(RecommendedInstance ri, ModelInstance instance) {
var name = ri.getName();
var nameList = Lists.immutable.with(name.split(" "));
return instance.getFullName().equalsIgnoreCase(ri.getName()) || areWordsOfListsSimilar(instance.getNameParts(), nameList);
return instance.getFullName().equalsIgnoreCase(ri.getName()) || this.areWordsOfListsSimilar(instance.getNameParts(), nameList);
}

/**
Expand All @@ -129,16 +135,16 @@ public boolean isRecommendedInstanceSimilarToModelInstance(RecommendedInstance r
*/
public boolean isWordSimilarToModelInstanceType(Word word, ModelInstance instance) {
var types = instance.getTypeParts();
return compareWordWithStringListEntries(word, types);
return this.compareWordWithStringListEntries(word, types);
}

private boolean compareWordWithStringListEntries(Word word, ImmutableList<String> names) {
return compareWordWithStringListEntries(word.getText(), names);
return this.compareWordWithStringListEntries(word.getText(), names);
}

private boolean compareWordWithStringListEntries(String word, ImmutableList<String> names) {
for (String name : names) {
if (areWordsSimilar(name, word)) {
if (this.areWordsSimilar(name, word)) {
return true;
}
}
Expand All @@ -154,7 +160,7 @@ private boolean compareWordWithStringListEntries(String word, ImmutableList<Stri
* @return true, if the words are similar; false if not.
*/
public boolean areWordsSimilar(Word word1, Word word2) {
return wordSimUtils.areWordsSimilar(word1, word2);
return this.wordSimUtils.areWordsSimilar(word1, word2);
}

//FIXME this method is a duplicate of an existing method in WordSimUtils and should be removed
Expand All @@ -166,7 +172,7 @@ public boolean areWordsSimilar(Word word1, Word word2) {
* @return true, if the test string is similar to the original; false if not.
*/
public boolean areWordsSimilar(String word1, String word2) {
return wordSimUtils.areWordsSimilar(word1, word2);
return this.wordSimUtils.areWordsSimilar(word1, word2);
}

/**
Expand All @@ -181,7 +187,7 @@ public boolean areWordsSimilar(String word1, String word2) {
*/
public boolean areWordsOfListsSimilar(ImmutableList<String> originals, ImmutableList<String> words2test, double minProportion) {

if (areWordsSimilar(String.join(" ", originals), String.join(" ", words2test))) {
if (this.areWordsSimilar(String.join(" ", originals), String.join(" ", words2test))) {
return true;
}

Expand All @@ -191,14 +197,16 @@ public boolean areWordsOfListsSimilar(ImmutableList<String> originals, Immutable
var possiblySimilar = originals.size() * words2test.size();
for (String o : originals) {
for (String wd : words2test) {
if (areWordsSimilar(o, wd)) {
if (this.areWordsSimilar(o, wd)) {
counterSimilar++;
if (1.0 * counterSimilar / max >= minProportion)
if (1.0 * counterSimilar / max >= minProportion) {
return true;
}
} else {
counterDissimilar++;
if (1.0 * (possiblySimilar - counterDissimilar) / max < minProportion)
if (1.0 * (possiblySimilar - counterDissimilar) / max < minProportion) {
return false; //minProportion can no longer be achieved, can stop here
}
}
}
}
Expand All @@ -215,7 +223,7 @@ public boolean areWordsOfListsSimilar(ImmutableList<String> originals, Immutable
* @return true if the list are similar, false if not
*/
public boolean areWordsOfListsSimilar(ImmutableList<String> originals, ImmutableList<String> words2test) {
return areWordsOfListsSimilar(originals, words2test, CommonTextToolsConfig.JAROWINKLER_SIMILARITY_THRESHOLD);
return this.areWordsOfListsSimilar(originals, words2test, CommonTextToolsConfig.JAROWINKLER_SIMILARITY_THRESHOLD);
}

/**
Expand All @@ -232,7 +240,7 @@ public ImmutableList<RecommendedInstance> getMostRecommendedInstancesToInstanceB
ImmutableList<RecommendedInstance> recommendedInstances) {
var instanceNames = instance.getNameParts();
var similarity = CommonTextToolsConfig.JAROWINKLER_SIMILARITY_THRESHOLD;
var selection = recommendedInstances.select(ri -> checkRecommendedInstanceForSelection(instance, ri, similarity));
var selection = recommendedInstances.select(ri -> this.checkRecommendedInstanceForSelection(instance, ri, similarity));

var getMostRecommendedIByRefMinProportion = CommonTextToolsConfig.GET_MOST_RECOMMENDED_I_BY_REF_MIN_PROPORTION;
var getMostRecommendedIByRefIncrease = CommonTextToolsConfig.GET_MOST_RECOMMENDED_I_BY_REF_INCREASE;
Expand All @@ -245,7 +253,7 @@ public ImmutableList<RecommendedInstance> getMostRecommendedInstancesToInstanceB
getMostRecommendedIByRefMinProportion += getMostRecommendedIByRefIncrease;
MutableList<RecommendedInstance> risToRemove = Lists.mutable.empty();
for (RecommendedInstance ri : whileSelection) {
if (checkRecommendedInstanceWordSimilarityToInstance(instance, ri)) {
if (this.checkRecommendedInstanceWordSimilarityToInstance(instance, ri)) {
allListsSimilar++;
}

Expand All @@ -270,7 +278,7 @@ private boolean checkRecommendedInstanceWordSimilarityToInstance(ModelInstance i
var instanceNames = instance.getNameParts();
for (var sf : ri.getNameMappings().flatCollect(NounMapping::getSurfaceForms)) {
var splitSF = CommonUtilities.splitCases(String.join(" ", CommonUtilities.splitAtSeparators(sf)));
if (areWordsSimilar(String.join(" ", instanceNames), splitSF)) {
if (this.areWordsSimilar(String.join(" ", instanceNames), splitSF)) {
return true;
}
}
Expand All @@ -282,7 +290,7 @@ private boolean checkRecommendedInstanceForSelection(ModelInstance instance, Rec
ImmutableList<String> longestNameSplit = Lists.immutable.of(CommonUtilities.splitCases(instance.getFullName()).split(" "));
ImmutableList<String> recommendedInstanceNames = Lists.immutable.with(ri.getName());

boolean instanceNameAndRIName = areWordsSimilar(instance.getFullName(), ri.getName());
boolean instanceNameAndRIName = this.areWordsSimilar(instance.getFullName(), ri.getName());
boolean instanceNamesAndRIs = this.areWordsOfListsSimilar(instanceNames, recommendedInstanceNames, similarity);
boolean longestNameSplitAndRINames = this.areWordsOfListsSimilar(longestNameSplit, recommendedInstanceNames, similarity);
boolean listOfNamesSimilarEnough = 1.0 * similarEntriesOfList(instanceNames, recommendedInstanceNames) / Math.max(instanceNames.size(),
Expand Down Expand Up @@ -349,7 +357,7 @@ public PhraseMapping getMostSimilarPhraseMapping(TextState textState, PhraseMapp
double currentMinSimilarity = minCosineSimilarity;
PhraseMapping mostSimilarPhraseMapping = otherPhraseMappings.get(0);
for (PhraseMapping otherPhraseMapping : otherPhraseMappings) {
double similarity = getPhraseMappingSimilarity(textState, phraseMapping, otherPhraseMapping, PhraseMappingAggregatorStrategy.MAX_SIMILARITY);
double similarity = this.getPhraseMappingSimilarity(textState, phraseMapping, otherPhraseMapping, PhraseMappingAggregatorStrategy.MAX_SIMILARITY);
if (similarity > currentMinSimilarity) {
currentMinSimilarity = similarity;
mostSimilarPhraseMapping = otherPhraseMapping;
Expand All @@ -361,9 +369,11 @@ public PhraseMapping getMostSimilarPhraseMapping(TextState textState, PhraseMapp

public static <A extends Serializable, B extends Serializable> ImmutableList<Pair<A, B>> uniqueDot(ImmutableList<A> first, ImmutableList<B> second) {
List<Pair<A, B>> result = new ArrayList<>();
for (A a : first)
for (B b : second)
for (A a : first) {
for (B b : second) {
result.add(new Pair<>(a, b));
}
}
return Lists.immutable.withAll(result);
}

Expand All @@ -376,9 +386,9 @@ public double getPhraseMappingSimilarity(TextState textState, PhraseMapping firs
}

// Maybe REWORK. Remove NounMappings?
if ((coversOtherPhraseVector(firstPhraseMapping, secondPhraseMapping) || coversOtherPhraseVector(secondPhraseMapping,
firstPhraseMapping)) && containsAllNounMappingsOfPhraseMapping(textState, firstPhraseMapping,
secondPhraseMapping) && containsAllNounMappingsOfPhraseMapping(textState, secondPhraseMapping, firstPhraseMapping)) {
if ((coversOtherPhraseVector(firstPhraseMapping, secondPhraseMapping) || coversOtherPhraseVector(secondPhraseMapping, firstPhraseMapping)) && this
.containsAllNounMappingsOfPhraseMapping(textState, firstPhraseMapping, secondPhraseMapping) && this.containsAllNounMappingsOfPhraseMapping(
textState, secondPhraseMapping, firstPhraseMapping)) {
// HARD CODED... Change?
return 1.0;
}
Expand All @@ -390,15 +400,12 @@ private static int similarEntriesOfList(ImmutableList<String> list1, ImmutableLi
MutableList<String> removed = Lists.mutable.empty();

for (var element : list1) {
if (list2.contains(element)) {
if (list2.contains(element) || (list2.select(e -> !removed.contains(e) && (e.contains(element) || element.contains(e))).size() == 1)) {
removed.add(element);
} else {
if (list2.select(e -> !removed.contains(e) && (e.contains(element) || element.contains(e))).size() == 1) {
removed.add(element);
}
}
}

return removed.size();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,9 @@ public static void addRecommendedInstancesFromNounMappings(ImmutableList<String>
* @param modelState the model state containing information about types
* @return List of type names in the model state that are similar to the given word
*/
public static ImmutableList<String> getSimilarTypes(SimilarityUtils similarityUtils, Word word, LegacyModelExtractionState modelState) {
public static ImmutableList<String> getSimilarTypes(Word word, LegacyModelExtractionState modelState) {
var identifiers = getTypeIdentifiers(modelState);
return Lists.immutable.fromStream(identifiers.stream().filter(typeId -> similarityUtils.areWordsSimilar(typeId, word.getText())));
return Lists.immutable.fromStream(identifiers.stream().filter(typeId -> SimilarityUtils.getInstance().areWordsSimilar(typeId, word.getText())));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,6 @@ public class DataRepository implements Serializable {

public DataRepository() {
this.data = new TreeMap<>();
this.addData(GlobalConfiguration.ID, new GlobalConfiguration());
}

/**
* Returns the {@link GlobalConfiguration} stored within the provided {@link DataRepository}.
*
* @return the data
*/
public final GlobalConfiguration getGlobalConfiguration() {
return this.getData(GlobalConfiguration.ID, GlobalConfiguration.class).orElseThrow();
}

/**
Expand Down

This file was deleted.

Loading

0 comments on commit 9358677

Please sign in to comment.