package xsched.analysis.core;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.Map.Entry;
//this class contains the result of analyzing a task.
//for each task it contains other tasks that have been found to be potentially parallel
//if t1 is parallel to t2 then t2 is parallel to t1
public class ParallelTasksResult<Instance, TV, SM extends TaskScheduleManager<TV>> {
HashMap<AnalysisTask<Instance, TV, SM>, HashSet<AnalysisTask<Instance, TV, SM>>> parallelTasksMap = new HashMap<AnalysisTask<Instance, TV, SM>, HashSet<AnalysisTask<Instance, TV, SM>>>();
private void addIntoMap(AnalysisTask<Instance, TV, SM> key, AnalysisTask<Instance, TV, SM> value) {
HashSet<AnalysisTask<Instance, TV, SM>> set = parallelTasksMap.get(key);
if(set == null) {
set = new HashSet<AnalysisTask<Instance, TV, SM>>();
parallelTasksMap.put(key, set);
}
set.add(value);
}
public void mergeWith(ParallelTasksResult<Instance, TV, SM> other) {
for(Entry<AnalysisTask<Instance, TV, SM>, HashSet<AnalysisTask<Instance, TV, SM>>> entry : other.parallelTasksMap.entrySet()) {
HashSet<AnalysisTask<Instance, TV, SM>> mySet = parallelTasksMap.get(entry.getKey());
if(mySet == null) {
parallelTasksMap.put(entry.getKey(), new HashSet<AnalysisTask<Instance, TV, SM>>(entry.getValue()));
} else {
mySet.addAll(entry.getValue());
}
}
}
public void setParallel(AnalysisTask<Instance, TV, SM> one, AnalysisTask<Instance, TV, SM> other) {
addIntoMap(one, other);
addIntoMap(other, one);
}
public void setParallel(Collection<AnalysisTask<Instance, TV, SM>> one, Collection<AnalysisTask<Instance, TV, SM>> other) {
for(AnalysisTask<Instance, TV, SM> t1 : one) {
for(AnalysisTask<Instance, TV, SM> t2 : other) {
setParallel(t1, t2);
}
}
}
public void setParallel(AnalysisTask<Instance, TV, SM> one, Collection<AnalysisTask<Instance, TV, SM>> others) {
for(AnalysisTask<Instance, TV, SM> other : others) {
setParallel(one, other);
}
}
public boolean isParallel(AnalysisTask<Instance, TV, SM> one, AnalysisTask<Instance, TV, SM> other) {
HashSet<AnalysisTask<Instance, TV, SM>> set = parallelTasksMap.get(one);
if(set == null)
return false;
return set.contains(other);
}
public boolean isOrdered(AnalysisTask<Instance, TV, SM> one, AnalysisTask<Instance, TV, SM> other) {
return ! isParallel(one, other);
}
public Set<AnalysisTask<Instance, TV, SM>> parallelTasksFor(AnalysisTask<Instance, TV, SM> task) {
HashSet<AnalysisTask<Instance, TV, SM>> set = parallelTasksMap.get(task);
if(set == null)
return Collections.emptySet();
return set;
}
}