如何在代码中表示组合电路 适配Python电路处理需求
组合电路Python实现优化方案
现有实现存在的核心问题
- Gate类的
__eq__方法存在属性名拼写错误:方法内引用的incoming/outgoing属性实际定义为incoming_gates/outgoing_gates,会直接触发属性不存在报错 - 相等性校验逻辑仅检查出入边数量,未校验实际连接的门是否匹配,容易出现误判
- 电路相等性强绑定门编号,两个结构完全一致但门编号不同的电路会被判定为不相等
- 出入边需要手动维护,新增/删除连接时要同时修改两个门的对应属性,操作繁琐易出错
优化实现方案
1. 基础类定义优化
使用Python标准库的dataclass简化类定义,新增内置方法自动维护连接关系,避免手动操作出入边列表:
from dataclasses import dataclass, field from typing import List, Dict # 提前定义允许的门类型集合,避免非法值传入 GATE_TYPES = {"and", "or", "nand", "nor", "xor", "xnor", "input", "output"} @dataclass(frozen=False, eq=False) class Gate: gate_type: str number: int incoming_gates: List["Gate"] = field(default_factory=list, repr=False) outgoing_gates: List["Gate"] = field(default_factory=list, repr=False) def __post_init__(self): if self.gate_type not in GATE_TYPES: raise ValueError(f"不支持的门类型: {self.gate_type}") # 快速获取扇出数 @property def fan_out(self) -> int: return len(self.outgoing_gates) # 快速获取扇入数 @property def fan_in(self) -> int: return len(self.incoming_gates) def __eq__(self, other: object) -> bool: if not isinstance(other, Gate): return False # 若需要结构相等而非编号相等,可去掉number校验,补充拓扑层级校验 return ( self.gate_type == other.gate_type and self.number == other.number and self.fan_in == other.fan_in and self.fan_out == other.fan_out # 若需要完全匹配连接关系,可补充下面两行(注意避免循环引用导致的递归死循环,建议结合电路拓扑排序做校验) # and [g.number for g in self.incoming_gates] == [g.number for g in other.incoming_gates] # and [g.number for g in self.outgoing_gates] == [g.number for g in other.outgoing_gates] ) @dataclass class Circuit: gates: Dict[int, Gate] = field(default_factory=dict) # 内置添加门方法,自动校验编号重复 def add_gate(self, gate: Gate) -> None: if gate.number in self.gates: raise ValueError(f"门编号{gate.number}已存在") self.gates[gate.number] = gate # 内置添加连接方法,自动维护双向出入边 def add_connection(self, source_gate_num: int, target_gate_num: int) -> None: source = self.gates[source_gate_num] target = self.gates[target_gate_num] source.outgoing_gates.append(target) target.incoming_gates.append(source) # 内置门数量统计 @property def gate_count(self) -> int: return len(self.gates) # 内置连接数统计 @property def connection_count(self) -> int: return sum(g.fan_out for g in self.gates.values()) def __eq__(self, other: object) -> bool: if not isinstance(other, Circuit): return False if self.gate_count != other.gate_count or self.connection_count != other.connection_count: return False # 编号匹配场景的相等校验,若需要结构同构校验,可替换为拓扑排序后的节点序列对比 for num, gate in self.gates.items(): if num not in other.gates or gate != other.gates[num]: return False return True
2. 常用功能实现说明
- 门电路合并:可新增
merge_gate方法,将冗余门的出入边转移到保留门后删除冗余门即可,方法内自动维护连接关系无需手动修改 - 扇出门查找:直接访问
gate.outgoing_gates属性即可获取该门驱动的所有下游门 - 结构相等性校验(无需匹配编号):可对两个电路做拓扑排序后,逐层对比节点类型、扇入扇出对应关系即可实现同构判断
3. 进阶优化方向
如果需要处理大规模电路,可新增拓扑排序缓存,每次电路修改后仅增量更新拓扑序列,大幅提升相等性校验、路径查找等操作的性能。
内容的提问来源于stack exchange,提问作者David Peters
相关产品推荐
相关产品推荐

