00001 #ifndef GRAPHGENERATORS_H
00002 #define GRAPHGENERATORS_H
00003
00004 #include <Utilities/mersenneTwister.h>
00005
00006
00007
00008 template<typename GraphType>
00009 class GraphGenerator
00010 {
00011 public:
00012 GraphGenerator()
00013 {
00014 }
00015
00016 virtual void generate( GraphType& G)
00017 {
00018 }
00019 protected:
00020 };
00021
00022
00023 template<typename GraphType>
00024 class RandomGenerator : public GraphGenerator<GraphType>
00025 {
00026 public:
00027 typedef typename GraphType::SizeType SizeType;
00028 typedef typename GraphType::NodeIterator NodeIterator;
00029 typedef typename GraphType::NodeDescriptor NodeDescriptor;
00030 typedef typename GraphType::EdgeIterator EdgeIterator;
00031 typedef typename GraphType::EdgeDescriptor EdgeDescriptor;
00032
00033 RandomGenerator( const SizeType& numNodes, const SizeType& numEdges):m_numNodes(numNodes),m_numEdges(numEdges)
00034 {
00035 }
00036
00037 void generate( GraphType& G)
00038 {
00039 NodeIterator u,v;
00040 NodeDescriptor uD;
00041 EdgeIterator e;
00042 EdgeDescriptor eD;
00043
00044 std::stringstream nodestream;
00045 nodestream << "Generating " << m_numNodes << " random nodes";
00046 ProgressBar node_progress( m_numNodes,nodestream.str());
00047 for( SizeType i = 0; i < m_numNodes; ++i)
00048 {
00049 uD = G.insertNode();
00050 u = G.getNodeIterator(uD);
00051 u->setId( i);
00052 ++node_progress;
00053 }
00054
00055 std::stringstream edgestream;
00056 edgestream << "Generating " << m_numEdges << " random edges";
00057 ProgressBar edge_progress( m_numEdges,edgestream.str());
00058 for( SizeType i = 0; i < m_numEdges; ++i)
00059 {
00060 u = G.chooseNode();
00061 v = G.chooseNode();
00062 while( G.edgeExists( u->getDescriptor(),v->getDescriptor()) || u == v)
00063 {
00064 u = G.chooseNode();
00065 v = G.chooseNode();
00066 }
00067 eD = G.insertEdge( u->getDescriptor(),v->getDescriptor());
00068 e = G.getEdgeIterator(eD);
00069 e->setId(i);
00070 ++edge_progress;
00071 }
00072 }
00073
00074 private:
00075 const typename GraphType::SizeType& m_numNodes;
00076 const typename GraphType::SizeType& m_numEdges;
00077 };
00078
00079
00080 template<typename GraphType>
00081 class RandomWeightedGenerator : public GraphGenerator<GraphType>
00082 {
00083 public:
00084 typedef typename GraphType::SizeType SizeType;
00085 typedef typename GraphType::NodeIterator NodeIterator;
00086 typedef typename GraphType::NodeDescriptor NodeDescriptor;
00087 typedef typename GraphType::EdgeIterator EdgeIterator;
00088 typedef typename GraphType::EdgeDescriptor EdgeDescriptor;
00089
00090 RandomWeightedGenerator( const SizeType& numNodes, const SizeType& numEdges, unsigned int maxWeight):m_numNodes(numNodes),m_numEdges(numEdges),m_maxWeight(maxWeight)
00091 {
00092 }
00093
00094 void generate( GraphType& G)
00095 {
00096 NodeIterator u,v;
00097 NodeDescriptor uD;
00098 EdgeIterator e;
00099 EdgeDescriptor eD;
00100
00101 std::stringstream nodestream;
00102 nodestream << "Generating " << m_numNodes << " random nodes";
00103 ProgressBar node_progress( m_numNodes,nodestream.str());
00104 for( SizeType i = 0; i < m_numNodes; ++i)
00105 {
00106 uD = G.insertNode();
00107 u = G.getNodeIterator(uD);
00108 u->setId( i);
00109 ++node_progress;
00110 }
00111
00112 std::stringstream edgestream;
00113 edgestream << "Generating " << m_numEdges << " random edges";
00114 ProgressBar edge_progress( m_numEdges,edgestream.str());
00115 for( SizeType i = 0; i < m_numEdges; ++i)
00116 {
00117 u = G.chooseNode();
00118 v = G.chooseNode();
00119 while( G.edgeExists( u->getDescriptor(),v->getDescriptor()) || u == v)
00120 {
00121 u = G.chooseNode();
00122 v = G.chooseNode();
00123 }
00124 eD = G.insertEdge( u->getDescriptor(),v->getDescriptor());
00125 e = G.getEdgeIterator(eD);
00126 e->setId(i);
00127
00128 double random = m_random.getRandomNormalizedDouble();
00129 e->weight = m_maxWeight * random + 1;
00130 ++edge_progress;
00131 }
00132 }
00133
00134 private:
00135 const typename GraphType::SizeType& m_numNodes;
00136 const typename GraphType::SizeType& m_numEdges;
00137 unsigned int m_maxWeight;
00138 MersenneTwister m_random;
00139 };
00140
00141 #endif //GRAPHGENERATORS_H