-
Notifications
You must be signed in to change notification settings - Fork 93
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add regular tree generator #197
base: master
Are you sure you want to change the base?
Changes from 6 commits
01896fe
dac8f9a
7abb310
9a0fb29
f441197
ec15727
b26cf91
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -536,6 +536,60 @@ function double_binary_tree(k::Integer) | |||||||||||||||||||||||||||||||||
return g | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||
regular_tree([T=Int64, ], k::Integer, z::integer) | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Create a regular tree or [perfect z-ary tree](https://en.wikipedia.org/wiki/M-ary_tree#Types_of_m-ary_trees): | ||||||||||||||||||||||||||||||||||
a `k`-level tree where all nodes except the leaves have exactly `z` children. | ||||||||||||||||||||||||||||||||||
For `z = 2` one recovers a binary tree. | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
# Examples | ||||||||||||||||||||||||||||||||||
```jldoctest | ||||||||||||||||||||||||||||||||||
julia> regular_tree(4, 3) | ||||||||||||||||||||||||||||||||||
{40, 39} undirected simple Int64 graph | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
Comment on lines
+549
to
+551
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would remove it and I would put it in the docstring of the function regular_tree(k,z).
Suggested change
|
||||||||||||||||||||||||||||||||||
julia> regular_tree(Int8, 3, 2) | ||||||||||||||||||||||||||||||||||
{7, 6} undirected simple Int8 graph | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
julia> regular_tree(5, 2) == binary_tree(5) | ||||||||||||||||||||||||||||||||||
true | ||||||||||||||||||||||||||||||||||
Comment on lines
+554
to
+556
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above.
Suggested change
|
||||||||||||||||||||||||||||||||||
``` | ||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||
function regular_tree(T::Type{<:Integer}, k::Integer, z::Integer) | ||||||||||||||||||||||||||||||||||
z <= 0 && throw(DomainError(z, "number of children must be positive")) | ||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't we also check for |
||||||||||||||||||||||||||||||||||
z == 1 && return path_graph(T(k)) | ||||||||||||||||||||||||||||||||||
k <= 0 && return SimpleGraph(zero(T)) | ||||||||||||||||||||||||||||||||||
k == 1 && return SimpleGraph(one(T)) | ||||||||||||||||||||||||||||||||||
if Graphs.isbounded(k) && (BigInt(z)^k - 1) ÷ (z - 1) > typemax(T) | ||||||||||||||||||||||||||||||||||
throw(InexactError(:convert, T, (BigInt(z)^k - 1) ÷ (z - 1))) | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
n = T((z^k - 1) / (z - 1)) | ||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You already calculate the number of vertices with With the expression
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A lot of these overflow issues probably won't happen if we restrict |
||||||||||||||||||||||||||||||||||
ne = n - 1 | ||||||||||||||||||||||||||||||||||
fadjlist = Vector{Vector{T}}(undef, n) | ||||||||||||||||||||||||||||||||||
@inbounds fadjlist[1] = convert.(T, 2:(z + 1)) | ||||||||||||||||||||||||||||||||||
@inbounds for l in 2:(k - 1) | ||||||||||||||||||||||||||||||||||
w = (z^(l - 1) - 1) ÷ (z - 1) | ||||||||||||||||||||||||||||||||||
x = w + z^(l - 1) | ||||||||||||||||||||||||||||||||||
@simd for i in 1:(z^(l - 1)) | ||||||||||||||||||||||||||||||||||
j = w + i | ||||||||||||||||||||||||||||||||||
fadjlist[j] = [ | ||||||||||||||||||||||||||||||||||
T(ceil((j - x) / z) + w) | ||||||||||||||||||||||||||||||||||
convert.(T, (x + (i - 1) * z + 1):(x + i * z)) | ||||||||||||||||||||||||||||||||||
] | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
l = k | ||||||||||||||||||||||||||||||||||
w = (z^(l - 1) - 1) ÷ (z - 1) | ||||||||||||||||||||||||||||||||||
x = w + z^(l - 1) | ||||||||||||||||||||||||||||||||||
@inbounds @simd for j in (w + 1):x | ||||||||||||||||||||||||||||||||||
fadjlist[j] = T[ceil((j - x) / z) + w] | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
return SimpleGraph(ne, fadjlist) | ||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would add the docstring also to this function.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's quite often the case, that the docstrings for multiple methods of a function are only added for a single method - I think that would also be better here, than adding docstrings for both methods of this function. |
||||||||||||||||||||||||||||||||||
regular_tree(k::Integer, z::Integer) = regular_tree(Int64, k, z) | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||
roach_graph(k) | ||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Except for binary_tree and double_binary_tree all the other functions of this file have the following style: