modified: ../../src/de/dhbwstuttgart/core/JavaTXCompiler.java
Variancenvererbung eingefuegt modified: ../../src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java Variancenvererbung geloescht modified: ../../src/de/dhbwstuttgart/typeinference/unify/model/PlaceholderType.java modified: ../../test/typeinference/UnifyTest.java
This commit is contained in:
parent
bc2cab8c95
commit
8baff8f376
@ -24,6 +24,7 @@ import de.dhbwstuttgart.typeinference.result.ResultSet;
|
|||||||
import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
|
import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
|
||||||
import de.dhbwstuttgart.typeinference.unify.RuleSet;
|
import de.dhbwstuttgart.typeinference.unify.RuleSet;
|
||||||
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
|
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.distributeVariance;
|
||||||
import de.dhbwstuttgart.typeinference.unify.inheritVariance;
|
import de.dhbwstuttgart.typeinference.unify.inheritVariance;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
||||||
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
|
||||||
@ -166,6 +167,7 @@ public class JavaTXCompiler {
|
|||||||
}
|
}
|
||||||
return y; } )
|
return y; } )
|
||||||
.collect(Collectors.toCollection(HashSet::new));
|
.collect(Collectors.toCollection(HashSet::new));
|
||||||
|
varianceInheritance(xConsSet);
|
||||||
Set<Set<UnifyPair>> result = unify.unifySequential(xConsSet, finiteClosure, logFile);
|
Set<Set<UnifyPair>> result = unify.unifySequential(xConsSet, finiteClosure, logFile);
|
||||||
//Set<Set<UnifyPair>> result = unify.unify(xConsSet, finiteClosure);
|
//Set<Set<UnifyPair>> result = unify.unify(xConsSet, finiteClosure);
|
||||||
System.out.println("RESULT: " + result);
|
System.out.println("RESULT: " + result);
|
||||||
@ -180,7 +182,36 @@ public class JavaTXCompiler {
|
|||||||
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Vererbt alle Variancen
|
||||||
|
* @param eq The set of constraints
|
||||||
|
*/
|
||||||
|
private void varianceInheritance(Set<UnifyPair> eq) {
|
||||||
|
Set<PlaceholderType> usedTPH = new HashSet<>();
|
||||||
|
Set<PlaceholderType> phSet = eq.stream().map(x -> {
|
||||||
|
Set<PlaceholderType> 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<PlaceholderType> phSetVariance = new ArrayList<>(phSet);
|
||||||
|
phSetVariance.removeIf(x -> (x.getVariance() == 0));
|
||||||
|
while(!phSetVariance.isEmpty()) {
|
||||||
|
PlaceholderType a = phSetVariance.remove(0);
|
||||||
|
usedTPH.add(a);
|
||||||
|
//HashMap<PlaceholderType,Integer> ht = new HashMap<>();
|
||||||
|
//ht.put(a, a.getVariance());
|
||||||
|
Set<UnifyPair> 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)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints) {
|
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints) {
|
||||||
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
||||||
|
@ -87,11 +87,14 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
rules = new RuleSet(logFile);
|
rules = new RuleSet(logFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vererbt alle Variancen
|
* Vererbt alle Variancen
|
||||||
* @param eq The set of constraints
|
* @param eq The set of constraints
|
||||||
*/
|
*/
|
||||||
|
/* PL 2018-05- 17 verschoben nach JavaTXCompiler
|
||||||
private void varianceInheritance(Set<UnifyPair> eq) {
|
private void varianceInheritance(Set<UnifyPair> eq) {
|
||||||
|
Set<PlaceholderType> usedTPH = new HashSet<>();
|
||||||
Set<PlaceholderType> phSet = eq.stream().map(x -> {
|
Set<PlaceholderType> phSet = eq.stream().map(x -> {
|
||||||
Set<PlaceholderType> pair = new HashSet<>();
|
Set<PlaceholderType> pair = new HashSet<>();
|
||||||
if (x.getLhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getLhsType());
|
if (x.getLhsType() instanceof PlaceholderType) pair.add((PlaceholderType)x.getLhsType());
|
||||||
@ -103,36 +106,20 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
phSetVariance.removeIf(x -> (x.getVariance() == 0));
|
phSetVariance.removeIf(x -> (x.getVariance() == 0));
|
||||||
while(!phSetVariance.isEmpty()) {
|
while(!phSetVariance.isEmpty()) {
|
||||||
PlaceholderType a = phSetVariance.remove(0);
|
PlaceholderType a = phSetVariance.remove(0);
|
||||||
HashMap<PlaceholderType,Integer> ht = new HashMap<>();
|
usedTPH.add(a);
|
||||||
ht.put(a, a.getVariance());
|
//HashMap<PlaceholderType,Integer> ht = new HashMap<>();
|
||||||
eq.stream().forEach(x -> {
|
//ht.put(a, a.getVariance());
|
||||||
x.getLhsType().accept(new inheritVariance(), ht);
|
Set<UnifyPair> eq1 = new HashSet<>(eq);
|
||||||
if (x.getLhsType() instanceof PlaceholderType
|
eq1.removeIf(x -> !(x.getLhsType() instanceof PlaceholderType && ((PlaceholderType)x.getLhsType()).equals(a)));
|
||||||
&& ((PlaceholderType)x.getLhsType()).equals(a)//) {
|
eq1.stream().forEach(x -> { x.getRhsType().accept(new distributeVariance(), a.getVariance());});
|
||||||
//((PlaceholderType)x.getLhsType()).setVariance(a.getVariance());
|
eq1 = new HashSet<>(eq);
|
||||||
//if
|
eq1.removeIf(x -> !(x.getRhsType() instanceof PlaceholderType && ((PlaceholderType)x.getRhsType()).equals(a)));
|
||||||
&& x.getRhsType() instanceof PlaceholderType
|
eq1.stream().forEach(x -> { x.getLhsType().accept(new distributeVariance(), a.getVariance());});
|
||||||
&& ((PlaceholderType)x.getRhsType()).getVariance() == 0) {
|
phSetVariance = new ArrayList<>(phSet);
|
||||||
((PlaceholderType)x.getRhsType()).setVariance(a.getVariance());
|
phSetVariance.removeIf(x -> (x.getVariance() == 0 || usedTPH.contains(x)));
|
||||||
phSetVariance.add((PlaceholderType)x.getRhsType());
|
|
||||||
//}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
eq.stream().forEach(x -> {
|
|
||||||
x.getRhsType().accept(new inheritVariance(), ht);
|
|
||||||
if (x.getRhsType() instanceof PlaceholderType
|
|
||||||
&& ((PlaceholderType)x.getRhsType()).equals(a)//) {
|
|
||||||
//((PlaceholderType)x.getRhsType()).setVariance(a.getVariance());
|
|
||||||
//if
|
|
||||||
&& x.getLhsType() instanceof PlaceholderType
|
|
||||||
&& ((PlaceholderType)x.getLhsType()).getVariance() == 0) {
|
|
||||||
((PlaceholderType)x.getLhsType()).setVariance(a.getVariance());
|
|
||||||
phSetVariance.add((PlaceholderType)x.getLhsType());
|
|
||||||
//}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Set<Set<UnifyPair>> compute() {
|
protected Set<Set<UnifyPair>> compute() {
|
||||||
Set<Set<UnifyPair>> res = unify(eq, fc, parallel);
|
Set<Set<UnifyPair>> res = unify(eq, fc, parallel);
|
||||||
@ -156,7 +143,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
|
|||||||
/*
|
/*
|
||||||
* Variancen auf alle Gleichungen vererben
|
* Variancen auf alle Gleichungen vererben
|
||||||
*/
|
*/
|
||||||
varianceInheritance(eq);
|
//PL 2018-05-17 nach JavaTXCompiler verschoben
|
||||||
|
//varianceInheritance(eq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ? extends ? extends Theta rausfiltern
|
* ? extends ? extends Theta rausfiltern
|
||||||
|
@ -136,7 +136,9 @@ public final class PlaceholderType extends UnifyType{
|
|||||||
UnifyType apply(Unifier unif) {
|
UnifyType apply(Unifier unif) {
|
||||||
if(unif.hasSubstitute(this)) {
|
if(unif.hasSubstitute(this)) {
|
||||||
UnifyType ret = unif.getSubstitute(this);
|
UnifyType ret = unif.getSubstitute(this);
|
||||||
ret.accept(new distributeVariance(), this.getVariance());
|
//PL 2018-05-17 Auskommentierung muesste korrekt sein,
|
||||||
|
//bereits in JavaTXComplier Variancen gesetzt werden.
|
||||||
|
//ret.accept(new distributeVariance(), this.getVariance());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
@ -34,10 +34,12 @@ public class UnifyTest {
|
|||||||
execute(new File(rootDirectory+"LambdaField.jav"));
|
execute(new File(rootDirectory+"LambdaField.jav"));
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
@Test
|
@Test
|
||||||
public void lambda2() throws IOException, ClassNotFoundException {
|
public void lambda2() throws IOException, ClassNotFoundException {
|
||||||
execute(new File(rootDirectory+"Lambda2.jav"));
|
execute(new File(rootDirectory+"Lambda2.jav"));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
@Test
|
@Test
|
||||||
public void lambda3() throws IOException, ClassNotFoundException {
|
public void lambda3() throws IOException, ClassNotFoundException {
|
||||||
@ -65,14 +67,14 @@ public class UnifyTest {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
@Test
|
@Test
|
||||||
public void matrix() throws IOException, ClassNotFoundException {
|
public void matrix() throws IOException, ClassNotFoundException {
|
||||||
execute(new File(rootDirectory+"Matrix.jav"));
|
execute(new File(rootDirectory+"Matrix.jav"));
|
||||||
//JavaTXCompiler compiler = new JavaTXCompiler(new File(rootDirectory+"Matrix.jav"));
|
//JavaTXCompiler compiler = new JavaTXCompiler(new File(rootDirectory+"Matrix.jav"));
|
||||||
//compiler.generateBytecode();
|
//compiler.generateBytecode();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
@Test
|
@Test
|
||||||
public void vector() throws IOException, ClassNotFoundException {
|
public void vector() throws IOException, ClassNotFoundException {
|
||||||
|
Loading…
Reference in New Issue
Block a user