StatisticGraph.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. package ui.view;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.RenderingHints;
  7. import java.awt.geom.GeneralPath;
  8. import java.util.ArrayList;
  9. import javax.swing.JPanel;
  10. import classes.AbstractCpsObject;
  11. import classes.CpsUpperNode;
  12. import classes.HolonElement;
  13. import classes.HolonObject;
  14. import classes.HolonSwitch;
  15. import classes.SubNet;
  16. import classes.TrackedDataSet;
  17. import ui.controller.Control;
  18. import ui.model.Model;
  19. public class StatisticGraph extends JPanel {
  20. /**
  21. *
  22. */
  23. private static final long serialVersionUID = 1L;
  24. // Maximum y Value
  25. float maximum = 0;
  26. // is the Simulation running?
  27. private boolean isSimRunning;
  28. // model and controller
  29. private Model model;
  30. private Control controller;
  31. // Graphics2D
  32. private Graphics2D g2;
  33. GeneralPath path = new GeneralPath();
  34. // Data
  35. private ArrayList<TrackedDataSet> dataSets = new ArrayList<>();
  36. /**
  37. * Constructor.
  38. *
  39. * @param model
  40. * the Model
  41. * @param control
  42. * the Controller
  43. */
  44. public StatisticGraph(final Model model, Control control) {
  45. this.controller = control;
  46. this.model = model;
  47. this.setBackground(Color.WHITE);
  48. }
  49. /**
  50. * Paints all Components on the Canvas.
  51. *
  52. * @param g
  53. * Graphics
  54. *
  55. */
  56. public void paintComponent(Graphics g) {
  57. super.paintComponent(g);
  58. // Graphics2D init
  59. g2 = (Graphics2D) g;
  60. RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  61. g2.setRenderingHints(rh);
  62. // Paint the Grid
  63. g2.setStroke(new BasicStroke(0));
  64. g2.setColor(Color.BLACK);
  65. for (int i = 0; i <= this.getWidth(); i += 10) {
  66. g2.drawLine(i, 0, i, this.getHeight());
  67. }
  68. for (int i = 0; i <= this.getHeight(); i += 5) {
  69. g2.drawLine(0, i, this.getWidth(), i);
  70. }
  71. isSimRunning = model.getIsSimulation();
  72. // if sim is on
  73. if (isSimRunning) {
  74. g2.setStroke(new BasicStroke(3));
  75. // Calculate the Maximum
  76. calcMaximum();
  77. // Calculate values for each set and add them
  78. addValues();
  79. // Create Paths and draw them
  80. for (TrackedDataSet set : dataSets) {
  81. path.reset();
  82. switch (set.getProperty()) {
  83. case TrackedDataSet.CONSUMPTION:
  84. case TrackedDataSet.PRODUCTION:
  85. case TrackedDataSet.ACTIVATED_ELEMENTS:
  86. case TrackedDataSet.TOTAL_PRODUCTION:
  87. case TrackedDataSet.TOTAL_CONSUMPTION:
  88. case TrackedDataSet.AMOUNT_HOLONS:
  89. case TrackedDataSet.GROUP_CONSUMPTION:
  90. case TrackedDataSet.GROUP_PRODUCTION:
  91. case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
  92. case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
  93. case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
  94. case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
  95. case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
  96. case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
  97. case TrackedDataSet.AMOUNT_BROKEN_EDGES:
  98. createPathFloats(set);
  99. break;
  100. case TrackedDataSet.ON_OFF:
  101. createPathBooleans(set);
  102. break;
  103. case TrackedDataSet.PERCENT_SUPPLIED:
  104. case TrackedDataSet.PERCENT_NOT_SUPPLIED:
  105. case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
  106. case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
  107. createPathPercent(set);
  108. break;
  109. default:
  110. break;
  111. }
  112. g2.setColor(set.getColor());
  113. g2.draw(path);
  114. }
  115. }
  116. }
  117. /**
  118. * Add an Object to the Graph if the maximum has not reached yet.
  119. *
  120. * @param obj
  121. * the Object to add
  122. */
  123. public void addObject(TrackedDataSet set) {
  124. dataSets.add(set);
  125. }
  126. /**
  127. * Removes an Object from the Graph.
  128. *
  129. * @param id
  130. * the id of the Object to remove
  131. */
  132. public void removeObject(int id) {
  133. dataSets.remove(id);
  134. }
  135. /**
  136. * converts the number to fit the canvas.
  137. *
  138. * @param d
  139. * the number to convert
  140. * @return the converted number
  141. */
  142. public double convertToCanvasY(float d) {
  143. return Math.abs((this.getHeight() - (d * (this.getHeight() / maximum))));
  144. }
  145. /**
  146. * Does take into account which timestep is watched, calculates the max
  147. * values.
  148. *
  149. * @return the currentEnergy
  150. */
  151. public float getEnergyAtCurrentTimeStep(HolonObject obj) {
  152. float temp = 0;
  153. for (HolonElement e : obj.getElements()) {
  154. if (e.getActive()) {
  155. temp = temp + e.getEnergyAt()[model.getCurIteration()];
  156. }
  157. }
  158. return temp;
  159. }
  160. /**
  161. * Calculate the Max Value of the Graph
  162. */
  163. public void calcMaximum() {
  164. maximum = 0;
  165. for (TrackedDataSet set : dataSets) {
  166. float val = 0;
  167. switch (set.getProperty()) {
  168. case TrackedDataSet.CONSUMPTION:
  169. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  170. if (h.getEnergy() < 0) {
  171. val += h.getEnergy() * h.getAmount();
  172. }
  173. }
  174. val *= -1;
  175. break;
  176. case TrackedDataSet.PRODUCTION:
  177. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  178. if (h.getEnergy() > 0) {
  179. val += h.getEnergy() * h.getAmount();
  180. }
  181. }
  182. break;
  183. case TrackedDataSet.ACTIVATED_ELEMENTS:
  184. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  185. val += h.getAmount();
  186. }
  187. break;
  188. case TrackedDataSet.ON_OFF:
  189. val = 1;
  190. break;
  191. case TrackedDataSet.TOTAL_PRODUCTION:
  192. val = getMaxTotalProduction(model.getObjectsOnCanvas());
  193. break;
  194. case TrackedDataSet.TOTAL_CONSUMPTION:
  195. val = getMaxTotalConsumption(model.getObjectsOnCanvas());
  196. val *= -1;
  197. break;
  198. case TrackedDataSet.PERCENT_SUPPLIED:
  199. case TrackedDataSet.PERCENT_NOT_SUPPLIED:
  200. case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
  201. val = 1;
  202. break;
  203. case TrackedDataSet.GROUP_PRODUCTION:
  204. val = getMaxTotalProduction(((CpsUpperNode) set.getCpsObject()).getNodes());
  205. break;
  206. case TrackedDataSet.GROUP_CONSUMPTION:
  207. val = getMaxTotalConsumption(((CpsUpperNode) set.getCpsObject()).getNodes());
  208. val *= -1;
  209. break;
  210. case TrackedDataSet.AMOUNT_HOLONS:
  211. val = controller.getSimManager().getSubNets().size();
  212. for (int i = 0; i < model.getCurIteration(); i++) {
  213. if (val < set.getValues()[i]) {
  214. val = set.getValues()[i];
  215. }
  216. }
  217. break;
  218. case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
  219. val = model.getSwitches().size();
  220. break;
  221. case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
  222. for (SubNet sub : controller.getSimManager().getSubNets()) {
  223. if (val < sub.getObjects().size()) {
  224. val = sub.getObjects().size();
  225. }
  226. }
  227. break;
  228. case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
  229. float eCount = 0;
  230. for (SubNet sub : controller.getSimManager().getSubNets()) {
  231. for (HolonObject obj : sub.getObjects()) {
  232. eCount += obj.getElements().size();
  233. }
  234. if (val < eCount) {
  235. val = eCount;
  236. }
  237. eCount = 0;
  238. }
  239. break;
  240. case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
  241. for (SubNet sub : controller.getSimManager().getSubNets()) {
  242. if (val < sub.getObjects().size()) {
  243. val = sub.getObjects().size();
  244. }
  245. }
  246. break;
  247. case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
  248. for (SubNet sub : controller.getSimManager().getSubNets()) {
  249. float tempVal = -getMaxTotalConsumption(new ArrayList<>(sub.getObjects()));
  250. if (val < tempVal) {
  251. val = tempVal;
  252. }
  253. }
  254. break;
  255. case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
  256. for (SubNet sub : controller.getSimManager().getSubNets()) {
  257. float tempVal = getMaxTotalProduction(new ArrayList<>(sub.getObjects()));
  258. if (val < tempVal) {
  259. val = tempVal;
  260. }
  261. }
  262. break;
  263. case TrackedDataSet.AMOUNT_BROKEN_EDGES:
  264. for (SubNet sub : controller.getSimManager().getSubNets()) {
  265. val += sub.getSwitches().size();
  266. }
  267. break;
  268. case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
  269. val = 1;
  270. break;
  271. default:
  272. maximum = 0;
  273. break;
  274. }
  275. if (val > maximum) {
  276. maximum = val;
  277. }
  278. }
  279. ((StatisticGraphPanel) this.getParent()).setMaximumLabel(maximum);
  280. }
  281. /**
  282. * Add the Current Values to each set
  283. */
  284. private void addValues() {
  285. for (TrackedDataSet set : dataSets) {
  286. float val = 0;
  287. switch (set.getProperty()) {
  288. case TrackedDataSet.CONSUMPTION:
  289. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  290. if (h.getEnergy() < 0 && h.getActive()) {
  291. val += Math.abs(h.getEnergyAt()[model.getCurIteration()]) * h.getAmount();
  292. }
  293. set.setValAt(val, model.getCurIteration());
  294. }
  295. break;
  296. case TrackedDataSet.PRODUCTION:
  297. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  298. if (h.getEnergy() > 0 && h.getActive()) {
  299. val += Math.abs(h.getEnergyAt()[model.getCurIteration()]) * h.getAmount();
  300. }
  301. set.setValAt(val, model.getCurIteration());
  302. }
  303. break;
  304. case TrackedDataSet.ACTIVATED_ELEMENTS:
  305. for (HolonElement h : ((HolonObject) set.getCpsObject()).getElements()) {
  306. if (h.getActive()) {
  307. val += h.getAmount();
  308. }
  309. set.setValAt(val, model.getCurIteration());
  310. }
  311. break;
  312. case TrackedDataSet.ON_OFF:
  313. if (((HolonSwitch) set.getCpsObject()).getManualMode()) {
  314. if (((HolonSwitch) set.getCpsObject()).getActiveManual()) {
  315. set.setValAt(1, model.getCurIteration());
  316. } else {
  317. set.setValAt(0, model.getCurIteration());
  318. }
  319. } else {
  320. if (((HolonSwitch) set.getCpsObject()).getActiveAt()[model.getCurIteration()]) {
  321. set.setValAt(1, model.getCurIteration());
  322. } else {
  323. set.setValAt(0, model.getCurIteration());
  324. }
  325. }
  326. break;
  327. case TrackedDataSet.TOTAL_PRODUCTION:
  328. set.setValAt(getTotalProductionAt(model.getObjectsOnCanvas(), model.getCurIteration()),
  329. model.getCurIteration());
  330. break;
  331. case TrackedDataSet.TOTAL_CONSUMPTION:
  332. set.setValAt(-getTotalConsumptionAt(model.getObjectsOnCanvas(), model.getCurIteration()),
  333. model.getCurIteration());
  334. break;
  335. case TrackedDataSet.PERCENT_SUPPLIED:
  336. set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.SUPPLIED),
  337. model.getCurIteration());
  338. break;
  339. case TrackedDataSet.PERCENT_NOT_SUPPLIED:
  340. set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.NOT_SUPPLIED),
  341. model.getCurIteration());
  342. break;
  343. case TrackedDataSet.PERCENT_PARTIAL_SUPPLIED:
  344. set.setValAt(getPercentState(model.getObjectsOnCanvas(), HolonObject.PARTIALLY_SUPPLIED),
  345. model.getCurIteration());
  346. break;
  347. case TrackedDataSet.GROUP_PRODUCTION:
  348. set.setValAt(
  349. getTotalProductionAt(((CpsUpperNode) set.getCpsObject()).getNodes(), model.getCurIteration()),
  350. model.getCurIteration());
  351. break;
  352. case TrackedDataSet.GROUP_CONSUMPTION:
  353. set.setValAt(
  354. -getTotalConsumptionAt(((CpsUpperNode) set.getCpsObject()).getNodes(), model.getCurIteration()),
  355. model.getCurIteration());
  356. break;
  357. case TrackedDataSet.AMOUNT_HOLONS:
  358. set.setValAt(controller.getSimManager().getSubNets().size(), model.getCurIteration());
  359. break;
  360. case TrackedDataSet.AMOUNT_CLOSED_SWITCHES:
  361. for (HolonSwitch s : model.getSwitches()) {
  362. if (s.getState(model.getCurIteration())) {
  363. val++;
  364. }
  365. }
  366. set.setValAt(val, model.getCurIteration());
  367. break;
  368. case TrackedDataSet.AVG_AMOUNT_OBJECTS_IN_HOLONS:
  369. for (SubNet sub : controller.getSimManager().getSubNets()) {
  370. val += sub.getObjects().size();
  371. }
  372. val /= controller.getSimManager().getSubNets().size();
  373. set.setValAt(val, model.getCurIteration());
  374. break;
  375. case TrackedDataSet.AVG_AMOUNT_ELEMENTS_IN_HOLONS:
  376. for (SubNet sub : controller.getSimManager().getSubNets()) {
  377. for (HolonObject obj : sub.getObjects()) {
  378. val += obj.getElements().size();
  379. }
  380. }
  381. val /= controller.getSimManager().getSubNets().size();
  382. set.setValAt(val, model.getCurIteration());
  383. break;
  384. case TrackedDataSet.AVG_AMOUNT_PRODUCERS_IN_HOLONS:
  385. for (SubNet sub : controller.getSimManager().getSubNets()) {
  386. for (HolonObject obj : sub.getObjects()) {
  387. if (obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) > 0) {
  388. val++;
  389. }
  390. }
  391. }
  392. val /= controller.getSimManager().getSubNets().size();
  393. set.setValAt(val, model.getCurIteration());
  394. break;
  395. case TrackedDataSet.AVG_CONSUMED_ENERGY_IN_HOLONS:
  396. for (SubNet sub : controller.getSimManager().getSubNets()) {
  397. val += -getTotalConsumptionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
  398. model.getCurIteration());
  399. }
  400. val /= controller.getSimManager().getSubNets().size();
  401. set.setValAt(val, model.getCurIteration());
  402. break;
  403. case TrackedDataSet.AVG_WASTED_ENERGY_IN_HOLONS:
  404. for (SubNet sub : controller.getSimManager().getSubNets()) {
  405. val += (getTotalProductionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
  406. model.getCurIteration())
  407. + getTotalConsumptionAt(new ArrayList<AbstractCpsObject>(sub.getObjects()),
  408. model.getCurIteration()));
  409. }
  410. val /= controller.getSimManager().getSubNets().size();
  411. set.setValAt(val, model.getCurIteration());
  412. break;
  413. case TrackedDataSet.AMOUNT_BROKEN_EDGES:
  414. for (SubNet sub : controller.getSimManager().getSubNets()) {
  415. for (HolonSwitch s : sub.getSwitches()) {
  416. if (s.getState()) {
  417. val++;
  418. }
  419. }
  420. }
  421. set.setValAt(val, model.getCurIteration());
  422. break;
  423. case TrackedDataSet.RATIO_PRODUCERS_CONSUMERS:
  424. float prod = 0;
  425. float cons = 0;
  426. for (SubNet sub : controller.getSimManager().getSubNets()) {
  427. for (HolonObject obj : sub.getObjects()) {
  428. if (obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) > 0) {
  429. prod++;
  430. } else if(obj.getCurrentEnergyAtTimeStep(model.getCurIteration()) < 0) {
  431. cons++;
  432. }
  433. }
  434. }
  435. val = prod/(prod+cons);
  436. set.setValAt(val, model.getCurIteration());
  437. break;
  438. default:
  439. break;
  440. }
  441. }
  442. }
  443. /**
  444. * create Path with floats
  445. *
  446. * @param set
  447. */
  448. private void createPathFloats(TrackedDataSet set) {
  449. boolean init = true;
  450. path.moveTo(0, 0);
  451. for (int i = 0; i < model.getCurIteration(); i++) {
  452. if (init && set.getValues()[i] != -1) {
  453. path.moveTo(i * this.getWidth() / model.getIterations() - 1, convertToCanvasY(set.getValues()[i]));
  454. init = false;
  455. }
  456. if (!init) {
  457. if (set.getValues()[i + 1] != -1) {
  458. path.lineTo((i + 1) * this.getWidth() / model.getIterations(),
  459. convertToCanvasY(set.getValues()[i + 1]));
  460. } else {
  461. break;
  462. }
  463. }
  464. }
  465. }
  466. /**
  467. * create Path with booleans(0 and 1)
  468. *
  469. * @param set
  470. */
  471. private void createPathBooleans(TrackedDataSet set) {
  472. boolean init = true;
  473. for (int i = 0; i < model.getCurIteration(); i++) {
  474. if (init && set.getValues()[i] != -1) {
  475. path.moveTo(i * this.getWidth() / model.getIterations() - 1,
  476. convertToCanvasY((float) (set.getValues()[i] * maximum)));
  477. init = false;
  478. }
  479. if (!init) {
  480. if (set.getValues()[i + 1] != -1) {
  481. path.lineTo((i + 1) * this.getWidth() / model.getIterations(),
  482. convertToCanvasY((float) (set.getValues()[i + 1] * maximum)));
  483. } else {
  484. break;
  485. }
  486. }
  487. }
  488. }
  489. /**
  490. * create Path for percent values
  491. *
  492. * @param set
  493. */
  494. private void createPathPercent(TrackedDataSet set) {
  495. boolean init = true;
  496. path.moveTo(0, 0);
  497. for (int i = 0; i < model.getCurIteration(); i++) {
  498. if (init && set.getValues()[i] != -1) {
  499. path.moveTo(i * this.getWidth() / model.getIterations() - 1,
  500. convertToCanvasY(set.getValues()[i] * maximum));
  501. init = false;
  502. }
  503. if (!init) {
  504. if (set.getValues()[i + 1] != -1) {
  505. path.lineTo((i + 1) * this.getWidth() / model.getIterations(),
  506. convertToCanvasY(set.getValues()[i + 1] * maximum));
  507. } else {
  508. break;
  509. }
  510. }
  511. }
  512. }
  513. /**
  514. * get the max total production of the given Objects
  515. *
  516. * @param objects
  517. * List of Objects
  518. */
  519. private float getMaxTotalProduction(ArrayList<AbstractCpsObject> objects) {
  520. float val = 0;
  521. for (AbstractCpsObject obj : objects) {
  522. if (obj instanceof HolonObject) {
  523. for (HolonElement ele : ((HolonObject) obj).getElements()) {
  524. if (ele.getEnergy() > 0) {
  525. val += ele.getEnergy() * ele.getAmount();
  526. }
  527. }
  528. } else if (obj instanceof CpsUpperNode) {
  529. val += getMaxTotalProduction(((CpsUpperNode) obj).getNodes());
  530. }
  531. }
  532. return val;
  533. }
  534. /**
  535. * get the max total consumption of the given Objects
  536. *
  537. * @param objects
  538. * List of Objects
  539. */
  540. private float getMaxTotalConsumption(ArrayList<AbstractCpsObject> objects) {
  541. float val = 0;
  542. for (AbstractCpsObject obj : objects) {
  543. if (obj instanceof HolonObject) {
  544. for (HolonElement ele : ((HolonObject) obj).getElements()) {
  545. if (ele.getEnergy() < 0) {
  546. val += ele.getEnergy() * ele.getAmount();
  547. }
  548. }
  549. } else if (obj instanceof CpsUpperNode) {
  550. val += getMaxTotalConsumption(((CpsUpperNode) obj).getNodes());
  551. }
  552. }
  553. return val;
  554. }
  555. /**
  556. * get the max total production of the given Objects
  557. *
  558. * @param objects
  559. * List of Objects
  560. * @param tStep
  561. */
  562. private float getTotalProductionAt(ArrayList<AbstractCpsObject> objects, int tStep) {
  563. float val = 0;
  564. for (AbstractCpsObject obj : objects) {
  565. if (obj instanceof HolonObject) {
  566. for (HolonElement ele : ((HolonObject) obj).getElements()) {
  567. if (ele.getEnergyAt()[tStep] > 0 && ele.getActive()) {
  568. val += ele.getEnergyAt()[tStep] * ele.getAmount();
  569. }
  570. }
  571. } else if (obj instanceof CpsUpperNode) {
  572. val += getTotalProductionAt(((CpsUpperNode) obj).getNodes(), tStep);
  573. }
  574. }
  575. return val;
  576. }
  577. /**
  578. * get the total consumption of the given Objects at the given timestep
  579. *
  580. * @param objects
  581. * List of Objects
  582. * @param tStep
  583. */
  584. private float getTotalConsumptionAt(ArrayList<AbstractCpsObject> objects, int tStep) {
  585. float val = 0;
  586. for (AbstractCpsObject obj : objects) {
  587. if (obj instanceof HolonObject) {
  588. for (HolonElement ele : ((HolonObject) obj).getElements()) {
  589. if (ele.getEnergyAt()[tStep] < 0 && ele.getActive()) {
  590. val += ele.getEnergyAt()[tStep] * ele.getAmount();
  591. }
  592. }
  593. } else if (obj instanceof CpsUpperNode) {
  594. val += getTotalConsumptionAt(((CpsUpperNode) obj).getNodes(), tStep);
  595. }
  596. }
  597. return val;
  598. }
  599. /**
  600. * get the Percentage of how many objects with the given state are in the
  601. * given List
  602. *
  603. * @param objects
  604. * List of Objects
  605. */
  606. private float getPercentState(ArrayList<AbstractCpsObject> objects, int state) {
  607. float count = controller.getNumberHolonObjects(objects);
  608. float stateObjectss = controller.getNumberStateObjects(objects, state);
  609. return stateObjectss / count;
  610. }
  611. public ArrayList<TrackedDataSet> getDataSets() {
  612. return dataSets;
  613. }
  614. }