Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
베이스: TransformationPass
하나 이상의 통근 게이트를 커플링 맵으로 경로를 변경하는 클래스입니다.
이 패스는 Commuting2qBlock 명령어로 캡슐화된 커뮤팅 2쿼비트 게이트 블록을 라우팅합니다. 이 패스는 다른 지침에는 적용되지 않습니다. 커플링 맵에 대한 매핑은 스왑 전략을 사용하여 수행됩니다( SwapStrategy 참조). 스왑 전략은 문제와 커플링 맵에 적합해야 합니다. 이 트랜스파일러 패스는 양자 회로가 유휴 앤실라 큐비트로 확대되기 전에 실행하는 것이 이상적입니다. 그렇지 않으면 사용하려는 칩 부분 외부에서 큐비트를 교체할 수 있습니다. 따라서 스왑 전략과 관련 커플링 맵은 물리적 큐비트를 나타내지 않습니다. 대신 초기 레이아웃이 적용된 후 물리적 큐비트에 대응하는 중간 매핑을 나타냅니다. 아래 예시는 커플링 맵을 사용하여 5개의 큐비트 장치 중 4개의 큐비트 PauliEvolutionGate 을 5큐비트 디바이스의 큐비트 0, 1, 3, 4에 결합 맵으로 매핑하는 방법을 보여줍니다
0 -- 1 -- 2
|
3
|
4이를 위해 가상 큐비트 0, 1, 2, 3을 기준으로 정의된 큐비트 0, 1, 3, 4에 대해 라인 스왑 전략을 사용합니다.
from qiskit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import Layout, CouplingMap, PassManager
from qiskit.transpiler.passes import FullAncillaAllocation
from qiskit.transpiler.passes import EnlargeWithAncilla
from qiskit.transpiler.passes import ApplyLayout
from qiskit.transpiler.passes import SetLayout
from qiskit.transpiler.passes.routing.commuting_2q_gate_routing import (
SwapStrategy,
FindCommutingPauliEvolutions,
Commuting2qGateRouter,
)
# Define the circuit on virtual qubits
op = SparsePauliOp.from_list([("IZZI", 1), ("ZIIZ", 2), ("ZIZI", 3)])
circ = QuantumCircuit(4)
circ.append(PauliEvolutionGate(op, 1), range(4))
# Define the swap strategy on qubits before the initial_layout is applied.
swap_strat = SwapStrategy.from_line([0, 1, 2, 3])
# Choose qubits 0, 1, 3, and 4 from the backend coupling map shown above.
backend_cmap = CouplingMap(couplinglist=[(0, 1), (1, 2), (1, 3), (3, 4)])
initial_layout = Layout.from_intlist([0, 1, 3, 4], *circ.qregs)
pm_pre = PassManager(
[
FindCommutingPauliEvolutions(),
Commuting2qGateRouter(swap_strat),
SetLayout(initial_layout),
FullAncillaAllocation(backend_cmap),
EnlargeWithAncilla(),
ApplyLayout(),
]
)
# Insert swap gates, map to initial_layout and finally enlarge with ancilla.
pm_pre.run(circ).draw("mpl")이 패스 매니저는 스왑 게이트가 적용될 때 큐비트 레이아웃에 해당하는 current_layout 에 의존합니다. 패스는 dag의 모든 노드를 횡단합니다. 노드가 스왑 전략을 사용하여 라우팅되어야 하는 경우 중간에 스왑 레이어가 있는 하위 인스트럭션으로 분해되고 current_layout 이 수정됩니다. 스왑 전략을 사용해 라우팅해서는 안 되는 노드는 current_layout 을 고려하여 dag에 다시 추가됩니다.
매개변수
- 스왑_전략 - 인스트럭션을 하드웨어에 매핑하기 위해 사용되는 스왑 레이어와 이를 적용할 순서를 저장하는
SwapStrategy의 인스턴스입니다. 이 필드가 지정되지 않은 경우 패스의 속성 집합에 포함되어야 합니다. 이를 통해 다른 패스가 런타임에 가장 적합한 스왑 전략을 결정할 수 있습니다. - edge_coloring - 커플링 맵의 선택적 가장자리 색 지정 ( I.e. 노드를 공유하는 두 가장자리의 색이 같지 않음). 에지 컬러링이 주어지면 현재 큐비트 순열이 주어졌을 때 동시에 적용할 수 있는 커뮤팅 게이트는 에지 컬러링에 따라 그룹화되고 이 에지 컬러링에 따라 적용됩니다. 여기서 색상은 동시에 적용할 수 있는 출퇴근 게이트 그룹을 정의하고 액세스하기 위한 인덱스로 사용되는 int입니다. 가장자리 색상을 지정하지 않으면 욕심 많은 알고리즘을 사용하여 집합을 구축합니다. 엣지 컬러링은 스왑 게이트 옆에
RZZGates와 같은 게이트를 배치하여 CX 취소를 활용하는 데 유용합니다.
속성
is_analysis_pass
패스가 분석 패스인지 확인합니다.
패스가 AnalysisPass, 인 경우 패스가 DAG를 분석하고 해당 분석 결과를 속성 집합에 쓸 수 있음을 의미합니다. 이러한 종류의 패스에서는 DAG에 대한 수정이 허용되지 않습니다.
is_transformation_pass
패스가 변환 패스인지 확인합니다.
패스가 TransformationPass, 인 경우 패스가 DAG를 조작할 수는 있지만 속성 집합을 수정할 수는 없음을 의미합니다(단, 읽을 수는 있음).
메소드
execute
execute(passmanager_ir, state, callback=None)
입력된 키스킷 IR에 대한 최적화 작업을 실행합니다.
매개변수
- passmanager_ir (DAGCircuit) – 최적화할 Qiskit IR.
- state (DAGCircuit) – 패스 관리자 자체에 의한 워크플로 실행과 관련된 상태.
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – 최적화 작업이 실행될 때마다 호출되는 콜백 함수입니다.
리턴
최적화된 키스킷 IR 및 워크플로 상태.
리턴 유형
튜플 [ DAGCircuit, PassManagerState ]
name
run
run(dag)
패스가 적용되는 노드를 분해하여 패스를 실행합니다.
매개변수
dag (DAGCircuit) – 스왑을 추가할 날짜입니다.
리턴
의도한 게이트 유형에 스왑이 추가된 데이그입니다.
레이즈
- TranspilerError – 초기화 시점에 스왑 전략이 지정되지 않았고, 속성 집합에도 스왑 전략이 없는 경우.
- TranspilerError – 양자 회로에 큐비트 레지스터가 두 개 이상 포함된 경우.
- TranspilerError – 양자 레지스터에 포함되지 않은 큐비트가 있는 경우.
리턴 유형
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
Commuting2qBlock 인스턴스를 가져와서 커플링 맵에 매핑합니다.
매핑은 스왑 전략으로 이루어집니다.
매개변수
- dag (DAGCircuit) –
Commuting2qBlock라우팅을 포함하는 dag입니다. - node (DAGOpNode) – 작업이
Commuting2qBlock인 노드입니다. - current_layout (Layout) – 스왑이 적용되기 전의 레이아웃입니다. 이 함수는 후속 게이트가 다그에 올바르게 구성될 수 있도록 레이아웃을 수정합니다.
- swap_strategy (SwapStrategy) – 노드를 분해하는 데 사용되는 스왑 전략입니다.
리턴
Commuting2qBlock 의 게이트를 하드웨어에 매핑하기 위해 스왑 게이트가 추가된 커플링 맵과 호환되는 dag입니다.
리턴 유형
update_status
update_status(state, run_state)
워크플로 상태를 업데이트합니다.
매개변수
- state (PassManagerState) – 관리자 상태를 전달하여 업데이트합니다.
- run_state (RunState) – 현재 작업의 완료 상태입니다.
리턴
패스 관리자 상태가 업데이트되었습니다.
리턴 유형