some improvements: usage of executor instead of threads and primitve data types
This commit is contained in:
parent
51ada744da
commit
0171629a9a
|
@ -8,6 +8,8 @@ import view.MainFrame;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
|
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
|
||||||
|
@ -21,6 +23,7 @@ public abstract class AbstractPresenter implements Observer {
|
||||||
private LineModel model;
|
private LineModel model;
|
||||||
private MainFrame view;
|
private MainFrame view;
|
||||||
private EvaluateAlgorithms eval;
|
private EvaluateAlgorithms eval;
|
||||||
|
private final ExecutorService executor;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,6 +34,7 @@ public abstract class AbstractPresenter implements Observer {
|
||||||
public AbstractPresenter(LineModel model, MainFrame view) {
|
public AbstractPresenter(LineModel model, MainFrame view) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
this.view = view;
|
this.view = view;
|
||||||
|
executor = Executors.newCachedThreadPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -204,4 +208,8 @@ public abstract class AbstractPresenter implements Observer {
|
||||||
public void setEval(EvaluateAlgorithms eval) {
|
public void setEval(EvaluateAlgorithms eval) {
|
||||||
this.eval = eval;
|
this.eval = eval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ExecutorService getExecutor() {
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,8 @@ import view.MainFrame;
|
||||||
import javax.swing.table.DefaultTableModel;
|
import javax.swing.table.DefaultTableModel;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,17 +29,6 @@ import java.util.LinkedList;
|
||||||
*/
|
*/
|
||||||
public class Presenter extends AbstractPresenter {
|
public class Presenter extends AbstractPresenter {
|
||||||
|
|
||||||
/* Threads */
|
|
||||||
private Thread tsThread;
|
|
||||||
private Thread rmThread;
|
|
||||||
private Thread lmsThread;
|
|
||||||
private Thread importThread;
|
|
||||||
private Thread importPictureThread;
|
|
||||||
private Thread exportThread;
|
|
||||||
private Thread exportResultThread;
|
|
||||||
private Thread generatorThread;
|
|
||||||
private Thread evalThread;
|
|
||||||
|
|
||||||
|
|
||||||
public Presenter(LineModel model, MainFrame view) {
|
public Presenter(LineModel model, MainFrame view) {
|
||||||
super(model, view);
|
super(model, view);
|
||||||
|
@ -54,81 +45,56 @@ public class Presenter extends AbstractPresenter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Die Berechnung durch des Algorithmus zum LMS-Schätzer wird gestartet.
|
* Die Berechnung durch des Algorithmus zum LMS-Schätzer wird gestartet.
|
||||||
|
*
|
||||||
* @param input Parameter für den Algorithmus
|
* @param input Parameter für den Algorithmus
|
||||||
*/
|
*/
|
||||||
public void calculateLMS(String[] input) {
|
public void calculateLMS(String[] input) {
|
||||||
if (input[0] != null && input[1] != null) {
|
if (input[0] != null && input[1] != null) {
|
||||||
if (lmsThread == null || !lmsThread.isAlive()) {
|
//Parameter für den Algortihmus
|
||||||
lmsThread = new Thread(() -> {
|
Double constant = Double.parseDouble(input[0]);
|
||||||
//Parameter für den Algortihmus
|
Double error = Double.parseDouble(input[1]);
|
||||||
Double constant = Double.parseDouble(input[0]);
|
LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(getModel().getLines(), getModel().getNodes(), this);
|
||||||
Double error = Double.parseDouble(input[1]);
|
//setzen der Parameter
|
||||||
LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(getModel().getLines(), getModel().getNodes(), this);
|
lms.setConstant(constant);
|
||||||
//setzen der Parameter
|
lms.setQuantileError(error);
|
||||||
lms.setConstant(constant);
|
//Presenter soll die Klasse überwachen
|
||||||
lms.setQuantileError(error);
|
lms.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
getExecutor().execute(lms);
|
||||||
lms.addObserver(this);
|
|
||||||
lms.run();
|
|
||||||
lms.pepareResult();
|
|
||||||
});
|
|
||||||
lmsThread.start();
|
|
||||||
try {
|
|
||||||
lmsThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Die Berechnung durch des Algorithmus zum RM-Schätzer wird gestartet.
|
* Die Berechnung durch des Algorithmus zum RM-Schätzer wird gestartet.
|
||||||
|
*
|
||||||
* @param input Parameter für den Algorithmus
|
* @param input Parameter für den Algorithmus
|
||||||
*/
|
*/
|
||||||
public void calculateRM(String input) {
|
public void calculateRM(String input) {
|
||||||
if (input != null) {
|
if (input != null) {
|
||||||
if (rmThread == null || !rmThread.isAlive()) {
|
RepeatedMedianEstimator rm = new RepeatedMedianEstimator(getModel().getLines(), this);
|
||||||
rmThread = new Thread(() -> {
|
Double parameter = Double.parseDouble(input);
|
||||||
RepeatedMedianEstimator rm = new RepeatedMedianEstimator(getModel().getLines(), this);
|
rm.setBeta(parameter);
|
||||||
Double parameter = Double.parseDouble(input);
|
//Presenter soll die Klasse überwachen
|
||||||
rm.setBeta(parameter);
|
rm.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
|
||||||
rm.addObserver(this);
|
getExecutor().execute(rm);
|
||||||
rm.run();
|
|
||||||
rm.pepareResult();
|
|
||||||
});
|
|
||||||
rmThread.start();
|
|
||||||
try {
|
|
||||||
rmThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Die Berechnung durch des Algorithmus zum TS-Schätzer wird gestartet.
|
* Die Berechnung durch des Algorithmus zum TS-Schätzer wird gestartet.
|
||||||
|
*
|
||||||
* @param input Parameter für den Algorithmus
|
* @param input Parameter für den Algorithmus
|
||||||
*/
|
*/
|
||||||
public void calculateTS(String input) {
|
public void calculateTS(String input) {
|
||||||
if (input != null) {
|
if (input != null) {
|
||||||
if (tsThread == null || !tsThread.isAlive()) {
|
TheilSenEstimator ts = new TheilSenEstimator(getModel().getLines(), getModel().getNodes(), this);
|
||||||
tsThread = new Thread(() -> {
|
//Presenter soll die Klasse überwachen
|
||||||
TheilSenEstimator ts = new TheilSenEstimator(getModel().getLines(), getModel().getNodes(), this);
|
ts.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
|
||||||
ts.addObserver(this);
|
getExecutor().execute(ts);
|
||||||
ts.run();
|
|
||||||
ts.pepareResult();
|
|
||||||
});
|
|
||||||
tsThread.start();
|
|
||||||
try {
|
|
||||||
tsThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,201 +104,167 @@ public class Presenter extends AbstractPresenter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet den Import des Datensatzes.
|
* Startet den Import des Datensatzes.
|
||||||
|
*
|
||||||
* @param file importierender Datensatz
|
* @param file importierender Datensatz
|
||||||
*/
|
*/
|
||||||
public void startImport(File file) {
|
public void startImport(File file) {
|
||||||
if (importThread == null || !importThread.isAlive()) {
|
|
||||||
importThread = new Thread(() -> {
|
DataImporter importer = new DataImporter(file);
|
||||||
DataImporter importer = new DataImporter(file);
|
//Presenter soll die Klasse überwachen
|
||||||
//Presenter soll die Klasse überwachen
|
importer.addObserver(this);
|
||||||
importer.addObserver(this);
|
|
||||||
|
getExecutor().execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
LinkedList<Line> importedLines = importer.run();
|
LinkedList<Line> importedLines = importer.run();
|
||||||
if (importedLines != null) {
|
if (importedLines != null) {
|
||||||
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
||||||
getModel().setLines(importedLines);
|
getModel().setLines(importedLines);
|
||||||
computeIntersections();
|
computeIntersections();
|
||||||
}
|
}
|
||||||
});
|
|
||||||
importThread.start();
|
|
||||||
try {
|
|
||||||
importThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet den Import eines Bildes.
|
* Startet den Import eines Bildes.
|
||||||
|
*
|
||||||
* @param file importierendes Bild
|
* @param file importierendes Bild
|
||||||
*/
|
*/
|
||||||
public void startPictureDataImport(File file) {
|
public void startPictureDataImport(File file) {
|
||||||
if (importPictureThread == null || !importPictureThread.isAlive()) {
|
PictureProcessor pictureProcessor = new PictureProcessor(this, file);
|
||||||
importPictureThread = new Thread(() -> {
|
//Presenter soll die Klasse überwachen
|
||||||
PictureProcessor pictureProcessor = new PictureProcessor(this, file);
|
pictureProcessor.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
|
||||||
pictureProcessor.addObserver(this);
|
getExecutor().execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
pictureProcessor.run();
|
pictureProcessor.run();
|
||||||
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
||||||
computeIntersections();
|
computeIntersections();
|
||||||
});
|
|
||||||
importPictureThread.start();
|
|
||||||
try {
|
|
||||||
importPictureThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet den Export des akteullen Datensatzes (nur der Geraden)
|
* Startet den Export des akteullen Datensatzes (nur der Geraden)
|
||||||
|
*
|
||||||
* @param file Datei in der die Informationen gespeichert werden sollen
|
* @param file Datei in der die Informationen gespeichert werden sollen
|
||||||
*/
|
*/
|
||||||
public void startExport(File file) {
|
public void startExport(File file) {
|
||||||
if (exportThread == null || !exportThread.isAlive()) {
|
DataExporter exporter = new DataExporter(getModel().getLines(), file);
|
||||||
exportThread = new Thread(() -> {
|
//Presenter soll die Klasse überwachen
|
||||||
DataExporter exporter = new DataExporter(getModel().getLines(), file);
|
exporter.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
|
||||||
exporter.addObserver(this);
|
getExecutor().execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
exporter.export();
|
exporter.export();
|
||||||
});
|
|
||||||
exportThread.start();
|
|
||||||
try {
|
|
||||||
exportThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet den Export des akteullen Datensatzes im Rahmen der Evaluation (nur der Geraden)
|
* Startet den Export des akteullen Datensatzes im Rahmen der Evaluation (nur der Geraden)
|
||||||
|
*
|
||||||
* @param file Datei in der die Informationen gespeichert werden sollen
|
* @param file Datei in der die Informationen gespeichert werden sollen
|
||||||
*/
|
*/
|
||||||
public void startDatasetExportEvaluation(File file) {
|
public void startDatasetExportEvaluation(File file) {
|
||||||
if (exportThread == null || !exportThread.isAlive()) {
|
DataExporter exporter = new DataExporter(getEval().getData(), file);
|
||||||
exportThread = new Thread(() -> {
|
//Presenter soll die Klasse überwachen
|
||||||
DataExporter exporter = new DataExporter(getEval().getData(), file);
|
exporter.addObserver(this);
|
||||||
//Presenter soll die Klasse überwachen
|
|
||||||
exporter.addObserver(this);
|
getExecutor().execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
exporter.export();
|
exporter.export();
|
||||||
});
|
|
||||||
exportThread.start();
|
|
||||||
try {
|
|
||||||
exportThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet den Export der Ergebnisse der Evaluation in Form einer LaTeX Datei
|
* Startet den Export der Ergebnisse der Evaluation in Form einer LaTeX Datei
|
||||||
|
*
|
||||||
* @param model TableModel das die Berechnenten Ergebnisse enthält
|
* @param model TableModel das die Berechnenten Ergebnisse enthält
|
||||||
* @param file Datei in die exportiert werden soll
|
* @param file Datei in die exportiert werden soll
|
||||||
*/
|
*/
|
||||||
public void startResultExport(DefaultTableModel model, File file) {
|
public void startResultExport(DefaultTableModel model, File file) {
|
||||||
if (exportResultThread == null || !exportResultThread.isAlive()) {
|
getExecutor().execute(() -> {
|
||||||
exportResultThread = new Thread(() -> {
|
EvalResultLatexExport exporter = new EvalResultLatexExport(model, file);
|
||||||
EvalResultLatexExport exporter = new EvalResultLatexExport(model, file);
|
exporter.writeFile();
|
||||||
exporter.writeFile();
|
});
|
||||||
});
|
|
||||||
exportResultThread.start();
|
|
||||||
try {
|
|
||||||
exportResultThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet das generieren der Datensätze der Größe <code>n</code>
|
* Startet das generieren der Datensätze der Größe <code>n</code>
|
||||||
* @param n Größe des Datensatzes
|
*
|
||||||
|
* @param n Größe des Datensatzes
|
||||||
* @param type Art der Datensatzes
|
* @param type Art der Datensatzes
|
||||||
*/
|
*/
|
||||||
public void generateDataset(int n, int type) {
|
public void generateDataset(int n, int type) {
|
||||||
if (generatorThread == null || !generatorThread.isAlive()) {
|
DatasetGenerator generator = new DatasetGenerator();
|
||||||
generatorThread = new Thread(() -> {
|
generator.addObserver(this);
|
||||||
DatasetGenerator generator = new DatasetGenerator();
|
getExecutor().execute(() -> {
|
||||||
generator.addObserver(this);
|
switch (type) {
|
||||||
switch (type){
|
case 0:
|
||||||
case 0:
|
getModel().setLines(generator.generateDataCloud(n));
|
||||||
getModel().setLines(generator.generateDataCloud(n));
|
break;
|
||||||
break;
|
case 1:
|
||||||
case 1:
|
getModel().setLines(generator.generateDataLines(n));
|
||||||
getModel().setLines(generator.generateDataLines(n));
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 2:
|
getModel().setLines(generator.generateCircle(n));
|
||||||
getModel().setLines(generator.generateCircle(n));
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
getModel().setLines(generator.generateDataCloud(n));
|
||||||
getModel().setLines(generator.generateDataCloud(n));
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
computeIntersections();
|
|
||||||
getView().enableFunctionality();
|
|
||||||
});
|
|
||||||
generatorThread.start();
|
|
||||||
try {
|
|
||||||
generatorThread.join();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
computeIntersections();
|
||||||
|
getView().enableFunctionality();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet die Evaluation zu einen gegegbenen Typ mit den Informationen zu den Datensatz.
|
* Startet die Evaluation zu einen gegegbenen Typ mit den Informationen zu den Datensatz.
|
||||||
* Beispielsweise kann ein Alg. auf mit verschiedenen Datensätzen untersucht werden, oder mehrere Algorithmen
|
* Beispielsweise kann ein Alg. auf mit verschiedenen Datensätzen untersucht werden, oder mehrere Algorithmen
|
||||||
* auf einem gegebenen Datensatz.
|
* auf einem gegebenen Datensatz.
|
||||||
* @param typ Typ der Evaluation
|
*
|
||||||
* @param n Größe des Datensatzes
|
* @param typ Typ der Evaluation
|
||||||
* @param alg code für die auszuführenden Algorithmen (siehe <code>EvaluationPanel.checkSelection()</code> Method)
|
* @param n Größe des Datensatzes
|
||||||
|
* @param alg code für die auszuführenden Algorithmen (siehe <code>EvaluationPanel.checkSelection()</code> Method)
|
||||||
* @param datasettyp Typ des Datensatzes (Geradem Punktwolke, Kreis und Gerade)
|
* @param datasettyp Typ des Datensatzes (Geradem Punktwolke, Kreis und Gerade)
|
||||||
*/
|
*/
|
||||||
public void startEvaluation(int typ, int n, int alg, String datasettyp) {
|
public void startEvaluation(int typ, int n, int alg, String datasettyp) {
|
||||||
if (evalThread == null || !evalThread.isAlive()) {
|
setEval(new EvaluateAlgorithms(typ, n, alg, datasettyp));
|
||||||
evalThread = new Thread(() -> {
|
getEval().addObserver(this);
|
||||||
try {
|
|
||||||
setEval(new EvaluateAlgorithms(typ, n, alg, datasettyp));
|
getExecutor().submit(() -> {
|
||||||
getEval().addObserver(this);
|
getEval().run();
|
||||||
getEval().run();
|
});
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
evalThread.start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Startet die Evaluation zu einen gegegbenen Datensatz, der importiert wird.
|
* Startet die Evaluation zu einen gegegbenen Datensatz, der importiert wird.
|
||||||
* Beispielsweise kann ein Alg. auf mit verschiedenen Datensätzen untersucht werden, oder mehrere Algorithmen
|
* Beispielsweise kann ein Alg. auf mit verschiedenen Datensätzen untersucht werden, oder mehrere Algorithmen
|
||||||
* auf einem gegebenen Datensatz.
|
* auf einem gegebenen Datensatz.
|
||||||
* @param typ Typ der Evaluation
|
*
|
||||||
* @param alg code für die auszuführenden Algorithmen (siehe <code>EvaluationPanel.checkSelection()</code> Method)
|
* @param typ Typ der Evaluation
|
||||||
|
* @param alg code für die auszuführenden Algorithmen (siehe <code>EvaluationPanel.checkSelection()</code> Method)
|
||||||
* @param file Typ des Datensatzes (Geradem Punktwolke, Kreis und Gerade)
|
* @param file Typ des Datensatzes (Geradem Punktwolke, Kreis und Gerade)
|
||||||
*/
|
*/
|
||||||
public void startEvaluation(int typ, int alg, File file) {
|
public void startEvaluation(int typ, int alg, File file) {
|
||||||
if (evalThread == null || !evalThread.isAlive()) {
|
|
||||||
evalThread = new Thread(() -> {
|
EvaluateAlgorithms evaluateAlgorithms = new EvaluateAlgorithms(typ, alg, file);
|
||||||
try {
|
if (evaluateAlgorithms.getData().size() > 0) {
|
||||||
EvaluateAlgorithms evaluateAlgorithms = new EvaluateAlgorithms(typ, alg, file);
|
setEval(evaluateAlgorithms);
|
||||||
if (evaluateAlgorithms.getData().size() > 0) {
|
getEval().addObserver(this);
|
||||||
setEval(evaluateAlgorithms);
|
|
||||||
getEval().addObserver(this);
|
|
||||||
getEval().run();
|
|
||||||
}
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
evalThread.start();
|
|
||||||
}
|
}
|
||||||
|
getExecutor().submit(() -> {
|
||||||
|
getEval().run();
|
||||||
|
}).isDone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,11 @@ package presenter.algorithms;
|
||||||
* @Email: a_wolf28@uni-muenster.de
|
* @Email: a_wolf28@uni-muenster.de
|
||||||
* @Date: 28.05.2017.
|
* @Date: 28.05.2017.
|
||||||
*/
|
*/
|
||||||
public interface Algorithm {
|
public interface Algorithm extends Runnable{
|
||||||
/**
|
/**
|
||||||
* Startet die Berechnung des jeweiligen Algorithmus.
|
* Startet die Berechnung des jeweiligen Algorithmus.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,11 +33,11 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit
|
||||||
private Interval subSlabU2;
|
private Interval subSlabU2;
|
||||||
private Line sigmaMin;
|
private Line sigmaMin;
|
||||||
private double heightsigmaMin;
|
private double heightsigmaMin;
|
||||||
private Double intersectionsPoint;
|
private double intersectionsPoint;
|
||||||
private Double constant = 0.5;
|
private double constant = 0.5;
|
||||||
|
|
||||||
private Double slope;
|
private double slope;
|
||||||
private Double yInterception;
|
private double yInterception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -115,16 +115,16 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit
|
||||||
//(c.) otherwise....
|
//(c.) otherwise....
|
||||||
// get random intersections point...
|
// get random intersections point...
|
||||||
Collections.shuffle(tmpIntersections, new Random());
|
Collections.shuffle(tmpIntersections, new Random());
|
||||||
|
boolean found = false;
|
||||||
for (int i = 0; i < tmpIntersections.size(); i++) {
|
for (int i = 0; i < tmpIntersections.size(); i++) {
|
||||||
if (tmpIntersections.get(i).getX() > interval.getLower()
|
if (tmpIntersections.get(i).getX() > interval.getLower()
|
||||||
&& tmpIntersections.get(i).getX() < interval.getUpper()) {
|
&& tmpIntersections.get(i).getX() < interval.getUpper()) {
|
||||||
intersectionsPoint = tmpIntersections.get(i).getX();
|
intersectionsPoint = tmpIntersections.get(i).getX();
|
||||||
|
found = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
|
||||||
intersectionsPoint = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (intersectionsPoint != null) {
|
if (found) {
|
||||||
splitActiveSlab(intersectionsPoint, interval);
|
splitActiveSlab(intersectionsPoint, interval);
|
||||||
//(d.) this may update sigma min
|
//(d.) this may update sigma min
|
||||||
upperBound(intersectionsPoint);
|
upperBound(intersectionsPoint);
|
||||||
|
@ -149,6 +149,8 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit
|
||||||
}
|
}
|
||||||
end = System.currentTimeMillis();
|
end = System.currentTimeMillis();
|
||||||
System.out.println("Zeit: "+ ((end-start)/1000));
|
System.out.println("Zeit: "+ ((end-start)/1000));
|
||||||
|
|
||||||
|
pepareResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,18 +40,18 @@ public class RepeatedMedianEstimator extends Observable implements Algorithm {
|
||||||
private ArrayList<Line> linesInCenterSlab;
|
private ArrayList<Line> linesInCenterSlab;
|
||||||
private ArrayList<Line> linesInRightSlab;
|
private ArrayList<Line> linesInRightSlab;
|
||||||
|
|
||||||
private Double r;
|
private double r;
|
||||||
private Integer n;
|
private int n;
|
||||||
private Double k;
|
private double k;
|
||||||
private Double kLow;
|
private double kLow;
|
||||||
private Double kHigh;
|
private double kHigh;
|
||||||
private Double beta;
|
private double beta;
|
||||||
|
|
||||||
private Double thetaLow;
|
private double thetaLow;
|
||||||
private Double thetaHigh;
|
private double thetaHigh;
|
||||||
|
|
||||||
private Double slope;
|
private double slope;
|
||||||
private Double yInterception;
|
private double yInterception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -137,6 +137,8 @@ public class RepeatedMedianEstimator extends Observable implements Algorithm {
|
||||||
}
|
}
|
||||||
end = System.currentTimeMillis();
|
end = System.currentTimeMillis();
|
||||||
System.out.println("Zeit: "+ ((end-start)/1000));
|
System.out.println("Zeit: "+ ((end-start)/1000));
|
||||||
|
|
||||||
|
pepareResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,9 @@ import java.util.*;
|
||||||
*/
|
*/
|
||||||
public class TheilSenEstimator extends Observable implements Algorithm {
|
public class TheilSenEstimator extends Observable implements Algorithm {
|
||||||
|
|
||||||
private final Double POSITIV_INF = 99999.0;
|
private final double POSITIV_INF = 99999.0;
|
||||||
private final Double NEGATIV_INF = -99999.0;
|
private final double NEGATIV_INF = -99999.0;
|
||||||
private final Double EPSILON = 0.00001;
|
private final double EPSILON = 0.00001;
|
||||||
private Presenter presenter;
|
private Presenter presenter;
|
||||||
private ArrayList<Line> setOfLines;
|
private ArrayList<Line> setOfLines;
|
||||||
private ArrayList<Point> setOfIntersections;
|
private ArrayList<Point> setOfIntersections;
|
||||||
|
@ -30,19 +30,19 @@ public class TheilSenEstimator extends Observable implements Algorithm {
|
||||||
private ArrayList<Double> yCoordinates;
|
private ArrayList<Double> yCoordinates;
|
||||||
private ArrayList<Double> xCoordinates;
|
private ArrayList<Double> xCoordinates;
|
||||||
//Hilfsvariablen (siehe original Paper)
|
//Hilfsvariablen (siehe original Paper)
|
||||||
private Double j;
|
private double j;
|
||||||
private Integer jA;
|
private int jA;
|
||||||
private Integer jB;
|
private int jB;
|
||||||
private Double r;
|
private double r;
|
||||||
private Integer n;
|
private int n;
|
||||||
private Double N;
|
private double N;
|
||||||
private Integer k;
|
private int k;
|
||||||
//Intervall und die temporaeren Grenzen
|
//Intervall und die temporaeren Grenzen
|
||||||
private Interval interval;
|
private Interval interval;
|
||||||
private Double aVariant;
|
private double aVariant;
|
||||||
private Double bVariant;
|
private double bVariant;
|
||||||
private Double slope;
|
private double slope;
|
||||||
private Double yInterception;
|
private double yInterception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -116,6 +116,8 @@ public class TheilSenEstimator extends Observable implements Algorithm {
|
||||||
N = (double) getOpenIntervalSize(interval.getLower(), interval.getUpper(), intervalIntersections);
|
N = (double) getOpenIntervalSize(interval.getLower(), interval.getUpper(), intervalIntersections);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pepareResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ import java.util.LinkedList;
|
||||||
public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
|
public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
private ArrayList<Point> set = new ArrayList<>();
|
private ArrayList<Point> set = new ArrayList<>();
|
||||||
|
|
||||||
private Integer n;
|
private int n;
|
||||||
private Double ds, b, m;
|
private double ds, b, m;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -40,9 +40,9 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
b = 0d;
|
b = 0d;
|
||||||
m = 0d;
|
m = 0d;
|
||||||
ArrayList<Point> triple = new ArrayList<>();
|
ArrayList<Point> triple = new ArrayList<>();
|
||||||
Double beta;
|
double beta;
|
||||||
Double alpha;
|
double alpha;
|
||||||
Double dijk;
|
double dijk;
|
||||||
System.out.println("=== S T A R T - naiv L M S ===");
|
System.out.println("=== S T A R T - naiv L M S ===");
|
||||||
long start;
|
long start;
|
||||||
long end;
|
long end;
|
||||||
|
@ -76,7 +76,7 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
* @param b Steigung
|
* @param b Steigung
|
||||||
* @return medianer Fehler
|
* @return medianer Fehler
|
||||||
*/
|
*/
|
||||||
private Double f(Double a, Double b) {
|
private Double f(double a, double b) {
|
||||||
ArrayList<Double> res = new ArrayList<>();
|
ArrayList<Double> res = new ArrayList<>();
|
||||||
for (Point p : set) {
|
for (Point p : set) {
|
||||||
res.add(Math.abs(p.getY() - (a + b * p.getX())));
|
res.add(Math.abs(p.getY() - (a + b * p.getX())));
|
||||||
|
|
|
@ -22,8 +22,8 @@ public class NaivRepeatedMedianEstimator implements Algorithm {
|
||||||
private HashMap<String, ArrayList<Double>> slopesPerLine;
|
private HashMap<String, ArrayList<Double>> slopesPerLine;
|
||||||
private HashMap<String, ArrayList<Double>> interceptPerLine;
|
private HashMap<String, ArrayList<Double>> interceptPerLine;
|
||||||
private ArrayList<Double> xMedians, yMedians;
|
private ArrayList<Double> xMedians, yMedians;
|
||||||
private Double medianX;
|
private double medianX;
|
||||||
private Double medianY;
|
private double medianY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -69,7 +69,7 @@ public class NaivRepeatedMedianEstimator implements Algorithm {
|
||||||
ArrayList<Double> list = slopesPerLine.get(l);
|
ArrayList<Double> list = slopesPerLine.get(l);
|
||||||
int size = list.size() / 2;
|
int size = list.size() / 2;
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
Double medianX = FastElementSelector.randomizedSelect(list, size);
|
double medianX = FastElementSelector.randomizedSelect(list, size);
|
||||||
xMedians.add(medianX);
|
xMedians.add(medianX);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ public class NaivRepeatedMedianEstimator implements Algorithm {
|
||||||
ArrayList<Double> list = interceptPerLine.get(l);
|
ArrayList<Double> list = interceptPerLine.get(l);
|
||||||
int size = list.size() / 2;
|
int size = list.size() / 2;
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
Double medianY = FastElementSelector.randomizedSelect(list, size);
|
double medianY = FastElementSelector.randomizedSelect(list, size);
|
||||||
yMedians.add(medianY);
|
yMedians.add(medianY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,10 +102,10 @@ public class NaivRepeatedMedianEstimator implements Algorithm {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private Point calculateLine(Line startPoint, Line endPoint) {
|
private Point calculateLine(Line startPoint, Line endPoint) {
|
||||||
Double xi;
|
double xi;
|
||||||
Double xj;
|
double xj;
|
||||||
Double yi;
|
double yi;
|
||||||
Double yj;
|
double yj;
|
||||||
|
|
||||||
if (endPoint.getM() > startPoint.getM()) {
|
if (endPoint.getM() > startPoint.getM()) {
|
||||||
xi = startPoint.getM();
|
xi = startPoint.getM();
|
||||||
|
@ -120,22 +120,22 @@ public class NaivRepeatedMedianEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Double m = (yj - yi) / (xj - xi);
|
double m = (yj - yi) / (xj - xi);
|
||||||
Double b = ((xj * yi) - (xi * yj)) / (xj - xi);
|
double b = ((xj * yi) - (xi * yj)) / (xj - xi);
|
||||||
return new Point(m, b);
|
return new Point(m, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Steigung
|
* @return Steigung
|
||||||
*/
|
*/
|
||||||
public Double getM() {
|
public double getM() {
|
||||||
return medianX * -1;
|
return medianX * -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return y-Achsenabschnitt
|
* @return y-Achsenabschnitt
|
||||||
*/
|
*/
|
||||||
public Double getB() {
|
public double getB() {
|
||||||
return medianY * -1;
|
return medianY * -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ public class NaivTheilSenEstimator implements Algorithm {
|
||||||
|
|
||||||
|
|
||||||
private LinkedList<Line> lines;
|
private LinkedList<Line> lines;
|
||||||
private Double slope;
|
private double slope;
|
||||||
private Double yInterception;
|
private double yInterception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Konstruktor
|
* Konstruktor
|
||||||
|
@ -60,8 +60,8 @@ public class NaivTheilSenEstimator implements Algorithm {
|
||||||
list1.add(lines.get(i).getM());
|
list1.add(lines.get(i).getM());
|
||||||
list2.add(lines.get(i).getB());
|
list2.add(lines.get(i).getB());
|
||||||
}
|
}
|
||||||
Double median1 = FastElementSelector.randomizedSelect(list1, list1.size() / 2);
|
double median1 = FastElementSelector.randomizedSelect(list1, list1.size() / 2);
|
||||||
Double median2 = FastElementSelector.randomizedSelect(list2, list2.size() / 2);
|
double median2 = FastElementSelector.randomizedSelect(list2, list2.size() / 2);
|
||||||
slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size() / 2);
|
slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size() / 2);
|
||||||
yInterception = median2 - slope * median1;
|
yInterception = median2 - slope * median1;
|
||||||
end = System.currentTimeMillis();
|
end = System.currentTimeMillis();
|
||||||
|
@ -76,14 +76,14 @@ public class NaivTheilSenEstimator implements Algorithm {
|
||||||
/**
|
/**
|
||||||
* @return Steigung
|
* @return Steigung
|
||||||
*/
|
*/
|
||||||
public Double getM() {
|
public double getM() {
|
||||||
return slope * -1;
|
return slope * -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return y-Achsenabschnitt
|
* @return y-Achsenabschnitt
|
||||||
*/
|
*/
|
||||||
public Double getB() {
|
public double getB() {
|
||||||
return yInterception * -1;
|
return yInterception * -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,7 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
* Startet die Evaluation zu den passenden Typ. Bei beendigung wird der Beobachter informiert.
|
* Startet die Evaluation zu den passenden Typ. Bei beendigung wird der Beobachter informiert.
|
||||||
* @throws InterruptedException
|
* @throws InterruptedException
|
||||||
*/
|
*/
|
||||||
public void run() throws InterruptedException {
|
public void run() {
|
||||||
setChanged();
|
setChanged();
|
||||||
String[] msg = {"eval-dataset-generated"};
|
String[] msg = {"eval-dataset-generated"};
|
||||||
notifyObservers(msg);
|
notifyObservers(msg);
|
||||||
|
@ -165,8 +165,12 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
b[0] = l.getB();
|
b[0] = l.getB();
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
startLMS();
|
try {
|
||||||
t.join();
|
startLMS();
|
||||||
|
t.join();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
||||||
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1], m[0], b[0]));
|
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1], m[0], b[0]));
|
||||||
|
@ -182,7 +186,11 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
b[0] = r.getB();
|
b[0] = r.getB();
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
startRM();
|
try {
|
||||||
|
startRM();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
|
result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]);
|
||||||
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1], m[0], b[0]));
|
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1], m[0], b[0]));
|
||||||
Double[] tmp = {rmRes[0], rmRes[1], m[0], b[0]};
|
Double[] tmp = {rmRes[0], rmRes[1], m[0], b[0]};
|
||||||
|
@ -197,7 +205,11 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
b[0] = ts.getB();
|
b[0] = ts.getB();
|
||||||
});
|
});
|
||||||
t.start();
|
t.start();
|
||||||
startTS();
|
try {
|
||||||
|
startTS();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
|
result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]);
|
||||||
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1], m[0], b[0]));
|
result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1], m[0], b[0]));
|
||||||
Double[] tmp = {tsRes[0], tsRes[1], m[0], b[0]};
|
Double[] tmp = {tsRes[0], tsRes[1], m[0], b[0]};
|
||||||
|
@ -210,8 +222,12 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
ArrayList<Double[]> lineRes;
|
ArrayList<Double[]> lineRes;
|
||||||
switch (alg) {
|
switch (alg) {
|
||||||
case 3:
|
case 3:
|
||||||
startLMS();
|
try {
|
||||||
startRM();
|
startLMS();
|
||||||
|
startRM();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
||||||
multipleResults.add(result);
|
multipleResults.add(result);
|
||||||
|
@ -227,8 +243,12 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
startLMS();
|
try {
|
||||||
startTS();
|
startLMS();
|
||||||
|
startTS();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
||||||
multipleResults.add(result);
|
multipleResults.add(result);
|
||||||
|
@ -243,8 +263,12 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
sendPloteLineResults(lineRes, new Integer[]{0, 2});
|
sendPloteLineResults(lineRes, new Integer[]{0, 2});
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
startRM();
|
try {
|
||||||
startTS();
|
startRM();
|
||||||
|
startTS();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
result = fillPseudoResults();
|
result = fillPseudoResults();
|
||||||
multipleResults.add(result);
|
multipleResults.add(result);
|
||||||
|
@ -259,9 +283,13 @@ public class EvaluateAlgorithms extends Observable {
|
||||||
sendPloteLineResults(lineRes, new Integer[]{1, 2});
|
sendPloteLineResults(lineRes, new Integer[]{1, 2});
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
startLMS();
|
try {
|
||||||
startRM();
|
startLMS();
|
||||||
startTS();
|
startRM();
|
||||||
|
startTS();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]);
|
||||||
multipleResults.add(result);
|
multipleResults.add(result);
|
||||||
|
|
Loading…
Reference in New Issue