sync. gui input with algorithm property
This commit is contained in:
parent
fa6148dea2
commit
91d3fc4c97
|
@ -9,6 +9,7 @@ import de.wwwu.awolf.presenter.data.DataHandler;
|
||||||
import de.wwwu.awolf.presenter.evaluation.EvaluatationHandler;
|
import de.wwwu.awolf.presenter.evaluation.EvaluatationHandler;
|
||||||
import de.wwwu.awolf.presenter.util.Logging;
|
import de.wwwu.awolf.presenter.util.Logging;
|
||||||
import de.wwwu.awolf.view.ViewController;
|
import de.wwwu.awolf.view.ViewController;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -89,8 +90,8 @@ public abstract class AbstractPresenter implements Flow.Subscriber<Message> {
|
||||||
* @param type algorithm type
|
* @param type algorithm type
|
||||||
* @param lines set of lines
|
* @param lines set of lines
|
||||||
*/
|
*/
|
||||||
public void executeAlgorithmByType(Algorithm.Type type, Set<Line> lines) {
|
public void executeAlgorithmByType(Algorithm.Type type, final Map<String, String> properties, Set<Line> lines) {
|
||||||
this.algorithmHandler.runAlgorithmByType(type, lines);
|
this.algorithmHandler.runAlgorithmByType(type, properties, lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,9 +100,9 @@ public abstract class AbstractPresenter implements Flow.Subscriber<Message> {
|
||||||
* @param type algorithm type
|
* @param type algorithm type
|
||||||
* @param lines set of lines
|
* @param lines set of lines
|
||||||
*/
|
*/
|
||||||
public void executeAlgorithmByType(Algorithm.Type type, Set<Line> lines,
|
public void executeAlgorithmByType(Algorithm.Type type, final Map<String, String> properties, Set<Line> lines,
|
||||||
BooleanProperty guiFlag) {
|
BooleanProperty guiFlag) {
|
||||||
this.algorithmHandler.runAlgorithmByType(type, lines, guiFlag);
|
this.algorithmHandler.runAlgorithmByType(type, properties, lines, guiFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,13 +110,13 @@ public abstract class AbstractPresenter implements Flow.Subscriber<Message> {
|
||||||
*
|
*
|
||||||
* @param type algorithm type
|
* @param type algorithm type
|
||||||
*/
|
*/
|
||||||
public Line executeAlgorithmByType(Algorithm.Type type, BooleanProperty guiFlag) {
|
public Line executeAlgorithmByType(Algorithm.Type type, final Map<String, String> properties, BooleanProperty guiFlag) {
|
||||||
if (getModel().getSize() == 0) {
|
if (getModel().getSize() == 0) {
|
||||||
Logging.logDebug("No lines in the Model. Nothing to calculate.");
|
Logging.logDebug("No lines in the Model. Nothing to calculate.");
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
} else {
|
} else {
|
||||||
Logging.logDebug("AlgorithmHandler will start " + type.getLabel() + ", with " + getModel().getSize());
|
Logging.logDebug("AlgorithmHandler will start " + type.getLabel() + ", with " + getModel().getSize());
|
||||||
return this.algorithmHandler.runAlgorithmByType(type, getModel().getLines(), guiFlag);
|
return this.algorithmHandler.runAlgorithmByType(type, properties, getModel().getLines(), guiFlag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ public interface Algorithm extends Callable<Line>, Flow.Publisher<Message> {
|
||||||
|
|
||||||
void setPresenter(AbstractPresenter presenter);
|
void setPresenter(AbstractPresenter presenter);
|
||||||
|
|
||||||
Map<String, Object> getParameter();
|
Map<String, String> getParameter();
|
||||||
|
|
||||||
void setParameter(Map<String, Object> parameter);
|
void setParameter(Map<String, String> parameter);
|
||||||
|
|
||||||
enum Type {
|
enum Type {
|
||||||
LMS("Least Median of Squares"),
|
LMS("Least Median of Squares"),
|
||||||
|
|
|
@ -17,7 +17,7 @@ public class AlgorithmHandler {
|
||||||
|
|
||||||
private static AlgorithmHandler instance;
|
private static AlgorithmHandler instance;
|
||||||
private Map<Algorithm.Type, Algorithm> algorithmMapping;
|
private Map<Algorithm.Type, Algorithm> algorithmMapping;
|
||||||
private Map<Algorithm.Type, Map<String, Object>> algorithmParameters;
|
private Map<Algorithm.Type, Map<String, String>> algorithmParameters;
|
||||||
|
|
||||||
|
|
||||||
private AlgorithmHandler() {
|
private AlgorithmHandler() {
|
||||||
|
@ -40,8 +40,8 @@ public class AlgorithmHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Line runAlgorithmByType(final Algorithm.Type type, final Set<Line> setOfLines,
|
public Line runAlgorithmByType(final Algorithm.Type type, @Nullable final Map<String, String> properties, final Set<Line> setOfLines,
|
||||||
final BooleanProperty guiFlag) {
|
@Nullable final BooleanProperty guiFlag) {
|
||||||
|
|
||||||
if (guiFlag != null) {
|
if (guiFlag != null) {
|
||||||
guiFlag.setValue(true);
|
guiFlag.setValue(true);
|
||||||
|
@ -51,6 +51,11 @@ public class AlgorithmHandler {
|
||||||
Algorithm algorithm = algorithmMapping.get(type);
|
Algorithm algorithm = algorithmMapping.get(type);
|
||||||
algorithm.setPresenter(Presenter.getInstance());
|
algorithm.setPresenter(Presenter.getInstance());
|
||||||
algorithm.setInput(setOfLines);
|
algorithm.setInput(setOfLines);
|
||||||
|
//set properties if needed
|
||||||
|
if (properties != null) {
|
||||||
|
algorithm.setParameter(properties);
|
||||||
|
}
|
||||||
|
|
||||||
Logging.logDebug("run Algorithm: " + algorithm.getClass().getSimpleName());
|
Logging.logDebug("run Algorithm: " + algorithm.getClass().getSimpleName());
|
||||||
|
|
||||||
//get the executor
|
//get the executor
|
||||||
|
@ -80,8 +85,8 @@ public class AlgorithmHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Line runAlgorithmByType(final Algorithm.Type type, final Set<Line> setOfLines) {
|
public Line runAlgorithmByType(final Algorithm.Type type, @Nullable final Map<String, String> properties, final Set<Line> setOfLines) {
|
||||||
return runAlgorithmByType(type, setOfLines, null);
|
return runAlgorithmByType(type, properties, setOfLines, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lookUp() {
|
private void lookUp() {
|
||||||
|
@ -97,7 +102,7 @@ public class AlgorithmHandler {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> getAlgorithmParametersByType(Algorithm.Type type) {
|
public Map<String, String> getAlgorithmParametersByType(Algorithm.Type type) {
|
||||||
return algorithmParameters.get(type);
|
return algorithmParameters.get(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,6 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
|
|
||||||
private List<Line> setOfLines;
|
private List<Line> setOfLines;
|
||||||
private int n;
|
private int n;
|
||||||
private double quantileError;
|
|
||||||
private int kPlus;
|
private int kPlus;
|
||||||
private int kMinus;
|
private int kMinus;
|
||||||
private Queue<Interval> intervals;
|
private Queue<Interval> intervals;
|
||||||
|
@ -45,20 +44,16 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
private Line sigmaMin;
|
private Line sigmaMin;
|
||||||
private double heightsigmaMin;
|
private double heightsigmaMin;
|
||||||
private double intersectionsPoint;
|
private double intersectionsPoint;
|
||||||
private double constant;
|
|
||||||
|
|
||||||
private double slope;
|
private double slope;
|
||||||
private double yInterception;
|
private double yInterception;
|
||||||
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
||||||
private Map<String, Object> parameter;
|
private Map<String, String> parameter;
|
||||||
|
|
||||||
public LeastMedianOfSquaresEstimator() {
|
public LeastMedianOfSquaresEstimator() {
|
||||||
quantileError = 0.1;
|
|
||||||
constant = 0.5;
|
|
||||||
|
|
||||||
parameter = new HashMap<>();
|
parameter = new HashMap<>();
|
||||||
parameter.put("Quantile Error", quantileError);
|
parameter.put("Quartile Error", String.valueOf(0.1));
|
||||||
parameter.put("Constant", constant);
|
parameter.put("Constant", String.valueOf(0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,9 +65,10 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
@Override
|
@Override
|
||||||
public Line call() {
|
public Line call() {
|
||||||
|
|
||||||
|
Logging.logDebug("Parameter\nQuartile Error: " + Double.parseDouble(parameter.get("Quartile Error")) + ", Constant: " + Double.parseDouble(parameter.get("Constant")));
|
||||||
this.n = setOfLines.size();
|
this.n = setOfLines.size();
|
||||||
double qPlus = 0.5;
|
double qPlus = 0.5;
|
||||||
double qMinus = qPlus * (1 - quantileError);
|
double qMinus = qPlus * (1 - Double.parseDouble(parameter.get("Quartile Error")));
|
||||||
kMinus = (int) Math.ceil(n * qMinus);
|
kMinus = (int) Math.ceil(n * qMinus);
|
||||||
kPlus = (int) Math.ceil(n * qPlus);
|
kPlus = (int) Math.ceil(n * qPlus);
|
||||||
|
|
||||||
|
@ -105,7 +101,7 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
int numberOfIntersections = countInversions(interval);
|
int numberOfIntersections = countInversions(interval);
|
||||||
|
|
||||||
//(b.) apply plane sweep
|
//(b.) apply plane sweep
|
||||||
if ((constant * n) >= numberOfIntersections) {
|
if ((Double.parseDouble(parameter.get("Constant")) * n) >= numberOfIntersections) {
|
||||||
sigmaMin = pseudoSweep(interval);
|
sigmaMin = pseudoSweep(interval);
|
||||||
} else {
|
} else {
|
||||||
//(c.) otherwise....
|
//(c.) otherwise....
|
||||||
|
@ -168,12 +164,12 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,20 +421,6 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
this.n = n;
|
this.n = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param quantileError Parameter quantile Fehler
|
|
||||||
*/
|
|
||||||
public void setQuantileError(double quantileError) {
|
|
||||||
this.quantileError = quantileError;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param kMinus kMinus index
|
|
||||||
*/
|
|
||||||
public void setkMinus(int kMinus) {
|
|
||||||
this.kMinus = kMinus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return duale Streifen Sigma_min
|
* @return duale Streifen Sigma_min
|
||||||
*/
|
*/
|
||||||
|
@ -446,27 +428,6 @@ public class LeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
return sigmaMin;
|
return sigmaMin;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param sigmaMin duale Streifen Sigma_min
|
|
||||||
*/
|
|
||||||
public void setSigmaMin(Line sigmaMin) {
|
|
||||||
this.sigmaMin = sigmaMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param heightsigmaMin höhe von Sigma_min
|
|
||||||
*/
|
|
||||||
public void setHeightsigmaMin(double heightsigmaMin) {
|
|
||||||
this.heightsigmaMin = heightsigmaMin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param constant Parameter Konstante
|
|
||||||
*/
|
|
||||||
public void setConstant(Double constant) {
|
|
||||||
this.constant = constant;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Steigung
|
* @return Steigung
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -34,8 +34,6 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
|
|
||||||
|
|
||||||
private static final Algorithm.Type type = Type.RM;
|
private static final Algorithm.Type type = Type.RM;
|
||||||
|
|
||||||
private AbstractPresenter presenter;
|
|
||||||
private List<Line> setOfLines;
|
private List<Line> setOfLines;
|
||||||
private Interval interval;
|
private Interval interval;
|
||||||
private Interval original;
|
private Interval original;
|
||||||
|
@ -55,18 +53,15 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
private double k;
|
private double k;
|
||||||
private double kLow;
|
private double kLow;
|
||||||
private double kHigh;
|
private double kHigh;
|
||||||
private double beta;
|
|
||||||
|
|
||||||
private double slope;
|
private double slope;
|
||||||
private double yInterception;
|
private double yInterception;
|
||||||
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
||||||
private Map<String, Object> parameter;
|
private Map<String, String> parameter;
|
||||||
|
|
||||||
public RepeatedMedianEstimator() {
|
public RepeatedMedianEstimator() {
|
||||||
beta = 0.5;
|
|
||||||
|
|
||||||
parameter = new HashMap<>();
|
parameter = new HashMap<>();
|
||||||
parameter.put("Beta", beta);
|
parameter.put("Beta", String.valueOf(0.5));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,7 +70,6 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
* Paper: Matousek, Jiri, D. M. Mount und N. S. Netanyahu „Efficient Randomized Algorithms for the Repeated Median Line Estimator“. 1998 Algorithmica 20.2, S. 136–150
|
* Paper: Matousek, Jiri, D. M. Mount und N. S. Netanyahu „Efficient Randomized Algorithms for the Repeated Median Line Estimator“. 1998 Algorithmica 20.2, S. 136–150
|
||||||
*/
|
*/
|
||||||
public Line call() {
|
public Line call() {
|
||||||
|
|
||||||
n = setOfLines.size();
|
n = setOfLines.size();
|
||||||
interval = new Interval(-10000, 10000);
|
interval = new Interval(-10000, 10000);
|
||||||
original = new Interval(-10000, 10000);
|
original = new Interval(-10000, 10000);
|
||||||
|
@ -104,7 +98,7 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
|
|
||||||
while (countCenterSlab > 1) {
|
while (countCenterSlab > 1) {
|
||||||
n = countCenterSlab;
|
n = countCenterSlab;
|
||||||
r = Math.ceil(Math.pow(n, beta));
|
r = Math.ceil(Math.pow(n, Double.parseDouble(parameter.get("Beta"))));
|
||||||
List<Line> lines = RandomSampler.run(setOfLines, r);
|
List<Line> lines = RandomSampler.run(setOfLines, r);
|
||||||
|
|
||||||
//Für jede Gerade aus der Stichprobe wird der Schnittpunkt mit der medianen
|
//Für jede Gerade aus der Stichprobe wird der Schnittpunkt mit der medianen
|
||||||
|
@ -157,7 +151,6 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPresenter(AbstractPresenter presenter) {
|
public void setPresenter(AbstractPresenter presenter) {
|
||||||
this.presenter = presenter;
|
|
||||||
subscribe(presenter);
|
subscribe(presenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,13 +279,6 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
this.n = n;
|
this.n = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param beta Parameter Beta
|
|
||||||
*/
|
|
||||||
public void setBeta(Double beta) {
|
|
||||||
this.beta = beta;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Steigung
|
* @return Steigung
|
||||||
*/
|
*/
|
||||||
|
@ -307,67 +293,18 @@ public class RepeatedMedianEstimator implements Algorithm {
|
||||||
return yInterception;
|
return yInterception;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return temporäres untere Intervallgrenze
|
|
||||||
*/
|
|
||||||
public Double getkLow() {
|
|
||||||
return kLow;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param kLow temporäres untere Intervallgrenze
|
|
||||||
*/
|
|
||||||
public void setkLow(Double kLow) {
|
|
||||||
this.kLow = kLow;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return temporäres oberes Intervallgrenze
|
|
||||||
*/
|
|
||||||
public Double getkHigh() {
|
|
||||||
return kHigh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param kHigh temporäres oberes Intervallgrenze
|
|
||||||
*/
|
|
||||||
public void setkHigh(Double kHigh) {
|
|
||||||
this.kHigh = kHigh;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return verteilung der Punkte
|
|
||||||
*/
|
|
||||||
public int getCountLeftSlab() {
|
|
||||||
return countLeftSlab;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return verteilung der Punkte
|
|
||||||
*/
|
|
||||||
public int getCountCenterSlab() {
|
|
||||||
return countCenterSlab;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return verteilung der Punkte
|
|
||||||
*/
|
|
||||||
public int getCountRightSlab() {
|
|
||||||
return countRightSlab;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void subscribe(Flow.Subscriber<? super Message> subscriber) {
|
public void subscribe(Flow.Subscriber<? super Message> subscriber) {
|
||||||
this.subscriber = subscriber;
|
this.subscriber = subscriber;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,16 +33,8 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
|
|
||||||
private static final Algorithm.Type type = Type.TS;
|
private static final Algorithm.Type type = Type.TS;
|
||||||
|
|
||||||
private final double POSITIV_INF = 9999.0;
|
|
||||||
private final double NEGATIV_INF = -9999.0;
|
|
||||||
private final double EPSILON = 0.00001;
|
|
||||||
private List<Line> setOfLines;
|
private List<Line> setOfLines;
|
||||||
//Hilfsvariablen (siehe original Paper)
|
|
||||||
private double j;
|
|
||||||
private int jA;
|
|
||||||
private int jB;
|
|
||||||
private double r;
|
private double r;
|
||||||
private int n;
|
|
||||||
private double N;
|
private double N;
|
||||||
private int k;
|
private int k;
|
||||||
//Intervall und die temporaeren Grenzen
|
//Intervall und die temporaeren Grenzen
|
||||||
|
@ -52,8 +44,7 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
private double slope;
|
private double slope;
|
||||||
private double yInterception;
|
private double yInterception;
|
||||||
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
private Flow.Subscriber<? super AlgorithmMessage> subscriber;
|
||||||
private AbstractPresenter presenter;
|
private Map<String, String> parameter;
|
||||||
private Map<String, Object> parameter;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,11 +53,13 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
*/
|
*/
|
||||||
public Line call() {
|
public Line call() {
|
||||||
|
|
||||||
this.n = this.setOfLines.size();
|
int n = this.setOfLines.size();
|
||||||
this.N = BinomialCoeffizient.run(n, 2);
|
this.N = BinomialCoeffizient.run(n, 2);
|
||||||
//this.k = Integer.valueOf((int) (N * 0.5)) - 1;
|
//this.k = Integer.valueOf((int) (N * 0.5)) - 1;
|
||||||
this.k = (int) (N / 2);
|
this.k = (int) (N / 2);
|
||||||
|
|
||||||
|
double POSITIV_INF = 9999.0;
|
||||||
|
double NEGATIV_INF = -9999.0;
|
||||||
interval = new Interval(NEGATIV_INF, POSITIV_INF);
|
interval = new Interval(NEGATIV_INF, POSITIV_INF);
|
||||||
//damit eine initiale Ordnung herscht
|
//damit eine initiale Ordnung herscht
|
||||||
//Collections.sort(intervalIntersections);
|
//Collections.sort(intervalIntersections);
|
||||||
|
@ -75,6 +68,7 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
List<Point> intervalIntersections = new LinkedList<>(IntersectionComputer.getInstance()
|
List<Point> intervalIntersections = new LinkedList<>(IntersectionComputer.getInstance()
|
||||||
.compute(setOfLines, interval.getLower(), interval.getUpper()));
|
.compute(setOfLines, interval.getLower(), interval.getUpper()));
|
||||||
while (true) {
|
while (true) {
|
||||||
|
double EPSILON = 0.00001;
|
||||||
if (this.N <= n
|
if (this.N <= n
|
||||||
|| (Math.abs(interval.getUpper() - interval.getLower())) < EPSILON) {
|
|| (Math.abs(interval.getUpper() - interval.getLower())) < EPSILON) {
|
||||||
break;
|
break;
|
||||||
|
@ -84,9 +78,10 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
interval.getLower());
|
interval.getLower());
|
||||||
|
|
||||||
//Randomized Interpolating Search
|
//Randomized Interpolating Search
|
||||||
j = (r / N) * (double) (k - numberOfIntersections);
|
//Hilfsvariablen (siehe original Paper)
|
||||||
jA = (int) Math.max(1, Math.floor(j - (1.5 * Math.sqrt(r))));
|
double j = (r / N) * (double) (k - numberOfIntersections);
|
||||||
jB = (int) Math.min(r, Math.floor(j + (1.5 * Math.sqrt(r))));
|
int jA = (int) Math.max(1, Math.floor(j - (1.5 * Math.sqrt(r))));
|
||||||
|
int jB = (int) Math.min(r, Math.floor(j + (1.5 * Math.sqrt(r))));
|
||||||
|
|
||||||
|
|
||||||
/* Suche nach einem passenderen und kleineren Intervall
|
/* Suche nach einem passenderen und kleineren Intervall
|
||||||
|
@ -103,7 +98,7 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
bVariant = FastElementSelector
|
bVariant = FastElementSelector
|
||||||
.randomizedSelect(getIntersectionAbscissas(sampledIntersections),
|
.randomizedSelect(getIntersectionAbscissas(sampledIntersections),
|
||||||
jB);
|
jB);
|
||||||
} while (!checkCondition());
|
} while (!checkCondition(NEGATIV_INF));
|
||||||
|
|
||||||
interval.setLower(aVariant);
|
interval.setLower(aVariant);
|
||||||
interval.setUpper(bVariant);
|
interval.setUpper(bVariant);
|
||||||
|
@ -128,7 +123,6 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPresenter(AbstractPresenter presenter) {
|
public void setPresenter(AbstractPresenter presenter) {
|
||||||
this.presenter = presenter;
|
|
||||||
subscribe(presenter);
|
subscribe(presenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,12 +139,12 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
*
|
*
|
||||||
* @return Boolscher Wert ob die Bedingung erfüllt ist
|
* @return Boolscher Wert ob die Bedingung erfüllt ist
|
||||||
*/
|
*/
|
||||||
private Boolean checkCondition() {
|
private Boolean checkCondition(final double lowerBound) {
|
||||||
//Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k);
|
//Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k);
|
||||||
//Boolean cond1 = (kthElement > aVariant) && (kthElement <= bVariant);
|
//Boolean cond1 = (kthElement > aVariant) && (kthElement <= bVariant);
|
||||||
|
|
||||||
int lowerCount = getIntervalSize(NEGATIV_INF, aVariant);
|
int lowerCount = getIntervalSize(lowerBound, aVariant);
|
||||||
int higherCount = getIntervalSize(NEGATIV_INF, bVariant);
|
int higherCount = getIntervalSize(lowerBound, bVariant);
|
||||||
|
|
||||||
Boolean conda = k > lowerCount;
|
Boolean conda = k > lowerCount;
|
||||||
Boolean condb = k <= higherCount;
|
Boolean condb = k <= higherCount;
|
||||||
|
@ -208,7 +202,8 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
yCoords.add(p.getY());
|
yCoords.add(p.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
double pseudoIndex = getIntervalSize(NEGATIV_INF, interval.getLower()) * 1.0;
|
//TODO
|
||||||
|
double pseudoIndex = getIntervalSize(-9999.0, interval.getLower()) * 1.0;
|
||||||
m = FastElementSelector.randomizedSelect(resultAbscissas, k - pseudoIndex);
|
m = FastElementSelector.randomizedSelect(resultAbscissas, k - pseudoIndex);
|
||||||
|
|
||||||
Set<Double> unique = new LinkedHashSet<>(yCoords);
|
Set<Double> unique = new LinkedHashSet<>(yCoords);
|
||||||
|
@ -249,12 +244,12 @@ public class TheilSenEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ public class NaiveLeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
private double ds, b, m;
|
private double ds, b, m;
|
||||||
private Flow.Subscriber<? super Message> subscriber;
|
private Flow.Subscriber<? super Message> subscriber;
|
||||||
private AbstractPresenter presenter;
|
private AbstractPresenter presenter;
|
||||||
private Map<String, Object> parameter;
|
private Map<String, String> parameter;
|
||||||
|
|
||||||
public NaiveLeastMedianOfSquaresEstimator() {
|
public NaiveLeastMedianOfSquaresEstimator() {
|
||||||
parameter = new HashMap<>();
|
parameter = new HashMap<>();
|
||||||
|
@ -148,12 +148,12 @@ public class NaiveLeastMedianOfSquaresEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class NaiveRepeatedMedianEstimator implements Algorithm {
|
||||||
private double medianY;
|
private double medianY;
|
||||||
private Flow.Subscriber<? super Message> subscriber;
|
private Flow.Subscriber<? super Message> subscriber;
|
||||||
private AbstractPresenter presenter;
|
private AbstractPresenter presenter;
|
||||||
private Map<String, Object> parameter;
|
private Map<String, String> parameter;
|
||||||
|
|
||||||
public NaiveRepeatedMedianEstimator() {
|
public NaiveRepeatedMedianEstimator() {
|
||||||
parameter = new HashMap<>();
|
parameter = new HashMap<>();
|
||||||
|
@ -150,12 +150,12 @@ public class NaiveRepeatedMedianEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ public class NaiveTheilSenEstimator implements Algorithm {
|
||||||
private double yInterception;
|
private double yInterception;
|
||||||
private Flow.Subscriber<? super Message> subscriber;
|
private Flow.Subscriber<? super Message> subscriber;
|
||||||
private AbstractPresenter presenter;
|
private AbstractPresenter presenter;
|
||||||
private Map<String, Object> parameter;
|
private Map<String, String> parameter;
|
||||||
|
|
||||||
public NaiveTheilSenEstimator() {
|
public NaiveTheilSenEstimator() {
|
||||||
parameter = new HashMap<>();
|
parameter = new HashMap<>();
|
||||||
|
@ -100,12 +100,12 @@ public class NaiveTheilSenEstimator implements Algorithm {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getParameter() {
|
public Map<String, String> getParameter() {
|
||||||
return this.parameter;
|
return this.parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setParameter(Map<String, Object> parameter) {
|
public void setParameter(Map<String, String> parameter) {
|
||||||
this.parameter = parameter;
|
this.parameter = parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class AlgorithmComparison {
|
||||||
type = value;
|
type = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Line line = algorithmHandler.runAlgorithmByType(type, lines);
|
Line line = algorithmHandler.runAlgorithmByType(type, null, lines);
|
||||||
comparisonResult.put(type, line);
|
comparisonResult.put(type, line);
|
||||||
}
|
}
|
||||||
return comparisonResult;
|
return comparisonResult;
|
||||||
|
|
|
@ -4,8 +4,10 @@ import de.wwwu.awolf.model.dao.Line;
|
||||||
import de.wwwu.awolf.model.dao.LineModel;
|
import de.wwwu.awolf.model.dao.LineModel;
|
||||||
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
||||||
import de.wwwu.awolf.view.services.ButtonClickService;
|
import de.wwwu.awolf.view.services.ButtonClickService;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javafx.beans.property.BooleanProperty;
|
import javafx.beans.property.BooleanProperty;
|
||||||
|
import javafx.beans.property.SimpleObjectProperty;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.geometry.Insets;
|
import javafx.geometry.Insets;
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
|
@ -16,6 +18,7 @@ import javafx.scene.control.Label;
|
||||||
import javafx.scene.control.TextField;
|
import javafx.scene.control.TextField;
|
||||||
import javafx.scene.layout.BorderPane;
|
import javafx.scene.layout.BorderPane;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class AlgorithmTabController {
|
public class AlgorithmTabController {
|
||||||
|
|
||||||
|
@ -29,7 +32,7 @@ public class AlgorithmTabController {
|
||||||
private Button startButton;
|
private Button startButton;
|
||||||
|
|
||||||
private Algorithm.Type algorithmType;
|
private Algorithm.Type algorithmType;
|
||||||
private Map<String, Object> properties;
|
private Map<String, SimpleObjectProperty<String>> properties;
|
||||||
private LineModel model;
|
private LineModel model;
|
||||||
|
|
||||||
public AlgorithmTabController() {
|
public AlgorithmTabController() {
|
||||||
|
@ -56,7 +59,8 @@ public class AlgorithmTabController {
|
||||||
borderPane.setPadding(new Insets(10, 0, 10, 0));
|
borderPane.setPadding(new Insets(10, 0, 10, 0));
|
||||||
|
|
||||||
//text field for the input
|
//text field for the input
|
||||||
TextField textField = new TextField(String.valueOf(value));
|
TextField textField = new TextField(String.valueOf(value.get()));
|
||||||
|
textField.textProperty().bindBidirectional(value);
|
||||||
|
|
||||||
//label
|
//label
|
||||||
Label label = new Label(key);
|
Label label = new Label(key);
|
||||||
|
@ -73,8 +77,7 @@ public class AlgorithmTabController {
|
||||||
|
|
||||||
BooleanProperty booleanProperty = startButton.disableProperty();
|
BooleanProperty booleanProperty = startButton.disableProperty();
|
||||||
startButton.setOnAction(event -> {
|
startButton.setOnAction(event -> {
|
||||||
ButtonClickService buttonClickService = new ButtonClickService(algorithmType,
|
ButtonClickService buttonClickService = new ButtonClickService(algorithmType, getProperties(), booleanProperty);
|
||||||
booleanProperty);
|
|
||||||
buttonClickService.start();
|
buttonClickService.start();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -110,12 +113,26 @@ public class AlgorithmTabController {
|
||||||
this.algorithmType = algorithmType;
|
this.algorithmType = algorithmType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> getProperties() {
|
@Nullable
|
||||||
return properties;
|
public Map<String, String> getProperties() {
|
||||||
|
if (properties == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
HashMap<String, String> props = new HashMap<>();
|
||||||
|
properties.forEach((key, value) -> {
|
||||||
|
props.put(key, value.get());
|
||||||
|
});
|
||||||
|
return props;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setProperties(Map<String, Object> properties) {
|
public void setProperties(Map<String, String> props) {
|
||||||
this.properties = properties;
|
if (props != null && !props.isEmpty()) {
|
||||||
|
properties = new HashMap<>();
|
||||||
|
props.forEach((key, value) -> {
|
||||||
|
properties.put(key, new SimpleObjectProperty<>(value));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Button getStartButton() {
|
public Button getStartButton() {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package de.wwwu.awolf.view.services;
|
||||||
import de.wwwu.awolf.model.dao.Line;
|
import de.wwwu.awolf.model.dao.Line;
|
||||||
import de.wwwu.awolf.presenter.Presenter;
|
import de.wwwu.awolf.presenter.Presenter;
|
||||||
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
import de.wwwu.awolf.presenter.algorithms.Algorithm;
|
||||||
|
import java.util.Map;
|
||||||
import javafx.beans.property.BooleanProperty;
|
import javafx.beans.property.BooleanProperty;
|
||||||
import javafx.concurrent.Service;
|
import javafx.concurrent.Service;
|
||||||
import javafx.concurrent.Task;
|
import javafx.concurrent.Task;
|
||||||
|
@ -10,10 +11,12 @@ import javafx.concurrent.Task;
|
||||||
public class ButtonClickService extends Service<Boolean> {
|
public class ButtonClickService extends Service<Boolean> {
|
||||||
|
|
||||||
private final BooleanProperty startButtonDisabled;
|
private final BooleanProperty startButtonDisabled;
|
||||||
|
private final Map<String, String> properties;
|
||||||
private Algorithm.Type type;
|
private Algorithm.Type type;
|
||||||
|
|
||||||
public ButtonClickService(final Algorithm.Type algorithmType, final BooleanProperty startButtonDisabled) {
|
public ButtonClickService(final Algorithm.Type algorithmType, final Map<String, String> properties, final BooleanProperty startButtonDisabled) {
|
||||||
this.startButtonDisabled = startButtonDisabled;
|
this.startButtonDisabled = startButtonDisabled;
|
||||||
|
this.properties = properties;
|
||||||
this.type = algorithmType;
|
this.type = algorithmType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +28,7 @@ public class ButtonClickService extends Service<Boolean> {
|
||||||
protected Boolean call() throws Exception {
|
protected Boolean call() throws Exception {
|
||||||
try {
|
try {
|
||||||
Line line = Presenter.getInstance()
|
Line line = Presenter.getInstance()
|
||||||
.executeAlgorithmByType(type, startButtonDisabled);
|
.executeAlgorithmByType(type, properties, startButtonDisabled);
|
||||||
if (line != null) {
|
if (line != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue