10 Commits

Author SHA1 Message Date
NoName11234
48293b3243 reworked test for changes to multithreading 2024-05-15 15:50:34 +02:00
NoName11234
bab3511259 implemented scalark2test 2024-05-15 15:49:18 +02:00
NoName11234
46eb7b12e6 added matrix test 2024-05-10 20:25:11 +02:00
NoName11234
80c3e5d02c fixed issues from merging 2024-05-10 19:15:22 +02:00
NoName11234
cb9798dd5a Merge branch 'performanceTestRecursionOptimization' into newMain 2024-05-10 18:55:58 +02:00
NoName11234
0cdbc7a19a Merge branch 'performanceTestUnifyResultModel' into newMain 2024-05-10 18:46:13 +02:00
NoName11234
3bb7f38805 implemented ConstraintSetRepository 2024-05-01 20:05:28 +02:00
NoName11234
6a92b0f194 added class ConstraintSetRepository 2024-05-01 19:42:24 +02:00
NoName11234
69402677f7 implemented UnifyTaskModelParallel 2024-04-29 22:14:24 +02:00
NoName11234
2ffa86e821 added class UnifyTaskModelParallel 2024-04-29 21:43:30 +02:00
7 changed files with 712 additions and 123 deletions

View File

@@ -0,0 +1,21 @@
package de.dhbwstuttgart.typeinference.unify;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
import java.util.HashSet;
import java.util.Set;
public class ConstraintSetRepository {
private Set<Integer> sets = new HashSet<>();
public boolean containsSet(Set<Set<UnifyPair>> set){
Integer hash = Integer.valueOf(set.hashCode());
if(sets.contains(hash)){
return true;
}else{
sets.add(hash);
return false;
}
}
}

View File

