StatisticGraph.java 22 KB

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