瀏覽代碼

GUI ListPlot

Willi Zschiebsch 4 年之前
父節點
當前提交
18e1de676b

+ 1 - 1
src/main/java/mdd/client/GUIEventHandler.java

@@ -39,7 +39,7 @@ public class GUIEventHandler {
     }
 
     public void publishEvent(Integer level, String event, JSONObject args){
-        //System.out.println("EventHandler: " + event + " | " + args.toString());
+        System.out.println("EventHandler: " + event + " | " + args.toString());
         Integer start_key = _priorities.ceilingKey(level);
         if (start_key != null){
             for (Map.Entry<Integer,Vector<IGUIEventClient>> entry : _priorities.entrySet()){

+ 13 - 17
src/main/java/mdd/client/Optimizer.java

@@ -7,12 +7,18 @@ import javafx.scene.Scene;
 import javafx.scene.control.*;
 import javafx.scene.layout.VBox;
 import javafx.stage.Stage;
+import mdd.client.optimization.DataModel;
+import mdd.client.optimization.PDiagramm;
+import mdd.client.optimization.PList;
 import mdd.client.optimization.Permutation;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 
 public class Optimizer extends Stage implements IGUIEventClient {
-private Group generations = new Group();
+private DataModel data = new DataModel();
+private PList pList = new PList(data);
+private PDiagramm pDiagramm = new PDiagramm(data);
+
 protected GUIEventHandler _eventHandler;
 private ScrollPane scrollpane = new ScrollPane();
 
@@ -27,20 +33,20 @@ private ScrollPane scrollpane = new ScrollPane();
 
         MenuBar menuBar = new MenuBar();
 
-        scrollpane.setContent(generations);
+        scrollpane.setContent(pList);
         // --- Menu View
         Menu menuView = new Menu("View");
         MenuItem mi_list = new MenuItem("List");
         mi_list.setOnAction(new EventHandler<ActionEvent>() {
             public void handle(ActionEvent t) {
-                scrollpane.setContent(generations);
+                scrollpane.setContent(pList);
             }
         });
 
         MenuItem mi_dia = new MenuItem("Diagramm");
         mi_list.setOnAction(new EventHandler<ActionEvent>() {
             public void handle(ActionEvent t) {
-                scrollpane.setContent(generations);
+                scrollpane.setContent(pDiagramm);
             }
         });
 
@@ -75,19 +81,9 @@ private ScrollPane scrollpane = new ScrollPane();
                     if (jobj.containsKey("permutations")){
                         JSONArray indis= (JSONArray)jobj.get("permutations");
                         long lgen = (long)jobj.get("step");
-                        if (generations.getChildren().size() ==  lgen){
-                            VBox gen = new VBox();
-                            gen.getChildren().add(new Label("Step: " + lgen));
-                            gen.setSpacing(10);
-                            for (int i = 0; i < indis.size(); ++i){
-                                gen.getChildren().add(new Permutation(lgen, (JSONObject)indis.get(i)));
-                            }
-                            generations.getChildren().add(gen);
-                        }else{
-                            ((Group)generations.getChildren().get((int)lgen)).getChildren().clear();
-                            for (int i = 0; i < indis.size(); ++i){
-                                ((Group)generations.getChildren().get((int)lgen)).getChildren().add(new Permutation(lgen, (JSONObject)indis.get(i)));
-                            }
+                        for (int i = 0; i < indis.size(); ++i){
+                            //TODO clear when start again
+                            data.add(0, new Permutation(lgen, (JSONObject)indis.get(i)));
                         }
                     }else if(jobj.containsKey("best")){
 

+ 49 - 0
src/main/java/mdd/client/optimization/DataModel.java

@@ -0,0 +1,49 @@
+package mdd.client.optimization;
+
+import java.util.ArrayList;
+
+public class DataModel extends ArrayList<DataTable> implements IPlotCallback{
+    private ArrayList<IPlotCallback> _plotter = new ArrayList<>();
+
+
+    public DataModel(){
+
+    }
+
+    public void addPlotter(IPlotCallback plotter){
+        _plotter.add(plotter);
+    }
+
+    public void removePlotter(IPlotCallback plotter){
+        _plotter.remove(plotter);
+    }
+
+    public void add(int table, IData data){
+        while (size() <= table){
+            add(new DataTable(this, size()));
+        }
+        get(table).add(data);
+    }
+
+    @Override
+    public void callback_change(int table, int data, int key){
+        for (int i = 0; i < _plotter.size(); ++i){
+            _plotter.get(i).callback_change(table, data, key);
+        }
+    }
+
+    @Override
+    public void callback_newKey(int table, String key){
+        for (int i = 0; i < _plotter.size(); ++i){
+            _plotter.get(i).callback_newKey(table, key);
+        }
+    }
+
+    @Override
+    public void callback_addData(int table, int data){
+        for (int i = 0; i < _plotter.size(); ++i){
+            _plotter.get(i).callback_addData(table, data);
+        }
+    }
+
+}

+ 43 - 0
src/main/java/mdd/client/optimization/DataTable.java

@@ -0,0 +1,43 @@
+package mdd.client.optimization;
+
+import java.util.ArrayList;
+import java.util.Vector;
+
+public class DataTable extends ArrayList<IData>{
+    private int _id;
+    private DataModel _model;
+    private Vector<String> _keys = new Vector<>();
+
+    public DataTable(DataModel model, int id){
+        super();
+        _model = model;
+        _id = id;
+    }
+
+    public Vector<String> getKeys(){
+        return _keys;
+    }
+
+    public int addColumn(String key){
+        for(int i = 0; i < _keys.size(); ++i){
+            if (_keys.get(i).equals(key)){
+                return i;
+            }
+        }
+        _keys.add(key);
+        _model.callback_newKey(_id, key);
+        return _keys.size()-1;
+    }
+
+    public boolean add(IData data){
+        boolean ret = super.add(data);
+        int column = size()-1;
+        data.setDataModel(this, column);
+        _model.callback_addData(_id, column);
+        return  ret;
+    }
+
+    public void callback_change(int data, int key){
+        _model.callback_change(_id, data, key);
+    }
+}

+ 13 - 0
src/main/java/mdd/client/optimization/IData.java

@@ -0,0 +1,13 @@
+package mdd.client.optimization;
+
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.Vector;
+
+public interface IData {
+    void setDataModel(DataTable model, int row);
+    Vector<String> getKeys();
+    Vector<Integer> getIDs();
+    Double getValue(int column);
+    void setValue(String key, Double val);
+}

+ 0 - 5
src/main/java/mdd/client/optimization/IPPlot.java

@@ -1,5 +0,0 @@
-package mdd.client.optimization;
-
-public interface IPPlot {
-    void update(Permutation per);
-}

+ 7 - 0
src/main/java/mdd/client/optimization/IPlotCallback.java

@@ -0,0 +1,7 @@
+package mdd.client.optimization;
+
+public interface IPlotCallback {
+    void callback_change(int table, int data, int key);
+    void callback_addData(int table, int data);
+    void callback_newKey(int table, String key);
+}

+ 33 - 1
src/main/java/mdd/client/optimization/PDiagramm.java

@@ -1,4 +1,36 @@
 package mdd.client.optimization;
 
-public class PDiagramm {
+import javafx.scene.layout.HBox;
+
+public class PDiagramm extends HBox implements IPlotCallback {
+    private DataModel _data;
+
+    private int _table = 0;
+
+    public PDiagramm(DataModel data){
+        _data = data;
+        _data.addPlotter(this);
+        setSpacing(30);
+    }
+
+    @Override
+    public void callback_change(int table, int data, int key) {
+        if (table != _table){
+            return;
+        }
+    }
+
+    @Override
+    public void callback_addData(int table, int data) {
+        if (table != _table){
+            return;
+        }
+    }
+
+    @Override
+    public void callback_newKey(int table, String key) {
+        if (table != _table){
+            return;
+        }
+    }
 }

+ 63 - 5
src/main/java/mdd/client/optimization/PList.java

@@ -1,13 +1,71 @@
 package mdd.client.optimization;
 
-import javafx.scene.Group;
+import javafx.scene.control.Label;
 import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
 
-public class PList extends HBox {
-    private Group _pers = new Group();
+import java.util.Vector;
 
-    public PList(Group permutation){
-        _pers = permutation;
+public class PList extends HBox implements IPlotCallback {
+    private DataModel _data;
+
+    private int _table = 0;
+    //TODO check and do something if data gets cleared
+    public PList(DataModel data){
+        _data = data;
+        _data.addPlotter(this);
         setSpacing(30);
+        if (_data.size() > _table){
+            for (int i = 0; i < _data.get(_table).size(); ++i){
+                insertData(_data.get(_table).get(i));
+            }
+        }
+    }
+
+    void insertData(IData data){
+        if (data instanceof Permutation){
+            Permutation per = (Permutation)data;
+            while(getChildren().size() <= per.step){
+                VBox vBox = new VBox();
+                vBox.setSpacing(10f);
+                vBox.getChildren().add(new Label("step: " + getChildren().size()));
+                getChildren().add(vBox);
+            }
+            ((VBox)getChildren().get((int) per.step)).getChildren().add(new PListElement(per));
+        }
+    }
+
+    @Override
+    public void callback_change(int table, int data, int key) {
+        if (table != _table){
+            return;
+        }
+        IData idata = _data.get(_table).get(data);
+        if (idata instanceof Permutation){
+            Permutation pdata = (Permutation) idata;
+            int counter  = 0;
+            for (int i = 0; i < pdata.step; ++i){
+                counter += ((VBox)getChildren().get(i)).getChildren().size();
+                counter -= 1;
+            }
+            VBox vBox = ((VBox)getChildren().get((int) pdata.step));
+            PListElement plElem = (PListElement) vBox.getChildren().get(data-counter+1);
+            plElem.configure(pdata);
+        }
+    }
+
+    @Override
+    public void callback_addData(int table, int data) {
+        if (table != _table){
+            return;
+        }
+        insertData(_data.get(_table).get(data));
+    }
+
+    @Override
+    public void callback_newKey(int table, String key) {
+        if (table != _table){
+            return;
+        }
     }
 }

+ 127 - 0
src/main/java/mdd/client/optimization/PListElement.java

@@ -0,0 +1,127 @@
+package mdd.client.optimization;
+
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Bounds;
+import javafx.scene.Group;
+import javafx.scene.control.Label;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Rectangle;
+import mdd.client.GUIEventHandler;
+import mdd.client.IGUIEventClient;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.Vector;
+
+public class PListElement extends Group implements IGUIEventClient, ChangeListener<Bounds> {
+    private GridPane header = new GridPane();
+    private VBox dna = new VBox();
+    private Rectangle titlebar;
+    private Rectangle background;
+
+    protected GUIEventHandler _eventHandler;
+
+    Label _status = new Label();
+    Label _fitness = new Label();
+    Label _time = new Label();
+
+    public PListElement(Permutation per){
+        _eventHandler = GUIEventHandler.getEventHandler();
+        _eventHandler.addEventListener(this, 5);
+        setFocusTraversable(true);
+        dna.setSpacing(10);
+        dna.setTranslateX(5);
+        dna.setTranslateY(30);
+
+        titlebar = new Rectangle(0.0f, 0.0f, 1.0, 20f);
+        titlebar.setArcWidth(10.0f);
+        titlebar.setArcHeight(10.0f);
+
+        //background = new Rectangle(0.0f, 0.0f, 150-20, 150 + 40);
+        background = new Rectangle(0.0f, 0.0f, 1.0, 1.0);
+        background.setArcWidth(10.0f);
+        background.setArcHeight(10.0f);
+        background.setFill(Color.GRAY);
+        header.setTranslateX(10);
+        Color color = Color.DARKCYAN;
+        titlebar.setFill(color);
+
+        header.add(_status,0,0);
+        header.add(_fitness,1,0);
+        header.add(_time,2,0);
+
+        header.setHgap(5.0f);
+
+        configure(per);
+        getChildren().clear();
+        getChildren().addAll( background, titlebar, header, dna);
+        dna.layoutBoundsProperty().addListener(this);
+        header.layoutBoundsProperty().addListener(this);
+    }
+
+    protected void configure(Permutation per){
+        Vector<String> keys = per.getKeys();
+        Vector<Integer> ids = per.getIDs();
+        for (int i = 0; i < keys.size(); ++i){
+            String key = keys.get(i);
+            if (ids.get(i) != null) {
+                int id = ids.get(i);
+                if (key.equals("status")) {
+                    switch (per.getValue(id).shortValue()) {
+                        case -1:
+                            _status.setText("status: error");
+                            break;
+                        case 0:
+                        case 1:
+                            _status.setText("status: ok");
+                            break;
+                        default:
+                            _status.setText("status: unknown " + per.getValue(id).shortValue());
+                    }
+                }
+                if (key.equals("fitness")) {
+                    _fitness.setText("fitness: " + per.getValue(id).toString());
+                }
+                if (key.equals("time")) {
+                    _time.setText("time: " + per.getValue(id).toString());
+                }
+            }
+        }
+        if (dna.getChildren().isEmpty()){
+            for (int j = 0; j < per.jdna.size(); ++j){
+                dna.getChildren().add(new Label(per.jdna.get(j).toString()));
+            }
+        }
+    }
+
+    @Override
+    public void changed(ObservableValue<? extends Bounds> observableValue, Bounds oldValue, Bounds newValue) {
+        double width = header.getWidth();
+        if (newValue.getWidth() > width){
+            width =newValue.getWidth();
+            width += 10;
+        }else{
+            width += 10;
+            width +=10;
+        }
+        titlebar.setWidth(width);
+        titlebar.setHeight(20.0f);
+        background.setWidth(width);
+        background.setHeight(dna.getTranslateY()+dna.getHeight()+10);
+    }
+
+    @Override
+    public void processGUIEvent(String event, JSONObject args) {
+
+    }
+
+    @Override
+    public void close() throws Exception {
+
+    }
+}

+ 83 - 77
src/main/java/mdd/client/optimization/Permutation.java

@@ -1,111 +1,117 @@
 package mdd.client.optimization;
 
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
-import javafx.geometry.Bounds;
-import javafx.scene.Group;
-import javafx.scene.control.Label;
-import javafx.scene.layout.GridPane;
-import javafx.scene.layout.VBox;
-import javafx.scene.paint.Color;
-import javafx.scene.shape.Rectangle;
 import mdd.client.GUIEventHandler;
 import mdd.client.IGUIEventClient;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 
-public class Permutation extends Group implements IGUIEventClient, ChangeListener<Bounds> {
-    private GridPane header = new GridPane();
-    private VBox dna = new VBox();
-    private Rectangle titlebar;
-    private Rectangle background;
+import java.util.*;
 
+public class Permutation implements IData, IGUIEventClient {
+    private Vector<String> _skeys = new Vector<>();
+    private Vector<Integer> _ikeys = new Vector<>();
+    private Vector<Double> _vals = new Vector<>();
     protected GUIEventHandler _eventHandler;
-    protected JSONObject _jprocessor;
-    protected JSONArray _dna;
-    protected long _gen;
+    public JSONObject jprocessor;
+    public JSONArray jdna;
+    public long step;
 
-    Label _status = new Label();
-    Label _fitness = new Label();
-    Label _time = new Label();
+    private DataTable _model;
+    private int _row;
 
-    /*
-    staus: " " | fitness: | time:
-    dna:
-     */
     public Permutation(long gen, JSONObject json){
-        _gen = gen;
+        step = gen;
         _eventHandler = GUIEventHandler.getEventHandler();
         _eventHandler.addEventListener(this, 5);
-        setFocusTraversable(true);
-        dna.setSpacing(10);
-        dna.setTranslateX(5);
-        dna.setTranslateY(30);
+        setValue("step", (double)gen);
+        configure(json);
+    }
 
-        titlebar = new Rectangle(0.0f, 0.0f, 1.0, 20f);
-        titlebar.setArcWidth(10.0f);
-        titlebar.setArcHeight(10.0f);
+    @Override
+    public void setDataModel(DataTable table, int row){
+        _model = table;
+        _row = row;
+        for (int i = 0; i < _skeys.size(); ++i){
+            _ikeys.set(i, _model.addColumn(_skeys.get(i)));
+        }
+    }
 
-        //background = new Rectangle(0.0f, 0.0f, 150-20, 150 + 40);
-        background = new Rectangle(0.0f, 0.0f, 1.0, 1.0);
-        background.setArcWidth(10.0f);
-        background.setArcHeight(10.0f);
-        background.setFill(Color.GRAY);
-        header.setTranslateX(10);
-        Color color = Color.DARKCYAN;
-        titlebar.setFill(color);
+    @Override
+    public Vector<String> getKeys(){
+        return _skeys;
+    }
 
-        header.add(_status,0,0);
-        header.add(_fitness,1,0);
-        header.add(_time,2,0);
+    @Override
+    public Vector<Integer> getIDs(){
+        return _ikeys;
+    }
 
-        header.setHgap(5.0f);
+    @Override
+    public Double getValue(int column){
+        for (int i = 0; i < _skeys.size(); ++i){
+            if (_ikeys.get(i).equals(column)){
+                return _vals.get(i);
+            }
+        }
+        return null;
+    }
 
-        configure(json);
-        getChildren().clear();
-        getChildren().addAll( background, titlebar, header, dna);
-        dna.layoutBoundsProperty().addListener(this);
-        header.layoutBoundsProperty().addListener(this);
+    @Override
+    public void setValue(String key, Double val){
+        for (int i = 0; i < _skeys.size(); ++i){
+            if (_skeys.get(i).equals(key)){
+                if (!_vals.get(i).equals(val)){
+                    _vals.set(i,val);
+                    if (_model != null){
+                        _model.callback_change(_row, _ikeys.get(i));
+                    }
+                }
+                return;
+            }
+        }
+        //key doesnt exist
+        _skeys.add(key);
+        _ikeys.add(null);
+        _vals.add(val);
+        if (_model != null){
+            _ikeys.set(_ikeys.size()-1, _model.addColumn(key));
+            _model.callback_change(_row, _ikeys.lastElement());
+        }
     }
 
     protected void configure(JSONObject json){
         if(json.containsKey("status")){
-            _status.setText("status: "+ json.get("status").toString());
+            switch(json.get("status").toString()){
+                case "ok":
+                    setValue("status", 1.0);
+                    break;
+                case "error":
+                    setValue("status", -1.0);
+                    break;
+                default:
+                    setValue("status", 0.0);
+            }
         }
         if(json.containsKey("fitness")){
-            _fitness.setText("fitness: "+ json.get("fitness").toString());
+            setValue("fitness", (double)json.get("fitness"));
         }
         if(json.containsKey("time")){
-            _time.setText("time: "+ json.get("time").toString());
+            setValue("time", (double)json.get("time"));
         }
-        if (_dna == null){
+        if (jdna == null){
             if(json.containsKey("dna")){
-                dna.getChildren().clear();
-                _dna = (JSONArray)json.get("dna");
-                for (int i = 0; i < _dna.size(); ++i){
-                    dna.getChildren().add(new Label(_dna.get(i).toString()));
+                jdna = (JSONArray)json.get("dna");
+                for (int i = 0; i < jdna.size(); ++i){
+                    JSONArray params = (JSONArray) jdna.get(i);
+                    for (int j = 0; j < params.size(); ++j){
+                        setValue("param["+i+","+j+"]", (double) params.get(j));
+                    }
                 }
             }
         }
         if(json.containsKey("processor")){
-            _jprocessor = (JSONObject) json.get("processor");
-        }
-    }
-
-    @Override
-    public void changed(ObservableValue<? extends Bounds> observableValue, Bounds oldValue, Bounds newValue) {
-        double width = header.getWidth();
-        if (newValue.getWidth() > width){
-            width =newValue.getWidth();
-            width += 10;
-        }else{
-            width += 10;
-            width +=10;
+            jprocessor = (JSONObject) json.get("processor");
         }
-        titlebar.setWidth(width);
-        titlebar.setHeight(20.0f);
-        background.setWidth(width);
-        background.setHeight(dna.getTranslateY()+dna.getHeight()+10);
     }
 
     @Override
@@ -132,7 +138,7 @@ public class Permutation extends Group implements IGUIEventClient, ChangeListene
             if (!jobj.containsKey("step")) {
                 return;
             }
-            if (_gen!=(long)jobj.get("step")){
+            if (step !=(long)jobj.get("step")){
                 return;
             }
             if (!jobj.containsKey("permutation")) {
@@ -140,10 +146,10 @@ public class Permutation extends Group implements IGUIEventClient, ChangeListene
             }
             JSONObject jind = (JSONObject)jobj.get("permutation");
             //System.out.println("Permutation: " + _dna.toString());
-            if (!_dna.equals((JSONArray)jind.get("dna"))) {
+            if (!jdna.equals((JSONArray)jind.get("dna"))) {
                 return;
             }else{
-                if (!_dna.toString().equals(jind.get("dna").toString())){
+                if (!jdna.toString().equals(jind.get("dna").toString())){
                     System.out.println("It happened!");
                 }
                 configure(jind);