41#ifndef RANDOM_NETWORK_GENERATOR_H
42#define RANDOM_NETWORK_GENERATOR_H
73template<
typename Net,
typename =
void>
96 std::uniform_real_distribution<double>
prob_dist{0.0, 1.0};
163 Arc* arc = it.get_curr();
179 const std::vector<Node*>&
nodes)
186 for (
size_t i = 2; i <
nodes.size() - 1; ++i)
232 std::vector<Node*>
nodes;
379 std::vector<std::vector<Node*>>
grid(
rows, std::vector<Node*>(
cols));
382 for (
size_t i = 0; i <
rows; ++i)
383 for (
size_t j = 0; j <
cols; ++j)
387 for (
size_t i = 0; i <
rows; ++i)
388 for (
size_t j = 0; j <
cols - 1; ++j)
392 for (
size_t i = 0; i <
rows - 1; ++i)
393 for (
size_t j = 0; j <
cols; ++j)
461std::unique_ptr<RandomNetworkGenerator<Net>>
464 if (type ==
"erdos-renyi")
465 return std::make_unique<ErdosRenyiGenerator<Net>>(config);
466 else if (type ==
"layered")
467 return std::make_unique<LayeredNetworkGenerator<Net>>(config);
468 else if (type ==
"grid")
469 return std::make_unique<GridNetworkGenerator<Net>>(config);
470 else if (type ==
"bipartite")
471 return std::make_unique<BipartiteNetworkGenerator<Net>>(config);
473 throw std::invalid_argument(
"Unknown generator type: " + type);
bool has_curr() const noexcept
Return true the iterator has an current arc.
T & insert(const T &item)
Insert a new item by copy.
Filtered iterator for outcoming arcs of a node.
Complete bipartite network generator.
void insert_arc(Net &net, Node *src, Node *tgt)
BipartiteNetworkGenerator(const NetworkGeneratorConfig &cfg, size_t left=5, size_t right=5)
void generate(Net &net) override
NetworkGeneratorConfig config
Erdős–Rényi random network generator.
void insert_arc(Net &net, Node *src, Node *tgt)
void generate(Net &net) override
ErdosRenyiGenerator(const NetworkGeneratorConfig &cfg)
void ensure_path(Net &net, Node *source, Node *sink, const std::vector< Node * > &nodes)
NetworkGeneratorConfig config
GridNetworkGenerator(const NetworkGeneratorConfig &cfg, size_t r=5, size_t c=5)
void insert_arc(Net &net, Node *src, Node *tgt)
NetworkGeneratorConfig config
void generate(Net &net) override
Layered (staged) network generator.
void insert_arc(Net &net, Node *src, Node *tgt)
LayeredNetworkGenerator(const NetworkGeneratorConfig &cfg, size_t layers=4, size_t per_layer=5)
NetworkGeneratorConfig config
void generate(Net &net) override
Base class for random network generators.
virtual void generate(Net &out)=0
void reseed(unsigned new_seed)
Reset with a specific seed (also updates config.seed)
std::uniform_real_distribution< double > cost_dist
void insert_arc(Net &net, Node *src, Node *tgt)
std::uniform_real_distribution< double > prob_dist
bool is_connected(const Net &net, Node *source, Node *sink)
void ensure_path(Net &net, Node *source, Node *sink, const std::vector< Node * > &nodes)
RandomNetworkGenerator(const NetworkGeneratorConfig &cfg)
NetworkGeneratorConfig config
virtual ~RandomNetworkGenerator()=default
void reseed()
Reset the random number generator to the original seed.
std::uniform_real_distribution< double > capacity_dist
Node * get_tgt_node(Arc *arc) const noexcept
Return the target node of arc (only for directed graphs)
DynArray< Graph::Node * > nodes
std::unique_ptr< RandomNetworkGenerator< Net > > create_generator(const std::string &type, const NetworkGeneratorConfig &config)
Factory function to create generators.
Main namespace for Aleph-w library functions.
void next()
Advance all underlying iterators (bounds-checked).
DynList< T > maps(const C &c, Op op)
Classic map operation.
Flow network implemented with adjacency lists.
Node * insert_node(const Node_Type &node_info)
Insert a new node by copying node_info.
Arc * insert_arc(Node *src_node, Node *tgt_node, const Flow_Type &cap, const Flow_Type &flow, const typename Arc::Arc_Type &arc_info=Arc_Type())
Insert a capacitated arc with an initial flow.
Random network generator configuration.
size_t num_nodes
Number of nodes.
bool ensure_connected
Ensure source can reach sink.
double min_cost
Minimum arc cost (for cost networks)
double max_cost
Maximum arc cost.
size_t num_arcs
Number of arcs (ignored for some generators)
double min_capacity
Minimum arc capacity.
unsigned seed
Random seed (0 = time-based)
double density
Edge density [0, 1] (for Erdős–Rényi)
double max_capacity
Maximum arc capacity.
Network flow graph structures.
Maximum flow minimum cost network algorithms.