VisualRepresentationalState.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. package ui.model;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.LinkedList;
  5. import java.util.List;
  6. import java.util.ListIterator;
  7. import java.util.stream.Collectors;
  8. import classes.AbstractCanvasObject;
  9. import classes.Edge;
  10. import classes.Node;
  11. import classes.GroupNode;
  12. import classes.IntermediateCalculationCable;
  13. import classes.ExitCable;
  14. import classes.ExitCable.ExitCableState;
  15. public class VisualRepresentationalState {
  16. private ArrayList<Supplier> supplierList = new ArrayList<Supplier>();
  17. private ArrayList<Passiv> passivList= new ArrayList<Passiv>();
  18. private ArrayList<Consumer> consumerList= new ArrayList<Consumer>();
  19. private ArrayList<Node> nodeList= new ArrayList<Node>();
  20. private ArrayList<DecoratedCable> cableList= new ArrayList<DecoratedCable>();
  21. private ArrayList<DecoratedSwitch> switchList= new ArrayList<DecoratedSwitch>();
  22. private ArrayList<DecoratedGroupNode> groupNodeList= new ArrayList<DecoratedGroupNode>();
  23. private ArrayList<ExitCable> exitCableList= new ArrayList<ExitCable>();
  24. //ForFastAccessIndividualGroupNodes:
  25. private HashMap<GroupNode, DecoratedGroupNode> createdGroupNodes;
  26. public VisualRepresentationalState(DecoratedState stateFromThisTimestep, MinimumModel minimumModel) {
  27. reassignObjects(stateFromThisTimestep, minimumModel);
  28. }
  29. //Getter:
  30. public ArrayList<Supplier> getSupplierList() {
  31. return supplierList;
  32. }
  33. public ArrayList<Passiv> getPassivList() {
  34. return passivList;
  35. }
  36. public ArrayList<Consumer> getConsumerList() {
  37. return consumerList;
  38. }
  39. public ArrayList<Node> getNodeList() {
  40. return nodeList;
  41. }
  42. public ArrayList<DecoratedCable> getCableList() {
  43. return cableList;
  44. }
  45. public ArrayList<DecoratedSwitch> getSwitchList() {
  46. return switchList;
  47. }
  48. public ArrayList<DecoratedGroupNode> getGroupNodeList() {
  49. return groupNodeList;
  50. }
  51. //Reassignments:
  52. private void reassignObjects(DecoratedState stateFromThisTimestep, MinimumModel minimumModel) {
  53. HashMap<AbstractCanvasObject, GroupNode> inGroupObjects = minimumModel.getInGroupObjects();
  54. //generate CableLookUp
  55. HashMap<Edge, ArrayList<GroupNode>> inGroupEdges = minimumModel.getInGroupEdges();
  56. createdGroupNodes = new HashMap<GroupNode, DecoratedGroupNode>();
  57. ArrayList<IntermediateCalculationCable> exitCables = new ArrayList<IntermediateCalculationCable>();
  58. //createThem
  59. for(GroupNode groupNode : minimumModel.getUppderNodeList()) {
  60. createdGroupNodes.put(groupNode, new DecoratedGroupNode(groupNode));
  61. }
  62. //unrolling Networks
  63. for(DecoratedNetwork net : stateFromThisTimestep.getNetworkList()) {
  64. for(Consumer con : net.getConsumerList()) {
  65. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, con.getModel(), consumerList, con, createdGroupNodes);
  66. if(groupNodeFromObject != null) {
  67. addToGroupNode(con, groupNodeFromObject.getConsumerList());
  68. }
  69. }
  70. for(Consumer con : net.getConsumerSelfSuppliedList()) {
  71. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, con.getModel(), consumerList, con, createdGroupNodes);
  72. if(groupNodeFromObject != null) {
  73. addToGroupNode(con, groupNodeFromObject.getConsumerList());
  74. }
  75. }
  76. for(Supplier sup : net.getSupplierList()) {
  77. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, sup.getModel(), supplierList, sup, createdGroupNodes);
  78. if(groupNodeFromObject != null) {
  79. addToGroupNode(sup, groupNodeFromObject.getSupplierList());
  80. }
  81. }
  82. for(Passiv pas : net.getPassivNoEnergyList()) {
  83. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, pas.getModel(), passivList, pas, createdGroupNodes);
  84. if(groupNodeFromObject != null) {
  85. addToGroupNode(pas, groupNodeFromObject.getPassivList());
  86. }
  87. }
  88. for(DecoratedCable cable : net.getDecoratedCableList()) {
  89. addCable(cable, inGroupEdges, inGroupObjects,createdGroupNodes, exitCables);
  90. }
  91. }
  92. for(DecoratedCable cable : stateFromThisTimestep.getLeftOverEdges()) {
  93. addCable(cable, inGroupEdges, inGroupObjects, createdGroupNodes, exitCables);
  94. }
  95. for(Node node : minimumModel.getNodeList()) {
  96. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, node, nodeList ,node, createdGroupNodes);
  97. if(groupNodeFromObject != null) {
  98. addToGroupNode(node, groupNodeFromObject.getNodeList());
  99. }
  100. }
  101. for(DecoratedSwitch dSwitch: stateFromThisTimestep.getDecoratedSwitches()) {
  102. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, dSwitch.getModel(), switchList, dSwitch, createdGroupNodes);
  103. if(groupNodeFromObject != null) {
  104. addToGroupNode(dSwitch, groupNodeFromObject.getSwitchList());
  105. }
  106. }
  107. for(DecoratedGroupNode dGroupNode: createdGroupNodes.values()) {
  108. DecoratedGroupNode groupNodeFromObject = addObject(inGroupObjects, dGroupNode.getModel(), groupNodeList, dGroupNode, createdGroupNodes);
  109. if(groupNodeFromObject != null) {
  110. addToGroupNode(dGroupNode, groupNodeFromObject.getGroupNodeList());
  111. }
  112. }
  113. //Create TreeNodeModel:
  114. HashMap<GroupNode, TreeNode<TreeGroupNodeData>> fastaccess= new HashMap<GroupNode, TreeNode<TreeGroupNodeData>>();
  115. TreeNode<TreeGroupNodeData> root = new TreeNode<TreeGroupNodeData>(null, new ArrayList<TreeNode<TreeGroupNodeData>>(), new TreeGroupNodeData(null, 0));
  116. fastaccess.put(null, root);
  117. for(DecoratedGroupNode dGroupNode: getGroupNodeList()) {
  118. addTreeNode(root, dGroupNode, 1, fastaccess);
  119. }
  120. for(IntermediateCalculationCable cable : exitCables) {
  121. createExitEdgesV2(root,cable.getCable() , cable.getInsideObject(),cable.getInsideUpperNode(),cable.getOusideObject(),cable.getOutsideUpperNode(), fastaccess);
  122. }
  123. }
  124. private void createExitEdgesV2(TreeNode<TreeGroupNodeData> root, DecoratedCable cable, AbstractCanvasObject insideObject,
  125. GroupNode insideUpperNode, AbstractCanvasObject ousideObject, GroupNode outsideUpperNode, HashMap<GroupNode, TreeNode<TreeGroupNodeData>> fastaccess) {
  126. //Create Up List
  127. LinkedList<TreeNode<TreeGroupNodeData>> listFromStart = createList(insideUpperNode, fastaccess);
  128. LinkedList<TreeNode<TreeGroupNodeData>> listFromEnd = createList(outsideUpperNode, fastaccess);
  129. LinkedList<TreeNode<TreeGroupNodeData>> common = new LinkedList<TreeNode<TreeGroupNodeData>>(listFromStart);
  130. common.retainAll(listFromEnd);
  131. TreeNode<TreeGroupNodeData> firstCommon = common.getFirst();
  132. LinkedList<TreeNode<TreeGroupNodeData>> resultList = new LinkedList<TreeNode<TreeGroupNodeData>>();
  133. //Add from listFromStart till firstCommon
  134. createresultList(listFromStart, firstCommon, resultList);
  135. //Add firstCommon
  136. resultList.add(firstCommon);
  137. //Add from listFromEnd till firstCommon
  138. createresultList(listFromEnd, firstCommon, resultList);
  139. LinkedList<NodeInfo> infoList = new LinkedList<NodeInfo>();
  140. //Categorize:
  141. ListIterator<TreeNode<TreeGroupNodeData>> iter = resultList.listIterator();
  142. while(iter.hasNext()) {
  143. //categorize
  144. TreeNode<TreeGroupNodeData> actual, next = null, previous = null;
  145. if(iter.hasPrevious()) {
  146. previous =iter.previous();
  147. iter.next();
  148. }
  149. actual = iter.next();
  150. if(iter.hasNext()) {
  151. next =iter.next();
  152. iter.previous();
  153. }
  154. NodeInfo actualInfo = new NodeInfo(actual.getData().groupNode);
  155. if(previous!= null) {
  156. actualInfo.previousGroupNode = previous.getData().groupNode;
  157. if(previous == actual.getParent()) {
  158. actualInfo.previous = Info.Parent;
  159. }else {
  160. actualInfo.previous = Info.Child;
  161. }
  162. }
  163. if(next!= null) {
  164. actualInfo.nextGroupNode = next.getData().groupNode;
  165. if(next == actual.getParent()) {
  166. actualInfo.next = Info.Parent;
  167. }else {
  168. actualInfo.next = Info.Child;
  169. }
  170. }
  171. infoList.add(actualInfo);
  172. }
  173. for(NodeInfo info: infoList) {
  174. DecoratedGroupNode group = this.createdGroupNodes.get(info.groupNode);
  175. ArrayList<ExitCable> mylist;
  176. if(group == null) {
  177. mylist = this.getExitCableList();
  178. }else{
  179. mylist = group.getExitCableList();
  180. }
  181. ExitCableState state =null;
  182. if(info.previous == Info.Nothing) {
  183. if(info.next == Info.Child) {
  184. state = ExitCableState.DOWN;
  185. mylist.add(new ExitCable(state, insideObject, info.nextGroupNode, cable));
  186. }else if(info.next == Info.Parent) {
  187. state = ExitCableState.UP;
  188. mylist.add(new ExitCable(state, insideObject, ousideObject, cable));
  189. }else {
  190. System.out.println("Error in VisualState");
  191. }
  192. }else if(info.previous == Info.Child) {
  193. if(info.next == Info.Child) {
  194. state = ExitCableState.DOWNDOWN;
  195. mylist.add(new ExitCable(state, info.previousGroupNode, info.nextGroupNode, cable));
  196. }else if(info.next == Info.Parent) {
  197. state = ExitCableState.DOWNUP;
  198. mylist.add(new ExitCable(state, info.previousGroupNode, ousideObject, cable));
  199. }else {
  200. state = ExitCableState.DOWN;
  201. mylist.add(new ExitCable(state, info.previousGroupNode, ousideObject, cable));
  202. }
  203. }else {//(info.previous == Info.Parent)
  204. if(info.next == Info.Child) {
  205. state = ExitCableState.DOWNUP;
  206. mylist.add(new ExitCable(state, info.nextGroupNode, insideObject, cable));
  207. }else if(info.next == Info.Parent) {
  208. System.out.println("Error in VisualState");
  209. }else {
  210. state = ExitCableState.UP;
  211. mylist.add(new ExitCable(state, ousideObject, insideObject, cable));
  212. }
  213. }
  214. }
  215. }
  216. private void createresultList(LinkedList<TreeNode<TreeGroupNodeData>> list,
  217. TreeNode<TreeGroupNodeData> firstCommon, LinkedList<TreeNode<TreeGroupNodeData>> resultList) {
  218. for(TreeNode<TreeGroupNodeData> node: list) {
  219. if(node == firstCommon) {
  220. break;
  221. }
  222. resultList.add(node);
  223. }
  224. }
  225. private LinkedList<TreeNode<TreeGroupNodeData>> createList(GroupNode insideUpperNode,
  226. HashMap<GroupNode, TreeNode<TreeGroupNodeData>> fastaccess) {
  227. TreeNode<TreeGroupNodeData> actualNode = fastaccess.get(insideUpperNode);
  228. LinkedList<TreeNode<TreeGroupNodeData>> list = new LinkedList<TreeNode<TreeGroupNodeData>>();
  229. list.add(actualNode);
  230. while(actualNode.getParent() != null) {
  231. actualNode = actualNode.getParent();
  232. list.add(actualNode);
  233. }
  234. return list;
  235. }
  236. private void addCable(HashMap<AbstractCanvasObject, GroupNode> inGroupObjects, DecoratedCable cable,
  237. DecoratedGroupNode groupNodeFromObject,ArrayList<IntermediateCalculationCable> exitCables) {
  238. if(groupNodeFromObject != null) {
  239. boolean isIntern = inGroupObjects.get(cable.getModel().getA()) == inGroupObjects.get(cable.getModel().getB()); //Case null == null is not possible trough before Filtering MinimumModel#addUpperObjects(CpsUpperNode)
  240. if(isIntern) {
  241. addToGroupNode(cable, groupNodeFromObject.getInternCableList());
  242. }else {
  243. if(inGroupObjects.get(cable.getModel().getA()) == groupNodeFromObject.getModel() && inGroupObjects.get(cable.getModel().getB()) != groupNodeFromObject.getModel()) {
  244. //addToGroupNode(new ExitCable(cable, groupNodeFromObject.getModel(),inGroupObjects.get(cable.getModel().getB()), cable.getModel().getA(), cable.getModel().getB()), groupNodeFromObject.getExitCableList());
  245. exitCables.add(new IntermediateCalculationCable(cable, groupNodeFromObject.getModel(),inGroupObjects.get(cable.getModel().getB()), cable.getModel().getA(), cable.getModel().getB()));
  246. }else if(inGroupObjects.get(cable.getModel().getA()) != groupNodeFromObject.getModel() && inGroupObjects.get(cable.getModel().getB()) == groupNodeFromObject.getModel()) {
  247. //addToGroupNode(new ExitCable(cable, groupNodeFromObject.getModel(),inGroupObjects.get(cable.getModel().getA()), cable.getModel().getB(), cable.getModel().getA()), groupNodeFromObject.getExitCableList());
  248. exitCables.add(new IntermediateCalculationCable(cable, groupNodeFromObject.getModel(),inGroupObjects.get(cable.getModel().getA()), cable.getModel().getB(), cable.getModel().getA()));
  249. }
  250. }
  251. }
  252. }
  253. private void addCable(DecoratedCable cable, HashMap<Edge, ArrayList<GroupNode>> inGroupEdges, HashMap<AbstractCanvasObject, GroupNode> inGroupObjects,
  254. HashMap<GroupNode, DecoratedGroupNode> createdGroupNodes, ArrayList<IntermediateCalculationCable> exitCables) {
  255. boolean isInGroup = false;
  256. if(inGroupObjects.containsKey(cable.getModel().getA())) {
  257. isInGroup = true;
  258. }
  259. if(inGroupObjects.containsKey(cable.getModel().getB())) {
  260. isInGroup = true;
  261. }
  262. if(isInGroup) {
  263. boolean isIntern = inGroupObjects.get(cable.getModel().getA()) == inGroupObjects.get(cable.getModel().getB()); //Case null == null is not possible trough before Filtering MinimumModel#addUpperObjects(CpsUpperNode)
  264. if(isIntern) {
  265. DecoratedGroupNode groupNodeFromBoth = createdGroupNodes.get(inGroupObjects.get(cable.getModel().getA()));
  266. groupNodeFromBoth.getInternCableList().add(cable);
  267. }else {
  268. if(inGroupObjects.containsKey(cable.getModel().getA())) {
  269. exitCables.add(new IntermediateCalculationCable(cable, inGroupObjects.get(cable.getModel().getA()),inGroupObjects.get(cable.getModel().getB()), cable.getModel().getA(), cable.getModel().getB()));
  270. } else if(inGroupObjects.containsKey(cable.getModel().getB())) {
  271. exitCables.add(new IntermediateCalculationCable(cable, inGroupObjects.get(cable.getModel().getB()),inGroupObjects.get(cable.getModel().getA()), cable.getModel().getB(), cable.getModel().getA()));
  272. }
  273. }
  274. }else {
  275. cableList.add(cable);
  276. }
  277. }
  278. private <DecoratedObject> void addToGroupNode(DecoratedObject object, ArrayList<DecoratedObject> groupNodeListPar) {
  279. groupNodeListPar.add(object);
  280. }
  281. public int getAmountfOfGroupNodes() {
  282. return groupNodeList.stream().map(groupNode -> groupNode.getAmountOfGroupNodes()).reduce(0, Integer::sum);
  283. }
  284. public float getConsumptionFromConsumer() {
  285. return consumerList.stream().map(con -> con.getEnergyNeededFromNetwork()).reduce(0.f, Float::sum)+
  286. groupNodeList.stream().map(groupNode -> groupNode.getConsumptionFromConsumer()).reduce(0.f, Float::sum);
  287. }
  288. public float getProductionFromSupplier() {
  289. return supplierList.stream().map(sup -> sup.getEnergyToSupplyNetwork()).reduce(0.f, Float::sum)+
  290. groupNodeList.stream().map(groupNode -> groupNode.getProductionFromSupplier()).reduce(0.f, Float::sum);
  291. }
  292. public float getAverageConsumption() {
  293. return getConsumptionFromConsumer() / (float)getAmountfOfGroupNodes();
  294. }
  295. public float getAverageProduction() {
  296. return getProductionFromSupplier() / (float)getAmountfOfGroupNodes();
  297. }
  298. //Generics
  299. private <ModelOfObject, DecoratedObject> DecoratedGroupNode addObject(HashMap<ModelOfObject, GroupNode> inGroupObjects, ModelOfObject modelOfObject, ArrayList<DecoratedObject> listToAdd, DecoratedObject object, HashMap<GroupNode, DecoratedGroupNode> createdGroupNodes) {
  300. if(inGroupObjects.containsKey(modelOfObject)) {
  301. return createdGroupNodes.get(inGroupObjects.get(modelOfObject));
  302. }
  303. listToAdd.add(object);
  304. return null;
  305. }
  306. public enum Info{
  307. Nothing, Parent, Child
  308. }
  309. private class NodeInfo{
  310. public GroupNode groupNode;
  311. public Info previous = Info.Nothing;
  312. public Info next = Info.Nothing;
  313. public GroupNode previousGroupNode = null;
  314. public GroupNode nextGroupNode = null;
  315. public NodeInfo(GroupNode groupNode) {
  316. this.groupNode = groupNode;
  317. }
  318. public String toString() {
  319. return "Previuos: " + previous.toString() + "|Next: " + next.toString();
  320. }
  321. }
  322. public HashMap<GroupNode, DecoratedGroupNode> getCreatedGroupNodes() {
  323. return createdGroupNodes;
  324. }
  325. private class TreeNode<T> {
  326. private TreeNode<T> parentNode;
  327. private List<TreeNode<T>> children;
  328. private T data;
  329. public TreeNode( TreeNode<T> parentNode, List<TreeNode<T>> children, T data) {
  330. this.parentNode = parentNode;
  331. this.children = children;
  332. this.data = data;
  333. }
  334. //Methods
  335. public TreeNode<T> getParent(){
  336. return parentNode;
  337. }
  338. public List<TreeNode<T>> getChildren(){
  339. return children;
  340. }
  341. public T getData() {
  342. return data;
  343. }
  344. public String toString() {
  345. return "[" + data.toString() + " Children(" + children.stream().map(Object::toString).collect(Collectors.joining(", ")) + ")]";
  346. }
  347. }
  348. private class TreeGroupNodeData{
  349. public GroupNode groupNode;
  350. public int layer;
  351. public TreeGroupNodeData(GroupNode groupNode, int layer) {
  352. this.groupNode = groupNode;
  353. this.layer = layer;
  354. }
  355. public String toString() {
  356. return "Layer:" + layer;
  357. }
  358. }
  359. private void addTreeNode(TreeNode<TreeGroupNodeData> node, DecoratedGroupNode dGroupNode, int layer, HashMap<GroupNode, TreeNode<TreeGroupNodeData>> fastaccess) {
  360. TreeNode<TreeGroupNodeData> newNode = new TreeNode<TreeGroupNodeData> (node, new ArrayList<TreeNode<TreeGroupNodeData>>() , new TreeGroupNodeData(dGroupNode.getModel(), layer));
  361. node.getChildren().add(newNode);
  362. fastaccess.put(newNode.data.groupNode, newNode);
  363. for(DecoratedGroupNode dGroupNodeIntern: dGroupNode.getGroupNodeList()) {
  364. addTreeNode(newNode, dGroupNodeIntern, layer+1, fastaccess);
  365. }
  366. }
  367. public ArrayList<ExitCable> getExitCableList() {
  368. return exitCableList;
  369. }
  370. }