Skip to main content
IBM Quantum Platform

TwoLocal

class qiskit.circuit.library.TwoLocal(num_qubits=None, rotation_blocks=None, entanglement_blocks=None, entanglement='full', reps=3, skip_unentangled_qubits=False, skip_final_rotation_layer=False, parameter_prefix='θ', insert_barriers=False, initial_state=None, name='TwoLocal', flatten=None)

GitHub

베이스: NLocal

두 개의 로컬 회로.

2로컬 회로는 회전 레이어와 얽힘 레이어가 번갈아 가며 구성되는 파라미터화된 회로입니다. 회전 레이어는 모든 큐비트에 적용되는 단일 큐비트 게이트입니다. 얽힘 계층은 2큐비트 게이트를 사용하여 entanglement 을 사용하여 설정한 전략에 따라 큐비트를 얽습니다. 회전 및 얽힘 게이트는 모두 문자열로 지정할 수 있습니다(예 'ry' 또는 'cx'), 게이트형(예 RYGate 또는 CXGate) 또는 QuantumCircuit (예: 1쿼비트 회로 또는 2쿼비트 회로)로 설정합니다.

기본 얽힘 전략 세트가 제공됩니다:

  • 'full' 얽힘이란 각 큐비트가 다른 모든 큐비트와 얽혀 있는 상태를 말합니다.
  • 'linear' 얽힘은 큐비트 ii 큐비트와 얽힘 i+1i + 1, 모두 i{0,1,...,n2}i \in \{0, 1, ... , n - 2\}, 여기서 nn 은 총 큐비트 수입니다.
  • 'reverse_linear' 얽힘은 큐비트 ii 큐비트와 얽힘 i+1i + 1, 모두 i{n2,n3,...,1,0}i \in \{n-2, n-3, ... , 1, 0\}, 여기서 nn 은 총 큐비트 수입니다. entanglement_blocks = 'cx' 이 옵션은 'full' 과 동일한 유니티를 제공하지만 얽히는 게이트가 더 적다는 점에 유의하세요.
  • 'pairwise' 얽힘은 모든 짝수 값 ii 에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀있는 한 레이어와 모든 홀수 값 ii 에 대해 큐비트 ii 가 큐비트 i+1i + 1 와 얽혀있는 두 번째 레이어입니다.
  • 'circular' 얽힘은 선형 얽힘이지만 선형 부분 앞에 첫 번째와 마지막 큐비트에 대한 추가 얽힘이 있습니다.
  • 'sca' (시프트-원형-교대) 얽힘은 Sim et al. 에서 제안한 회로 14의 일반화되고 수정된 버전입니다. 이는 첫 번째 큐비트와 마지막 큐비트를 연결하는 '긴' 얽힘이 각 블록마다 하나씩 이동하는 원형 얽힘으로 구성됩니다. 또한 제어 큐비트와 타겟 큐비트의 역할은 매 블록마다 교체됩니다(따라서 번갈아 가며).

다음과 같은 인덱스 쌍의 목록인 인탱글러 맵을 사용하여 인탱글을 추가로 지정할 수 있습니다

>>> entangler_map = [(0, 1), (1, 2), (2, 0)]

블록마다 다른 인탱글을 사용해야 하는 경우 인탱글러 맵 목록을 제공하세요. 이 기능을 사용하는 방법은 아래 예시를 참조하세요.

>>> entanglement = [entangler_map_layer_1, entangler_map_layer_2, ... ]

insert_barriers 속성을 사용하여 서로 다른 레이어 사이에 장벽을 삽입하여 시각화를 개선할 수 있습니다.

파라미터화된 각 게이트에 대해 ParameterVector 을 사용하여 새 파라미터를 생성합니다. 이러한 매개 변수의 이름은 parameter_prefix 을 사용하여 선택할 수 있습니다.

예제

