// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.JunctionChecker.commandlineinterface;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import javax.xml.stream.XMLStreamException;
import org.openstreetmap.josm.plugins.JunctionChecker.connectedness.StrongConnectednessCalculator;
import org.openstreetmap.josm.plugins.JunctionChecker.converting.ChannelDigraphBuilder;
import org.openstreetmap.josm.plugins.JunctionChecker.datastructure.Channel;
import org.openstreetmap.josm.plugins.JunctionChecker.filter.ExecuteFilter;
import org.openstreetmap.josm.plugins.JunctionChecker.junctionchecking.JunctionChecker;
import org.openstreetmap.josm.plugins.JunctionChecker.reader.OSMXMLReader;
import org.openstreetmap.josm.plugins.JunctionChecker.reader.XMLFilterReader;
import org.openstreetmap.josm.plugins.JunctionChecker.writing.OSMXMLWriter;
public final class CLI {
/**
* Die Klasse ist zum Erstellen statistischer Tests, oder zur Erzeugung einer Channel-Digraph-XML-Datei
*/
public static void main(String[] args) {
String inputosm = "";
String outputosm = "";
int maxchannelsearch = 0;
int ticks = 0;
int n = 0;
int runs = 0;
final String WAYFILTERFILE = "/resources/xml/waysfilter.xml";
if (args.length != 6) {
System.out.println("Parameter:\n inputosm (osmxml) \n outputchannelosm (outputosmxml) \n maxchannelsearch (wieviele channel sollen max. überprüft werdne) \n ticks (schrittweite) \n n (n-wege-kreuzung) \n durchläufe (wieviele durchläufe pro suchdurchgang)");
return;
} else {
inputosm = args[0];
outputosm = args[1];
maxchannelsearch = Integer.parseInt(args[2]);
ticks = Integer.parseInt(args[3]);
n = Integer.parseInt(args[4]);
runs = Integer.parseInt(args[5]);
}
// XML datei einlesen
File file = new File(inputosm);
OSMXMLReader xmlreader = new OSMXMLReader(file);
xmlreader.parseXML();
// Filter mit gewünschten Ways laden
XMLFilterReader reader = new XMLFilterReader(
WAYFILTERFILE);
reader.parseXML();
// gewünschte Ways filtern
ExecuteFilter ef = new ExecuteFilter(reader.getFilters(), xmlreader
.getOSMGraph());
ef.filter();
// ChannelDiGraphen erzeugen
ChannelDigraphBuilder cdgb = new ChannelDigraphBuilder(ef.getOutgoinggraph());
cdgb.buildChannelDigraph();
// DiGraph "versiegeln"
//DiGraphSealer sealer = new DiGraphSealer(cdgb.getDigraph(), cdgb
// .getNewid());
//sealer.sealingGraph();
StrongConnectednessCalculator scc = new StrongConnectednessCalculator(cdgb.getDigraph());
scc.calculateSCC();
//System.out.println(scc.showNotstronglyConnectednessParts());
if (maxchannelsearch == 0) {
OSMXMLWriter oxw = new OSMXMLWriter(outputosm, cdgb.getDigraph());
try {
oxw.writeXML();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
;
System.out.println("OSMXML erzeugt, breche an dieser Stelle ab");
return;
}
JunctionChecker jc = new JunctionChecker(cdgb.getDigraph(), n);
ArrayList<Channel> subset = new ArrayList<>();
Channel seed = new Channel();
Channel vorChannel;
Channel tempChannel;
boolean isIn = false;
int jcf;
long measuredIterateThroughTime = 0;
long measuredGenerateSubColumnTime = 0;
long measuredTime = 0;
long start;
//Unzusammenhängenden Teilgraph erzeugen
/*
for (int i = 6; i < maxchannelsearch; i = i + ticks) {
//diff = 0;
start = System.currentTimeMillis();
jcf = 0;
//System.out.println("maxchannel: " + i);
for (int j = 0; j < runs; j++) {
//System.out.println("run: " +j);
subset.clear();
for (int j2 = 0; j2 <= i; j2++) {
subset.add(cdgb.getDigraph()
.getChannelAtPosition(
(int) ((cdgb.getDigraph().getChannels()
.size()) * Math.random())));
}
//System.out.println("jc gestartet");
start = System.currentTimeMillis();
jc.junctionSearch(subset);
measuredTime += (System.currentTimeMillis() - start);
//System.out.println("jc beendet");
//diff = diff + (System.currentTimeMillis() - start);
measuredIterateThroughTime += jc.getMeasuredIterateTime();
measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime();
}
System.out.println("Channels: " + (i) + " Time(Iterate): " + (measuredIterateThroughTime/runs) + " Time(Generate): " + (measuredGenerateSubColumnTime/runs) +" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf);
}*/
//Zusammenhängenden Teilgraph erzeugen
for (int i = 5; i < maxchannelsearch; i = i + ticks) {
measuredIterateThroughTime = 0;
measuredGenerateSubColumnTime = 0;
measuredTime = 0;
jcf = 0;
//System.out.println("maxchannel: " + i);
for (int j = 0; j < runs; j++) {
//System.out.println("run: " +j);
subset.clear();
do {
seed = cdgb.getDigraph()
.getChannelAtPosition(
(int) ((cdgb.getDigraph().getChannels()
.size()) * Math.random()));
}
while (!seed.isStrongConnected());
subset.add(seed);
//System.out.println("Seed: " + seed.getNewid());
vorChannel = seed;
for (int k = 0; k < i - 1; k++) {
isIn = false;
do {
tempChannel = getNeighbourChannel(vorChannel);
if (!subset.contains(tempChannel)) {
subset.add(tempChannel);
//System.out.println("zugefügt: " + tempChannel.getNewid());
seed = tempChannel;
isIn = true;
} else {
vorChannel = tempChannel;
isIn = false;
}
} while (isIn == false);
}
start = System.currentTimeMillis();
jc.junctionSearch(subset);
measuredTime += (System.currentTimeMillis() - start);
//System.out.println("jc beendet");
measuredIterateThroughTime += jc.getMeasuredIterateTime();
measuredGenerateSubColumnTime += jc.getMeasuredGenerateTime();
jcf = jcf + jc.getJunctions().size();
}
System.out.println("Channels: " + (i) +
" Time(Iterate): " + (measuredIterateThroughTime/runs) +
" Time(Generate): " + (measuredGenerateSubColumnTime/runs) +
" Time(overall): "+ (measuredTime/runs) + " junctionsfound: " + jcf);
}
}
private static Channel getNeighbourChannel(Channel seedChannel) {
if (Math.random() < 0.5) {
if (seedChannel.getPredChannels().size() >= 1) {
return seedChannel.getPredChannels().get((int) (seedChannel.getPredChannels().size() * Math.random()));
} else return seedChannel;
} else {
if (seedChannel.getLeadsTo().size() >= 1) {
return seedChannel.getLeadsTo().get((int) (seedChannel.getLeadsTo().size() * Math.random())).getToChannel();
} else return seedChannel;
}
}
}