Merge branch 'unify' of ssh://gohorb.ba-horb.de/bahome/projekt/git/JavaCompilerCore into refactoring

This commit is contained in:
JanUlrich 2016-04-29 03:09:31 +02:00
commit f2410154aa
6 changed files with 269 additions and 54 deletions

View File

@ -124,7 +124,7 @@ public class UnifyTypeFactory {
} }
public static UnifyType convert(GenericTypeVar t){ public static UnifyType convert(GenericTypeVar t){
return new ReferenceType(t.get_Name()); return new PlaceholderType(t.get_Name());
} }
public static UnifyConstraintsSet convert(ConstraintsSet constraints) { public static UnifyConstraintsSet convert(ConstraintsSet constraints) {

View File

@ -8,9 +8,17 @@ import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class TypeUnify { public class TypeUnify {
public Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc) { public Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc) {
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc); TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, true);
ForkJoinPool pool = new ForkJoinPool(); ForkJoinPool pool = new ForkJoinPool();
pool.invoke(unifyTask); pool.invoke(unifyTask);
return unifyTask.join(); Set<Set<UnifyPair>> res = unifyTask.join();
return res;
} }
public Set<Set<UnifyPair>> unifySequential(Set<UnifyPair> eq, IFiniteClosure fc) {
TypeUnifyTask unifyTask = new TypeUnifyTask(eq, fc, false);
Set<Set<UnifyPair>> res = unifyTask.compute();
return res;
}
} }

View File