>>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
>>> print(two.decompose())  # decompose the layers into standard gates
     ┌──────────┐ ░            ░ ┌──────────┐ ░            ░ ┌──────────┐
q_0:Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6])
     ├──────────┤ ░ ┌─┴─┐      ░ ├──────────┤ ░ ┌─┴─┐      ░ ├──────────┤
q_1:Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7])
     ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤
q_2:Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8])
     └──────────┘ ░      └───┘ ░ └──────────┘ ░      └───┘ ░ └──────────┘
>>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
>>> qc = QuantumCircuit(3)
>>> qc &= two
>>> print(qc.draw())
     ┌──────────┐┌──────────┐ ░           ░ ┌──────────┐ ┌──────────┐
q_0:Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9])
     ├──────────┤├──────────┤ ░  │  │     ░ ├──────────┤┌┴──────────┤
q_1:Ry(θ[1]) ├┤ Rz(θ[4]) ├─░──■──┼──■──░─┤ Ry(θ[7]) ├┤ Rz(θ[10])
     ├──────────┤├──────────┤ ░     │  │  ░ ├──────────┤├───────────┤
q_2:Ry(θ[2]) ├┤ Rz(θ[5]) ├─░─────■──■──░─┤ Ry(θ[8]) ├┤ Rz(θ[11])
     └──────────┘└──────────┘ ░           ░ └──────────┘└───────────┘
>>> entangler_map = [[0, 1], [1, 2], [2, 0]]  # circular entanglement for 3 qubits
>>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
>>> print(two)  # note: no barriers inserted this time!
        ┌───┐                             ┌──────────┐┌───┐
q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
        ├───┤┌────┴─────┐            ┌───┐└─────┬────┘└───┘
q_1: |0>┤ X ├┤ Rx(θ[0]) ├─────■──────┤ X ├──────┼──────────
        ├───┤└──────────┘┌────┴─────┐└───┘      │     ┌───┐
q_2: |0>┤ X ├────────────┤ Rx(θ[1]) ├───────────■─────┤ X ├
        └───┘            └──────────┘                 └───┘
>>> entangler_map = [[0, 3], [0, 2]]  # entangle the first and last two-way
>>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
>>> circuit = two.compose(two)
>>> print(circuit.draw())  # note, that the parameters are the same!
q_0: ─────■───────────■───────────■───────────■──────
          │           │           │           │
q_1: ─────┼───────────┼───────────┼───────────┼──────
          │      ┌────┴─────┐     │      ┌────┴─────┐
q_2: ─────┼──────┤ Ry(θ[1]) ├─────┼──────┤ Ry(θ[1])
     ┌────┴─────┐└──────────┘┌────┴─────┐└──────────┘
q_3:Ry(θ[0]) ├────────────┤ Ry(θ[0]) ├────────────
     └──────────┘            └──────────┘
>>> layer_1 = [(0, 1), (0, 2)]
>>> layer_2 = [(1, 2)]
>>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
... flatten=True)
>>> print(two)
     ┌───┐ ░            ░ ┌───┐ ░       ░ ┌───┐
q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
     ├───┤ ░ ┌─┴─┐  │   ░ ├───┤ ░       ░ ├───┤
q_1: ┤ X ├─░─┤ X ├──┼───░─┤ X ├─░───■───░─┤ X ├
     ├───┤ ░ └───┘┌─┴─┐ ░ ├───┤ ░ ┌─┴─┐ ░ ├───┤
q_2: ┤ X ├─░──────┤ X ├─░─┤ X ├─░─┤ X ├─░─┤ X ├
     └───┘ ░      └───┘ ░ └───┘ ░ └───┘ ░ └───┘
버전부터 사용되지 않음 2.1

qiskit.circuit.library.n_local.two_local.TwoLocal 클래스는 키스킷 2.1 에서 더 이상 사용되지 않습니다. 키스킷 3.0 에서 제거됩니다. 대신 qiskit.circuit.library.n_local 함수를 사용하세요.

