From 657d8e47e5c763d72cf962504548d99b90e7135f Mon Sep 17 00:00:00 2001
From: Eilert Tunheim <emtunhei@stud.ntnu.no>
Date: Wed, 4 May 2022 11:21:53 +0200
Subject: [PATCH] non-functioning-cubic-regression

---
 Bachelor_application.iml                      |   1 +
 pom.xml                                       |   6 ++
 .../GUI/LineChartFunctionality.java           | 100 +++++++++++++++++-
 .../com.application/GUI/graphStyles.css       |   2 +-
 .../com.application/GUI/graphStyles.css       |   2 +-
 .../GUI/LineChartFunctionality.class          | Bin 13662 -> 15003 bytes
 6 files changed, 108 insertions(+), 3 deletions(-)

diff --git a/Bachelor_application.iml b/Bachelor_application.iml
index 06a8fa9..f8154df 100644
--- a/Bachelor_application.iml
+++ b/Bachelor_application.iml
@@ -54,5 +54,6 @@
     <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 51648b1..e6c3063 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,12 @@
             <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/GUI/LineChartFunctionality.java b/src/main/java/com/application/GUI/LineChartFunctionality.java
index a72f2b9..e68a03d 100644
--- a/src/main/java/com/application/GUI/LineChartFunctionality.java
+++ b/src/main/java/com/application/GUI/LineChartFunctionality.java
@@ -11,10 +11,11 @@ import org.apache.commons.math3.distribution.TDistribution;
 import org.apache.commons.math3.exception.MathIllegalArgumentException;
 import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
 import org.apache.commons.math3.stat.regression.SimpleRegression;
+import org.jblas.DoubleMatrix;
+import org.jblas.Solve;
 
 import java.util.*;
 
-import static com.application.DB.Constants.ADJUST_REGRESSION;
 import static com.application.DB.Constants.CONFIDENCE_INTERVAL;
 
 public class LineChartFunctionality {
@@ -258,6 +259,7 @@ public class LineChartFunctionality {
             // 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(
@@ -270,6 +272,12 @@ public class LineChartFunctionality {
                                 i,
                                     getDataPointsXAxis()
                             )));
+
+             */
+            regressionSeries.getData().add(new XYChart.Data<String, Number>(
+                    String.valueOf(i),
+                    getCubicNonLinearRegression(confidenceIntervalData,i)
+            ));
         }
         updateLineChart(regressionSeries);
         //lineChart.setOpacity(1);
@@ -378,10 +386,100 @@ public class LineChartFunctionality {
         System.out.println("Beta: " + beta);
         //System.out.println(p_t);
 
+
+
         return p_t;
 
     }
 
+
+    /**
+     * Third degree cubic non-linear regression
+     *
+     * n =
+     *
+     * sumT1 =
+     * sumT2 =
+     * sumT3 =
+     * sumT4 =
+     *
+     * sumY =
+     * sumYxT1=
+     * sumYxT2 =
+     *  @param confidenceIntervalData Data to process
+     * @return
+     */
+    public static double getCubicNonLinearRegression(Map<Integer, ArrayList<Double>> confidenceIntervalData, int index){
+
+        double n = confidenceIntervalData.size();
+        //double n = getDataPointsYAxis();
+        //System.out.println(n);
+
+        double sumT1 = 0;
+        double sumT2 = 0;
+        double sumT3 = 0;
+        double sumT4 = 0;
+
+        double sumY = 0;
+        double sumYxT1 = 0;
+        double sumYxT2 = 0;
+
+
+
+        for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) {
+
+            sumT1 += entry.getKey();
+            sumT2 += Math.pow(entry.getKey(),2);
+            sumT3 += Math.pow(entry.getKey(),3);
+            sumT4 += Math.pow(entry.getKey(),4);
+
+            for (int j = 0; j < entry.getValue().size(); j++) {
+
+                sumY += entry.getValue().get(j);
+                sumYxT1 += entry.getValue().get(j) * entry.getKey();
+                sumYxT2 += entry.getValue().get(j) * Math.pow(entry.getKey(), 2);
+            }
+        }
+
+
+
+
+/*
+        for (Map.Entry<Integer, ArrayList<Double>> entry : confidenceIntervalData.entrySet()) {
+
+
+
+            for (int j = 0; j < entry.getValue().size(); j++) {
+
+                sumT1 += Math.pow(entry.getValue().get(j), 1);
+                sumT2 += Math.pow(entry.getValue().get(j), 2);
+                sumT3 += Math.pow(entry.getValue().get(j), 3);
+                sumT4 += Math.pow(entry.getValue().get(j), 4);
+
+                sumY += entry.getKey();
+                sumYxT1 += entry.getKey() * entry.getValue().get(j);
+                sumYxT2 += entry.getKey() * Math.pow(entry.getValue().get(j), 2);
+            }
+        }
+
+ */
+
+
+
+        DoubleMatrix firstMatrix = new DoubleMatrix(new double[][]{{n,sumT1,sumT2},{sumT1,sumT2,sumT3},{sumT2,sumT3,sumT4}});
+        DoubleMatrix secondMatrix = new DoubleMatrix( new double[]{sumY, sumYxT1, sumYxT2});
+
+
+        DoubleMatrix solvedMatrix = Solve.solve(firstMatrix,secondMatrix);
+
+        //System.out.println(solvedMatrix);
+
+        //return ((solvedMatrix.get(0)) + (solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2)));
+        //return ((solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2)))*(-1);
+        return ((solvedMatrix.get(1) * index) + (solvedMatrix.get(2) * Math.pow(index, 2)));
+
+    }
+
     public static int getDataPointsXAxis() {
         return dataPointsXAxis;
     }
diff --git a/src/main/resources/com.application/GUI/graphStyles.css b/src/main/resources/com.application/GUI/graphStyles.css
index 7cff0ac..fbc50cd 100644
--- a/src/main/resources/com.application/GUI/graphStyles.css
+++ b/src/main/resources/com.application/GUI/graphStyles.css
@@ -5,7 +5,7 @@
 }
 
 .chart-earlier-data-line {
-    -fx-stroke-width: 5px;
+    -fx-stroke-width: 1px;
     -fx-effect: null;
 }
 
diff --git a/target/classes/com.application/GUI/graphStyles.css b/target/classes/com.application/GUI/graphStyles.css
index 7cff0ac..fbc50cd 100644
--- a/target/classes/com.application/GUI/graphStyles.css
+++ b/target/classes/com.application/GUI/graphStyles.css
@@ -5,7 +5,7 @@
 }
 
 .chart-earlier-data-line {
-    -fx-stroke-width: 5px;
+    -fx-stroke-width: 1px;
     -fx-effect: null;
 }
 
diff --git a/target/classes/com/application/GUI/LineChartFunctionality.class b/target/classes/com/application/GUI/LineChartFunctionality.class
index fc06715ba9dfd5d758264f91fd1228deb018f988..7fed56545a4d3c4f04d50dafc1845a293cbaba83 100644
GIT binary patch
delta 6511
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

delta 5318
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
JWUOMW1^|)QfSv#V

-- 
GitLab