From fc4d3abfe92a5098931f737e98df351feb5cc797 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Sun, 3 Jan 2021 20:50:22 +0100 Subject: [PATCH] Unfertiger Stand Backup --- .../FamilyOfGeneratedGenerics.java | 7 +- .../de/dhbwstuttgart/core/JavaTXCompiler.java | 365 +----------------- .../typeinference/unify/TypeUnify.java | 18 +- .../typeinference/unify/TypeUnify2Task.java | 34 +- .../typeinference/unify/TypeUnifyTask.java | 130 +------ .../typeinference/unify/UnifyTaskModel.java | 18 - 6 files changed, 23 insertions(+), 549 deletions(-) delete mode 100644 src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java diff --git a/src/main/java/de/dhbwstuttgart/bytecode/insertGenerics/FamilyOfGeneratedGenerics.java b/src/main/java/de/dhbwstuttgart/bytecode/insertGenerics/FamilyOfGeneratedGenerics.java index 50170cdf..f86b7699 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/insertGenerics/FamilyOfGeneratedGenerics.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/insertGenerics/FamilyOfGeneratedGenerics.java @@ -47,11 +47,6 @@ public class FamilyOfGeneratedGenerics { return cs_cl; } - public static List getMethodConstraintsAlternative() { - List ggRes = GenericsGeneratorResult. - return null; - } - public static List getMethodConstraints(List cs, HashMap> posOfTphs) { //TODO: Regeln List cs_m = new ArrayList<>(); @@ -61,7 +56,7 @@ public class FamilyOfGeneratedGenerics { cs_m.add(cons); } } - List methodConstraints2 = firstTransitiveSubtypeForMethodTypes(); + //List methodConstraints2 = firstTransitiveSubtypeForMethodTypes(); return cs_m; } diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index 8425d180..37aef9d1 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -20,12 +20,10 @@ import de.dhbwstuttgart.syntaxtree.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.Method; import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.SourceFile; -import de.dhbwstuttgart.syntaxtree.TypeScope; import de.dhbwstuttgart.syntaxtree.FormalParameter; import de.dhbwstuttgart.syntaxtree.GenericDeclarationList; import de.dhbwstuttgart.syntaxtree.factory.ASTFactory; import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory; -import de.dhbwstuttgart.syntaxtree.statement.Block; import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType; import de.dhbwstuttgart.syntaxtree.type.GenericRefType; import de.dhbwstuttgart.syntaxtree.type.RefType; @@ -51,23 +49,16 @@ import de.dhbwstuttgart.typeinference.unify.TypeUnifyTask; import de.dhbwstuttgart.typeinference.unify.UnifyResultListener; import de.dhbwstuttgart.typeinference.unify.UnifyResultListenerImpl; import de.dhbwstuttgart.typeinference.unify.UnifyResultModel; -import de.dhbwstuttgart.typeinference.unify.UnifyTaskModel; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; -import java.io.OutputStreamWriter; -import java.net.URL; -import java.net.URLClassLoader; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; -import org.antlr.v4.runtime.Token; -import org.apache.commons.io.output.NullOutputStream; - public class JavaTXCompiler { @@ -76,7 +67,6 @@ public class JavaTXCompiler { Boolean resultmodel = true; public final Map sourceFiles = new HashMap<>(); Boolean log = true; //gibt an ob ein Log-File nach System.getProperty("user.dir")+"src/test/java/logFiles" geschrieben werden soll? - public volatile UnifyTaskModel usedTasks = new UnifyTaskModel(); private final ClassLoader classLoader; public JavaTXCompiler(File sourceFile) throws IOException, ClassNotFoundException { @@ -194,7 +184,7 @@ public class JavaTXCompiler { public List getAvailableClasses(SourceFile forSourceFile) throws ClassNotFoundException { - //PL 2018-09-18: List durch Set ersetzt, damit die Klassen nur einmal hinzugefuegt werden + //PL 2018-09-18: List durch Set ersetzt, damit die Klassen nur einmal hinzugefuegt werden //List allClasses = new ArrayList<>();//environment.getAllAvailableClasses(); Set allClasses = new HashSet<>(); @@ -229,321 +219,6 @@ public class JavaTXCompiler { return new ArrayList<>(allClasses); } - /* - * public List typeInferenceOld() throws ClassNotFoundException { - * List allClasses = new - * ArrayList<>();//environment.getAllAvailableClasses(); //Alle Importierten - * Klassen in allen geparsten Sourcefiles kommen ins FC for(SourceFile sf : - * this.sourceFiles.values()) { allClasses.addAll(getAvailableClasses(sf)); - * allClasses.addAll(sf.getClasses()); } - * - * final ConstraintSet cons = getConstraints(); - * - * FiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses); - * System.out.println(finiteClosure); ConstraintSet unifyCons = - * UnifyTypeFactory.convert(cons); - * - * TypeUnify unify = new TypeUnify(); Set> results = new - * HashSet<>(); try { File logPath = new - * File(System.getProperty("user.dir")+"/target/logFiles/"); logPath.mkdirs(); - * FileWriter logFile = new FileWriter(new File(logPath, "log")); - * logFile.write("FC:\\" + finiteClosure.toString()+"\n"); for(SourceFile sf : - * this.sourceFiles.values()) { logFile.write(ASTTypePrinter.print(sf)); } - * logFile.flush(); Set>> cardProd = - * unifyCons.cartesianProduct(); for (List> xCons : - * cardProd ){ Set xConsSet = new HashSet<>(); for - * (Constraint constraint : xCons) { xConsSet.addAll(constraint); } - * //.collect(Collectors.toCollection(ArrayList::new)))) - * System.out.println(xConsSet); Set methodParaTypeVarNames = - * allClasses.stream().map(x -> x.getMethods().stream().map(y -> - * y.getParameterList().getFormalparalist() .stream().filter(z -> z.getType() - * instanceof TypePlaceholder) .map(z -> - * ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection( - * HashSet::new))) .reduce(new HashSet(), (a,b) -> { a.addAll(b); return - * a;}, (a,b) -> { a.addAll(b); return a;} ) ) .reduce(new HashSet(), - * (a,b) -> { a.addAll(b); return a;} ); - * - * Set constructorParaTypeVarNames = allClasses.stream().map(x -> - * x.getConstructors().stream().map(y -> - * y.getParameterList().getFormalparalist() .stream().filter(z -> z.getType() - * instanceof TypePlaceholder) .map(z -> - * ((TypePlaceholder)z.getType()).getName()).collect(Collectors.toCollection( - * HashSet::new))) .reduce(new HashSet(), (a,b) -> { a.addAll(b); return - * a;}, (a,b) -> { a.addAll(b); return a;} ) ) .reduce(new HashSet(), - * (a,b) -> { a.addAll(b); return a;} ); - * - * Set paraTypeVarNames = methodParaTypeVarNames; - * paraTypeVarNames.addAll(constructorParaTypeVarNames); - * - * Set returnTypeVarNames = allClasses.stream().map(x -> - * x.getMethods().stream().filter(y -> y.getReturnType() instanceof - * TypePlaceholder) .map(z -> - * ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors. - * toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} - * ).get(); - * - * Set fieldTypeVarNames = allClasses.stream().map(x -> - * x.getFieldDecl().stream().filter(y -> y.getReturnType() instanceof - * TypePlaceholder) .map(z -> - * ((TypePlaceholder)z.getReturnType()).getName()).collect(Collectors. - * toCollection(HashSet::new))).reduce((a,b) -> { a.addAll(b); return a;} - * ).get(); - * - * returnTypeVarNames.addAll(fieldTypeVarNames); - * - * xConsSet = xConsSet.stream().map(x -> { //Hier muss ueberlegt werden, ob //1. - * alle Argument- und Retuntyp-Variablen in allen UnifyPairs // mit - * disableWildcardtable() werden. //2. alle Typvariablen mit Argument- oder - * Retuntyp-Variablen //in Beziehung auch auf disableWildcardtable() gesetzt - * werden muessen //PL 2018-04-23 if ((x.getLhsType() instanceof - * PlaceholderType)) { if (paraTypeVarNames.contains(x.getLhsType().getName())) - * { ((PlaceholderType)x.getLhsType()).setVariance((byte)1); - * ((PlaceholderType)x.getLhsType()).disableWildcardtable(); } if - * (returnTypeVarNames.contains(x.getLhsType().getName())) { - * ((PlaceholderType)x.getLhsType()).setVariance((byte)-1); - * ((PlaceholderType)x.getLhsType()).disableWildcardtable(); } } if - * ((x.getRhsType() instanceof PlaceholderType)) { if - * (paraTypeVarNames.contains(x.getRhsType().getName())) { - * ((PlaceholderType)x.getRhsType()).setVariance((byte)1); - * ((PlaceholderType)x.getRhsType()).disableWildcardtable(); } if - * (returnTypeVarNames.contains(x.getRhsType().getName())) { - * ((PlaceholderType)x.getRhsType()).setVariance((byte)-1); - * ((PlaceholderType)x.getRhsType()).disableWildcardtable(); } } return x;//HIER - * DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE JEWEILS - * ANDERE SEITE }).map( y -> { if ((y.getLhsType() instanceof PlaceholderType) - * && (y.getRhsType() instanceof PlaceholderType)) { if - * (((PlaceholderType)y.getLhsType()).getVariance() != 0 && - * ((PlaceholderType)y.getRhsType()).getVariance() == 0) { - * ((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType( - * )).getVariance()); } if (((PlaceholderType)y.getLhsType()).getVariance() == 0 - * && ((PlaceholderType)y.getRhsType()).getVariance() != 0) { - * ((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType( - * )).getVariance()); } } return y; } ) - * .collect(Collectors.toCollection(HashSet::new)); - * varianceInheritance(xConsSet); Set> result = - * unify.unifySequential(xConsSet, finiteClosure, logFile, log); - * //Set> result = unify.unify(xConsSet, finiteClosure); - * System.out.println("RESULT: " + result); logFile.write("RES: " + - * result.toString()+"\n"); logFile.flush(); results.addAll(result); } - * - * results = results.stream().map(x -> { Optional> res = new - * RuleSet().subst(x.stream().map(y -> { if (y.getPairOp() == - * PairOperator.SMALLERDOTWC) y.setPairOp(PairOperator.EQUALSDOT); return y; - * //alle Paare a <.? b erden durch a =. b ersetzt - * }).collect(Collectors.toCollection(HashSet::new))); if (res.isPresent()) - * {//wenn subst ein Erg liefert wurde was veraendert return new - * TypeUnifyTask().applyTypeUnificationRules(res.get(), finiteClosure); } else - * return x; //wenn nichts veraendert wurde wird x zurueckgegeben - * }).collect(Collectors.toCollection(HashSet::new)); - * System.out.println("RESULT Final: " + results); logFile.write("RES_FINAL: " + - * results.toString()+"\n"); logFile.flush(); logFile.write("PLACEHOLDERS: " + - * PlaceholderType.EXISTING_PLACEHOLDERS); logFile.flush(); } catch (IOException - * e) { e.printStackTrace(); } return results.stream().map((unifyPairs -> new - * ResultSet(UnifyTypeFactory.convert(unifyPairs, - * generateTPHMap(cons))))).collect(Collectors.toList()); } - */ - /** - * Vererbt alle Variancen bei Paaren (a <. theta) oder (Theta <. a) wenn a eine - * Variance !=0 hat auf alle Typvariablen in Theta. - * - * - */ - /* - * private void varianceInheritance(Set eq) { Set - * usedTPH = new HashSet<>(); Set phSet = eq.stream().map(x -> - * { Set pair = new HashSet<>(); if (x.getLhsType() instanceof - * PlaceholderType) pair.add((PlaceholderType)x.getLhsType()); if - * (x.getRhsType() instanceof PlaceholderType) - * pair.add((PlaceholderType)x.getRhsType()); return pair; }).reduce(new - * HashSet<>(), (a,b) -> { a.addAll(b); return a;} , (c,d) -> { c.addAll(d); - * return c;}); - * - * ArrayList phSetVariance = new ArrayList<>(phSet); - * phSetVariance.removeIf(x -> (x.getVariance() == 0)); - * while(!phSetVariance.isEmpty()) { PlaceholderType a = - * phSetVariance.remove(0); usedTPH.add(a); //HashMap - * ht = new HashMap<>(); //ht.put(a, a.getVariance()); Set eq1 = new - * HashSet<>(eq); eq1.removeIf(x -> !(x.getLhsType() instanceof PlaceholderType - * && ((PlaceholderType)x.getLhsType()).equals(a))); eq1.stream().forEach(x -> { - * x.getRhsType().accept(new distributeVariance(), a.getVariance());}); eq1 = - * new HashSet<>(eq); eq1.removeIf(x -> !(x.getRhsType() instanceof - * PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a))); - * eq1.stream().forEach(x -> { x.getLhsType().accept(new distributeVariance(), - * a.getVariance());}); phSetVariance = new ArrayList<>(phSet); - * phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x))); } - * } - */ - - public UnifyResultModel typeInferenceAsync(UnifyResultListener resultListener, Writer logFile) - throws ClassNotFoundException, IOException { - List allClasses = new ArrayList<>();// environment.getAllAvailableClasses(); - // Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC - for (File f : this.sourceFiles.keySet()) { - SourceFile sf = sourceFiles.get(f); - allClasses.addAll(getAvailableClasses(sf)); - allClasses.addAll(sf.getClasses()); - allClasses.addAll(CompilationEnvironment.loadDefaultPackageClasses(f,classLoader).stream().map(ASTFactory::createClass).collect(Collectors.toList())); - } - - final ConstraintSet cons = getConstraints(); - Set> results = new HashSet<>(); - UnifyResultModel urm = null; - // urm.addUnifyResultListener(resultListener); - try { - logFile = logFile == null - ? new FileWriter(new File("log_" + sourceFiles.keySet().iterator().next().getName())) - : logFile; - IFiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses, logFile, classLoader); - System.out.println(finiteClosure); - urm = new UnifyResultModel(cons, finiteClosure); - urm.addUnifyResultListener(resultListener); - ConstraintSet unifyCons = UnifyTypeFactory.convert(cons); - - Function distributeInnerVars = x -> { - UnifyType lhs, rhs; - if (((lhs = x.getLhsType()) instanceof PlaceholderType) - && ((rhs = x.getRhsType()) instanceof PlaceholderType) - && (((PlaceholderType) lhs).isInnerType() || ((PlaceholderType) rhs).isInnerType())) { - ((PlaceholderType) lhs).setInnerType(true); - ((PlaceholderType) rhs).setInnerType(true); - } - return x; - - }; - logFile.write(unifyCons.toString()); - unifyCons = unifyCons.map(distributeInnerVars); - logFile.write(unifyCons.toString()); - TypeUnify unify = new TypeUnify(); - // Set> results = new HashSet<>(); Nach vorne gezogen - logFile.write("FC:\\" + finiteClosure.toString() + "\n"); - for (SourceFile sf : this.sourceFiles.values()) { - logFile.write(ASTTypePrinter.print(sf)); - } - logFile.flush(); - - Set methodParaTypeVarNames = allClasses.stream().map(x -> x.getMethods().stream() - .map(y -> y.getParameterList().getFormalparalist().stream() - .filter(z -> z.getType() instanceof TypePlaceholder) - .map(z -> ((TypePlaceholder) z.getType()).getName()) - .collect(Collectors.toCollection(HashSet::new))) - .reduce(new HashSet(), (a, b) -> { - a.addAll(b); - return a; - }, (a, b) -> { - a.addAll(b); - return a; - })).reduce(new HashSet(), (a, b) -> { - a.addAll(b); - return a; - }); - - Set constructorParaTypeVarNames = allClasses.stream().map(x -> x.getConstructors().stream() - .map(y -> y.getParameterList().getFormalparalist().stream() - .filter(z -> z.getType() instanceof TypePlaceholder) - .map(z -> ((TypePlaceholder) z.getType()).getName()) - .collect(Collectors.toCollection(HashSet::new))) - .reduce(new HashSet(), (a, b) -> { - a.addAll(b); - return a; - }, (a, b) -> { - a.addAll(b); - return a; - })).reduce(new HashSet(), (a, b) -> { - a.addAll(b); - return a; - }); - - Set paraTypeVarNames = methodParaTypeVarNames; - paraTypeVarNames.addAll(constructorParaTypeVarNames); - - Set returnTypeVarNames = allClasses.stream() - .map(x -> x.getMethods().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder) - .map(z -> ((TypePlaceholder) z.getReturnType()).getName()) - .collect(Collectors.toCollection(HashSet::new))) - .reduce((a, b) -> { - a.addAll(b); - return a; - }).get(); - - Set fieldTypeVarNames = allClasses.stream() - .map(x -> x.getFieldDecl().stream().filter(y -> y.getReturnType() instanceof TypePlaceholder) - .map(z -> ((TypePlaceholder) z.getReturnType()).getName()) - .collect(Collectors.toCollection(HashSet::new))) - .reduce((a, b) -> { - a.addAll(b); - return a; - }).get(); - - returnTypeVarNames.addAll(fieldTypeVarNames); - - unifyCons = unifyCons.map(x -> { - // Hier muss ueberlegt werden, ob - // 1. alle Argument- und Retuntyp-Variablen in allen UnifyPairs - // mit disableWildcardtable() werden. - // 2. alle Typvariablen mit Argument- oder Retuntyp-Variablen - // in Beziehung auch auf disableWildcardtable() gesetzt werden muessen - // PL 2018-04-23 - if ((x.getLhsType() instanceof PlaceholderType)) { - if (paraTypeVarNames.contains(x.getLhsType().getName())) { - ((PlaceholderType) x.getLhsType()).setVariance((byte) 1); - ((PlaceholderType) x.getLhsType()).disableWildcardtable(); - } - if (returnTypeVarNames.contains(x.getLhsType().getName())) { - ((PlaceholderType) x.getLhsType()).setVariance((byte) -1); - ((PlaceholderType) x.getLhsType()).disableWildcardtable(); - } - } - if ((x.getRhsType() instanceof PlaceholderType)) { - if (paraTypeVarNames.contains(x.getRhsType().getName())) { - ((PlaceholderType) x.getRhsType()).setVariance((byte) 1); - ((PlaceholderType) x.getRhsType()).disableWildcardtable(); - } - if (returnTypeVarNames.contains(x.getRhsType().getName())) { - ((PlaceholderType) x.getRhsType()).setVariance((byte) -1); - ((PlaceholderType) x.getRhsType()).disableWildcardtable(); - } - } - return x;// HIER DIE JEWEILS RECHT BZW. LINKE SEITE AUF GLEICHE VARIANZ SETZEN WIE DIE - // JEWEILS ANDERE SEITE - }); - Set varianceTPHold; - Set varianceTPH = new HashSet<>(); - varianceTPH = varianceInheritanceConstraintSet(unifyCons); - - /* - * PL 2018-11-07 wird in varianceInheritanceConstraintSet erledigt do { //PL - * 2018-11-05 Huellenbildung Variance auf alle TPHs der Terme auf der jeweiligen - * //anderen Seite übertragen varianceTPHold = new HashSet<>(varianceTPH); - * varianceTPH = varianceInheritanceConstraintSet(unifyCons); unifyCons.map( y - * -> { if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() - * instanceof PlaceholderType)) { if - * (((PlaceholderType)y.getLhsType()).getVariance() != 0 && - * ((PlaceholderType)y.getRhsType()).getVariance() == 0) { - * ((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType( - * )).getVariance()); } if (((PlaceholderType)y.getLhsType()).getVariance() == 0 - * && ((PlaceholderType)y.getRhsType()).getVariance() != 0) { - * ((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType( - * )).getVariance()); } } return y; } ); } while - * (!varianceTPHold.equals(varianceTPH)); - */ - - // Set> result = unify.unifySequential(xConsSet, finiteClosure, - // logFile, log); - // Set> result = unify.unify(xConsSet, finiteClosure); - List>> oderConstraints = unifyCons.getOderConstraints()/*.stream().map(x -> { - Set> ret = new HashSet<>(); - for (Constraint y : x) { - ret.add(new HashSet<>(y)); - } - return ret; - }).collect(Collectors.toCollection(ArrayList::new))*/; - unify.unifyAsync(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm, - usedTasks); - } catch (IOException e) { - System.err.println("kein LogFile"); - } - return urm; - } public List typeInference() throws ClassNotFoundException, IOException { List allClasses = new ArrayList<>();// environment.getAllAvailableClasses(); @@ -692,46 +367,14 @@ public class JavaTXCompiler { } }))); */ - - System.out.println("Unify nach Oder-Constraints-Anpassung:" + unifyCons.toString()); - Set varianceTPHold; - Set varianceTPH = new HashSet<>(); - varianceTPH = varianceInheritanceConstraintSet(unifyCons); - /* - * PL 2018-11-07 wird in varianceInheritanceConstraintSet erledigt do { //PL - * 2018-11-05 Huellenbildung Variance auf alle TPHs der Terme auf der jeweiligen - * //anderen Seite übertragen varianceTPHold = new HashSet<>(varianceTPH); - * varianceTPH = varianceInheritanceConstraintSet(unifyCons); unifyCons.map( y - * -> { if ((y.getLhsType() instanceof PlaceholderType) && (y.getRhsType() - * instanceof PlaceholderType)) { if - * (((PlaceholderType)y.getLhsType()).getVariance() != 0 && - * ((PlaceholderType)y.getRhsType()).getVariance() == 0) { - * ((PlaceholderType)y.getRhsType()).setVariance(((PlaceholderType)y.getLhsType( - * )).getVariance()); } if (((PlaceholderType)y.getLhsType()).getVariance() == 0 - * && ((PlaceholderType)y.getRhsType()).getVariance() != 0) { - * ((PlaceholderType)y.getLhsType()).setVariance(((PlaceholderType)y.getRhsType( - * )).getVariance()); } } return y; } ); } while - * (!varianceTPHold.equals(varianceTPH)); - */ - - // Set> result = unify.unifySequential(xConsSet, finiteClosure, - // logFile, log); - // Set> result = unify.unify(xConsSet, finiteClosure); - List>> oderConstraints = unifyCons.getOderConstraints()//.stream().map(x -> { - /*Set> ret = new HashSet<>(); - for (Constraint y : x) { - ret.add(new HashSet<>(y)); - } - return ret; - }).collect(Collectors.toCollection(ArrayList::new))*/; + List>> oderConstraints = unifyCons.getOderConstraints(); if (resultmodel) { /* UnifyResultModel Anfang */ UnifyResultModel urm = new UnifyResultModel(cons, finiteClosure); UnifyResultListenerImpl li = new UnifyResultListenerImpl(); urm.addUnifyResultListener(li); - unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm, - usedTasks); + unify.unifyParallel(unifyCons.getUndConstraints(), oderConstraints, finiteClosure, logFile, log, urm); System.out.println("RESULT Final: " + li.getResults()); logFile.write("RES_FINAL: " + li.getResults().toString() + "\n"); logFile.flush(); @@ -743,7 +386,7 @@ public class JavaTXCompiler { // oderConstraints, finiteClosure, logFile, log, new UnifyResultModel(cons, // finiteClosure)); Set> result = unify.unifyOderConstraints(unifyCons.getUndConstraints(), oderConstraints, - finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure), usedTasks); + finiteClosure, logFile, log, new UnifyResultModel(cons, finiteClosure)); System.out.println("RESULT: " + result); logFile.write("RES: " + result.toString() + "\n"); logFile.flush(); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java index d78d8c8d..153e929c 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify.java @@ -28,8 +28,8 @@ public class TypeUnify { * @param cons * @return */ - public Set> unify(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); + public Set> unify(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); Set> res = unifyTask.join(); @@ -54,8 +54,8 @@ public class TypeUnify { * @param ret * @return */ - public UnifyResultModel unifyAsync(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); + public UnifyResultModel unifyAsync(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); return ret; @@ -68,12 +68,11 @@ public class TypeUnify { * @param fc * @param logFile * @param log - * @param cons * @param ret * @return */ - public UnifyResultModel unifyParallel(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks); + public UnifyResultModel unifyParallel(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(unifyTask); Set> res = unifyTask.join(); @@ -102,11 +101,10 @@ public class TypeUnify { * @param fc * @param logFile * @param log - * @param cons * @return */ - public Set> unifyOderConstraints(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret, UnifyTaskModel usedTasks) { - TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks); + public Set> unifyOderConstraints(Set undConstrains, List>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModel ret) { + TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret); Set> res = unifyTask.compute(); try { logFile.write("\nnoShortendElements: " + unifyTask.noShortendElements +"\n"); diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java index 798c6f05..1c1a49a5 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnify2Task.java @@ -18,8 +18,8 @@ public class TypeUnify2Task extends TypeUnifyTask { Set> setToFlatten; - public TypeUnify2Task(Set> setToFlatten, Set eq, List>> oderConstraints, Set nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) { - super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); + public TypeUnify2Task(Set> setToFlatten, Set eq, List>> oderConstraints, Set nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm) { + super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm); this.setToFlatten = setToFlatten; this.nextSetElement = nextSetElement; } @@ -30,35 +30,7 @@ public class TypeUnify2Task extends TypeUnifyTask { @Override protected Set> compute() { - if (one) { - System.out.println("two"); - } - one = true; Set> res = unify2(setToFlatten, eq, oderConstraintsField, fc, parallel, rekTiefeField, true); - /*if (isUndefinedPairSetSet(res)) { - return new HashSet<>(); } - else - */ - //writeLog("xxx"); - //noOfThread--; - synchronized (usedTasks) { - if (this.myIsCancelled()) { - return new HashSet<>(); - } - else { - return res; - } - } + return res; } - - public void closeLogFile() { - - try { - logFile.close(); - } - catch (IOException ioE) { - System.err.println("no log-File" + thNo); - } - - } } diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 6de6b9de..ec613cd0 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -76,11 +76,6 @@ public class TypeUnifyTask extends RecursiveTask>> { * Fuer die Threads */ UnifyResultModel urm; - protected static int noOfThread = 0; - private static int totalnoOfThread = 0; - int thNo; - protected boolean one = false; - Integer MaxNoOfThreads = 8; public static final String rootDirectory = System.getProperty("user.dir")+"/test/logFiles/"; Writer logFile; @@ -123,31 +118,13 @@ public class TypeUnifyTask extends RecursiveTask>> { static int noBacktracking; static Integer noShortendElements = 0; - - Boolean myIsCanceled = false; - - volatile UnifyTaskModel usedTasks; - + public TypeUnifyTask() { rules = new RuleSet(); } - /* - public TypeUnifyTask(Set eq, IFiniteClosure fc, boolean parallel, FileWriter logFile, Boolean log) { - this.eq = eq; - this.fc = fc; - this.oup = new OrderingUnifyPair(fc); - this.parallel = parallel; - this.logFile = logFile; - this.log = log; - rules = new RuleSet(logFile); - noOfThread++; - thNo = noOfThread; - } - */ - - public TypeUnifyTask(Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm, UnifyTaskModel usedTasks) { + public TypeUnifyTask(Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModel urm) { synchronized (this) { this.eq = eq; //this.oderConstraints = oderConstraints.stream().map(x -> x.stream().map(y -> new HashSet<>(y)).collect(Collectors.toSet(HashSet::new))).collect(Collectors.toList(ArrayList::new)); @@ -167,21 +144,7 @@ public class TypeUnifyTask extends RecursiveTask>> { this.parallel = parallel; this.logFile = logFile; this.log = log; - - noOfThread++; - totalnoOfThread++; - //writeLog("thNo1 " + thNo); - thNo = totalnoOfThread; - writeLog("thNo2 " + thNo); - try { - this.logFile = //new OutputStreamWriter(new NullOutputStream()); - //new FileWriter(new File(System.getProperty("user.dir")+"/src/test/resources/logFiles/"+"Thread_"+thNo)); - new FileWriter(new File(System.getProperty("user.dir")+"/logFiles/"+"Thread_"+thNo)); - logFile.write(""); - } - catch (IOException e) { - System.err.println("log-File nicht vorhanden"); - } + /*Abbruchtest if (thNo > 10) { System.out.println("cancel"); @@ -199,56 +162,10 @@ public class TypeUnifyTask extends RecursiveTask>> { rules = new RuleSet(logFile); this.rekTiefeField = rekTiefe; this.urm = urm; - this.usedTasks = usedTasks; - this.usedTasks.add(this); } } - /** - * Vererbt alle Variancen - * @param eq The set of constraints - */ - /* PL 2018-05- 17 verschoben nach JavaTXCompiler - private void varianceInheritance(Set eq) { - Set usedTPH = new HashSet<>(); - Set phSet = eq.stream().map(x -> { - Set pair = new HashSet<>(); - if (x.getLhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getLhsType()); - if (x.getRhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getRhsType()); - return pair; - }).reduce(new HashSet<>(), (a,b) -> { a.addAll(b); return a;} , (c,d) -> { c.addAll(d); return c;}); - - ArrayList phSetVariance = new ArrayList<>(phSet); - phSetVariance.removeIf(x -> (x.getVariance() == 0)); - while(!phSetVariance.isEmpty()) { - PlaceholderType a = phSetVariance.remove(0); - usedTPH.add(a); - //HashMap ht = new HashMap<>(); - //ht.put(a, a.getVariance()); - Set eq1 = new HashSet<>(eq); - eq1.removeIf(x -> !(x.getLhsType() instanceof PlaceholderType && ((PlaceholderType)x.getLhsType()).equals(a))); - eq1.stream().forEach(x -> { x.getRhsType().accept(new distributeVariance(), a.getVariance());}); - eq1 = new HashSet<>(eq); - eq1.removeIf(x -> !(x.getRhsType() instanceof PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a))); - eq1.stream().forEach(x -> { x.getLhsType().accept(new distributeVariance(), a.getVariance());}); - phSetVariance = new ArrayList<>(phSet); - phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x))); - } -} -*/ - void myCancel(Boolean b) { - myIsCanceled = true; - } - - public boolean myIsCancelled() { - return myIsCanceled; - } - protected Set> compute() { - if (one) { - System.out.println("two"); - } - one = true; Set neweq = new HashSet<>(eq); /* 1-elementige Oder-Constraints werden in und-Constraints umgewandelt */ oderConstraintsField.stream() @@ -258,7 +175,6 @@ public class TypeUnifyTask extends RecursiveTask>> { .filter(x -> x.size()>1) .collect(Collectors.toCollection(ArrayList::new)); Set> res = unify(neweq, remainingOderconstraints, fc, parallel, rekTiefeField, true); - noOfThread--; try { logFile.close(); } @@ -269,15 +185,10 @@ public class TypeUnifyTask extends RecursiveTask>> { throw new TypeinferenceException("Unresolved constraints: " + res.toString(), new NullToken()); //return new HashSet<>(); } else { - synchronized (usedTasks) { - if (this.myIsCancelled()) { - return new HashSet<>(); - } - else { return res; } - } - } + + } /* @Override @@ -300,23 +211,7 @@ public class TypeUnifyTask extends RecursiveTask>> { * @return The set of all principal type unifiers */ protected Set> unify(final Set eq, List>> oderConstraints, IFiniteClosure fc, boolean parallel, int rekTiefe, Boolean finalresult) { - //Set aas = eq.stream().filter(x -> x.getLhsType().getName().equals("AA") //&& x.getPairOp().equals(PairOperator.SMALLERDOT) - // ).collect(Collectors.toCollection(HashSet::new)); - //writeLog(nOfUnify.toString() + " AA: " + aas.toString()); - //if (aas.isEmpty()) { - // System.out.println(""); - //} - //.collect(Collectors.toCollection(HashSet::new))); - /* - * Step 1: Repeated application of reduce, adapt, erase, swap - */ - synchronized (usedTasks) { - if (this.myIsCancelled()) { - return new HashSet<>(); - } - } - rekTiefe++; nOfUnify++; writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString()); @@ -474,12 +369,7 @@ public class TypeUnifyTask extends RecursiveTask>> { // .stream().map(x -> new HashSet<>(x)) // .collect(Collectors.toCollection(HashSet::new)); //Muss auskommentiert werden, wenn computeCartesianRecursive ENDE - - synchronized (usedTasks) { - if (this.myIsCancelled()) { - return new HashSet<>(); - } - } + Set> eqPrimePrimeSet = new HashSet<>(); @@ -837,7 +727,7 @@ public class TypeUnifyTask extends RecursiveTask>> { } /* PL 2019-03-11 Ende eingefuegt Vergleich mit anderen Paaren ggf. loeschen */ - if(parallel && (variance == 1) && noOfThread <= MaxNoOfThreads) { + if(parallel && (variance == 1)) { Set forks = new HashSet<>(); Set newEqOrig = new HashSet<>(eq); Set> newElemsOrig = new HashSet<>(elems); @@ -847,12 +737,6 @@ public class TypeUnifyTask extends RecursiveTask>> { /* FORK ANFANG */ TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks); //forks.add(forkOrig); - synchronized(usedTasks) { - if (this.myIsCancelled()) { - return new HashSet<>(); - } - forkOrig.fork(); - } /* FORK ENDE */ synchronized (this) { diff --git a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java b/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java deleted file mode 100644 index e60054f0..00000000 --- a/src/main/java/de/dhbwstuttgart/typeinference/unify/UnifyTaskModel.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.dhbwstuttgart.typeinference.unify; - -import java.util.ArrayList; - -public class UnifyTaskModel { - - ArrayList usedTasks = new ArrayList<>(); - - public synchronized void add(TypeUnifyTask t) { - usedTasks.add(t); - } - - public synchronized void cancel() { - for(TypeUnifyTask t : usedTasks) { - t.myCancel(true); - } - } -}