Julia DiGraph 以用户定义的对象作为节点
Julia DiGraph with user-defined object as nodes
在 Julia 中,我可以使用编写得很好的 Graphs.jl 库轻松创建图表:
julia> using Graphs
julia> g = SimpleDiGraph(2)
{2, 0} directed simple Int64 graph
julia> add_edge!(g, 1,2)
true
julia> add_edge!(g, 2, 1)
true
但是,我似乎无法将节点设为整数以外的任何值。也就是说,我想做这样的事情:
julia> using Graphs
julia> abstract type Foo end
julia> s = SimpleDiGraph(typeof(Foo)) # doesn't work.
julia> mutable struct Bar <: Foo
b::Bool
end
julia> mutable struct Baz <: Foo
b::Bool
end
julia> bar = Bar(true)
Bar(true)
julia> baz = Baz(false)
Baz(false)
julia> add_edge!(g, bar, baz) # Again, doesn't work.
如何使节点成为自定义类型?
注意:我尝试了以下解决方法,因为节点中似乎只允许整数类型:
julia> add_edge!(g, Int64(pointer_from_objref(bar)), Int64(pointer_from_objref(baz)))
但是这个,虽然没有抛出异常,returns false.
在 Graphs.jl tutorial 中声明“整数,并且只能使用整数来描述顶点”。所以我的第一个目标是不可能的(尽管它可能在 MetaGraphs.jl 中实现)。建议使用顶点中的整数值作为向量的索引并将对象存储在向量中。
此外,由于声明目标是索引到向量中,因此整数必须是连续的,因此我的第二个使用对象地址的想法也不可行。
然而,使用图形索引到向量中对我来说是一个完全可以接受的解决方案。
在 Julia 中,我可以使用编写得很好的 Graphs.jl 库轻松创建图表:
julia> using Graphs
julia> g = SimpleDiGraph(2)
{2, 0} directed simple Int64 graph
julia> add_edge!(g, 1,2)
true
julia> add_edge!(g, 2, 1)
true
但是,我似乎无法将节点设为整数以外的任何值。也就是说,我想做这样的事情:
julia> using Graphs
julia> abstract type Foo end
julia> s = SimpleDiGraph(typeof(Foo)) # doesn't work.
julia> mutable struct Bar <: Foo
b::Bool
end
julia> mutable struct Baz <: Foo
b::Bool
end
julia> bar = Bar(true)
Bar(true)
julia> baz = Baz(false)
Baz(false)
julia> add_edge!(g, bar, baz) # Again, doesn't work.
如何使节点成为自定义类型?
注意:我尝试了以下解决方法,因为节点中似乎只允许整数类型:
julia> add_edge!(g, Int64(pointer_from_objref(bar)), Int64(pointer_from_objref(baz)))
但是这个,虽然没有抛出异常,returns false.
在 Graphs.jl tutorial 中声明“整数,并且只能使用整数来描述顶点”。所以我的第一个目标是不可能的(尽管它可能在 MetaGraphs.jl 中实现)。建议使用顶点中的整数值作为向量的索引并将对象存储在向量中。
此外,由于声明目标是索引到向量中,因此整数必须是连续的,因此我的第二个使用对象地址的想法也不可行。
然而,使用图形索引到向量中对我来说是一个完全可以接受的解决方案。