|
|
|
@ -16,6 +16,8 @@ import view.MainFrame;
|
|
|
|
|
import javax.swing.table.DefaultTableModel;
|
|
|
|
|
import java.io.File;
|
|
|
|
|
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 {
|
|
|
|
|
|
|
|
|
|
/* 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) {
|
|
|
|
|
super(model, view);
|
|
|
|
@ -54,81 +45,56 @@ public class Presenter extends AbstractPresenter {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Die Berechnung durch des Algorithmus zum LMS-Schätzer wird gestartet.
|
|
|
|
|
*
|
|
|
|
|
* @param input Parameter für den Algorithmus
|
|
|
|
|
*/
|
|
|
|
|
public void calculateLMS(String[] input) {
|
|
|
|
|
if (input[0] != null && input[1] != null) {
|
|
|
|
|
if (lmsThread == null || !lmsThread.isAlive()) {
|
|
|
|
|
lmsThread = new Thread(() -> {
|
|
|
|
|
//Parameter für den Algortihmus
|
|
|
|
|
Double constant = Double.parseDouble(input[0]);
|
|
|
|
|
Double error = Double.parseDouble(input[1]);
|
|
|
|
|
LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(getModel().getLines(), getModel().getNodes(), this);
|
|
|
|
|
//setzen der Parameter
|
|
|
|
|
lms.setConstant(constant);
|
|
|
|
|
lms.setQuantileError(error);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
lms.addObserver(this);
|
|
|
|
|
lms.run();
|
|
|
|
|
lms.pepareResult();
|
|
|
|
|
});
|
|
|
|
|
lmsThread.start();
|
|
|
|
|
try {
|
|
|
|
|
lmsThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//Parameter für den Algortihmus
|
|
|
|
|
Double constant = Double.parseDouble(input[0]);
|
|
|
|
|
Double error = Double.parseDouble(input[1]);
|
|
|
|
|
LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(getModel().getLines(), getModel().getNodes(), this);
|
|
|
|
|
//setzen der Parameter
|
|
|
|
|
lms.setConstant(constant);
|
|
|
|
|
lms.setQuantileError(error);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
lms.addObserver(this);
|
|
|
|
|
getExecutor().execute(lms);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Die Berechnung durch des Algorithmus zum RM-Schätzer wird gestartet.
|
|
|
|
|
*
|
|
|
|
|
* @param input Parameter für den Algorithmus
|
|
|
|
|
*/
|
|
|
|
|
public void calculateRM(String input) {
|
|
|
|
|
if (input != null) {
|
|
|
|
|
if (rmThread == null || !rmThread.isAlive()) {
|
|
|
|
|
rmThread = new Thread(() -> {
|
|
|
|
|
RepeatedMedianEstimator rm = new RepeatedMedianEstimator(getModel().getLines(), this);
|
|
|
|
|
Double parameter = Double.parseDouble(input);
|
|
|
|
|
rm.setBeta(parameter);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
rm.addObserver(this);
|
|
|
|
|
rm.run();
|
|
|
|
|
rm.pepareResult();
|
|
|
|
|
});
|
|
|
|
|
rmThread.start();
|
|
|
|
|
try {
|
|
|
|
|
rmThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
RepeatedMedianEstimator rm = new RepeatedMedianEstimator(getModel().getLines(), this);
|
|
|
|
|
Double parameter = Double.parseDouble(input);
|
|
|
|
|
rm.setBeta(parameter);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
rm.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(rm);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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
|
|
|
|
|
*/
|
|
|
|
|
public void calculateTS(String input) {
|
|
|
|
|
if (input != null) {
|
|
|
|
|
if (tsThread == null || !tsThread.isAlive()) {
|
|
|
|
|
tsThread = new Thread(() -> {
|
|
|
|
|
TheilSenEstimator ts = new TheilSenEstimator(getModel().getLines(), getModel().getNodes(), this);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
ts.addObserver(this);
|
|
|
|
|
ts.run();
|
|
|
|
|
ts.pepareResult();
|
|
|
|
|
});
|
|
|
|
|
tsThread.start();
|
|
|
|
|
try {
|
|
|
|
|
tsThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
TheilSenEstimator ts = new TheilSenEstimator(getModel().getLines(), getModel().getNodes(), this);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
ts.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(ts);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -138,201 +104,167 @@ public class Presenter extends AbstractPresenter {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Startet den Import des Datensatzes.
|
|
|
|
|
*
|
|
|
|
|
* @param file importierender Datensatz
|
|
|
|
|
*/
|
|
|
|
|
public void startImport(File file) {
|
|
|
|
|
if (importThread == null || !importThread.isAlive()) {
|
|
|
|
|
importThread = new Thread(() -> {
|
|
|
|
|
DataImporter importer = new DataImporter(file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
importer.addObserver(this);
|
|
|
|
|
|
|
|
|
|
DataImporter importer = new DataImporter(file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
importer.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
LinkedList<Line> importedLines = importer.run();
|
|
|
|
|
if (importedLines != null) {
|
|
|
|
|
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
|
|
|
|
getModel().setLines(importedLines);
|
|
|
|
|
computeIntersections();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
importThread.start();
|
|
|
|
|
try {
|
|
|
|
|
importThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Startet den Import eines Bildes.
|
|
|
|
|
*
|
|
|
|
|
* @param file importierendes Bild
|
|
|
|
|
*/
|
|
|
|
|
public void startPictureDataImport(File file) {
|
|
|
|
|
if (importPictureThread == null || !importPictureThread.isAlive()) {
|
|
|
|
|
importPictureThread = new Thread(() -> {
|
|
|
|
|
PictureProcessor pictureProcessor = new PictureProcessor(this, file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
pictureProcessor.addObserver(this);
|
|
|
|
|
PictureProcessor pictureProcessor = new PictureProcessor(this, file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
pictureProcessor.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
pictureProcessor.run();
|
|
|
|
|
//Berechnung der Schnittpunkte und vis. der Ergebnisse (anz. Geraden, anz. Schnittpunkte)
|
|
|
|
|
computeIntersections();
|
|
|
|
|
});
|
|
|
|
|
importPictureThread.start();
|
|
|
|
|
try {
|
|
|
|
|
importPictureThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Startet den Export des akteullen Datensatzes (nur der Geraden)
|
|
|
|
|
*
|
|
|
|
|
* @param file Datei in der die Informationen gespeichert werden sollen
|
|
|
|
|
*/
|
|
|
|
|
public void startExport(File file) {
|
|
|
|
|
if (exportThread == null || !exportThread.isAlive()) {
|
|
|
|
|
exportThread = new Thread(() -> {
|
|
|
|
|
DataExporter exporter = new DataExporter(getModel().getLines(), file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
exporter.addObserver(this);
|
|
|
|
|
DataExporter exporter = new DataExporter(getModel().getLines(), file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
exporter.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
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)
|
|
|
|
|
*
|
|
|
|
|
* @param file Datei in der die Informationen gespeichert werden sollen
|
|
|
|
|
*/
|
|
|
|
|
public void startDatasetExportEvaluation(File file) {
|
|
|
|
|
if (exportThread == null || !exportThread.isAlive()) {
|
|
|
|
|
exportThread = new Thread(() -> {
|
|
|
|
|
DataExporter exporter = new DataExporter(getEval().getData(), file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
exporter.addObserver(this);
|
|
|
|
|
DataExporter exporter = new DataExporter(getEval().getData(), file);
|
|
|
|
|
//Presenter soll die Klasse überwachen
|
|
|
|
|
exporter.addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().execute(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
exporter.export();
|
|
|
|
|
});
|
|
|
|
|
exportThread.start();
|
|
|
|
|
try {
|
|
|
|
|
exportThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Startet den Export der Ergebnisse der Evaluation in Form einer LaTeX Datei
|
|
|
|
|
*
|
|
|
|
|
* @param model TableModel das die Berechnenten Ergebnisse enthält
|
|
|
|
|
* @param file Datei in die exportiert werden soll
|
|
|
|
|
*/
|
|
|
|
|
public void startResultExport(DefaultTableModel model, File file) {
|
|
|
|
|
if (exportResultThread == null || !exportResultThread.isAlive()) {
|
|
|
|
|
exportResultThread = new Thread(() -> {
|
|
|
|
|
EvalResultLatexExport exporter = new EvalResultLatexExport(model, file);
|
|
|
|
|
exporter.writeFile();
|
|
|
|
|
});
|
|
|
|
|
exportResultThread.start();
|
|
|
|
|
try {
|
|
|
|
|
exportResultThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
getExecutor().execute(() -> {
|
|
|
|
|
EvalResultLatexExport exporter = new EvalResultLatexExport(model, file);
|
|
|
|
|
exporter.writeFile();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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
|
|
|
|
|
*/
|
|
|
|
|
public void generateDataset(int n, int type) {
|
|
|
|
|
if (generatorThread == null || !generatorThread.isAlive()) {
|
|
|
|
|
generatorThread = new Thread(() -> {
|
|
|
|
|
DatasetGenerator generator = new DatasetGenerator();
|
|
|
|
|
generator.addObserver(this);
|
|
|
|
|
switch (type){
|
|
|
|
|
case 0:
|
|
|
|
|
getModel().setLines(generator.generateDataCloud(n));
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
getModel().setLines(generator.generateDataLines(n));
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
getModel().setLines(generator.generateCircle(n));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
getModel().setLines(generator.generateDataCloud(n));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
computeIntersections();
|
|
|
|
|
getView().enableFunctionality();
|
|
|
|
|
});
|
|
|
|
|
generatorThread.start();
|
|
|
|
|
try {
|
|
|
|
|
generatorThread.join();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
DatasetGenerator generator = new DatasetGenerator();
|
|
|
|
|
generator.addObserver(this);
|
|
|
|
|
getExecutor().execute(() -> {
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 0:
|
|
|
|
|
getModel().setLines(generator.generateDataCloud(n));
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
getModel().setLines(generator.generateDataLines(n));
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
getModel().setLines(generator.generateCircle(n));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
getModel().setLines(generator.generateDataCloud(n));
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
computeIntersections();
|
|
|
|
|
getView().enableFunctionality();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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
|
|
|
|
|
* auf einem gegebenen Datensatz.
|
|
|
|
|
* @param typ Typ der Evaluation
|
|
|
|
|
* @param n Größe des Datensatzes
|
|
|
|
|
* @param alg code für die auszuführenden Algorithmen (siehe <code>EvaluationPanel.checkSelection()</code> Method)
|
|
|
|
|
*
|
|
|
|
|
* @param typ Typ der Evaluation
|
|
|
|
|
* @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)
|
|
|
|
|
*/
|
|
|
|
|
public void startEvaluation(int typ, int n, int alg, String datasettyp) {
|
|
|
|
|
if (evalThread == null || !evalThread.isAlive()) {
|
|
|
|
|
evalThread = new Thread(() -> {
|
|
|
|
|
try {
|
|
|
|
|
setEval(new EvaluateAlgorithms(typ, n, alg, datasettyp));
|
|
|
|
|
getEval().addObserver(this);
|
|
|
|
|
getEval().run();
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
evalThread.start();
|
|
|
|
|
}
|
|
|
|
|
setEval(new EvaluateAlgorithms(typ, n, alg, datasettyp));
|
|
|
|
|
getEval().addObserver(this);
|
|
|
|
|
|
|
|
|
|
getExecutor().submit(() -> {
|
|
|
|
|
getEval().run();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Startet die Evaluation zu einen gegegbenen Datensatz, der importiert wird.
|
|
|
|
|
* Beispielsweise kann ein Alg. auf mit verschiedenen Datensätzen untersucht werden, oder mehrere Algorithmen
|
|
|
|
|
* 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)
|
|
|
|
|
*/
|
|
|
|
|
public void startEvaluation(int typ, int alg, File file) {
|
|
|
|
|
if (evalThread == null || !evalThread.isAlive()) {
|
|
|
|
|
evalThread = new Thread(() -> {
|
|
|
|
|
try {
|
|
|
|
|
EvaluateAlgorithms evaluateAlgorithms = new EvaluateAlgorithms(typ, alg, file);
|
|
|
|
|
if (evaluateAlgorithms.getData().size() > 0) {
|
|
|
|
|
setEval(evaluateAlgorithms);
|
|
|
|
|
getEval().addObserver(this);
|
|
|
|
|
getEval().run();
|
|
|
|
|
}
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
evalThread.start();
|
|
|
|
|
|
|
|
|
|
EvaluateAlgorithms evaluateAlgorithms = new EvaluateAlgorithms(typ, alg, file);
|
|
|
|
|
if (evaluateAlgorithms.getData().size() > 0) {
|
|
|
|
|
setEval(evaluateAlgorithms);
|
|
|
|
|
getEval().addObserver(this);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
getExecutor().submit(() -> {
|
|
|
|
|
getEval().run();
|
|
|
|
|
}).isDone();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|