VisualRepresentationalState.java 15 KB

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