algorithms-for-computing-li.../src/main/java/presenter/evaluation/EvaluateAlgorithms.java

350 lines
13 KiB
Java
Raw Normal View History

package presenter.evaluation;
2017-08-01 19:59:33 +00:00
import model.Interval;
import model.Line;
import model.LineModel;
import presenter.algorithms.IntersectionCounter;
import presenter.algorithms.LeastMedianOfSquaresEstimator;
import presenter.algorithms.RepeatedMedianEstimator;
import presenter.algorithms.TheilSenEstimator;
import presenter.generator.DatasetGenerator;
2017-08-01 19:59:33 +00:00
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Observable;
2017-08-01 19:59:33 +00:00
/**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
*
* @Author: Armin Wolf
* @Email: a_wolf28@uni-muenster.de
* @Date: 01.08.2017.
*/
public class EvaluateAlgorithms extends Observable {
private LineModel arrangement;
2017-09-05 18:39:52 +00:00
private Thread lmsThread;
private Thread rmThread;
private Thread tsThread;
2017-08-01 19:59:33 +00:00
2017-08-03 18:37:59 +00:00
private Double[] tsRes = new Double[2];
private Double[] rmRes = new Double[2];
private Double[] lmsRes = new Double[2];
2017-09-07 17:39:55 +00:00
private DatasetGenerator generator;
2017-08-01 19:59:33 +00:00
2017-09-07 17:39:55 +00:00
private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE"}};
2017-08-01 19:59:33 +00:00
2017-09-07 17:39:55 +00:00
//übergebene Parameter
private int type;
private int iterations;
private int alg;
2017-09-08 19:23:02 +00:00
/**
* Konstruktor zur evaluation
*
* @param type Typ der evaluation
* @param n Größe des Datensatzes
* @param alg 0 = lms,
* 1 = rm,
* 2 = ts,
* 3 = lms, rm,
* 4 = lms, ts,
* 5 = rm, ts,
* 6 = lms, rm, ts,
2017-09-08 19:23:02 +00:00
*/
public EvaluateAlgorithms(int type, int n, int alg, String datasettyp) {
2017-09-07 17:39:55 +00:00
this.arrangement = new LineModel();
generator = new DatasetGenerator();
switch (datasettyp) {
2017-09-08 19:23:02 +00:00
case "Punktwolke":
arrangement.setLines(generator.generateDataCloud(n));
break;
case "Gerade":
arrangement.setLines(generator.generateDataLines(n));
break;
case "Kreis und Gerade":
arrangement.setLines(generator.generateCircle(n));
break;
}
2017-09-07 17:39:55 +00:00
this.type = type;
2017-09-08 19:23:02 +00:00
this.iterations = n;
2017-09-07 17:39:55 +00:00
this.alg = alg;
2017-09-07 17:39:55 +00:00
IntersectionCounter counter = new IntersectionCounter();
counter.run(arrangement.getLines(), new Interval(-99999, 99999));
counter.calculateIntersectionAbscissas(arrangement);
}
2017-09-07 17:39:55 +00:00
public void run() throws InterruptedException {
2017-09-08 19:23:02 +00:00
setChanged();
String[] msg = {"eval-dataset-generated"};
notifyObservers(msg);
ArrayList<String> result;
ArrayList<ArrayList<String>> multipleResults = new ArrayList<>();
2017-09-05 18:39:52 +00:00
switch (type) {
2017-09-07 17:39:55 +00:00
case 0:
result = new ArrayList<>();
//der alg der gewählt wurde
if (alg == 0) {
startLMS();
result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
sendPlotLineResults(lmsRes, 0);
} else if (alg == 1) {
startRM();
result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
sendPlotLineResults(rmRes, 1);
} else {
startTS();
result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
sendPlotLineResults(tsRes, 2);
}
2017-09-08 19:23:02 +00:00
sendTableApproximationTypes();
sendTableApproximationData(result, alg);
2017-09-07 17:39:55 +00:00
break;
case 1:
2017-09-08 19:23:02 +00:00
result = new ArrayList<>();
ArrayList<Double[]> lineRes;
switch (alg) {
2017-09-08 19:23:02 +00:00
case 3:
startLMS();
startRM();
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
multipleResults.add(result);
result = fillPseudoResults();
multipleResults.add(result);
lineRes = new ArrayList<>();
lineRes.add(lmsRes);
lineRes.add(rmRes);
sendPloteLineResults(lineRes, new Integer[]{0, 1});
2017-09-08 19:23:02 +00:00
break;
case 4:
startLMS();
startTS();
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
multipleResults.add(result);
result = fillPseudoResults();
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
multipleResults.add(result);
lineRes = new ArrayList<>();
lineRes.add(lmsRes);
lineRes.add(tsRes);
sendPloteLineResults(lineRes, new Integer[]{0, 2});
2017-09-08 19:23:02 +00:00
break;
case 5:
startRM();
startTS();
result = fillPseudoResults();
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
multipleResults.add(result);
lineRes = new ArrayList<>();
lineRes.add(rmRes);
lineRes.add(tsRes);
sendPloteLineResults(lineRes, new Integer[]{1, 2});
2017-09-08 19:23:02 +00:00
break;
case 6:
startLMS();
startRM();
startTS();
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
multipleResults.add(result);
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
multipleResults.add(result);
lineRes = new ArrayList<>();
lineRes.add(lmsRes);
lineRes.add(rmRes);
lineRes.add(tsRes);
sendPloteLineResults(lineRes, new Integer[]{0, 1, 2});
2017-09-08 19:23:02 +00:00
break;
}
sendTableApproximationData(multipleResults);
2017-09-07 17:39:55 +00:00
break;
}
2017-09-08 19:23:02 +00:00
2017-08-03 18:37:59 +00:00
}
public void sendTableApproximationData(ArrayList<String> result, int col) {
2017-09-07 17:39:55 +00:00
ArrayList<String> tableInput = new ArrayList<>();
2017-09-08 19:23:02 +00:00
tableInput.add("eval-d");
tableInput.add("" + col);
for (int i = 0; i < names[type].length; i++) {
2017-09-07 17:39:55 +00:00
tableInput.add(result.get(i));
2017-09-08 19:23:02 +00:00
}
tableInput.add("");
setChanged();
notifyObservers(tableInput.stream().toArray(String[]::new));
tableInput.clear();
}
public void sendTableApproximationData(ArrayList<ArrayList<String>> result) {
2017-09-08 19:23:02 +00:00
ArrayList<String> tableInput = new ArrayList<>();
//iteration über die ApproximationsGüten -- Zeilen
for (int j = 0; j <= result.get(0).size(); j++) {
2017-09-08 19:23:02 +00:00
tableInput.add("eval-ds");
if (j != result.get(0).size()) {
2017-09-08 19:23:02 +00:00
tableInput.add(names[type][j]);
//iteration über die alg. -- Spalten
for (int i = 0; i < 3; i++) {
tableInput.add(result.get(i).get(j));
}
} else {
tableInput.add("");
tableInput.add("");
tableInput.add("");
tableInput.add("");
}
2017-08-03 18:37:59 +00:00
setChanged();
2017-09-08 19:23:02 +00:00
notifyObservers(tableInput.stream().toArray(String[]::new));
2017-09-07 17:39:55 +00:00
tableInput.clear();
}
2017-08-03 18:37:59 +00:00
2017-09-08 19:23:02 +00:00
}
public void sendTableApproximationTypes() {
2017-09-08 19:23:02 +00:00
ArrayList<String> tableInput = new ArrayList<>();
tableInput.add("eval-t");
tableInput.add("" + 0);
for (int i = 0; i < names[type].length; i++) {
2017-09-08 19:23:02 +00:00
tableInput.add(names[type][i]);
}
tableInput.add("");
2017-08-03 18:37:59 +00:00
setChanged();
2017-09-08 19:23:02 +00:00
notifyObservers(tableInput.stream().toArray(String[]::new));
tableInput.clear();
}
2017-08-03 18:37:59 +00:00
public void sendPlotLineResults(Double[] res, int alg) {
2017-09-05 18:39:52 +00:00
//visualisiere m,b
ArrayList<String> lines = new ArrayList<>();
lines.add("lines-res");
lines.add("" + alg);
2017-09-05 18:39:52 +00:00
//lms res
lines.add(res[0] + "");
lines.add(res[1] + "");
2017-09-08 19:23:02 +00:00
setChanged();
notifyObservers(lines.stream().toArray(String[]::new));
}
2017-08-03 18:37:59 +00:00
public void sendPloteLineResults(ArrayList<Double[]> res, Integer[] algs) {
2017-09-08 19:23:02 +00:00
ArrayList<String> lines = new ArrayList<>();
lines.add("lines-res-mult");
for (int i = 0; i < algs.length; i++) {
lines.add("" + algs[i]);
2017-09-08 19:23:02 +00:00
//lms res
Double[] tmp = res.get(i);
lines.add(tmp[0] + "");
lines.add(tmp[1] + "");
2017-09-08 19:23:02 +00:00
}
2017-09-05 18:39:52 +00:00
setChanged();
notifyObservers(lines.stream().toArray(String[]::new));
2017-08-01 19:59:33 +00:00
}
2017-09-07 17:39:55 +00:00
public void startLMS() throws InterruptedException {
lmsThread = new Thread(() -> {
LeastMedianOfSquaresEstimator lmsAlg = new LeastMedianOfSquaresEstimator(arrangement.getLines(), arrangement.getNodes());
lmsAlg.run();
lmsAlg.getResult();
lmsRes[0] = lmsAlg.getSlope();
lmsRes[1] = lmsAlg.getyInterception();
});
lmsThread.start();
lmsThread.join();
}
public void startRM() throws InterruptedException {
rmThread = new Thread(() -> {
RepeatedMedianEstimator rmAlg = new RepeatedMedianEstimator(arrangement.getLines());
rmAlg.run();
rmAlg.getResult();
rmRes[0] = rmAlg.getSlope();
rmRes[1] = rmAlg.getyInterception();
});
rmThread.start();
rmThread.join();
}
public void startTS() throws InterruptedException {
tsThread = new Thread(() -> {
TheilSenEstimator tsAlg = new TheilSenEstimator(arrangement.getLines(), arrangement.getNodes());
tsAlg.run();
tsAlg.getResult();
tsRes[0] = tsAlg.getSlope();
tsRes[1] = tsAlg.getyInterception();
});
tsThread.start();
tsThread.join();
}
public ArrayList<String> getScaleDependentMeasure(LinkedList<Line> lines, Double m, Double b) {
ScaleDependentMeasure scaleDependentMeasure = new ScaleDependentMeasure(lines, m, b);
ArrayList<String> ret = new ArrayList<>();
2017-09-07 17:39:55 +00:00
ret.add(scaleDependentMeasure.mse().toString());
ret.add(scaleDependentMeasure.rmse().toString());
ret.add(scaleDependentMeasure.mae().toString());
ret.add(scaleDependentMeasure.mdae().toString());
2017-08-01 19:59:33 +00:00
2017-09-07 17:39:55 +00:00
return ret;
2017-08-01 19:59:33 +00:00
}
2017-09-07 17:39:55 +00:00
public ArrayList<String> getPercentigeErrorBasedMeasure(LinkedList<Line> lines, Double m, Double b) {
PercentageErrorBasedMeasure percentageErrorBasedMeasure = new PercentageErrorBasedMeasure(lines, m, b);
ArrayList<String> ret = new ArrayList<>();
ret.add(percentageErrorBasedMeasure.mape().toString());
ret.add(percentageErrorBasedMeasure.mdape().toString());
ret.add(percentageErrorBasedMeasure.rmspe().toString());
ret.add(percentageErrorBasedMeasure.rmdspe().toString());
return ret;
2017-08-03 18:37:59 +00:00
}
public ArrayList<String> getScaledErrorBasedMeasure(LinkedList<Line> lines, Double m, Double b) {
2017-09-07 17:39:55 +00:00
ScaledErrorBasedMeasure scaledErrorBasedMeasure = new ScaledErrorBasedMeasure(lines, m, b);
ArrayList<String> ret = new ArrayList<>();
ret.add(scaledErrorBasedMeasure.mse().toString());
ret.add(scaledErrorBasedMeasure.rmse().toString());
ret.add(scaledErrorBasedMeasure.mae().toString());
ret.add(scaledErrorBasedMeasure.mdae().toString());
return ret;
2017-08-01 19:59:33 +00:00
}
private ArrayList<String> fillPseudoResults() {
2017-09-08 19:23:02 +00:00
ArrayList<String> result = new ArrayList<>();
result.add(" ");
result.add(" ");
result.add(" ");
result.add(" ");
return result;
2017-09-08 19:23:02 +00:00
}
2017-09-05 18:39:52 +00:00
public LinkedList<Line> getData() {
2017-09-05 18:39:52 +00:00
return arrangement.getLines();
}
2017-08-01 19:59:33 +00:00
}