From 79b43fbb97eaac34fe8f399fcef7c671a31ccae5 Mon Sep 17 00:00:00 2001 From: Eilert Tunheim <emtunhei@stud.ntnu.no> Date: Tue, 3 May 2022 14:17:23 +0200 Subject: [PATCH] Added confidentinterval for regression, regression not working tho --- Bachelor_application.iml | 1 - pom.xml | 5 - .../java/com/application/DB/Constants.java | 7 +- .../GUI/LineChartFunctionality.java | 154 ++++++++++++------ src/main/java/com/application/Main.java | 4 +- .../com.application/GUI/graphStyles.css | 12 +- .../com.application/GUI/graphStyles.css | 20 +-- .../com/application/DB/Constants.class | Bin 6367 -> 6414 bytes .../application/GUI/InputPopUpWindow.class | Bin 8553 -> 8570 bytes .../GUI/LineChartFunctionality.class | Bin 12357 -> 13662 bytes .../com/application/Main$1WorkerThread.class | Bin 2837 -> 2842 bytes 11 files changed, 129 insertions(+), 74 deletions(-) diff --git a/Bachelor_application.iml b/Bachelor_application.iml index f8154df..06a8fa9 100644 --- a/Bachelor_application.iml +++ b/Bachelor_application.iml @@ -54,6 +54,5 @@ <orderEntry type="library" name="Maven: com.google.auto.value:auto-value-annotations:1.9" level="project" /> <orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" /> <orderEntry type="library" name="Maven: joda-time:joda-time:2.10.14" level="project" /> - <orderEntry type="library" name="Maven: org.jblas:jblas:1.2.4" level="project" /> </component> </module> \ No newline at end of file diff --git a/pom.xml b/pom.xml index 221d396..51648b1 100644 --- a/pom.xml +++ b/pom.xml @@ -40,11 +40,6 @@ <artifactId>joda-time</artifactId> <version>2.10.14</version> </dependency> - <dependency> - <groupId>org.jblas</groupId> - <artifactId>jblas</artifactId> - <version>1.2.4</version> - </dependency> </dependencies> <properties> diff --git a/src/main/java/com/application/DB/Constants.java b/src/main/java/com/application/DB/Constants.java index ccb1fac..69d3c17 100644 --- a/src/main/java/com/application/DB/Constants.java +++ b/src/main/java/com/application/DB/Constants.java @@ -27,10 +27,13 @@ public final class Constants { public static int NUMBER_OF_PERIODS = 2; // Number of seconds to wait before updating live data, in seconds - public static int NUMBER_OF_SECONDS_LIVE_DATA = 10; + public static int NUMBER_OF_SECONDS_LIVE_DATA = 60; + + // Confidence interval + public static final double CONFIDENCE_INTERVAL = 0.95; // Non linear regression - public static final double ADJUST_REGRESSION = 5.5; + public static final double ADJUST_REGRESSION = 2.5; // Current sawmill settings; public static final String PROJECT_ID = "sf-drying-optimization"; diff --git a/src/main/java/com/application/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java index 9883670..a72f2b9 100644 --- a/src/main/java/com/application/GUI/LineChartFunctionality.java +++ b/src/main/java/com/application/GUI/LineChartFunctionality.java @@ -1,5 +1,6 @@ package com.application.GUI; +import com.application.DB.Constants; import com.application.Main; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.LineChart; @@ -14,6 +15,7 @@ import org.apache.commons.math3.stat.regression.SimpleRegression; import java.util.*; import static com.application.DB.Constants.ADJUST_REGRESSION; +import static com.application.DB.Constants.CONFIDENCE_INTERVAL; public class LineChartFunctionality { @@ -21,8 +23,8 @@ public class LineChartFunctionality { private static XYChart.Series<String, Number> liveDataSeries; private static CategoryAxis xAxis; private static NumberAxis yAxis; - private static final double CONFIDENCE_INTERVAL = 0.90; - private static int dataPoints = 0; + private static int dataPointsXAxis = 0; + private static int dataPointsYAxis = 0; private static Map<String, Number> liveData; @@ -58,22 +60,25 @@ public class LineChartFunctionality { for (Map.Entry<Integer, ArrayList<Double>> entry : multiMap.entrySet()) { //System.out.printf("\nIndex: \t%s\t\t\tkWh: \t%s\n", entry.getKey(), entry.getValue()); - if(entry.getValue().size()>1){ + System.out.println("entry: "+entry); + //if(entry.getValue().size()>1){ SummaryStatistics stats = new SummaryStatistics(); for (double val : entry.getValue()) { stats.addValue(val); } + //System.out.println("Stats: "+stats); + // Calculate 95% confidence interval - double ci = calcMeanCI(stats, CONFIDENCE_INTERVAL); + double ci = calcMeanCI(stats, Constants.CONFIDENCE_INTERVAL); //System.out.println(String.format("Mean: %f", stats.getMean())); double lower = stats.getMean() - ci; double upper = stats.getMean() + ci; - //System.out.println(String.format("Confidence Interval 95%%: %f, %f", lower, upper)); + System.out.println(String.format("Confidence Interval "+CONFIDENCE_INTERVAL*100+"%%: %f, %f", lower, upper)); // Deletes entries if they are out of bounds with the confidence interval entry.getValue().removeIf(value -> Double.compare(value, lower) < 0 || Double.compare(value, upper) > 0); - } + //} } return multiMap; } @@ -127,6 +132,74 @@ public class LineChartFunctionality { //System.out.println("Series size: "+allSeries.size()); + + + // Finds the end datapoint at the end of each graph + int numberOfGraphs = 0; + ArrayList<Double> dataArraylistXAxis = new ArrayList<>(); + ArrayList<Double> dataArraylistYAxis = new ArrayList<>(); + Map<Integer, ArrayList<Double>> endOfGraphPointsXAxis = new HashMap<>(); + Map<Integer, ArrayList<Double>> endOfGraphPointsYAxis = new HashMap<>(); + for (int i = 0; i < multiMap.size(); i++) { + ArrayList<Double> list = multiMap.get(i); + for (int j = 0; j < list.size(); j++) { + if (numberOfGraphs < list.size()) { + numberOfGraphs = list.size(); + } + if (list.size() < numberOfGraphs) { + + dataArraylistXAxis.add((double) i); + dataArraylistYAxis.add(multiMap.get(i).get(j)); + //System.out.println(tempList); + + numberOfGraphs = list.size(); + } + } + } + dataArraylistXAxis.add((double) multiMap.size()); + dataArraylistYAxis.add(multiMap.get(multiMap.size()-1).get(0)); + + //System.out.println(dataArraylistYAxis); + + + endOfGraphPointsXAxis.put(0,dataArraylistXAxis); + endOfGraphPointsYAxis.put(0,dataArraylistYAxis); + + System.out.println(endOfGraphPointsXAxis); + System.out.println(endOfGraphPointsYAxis); + + Map<Integer, ArrayList<Double>> endOfGraphPointsConfidenceXAxis = statistics(endOfGraphPointsXAxis); + Map<Integer, ArrayList<Double>> endOfGraphPointsConfidenceYaxis = statistics(endOfGraphPointsYAxis); + + System.out.println(endOfGraphPointsConfidenceXAxis); + + System.out.println("Size of list: "+ endOfGraphPointsConfidenceXAxis.size()); + + dataPointsXAxis = 0; + for (Map.Entry<Integer, ArrayList<Double>> entry : endOfGraphPointsConfidenceXAxis.entrySet()) { + System.out.println("Arraylist: "+ entry.getValue()); + for (int i = 0; i < entry.getValue().size(); i++) { + System.out.println("End of graphs: "+ entry.getValue().get(i)); + dataPointsXAxis += entry.getValue().get(i); + } + } + dataPointsXAxis = dataPointsXAxis /endOfGraphPointsConfidenceXAxis.get(0).size(); + + System.out.println("Datapoints: " + dataPointsXAxis); + + dataPointsYAxis = 0; + for (Map.Entry<Integer, ArrayList<Double>> entry : endOfGraphPointsConfidenceYaxis.entrySet()) { + System.out.println("Arraylist: "+ entry.getValue()); + for (int i = 0; i < entry.getValue().size(); i++) { + System.out.println("End of graphs: "+ entry.getValue().get(i)); + dataPointsYAxis += entry.getValue().get(i); + } + } + dataPointsYAxis = dataPointsYAxis /endOfGraphPointsConfidenceYaxis.get(0).size(); + + System.out.println("Datapoints Y-axis: " + dataPointsYAxis); + + // Stores the data from the confidence interval in a new map Map<Integer, ArrayList<Double>> confidenceIntervalData = statistics(multiMap); @@ -174,47 +247,29 @@ public class LineChartFunctionality { } } - // Finds the end datapoint at the end of each graph - int numberOfGraphs = 0; - ArrayList<Integer> endOfGraphPoints = new ArrayList<>(); - for (int i = 0; i < confidenceIntervalData.size(); i++) { - ArrayList<Double> list = confidenceIntervalData.get(i); - for (int j = 0; j < list.size(); j++) { - if (numberOfGraphs < list.size()) { - numberOfGraphs = list.size(); - } - if (list.size() < numberOfGraphs) { - endOfGraphPoints.add(i); - numberOfGraphs = list.size(); - } - } - } - endOfGraphPoints.add(confidenceIntervalData.size()); - - dataPoints = 0; - for (int i = 0; i < endOfGraphPoints.size(); i++) { - dataPoints+=endOfGraphPoints.get(i); - } - dataPoints = dataPoints/endOfGraphPoints.size(); - liveDataSeries = new XYChart.Series<String, Number>(); updateLineChart(liveDataSeries); XYChart.Series<String, Number> regressionSeries = new XYChart.Series<String, Number>(); - for (int i = 0; i <= dataPoints; i++) { + for (int i = 0; i <= getDataPointsXAxis(); i++) { // Connect the data to a series //System.out.println(simpleRegression.predict(i)); //regressionSeries.getData().add(new XYChart.Data<String, Number>(String.valueOf(i), simpleRegression.predict(i))); regressionSeries.getData().add(new XYChart.Data<String, Number>( String.valueOf(i), - getNonLinearRegression(confidenceIntervalData, - simpleRegression.getIntercept(), - simpleRegression.getSlope(), - i, - dataPoints))); + getNonLinearRegression( + confidenceIntervalData, + getDataPointsYAxis(), + //simpleRegression.getIntercept(), + simpleRegression.getSlope(), + //simpleRegression.getIntercept() + getDataPointsYAxis(), + i, + getDataPointsXAxis() + ))); } updateLineChart(regressionSeries); //lineChart.setOpacity(1); @@ -252,7 +307,7 @@ public class LineChartFunctionality { System.out.println("Predicted Time: " + simpleRegression.predict(35)); // You can also get the slope and intercept from your data - System.out.println("slope = " + simpleRegression.getSlope()); + System.out.println("Alpha! = " + simpleRegression.getSlope()); System.out.println("intercept = " + simpleRegression.getIntercept()); //simpleRegression.add @@ -281,10 +336,10 @@ public class LineChartFunctionality { int time = 0; if(liveData == 0) { - time = getDataPoints()*10; + time = getDataPointsXAxis()*10; } else { - time = (getDataPoints()/liveData)*10; + time = (getDataPointsXAxis()/liveData)*10; } if(time > 60){ time = time/60; @@ -295,10 +350,10 @@ public class LineChartFunctionality { } - public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double y0, double alpha, double j, int n) { + public static double getNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, double y0, double alpha, double beta, double j, double n) { //return Math.exp(intercept+slope*i)/(1+Math.exp(intercept+slope*i)); - + /* double beta = 0.0; //double n = confidenceIntervalData.size(); for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) { @@ -308,28 +363,31 @@ public class LineChartFunctionality { } } } + + */ //System.out.println("maxYValue: " + maxYValue); //System.out.println("j*n: "+j/n); - //double p_t = ((beta*maxYValue)/(maxYValue+((beta-maxYValue)*Math.exp(-alpha*(yValue-maxYValue))))); - //double p_t = ((beta* y0)/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(2*Math.PI)))))-y0; //Funker sånn halveis - //double p_t = (beta * y0)/(y0 + (beta - y0)*Math.exp(-intercept*(j/n))); - - double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(ADJUST_REGRESSION)))))-y0; //Beste til nå + //double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*j/n/(ADJUST_REGRESSION)))))-y0; //Beste til nå + double p_t = (((beta * y0))/(y0 +((beta- y0)*Math.exp(-alpha*(j-n)))))-y0; //Beste til nå System.out.println("---------------------------"); System.out.println("y0: " + y0); System.out.println("Alpha: " + alpha); System.out.println("Beta: " + beta); - System.out.println(p_t); + //System.out.println(p_t); return p_t; } - public static int getDataPoints() { - return dataPoints; + public static int getDataPointsXAxis() { + return dataPointsXAxis; + } + + public static int getDataPointsYAxis() { + return dataPointsYAxis; } public static Map<String, Number> getLiveData() { diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index b795ec3..aa32d72 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -24,7 +24,7 @@ import java.util.logging.Logger; import static com.application.DB.Constants.*; import static com.application.DB.HelpingFunctions.*; import static com.application.DB.HelpingFunctions.isLoadedData; -import static com.application.GUI.LineChartFunctionality.getDataPoints; +import static com.application.GUI.LineChartFunctionality.getDataPointsXAxis; import static com.application.GUI.LineChartFunctionality.getLiveData; import static java.util.logging.Level.SEVERE; @@ -251,7 +251,7 @@ public class Main extends Application { rpi.setProgress(progress); }); - progress = getLiveData().size()/getDataPoints(); + progress = getLiveData().size()/ getDataPointsXAxis(); if (progress > 100) { break; diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css index ce64d11..2629bcc 100644 --- a/src/main/resources/com.application/GUI/graphStyles.css +++ b/src/main/resources/com.application/GUI/graphStyles.css @@ -15,9 +15,9 @@ .default-color0.chart-line-symbol{-fx-background-color: red,red;} .default-color1.chart-line-symbol{-fx-background-color: green,green;} -.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} diff --git a/target/classes/com.application/GUI/graphStyles.css b/target/classes/com.application/GUI/graphStyles.css index bbef3d5..2629bcc 100644 --- a/target/classes/com.application/GUI/graphStyles.css +++ b/target/classes/com.application/GUI/graphStyles.css @@ -4,8 +4,8 @@ -fx-effect: null; } -.default-color0.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} -.default-color1.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} +.default-color0.chart-series-line{-fx-stroke: red; -fx-opacity: 1.0} +.default-color1.chart-series-line{-fx-stroke: green; -fx-opacity: 1.0} .default-color2.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color3.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color4.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} @@ -13,11 +13,11 @@ .default-color6.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} .default-color7.chart-series-line{-fx-stroke: rgba(0,168,355,0.3); -fx-opacity: 0.1} -.default-color0.chart-line-symbol{-fx-background-color: green,green;} -.default-color1.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} -.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),rgba(0,168,355,0.3);} +.default-color0.chart-line-symbol{-fx-background-color: red,red;} +.default-color1.chart-line-symbol{-fx-background-color: green,green;} +.default-color2.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color3.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color4.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color5.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color6.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} +.default-color7.chart-line-symbol{-fx-background-color: rgba(0,168,355,0.3),white;} diff --git a/target/classes/com/application/DB/Constants.class b/target/classes/com/application/DB/Constants.class index 02c56a821341bc307e15807c05b63c49702bfc51..3b053db686018b72a73f6e868c762198503a508d 100644 GIT binary patch delta 2252 zcmca_*k@FK>ff$?3=9k=3?I1|%o*mhGc4d@U;@z#xfo0s7I87KFf0a%ECI2Wf{0}t z49h_xD?pr;91N>K^lA=<H5?3UIT+S)Fs$cb*ucTCk%M6q2g7DAhAj+RIT=_OwsA0Q z=U~{u!LXBqVHXF(Zjjg>u6hO*hP@yI_JN4~91I6I7!GnU9O7U&3{r4}gW)KMKE}at zoQvTE!$~fNQw*m;tTQ0tvm6ZPK=gSKaREeJ1QD0m87{LkT;XE4%5aT~!I<GXJHrh| z1|H|opdeSjka!oz5LZS9A)l<ovc!r1QVfNi{r%iLU0nT~UE@9dLR^Ew9DNuW7+n|{ zc%Ad}ic1pnO2QIzN>kbF-=%@U<OD_$Nj3)-1~6b`;0g%x_i}X(iT8BjV7NJXA)^-K zt;uH?TNrO|4rF@4#CT`373*A9<}!xz$+x&nt?x42<6&rFsN-R{&+veUVKRu-!BEG@ zz!{d9lbc$SnOw}n@Q~pV4?{Odl-avHgNI=Ph^a7HpGS6bI(H`bV;+XP3{Q9%Vi;m4 z-{!U#N@j@VVVDXsX&Q)_$xt_0hbPKDmm!vsfioyIF$e4e9)?1YfN*7HWu>mKuWm|; zf`^AyZmv~vF+0Ok9)@QO&)FGX@G!h&c*Vo;n&HjlqdXqmZ+RHrF}&wtC}a4rS%SBK ziBWrUC%<jI0|O(2BLf2i6N4**B!fGHC7kcUAj#m#U<2oSF-S6aBgy+PNHX{$@dX$p z8T^p=QVfy|{z!aj21$khB)%+zBtu|5l0XoHBttNog&|1t{0x!|p-6m?g<(j1K?X^N za3sDEgCs))5?_Qtk|7d_FUlavP#=Y4VKjpzC?*&f8REbp63-yXkbtBC<fB9+KFCK& zNPJlaNrq&GSQPy!Nam+9NHU}$saIl<tY=6^5>RH4WXM3`gM5^U#0U8(3yH77Ajy!8 z#8+jIWXM6X5agj;GzaA&saI#Hmt@FC5&-$A0ErLsQ6ZWEMM(0+43Z2bNEVhd@G~$m zlrfYuFfvpyFfbT1FfuSQFfg!cZD(NI2oBUr1_lODxx>J~$H2lME5K02z`(!*QN>Wr zP{Y8$z{ya{P{+W;P%+t0$jld{L5KmAOY<2x7z!9f844Mc8H(WgI2dFZ>KPgs7#JF% zCP74+7#N`O*v!BM%BWxyFA7;BnOMQV!BEK{!BEAZ!BCB4q7p+Znu#EhHn@rH44e!d zP&Y;j>mr$0&%nXZz#z!b$RNeggk+)!hKV4NPPmC(3|ydc0_?_AF|Emeg_Y_-K9^%) zXJBAxW8h$DXAorQV31<yWKd@4V$fmeVX$QAMY6$|p$E;)AQ5C6I2n2w`am`?Ffhn~ zL!5zuWfOzM1_lNOMh1{=Y+%uekZ|K+=x5*pl~^DxlWoK$CLa=!3j`?>V_;=qV3^9l z!7z<MkYPH56vGS#Wro>Ej*(@Uh~^lO2&!WyK^!yLP*hYFWGck+`4G#&c29-|@kJr= z$yK5%NWr|6frDWgg9O8J1`UQ4NcJi*OhL03B!U`oQ=z857DbM@H4GdKYZ(L?)-gyi ztVc2t6iuj!3nYT<6E22nP!m(de2^k-GXn?176w6vtqf8O+ZdD?wlnB3>}0TH*o9=e zF~f8;_ku)_P3L5o0SPD6NK-?Pw0)3pgGAa)sDo_8&A<+VMA#t)4u-=Ff(%C(q!^Ae zC^H;Ka)>O$EHsCJL{J?v8=FHk&>eCb;t+;@1`dWf4CO4KqG0k@aScYB$#N1sjFppD cOUQ~lFgP%HFeEa>F*GrxGB7gC1(yx;0MNWwLjV8( delta 2214 zcmeA(x^Gy2>ff$?3=9k=4DYxY%o*meGtA{;U;@$exEM?r=5sNyFf0IxECjI@fr!N% z3`;;FOF^7v91P1r^a>7!l^hJKI2cxQFs$KVSj)k%j)P%62g3#~hK&rHI2l+NHghm+ z;b7Rx!LW^kVLJ!I4v^SRu6hO*hFu^7c7upL91MFo81`{6?B`%O08(&}gW(W}KFq;z zgp1)Q!!a&~;|wQ2tdk(&QydJZLG&3AaTY|J0}<!h87{ChT;yW7#BiC5!I<F+JHu5* z1|H|opdeSjka!oz5LZS9A)l<ovc!r1QtSmCUA#hrL*j#6-Gf|%gFXHI7#SE{7#Vn- z^Ye;J67x#J5_3vZ*&M_ez<`l~D<H_<%hfp~-qVGH;o9T_j9QG>C%<NFVZ5=qfawJj z<IT;HtaDkJiy2BL|Ku{YzQu5xhoO<7nup;I!(ASR2_RN0Lp37<XINrRZfZ$paxo9X zJ%;-{3>_d*X7BP09)?~JQ(>|nkL=_&?o93nJPfxO9`Z0mGDJ=O#ceN?z!1g5FbQPR zWDqfpp?b16Pn3NYLlh$eXHaTl4%p2+40#{{;mXR&N?l)H-INps4-c!{T&v<@c7{hh z438O}uroa6VR**yoQL5B!^_D}cs#gY@i4q*c*Da`%<y)zId1_Iqt@gV{I>O$42%qp z3=9lR46Y243~mfIaK1Z(B!dS7Lf(@>lEDj!FTfzl;ElwWVvuC;LE=j@NHX{$@nsn# z8T^p={tS`~0rhAW1|lioXOLtFLgIrg3`XJ$GDtFnAn}D5BpE`H_#zCF3}HxoQ3gqd za3uR87$h0$BN?I?7#X6$ArQkL$q<XA0pz1NBtFPT@ko4G21$klH2sN479=r9G9)9Z zS7MN4NI~K&Gf37mq#_A`e3XX72l*%+iLb&S$&i7>S7nf7$V9Rb<fAM!2W2CvS7(r9 z$U)*uGt^5m<RS@xe3XY~Kt7Uu0fQt%A(Dkf4EzjC48;s342%q=3=9m$42%qn3=9mc zTH6^IH-ZDTjDdjxRIV^E@G-D32r!g0Ffi~y6fsmV@K!P~FmN(dF;p`!F_ccO6*BV$ zX%J#yVPIg$Vc=lMWe{b^V^C(uhil|ukY%W0sAXVasDl~>5vgZjfW~730~aV`f=rww zY>i}KDFX*X8G{5vIfDj61(JbE3{7YTf<&6(2DUJ8GPFXS*deToWMT~i2SY7`AVVF4 z6hl3di6R&#f<)TjCblzhfr<r?6DLm*)0(U!qErv^xEupJ0|P@d0|!G3gCIjIgA_v> zgEB)qgAPL{gC#>3k`2ZTooH?bi6Gm+$<W2n4YGlOfk6fw;tUKdn;0ZEFfcGMGJtGj z1B>=Sf{llvhk*-JK!LPOzA0iB2vQ=(z{<eDFo}VKVKRdt!xRQ7hN%q73^R}%BFoT+ z<`9qwszdrA4w;-FDk=*y6=Lxmh{a%gCqROClCb#Xm7*$0A-srzgJCg)1j7;r4Thyi z)+#YfM6(tof*NO&Acjts5<`x&l?)sVs~7|sRx?O3tU)pn6ho-V3M7K;5iW+wP!p$! z`5?vD1_lm>jSPYen;4`RHZv$QY+=x0*v4SVupP;CV}>bc?gfb;o6gBF6%tIS@uh|y zU%Mf}28pj}PzPm;n}Hn!iLd<(91I5-1Q`x8NHH8@P-ZxS<Pceg>1YlCiJ&@U1~!Li zpgZIQ#32kl3>*wI8A@0{g}`JL2@OWB$-WXjjAfH=Nyv)ZGB_}}G9)rYGc++IF)%XB I0+$N20rqT4!vFvP diff --git a/target/classes/com/application/GUI/InputPopUpWindow.class b/target/classes/com/application/GUI/InputPopUpWindow.class index 037171ffa7925880946ed5def0d7a08388321c3e..9842a47d800e544997e151418ed15de64d8ee3d9 100644 GIT binary patch delta 1466 zcmaFq^vkLK)W2Q(7#J8#7|(JsG&3CJVmQQbn2X^E!%=pIV_Xa@3<o(Gjx(G9u}*R@ zoC49O*%{7oFr4LL;9@w(!Ehc#U*KT4$iXm?o#7G(!(|SJD_jg$8LqK2T<2mCWw^n? za1%t|;$XN9qA!4mI~)vmIT-G7FidQ6uIFI*#?J7agW(4kgBi%kpCI~z5Ca3le=Y_y zMh139Mm7f(1~A}auw`Td5zOq2EZmH&jBK2Y?2H^B5l(hSE;fgz17LM*4)qRT1{Z@H zBR7cPVQ1v!VC3Us<YyG%ViaT)0_hg!VqmFf6yaiEVHD+H6ystPXO!S#lw_0wv7|W} zWf)~S8RZz|xfnzl6+kRS5TOJjlsOnxxEKT(RXG^dK(snYPy@u$<Y3g|WbkFw=3>-g z)CCcGAVMER7=WxYWM?!IVqj!6<zmQYG@E>skv|H=vSMen=3*#fv=L%pVl)LAX9pte zxfmT79fcT}8J)Qp4l%m0g8jw7`~u`WSCB?GE=G4o4=zSIMo*AhFChjNMrV+i4?Cmp zW=*E|%wl{wnPsUii6x048AYjyDU1w^sf-L#llQYqO*Ur}Vzl1u#b(LK=f}h7&(O}! z7{J5m&los)BD=U+5D#N8V+appC}S8SgMepVL1~FXKw?p1ZfZ$tQ85o=IAa9JAOlv> z$&c9u1tS<4I5I(sLh=iE7$X@YCbM!Fu|@GPMl;4tw&hSUiDhIE4o=NUO)gOgDN0RM z2rfuX&P*-lVT=PABmmayQj}ldl3$+ZlwZNa7|)onc`An+qiCW4V-i0bW3m8a3J+r{ zV;T=*I%CG<51jJ)nLLbHjM<C~f?0`WiD?!3#mT98srr8TDXHv?IXsNHjCt&g`8<pT zjD<XmMU2Ih?YJb_N_ZGc8M7zHa{1Sn@i3M%R<JWx@-S90R`W2{FxK)g)-l%eFg7r> zGcpKQR#sN(`uggoq$qfJSmowg6&JHJHu5kwF*dU^w(u~vGPdzBwlj9HGj{SYb}@Fd zGxqQ>_A++!F!nL_^Ds^Tu_l6uNsQf$42-HgjFTCsFfuUkFivHh#>2=l9V9n{apq)W zZUc!~JdCp$BX}6+fQY#uVjhT?Ke?J)x_$u<<3h$oJPd7&i+LEAFedOYE@f!vVO$0x zmV@023IY9`#JqHU*NWuSf|AVqJRZgs4DI}Ej4OE<S248mFs=r<a19URTE=z!Y>ewc zMsDC?+z2vq6XRwc#x0Cn*%`O-Fm7kq#lyG*WXVpj%3VAxjJp~4Y?kEN%*ec#ao^<g zymE~DH^1YZ$I5tMa<6b1<H5-+BC(8zCMSuUWIQ}sN7P;Z2oK{?#*;h@s~A@EFzjY% z=V90iB6c$D;$hg!uxs)pQB%g#lTV1gWI4mgpgLJjOnh>_7~AGcVo~gj8z$?@xoU1? z*u=ofu$h5@L5hLzH$x03p9BPcXYgQW*us_yA_TY?woaZcH<@`G!}iIB@{&^97<Mo) zfOT;)urTO3u`_I85#VCj$*^m3ihPXNHiqp`X?6xCcc|p<$=BpFO(0UD3@i-m7}hf| zFf3<aVBle3WZ+=nWZ1^A2cazlstx3gVue&xGkrjk3>*ymCcjhA3f#}Yz`(?Cfbj$a z0|OTWBjYi~Q;f$MBpH5z3SI_QhTja#41XB@GW-Lv7>yZC7>%JUTR6)J&hln71^^2o BI931v delta 1495 zcmez6^wO#R)W2Q(7#J8#7|(DqG&3CFVmQcfh>PJc!x46dqg)Iu3<o$Fjxihuu}*L> zoCMLQ*cnc9Fr49H;9@w-!Eg>lpXXq>z`-z)o#7$}!zB)e%Ulds7_PE2T;pO8Ww_44 za05i&<Y2f3qR)ef+Z+scI2i77Fifm*t7m8U#=-ENi@^+J-VYFcUWkE#;U9?gpPi9` z%|V3$47eC<85uzY6FVa_HzNxpD<>lxBRfchgPoC+&7tW4SRI=~y#tuR#o)%s1tPfF z8F@GudAS(*82Pyv1sDZEx`ntHSQv%5>KRxVMK~BmxfsP5#km+I7$re0DNaUdMj1{< zSw=Z722n<N5K93>D1rzj4n}1z20=y@4n|cFtp*ZQ2eC9b7&SQ=d>OU47_}L7K!h%c z&;t?rAPWuH84ZOP7#U5t7_u2nxfrt37|lRTa}Z$xA}rY%t+*J97_EgEm>5k!CfkAt zJ1$0hMh77VW=1D2hJ%dGtY9xPFuwq~)CHu`m5b4h(VdG?meB*G)>DXqh0zHl=FQIN zvsshrJu@p~DkFo`<o&EtlRemk7_Bx(vsp5F`|>dQF|@NY`tvaQF$OR)2xTRfC8kyA z7ndZar|JiTNOs0R9>yTXU>?R0#!yBE0nfaG(h`M$#G=I9)RNSqVjjjY#&D3)fgGZf zzpx7mhBGp7WP%ih<QMQTMlgm?7UM8ti{xR9VvL^b$Dv{p!^j{UoSKuGT%r(Cl$xp# zT#%ZanOe-l7z;8;0Ib)gD8IlZzdX+=zk-J`jxm1oG7dLJ(F6g;M1D5LBmu@`9>x^L zR364O#`MXIT=M!EJdBx)S&R&VFb^cB=B4WU<)@^wGiLKJ<}l{6Gv@Iy<}()XFcvZv zP4?%KWGm)jEMd%=oX6!~U&_N+##qkISi!?s$ymk1Sj||&!&u8$$HQ39(9XypTv=IJ zsq5>jo06j7;bE1VYgJs#&e*`i*vQz#&e+Vu*uvP#!`Q~y&d%7u!`R8##m?Bx!`Q>v z#lzUk*vG@z4`NLK5fd4^7#SE<c^D@#PG)3a;9;D?IF*NyV;V?qI^&GVF5CtZGkF+i zF^2On&IS>4K*U@SF>i7Yw{-n{9>xWX3wapY7#Hy{E@q79VO+w{&cnDAL@Wcl6%+#c zIf;4c`mPnpsRbpO`FT8y%Ng4F*%(*wFs@{1<zZX}a^Y$o#x;y<`PmrPfs9<w!?*!t z<VMC#JdB$ex3DvA<zd{$u#<;zJIIn9V3j+0SQvLP?%u4$vzd{3598j+4|wGm_ig^q zJCBud|KxeXWsC<Vi;BcD9-Le(a+2}TWLr^p`NKSnM;K4=Fsx!&&BL&Zp`C|e3y9dk zu#<;j55vyMi$zTtPffll`jX`|BZKN>eKGOL4PtDYAB#n?Gp?CzC+DiUfng&9E5jxR z1_mhxzTXTnoO}`x_?^LnonbRuDu@u^V%Rcyjof6jtqj{37#NHhSQyqZtY=_gSkAz} zz{9}EAi*HQu$5su0|VG3P6ieRJtuaC%`5_33_BQhPA-*?5rb$2S;Wr3<PMeGHTk)G zrU^t!6vI>w22O^p47;JGvNJG+K(&Fq)}oM#YNiiJl7WL^@8tgqT7jU_mx*CN<8cNC z1}+9h#-ofU8ILhYGW-OU$_%UwzZjSqelz@G_zPk&8ZjC(8bMh$aF!#S<;7?O02b{! AfdBvi diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index 125b40b88613c6967a6c7d4b98232326c6796831..fc06715ba9dfd5d758264f91fd1228deb018f988 100644 GIT binary patch delta 7726 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 QlNgg3Q^2fB#wx~Y0C}JQd;kCd delta 6534 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 diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class index 8764a06752f05b58c77755135c22afadf0c8bbf2..b47d85b5fce893cc2f8bdd2faa64b9b4888b2eef 100644 GIT binary patch delta 31 mcmbO#HcM=S3%ig|dTNPFVo72^er8@tafD+<=H@{5Bg_D)+zS2x delta 26 hcmbOwHdSnc3p+1wdTNPFVo72^er8_D<}mgn%m8(&2@C)L -- GitLab