VisualRepresentationalState.java 15 KB

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