Julia模块,用于在不更改或重新标记节点索引的情况下绘制图(节点/顶点和边)?

Julia模块,用于在不更改或重新标记节点索引的情况下绘制图(节点/顶点和边)?,julia,networkx,subgraph,undirected-graph,lightgraphs,Julia,Networkx,Subgraph,Undirected Graph,Lightgraphs,术语说明:“顶点”=“节点”,“顶点/节点标签”=“索引” Julia中的LightGraphs在生成诱导子图时更改节点索引 例如,如果一个图有节点[1,2,3,4],它的光图。由节点[3,4]诱导的诱导子图将是一个新的图,其中节点[3,4]被重新标记为[1,2] 在最先进的图算法中,使用递归子图,修改节点集并在递归层上下传递。为了使这些算法能够正确跟踪节点标识(标签),子图不能更改索引 例如,Python中networkx中的子图形保留节点标签 可以通过添加节点属性:id来使用元图,该属性由子

术语说明:“顶点”=“节点”,“顶点/节点标签”=“索引”

Julia中的
LightGraphs
在生成诱导子图时更改节点索引

例如,如果一个图有节点
[1,2,3,4]
,它的
光图。由节点
[3,4]
诱导的诱导子图将是一个新的图,其中节点
[3,4]
被重新标记为
[1,2]

在最先进的图算法中,使用递归子图,修改节点集并在递归层上下传递。为了使这些算法能够正确跟踪节点标识(标签),子图不能更改索引

例如,Python中
networkx
中的子图形保留节点标签

可以通过添加节点属性
:id
来使用
元图,该属性由子图保留,但随后必须编写大量额外的代码来在节点索引和节点
:id
之间进行转换


当涉及到子图形和保存节点标识时,难道没有一个Julia包“只起作用”吗?

我首先想借此机会澄清一些术语:LightGraphs本身并不规定图形类型。它是一组算法和一个接口规范。您看到的限制是SimpleGraphs,它是LightGraphs包附带的一种图形类型,是
graph
DiGraph
的默认类型

这一点很重要的原因是,创建一个完全满足您需要的图形类型非常容易(至少应该是这样),并且可以利用现有的LightGraphs基础设施。您(理论上)需要做的就是实现
src/interface.jl
中描述的接口功能。如果您正确地实现了它们,所有LightGraphs算法都应该正常工作(tm)(尽管它们可能没有性能;这取决于您选择的数据结构和做出的接口决策)


因此,我的建议是编写所需的图形结构,并实现十几个接口函数,然后看看哪些有效,哪些无效。如果有一个现有的算法与您的接口实现相冲突,请提交一个bug报告,我们将看到问题所在。

实际上
SimpleGraphs
具有我想要的行为。它保留子图的节点索引(
SimpleGraphs.include()
)。看来,
LightGraphs
本身在子图期间将索引合并到{1,2,…| V}。如果我错了,请纠正我。然后我将只使用
SimpleGraphs
SimpleGraphs
返回
induced_子图()
的贴图,该贴图告诉您原始顶点的位置。如果这足够了,那么是的,你很好。请注意,使用索引(
g[[1,3,5,7]]
)访问图形与
induced_子图()
相同,但没有此顶点映射。我对“
SimpleGraphs
induced_子图
”返回一个映射感到有点困惑
LightGraphs.induced_子图
返回一个(图,vmap)元组,新图具有合并的节点索引,这需要大量额外的代码来计算递归层中的vmap1[vmap2[vmap3[…vertex_idx]],以处理子图的子图
SimpleGraphs.include
只返回一个节点标识符未更改的新图形,不需要担心vmap,这是必需的行为。哦,你是说不相关的包
SimpleGraphs.jl
?我对它不太熟悉,但如果它能满足你的需要,那就太好了。我们这里有一些命名过载(这背后有一段历史,但最好是留在过去)。无论如何,很高兴听到你找到了一个能满足你需要的包裹。哦,真是一个意外。哈哈。谢谢你的帮助。