In this module,
Let’s define a simple parametric type for a graph:
mutable struct Graph{V, E <: Real}
edges::Vector{Tuple{V, V}}
weights::Vector{E}
end
In defining a Graph type, we have also defined a constructor for this graph:
diamond = Graph([(:a, :b), (:a, :c), (:b, :d), (:c, :d)], [true, true, true, true])
Main.var"##275".Graph{Symbol, Bool}([(:a, :b), (:a, :c), (:b, :d), (:c, :d)], Bool[1, 1, 1, 1])
We may be interested in making it display a little more nicely, by overloading show:
function Base.show(io::IO, g::Graph)
return print(io, "A graph with $(length(g.edges)) $(eltype(g.weights)) edges")
end
The show method is what is called when we type in the name of a variable, and we can
decide what to print as a return:
diamond
A graph with 4 Bool edges
We can now define a graph generator based on the Erdős–Rényi model – the
function to do so is a good encapsulation of concepts from the previous
modules, notably conditionals, the creation of struct, and list
comprehensions. We will use the Combinatorics package to iterate over
nodes combinations.
using Combinatorics
But generating a random graph is, in a sense, using the generator to do what we want. And so we will get a little crafty here, and define a type that represents an algorithm:
abstract type AbstractGraphGenerator end
struct ErdosRenyi <: AbstractGraphGenerator
n::Integer
p::AbstractFloat
end
We can now create an ER generator by giving it n (the number of nodes) and p, the
probability of a connection between two nodes.
Are we closer to solving our problem? Yes! We can overload the generator for Graph in
a new way, that accepts a single argument: an instance of ErdosRenyi.
function Graph(er::ErdosRenyi)
vertices = collect(1:(er.n))
@assert zero(er.p) <= er.p <= one(er.p)
edges = [tuple(pair...) for pair in combinations(vertices, 2) if rand() <= er.p]
return Graph(edges, fill(true, length(edges)))
end
Main.var"##275".Graph
We can now create a graph, and check its type:
G = Graph(ErdosRenyi(10, 0.2))
A graph with 5 Bool edges
typeof(G)
Main.var"##275".Graph{Int64, Bool}