FilterableGroupNode.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package ui.view.information;
  2. import java.util.ArrayList;
  3. import java.util.function.Predicate;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.Stream;
  6. import classes.Flexibility;
  7. import classes.GroupNode;
  8. import classes.HolonElement;
  9. import classes.Node;
  10. import jdk.jfr.Unsigned;
  11. import ui.model.Consumer;
  12. import ui.model.DecoratedCable;
  13. import ui.model.DecoratedGroupNode;
  14. import ui.model.DecoratedHolonObject;
  15. import ui.model.DecoratedHolonObject.HolonObjectState;
  16. import ui.model.DecoratedSwitch;
  17. import ui.model.ExitCable;
  18. import ui.model.Passiv;
  19. import ui.model.Supplier;
  20. /**
  21. * For the @VisualRepresentationalState only.
  22. *
  23. * @author Tom
  24. *
  25. */
  26. public class FilterableGroupNode {
  27. private GroupNode model;
  28. private ArrayList<Supplier> supplierList;
  29. private ArrayList<Passiv> passivList;
  30. private ArrayList<Consumer> consumerList;
  31. private ArrayList<Node> nodeList;
  32. /**
  33. * Cables that only exist on that group node. From a object in that group node
  34. * to a object in that group Node. Not exit the group node (a layer down).
  35. */
  36. private ArrayList<DecoratedCable> internCableList;
  37. /**
  38. * Cables that exit this group node (a Layer Up). From a object in this group
  39. * node to a object in a upper layer.
  40. */
  41. private ArrayList<ExitCable> exitCableList;
  42. private ArrayList<DecoratedSwitch> switchList;
  43. private ArrayList<FilterableGroupNode> groupNodeList;
  44. private int iteration;
  45. public FilterableGroupNode(GroupNode model, int iteration) {
  46. this.model = model;
  47. this.iteration = iteration;
  48. this.supplierList = new ArrayList<Supplier>();
  49. this.passivList = new ArrayList<Passiv>();
  50. this.consumerList = new ArrayList<Consumer>();
  51. this.nodeList = new ArrayList<Node>();
  52. this.internCableList = new ArrayList<DecoratedCable>();
  53. this.exitCableList = new ArrayList<ExitCable>();
  54. this.switchList = new ArrayList<DecoratedSwitch>();
  55. this.groupNodeList = new ArrayList<FilterableGroupNode>();
  56. }
  57. public FilterableGroupNode(DecoratedGroupNode dGroupNode, int iteration) {
  58. model = dGroupNode.getModel();
  59. this.iteration = iteration;
  60. supplierList = dGroupNode.getSupplierList();
  61. passivList = dGroupNode.getPassivList();
  62. consumerList = dGroupNode.getConsumerList();
  63. nodeList = dGroupNode.getNodeList();
  64. internCableList = dGroupNode.getInternCableList();
  65. exitCableList = dGroupNode.getExitCableList();
  66. switchList = dGroupNode.getSwitchList();
  67. groupNodeList = (ArrayList<FilterableGroupNode>) dGroupNode.getGroupNodeList().stream()
  68. .map(node -> new FilterableGroupNode(node, iteration)).collect(Collectors.toList());
  69. }
  70. public GroupNode getModel() {
  71. return model;
  72. }
  73. public ArrayList<Supplier> getSupplierList() {
  74. return supplierList;
  75. }
  76. public ArrayList<Passiv> getPassivList() {
  77. return passivList;
  78. }
  79. public ArrayList<Consumer> getConsumerList() {
  80. return consumerList;
  81. }
  82. public ArrayList<Node> getNodeList() {
  83. return nodeList;
  84. }
  85. public ArrayList<DecoratedCable> getInternCableList() {
  86. return internCableList;
  87. }
  88. public ArrayList<ExitCable> getExitCableList() {
  89. return exitCableList;
  90. }
  91. public ArrayList<DecoratedSwitch> getSwitchList() {
  92. return switchList;
  93. }
  94. public ArrayList<FilterableGroupNode> getGroupNodeList() {
  95. return groupNodeList;
  96. }
  97. // Returns the amount of holons and count himself
  98. public int getAmountOfGroupNodes() {
  99. return groupNodeList.stream().map(groupNode -> groupNode.getAmountOfGroupNodes()).reduce(1, Integer::sum);
  100. }
  101. public Stream<Flexibility> getFlexibilitiesStream(Predicate<DecoratedHolonObject> stateFilter,
  102. Predicate<HolonElement> priorityFilter) {
  103. Stream<Flexibility> flexInChildGorupNode = this.groupNodeList.stream()
  104. .flatMap(groupNode -> groupNode.getFlexibilitiesStream(stateFilter, priorityFilter));
  105. Stream<Flexibility> flexInThisGorupNode = objectStream().filter(stateFilter).flatMap(object -> object.getModel()
  106. .getElements().stream().filter(priorityFilter).flatMap(ele -> ele.flexList.stream()));
  107. return Stream.concat(flexInChildGorupNode, flexInThisGorupNode);
  108. }
  109. public Stream<DecoratedHolonObject> objectStream() {
  110. return Stream.concat(Stream.concat(this.consumerList.stream(), this.supplierList.stream()),
  111. this.passivList.stream());
  112. }
  113. // Gather Informations:
  114. public int getAmountOfSupplier(Predicate<DecoratedHolonObject> stateFilter) {
  115. return (int) supplierList.stream().filter(stateFilter).count() + groupNodeList.stream()
  116. .map(groupNode -> groupNode.getAmountOfSupplier(stateFilter)).reduce(0, Integer::sum);
  117. }
  118. public int getAmountOfConsumer(Predicate<DecoratedHolonObject> stateFilter) {
  119. return (int) consumerList.stream().filter(stateFilter).count() + groupNodeList.stream()
  120. .map(groupNode -> groupNode.getAmountOfConsumer(stateFilter)).reduce(0, Integer::sum);
  121. }
  122. public int getAmountOfPassiv(Predicate<DecoratedHolonObject> stateFilter) {
  123. return (int) passivList.stream().filter(stateFilter).count() + groupNodeList.stream()
  124. .map(groupNode -> groupNode.getAmountOfPassiv(stateFilter)).reduce(0, Integer::sum);
  125. }
  126. public int getAmountOfConsumerWithState(Predicate<DecoratedHolonObject> stateFilter, HolonObjectState state) {
  127. return ((int) consumerList.stream().filter(stateFilter).map(con -> con.getState())
  128. .filter(rightState -> (rightState == state)).count())
  129. + groupNodeList.stream().map(groupNode -> groupNode.getAmountOfConsumerWithState(stateFilter, state))
  130. .reduce(0, Integer::sum);
  131. }
  132. public PriorityCounts getPriorityCounts(Predicate<DecoratedHolonObject> stateFilter) {
  133. PriorityCounts priority = new PriorityCounts();
  134. objectStream().filter(stateFilter)
  135. .forEach(object -> object.getModel().getElements().stream().forEach(ele -> priority.Count(ele)));
  136. groupNodeList.stream().forEach(groupNode -> priority.Add(groupNode.getPriorityCounts(stateFilter)));
  137. return priority;
  138. }
  139. public class PriorityCounts {
  140. @Unsigned
  141. public int low, medium, high, essential;
  142. public void Add(PriorityCounts other) {
  143. low += other.low;
  144. medium += other.medium;
  145. high += other.high;
  146. essential += other.essential;
  147. }
  148. public void Count(HolonElement element) {
  149. switch (element.getPriority()) {
  150. case Essential:
  151. essential++;
  152. break;
  153. case High:
  154. high++;
  155. break;
  156. case Medium:
  157. medium++;
  158. break;
  159. case Low:
  160. low++;
  161. break;
  162. default:
  163. break;
  164. }
  165. }
  166. }
  167. public int getAmountOfElementsFromHolonObjects(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
  168. return objectStream().filter(stateFilter).map(object -> (int)object.getModel().getElements().stream().filter(priorityFilter).count()).reduce(0,
  169. Integer::sum)
  170. + groupNodeList.stream().map(groupNode -> groupNode.getAmountOfElementsFromHolonObjects(stateFilter, priorityFilter))
  171. .reduce(0, Integer::sum);
  172. }
  173. public int getAmountOfAktiveElementsFromHolonObjects(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
  174. return objectStream().filter(stateFilter).map(object -> (int)object.getModel().getElements().stream().filter(priorityFilter).count()).reduce(0, Integer::sum)
  175. + groupNodeList.stream()
  176. .map(groupNode -> groupNode.getAmountOfAktiveElementsFromHolonObjects(stateFilter, priorityFilter))
  177. .reduce(0, Integer::sum);
  178. }
  179. public float getConsumption(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
  180. return ((Stream<DecoratedHolonObject>) Stream.concat(this.consumerList.stream(), supplierList.stream())).filter(stateFilter).map(con -> con.getModel().getElements().stream().filter(priorityFilter.and(ele -> ele.getEnergyAtTimeStep(iteration) < 0)).map(ele -> -ele.getEnergyAtTimeStep(iteration)).reduce(0.0f, Float::sum)).reduce(0.f,
  181. Float::sum)
  182. + groupNodeList.stream().map(groupNode -> groupNode.getConsumption(stateFilter, priorityFilter)).reduce(0.f,
  183. Float::sum);
  184. }
  185. public float getProduction(Predicate<DecoratedHolonObject> stateFilter, Predicate<HolonElement> priorityFilter) {
  186. return ((Stream<DecoratedHolonObject>) Stream.concat(this.consumerList.stream(), supplierList.stream())).filter(stateFilter).map(con -> con.getModel().getElements().stream().filter(priorityFilter.and(ele -> ele.getEnergyAtTimeStep(iteration) > 0)).map(ele -> ele.getEnergyAtTimeStep(iteration)).reduce(0.0f, Float::sum)).reduce(0.f,
  187. Float::sum)
  188. + groupNodeList.stream().map(groupNode -> groupNode.getProduction(stateFilter, priorityFilter)).reduce(0.f,
  189. Float::sum);
  190. }
  191. }