Skip to content
Snippets Groups Projects
Commit 5e933028 authored by gsavin's avatar gsavin
Browse files

Change the way that BaseGenerator is keep nodes and edges informations. New...

Change the way that BaseGenerator is keep nodes and edges informations. New way is using an internal graph.
parent 2e999244
Branches
Tags
No related merge requests found
Showing with 174 additions and 275 deletions
......@@ -31,10 +31,10 @@
package org.graphstream.algorithm.generator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Random;
import org.graphstream.graph.Graph;
import org.graphstream.graph.implementations.AdjacencyListGraph;
import org.graphstream.stream.SourceBase;
/**
......@@ -67,78 +67,9 @@ import org.graphstream.stream.SourceBase;
* @since 2007
*/
public abstract class BaseGenerator extends SourceBase implements Generator {
/**
* Defines data which is stored when {@link #keepNodesId} is enabled.
*/
protected class NodeKeepData {
/**
* List of edge ids adjacent to the node.
*/
LinkedList<String> edges;
/**
* Remembers this edge id as an adjacent edge.
*
* @param id
* id of the adjacent edge
*/
void keepEdge(String id) {
if (edges == null)
edges = new LinkedList<String>();
if (!edges.contains(id))
edges.add(id);
}
/**
* Removes an edge id from adjacent edge list.
*
* @param id
* id of the old adjacent edge
*/
void unkeepEdge(String id) {
if (edges != null)
edges.remove(id);
}
}
/**
* Defines data which is stored when {@link #keepEdgesId} is enabled.
*/
protected class EdgeKeepData {
/**
* Source and target node ids of the edge.
*/
String src, trg;
/**
* Build the data.
*
* @param src
* source node id
* @param trg
* target node id
*/
EdgeKeepData(String src, String trg) {
keepNodes(src, trg);
}
/**
* Set source and target node ids.
*
* @param src
* source node id
* @param trg
* target node id
*/
void keepNodes(String src, String trg) {
this.src = src;
this.trg = trg;
}
}
// Attributes
/**
* Are edges directed ?
*/
......@@ -171,39 +102,6 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
*/
protected double[] edgeAttributeRange = new double[2];
/**
* List of all generated nodes so far. Used to create edges toward all other
* nodes at each step.
*/
protected ArrayList<String> nodes = new ArrayList<String>();
/**
* List of all generated edges.
*/
protected ArrayList<String> edges = new ArrayList<String>();
/**
* Data linked to nodes when {@link #keepNodesId} is enabled.
*/
protected HashMap<String, NodeKeepData> nodesData = new HashMap<String, NodeKeepData>();
/**
* Data linked to edges when {@link #keepEdgesId} is enabled.
*/
protected HashMap<String, EdgeKeepData> edgesData = new HashMap<String, EdgeKeepData>();
/**
* If enabled, keep node ids and essential data. In some generator,
* algorithm needs to know what has been previously build.
*/
protected boolean keepNodesId = false;
/**
* If enabled, keep edge ids and essential data. In some generator,
* algorithm needs to know what has been previously build.
*/
protected boolean keepEdgesId = false;
/**
* The random number generator.
*/
......@@ -219,6 +117,19 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
*/
protected boolean addEdgeLabels = false;
/**
* Flag to know if generator has to use an internal graph. Generator which
* want to use this feature have to use the
* {@link #setUseInternalGraph(boolean)} method to set this flag.
*/
private boolean useInternalGraph;
/**
* When {@link #useInternalGraph} is on, nodes and edges are stored in this
* graph.
*/
protected Graph internalGraph;
// Constructors
/**
......@@ -285,36 +196,6 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
public void end() {
clearKeptData();
}
/**
* Enable storage of node data. Id of nodes and adjacent edges will be
* stored.
*/
protected void enableKeepNodesId() {
keepNodesId = true;
}
/**
* Disable storage of node data.
*/
protected void disableKeepNodesId() {
keepNodesId = false;
}
/**
* Enable storage of edge data. Id of edges, source node id and target node
* id will be stored.
*/
protected void enableKeepEdgesId() {
keepEdgesId = true;
}
/**
* Disable storage of edge data.
*/
protected void disableKeepEdgesId() {
keepEdgesId = false;
}
/**
* Set the random seed used for random number generation.
......@@ -441,6 +322,39 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
edgeAttributeRange[1] = hi;
}
/**
* Enable or disable the use of an internal graph. If enable, nodes, edges
* and their attributes are stored in an internal graph.
*
* This is useful if the generator needs to remember informations like node
* id.
*
* @param on
* true if the internal graph has to be enable.
*/
public void setUseInternalGraph(boolean on) {
useInternalGraph = on;
if (!on && internalGraph != null) {
internalGraph.clear();
internalGraph = null;
}
if (on && internalGraph == null) {
internalGraph = new AdjacencyListGraph(getClass().getName()
+ "-internal_graph");
}
}
/**
* Flag to know if an internal graph is in use.
*
* @return true if nodes and edges are stored in an internal graph.
*/
public boolean isUsingInternalGraph() {
return useInternalGraph;
}
/**
* Same as {@link #addNode(String)} but specify attributes to position the
* node on a plane.
......@@ -456,6 +370,10 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
addNode(id);
sendNodeAttributeAdded(sourceId, id, "xy", new Double[] {
new Double(x), new Double(y) });
if (useInternalGraph)
internalGraph.getNode(id).addAttribute("xy",
(Object) (new Double[] { new Double(x), new Double(y) }));
}
/**
......@@ -470,17 +388,18 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
if (addNodeLabels)
sendNodeAttributeAdded(sourceId, id, "label", id);
if (useInternalGraph)
internalGraph.addNode(id);
double value;
for (String attr : nodeAttributes) {
value = (random.nextDouble() * (nodeAttributeRange[1] - nodeAttributeRange[0]))
+ nodeAttributeRange[0];
sendNodeAttributeAdded(sourceId, id, attr, value);
}
if (keepNodesId) {
nodes.add(id);
nodesData.put(id, new NodeKeepData());
if (useInternalGraph)
internalGraph.getNode(id).addAttribute(attr, value);
}
}
......@@ -491,18 +410,8 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
* id of the node to remove
*/
protected void delNode(String id) {
if (keepNodesId) {
if (keepEdgesId) {
NodeKeepData nkd = nodesData.get(id);
if (nkd.edges != null)
while (nkd.edges.size() > 0)
delEdge(nkd.edges.peek());
}
nodes.remove(id);
nodesData.remove(id);
}
if (useInternalGraph)
internalGraph.removeNode(id);
sendNodeRemoved(sourceId, id);
}
......@@ -530,6 +439,9 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
sendEdgeAdded(sourceId, id, from, to, directed);
if (useInternalGraph)
internalGraph.addEdge(id, from, to, directed);
if (addEdgeLabels)
sendEdgeAttributeAdded(sourceId, id, "label", id);
......@@ -537,16 +449,9 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
double value = (random.nextDouble() * (edgeAttributeRange[1] - edgeAttributeRange[0]))
+ edgeAttributeRange[0];
sendEdgeAttributeAdded(sourceId, id, attr, value);
}
if (keepEdgesId) {
edges.add(id);
if (keepNodesId) {
edgesData.put(id, new EdgeKeepData(from, to));
nodesData.get(from).keepEdge(id);
nodesData.get(to).keepEdge(id);
}
if (useInternalGraph)
internalGraph.getEdge(id).addAttribute(attr, value);
}
}
......@@ -559,28 +464,18 @@ public abstract class BaseGenerator extends SourceBase implements Generator {
protected void delEdge(String edgeId) {
sendEdgeRemoved(sourceId, edgeId);
if (keepEdgesId) {
edges.remove(edgeId);
if (keepNodesId) {
EdgeKeepData ekd = edgesData.get(edgeId);
nodesData.get(ekd.src).unkeepEdge(edgeId);
nodesData.get(ekd.trg).unkeepEdge(edgeId);
}
}
if (useInternalGraph)
internalGraph.removeEdge(edgeId);
}
/**
* Clear all the kept edge and node as well as the associated data.
* Clear the internal graph is {@link #useInternalGraph} is enable.
*
* This method is called in {@link #end()} to ensure the next generation will start freshly
* anew.
* This method is called in {@link #end()} to ensure the next generation
* will start freshly anew.
*/
protected void clearKeptData() {
nodes.clear();
edges.clear();
nodesData.clear();
edgesData.clear();
if (useInternalGraph)
internalGraph.clear();
}
}
......@@ -32,6 +32,9 @@ package org.graphstream.algorithm.generator;
import java.util.Random;
import org.graphstream.algorithm.Toolkit;
import org.graphstream.graph.Edge;
/**
* Dorogovtsev - Mendes graph generator.
*
......@@ -77,7 +80,7 @@ public class DorogovtsevMendesGenerator extends BaseGenerator {
* Create a new generator with default random object.
*/
public DorogovtsevMendesGenerator() {
keepEdgesId = true;
setUseInternalGraph(true);
}
/**
......@@ -106,11 +109,8 @@ public class DorogovtsevMendesGenerator extends BaseGenerator {
addNode("2");
addEdge("0-1", "0", "1");
edges.add("0-1");
addEdge("1-2", "1", "2");
edges.add("1-2");
addEdge("2-0", "2", "0");
edges.add("2-0");
nodeNames = 3;
}
......@@ -123,11 +123,10 @@ public class DorogovtsevMendesGenerator extends BaseGenerator {
* @see org.graphstream.algorithm.generator.Generator#nextEvents()
*/
public boolean nextEvents() {
int rand = random.nextInt(edges.size());
String name = Integer.toString(nodeNames++);
String edge = edges.get(rand);
String n0 = edge.substring(0, edge.indexOf('-'));
String n1 = edge.substring(edge.indexOf('-') + 1);
Edge edge = Toolkit.randomEdge(internalGraph, random);
String n0 = edge.getNode0().getId();
String n1 = edge.getNode1().getId();
addNode(name);
......
......@@ -30,6 +30,8 @@
*/
package org.graphstream.algorithm.generator;
import org.graphstream.graph.Node;
/**
* Full graph generator.
*
......@@ -71,7 +73,7 @@ public class FullGenerator extends BaseGenerator {
*/
public FullGenerator() {
super();
keepNodesId = true;
setUseInternalGraph(true);
}
/**
......@@ -84,7 +86,7 @@ public class FullGenerator extends BaseGenerator {
*/
public FullGenerator(boolean directed, boolean randomlyDirectedEdges) {
super(directed, randomlyDirectedEdges);
keepNodesId = true;
setUseInternalGraph(true);
}
/**
......@@ -104,7 +106,7 @@ public class FullGenerator extends BaseGenerator {
public FullGenerator(boolean directed, boolean randomlyDirectedEdges,
String nodeAttribute, String edgeAttribute) {
super(directed, randomlyDirectedEdges, nodeAttribute, edgeAttribute);
keepNodesId = true;
setUseInternalGraph(true);
}
/**
......@@ -128,9 +130,9 @@ public class FullGenerator extends BaseGenerator {
addNode(id);
for (String otherId : nodes) {
if (otherId != id) // We can compare refs safely here.
addEdge(null, id, otherId);
for (Node n : internalGraph.getEachNode()) {
if (!n.getId().equals(id)) // We can compare refs safely here.
addEdge(null, id, n.getId());
}
return true;
......
......@@ -95,7 +95,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
*/
public IncompleteGridGenerator(boolean cross, float holeProbability,
int holeMaxSize, int holesPerStep) {
enableKeepNodesId();
setUseInternalGraph(true);
this.cross = cross;
this.holeProbability = holeProbability;
......@@ -132,7 +132,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (x > 0) {
neigh = getNodeId(x - 1, y);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
else
unbreakable.add(nodeId);
......@@ -141,7 +141,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (x < currentWidth - 1) {
neigh = getNodeId(x + 1, y);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
else
unbreakable.add(nodeId);
......@@ -150,7 +150,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y > 0) {
neigh = getNodeId(x, y - 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
else
unbreakable.add(nodeId);
......@@ -159,19 +159,19 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y < currentHeight - 1) {
neigh = getNodeId(x, y + 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
else
unbreakable.add(nodeId);
}
// Cross
if (x > 0) {
if (y > 0) {
neigh = getNodeId(x - 1, y - 1);
if (nodes.contains(neigh)) {
if (internalGraph.getNode(neigh) != null) {
if (cross)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
} else
......@@ -181,7 +181,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y < currentHeight - 1) {
neigh = getNodeId(x - 1, y + 1);
if (nodes.contains(neigh)) {
if (internalGraph.getNode(neigh) != null) {
if (cross)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
} else
......@@ -193,7 +193,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y > 0) {
neigh = getNodeId(x + 1, y - 1);
if (nodes.contains(neigh)) {
if (internalGraph.getNode(neigh) != null) {
if (cross)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
} else
......@@ -203,7 +203,7 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y < currentHeight - 1) {
neigh = getNodeId(x + 1, y + 1);
if (nodes.contains(neigh)) {
if (internalGraph.getNode(neigh) != null) {
if (cross)
addEdge(getEdgeId(nodeId, neigh), nodeId, neigh);
} else
......@@ -227,28 +227,28 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (x > 0) {
neigh = getNodeId(x - 1, y);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
if (x < currentWidth - 1) {
neigh = getNodeId(x + 1, y);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
if (y > 0) {
neigh = getNodeId(x, y - 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
if (y < currentHeight - 1) {
neigh = getNodeId(x, y + 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
......@@ -257,14 +257,14 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y > 0) {
neigh = getNodeId(x - 1, y - 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
if (y < currentHeight - 1) {
neigh = getNodeId(x - 1, y + 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
}
......@@ -273,14 +273,14 @@ public class IncompleteGridGenerator extends BaseGenerator {
if (y > 0) {
neigh = getNodeId(x + 1, y - 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
if (y < currentHeight - 1) {
neigh = getNodeId(x + 1, y + 1);
if (nodes.contains(neigh))
if (internalGraph.getNode(neigh) != null)
delEdge(getEdgeId(nodeId, neigh));
}
}
......@@ -331,10 +331,11 @@ public class IncompleteGridGenerator extends BaseGenerator {
x1 = random.nextInt(currentWidth);
y1 = random.nextInt(currentHeight);
t++;
} while ((!nodes.contains(getNodeId(x1, y1)) || unbreakable
.contains(getNodeId(x1, y1))) && t < nodes.size());
} while ((internalGraph.getNode(getNodeId(x1, y1)) == null || unbreakable
.contains(getNodeId(x1, y1)))
&& t < internalGraph.getNodeCount());
if (t >= nodes.size())
if (t >= internalGraph.getNodeCount())
continue;
sizeX = random.nextInt(holeMaxSize);
......@@ -343,7 +344,8 @@ public class IncompleteGridGenerator extends BaseGenerator {
for (int i = 0; i < sizeX; i++)
for (int j = 0; j < sizeY; j++) {
String id = getNodeId(x1 + i, y1 + j);
if (nodes.contains(id) && !unbreakable.contains(id)) {
if (internalGraph.getNode(id) != null
&& !unbreakable.contains(id)) {
disconnectNode(x1 + i, y1 + j);
delNode(getNodeId(x1 + i, y1 + j));
......
......@@ -359,8 +359,7 @@ public class PointsOfInterestGenerator extends BaseGenerator {
private long currentStep;
public PointsOfInterestGenerator() {
disableKeepNodesId();
disableKeepEdgesId();
setUseInternalGraph(false);
initialPeopleCount = 500;
addPeopleProbability = delPeopleProbability = 0.001f;
......@@ -519,11 +518,11 @@ public class PointsOfInterestGenerator extends BaseGenerator {
public static void main(String... args) {
PointsOfInterestGenerator gen = new PointsOfInterestGenerator();
gen.setParameter(Parameter.INITIAL_PEOPLE_COUNT, 500);
gen.setParameter(Parameter.INITIAL_PEOPLE_COUNT, 300);
gen.setParameter(Parameter.ADD_PEOPLE_PROBABILITY, 0.01f);
gen.setParameter(Parameter.DEL_PEOPLE_PROBABILITY, 0.01f);
gen.setParameter(Parameter.INITIAL_POINT_OF_INTEREST_COUNT, 30);
gen.setParameter(Parameter.AVERAGE_POINTS_OF_INTEREST_COUNT, 4.0f);
gen.setParameter(Parameter.AVERAGE_POINTS_OF_INTEREST_COUNT, 5.0f);
gen.setParameter(Parameter.ADD_POINT_OF_INTEREST_PROBABILITY, 0.0f);
gen.setParameter(Parameter.DEL_POINT_OF_INTEREST_PROBABILITY, 0.0f);
gen.setParameter(Parameter.HAVE_INTEREST_PROBABILITY, 0.1f);
......
......@@ -30,7 +30,7 @@
*/
package org.graphstream.algorithm.generator;
import java.util.HashMap;
import org.graphstream.graph.Node;
import org.graphstream.stream.Pipe;
/**
......@@ -94,8 +94,6 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
*/
protected int dimension = 2;
protected HashMap<String, float[]> coords = new HashMap<String, float[]>();
/**
* The threshold that defines whether or not a link is created between to
* nodes. Since the coordinate system is defined between 0 and 1, the
......@@ -110,7 +108,7 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
public RandomEuclideanGenerator() {
super();
initDimension(2);
enableKeepNodesId();
setUseInternalGraph(true);
}
/**
......@@ -124,7 +122,7 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
public RandomEuclideanGenerator(int dimension) {
super();
initDimension(dimension);
enableKeepNodesId();
setUseInternalGraph(true);
}
/**
......@@ -145,7 +143,7 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
boolean randomlyDirectedEdges) {
super(directed, randomlyDirectedEdges);
initDimension(dimension);
enableKeepNodesId();
setUseInternalGraph(true);
}
/**
......@@ -171,7 +169,7 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
String edgeAttribute) {
super(directed, randomlyDirectedEdges, nodeAttribute, edgeAttribute);
initDimension(dimension);
enableKeepNodesId();
setUseInternalGraph(true);
}
private void initDimension(int dimension) {
......@@ -215,9 +213,9 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
addNode(id);
for (String node : nodes) {
if (!id.equals(node) && distance(id, node) < threshold)
addEdge(id + "-" + node, id, node);
for (Node n : internalGraph.getEachNode()) {
if (!id.equals(n.getId()) && distance(id, n.getId()) < threshold)
addEdge(id + "-" + n.getId(), id, n.getId());
}
return true;
......@@ -245,19 +243,30 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
private float distance(String n1, String n2) {
float d = 0f;
float[] p1 = coords.get(n1);
float[] p2 = coords.get(n2);
if (dimension == 2) {
d = (float) Math.pow(p1[0] - p2[0], 2)
+ (float) Math.pow(p1[1] - p2[1], 2);
double x1 = internalGraph.getNode(n1).getNumber("x");
double y1 = internalGraph.getNode(n1).getNumber("y");
double x2 = internalGraph.getNode(n2).getNumber("x");
double y2 = internalGraph.getNode(n2).getNumber("y");
d = (float) Math.pow(x1 - x2, 2) + (float) Math.pow(y1 - y2, 2);
} else if (dimension == 3) {
d = (float) Math.pow(p1[0] - p2[0], 2)
+ (float) Math.pow(p1[1] - p2[1], 2)
+ (float) Math.pow(p1[2] - p2[2], 2);
double x1 = internalGraph.getNode(n1).getNumber("x");
double y1 = internalGraph.getNode(n1).getNumber("y");
double x2 = internalGraph.getNode(n2).getNumber("x");
double y2 = internalGraph.getNode(n2).getNumber("y");
double z1 = internalGraph.getNode(n1).getNumber("z");
double z2 = internalGraph.getNode(n2).getNumber("z");
d = (float) Math.pow(z1 - z2, 2) + (float) Math.pow(x1 - x2, 2)
+ (float) Math.pow(y1 - y2, 2);
} else {
for (int i = 0; i < dimension; i++)
d += (float) Math.pow(p1[i] - p2[i], 2);
for (int i = 0; i < dimension; i++) {
double xi1 = internalGraph.getNode(n1).getNumber("x" + i);
double xi2 = internalGraph.getNode(n2).getNumber("x" + i);
d += (float) Math.pow(xi1 - xi2, 2);
}
}
return (float) Math.sqrt(d);
......@@ -280,16 +289,8 @@ public class RandomEuclideanGenerator extends BaseGenerator implements Pipe {
if (key != null && key.matches("x|y|z") && val instanceof Float) {
int i = ((int) key.charAt(0)) - (int) 'x';
if (i < dimension) {
float[] p = coords.get(nodeId);
if (p == null) {
p = new float[dimension];
coords.put(nodeId, p);
}
p[((int) key.charAt(0)) - (int) 'x'] = (Float) val;
}
if (i < dimension)
internalGraph.getNode(nodeId).addAttribute(key, val);
}
}
......
......@@ -30,6 +30,8 @@
*/
package org.graphstream.algorithm.generator;
import org.graphstream.algorithm.Toolkit;
/**
* This is a graph generator that generates dynamic random graphs.
*
......@@ -147,8 +149,7 @@ public class RandomFixedDegreeDynamicGraphGenerator extends BaseGenerator {
*/
public RandomFixedDegreeDynamicGraphGenerator(int nbVertices,
double meanDegreeLimit, double nervousness) {
enableKeepNodesId();
enableKeepEdgesId();
setUseInternalGraph(true);
this.nbVertices = nbVertices;
this.meanDegreeLimit = meanDegreeLimit;
......@@ -159,7 +160,8 @@ public class RandomFixedDegreeDynamicGraphGenerator extends BaseGenerator {
* This method computes the mean degree of the graph.
*/
public double meanDegree() {
return 2.0 * edges.size() / (double) nodes.size();
return 2.0 * internalGraph.getEdgeCount()
/ (double) internalGraph.getNodeCount();
}
protected String getEdgeId(String src, String trg) {
......@@ -190,15 +192,16 @@ public class RandomFixedDegreeDynamicGraphGenerator extends BaseGenerator {
sendStepBegins(sourceId, step);
nbSuppressions = (int) (random.nextFloat() * (nodes.size() * nervousness));
nbSuppressions = (int) (random.nextFloat() * (internalGraph
.getNodeCount() * nervousness));
for (int r = 1; r <= nbSuppressions; r++) {
dead = nodes.get(random.nextInt(nodes.size()));
dead = Toolkit.randomNode(internalGraph, random).getId();
delNode(dead);
}
nbCreations = (int) (random.nextFloat() * ((nbVertices - nodes.size())
* Math.log(step) / Math.log(step + deltaStep)));
nbCreations = (int) (random.nextFloat() * ((nbVertices - internalGraph
.getNodeCount()) * Math.log(step) / Math.log(step + deltaStep)));
for (int c = 1; c <= nbCreations; c++) {
String nodeId = String.format("%d", currentNodeId++);
......@@ -208,20 +211,21 @@ public class RandomFixedDegreeDynamicGraphGenerator extends BaseGenerator {
double degreMoyen = meanDegree();
nbCreationsEdges = (int) (random.nextFloat() * (((meanDegreeLimit - degreMoyen) * (nodes
.size() / 2)) * Math.log(step) / Math.log(step + deltaStep)));
nbCreationsEdges = (int) (random.nextFloat() * (((meanDegreeLimit - degreMoyen) * (internalGraph
.getNodeCount() / 2)) * Math.log(step) / Math.log(step
+ deltaStep)));
if (nodes.size() > 1) {
if (internalGraph.getNodeCount() > 1) {
for (int c = 1; c <= nbCreationsEdges; c++) {
do {
source = nodes.get(random.nextInt(nodes.size()));
dest = nodes.get(random.nextInt(nodes.size()));
source = Toolkit.randomNode(internalGraph, random).getId();
dest = Toolkit.randomNode(internalGraph, random).getId();
} while (source.equals(dest));
String idEdge = getEdgeId(source, dest);
while (edges.contains(idEdge) || source.equals(dest)) {
dest = nodes.get(random.nextInt(nodes.size()));
while (internalGraph.getEdge(idEdge) != null || source.equals(dest)) {
dest = Toolkit.randomNode(internalGraph, random).getId();
idEdge = getEdgeId(source, dest);
}
......
......@@ -30,6 +30,8 @@
*/
package org.graphstream.algorithm.generator;
import org.graphstream.algorithm.Toolkit;
/**
* Random graph generator.
*
......@@ -94,8 +96,7 @@ public class RandomGenerator extends BaseGenerator {
*/
public RandomGenerator(int averageDegree) {
super();
enableKeepNodesId();
enableKeepEdgesId();
setUseInternalGraph(true);
this.averageDegree = averageDegree;
}
......@@ -112,8 +113,7 @@ public class RandomGenerator extends BaseGenerator {
public RandomGenerator(int averageDegree, boolean directed,
boolean randomlyDirectedEdges) {
super(directed, randomlyDirectedEdges);
enableKeepNodesId();
enableKeepEdgesId();
setUseInternalGraph(true);
this.averageDegree = averageDegree;
}
......@@ -137,8 +137,7 @@ public class RandomGenerator extends BaseGenerator {
boolean randomlyDirectedEdges, String nodeAttribute,
String edgeAttribute) {
super(directed, randomlyDirectedEdges, nodeAttribute, edgeAttribute);
enableKeepNodesId();
enableKeepEdgesId();
setUseInternalGraph(true);
this.averageDegree = averageDegree;
}
......@@ -171,13 +170,12 @@ public class RandomGenerator extends BaseGenerator {
// to the new node.
for (int i = 0; i < degree; ++i) {
int n = random.nextInt(nodes.size());
String otherId = nodes.get(n);
String otherId = Toolkit.randomNode(internalGraph, random).getId();
if (otherId != id) {
String edgeId = getEdgeId(id, otherId);
if (!edges.contains(edgeId))
if (internalGraph.getEdge(edgeId) == null)
addEdge(edgeId, id, otherId);
}
}
......
......@@ -37,8 +37,7 @@ public class WattsStrogatzGenerator extends BaseGenerator {
* @param beta Probability to "rewire" an edge.
*/
public WattsStrogatzGenerator(int n, int k, double beta) {
keepNodesId = true;
keepEdgesId = true;
setUseInternalGraph(true);
if(n<=k)
throw new RuntimeException("parameter n must be >> k");
......@@ -119,7 +118,7 @@ public class WattsStrogatzGenerator extends BaseGenerator {
do {
newId = random.nextInt(n);
exists = edgesData.get(edgeId(avoid, newId)) != null;
exists = internalGraph.getEdge(edgeId(avoid, newId)) != null;
} while(newId == avoid || exists);
return newId;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment