HolonObject.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package holeg.model;
  2. import java.util.ArrayList;
  3. import java.util.Collection;
  4. import java.util.List;
  5. import java.util.Optional;
  6. import java.util.stream.Collectors;
  7. import java.util.stream.Stream;
  8. /**
  9. * The class HolonObject represents any Object on the system which capability of
  10. * injecting or consuming energy on the network, for instance a house or a power
  11. * plant.
  12. *
  13. * @author Gruppe14
  14. */
  15. public class HolonObject extends AbstractCanvasObject {
  16. /* Array of all consumers */
  17. private List<HolonElement> elements = new ArrayList<>();
  18. //Calculated values
  19. private HolonObjectState state;
  20. private float actualEnergy;
  21. private float energyFromHolon;
  22. private float energyToHolon;
  23. private float minimumConsumingElementEnergy;
  24. private float energyNeededFromHolon;
  25. private float energyFromConsumingElements;
  26. private float energySelfSupplied;
  27. /**
  28. * Constructor Set by default the name of the object equals to the category
  29. * name, until the user changes it.
  30. *
  31. * @param objName name of the Object
  32. */
  33. public HolonObject(String objName) {
  34. super(objName);
  35. }
  36. /**
  37. * Contructor of a copy of an Object.
  38. *
  39. * @param obj object to be copied
  40. */
  41. public HolonObject(HolonObject obj) {
  42. super(obj);
  43. for (HolonElement ele : obj.elements) {
  44. this.add(new HolonElement(ele));
  45. }
  46. }
  47. @Override
  48. public void initForReflection() {
  49. elements = new ArrayList<HolonElement>();
  50. }
  51. /**
  52. * Getter for all Elements in the HolonObject.
  53. *
  54. * @return the elements ArrayList
  55. */
  56. public Stream<HolonElement> getElements() {
  57. return elements.stream();
  58. }
  59. public void clearElements() {
  60. elements.clear();
  61. }
  62. /**
  63. * adds an Element to the Object.
  64. *
  65. * @param element the Element to add
  66. */
  67. public void add(HolonElement element) {
  68. elements.add(element);
  69. element.parentObject = this;
  70. }
  71. public void add(Collection<HolonElement> elements) {
  72. for (HolonElement hE : elements) {
  73. hE.parentObject = this;
  74. }
  75. this.elements.addAll(elements);
  76. }
  77. /**
  78. * remove an Element to the Object.
  79. *
  80. * @param element the Element to add
  81. */
  82. public void remove(HolonElement element) {
  83. elements.remove(element);
  84. element.parentObject = null;
  85. }
  86. public void removeElement(int index) {
  87. HolonElement ele = elements.remove(index);
  88. ele.parentObject = null;
  89. }
  90. /**
  91. * This Method returns the smallest consuming HolonElement that is ACTIVE. If
  92. * the HolonObject has no Consumer its return null.
  93. *
  94. * @return The smallest consuming HolonElement or null.
  95. */
  96. public Optional<HolonElement> getMinimumConsumingElement() {
  97. return elements.stream().filter(element -> element.getActualEnergy() < 0).max((lhs, rhs) -> Float.compare(lhs.getActualEnergy(), rhs.getActualEnergy()));
  98. }
  99. /**
  100. * This Method returns the smallest consuming HolonElement'Energy that is
  101. * ACTIVE. If the HolonObject has no Consumer its return 0.
  102. *
  103. * @return The smallest consuming HolonElement or 0.
  104. */
  105. public float getMinimumConsumingElementEnergy() {
  106. return minimumConsumingElementEnergy;
  107. }
  108. /**
  109. * This Method returns the biggest consuming HolonElement'Energy that is ACTIVE.
  110. * If the HolonObject has no Consumer its return 0.
  111. *
  112. * @return The biggest consuming HolonElement or 0.
  113. */
  114. public float getMaximumConsumingElementEnergy() {
  115. return elements.stream().filter(element -> element.getActualEnergy() < 0).map(element -> -element.getActualEnergy()).max(Float::compare).orElse(0.0f);
  116. }
  117. public float getMaximumProductionPossible() {
  118. return elements.stream().map(HolonElement::getEnergy).filter(energy -> energy > 0).reduce(0.0f, Float::sum);
  119. }
  120. public float getMaximumConsumptionPossible() {
  121. return elements.stream().filter(element -> element.getEnergy() < 0).map(element -> -element.getEnergy()).reduce(0.0f, Float::sum);
  122. }
  123. /**
  124. * This Method returns the Energy of all HolonElements from the HolonObject that
  125. * are consuming. Its sums all Energies from the HolonElements of the
  126. * HolonObject that are ACTIVE and are Consumer. If the HolonObject have no
  127. * HolonElement its return 0;
  128. *
  129. * @return The Energy of the consuming HolonElements.
  130. */
  131. public float getEnergyNeededFromConsumingElements() {
  132. return energyFromConsumingElements;
  133. }
  134. /**
  135. * This Method calculate the amount of HolonElements that are consuming Energy
  136. * and are ACTIVE.
  137. *
  138. * @return The amount of HolonElements that are consuming Energy.
  139. */
  140. public int countConsumingElements() {
  141. return (int) elements.stream().filter(element -> element.getActualEnergy() < 0).count();
  142. }
  143. /**
  144. * This Method calculate the amount of HolonElements that are producing Energy
  145. * and are ACTIVE.
  146. *
  147. * @return The amount of HolonElements that are producing Energy.
  148. */
  149. public int countProducingElements() {
  150. return (int) elements.stream().filter(element -> element.getActualEnergy() > 0).count();
  151. }
  152. public int getNumberOfActiveElements() {
  153. return (int) elements.stream().filter(ele -> ele.active).count();
  154. }
  155. public int getNumberOfInActiveElements() {
  156. return (int) elements.stream().filter(ele -> !ele.active).count();
  157. }
  158. public int getNumberOfElements() {
  159. return elements.size();
  160. }
  161. /**
  162. * This Method returns the Energy of a HolonObject. Its sums all Energies from
  163. * the HolonElements of the HolonObject that are ACTIVE. If the HolonObject have
  164. * no HolonElement its return 0; Is the returned Energy negative then the
  165. * HolonObject need Energy because its consuming HolonElements need more Energy
  166. * then the producing HolonElements. Is the returned Energy positive its
  167. * reversed.
  168. *
  169. * @param timeStep is the TimeStep to compare the HolonElements.
  170. */
  171. public void calculateEnergy(int timeStep) {
  172. elements.forEach(ele -> ele.calculateState(timeStep));
  173. actualEnergy = elements.stream().map(HolonElement::getActualEnergy).reduce(0f, Float::sum);
  174. minimumConsumingElementEnergy = elements.stream().filter(element -> element.getActualEnergy() < 0).map(element -> -element.getActualEnergy()).min(Float::compare).orElse(0.0f);
  175. energyNeededFromHolon = (actualEnergy >= 0) ? 0 : -actualEnergy;
  176. energyFromConsumingElements = elements.stream().filter(element -> element.getActualEnergy() < 0).map(element -> -element.getActualEnergy()).reduce(0.0f, Float::sum);
  177. energySelfSupplied = elements.stream().map(HolonElement::getActualEnergy).filter(energy -> energy > 0).reduce(0.0f, Float::sum);
  178. energyToHolon = energyFromHolon = 0;
  179. }
  180. public float getActualEnergy() {
  181. return actualEnergy;
  182. }
  183. public HolonObjectState getState() {
  184. return state;
  185. }
  186. void setState(HolonObjectState state) {
  187. this.state = state;
  188. }
  189. public float getEnergyFromHolon() {
  190. return energyFromHolon;
  191. }
  192. void setEnergyFromHolon(float energyFromHolon) {
  193. this.energyFromHolon = energyFromHolon;
  194. }
  195. public float getEnergyNeededFromHolon() {
  196. return energyNeededFromHolon;
  197. }
  198. public float getEnergySelfSupplied() {
  199. return energySelfSupplied;
  200. }
  201. public float getCurrentEnergy() {
  202. return energyFromHolon - energyNeededFromHolon;
  203. }
  204. public float getSupplyBarPercentage() {
  205. return (energyFromConsumingElements > 0.001) ? (energyFromHolon + energySelfSupplied) / energyFromConsumingElements : 1.0f;
  206. }
  207. public String toString() {
  208. return "[HolonObject: " + "id=" + getId() + ", name=" + name + ", state=" + state + ", elements=[" + getElements().map(HolonElement::getName).collect(Collectors.joining(", ")) + "]]";
  209. }
  210. public float getEnergyToHolon() {
  211. return energyToHolon;
  212. }
  213. void setEnergyToHolon(float energyToHolon) {
  214. this.energyToHolon = energyToHolon;
  215. }
  216. public void calculateState() {
  217. if(actualEnergy > 0){
  218. state = HolonObjectState.PRODUCER;
  219. }else if(elements.isEmpty()){
  220. state = HolonObjectState.NO_ENERGY;
  221. }else if(energySelfSupplied + energyFromHolon > energyFromConsumingElements) {
  222. state = (HolonObjectState.OVER_SUPPLIED);
  223. }else if(energySelfSupplied + energyFromHolon == energyFromConsumingElements) {
  224. state = (HolonObjectState.SUPPLIED);
  225. }else if(energySelfSupplied + energyFromHolon >= minimumConsumingElementEnergy) {
  226. state = (HolonObjectState.PARTIALLY_SUPPLIED);
  227. }else {
  228. state = (HolonObjectState.NOT_SUPPLIED);
  229. }
  230. }
  231. public enum HolonObjectState {
  232. NO_ENERGY, NOT_SUPPLIED, SUPPLIED, PRODUCER, PARTIALLY_SUPPLIED, OVER_SUPPLIED
  233. }
  234. }