StatisticGraph.java 31 KB

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