FilterableGroupNode.java 8.0 KB

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