package eu.quanticol.carma.simulator.space; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Map.Entry; import java.util.Set; import java.util.function.Predicate; public class Node { /** * */ private final SpaceModel spaceModel; private final String name; private final Tuple data; private final int idx; private HashSet<Node> preset = new HashSet<>(); private HashMap<Node,HashSet<Edge>> incomingData = new HashMap<>(); private HashSet<Node> poset = new HashSet<>(); private HashMap<Node,HashSet<Edge>> outgoingData = new HashMap<>(); private HashSet<Edge> incomingEdges = new HashSet<>(); private HashSet<Edge> outgoingEdges = new HashSet<>(); Node( SpaceModel spaceModel, String name , Tuple data ) { this.spaceModel = spaceModel; this.name = name; this.data = data; this.idx = this.spaceModel.nodeCounter++; } public void addToPoset(Node l, HashMap<String,Object> data) { this.poset.add(l); HashSet<Edge> old = this.outgoingData.get(l); if (old == null) { old = new HashSet<>(); this.outgoingData.put(l, old); } Edge e = new Edge(this, data, l); old.add(e); outgoingEdges.add(e); } public void addToPreset(Node l, HashMap<String,Object> data) { this.preset.add(l); HashSet<Edge> old = this.incomingData.get(l); if (old == null) { old = new HashSet<>(); this.incomingData.put(l, old); } Edge e = new Edge(l,data,this); old.add(e); incomingEdges.add(e); } @Override public int hashCode() { return idx; } @Override public boolean equals(Object obj) { if (obj instanceof Node) { return this.idx==((Node) obj).idx; } return false; } @Override public String toString() { return (name != null?name:"")+data.toString(); } public LinkedList<HashMap<String,Object>> getDataTo( Node l ) { return computeData(this.outgoingData.get(l)); } public LinkedList<HashMap<String,Object>> getDataFrom( Node l ) { return computeData(this.incomingData.get(l)); } private LinkedList<HashMap<String,Object>> computeData( HashSet<Edge> hashSet ) { LinkedList<HashMap<String,Object>> toReturn = new LinkedList<>(); if (hashSet != null) { for (Edge edge : hashSet) { toReturn.add(edge.getData()); } } return toReturn; } public HashSet<Node> getPreset() { return preset; } public HashSet<Node> getPoset() { return poset; } public HashSet<Edge> getInEdges() { return incomingEdges; } public HashSet<Edge> getOutEdges() { return outgoingEdges; } public HashSet<Edge> getInEdges( Node from ) { return incomingEdges; } public HashSet<Edge> getOutEdges( Node to ) { return outgoingEdges; } public <T> HashSet<T> getValuesTo( Node to , String label , Class<T> clazz ) { HashSet<T> result = new HashSet<T>(); HashSet<Edge> edgesTo = outgoingData.get(to); if (edgesTo != null) { for (Edge edge : edgesTo) { Object o = edge.getValue(label); if ((o != null)&&(clazz.isInstance(o))) { result.add(clazz.cast(o)); } } } return result; } public boolean isInArea( String label ) { return this.spaceModel.getLabel( label ).contains( this ); } public String getName() { return name; } public Tuple getTuple() { return data; } public Object get( int i ) { return data.get(i); } public <T> T get( int i , Class<T> clazz) { return data.get(i, clazz); } public int getIndex() { return idx; } }