diff --git a/Bachelor_application.iml b/Bachelor_application.iml index f8154df5a6a0bb9048b52fc21433f278efd739cf..06a8fa9ccd7558c365b321eced705ef4f63de40c 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 221d396532975bb209aa47db1d85c44ec971bf1f..51648b17b7224b51ee9052b3b136ff9a1d2b888a 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 ccb1facb19eda28314facb4e06f8ae58fd4cfe11..69d3c177179c33f5b99c24b959d20fb0d65a06ac 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 98836700a206684aaa85ffedcc236c24b080999a..a72f2b9f35504939bca003656fe0d3157375dbc0 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 b795ec3dd57730f274660ee66ea94c309ac7b5c7..aa32d722c051dfa27110356f8cab4e061cce63a7 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 ce64d11a6212e471d83818c65688d7718b717114..2629bcc4a515e757b35ca2a7152f29a05e24fbc3 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 bbef3d52ce4941ae4c58f31aa59e4f0e8b31486e..2629bcc4a515e757b35ca2a7152f29a05e24fbc3 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 Binary files a/target/classes/com/application/DB/Constants.class and b/target/classes/com/application/DB/Constants.class differ diff --git a/target/classes/com/application/GUI/InputPopUpWindow.class b/target/classes/com/application/GUI/InputPopUpWindow.class index 037171ffa7925880946ed5def0d7a08388321c3e..9842a47d800e544997e151418ed15de64d8ee3d9 100644 Binary files a/target/classes/com/application/GUI/InputPopUpWindow.class and b/target/classes/com/application/GUI/InputPopUpWindow.class differ diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class index 125b40b88613c6967a6c7d4b98232326c6796831..fc06715ba9dfd5d758264f91fd1228deb018f988 100644 Binary files a/target/classes/com/application/GUI/LineChartFunctionality.class and b/target/classes/com/application/GUI/LineChartFunctionality.class differ diff --git a/target/classes/com/application/Main$1WorkerThread.class b/target/classes/com/application/Main$1WorkerThread.class index 8764a06752f05b58c77755135c22afadf0c8bbf2..b47d85b5fce893cc2f8bdd2faa64b9b4888b2eef 100644 Binary files a/target/classes/com/application/Main$1WorkerThread.class and b/target/classes/com/application/Main$1WorkerThread.class differ