-
Notifications
You must be signed in to change notification settings - Fork 2
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
Separate path optimization of disconnected components in the network graph #53
base: master
Are you sure you want to change the base?
Changes from 4 commits
474427d
4484f5d
0700b48
ba187ec
95af947
4a1993c
2fc3371
48f18fc
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -300,3 +300,43 @@ function sumtraces(path::EinExpr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
EinExpr(path.head, _args) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function dfs(graph, v, visited, subgraph) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visited[v] = true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
push!(subgraph, v) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for u in 1:size(graph, 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if graph[v, u] && !visited[u] # Check adjacency and visited status | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dfs(graph, u, visited, subgraph) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function components(path::EinExpr{L}) where {L} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
network = [args.head for args in path.args] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# create adjacency graph of the network | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tengraph = zeros(Bool, length(network), length(network)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for i in 1:length(network) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for j in 1:length(network) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !isempty(network[i] ∩ network[j]) && i ≠ j | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tengraph[i,j] = true | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# find disconneceted subgraphs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subgraphs = Vector{Vector{Int}}() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
n = size(tengraph, 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
visited = falses(n) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for v in 1:n | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !visited[v] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
subgraph = Int[] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
dfs(tengraph, v, visited, subgraph) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
push!(subgraphs, subgraph) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# create subnetworks | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
indeppaths = [sum(EinExpr.([network[tns] for tns in subnet])) for subnet in subgraphs] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return indeppaths | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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. Continuing with above
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. Done! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,7 +27,7 @@ The implementation uses a binary heaptree to sort candidate pairwise tensor cont | |
outer::Bool = false | ||
end | ||
|
||
function einexpr(config::Greedy, path::EinExpr{L}, sizedict::Dict{L}) where {L} | ||
function einexpr(config::Greedy, sizedict::Dict{L}, path::EinExpr{L}) where {L} | ||
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. Why change the order? 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. Because of the multiple dispatching: this way, all optimizers' network = [[:a, :b], [:b, :c], [:A, :B], [:B, :C]]
expr = sum(EinExpr.(network))
optdata = Dict(key => 2 for key in unique(vcat(network...)))
einexpr(Exhaustive(), expr, optdata)
Although I am not really convinced about this fix, it makes possible to call the optimizers with each of the non-interconnected subgraphs at the level of abstraction of the class Let me know what are your thoughts on this and whether there's another more-suitable way to implement this. |
||
# remove self-loops | ||
path = sumtraces(path) | ||
metric = config.metric(sizedict) | ||
|
@@ -70,4 +70,4 @@ function einexpr(config::Greedy, path::EinExpr{L}, sizedict::Dict{L}) where {L} | |
return path | ||
end | ||
|
||
einexpr(config::Greedy, path::SizedEinExpr) = SizedEinExpr(einexpr(config, path.path, path.size), path.size) | ||
einexpr(config::Greedy, path::SizedEinExpr) = SizedEinExpr(einexpr(config, path.size, path.path), path.size) | ||
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: why change the order? |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -3,7 +3,7 @@ abstract type Optimizer end | |||||
function einexpr end | ||||||
|
||||||
einexpr(T::Type{<:Optimizer}, args...; kwargs...) = einexpr(T(; kwargs...), args...) | ||||||
einexpr(config::Optimizer, expr, sizedict) = einexpr(config, SizedEinExpr(expr, sizedict)) | ||||||
einexpr(config::Optimizer, expr, sizedict) = sum(einexpr.((config,), [SizedEinExpr(exp, sizedict) for exp in [comp for comp in components(expr)]])) | ||||||
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.
Suggested change
Maybe it could be rewritten like this? 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. Yeah, I completely agree. I guess I am still getting used to Julia haha |
||||||
|
||||||
include("Naive.jl") | ||||||
include("Exhaustive.jl") | ||||||
|
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.
Nice! But let's rewrite it like this:
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.
Done!