@ -54,14 +54,17 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
protected IFiniteClosure fc; protected IFiniteClosure fc;
public TypeUnifyTask(Set<UnifyPair> eq, IFiniteClosure fc) { protected boolean parallel;
public TypeUnifyTask(Set<UnifyPair> eq, IFiniteClosure fc, boolean parallel) {
this.eq = eq; this.eq = eq;
this.fc = fc; this.fc = fc;
this.parallel = parallel;
} }
@Override @Override
protected Set<Set<UnifyPair>> compute() { protected Set<Set<UnifyPair>> compute() {
return unify(eq, fc); return unify(eq, fc, parallel);
} }
/** /**
@ -70,7 +73,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
* @param fc The finite closure * @param fc The finite closure
* @return The set of all principal type unifiers * @return The set of all principal type unifiers
*/ */
public Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc) { protected Set<Set<UnifyPair>> unify(Set<UnifyPair> eq, IFiniteClosure fc, boolean parallel) {
/* /*
* Step 1: Repeated application of reduce, adapt, erase, swap * Step 1: Repeated application of reduce, adapt, erase, swap
*/ */
@ -165,25 +168,35 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
/* /*
* Step 6 a) Restart (fork) for pairs where subst was applied * Step 6 a) Restart (fork) for pairs where subst was applied
*/ */
if(parallel) {
if (eqPrime.equals(eq)) if (eqPrime.equals(eq))
eqPrimePrimeSet.add(eqPrime); eqPrimePrimeSet.add(eqPrime);
else if(eqPrimePrime.isPresent()) { else if(eqPrimePrime.isPresent()) {
TypeUnifyTask fork = new TypeUnifyTask(eqPrimePrime.get(), fc); TypeUnifyTask fork = new TypeUnifyTask(eqPrimePrime.get(), fc, true);
forks.add(fork); forks.add(fork);
fork.fork(); fork.fork();
} }
else { else {
TypeUnifyTask fork = new TypeUnifyTask(eqPrime, fc); TypeUnifyTask fork = new TypeUnifyTask(eqPrime, fc, true);
forks.add(fork); forks.add(fork);
fork.fork(); fork.fork();
} }
} }
else { // sequentiell (Step 6b is included)
if (eqPrime.equals(eq))
eqPrimePrimeSet.add(eqPrime);
else if(eqPrimePrime.isPresent())
eqPrimePrimeSet.addAll(unify(eqPrimePrime.get(), fc, false));
else
eqPrimePrimeSet.addAll(unify(eqPrime, fc, false));
}
}
/* /*
* Step 6 b) Build the union over everything. * Step 6 b) Build the union over everything.
*/ */
// TODO Parallel stream und synced set? if(parallel)
for(TypeUnifyTask fork : forks) for(TypeUnifyTask fork : forks)
eqPrimePrimeSet.addAll(fork.join()); eqPrimePrimeSet.addAll(fork.join());
@ -280,6 +293,12 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
optSet = optSet.isPresent() ? optSet : rules.reduceTphExt(pair); optSet = optSet.isPresent() ? optSet : rules.reduceTphExt(pair);
optSet = optSet.isPresent() ? optSet : rules.reduceTphSup(pair); optSet = optSet.isPresent() ? optSet : rules.reduceTphSup(pair);
// FunN Rules
optSet = optSet.isPresent() ? optSet : rules.reduceFunN(pair);
optSet = optSet.isPresent() ? optSet : rules.greaterFunN(pair);
optSet = optSet.isPresent() ? optSet : rules.smallerFunN(pair);
// One of the rules has been applied // One of the rules has been applied
if(optSet.isPresent()) { if(optSet.isPresent()) {
optSet.get().forEach(x -> swapAddOrErase(x, fc, eqQueue)); optSet.get().forEach(x -> swapAddOrErase(x, fc, eqQueue));
@ -423,7 +442,11 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
candidateParams.add(fc.grArg(param)); candidateParams.add(fc.grArg(param));
for(TypeParams tp : permuteParams(candidateParams)) for(TypeParams tp : permuteParams(candidateParams))
try {
thetaQPrimes.add(c.setTypeParams(tp)); thetaQPrimes.add(c.setTypeParams(tp));
} catch(Exception e) {
System.out.println("f");
}
} }
for(UnifyType tqp : thetaQPrimes) { for(UnifyType tqp : thetaQPrimes) {

View File

@ -233,7 +233,7 @@ public class FiniteClosure implements IFiniteClosure {
Unifier sigma2 = sigma2Opt.get(); Unifier sigma2 = sigma2Opt.get();
if(sigma2.size() == 0) // type.equals(theta2) if(sigma2.size() == 0) // type.equals(theta2)
continue; continue;
sigma2.swapPlaceholderSubstitutions(type.getTypeParams()); sigma2.swapPlaceholderSubstitutionsReverse(type.getTypeParams());
Set<UnifyType> theta1s = greater(theta2); Set<UnifyType> theta1s = greater(theta2);
for (UnifyType theta1 : theta1s) { for (UnifyType theta1 : theta1s) {
// Because only the most general type is calculated, sigma1 // Because only the most general type is calculated, sigma1

View File

@ -98,13 +98,30 @@ public class Unifier implements Function<UnifyType, UnifyType>, Iterable<Entry<P
if(!(tph instanceof PlaceholderType)) if(!(tph instanceof PlaceholderType))
continue; continue;
// Swap a substitutions (a -> b) if a is an element of the target params. // Swap a substitutions (a -> b) if a is an element of the target params.
if(substitutions.containsKey(tph) && substitutions.get(tph) instanceof PlaceholderType) { if(substitutions.containsKey(tph)) {
if((substitutions.get(tph) instanceof PlaceholderType)) {
PlaceholderType newLhs = (PlaceholderType) substitutions.get(tph); PlaceholderType newLhs = (PlaceholderType) substitutions.get(tph);
substitutions.remove(tph); substitutions.remove(tph);
substitutions.put(newLhs, tph); substitutions.put(newLhs, tph);
} }
} }
} }
}
public void swapPlaceholderSubstitutionsReverse(Iterable<UnifyType> sourceParams) {
for(UnifyType tph : sourceParams) {
if(!(tph instanceof PlaceholderType))
continue;
if(substitutions.containsValue(tph)) {
UnifyType key = substitutions.values().stream().filter(x -> x.equals(tph)).findAny().get();
if(key instanceof PlaceholderType) {
PlaceholderType newLhs = (PlaceholderType) tph;
substitutions.remove(key);
substitutions.put(newLhs, key);
}
}
}
}
@Override @Override
public String toString() { public String toString() {

View File

@ -11,13 +11,14 @@ import org.junit.Test;
import de.dhbwstuttgart.typeinference.unify.TypeUnify; import de.dhbwstuttgart.typeinference.unify.TypeUnify;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure; import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair; import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
import de.dhbwstuttgart.typeinference.unify.model.FunNType;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator; import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType; import de.dhbwstuttgart.typeinference.unify.model.PlaceholderType;
import de.dhbwstuttgart.typeinference.unify.model.UnifyType; import de.dhbwstuttgart.typeinference.unify.model.UnifyType;
import de.dhbwstuttgart.typeinference.unify.model.TypeParams; import de.dhbwstuttgart.typeinference.unify.model.TypeParams;
import junit.framework.Assert; import junit.framework.Assert;
public class UnifyTest extends TypeUnify{ public class UnifyTest {
/** /**
* Testing the unification for cases with (n)one pair and without generics. * Testing the unification for cases with (n)one pair and without generics.
@ -51,7 +52,7 @@ public class UnifyTest extends TypeUnify{
Set<UnifyPair> eq = new HashSet<UnifyPair>(); Set<UnifyPair> eq = new HashSet<UnifyPair>();
Set<Set<UnifyPair>> expected = new HashSet<>(); Set<Set<UnifyPair>> expected = new HashSet<>();
expected.add(new HashSet<>()); expected.add(new HashSet<>());
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
/* /*
@ -69,7 +70,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, doubl, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, doubl, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -87,7 +88,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, object, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, object, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -104,7 +105,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -128,7 +129,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supObject, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, supObject, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("? super Integer"); System.out.println("? super Integer");
System.out.println(actual); System.out.println(actual);
actual = filterGeneratedTPHsMultiple(actual); actual = filterGeneratedTPHsMultiple(actual);
@ -156,7 +157,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, supDouble, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, supDouble, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, supNumber, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
actual = filterGeneratedTPHsMultiple(actual); actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -174,7 +175,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, extNumber, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, extNumber, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, extObject, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, extObject, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
actual = filterGeneratedTPHsMultiple(actual); actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -199,7 +200,7 @@ public class UnifyTest extends TypeUnify{
addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, integer, PairOperator.EQUALSDOT));
addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT)); addAsSet(expected, new UnifyPair(tphA, number, PairOperator.EQUALSDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
actual = filterGeneratedTPHsMultiple(actual); actual = filterGeneratedTPHsMultiple(actual);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -216,7 +217,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
expected.add(new HashSet<>()); expected.add(new HashSet<>());
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -231,7 +232,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -248,7 +249,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOT)); addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOT));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -264,7 +265,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOTWC)); addAsSet(expected, new UnifyPair(tphA, tphB, PairOperator.SMALLERDOTWC));
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
@ -286,7 +287,7 @@ public class UnifyTest extends TypeUnify{
IFiniteClosure voidFC = fcb.getFiniteClosure(); IFiniteClosure voidFC = fcb.getFiniteClosure();
actual = unify(eq, voidFC); actual = new TypeUnify().unifySequential(eq, fc);
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
} }
@ -331,7 +332,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(tf.getSimpleType("List", tphB), tf.getSimpleType("List", extNum), PairOperator.SMALLERDOT)); eq.add(new UnifyPair(tf.getSimpleType("List", tphB), tf.getSimpleType("List", extNum), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>(); Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
//System.out.println(actual); //System.out.println(actual);
//Assert.assertEquals(actual, expected); //Assert.assertEquals(actual, expected);
@ -350,7 +351,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(tf.getSimpleType("Vector", extA), tf.getSimpleType("Vector", extNum), PairOperator.SMALLERDOT)); eq.add(new UnifyPair(tf.getSimpleType("Vector", extA), tf.getSimpleType("Vector", extNum), PairOperator.SMALLERDOT));
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
//System.out.println(actual); //System.out.println(actual);
//Assert.assertEquals(actual, expected); //Assert.assertEquals(actual, expected);
@ -366,7 +367,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(tf.getSimpleType("Vector", extNum), tf.getSimpleType("Vector", extA), PairOperator.SMALLERDOT)); eq.add(new UnifyPair(tf.getSimpleType("Vector", extNum), tf.getSimpleType("Vector", extA), PairOperator.SMALLERDOT));
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println(actual); System.out.println(actual);
//Assert.assertEquals(actual, expected); //Assert.assertEquals(actual, expected);
@ -387,7 +388,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(extNum, tphB, PairOperator.SMALLERDOTWC)); eq.add(new UnifyPair(extNum, tphB, PairOperator.SMALLERDOTWC));
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
//System.out.println(actual); //System.out.println(actual);
//Assert.assertEquals(actual, expected); //Assert.assertEquals(actual, expected);
@ -449,7 +450,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(tf.getSimpleType("List", integer), tf.getSimpleType("List", tphB), PairOperator.SMALLERDOT)); eq.add(new UnifyPair(tf.getSimpleType("List", integer), tf.getSimpleType("List", tphB), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>(); Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println(actual); System.out.println(actual);
//Assert.assertEquals(actual, expected); //Assert.assertEquals(actual, expected);
@ -469,7 +470,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Case 2"); System.out.println("Case 2");
System.out.println(actual); System.out.println(actual);
@ -489,7 +490,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Case 3"); System.out.println("Case 3");
@ -514,7 +515,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println(actual); System.out.println(actual);
//Assert.assertEquals(expected, actual); //Assert.assertEquals(expected, actual);
@ -533,7 +534,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println(actual); System.out.println(actual);
//Assert.assertEquals(expected, actual); //Assert.assertEquals(expected, actual);
@ -552,7 +553,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Case 7"); System.out.println("Case 7");
System.out.println(actual); System.out.println(actual);
@ -573,7 +574,7 @@ public class UnifyTest extends TypeUnify{
expected = new HashSet<>(); expected = new HashSet<>();
actual = unify(eq, fc); actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Case 8:"); System.out.println("Case 8:");
System.out.println(actual); System.out.println(actual);
@ -608,7 +609,7 @@ public class UnifyTest extends TypeUnify{
eq.add(new UnifyPair(tf.getSimpleType("Matrix"), tf.getSimpleType("Vector", tf.getPlaceholderType("a")), PairOperator.SMALLERDOT)); eq.add(new UnifyPair(tf.getSimpleType("Matrix"), tf.getSimpleType("Vector", tf.getPlaceholderType("a")), PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>(); Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Test Matrix:"); System.out.println("Test Matrix:");
System.out.println(actual); System.out.println(actual);
@ -675,7 +676,7 @@ public class UnifyTest extends TypeUnify{
expected.add(solution); expected.add(solution);
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Test Void:"); System.out.println("Test Void:");
System.out.println(actual); System.out.println(actual);
@ -683,6 +684,172 @@ public class UnifyTest extends TypeUnify{
Assert.assertEquals(expected, actual); Assert.assertEquals(expected, actual);
} }
// @Test
// public void unifyTestMatrixSimple() {
//// [(C <. C),
//// (D <. D),
//// (java.lang.Boolean <. PC),
//// (java.lang.Integer <. E1),
//// (java.util.Vector<java.lang.Integer> <. java.util.Vector<E1>),
//// (java.lang.Integer <. PD),
//// (java.util.Vector<java.lang.Integer> <. java.util.Vector<E3>),
//// (PE <. java.lang.Boolean),
//// (C <. java.lang.Integer),
//// (PD <. java.lang.Integer),
//// (PE <. java.lang.Boolean),
//// (E2 <. PF),
//// (C <. java.lang.Integer),
//// (java.util.Vector<java.lang.Integer> <. java.util.Vector<E2>),
//// (PG <. java.lang.Double),
//// (java.lang.Integer <. java.lang.Double),
//// (PF <. java.lang.Double),
//// (PG <. D),
//// (D <. PH),
//// (void <. B),
//// (void <. PI),
//// (Matrix <. java.util.Vector<E4>),
//// (void <. void)]
//
// TypeFactory tf = new TypeFactory();
// FiniteClosureBuilder fcb = new FiniteClosureBuilder();
//
// UnifyType tphC = tf.getPlaceholderType("C");
// UnifyType tphD = tf.getPlaceholderType("D");
// UnifyType tphPC = tf.getPlaceholderType("PC");
// UnifyType tphE1 = tf.getPlaceholderType("E1");
// UnifyType tphPD = tf.getPlaceholderType("PD");
// UnifyType tphE3 = tf.getPlaceholderType("E3");
// UnifyType tphPE = tf.getPlaceholderType("PE");
// UnifyType tphE2 = tf.getPlaceholderType("E2");
// UnifyType tphPG = tf.getPlaceholderType("PG");
// UnifyType tphPF = tf.getPlaceholderType("PF");
// UnifyType tphPH = tf.getPlaceholderType("PH");
// UnifyType tphPI = tf.getPlaceholderType("PI");
// UnifyType tphE4 = tf.getPlaceholderType("E4");
// UnifyType tphB = tf.getPlaceholderType("B");
//
// UnifyType integer = tf.getSimpleType("java.lang.Integer");
// UnifyType voidType = tf.getSimpleType("void");
// UnifyType bool = tf.getSimpleType("java.lang.Boolean");
// UnifyType object = tf.getSimpleType("java.lang.Object");
// UnifyType doubl = tf.getSimpleType("java.lang.Double");
// UnifyType number = tf.getSimpleType("java.lang.Number");
//
// fcb.add(integer, number);
// fcb.add(bool, object);
// fcb.add(doubl, number);
// fcb.add(number, object);
// fcb.add(voidType, voidType);
//
// IFiniteClosure fc = fcb.getFiniteClosure();
//
// Set<UnifyPair> eq = new HashSet<UnifyPair>();
// eq.add(new UnifyPair(tphC, tphC, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphD, tphD, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(bool, tphPC, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(integer, tphE1, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tf.getSimpleType("Vector", integer), tf.getSimpleType("Vector", tphE1), PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(integer, tphPD, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tf.getSimpleType("Vector", integer), tf.getSimpleType("Vector", tphE3), PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphPE, bool, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphC, integer, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphPD, integer, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphPE, bool, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphE2, tphPF, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphC, integer, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tf.getSimpleType("Vector", integer), tf.getSimpleType("Vector", tphE2), PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphPG, doubl, PairOperator.SMALLERDOT));
// //eq.add(new UnifyPair(integer, doubl, PairOperator.SMALLERDOT)); KEIN WUNDER INFERIERT DAS NICHT
// eq.add(new UnifyPair(tphPF, doubl, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphPG, tphD, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tphD, tphPH, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(voidType, tphB, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(voidType, tphPI, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(tf.getSimpleType("Matrix"), tphPI, PairOperator.SMALLERDOT));
// eq.add(new UnifyPair(voidType, tphPI, PairOperator.SMALLERDOT));
//
// Set<Set<UnifyPair>> expected = new HashSet<>();
//
// Set<Set<UnifyPair>> actual = unify(eq, fc);
//
// System.out.println("Test Void:");
// System.out.println(actual);
//
// //Assert.assertEquals(expected, actual);
// }
@Test
public void unifyTestLambda6() {
// [(D <. D),
// (R455538610 <. ND),
// (Matrix <. T1455538610),
// (C <. T2455538610),
// (B <. Fun2<R455538610,T1455538610,T2455538610>),
// (ND <. NE),
// (Fun1<? extends NE,? super B> <. NC),
// (NC <. NF),
// (Fun1<? extends NF,? super C> <. NB),
// (NB <. D),
// (void <. NG),
// (Matrix <. java.lang.Object),
// (void <. void)]
TypeFactory tf = new TypeFactory();
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
UnifyType tphD = tf.getPlaceholderType("D");
UnifyType tphND = tf.getPlaceholderType("ND");
UnifyType tphR4 = tf.getPlaceholderType("R4");
UnifyType tphT1 = tf.getPlaceholderType("T1");
UnifyType tphT2 = tf.getPlaceholderType("T2");
UnifyType tphC = tf.getPlaceholderType("C");
UnifyType tphNE = tf.getPlaceholderType("NE");
UnifyType tphNC = tf.getPlaceholderType("NC");
UnifyType tphB = tf.getPlaceholderType("B");
UnifyType tphNF = tf.getPlaceholderType("NF");
UnifyType tphNB = tf.getPlaceholderType("NB");
UnifyType tphNG = tf.getPlaceholderType("NG");
UnifyType voidType = tf.getSimpleType("void");
UnifyType object = tf.getSimpleType("java.lang.Object");
UnifyType matrix = tf.getSimpleType("java.lang.Matrix");
UnifyType r = tf.getPlaceholderType("R");
UnifyType t1 = tf.getPlaceholderType("T1");
UnifyType t2 = tf.getPlaceholderType("T2");
UnifyType fun1 = FunNType.getFunNType(new TypeParams(r, t1));
UnifyType fun2 = FunNType.getFunNType(new TypeParams(r, t1, t2));
fcb.add(matrix, object);
fcb.add(voidType, voidType);
IFiniteClosure fc = fcb.getFiniteClosure();
Set<UnifyPair> eq = new HashSet<UnifyPair>();
eq.add(new UnifyPair(tphD, tphD, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphR4, tphND, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(matrix, tphT1, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphC, tphT2, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphB, FunNType.getFunNType(new TypeParams(tphR4, tphT1, tphT2)), PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphND, tphNE, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(FunNType.getFunNType(new TypeParams(tphNE, tphB)), tphNC, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphNC, tphNF, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(FunNType.getFunNType(new TypeParams(tphNF, tphC)), tphNB, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(tphNB, tphD, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(voidType, tphNG, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(matrix, object, PairOperator.SMALLERDOT));
eq.add(new UnifyPair(voidType, voidType, PairOperator.SMALLERDOT));
Set<Set<UnifyPair>> expected = new HashSet<>();
Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Test Lambda6:");
System.out.println(actual);
//Assert.assertEquals(expected, actual);
}
@Test @Test
public void unifyTestOverloading(){ public void unifyTestOverloading(){
/* /*
@ -723,7 +890,7 @@ public class UnifyTest extends TypeUnify{
expectedSolution.add(new UnifyPair(tphT1, ol, PairOperator.EQUALSDOT)); expectedSolution.add(new UnifyPair(tphT1, ol, PairOperator.EQUALSDOT));
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Test Overloading:"); System.out.println("Test Overloading:");
System.out.println(actual); System.out.println(actual);
@ -774,7 +941,7 @@ public class UnifyTest extends TypeUnify{
solution.add(new UnifyPair(tphT2, integer, PairOperator.EQUALSDOT)); solution.add(new UnifyPair(tphT2, integer, PairOperator.EQUALSDOT));
expected.add(solution); expected.add(solution);
Set<Set<UnifyPair>> actual = unify(eq, fc); Set<Set<UnifyPair>> actual = new TypeUnify().unifySequential(eq, fc);
System.out.println("Test Subclass:"); System.out.println("Test Subclass:");
System.out.println(actual); System.out.println(actual);