|
@@ -1,6 +1,7 @@
|
|
package ui.controller;
|
|
package ui.controller;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
|
import classes.CpsEdge;
|
|
import classes.CpsEdge;
|
|
import classes.CpsNode;
|
|
import classes.CpsNode;
|
|
@@ -20,6 +21,7 @@ public class SimulationManager {
|
|
private MyCanvas canvas;
|
|
private MyCanvas canvas;
|
|
private int timeStep;
|
|
private int timeStep;
|
|
private boolean simMode;
|
|
private boolean simMode;
|
|
|
|
+ private HashMap<Integer, Float> tagTable = new HashMap<Integer, Float>();
|
|
|
|
|
|
public SimulationManager(Model m){
|
|
public SimulationManager(Model m){
|
|
canvas = null;
|
|
canvas = null;
|
|
@@ -44,7 +46,7 @@ public class SimulationManager {
|
|
float production = calculateEnergy("prod", singleSubNet, timeStep);
|
|
float production = calculateEnergy("prod", singleSubNet, timeStep);
|
|
float consumption = calculateEnergy("cons", singleSubNet, timeStep);
|
|
float consumption = calculateEnergy("cons", singleSubNet, timeStep);
|
|
float minConsumption = calculateMinimumEnergy( singleSubNet, timeStep);
|
|
float minConsumption = calculateMinimumEnergy( singleSubNet, timeStep);
|
|
- setFlow(singleSubNet);
|
|
|
|
|
|
+ setFlow(singleSubNet, simMode);
|
|
for(HolonObject hl: singleSubNet.getObjects()){
|
|
for(HolonObject hl: singleSubNet.getObjects()){
|
|
if(!(hl.getState() == 0) && !(hl.getState() == 3)){
|
|
if(!(hl.getState() == 0) && !(hl.getState() == 3)){
|
|
for(int i = 0; i < hl.getConnections().size(); i++){
|
|
for(int i = 0; i < hl.getConnections().size(); i++){
|
|
@@ -76,7 +78,15 @@ public class SimulationManager {
|
|
canvas.repaint();
|
|
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()){
|
|
for(HolonObject hl: sN.getObjects()){
|
|
float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
|
|
float energy = hl.getCurrentEnergyAtTimeStep(timeStep);
|
|
if(energy > 0){
|
|
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){
|
|
public void ResetConnections(CpsObject cps, ArrayList<Integer> visitedObj, ArrayList<CpsEdge> visitedEdges){
|
|
visitedObj.add(cps.getID());
|
|
visitedObj.add(cps.getID());
|
|
|
|
+ cps.resetTags();
|
|
for(CpsEdge e: cps.getConnections()){
|
|
for(CpsEdge e: cps.getConnections()){
|
|
if(!(visitedEdges.contains(e))){
|
|
if(!(visitedEdges.contains(e))){
|
|
e.setFlow(0);
|
|
e.setFlow(0);
|
|
e.calculateState(simMode);
|
|
e.calculateState(simMode);
|
|
|
|
+ e.setTags(new ArrayList<Integer>());
|
|
visitedEdges.add(e);
|
|
visitedEdges.add(e);
|
|
if(!(visitedObj.contains(e.getA().getID()))){
|
|
if(!(visitedObj.contains(e.getA().getID()))){
|
|
ResetConnections(e.getA(), visitedObj, visitedEdges);
|
|
ResetConnections(e.getA(), visitedObj, visitedEdges);
|
|
|
|
+ e.getA().resetTags();
|
|
}
|
|
}
|
|
if(!(visitedObj.contains(e.getB().getID()))){
|
|
if(!(visitedObj.contains(e.getB().getID()))){
|
|
ResetConnections(e.getB(), visitedObj, visitedEdges);
|
|
ResetConnections(e.getB(), visitedObj, visitedEdges);
|
|
|
|
+ e.getB().resetTags();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|