@@ -24,10 +24,12 @@ public class TypeUnify {
* @param cons
* @return
*/
public Set<Set<UnifyPair>> unify(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModel usedTasks) {
public Set<Set<UnifyPair>> unify(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModelParallel usedTasks) {
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
ConstraintSetRepository constraintSetRepository = new ConstraintSetRepository();
usedTasks.setPool(pool);
ret.setPool(pool);
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, constraintSetRepository);
pool.invoke(unifyTask);
Set<Set<UnifyPair>> res = unifyTask.join();
try {
@@ -51,10 +53,12 @@ public class TypeUnify {
* @param ret
* @return
*/
public UnifyResultModelParallel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModel usedTasks) {
public UnifyResultModelParallel unifyAsync(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModelParallel usedTasks) {
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
ConstraintSetRepository constraintSetRepository = new ConstraintSetRepository();
usedTasks.setPool(pool);
ret.setPool(pool);
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, constraintSetRepository);
pool.invoke(unifyTask);
return ret;
}
@@ -70,11 +74,12 @@ public class TypeUnify {
* @param ret
* @return
*/
public UnifyResultModelParallel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModel usedTasks) {
public UnifyResultModelParallel unifyParallel(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModelParallel usedTasks) {
ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
ConstraintSetRepository constraintSetRepository = new ConstraintSetRepository();
usedTasks.setPool(pool);
ret.setPool(pool);
TypeUnifyTask unifyTask = //new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks);
new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, usedTasks, statistics);
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, true, logFile, log, 0, ret, constraintSetRepository, statistics);
pool.invoke(unifyTask);
Set<Set<UnifyPair>> res = unifyTask.join();
try {
@@ -107,8 +112,9 @@ public class TypeUnify {
* @param cons
* @return
*/
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModel usedTasks) {
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, usedTasks);
public Set<Set<UnifyPair>> unifyOderConstraints(Set<UnifyPair> undConstrains, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, Writer logFile, Boolean log, UnifyResultModelParallel ret, UnifyTaskModelParallel usedTasks) {
ConstraintSetRepository constraintSetRepository = new ConstraintSetRepository();
TypeUnifyTask unifyTask = new TypeUnifyTask(undConstrains, oderConstraints, fc, false, logFile, log, 0, ret, constraintSetRepository);
unifyTask.statistics = statistics;
Set<Set<UnifyPair>> res = unifyTask.compute();
try {

View File

@@ -15,62 +15,58 @@ import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
public class TypeUnify2Task extends TypeUnifyTask {
Set<Set<UnifyPair>> setToFlatten;
Set<UnifyPair> methodSignatureConstraintUebergabe;
//statistics
TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq,
List<Set<Constraint<UnifyPair>>> oderConstraints,
Set<UnifyPair> nextSetElement,
IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, UnifyTaskModel usedTasks,
Set<UnifyPair> methodSignatureConstraintUebergabe, Writer statistics) {
this(setToFlatten, eq, oderConstraints, nextSetElement, fc, parallel, logFile, log, rekTiefe, urm, usedTasks, methodSignatureConstraintUebergabe );
}
public TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, Set<UnifyPair> nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, UnifyTaskModel usedTasks, Set<UnifyPair> methodSignatureConstraintUebergabe) {
super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks);
this.setToFlatten = setToFlatten;
this.nextSetElement = nextSetElement;
this.methodSignatureConstraintUebergabe = methodSignatureConstraintUebergabe;
}
Set<UnifyPair> getNextSetElement() {
return nextSetElement;
}
@Override
protected Set<Set<UnifyPair>> compute() {
if (one) {
System.out.println("two");
}
one = true;
Set<Set<UnifyPair>> res = unify2(setToFlatten, eq, oderConstraintsField, fc, parallel, rekTiefeField, methodSignatureConstraintUebergabe);
Set<Set<UnifyPair>> setToFlatten;
Set<UnifyPair> methodSignatureConstraintUebergabe;
//statistics
TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq,
List<Set<Constraint<UnifyPair>>> oderConstraints,
Set<UnifyPair> nextSetElement,
IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm,
Set<UnifyPair> methodSignatureConstraintUebergabe, ConstraintSetRepository constraintSetRepository, Writer statistics) {
this(setToFlatten, eq, oderConstraints, nextSetElement, fc, parallel, logFile, log, rekTiefe, urm, methodSignatureConstraintUebergabe, constraintSetRepository);
}
public TypeUnify2Task(Set<Set<UnifyPair>> setToFlatten, Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, Set<UnifyPair> nextSetElement, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, Set<UnifyPair> methodSignatureConstraintUebergabe, ConstraintSetRepository constraintSetRepository) {
super(eq, oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, constraintSetRepository);
this.setToFlatten = setToFlatten;
this.nextSetElement = nextSetElement;
this.methodSignatureConstraintUebergabe = methodSignatureConstraintUebergabe;
}
Set<UnifyPair> getNextSetElement() {
return nextSetElement;
}
@Override
protected Set<Set<UnifyPair>> compute() {
if (one) {
System.out.println("two");
}
one = true;
Set<Set<UnifyPair>> res = new HashSet<>();
if (!constraintSetRepository.containsSet(setToFlatten)) {
res = unify2(setToFlatten, eq, oderConstraintsField, fc, parallel, rekTiefeField, methodSignatureConstraintUebergabe);
}
/*if (isUndefinedPairSetSet(res)) {
return new HashSet<>(); }
else
*/
//writeLog("xxx");
//noOfThread--;
synchronized (usedTasks) {
if (this.myIsCancelled()) {
return new HashSet<>();
}
else {
return res;
}
}
}
public void closeLogFile() {
*/
//writeLog("xxx");
//noOfThread--;
return res;
}
try {
logFile.close();
}
catch (IOException ioE) {
System.err.println("no log-File" + thNo);
}
}
public void closeLogFile() {
try {
logFile.close();
} catch (IOException ioE) {
System.err.println("no log-File" + thNo);
}
}
}

View File

@@ -125,11 +125,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
static Integer noShortendElements = 0;
Boolean myIsCanceled = false;
volatile UnifyTaskModel usedTasks;
static Writer statistics;
protected ConstraintSetRepository constraintSetRepository;
public TypeUnifyTask() {
rules = new RuleSet();
@@ -150,11 +147,11 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
*/
//statistics
public TypeUnifyTask(Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, UnifyTaskModel usedTasks, Writer statistics) {
this(eq,oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, usedTasks);
public TypeUnifyTask(Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, ConstraintSetRepository constraintSetRepository, Writer statistics) {
this(eq,oderConstraints, fc, parallel, logFile, log, rekTiefe, urm, constraintSetRepository);
this.statistics = statistics;
}
public TypeUnifyTask(Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, UnifyTaskModel usedTasks) {
public TypeUnifyTask(Set<UnifyPair> eq, List<Set<Constraint<UnifyPair>>> oderConstraints, IFiniteClosure fc, boolean parallel, Writer logFile, Boolean log, int rekTiefe, UnifyResultModelParallel urm, ConstraintSetRepository constraintSetRepository) {
synchronized (this) {
if(statistics==null){
statistics = new NullWriter();
@@ -207,8 +204,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
rules = new RuleSet(logFile);
this.rekTiefeField = rekTiefe;
this.urm = urm;
this.usedTasks = usedTasks;
this.usedTasks.add(this);
this.constraintSetRepository = constraintSetRepository;
}
}
@@ -244,13 +240,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
}
}
*/
void myCancel(Boolean b) {
myIsCanceled = true;
}
public boolean myIsCancelled() {
return myIsCanceled;
}
protected Set<Set<UnifyPair>> compute() {
if (one) {
@@ -279,14 +268,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
throw new DebugException("Unresolved constraints: " + res.toString()); //return new HashSet<>();
}
else {
synchronized (usedTasks) {
if (this.myIsCancelled()) {
return new HashSet<>();
}
else {
return res;
}
}
return res;
}
}
/*
@@ -319,12 +301,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
//.collect(Collectors.toCollection(HashSet::new)));
synchronized (usedTasks) {
if (this.myIsCancelled()) {
return new HashSet<>();
}
}
rekTiefe++;
nOfUnify++;
writeLog(nOfUnify.toString() + " Unifikation: " + eq.toString());
@@ -506,12 +482,6 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
// .collect(Collectors.toCollection(HashSet::new));
//Muss auskommentiert werden, wenn computeCartesianRecursive ENDE
synchronized (usedTasks) {
if (this.myIsCancelled()) {
return new HashSet<>();
}
}
Set<Set<UnifyPair>> eqPrimePrimeSet = new HashSet<>();
Set<TypeUnifyTask> forks = new HashSet<>();
@@ -819,7 +789,7 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
Set<Set<UnifyPair>> newElemsOrig = new HashSet<>(elems);
List<Set<Constraint<UnifyPair>>> newOderConstraintsOrig = new ArrayList<>(oderConstraints);
newElemsOrig.add(a);
TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, usedTasks, methodSignatureConstraint);
TypeUnify2Task forkOrig = new TypeUnify2Task(newElemsOrig, newEqOrig, newOderConstraintsOrig, a, fc, parallel, logFile, log, rekTiefe, urm, methodSignatureConstraint, constraintSetRepository);
//Überprüfen, ob das Set bereits berechnet wurde
forkOrig.fork();
@@ -834,9 +804,8 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
Set<Set<UnifyPair>> newElems = new HashSet<>(elems);
List<Set<Constraint<UnifyPair>>> newOderConstraints = new ArrayList<>(oderConstraints);
newElems.add(nSaL);
TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, usedTasks, new HashSet<>(methodSignatureConstraint));
TypeUnify2Task fork = new TypeUnify2Task(newElems, newEq, newOderConstraints, nSaL, fc, parallel, logFile, log, rekTiefe, urm, new HashSet<>(methodSignatureConstraint), constraintSetRepository);
forks.add(fork);
//Überprüfen, ob das Set bereits berechnet wurde
fork.fork();
}
@@ -854,7 +823,9 @@ public class TypeUnifyTask extends RecursiveTask<Set<Set<UnifyPair>>> {
}else{
elems.add(a);
//Überprüfen ob das Set bereits berechnet wurde
res = unify2(elems, eq, oderConstraints, fc, parallel, rekTiefe, new HashSet<>(methodSignatureConstraint));
if(!constraintSetRepository.containsSet(elems)){
res = unify2(elems, eq, oderConstraints, fc, parallel, rekTiefe, new HashSet<>(methodSignatureConstraint));
}
}
//Ab hier alle parallele Berechnungen wieder zusammengeführt.

View File

@@ -1,18 +0,0 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.ArrayList;
public class UnifyTaskModel {
ArrayList<TypeUnifyTask> usedTasks = new ArrayList<>();
public synchronized void add(TypeUnifyTask t) {
usedTasks.add(t);
}
public synchronized void cancel() {
for(TypeUnifyTask t : usedTasks) {
t.myCancel(true);
}
}
}

View File

@@ -0,0 +1,18 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.concurrent.ForkJoinPool;
public class UnifyTaskModelParallel {
private ForkJoinPool pool;
public void setPool(ForkJoinPool pool){
this.pool = pool;
}
public void cancel(){
if(this.pool != null){
this.pool.shutdown();
}
}
}

View File

@@ -3,7 +3,7 @@ import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
import de.dhbwstuttgart.typeinference.constraints.Pair;
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
import de.dhbwstuttgart.typeinference.unify.UnifyResultModelParallel;
import de.dhbwstuttgart.typeinference.unify.UnifyTaskModel;
import de.dhbwstuttgart.typeinference.unify.UnifyTaskModelParallel;
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
import de.dhbwstuttgart.typeinference.unify.model.*;
import org.apache.commons.io.output.NullWriter;
@@ -77,9 +77,604 @@ public class UnifyTest {
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet<Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModel tasks = new UnifyTaskModel();
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
//System.out.println(solution);
}}
}
@Test
public void basicMatrixTest(){
UnifyType type1;
UnifyType type2;
Set<UnifyPair> undConstraints = new HashSet<>();
//und-constraints
//Matrix <. ret
type1 = new ReferenceType("Matrix");
type2 = new PlaceholderType("ret");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//Integer <. i
type1 = new ReferenceType("Integer");
type2 = new PlaceholderType("i");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//Matrix <. Vector<x?>
type1 = new ReferenceType("Matrix");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("x")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//x? <. v1
type1 = new PlaceholderType("x");
type2 = new PlaceholderType("v1");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//i <. Integer
type1 = new PlaceholderType("i");
type2 = new ReferenceType("Integer");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//Vector<Integer> <. v2
type1 = new ReferenceType("Vector", new TypeParams(new ReferenceType("Integer")));
type2 = new PlaceholderType("v2");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//v1 <. Vector<y?>
type1 = new PlaceholderType("v1");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("y")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//m <. Vector<z?>
type1 = new PlaceholderType("m");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("z")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//z? <. zr
type1 = new PlaceholderType("z");
type2 = new PlaceholderType("zr");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//zr <. Vector<z2?>
type1 = new PlaceholderType("zr");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("z2")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//z2? <. z2r
type1 = new PlaceholderType("z2");
type2 = new PlaceholderType("z2r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//z2r <. Integer
type1 = new PlaceholderType("z2r");
type2 = new ReferenceType("Integer");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//v1 <. Vector<y2?>
type1 = new PlaceholderType("v1");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("y2")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//y2? <. y2r
type1 = new PlaceholderType("y2");
type2 = new PlaceholderType("y2r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//y2r <. Integer
type1 = new PlaceholderType("y2r");
type2 = new ReferenceType("Integer");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//v2 <. Vector<x3?>
type1 = new PlaceholderType("v2");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("x3")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//x3? <. x3r
type1 = new PlaceholderType("x3");
type2 = new PlaceholderType("x3r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//Integer <. x3r
type1 = new ReferenceType("Integer");
type2 = new PlaceholderType("x3r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//ret <. Vector<x2?>
type1 = new PlaceholderType("ret");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("x2")));
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//x2? <. x2r
type1 = new PlaceholderType("x2");
type2 = new PlaceholderType("x2r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//v2 <. x2r
type1 = new PlaceholderType("v2");
type2 = new PlaceholderType("x2r");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//oder-constraints
List<Set<Constraint<UnifyPair>>> oderConstraints = new ArrayList<>();
//FiniteClosure
Set<UnifyPair> constraints = new HashSet<>();
//Matrix extends Vector<Vector<Integer>>
type1 = new ReferenceType("Matrix");
type2 = new ReferenceType("Vector", new TypeParams(new ReferenceType("Vector", new TypeParams(new ReferenceType("Integer")))));
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Vector<X> extends Object
type1 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("X")));
type2 = new ReferenceType("Object");
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Integer extends Object
type1 = new ReferenceType("Integer");
type2 = new ReferenceType("Object");
constraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
FiniteClosure finiteClosure = new FiniteClosure(constraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution.size());
}
@Test
public void scalark2(){
UnifyType type1;
UnifyType type2;
//und-constraints
Set<UnifyPair> undConstraints = new HashSet<>();
//H =. Scalar
type1 = new PlaceholderType("H");
type2 = new ReferenceType("Scalar");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <!=. java.lang.Number
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Number");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERNEQDOT));
//C =. A
type1 = new PlaceholderType("H");
type2 = new PlaceholderType("A");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//L =. Scalar
type1 = new PlaceholderType("L");
type2 = new ReferenceType("Scalar");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//D <. C
type1 = new PlaceholderType("D");
type2 = new PlaceholderType("C");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//java.lang.Boolean =. G
type1 = new ReferenceType("java.lang.Boolean");
type2 = new PlaceholderType("G");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//G =. java.lang.Boolean
type1 = new PlaceholderType("G");
type2 = new ReferenceType("java.lang.Boolean");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//V <. C
type1 = new PlaceholderType("V");
type2 = new PlaceholderType("C");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//F <. E
type1 = new PlaceholderType("F");
type2 = new PlaceholderType("E");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//X <. E
type1 = new PlaceholderType("X");
type2 = new PlaceholderType("E");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//J <!=. java.lang.Number
type1 = new PlaceholderType("J");
type2 = new ReferenceType("java.lang.Number");
undConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLERNEQDOT));
//oder-constraints
List<Set<Constraint<UnifyPair>>> oderConstraints = new ArrayList<>();
Set<Constraint<UnifyPair>> constraints = new HashSet<>();
Constraint<UnifyPair> constraint = new Constraint<>();
//set #1
//D =. java.lang.Float
type1 = new PlaceholderType("D");
type2 = new ReferenceType("java.lang.Boolean");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//D =. java.lang.Integer
constraint = new Constraint<>();
type1 = new PlaceholderType("D");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #2
constraints = new HashSet<>();
//F =. java.lang.Integer
constraint = new Constraint<>();
type1 = new PlaceholderType("F");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//F =. java.lang.Float
constraint = new Constraint<>();
type1 = new PlaceholderType("F");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #3
constraints = new HashSet<>();
//H =. ? extends Scalar
constraint = new Constraint<>();
type1 = new PlaceholderType("H");
type2 = new ExtendsType(new ReferenceType("Scalar"));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//java.lang.Integer =. J
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("J");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//H =. Vector<AJP>
constraint = new Constraint<>();
type1 = new PlaceholderType("H");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJP")));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//java.lang.Integer =. J
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("J");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//H =. ? extends Vector<AJP>
constraint = new Constraint<>();
type1 = new PlaceholderType("H");
type2 = new ExtendsType(new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJP"))));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//java.lang.Integer =. J
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("J");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//H =. Scalar
constraint = new Constraint<>();
type1 = new PlaceholderType("H");
type2 = new ReferenceType("Scalar");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//java.lang.Integer =. J
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("J");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #4
constraints = new HashSet<>();
//java.lang.Integer =. O
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("O");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//L =. Scalar
type1 = new PlaceholderType("L");
type2 = new ReferenceType("Scalar");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
//E <. java.lang.Integer
constraint = new Constraint<>();
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//L =. ? extends Vector<AJQ>
type1 = new PlaceholderType("L");
type2 = new ExtendsType(new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJQ"))));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//AJQ =. O
type1 = new PlaceholderType("AJQ");
type2 = new PlaceholderType("O");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//java.lang.Integer =. O
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("O");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//L =. ? extends Scalar
type1 = new PlaceholderType("L");
type2 = new ExtendsType(new ReferenceType("Scalar"));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//L =. Vector<AJQ>
constraint = new Constraint<>();
type1 = new PlaceholderType("L");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJQ")));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//AJQ =. O
type1 = new PlaceholderType("AJQ");
type2 = new PlaceholderType("O");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #5
constraints = new HashSet<>();
//AJR =. S
constraint = new Constraint<>();
type1 = new PlaceholderType("AJR");
type2 = new PlaceholderType("S");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//B =. Vector<AJR>
type1 = new PlaceholderType("B");
type2 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJR")));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//java.lang.Integer =. S
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("S");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//B =. Scalar
type1 = new PlaceholderType("B");
type2 = new ReferenceType("Scalar");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//java.lang.Integer =. S
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("S");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//B =. ? extends Scalar
type1 = new PlaceholderType("B");
type2 = new ExtendsType(new ReferenceType("Scalar"));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
//AJR =. S
constraint = new Constraint<>();
type1 = new PlaceholderType("AJR");
type2 = new PlaceholderType("S");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//B =. ? extends Vector<AJR>
type1 = new PlaceholderType("B");
type2 = new ExtendsType(new ReferenceType("Vector", new TypeParams(new PlaceholderType("AJR"))));
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #6
constraints = new HashSet<>();
//O <. java.lang.Float
constraint = new Constraint<>();
type1 = new PlaceholderType("O");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//java.lang.Float =. U
type1 = new ReferenceType("java.lang.Float");
type2 = new PlaceholderType("U");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//S <. java.lang.Float
type1 = new PlaceholderType("S");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
//java.lang.Integer =. U
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("U");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//S <. java.lang.Integer
type1 = new PlaceholderType("S");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//O <. java.lang.Integer
type1 = new PlaceholderType("O");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #7
constraints = new HashSet<>();
//java.lang.Integer =. V
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("V");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//U <. java.lang.Integer
type1 = new PlaceholderType("U");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//C <. java.lang.Integer
type1 = new PlaceholderType("C");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
//java.lang.Float =. V
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Float");
type2 = new PlaceholderType("V");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//U <. java.lang.Float
type1 = new PlaceholderType("U");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//C <. java.lang.Float
type1 = new PlaceholderType("C");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #8
constraints = new HashSet<>();
//W =. java.lang.Float
constraint = new Constraint<>();
type1 = new PlaceholderType("W");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
//W =. java.lang.Integer
constraint = new Constraint<>();
type1 = new PlaceholderType("W");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//set #9
constraints = new HashSet<>();
//W <. java.lang.Integer
constraint = new Constraint<>();
type1 = new PlaceholderType("W");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//E <. java.lang.Integer
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Integer");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//java.lang.Integer =. X
type1 = new ReferenceType("java.lang.Integer");
type2 = new PlaceholderType("X");
constraints.add(constraint);
//java.lang.Float =. X
constraint = new Constraint<>();
type1 = new ReferenceType("java.lang.Float");
type2 = new PlaceholderType("X");
constraint.add(new UnifyPair(type1, type2, PairOperator.EQUALSDOT));
//E <. java.lang.Float
type1 = new PlaceholderType("E");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
//W <. java.lang.Float
type1 = new PlaceholderType("W");
type2 = new ReferenceType("java.lang.Float");
constraint.add(new UnifyPair(type1, type2, PairOperator.SMALLERDOT));
constraints.add(constraint);
oderConstraints.add(constraints);
//FiniteClosure
Set<UnifyPair> fcConstraints = new HashSet<>();
//java.lang.Number < java.lang.Object
type1 = new ReferenceType("java.lang.Number");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Number < java.io.Serializable
type1 = new ReferenceType("java.lang.Number");
type2 = new ReferenceType("java.io.Serializable");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.lang.Number
type1 = new ReferenceType("java.lang.Float");
type2 = new ReferenceType("java.lang.Number");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.lang.Number
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.Number");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.lang.Object
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.lang.constant.Constable
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.constant.Constable");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.io.Serializable
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.io.Serializable");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.lang.constant.ConstantDesc
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.constant.ConstantDesc");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Integer < java.lang.Comparable<java.lang.Integer>
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.Comparable", new TypeParams(new ReferenceType("java.lang.Integer")));
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.lang.Object
type1 = new ReferenceType("java.lang.Float");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.lang.constant.Constable
type1 = new ReferenceType("java.lang.Float");
type2 = new ReferenceType("java.lang.constant.Constable");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.io.Serializable
type1 = new ReferenceType("java.lang.Float");
type2 = new ReferenceType("java.io.Serializable");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.lang.Comparable<java.lang.Float>
type1 = new ReferenceType("java.lang.Integer");
type2 = new ReferenceType("java.lang.Comparable", new TypeParams(new ReferenceType("java.lang.Float")));
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Float < java.lang.constant.ConstantDesc
type1 = new ReferenceType("java.lang.Float");
type2 = new ReferenceType("java.lang.constant.ConstantDesc");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Scalar<EYW> < java.lang.Object
type1 = new ReferenceType("Scalar", new TypeParams(new PlaceholderType("EYW")));
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Scalar<EYW> < Vector<java.lang.Integer>
type1 = new ReferenceType("Scalar", new TypeParams(new PlaceholderType("EYW")));
type2 = new ReferenceType("Vector", new TypeParams(new ReferenceType("java.lang.Integer")));
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Comparable<java.lang.Float> < java.lang.Object
type1 = new ReferenceType("java.lang.Comparable", new TypeParams(new ReferenceType("java.lang.Float")));
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Vector<java.lang.Integer> < java.lang.Object
type1 = new ReferenceType("Vector", new TypeParams(new ReferenceType("java.lang.Integer")));
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Scalar < Vector<java.lang.Integer>
type1 = new ReferenceType("Scalar");
type2 = new ReferenceType("Vector", new TypeParams(new ReferenceType("java.lang.Integer")));
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.constant.ConstantDesc < java.lang.Object
type1 = new ReferenceType("java.lang.constant.ConstantDesc");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Scalar < java.lang.Object
type1 = new ReferenceType("Scalar");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.constant.Constable < java.lang.Object
type1 = new ReferenceType("java.lang.constant.Constable");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//Vector<EWV> < java.lang.Object
type1 = new ReferenceType("Vector", new TypeParams(new PlaceholderType("EWV")));
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.io.Serializable < java.lang.Object
type1 = new ReferenceType("java.io.Serializable");
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
//java.lang.Comparable<java.lang.Integer> < java.lang.Object
type1 = new ReferenceType("java.lang.Comparable", new TypeParams(new ReferenceType("java.lang.Integer")));
type2 = new ReferenceType("java.lang.Object");
fcConstraints.add(new UnifyPair(type1, type2, PairOperator.SMALLER));
FiniteClosure finiteClosure = new FiniteClosure(fcConstraints, new NullWriter());
TypeUnify unifyAlgo = new TypeUnify();
ConstraintSet< Pair> cons = new ConstraintSet<>();
UnifyResultModelParallel urm = new UnifyResultModelParallel(cons, finiteClosure);
UnifyTaskModelParallel tasks = new UnifyTaskModelParallel();
Set<Set<UnifyPair>> solution = unifyAlgo.unify(undConstraints, oderConstraints, finiteClosure, new NullWriter(), false, urm, tasks);
System.out.println(solution);
System.out.println(solution.size());
}
}