Skip to content

Added multilayer hypergraph - #75

Merged
yifanfeng97 merged 3 commits into
iMoonLab:mainfrom
922397935:main
Oct 29, 2026
Merged

yifanfeng97 merged 3 commits into
iMoonLab:mainfrom
922397935:main

Conversation

@922397935

Copy link
Copy Markdown
Contributor

我简单写了一个多层超图应用的notebook,不知道是否不太规范,如果您觉得写的还行,我可以帮忙再加点儿文档的使用说明

@yifanfeng97 yifanfeng97 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢你的贡献!多层超图是社区非常需要的功能(#69, #71 都在讨论),非常欢迎这个 PR。但在合入前,有几个问题需要修复:


🔴 Bug — 需要修复

1. node_sum_before 列表累积污染

self.node_sum_before 在 construct_multi_layer_hypergraph()、_inter_layer_connect()、node_layer_list() 三个方法中都被 append。如果对同一个实例调用多个方法,列表会不断增长,导致偏移量计算错误。

建议:不要把 node_sum_before 作为可变实例状态,改为每次计算时使用局部变量:

def _compute_offsets(self):
    layer_num_v = [layer.num_v for layer in self.layers_list]
    return [sum(layer_num_v[:i]) for i in range(self.num_layers)]

2. construct_multi_layer_hypergraph 返回新的 MultilayerHypergraph

返回的新实例本身又需要调用 construct_multi_layer_hypergraph(),形成递归调用。建议:直接在当前实例上构建,或返回一个普通的 Hypergraph。

3. temp 列表推导式逻辑可能有误

temp = [self.node_layer[i][j] for i in range(num_layers) for j in range(num_layers) if i == j]

这只取了对角线元素 [node_layer[0][0], node_layer[1][1], ...]。如果意图是获取每层选中的节点列表,请确认逻辑是否正确。

4. load_interlayer_mapping 的 save 逻辑

在 isinstance(path, list) 分支中,连续两次 open(save_path, 'w') —— 第二次会覆盖第一次的内容。此外 gene_info 只在首次遇到 gene 时赋值,后续不更新。

5. 测试文件无法通过

  • test_construct_multilayer_hypergraph 把 fixture g1/g2 当函数调用(g1())→ 会抛 TypeError,fixture 不需要加括号
  • test_draw 引用了不存在的 fixture mhg
  • test_save 和 test_adjacency_matrix 测的是普通 Hypergraph,与多层超图无关,疑似从其他测试文件复制

🟡 代码质量 — 建议改进

# 问题 建议
6 import matplotlib.pyplot as plt 核心结构类不应依赖 matplotlib,移除或改为延迟导入
7 from tqdm import tqdm 同上,print + tqdm 应改用 logging 或去掉
8 docstring 混用中英文 项目约定用英文(Google/NumPy style)
9 from dhg import Hypergraph 有循环导入风险,改为 from .hypergraph import Hypergraph
10 文件末尾缺换行符 加一个 trailing newline
11 select_nodes 类型标注 num_v: int 实际接收 range,应改为正确的类型标注
12 notebook from data import MultilayerHypergraph 导入路径不对,应为 from dhg.structure import MultilayerHypergraph
13 notebook 含 870KB+ base64 图片 提交前请清除所有 cell output(jupyter nbconvert --clear-output)

整体来说功能方向很好,期待修改后的版本。如果需要帮助实现其中某些部分,欢迎讨论。

@922397935

Copy link
Copy Markdown
Contributor Author

-----我进行了如下修改:---

  1. 多层超图实现
    在 multilayer_hypergraph.py 中,我新增了 _compute_offsets(),每次根据各层节点数计算偏移量,不再把 node_sum_before 存在实例上反复追加。这样多次调用 node_layer_list()、_inter_layer_connect() 或构造方法时,不会因旧值累积而算错节点编号。

construct_multi_layer_hypergraph() 现在返回普通的 Hypergraph。合并后的结构是一个扁平超图,不需要再包装成 MultilayerHypergraph,也就避免了返回的新对象重复执行同一构造流程。

原来的 temp 写法只取 node_layer 的对角线位置,表达不够清楚。我改为直接对各层抽出的节点列表做笛卡尔积:每条生成的层间超边从每一层各取一个节点。默认连接概率为 0 时,不生成层间超边;原有的概率选择行为仍然保留。
映射文件与接口
在 load_interlayer_mapping() 中,列表路径分支现在只打开一次输出文件,避免第二次写入覆盖第一次结果。共享基因的层间编码会合并后写出,也会用于生成层间超边。

另外,select_nodes() 的参数标注改为 Iterable[int],因为它接收的是 range 等可迭代对象;核心类中移除了未使用的 matplotlib、tqdm 导入,并将 Hypergraph 改为相对导入。类的文档字符串也改成英文。
导出、测试与 notebook
我在 dhg/init.py 中导出 MultilayerHypergraph,让 from dhg import MultilayerHypergraph 能正常使用。

  1. 测试文件里,原测试将 fixture 函数名当作普通函数调用,也引用了未定义的 mhg fixture。我改为通过 pytest 注入 fixture,并把测试内容改成检查多层超图构造、偏移量重复调用、节点选择和映射保存。

  2. notebook 中的导入路径改为 from dhg.structure import MultilayerHypergraph,并清空了代码单元的执行输出和计数,去除旧结果和嵌入图片数据。

@922397935

Copy link
Copy Markdown
Contributor Author

@yifanfeng97

1 similar comment
@922397935

Copy link
Copy Markdown
Contributor Author

@yifanfeng97

主要在struct和test里
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants