电路操作#

本节详细介绍 Janus 电路的创建和操作方法。

创建电路#

推荐方法:from_layers

使用 from_layers 方法创建电路,明确指定每层的门:

from janus.circuit import Circuit

# 创建 2 量子比特的电路
# 每个列表元素代表一层,同一层的门可以并行执行
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],           # 第 0 层
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],       # 第 1 层
    [{'name': 'rx', 'qubits': [0], 'params': [1.57]}],      # 第 2 层
], n_qubits=2)

门的格式

每个门是一个字典,包含三个字段:

  • name: 门的名称(如 'h', 'cx', 'rx')

  • qubits: 作用的量子比特列表

  • params: 参数列表(无参数门为空列表)

# 单比特门示例
{'name': 'h', 'qubits': [0], 'params': []}           # H 门
{'name': 'rx', 'qubits': [0], 'params': [1.57]}      # RX(π/2) 门
{'name': 'u', 'qubits': [0], 'params': [1.57, 0, 0]} # U 门

# 两比特门示例
{'name': 'cx', 'qubits': [0, 1], 'params': []}       # CNOT 门
{'name': 'crx', 'qubits': [0, 1], 'params': [1.57]}  # 受控 RX 门

# 三比特门示例
{'name': 'ccx', 'qubits': [0, 1, 2], 'params': []}   # Toffoli 门

并行门

同一层的门可以并行执行:

qc = Circuit.from_layers([
    [  # 这三个门在同一层,可以并行执行
        {'name': 'h', 'qubits': [0], 'params': []},
        {'name': 'h', 'qubits': [1], 'params': []},
        {'name': 'h', 'qubits': [2], 'params': []},
    ],
    [  # 第二层
        {'name': 'cx', 'qubits': [0, 1], 'params': []},
    ],
], n_qubits=3)

其他创建方法

# 创建空电路(不推荐,但支持)
qc = Circuit(3)

# 指定经典比特数
qc = Circuit.from_layers([...], n_qubits=3, n_clbits=3)

# 给电路命名
qc = Circuit.from_layers([...], n_qubits=2, name='my_circuit')

电路属性#

qc.n_qubits            # 量子比特数
qc.n_clbits            # 经典比特数
qc.depth               # 电路深度(层数)
qc.n_gates             # 门总数
qc.num_two_qubit_gate  # 两比特门数量
qc.duration            # 估算执行时间
qc.gates               # 门列表(字典格式)
qc.layers              # 分层表示
qc.operated_qubits     # 实际被操作的量子比特
qc.measured_qubits     # 需要测量的量子比特
qc.parameters          # 电路中的参数集合
qc.name                # 电路名称

添加量子门#

虽然推荐使用 from_layers 创建完整电路,但也可以动态添加门:

使用 append 方法

from janus.circuit import Circuit
from janus.circuit.library import HGate, CXGate

qc = Circuit(2)
qc.append(HGate(), [0])
qc.append(CXGate(), [0, 1])

链式创建受控门

from janus.circuit.library import RXGate, U3Gate

qc = Circuit(4)
# 创建受控 RX 门
qc.gate(RXGate(np.pi/4), 2).control(0)

# 创建多控制门
qc.gate(U3Gate(np.pi/4, 0, 0), 3).control([0, 1, 2])

电路操作#

复制电路

qc_copy = qc.copy()

组合电路

qc1 = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
], n_qubits=2)

qc2 = Circuit.from_layers([
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

# 将 qc2 追加到 qc1
qc1.compose(qc2)

逆电路

# 创建电路的逆(所有门逆序并取逆)
qc_inv = qc.inverse()

门移动

# 获取门可移动的层范围
available = qc.get_available_space(gate_index=0)
print(available)  # range(0, 2)

# 移动门到新层
new_qc = qc.move_gate(gate_index=0, new_layer=1)

# 清理空层
qc.clean_empty_layers()

导出格式#

# 导出为字典列表
qc.to_dict_list()
# [{'name': 'h', 'qubits': [0], 'params': []}, ...]

# 导出为元组列表
qc.to_tuple_list()
# [('h', [0], []), ...]

# 导出为分层格式
qc.to_layers()
# [[{'name': 'h', ...}], [{'name': 'cx', ...}]]

可分离电路#

组合多个独立子电路,适用于可以并行执行的场景:

from janus.circuit import Circuit, SeperatableCircuit
import numpy as np

# 创建两个独立的子电路
c1 = Circuit.from_layers([
    [{'name': 'rx', 'qubits': [0], 'params': [0.785]}],
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

c2 = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'ry', 'qubits': [1], 'params': [1.047]}],
], n_qubits=2)

# 组合为可分离电路
sep_circuit = SeperatableCircuit([c1, c2], n_qubits=4)

DAG 表示#

有向无环图 (DAG) 表示便于电路分析和优化:

from janus.circuit import circuit_to_dag, dag_to_circuit

# 电路转 DAG
dag = circuit_to_dag(qc)

# DAG 属性
print(dag.depth())      # 深度
print(dag.count_ops())  # 门统计 {'h': 1, 'cx': 1}

# 遍历节点
for node in dag.op_nodes():
    print(f"门: {node.name}, 量子比特: {node.qubits}")

# DAG 转回电路
qc2 = dag_to_circuit(dag)

DAGDependency

用于分析门之间的依赖关系:

from janus.circuit import circuit_to_dag_dependency

dag_dep = circuit_to_dag_dependency(qc)
print(dag_dep.size())   # 节点数
print(dag_dep.depth())  # 深度

文件读写#

Janus 提供便捷的电路文件读写功能。

JSON 格式

电路以分层 JSON 格式存储:

[
  [{"name": "h", "qubits": [0], "params": []}],
  [{"name": "cx", "qubits": [0, 1], "params": []}],
  [{"name": "rx", "qubits": [0], "params": [1.57]}]
]

列出可用电路

from janus.circuit import list_circuits

# 列出预置电路
circuits = list_circuits()
print(circuits)  # ['bell', 'test']

# 列出指定目录的电路
circuits = list_circuits(directory='./my_circuits')

加载电路

from janus.circuit import load_circuit

# 从预置目录加载(按名称)
qc = load_circuit(name='bell')

# 从指定路径加载
qc = load_circuit(filepath='./my_circuit.json')

保存电路

from janus.circuit import save_circuit, Circuit

# 创建电路
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

# 保存电路(自动包含 n_qubits 信息)
save_circuit(qc, 'my_circuit.json')

保存的文件格式:

{
  "n_qubits": 2,
  "layers": [
    [{"name": "h", "qubits": [0], "params": []}],
    [{"name": "cx", "qubits": [0, 1], "params": []}]
  ]
}

手动保存(仅层数据)

import json

# 仅保存层数据
with open('circuit_layers.json', 'w') as f:
    json.dump(qc.to_layers(), f, indent=2)

命令行工具#

Janus 提供命令行工具查看和操作电路:

# 查看电路信息
python -m janus.circuit.cli info circuit.json
python -m janus.circuit.cli info circuit.json -v  # 详细信息

# 绘制电路
python -m janus.circuit.cli draw circuit.json
python -m janus.circuit.cli draw circuit.json -o output.png

# 测试电路
python -m janus.circuit.cli test circuit.json