매개변수

  • num_qubits (int | None) – 두 로컬 회로의 큐비트 수입니다.
  • rotation_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – 회전층에 사용되는 게이트. 게이트 이름을 통해 지정할 수 있습니다 (예: 'ry') 또는 게이트 유형 자체 (예: RYGate). 게이트가 하나만 제공되는 경우, 각 큐비트에 동일한 게이트가 적용됩니다. 게이트 목록이 제공되면, 모든 게이트가 제공된 순서대로 각 큐비트에 적용됩니다. 자세한 내용은 ‘예제’ 섹션을 참조하십시오.
  • entanglement_blocks (str |type |qiskit.circuit.Instruction |QuantumCircuit |list[str |type |qiskit.circuit.Instruction |QuantumCircuit] | None) – 얽힘 계층에 사용되는 게이트들. rotation_blocks.과 동일한 형식으로 지정할 수 있습니다.
  • entanglement (str |list[list[int]] | Callable[[int], list[int]]) – 얽힘 구조를 지정합니다. 문자열('full', 'linear', 'reverse_linear', 'circular' 또는 'sca'), 서로 얽힌 큐비트의 인덱스를 지정하는 정수 쌍의 목록 또는 얽힘 계층의 인덱스와 함께 제공된 이러한 목록을 반환하는 콜러블일 수 있습니다. 기본값은 'full' 얽힘입니다. entanglement_blocks = 'cx' 이면 'full' 얽힘은 'reverse_linear' 과 동일한 단위를 제공하지만 후자의 옵션은 얽힘 게이트가 더 적다는 점에 유의하세요. 자세한 내용은 예제 섹션을 참조하세요.
  • reps (int) – 회전 레이어와 얽힘 레이어로 구성된 블록이 반복되는 빈도를 지정합니다.
  • skip_unentangled_qubits (bool) – True 인 경우 단일 큐비트 게이트는 다른 큐비트와 얽혀 있는 큐비트에만 적용됩니다. False 이면 단일 큐비트 게이트가 앤사츠의 각 큐비트에 적용됩니다. 기본값은 False 입니다.
  • skip_final_rotation_layer (bool) – False 인 경우 안사츠의 끝에 회전 레이어가 추가됩니다. True, 회전 레이어가 추가되지 않습니다.
  • parameter_prefix (str) – 파라미터화된 게이트는 파라미터를 정의해야 하는데, 여기에는 인스턴스화된 Parameter. 각 매개변수의 이름은 이 지정된 접두사에 해당 인덱스가 더해집니다.
  • insert_barriers (bool) – True 인 경우 각 레이어 사이에 장벽이 삽입됩니다. False 인 경우 장벽이 삽입되지 않습니다. 기본값은 False 입니다.
  • QuantumCircuitinitial_state (QuantumCircuit | None) – 회로 앞에 추가할 객체.
  • name (str) – 생성된 회로에 사용할 이름.
  • flatten (bool | None) – 여러 개의 게이트 오브젝트 레이어 안에 중첩하는 대신 평면 회로를 출력하려면 True 로 설정합니다. 현재 기본적으로 출력 회로의 내용은 보다 깔끔한 시각화를 위해 중첩된 객체로 래핑됩니다. 그러나 시각화 이외의 다른 용도로 이 회로를 사용하는 경우 매개변수 바인딩으로 인한 성능 오버헤드가 크지 않도록 이 플래그를 True 로 설정하는 것이 좋습니다.

속성

name

유형: str

사람이 읽을 수 있는 회로의 이름입니다.

예제

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

메소드

get_entangler_map

get_entangler_map(rep_num, block_num, num_block_qubits)

GitHub

얽힘이 무시되는 1 큐비트라는 특수한 경우를 처리하기 위한 오버로드.

매개변수

  • rep_num (int)
  • block_num (int)
  • num_block_qubits (int)

리턴 유형

시퀀스 [ 시퀀스 [ int ]]

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.