/* Copyright 2008-2010 Gephi Authors : Mathieu Bastian <mathieu.bastian@gephi.org> Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.io.generator.plugin; import java.util.Random; import org.gephi.io.generator.spi.Generator; import org.gephi.io.generator.spi.GeneratorUI; import org.gephi.io.importer.api.ContainerLoader; import org.gephi.io.importer.api.EdgeDraft; import org.gephi.io.importer.api.NodeDraft; import org.gephi.utils.progress.Progress; import org.gephi.utils.progress.ProgressTicket; import org.openide.util.Lookup; import org.openide.util.lookup.ServiceProvider; /** * * @author Mathieu Bastian */ @ServiceProvider(service = Generator.class) public class RandomGraph implements Generator { protected int numberOfNodes = 50; protected double wiringProbability = 0.05; protected ProgressTicket progress; protected boolean cancel = false; public void generate(ContainerLoader container) { int max = numberOfNodes; if (wiringProbability > 0) { max += numberOfNodes - 1; } Progress.start(progress, max); int progressUnit = 0; Random random = new Random(); NodeDraft[] nodeArray = new NodeDraft[numberOfNodes]; for (int i = 0; i < numberOfNodes && !cancel; i++) { NodeDraft nodeDraft = container.factory().newNodeDraft(); container.addNode(nodeDraft); nodeArray[i] = nodeDraft; Progress.progress(progress, ++progressUnit); } if (wiringProbability > 0) { for (int i = 0; i < numberOfNodes - 1 && !cancel; i++) { NodeDraft node1 = nodeArray[i]; for (int j = i + 1; j < numberOfNodes && !cancel; j++) { NodeDraft node2 = nodeArray[j]; if (random.nextDouble() < wiringProbability) { EdgeDraft edgeDraft = container.factory().newEdgeDraft(); edgeDraft.setSource(node1); edgeDraft.setTarget(node2); container.addEdge(edgeDraft); } } Progress.progress(progress, ++progressUnit); } } Progress.finish(progress); progress = null; } public String getName() { return "Random Graph"; } public GeneratorUI getUI() { return Lookup.getDefault().lookup(RandomGraphUI.class); } public void setNumberOfNodes(int numberOfNodes) { if (numberOfNodes < 0) { throw new IllegalArgumentException("# of nodes must be greater than 0"); } this.numberOfNodes = numberOfNodes; } public void setWiringProbability(double wiringProbability) { if (wiringProbability < 0 || wiringProbability > 1) { throw new IllegalArgumentException("Wiring probability must be between 0 and 1"); } this.wiringProbability = wiringProbability; } public int getNumberOfNodes() { return numberOfNodes; } public double getWiringProbability() { return wiringProbability; } public boolean cancel() { cancel = true; return true; } public void setProgressTicket(ProgressTicket progressTicket) { this.progress = progressTicket; } }