Browse Source

Simulation Mode now working

dominik.rieder 7 years ago
parent
commit
763c4b388d
3 changed files with 58 additions and 12 deletions
  1. 1 1
      src/classes/CpsEdge.java
  2. 14 1
      src/classes/CpsObject.java
  3. 43 10
      src/ui/controller/SimulationManager.java

+ 1 - 1
src/classes/CpsEdge.java

@@ -119,7 +119,7 @@ public class CpsEdge {
 		if (flow > maxCapacity && maxCapacity != -1) {
 			isWorking = false;
 		} else {
-			if (!simMode && flow <= maxCapacity) {
+			if (!simMode && (flow <= maxCapacity || maxCapacity == -1)) {
 				isWorking = true;
 			}
 		}

+ 14 - 1
src/classes/CpsObject.java

@@ -36,7 +36,8 @@ public abstract class CpsObject {
 	Color BorderColor = Color.WHITE;
 	/* a Tag that can be used */
 	ArrayList<Integer> tags;
-
+	/* tags that are only set to tags if wished */
+	ArrayList<Integer> pseudoTags;
 	/**
 	 * Constructor for a CpsObejct with an unique ID
 	 */
@@ -280,4 +281,16 @@ public abstract class CpsObject {
 	public void setTags(ArrayList<Integer> tags) {
 		this.tags = tags;
 	}
+	
+	public ArrayList<Integer> getPseudoTags(){
+		return pseudoTags;
+	}
+	
+	public void addPseudoTag(int pseudo){
+		pseudoTags.add(pseudo);
+	}
+	
+	public void setPseudoTags(ArrayList<Integer> tags){
+		pseudoTags = tags;
+	}
 }

+ 43 - 10
src/ui/controller/SimulationManager.java

@@ -106,6 +106,7 @@ public class SimulationManager {
 			float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
 			if(energy > 0){
 				tagTable.put(hl.getID(), energy);
+				hl.addTag(hl.getID());
 				for(CpsEdge edge: hl.getConnections()){
 					if(edge.getState()){
 						if(edge.getA().getID() == hl.getID()){
@@ -126,11 +127,12 @@ public class SimulationManager {
 				}
 			}
 		}
-		setFlowSimRec(producers);
+		setFlowSimRec(producers, 0);
 	}
 	
-	public void setFlowSimRec(ArrayList<CpsObject> nodes){
+	public void setFlowSimRec(ArrayList<CpsObject> nodes, int iter){
 		ArrayList<CpsObject> newNodes = new ArrayList<CpsObject>();
+		ArrayList<Integer> pseudoTags = new ArrayList<Integer>();
 		CpsObject tmp = null;
 		if(nodes.size() != 0){
 			for(CpsObject cps: nodes){
@@ -138,15 +140,29 @@ public class SimulationManager {
 					for(Integer tag: cps.getTag()){
 						if(edge.getState() && !(edge.getTags().contains(tag))){
 							edge.setFlow(edge.getFlow() + tagTable.get(tag));
-							System.out.println(cps.getID() + " has tags:" + getString(cps));
+							edge.calculateState(true);
 							edge.addTag(tag);
 							if(edge.getA().getID() == cps.getID()){
 								tmp = edge.getB();
-								tmp.setTags(mergeLists(tmp.getTag(), cps.getTag()));
 							}
 							if(edge.getB().getID() == cps.getID()){
 								tmp = edge.getA();
-								tmp.setTags(mergeLists(tmp.getTag(), cps.getTag()));
+							}
+							if(tmp.getPseudoTags() != null){
+								pseudoTags.addAll(tmp.getPseudoTags());
+							}
+							pseudoTags.addAll(cps.getTag());
+							tmp.setPseudoTags(mergeLists(tmp.getTag(), pseudoTags));
+							if(!edge.getState()){
+								newNodes.remove(edge.getA());
+								newNodes.remove(edge.getB());
+								if(edge.getA().getID() == cps.getID()){
+									edge.getB().getPseudoTags().removeAll(edge.getTags());
+
+								}
+								if(edge.getB().getID() == cps.getID()){
+									edge.getA().getPseudoTags().removeAll(edge.getTags());
+								}
 							}
 							if(edge.getState() && !(newNodes.contains(tmp))){
 								newNodes.add(tmp);
@@ -156,13 +172,26 @@ public class SimulationManager {
 				edge.calculateState(true);
 				}
 			}
-			setFlowSimRec(newNodes);
+			//printNodes(newNodes);
+			setPseudoTags(newNodes);
+			setFlowSimRec(newNodes, iter + 1);
 		}
 	}
 	
-	public String getString(CpsObject cps){
+	public void setPseudoTags(ArrayList<CpsObject> nodes){
+		for(CpsObject node: nodes){
+			node.setTags(node.getPseudoTags());
+		}
+	}
+	public void printNodes(ArrayList<CpsObject> nodes){
+		System.out.println("new Nodes:");
+		for(CpsObject node: nodes){
+			System.out.println(node.getID());
+		}
+	}
+	public String getString(ArrayList<Integer> tags){
 		String result = "";
-		for(Integer i:cps.getTag()){
+		for(Integer i: tags){
 			result = result + ", " + i;
 		}
 		return result;
@@ -171,11 +200,15 @@ public class SimulationManager {
 	public ArrayList<Integer> mergeLists(ArrayList<Integer> A, ArrayList<Integer> B){
 		ArrayList<Integer> result = new ArrayList<Integer>();
 		for(Integer i: A){
-			if(!(B.contains(i))){
+			if(!(result.contains(i))){
 				result.add(i);
 			}
 		}
-		result.addAll(B);
+		for(Integer j: B){
+			if(!(result.contains(j))){
+				result.add(j);
+			}
+		}
 		return result;
 	}