فهرست منبع

tags for edges and objects + updated simulation manager

dominik.rieder 7 سال پیش
والد
کامیت
7a7ee6b574
3فایلهای تغییر یافته به همراه131 افزوده شده و 23 حذف شده
  1. 16 0
      src/classes/CpsEdge.java
  2. 18 21
      src/classes/CpsObject.java
  3. 97 2
      src/ui/controller/SimulationManager.java

+ 16 - 0
src/classes/CpsEdge.java

@@ -1,5 +1,7 @@
 package classes;
 
+import java.util.ArrayList;
+
 public class CpsEdge {
 
 	float maxCapacity;
@@ -9,6 +11,8 @@ public class CpsEdge {
 	//If it breaks --> stay ruin no matter the actual scenario
 	//The only way to repair it is through manual change (setStateEdge) 
 	boolean state = true;
+	
+	ArrayList<Integer> tags;
 
 	CpsObject A;
 	CpsObject B;
@@ -122,5 +126,17 @@ public class CpsEdge {
 	public boolean getState() {
 		return isWorking;
 	}
+	
+	public void setTags(ArrayList<Integer> tags){
+		this.tags = tags;
+	}
+	
+	public ArrayList<Integer> getTags(){
+		return tags;
+	}
+	
+	public void addTag(int tag){
+		tags.add(tag);
+	}
 
 }

+ 18 - 21
src/classes/CpsObject.java

@@ -24,9 +24,9 @@ public abstract class CpsObject {
 	String sav;
 	/* BorderColor the user sets */
 	Color BorderColor = Color.WHITE;
+	/* a Tag that can be used */
+	ArrayList<Integer> tags;
 
-	float input;
-	float output;
 
 	/**
 	 * Constructor for an CpsObejct with an unique ID
@@ -43,8 +43,6 @@ public abstract class CpsObject {
 		setConnections(new ArrayList<CpsEdge>());
 		setPosition(new Position());
 		setID(idCounter.nextId());
-		setEnergyIn(obj.getEnergyIn());
-		setEnergyOut(obj.getEnergyOut());
 		setImage(obj.getImage());
 	}
 
@@ -144,23 +142,6 @@ public abstract class CpsObject {
 		this.sav = sav;
 	}
 
-	/* Getter and Setters for the energy input and output */
-	public float getEnergyIn() {
-		return input;
-	}
-
-	public void setEnergyIn(float energyIn) {
-		this.input = energyIn;
-	}
-
-	public float getEnergyOut() {
-		return output;
-	}
-
-	public void setEnergyOut(float energyOut) {
-		this.output = energyOut;
-	}
-
 	/**
 	 * @return the BorderColor
 	 */
@@ -175,4 +156,20 @@ public abstract class CpsObject {
 	public void setConnections(Color color) {
 		this.BorderColor = color;
 	}
+	
+	public void addTag(int tag){
+		this.tags.add(tag);
+	}
+	
+	public ArrayList<Integer> getTag(){
+		return tags;
+	}
+	
+	public void resetTags(){
+		this.tags = new ArrayList<Integer>();
+	}
+	
+	public void setTags(ArrayList<Integer> tags){
+		this.tags = tags;
+	}
 }

+ 97 - 2
src/ui/controller/SimulationManager.java

@@ -1,6 +1,7 @@
 package ui.controller;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import classes.CpsEdge;
 import classes.CpsNode;
@@ -20,6 +21,7 @@ public class SimulationManager {
 	private MyCanvas canvas;
 	private int timeStep;
 	private boolean simMode;
+	private HashMap<Integer, Float> tagTable = new HashMap<Integer, Float>();
 	
 	public SimulationManager(Model m){
 		canvas = null;
@@ -44,7 +46,7 @@ public class SimulationManager {
 			float production = calculateEnergy("prod", singleSubNet, timeStep);
 			float consumption = calculateEnergy("cons", singleSubNet, timeStep);
 			float minConsumption = calculateMinimumEnergy( singleSubNet, timeStep);
-			setFlow(singleSubNet);
+			setFlow(singleSubNet, simMode);
 			for(HolonObject hl: singleSubNet.getObjects()){
 				if(!(hl.getState() == 0) && !(hl.getState() == 3)){
 					for(int i = 0; i < hl.getConnections().size(); i++){
@@ -76,7 +78,15 @@ public class SimulationManager {
 		canvas.repaint();
 	}
 	
-	public void setFlow(subNet sN){
+	public void setFlow(subNet sN, boolean simulation){
+		if(simulation){
+			setFlowSimulation(sN);
+		} else {
+			setFlowModelation(sN);
+		}
+	}
+	
+	public void setFlowModelation(subNet sN){
 		for(HolonObject hl: sN.getObjects()){
 			float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
 			if(energy > 0){
@@ -88,18 +98,103 @@ public class SimulationManager {
 		}
 	}
 	
+	public void setFlowSimulation(subNet sN){
+		ArrayList<CpsObject> producers = new ArrayList<CpsObject>();
+		CpsObject tmp = null;
+		tagTable = new HashMap<Integer, Float>();
+		for(HolonObject hl: sN.getObjects()){
+			float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
+			if(energy > 0){
+				tagTable.put(hl.getID(), energy);
+				for(CpsEdge edge: hl.getConnections()){
+					if(edge.getState()){
+						if(edge.getA().getID() == hl.getID()){
+							edge.getB().addTag(hl.getID());
+							tmp = edge.getB();
+						}
+						if(edge.getB().getID() == hl.getID()){
+							edge.getA().addTag(hl.getID());
+							tmp = edge.getA();
+						}
+						edge.setFlow(edge.getFlow() + energy);
+						edge.calculateState(true);
+						edge.addTag(hl.getID());
+						if(edge.getState() && !producers.contains(tmp)){
+							producers.add(tmp);
+						}
+					}
+				}
+			}
+		}
+		setFlowSimRec(producers);
+	}
+	
+	public void setFlowSimRec(ArrayList<CpsObject> nodes){
+		ArrayList<CpsObject> newNodes = new ArrayList<CpsObject>();
+		CpsObject tmp = null;
+		if(nodes.size() != 0){
+			for(CpsObject cps: nodes){
+				for(CpsEdge edge: cps.getConnections()){
+					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.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(edge.getState() && !(newNodes.contains(tmp))){
+								newNodes.add(tmp);
+							}	
+						}
+					}
+				edge.calculateState(true);
+				}
+			}
+			setFlowSimRec(newNodes);
+		}
+	}
+	
+	public String getString(CpsObject cps){
+		String result = "";
+		for(Integer i:cps.getTag()){
+			result = result + ", " + i;
+		}
+		return result;
+	}
+	
+	public ArrayList<Integer> mergeLists(ArrayList<Integer> A, ArrayList<Integer> B){
+		ArrayList<Integer> result = new ArrayList<Integer>();
+		for(Integer i: A){
+			if(!(B.contains(i))){
+				result.add(i);
+			}
+		}
+		result.addAll(B);
+		return result;
+	}
+	
 	public void ResetConnections(CpsObject cps, ArrayList<Integer> visitedObj, ArrayList<CpsEdge> visitedEdges){
 		visitedObj.add(cps.getID());
+		cps.resetTags();
 		for(CpsEdge e: cps.getConnections()){
 			if(!(visitedEdges.contains(e))){
 				e.setFlow(0);
 				e.calculateState(simMode);
+				e.setTags(new ArrayList<Integer>());
 				visitedEdges.add(e);
 				if(!(visitedObj.contains(e.getA().getID()))){
 					ResetConnections(e.getA(), visitedObj, visitedEdges);
+					e.getA().resetTags();
 				}
 				if(!(visitedObj.contains(e.getB().getID()))){
 					ResetConnections(e.getB(), visitedObj, visitedEdges);
+					e.getB().resetTags();
 				}
 			}
 		}