/******************************************************************************* * Copyright (C) 2014 Stefan Schroeder * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package jsprit.analysis.toolbox; import org.graphstream.graph.Graph; import org.graphstream.stream.Sink; import org.graphstream.stream.file.FileSource; import org.graphstream.stream.file.FileSourceDGS; import org.graphstream.ui.view.Viewer; import java.io.IOException; public class AlgorithmEventsViewer { private static class DelayContainer { long delay = 0; } public static class DelaySink implements Sink { private DelayContainer delayContainer; private long delay = 2; private long ruinDelay = 2; private long recreateDelay = 2; public DelaySink(DelayContainer delayContainer) { this.delayContainer = delayContainer; } public void setRuinDelay(long ruinDelay) { this.ruinDelay = ruinDelay; } public void setRecreateDelay(long recreateDelay) { this.recreateDelay = recreateDelay; } public void setDelay(long delay) { this.delay = delay; } @Override public void graphAttributeAdded(String sourceId, long timeId, String attribute, Object value) { } @Override public void graphAttributeChanged(String sourceId, long timeId, String attribute, Object oldValue, Object newValue) { } @Override public void graphAttributeRemoved(String sourceId, long timeId, String attribute) { } @Override public void nodeAttributeAdded(String sourceId, long timeId, String nodeId, String attribute, Object value) { } @Override public void nodeAttributeChanged(String sourceId, long timeId, String nodeId, String attribute, Object oldValue, Object newValue) { } @Override public void nodeAttributeRemoved(String sourceId, long timeId, String nodeId, String attribute) { } @Override public void edgeAttributeAdded(String sourceId, long timeId, String edgeId, String attribute, Object value) { } @Override public void edgeAttributeChanged(String sourceId, long timeId, String edgeId, String attribute, Object oldValue, Object newValue) { } @Override public void edgeAttributeRemoved(String sourceId, long timeId, String edgeId, String attribute) { } @Override public void nodeAdded(String sourceId, long timeId, String nodeId) { } @Override public void nodeRemoved(String sourceId, long timeId, String nodeId) { } @Override public void edgeAdded(String sourceId, long timeId, String edgeId, String fromNodeId, String toNodeId, boolean directed) { } @Override public void edgeRemoved(String sourceId, long timeId, String edgeId) { } @Override public void graphCleared(String sourceId, long timeId) { } @Override public void stepBegins(String sourceId, long timeId, double step) { if (step == AlgorithmEventsRecorder.RECREATE) { delayContainer.delay = recreateDelay; } if (step == AlgorithmEventsRecorder.RUIN) { delayContainer.delay = ruinDelay; } else if (step == AlgorithmEventsRecorder.CLEAR_SOLUTION) { delayContainer.delay = delay; } else if (step == AlgorithmEventsRecorder.BEFORE_RUIN_RENDER_SOLUTION) { delayContainer.delay = delay; } } } private double zoomFactor; private double scaling = 1.0; private long delayRecreation = 5; private long delayRuin = 5; private long delay = 2; public void setRecreationDelay(long delay_in_ms) { this.delayRecreation = delay_in_ms; } public void setRuinDelay(long delay_in_ms) { this.delayRuin = delay_in_ms; } public void display(String dgsFile) { System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer"); Graph graph = GraphStreamViewer.createMultiGraph("g", GraphStreamViewer.StyleSheets.BLUE_FOREST); Viewer viewer = graph.display(); viewer.disableAutoLayout(); FileSource fs = new FileSourceDGS(); fs.addSink(graph); DelayContainer delayContainer = new DelayContainer(); DelaySink delaySink = new DelaySink(delayContainer); delaySink.setDelay(delay); delaySink.setRecreateDelay(delayRecreation); delaySink.setRuinDelay(delayRuin); fs.addSink(delaySink); try { fs.begin(dgsFile); while (fs.nextEvents()) { sleep(delayContainer.delay); } } catch (IOException e) { e.printStackTrace(); } try { fs.end(); } catch (IOException e) { e.printStackTrace(); } finally { fs.removeSink(graph); } } public static void main(String[] args) throws IOException { AlgorithmEventsViewer viewer = new AlgorithmEventsViewer(); viewer.setRuinDelay(10); viewer.setRecreationDelay(5); viewer.display("output/events.dgs.gz"); } private static void sleep(long renderDelay_in_ms2) { try { Thread.sleep(renderDelay_in_ms2); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }