/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import ilog.views.sdm.IlvSDMModel;
import ilog.views.sdm.model.IlvDefaultSDMModel;
import ilog.views.sdm.util.IlvXMLConnector;
import ilog.views.util.IlvProductUtil;
/**
* This class generates SDM data files of various sizes (the size is a power of
* ten).
*/
public class GraphData {
private String dataDir = "data/";
private final double horizontalSpacing = 100;
private final double verticalSpacing = 100;
private boolean subgraphs;
private boolean intergraphLinks;
private int nodeCount;
private int linkCount;
/**
* The main method generates graph files between 10 and 10000 nodes.
*/
public static void main(String[] args) {
// This sample uses JViews Diagrammer features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Diagrammer Deployment license.
IlvProductUtil.DeploymentLicenseRequired(IlvProductUtil.JViews_Diagrammer_Deployment);
GraphData data = new GraphData();
try {
for (int size = 1; size <= 5; size++) {
data.generateGraphFile(size, false, false);
data.generateGraphFile(size, true, false);
data.generateGraphFile(size, true, true);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Generates a graph file.
*/
public void generateGraphFile(int graphSize, boolean subgraphs, boolean intergraphLinks) throws IOException {
String filename = dataDir + (int) Math.pow(10, graphSize) + (subgraphs ? "s" : "") + (intergraphLinks ? "i" : "")
+ ".xml";
// System.out.println("Generating " + filename + " ...");
try {
new File(dataDir).mkdir();
} catch (Exception t) {
}
IlvSDMModel model = new IlvDefaultSDMModel();
createGraph(model, graphSize, subgraphs, intergraphLinks);
IlvXMLConnector xmlConnector = new IlvXMLConnector();
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
xmlConnector.writeXML(model, writer, null, null);
writer.close();
}
/**
* Creates a graph of a given power of ten, e.g.: power = 2 -> graph of size
* 100.
*/
public IlvSDMModel createGraph(IlvSDMModel model, int graphSize, boolean subgraphs, boolean intergraphLinks) {
this.subgraphs = subgraphs;
this.intergraphLinks = intergraphLinks;
double width = Math.pow(6, graphSize) * horizontalSpacing;
double height = Math.pow(3, graphSize) * verticalSpacing * graphSize;
nodeCount = 0;
linkCount = 0;
createGraph(model, null, graphSize, 0, 0, width, height, "type0");
return model;
}
/**
* Creates a graph of a given power of ten, e.g.: power = 2 -> graph of size
* 100. This is the recursive version.
*/
private Graph createGraph(IlvSDMModel model, Object parent, int power, double x, double y, double width, double height,
String type) {
Graph graph = new Graph();
if (power == 0) {
Object node = addNode(model, parent, x, y, type);
graph.in = node;
graph.out1 = node;
graph.out2 = node;
graph.out3 = node;
} else {
double w = width / 6;
double h = height / 3;
if (subgraphs) {
parent = addNode(model, parent, x + width / 2, y + height / 2, "subgraph");
}
Graph graph0 = createGraph(model, parent, power - 1, x + width / 2, y, w, h, "type0");
Graph graph1 = createGraph(model, parent, power - 1, x + width / 6, y + h, w, h, "type1");
Graph graph2 = createGraph(model, parent, power - 1, x + width / 2, y + h, w, h, "type2");
Graph graph3 = createGraph(model, parent, power - 1, x + width / 2 + 2 * width / 6, y + h, w, h, "type3");
Graph graph4 = createGraph(model, parent, power - 1, x + width / 12, y + 2 * h, w, h, "type4");
Graph graph5 = createGraph(model, parent, power - 1, x + 3 * width / 12, y + 2 * h, w, h, "type5");
Graph graph6 = createGraph(model, parent, power - 1, x + 5 * width / 12, y + 2 * h, w, h, "type6");
Graph graph7 = createGraph(model, parent, power - 1, x + 7 * width / 12, y + 2 * h, w, h, "type7");
Graph graph8 = createGraph(model, parent, power - 1, x + 9 * width / 12, y + 2 * h, w, h, "type8");
Graph graph9 = createGraph(model, parent, power - 1, x + 11 * width / 12, y + 2 * h, w, h, "type9");
addLink(model, parent, graph0.out1, graph1.in, "type1");
addLink(model, parent, graph0.out2, graph2.in, "type2");
addLink(model, parent, graph0.out3, graph3.in, "type3");
addLink(model, parent, graph1.out1, graph4.in, "type4");
addLink(model, parent, graph1.out3, graph5.in, "type5");
addLink(model, parent, graph2.out1, graph6.in, "type6");
addLink(model, parent, graph2.out3, graph7.in, "type7");
addLink(model, parent, graph3.out1, graph8.in, "type8");
addLink(model, parent, graph3.out3, graph9.in, "type9");
if (!subgraphs || intergraphLinks) {
graph.in = graph0.in;
graph.out1 = graph4.out1;
graph.out2 = graph6.out3;
graph.out3 = graph9.out3;
} else {
graph.in = parent;
graph.out1 = parent;
graph.out2 = parent;
graph.out3 = parent;
}
}
return graph;
}
/**
* A utility class that represents the input and ouput nodes of a graph.
*/
private class Graph {
private Object in;
private Object out1, out2, out3;
}
/**
* Adds a node.
*/
private Object addNode(IlvSDMModel model, Object parent, double x, double y, String type) {
Object node = model.createNode("node");
model.setID(node, "node" + nodeCount);
model.setObjectProperty(node, "x", new Double(x));
model.setObjectProperty(node, "y", new Double(y));
model.setObjectProperty(node, "name", "Node " + nodeCount);
model.setObjectProperty(node, "type", type);
model.addObject(node, parent, null);
nodeCount++;
return node;
}
/**
* Adds a link.
*/
private Object addLink(IlvSDMModel model, Object parent, Object from, Object to, String type) {
Object link = model.createLink("link");
model.setID(link, "link" + linkCount);
model.setFrom(link, from);
model.setTo(link, to);
model.setObjectProperty(link, "type", type);
model.addObject(link, parent, null);
linkCount++;
return link;
}
/**
* Return the number of nodes in the last created graph.
*/
public int getNodeCount() {
return nodeCount;
}
/**
* Return the number of links in the last created graph.
*/
public int getLinkCount() {
return linkCount;
}
}