Skip to main content
IBM Quantum Platform

안쯔차 생성

qiskit_addon_aqc_tensor.ansatz_generation

안사츠 회로를 생성하는 도구.

AnsatzBlock답변 블록.
OneQubitAnsatzBlock1-큐비트 앤서츠 블록.
TwoQubitAnsatzBlock2쿼비트 앤사츠 블록.
ZXZZXZ 분해에 기반한 1-큐비트 안사츠 블록.
KAKKAK 분해에 기반한 2쿼비트 안사츠 블록.

generate_ansatz_from_circuit

generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')

GitHub

회로의 2큐비트 연결 구조에서 안사츠를 생성합니다.

동기 부여에 대한 설명 자료를 참조하세요.

매개변수

  • qc (QuantumCircuit) – 단일 회로로 가정되는 회로입니다. 장벽은 무시됩니다.
  • qubits_initially_zero (bool) – True 의 경우 각 큐비트의 첫 번째 Z 회전은 0으로 고정되는데, 이는 이러한 회전이 상태 0|0\rangle 에 영향을 미치지 않기 때문입니다.
  • parameter_name (str) – 의 이름 ParameterVector 반환된 안사츠 회로의 자유 파라미터를 나타냅니다.

리턴 유형

tuple[QuantumCircuit, list[float]]

리턴

(ansatz, parameter_values) 글로벌 단계까지 ansatz.assign_parameters(parameter_values)qc 과 동일합니다.

예:

다음 회로를 예로 들어 보겠습니다:

from qiskit import QuantumCircuit

qc = QuantumCircuit(6)
qc.rx(0.4, 0)
qc.ryy(0.2, 2, 3)
qc.h(2)
qc.rz(0.1, 2)
qc.rxx(0.3, 0, 1)
qc.rzz(0.3, 0, 1)
qc.cx(2, 1)
qc.s(1)
qc.h(4)
qc.draw("mpl")
이전 코드에서 출력한 회로도입니다.

위의 회로를 generate_ansatz_from_circuit()에 전달하면 입력과 동일한 위치에서 파라미터화된 2쿼비트 KAK 회전이 있는 앤사츠를 반환합니다:

from qiskit_addon_aqc_tensor import generate_ansatz_from_circuit

ansatz, initial_params = generate_ansatz_from_circuit(
    qc, qubits_initially_zero=True, parameter_name="x"
)
ansatz.draw("mpl")
이전 코드에서 출력한 회로도입니다.

생성된 안사츠에서 연속된 모든 단일 큐비트 게이트는 동일한 ZXZ 블록으로, 연속된 모든 2큐비트 게이트는 단일 큐비트 회전까지 하나의 KAK 블록으로 축소됩니다.

또한 generate_ansatz_from_circuit() 함수는 안사츠에 바인딩하면 전역 위상까지 원래 회로와 동일한 회로를 생성하는 파라미터를 제공합니다:

ansatz.assign_parameters(initial_params).draw("mpl")
이전 코드에서 출력한 회로도입니다.

1D 트로터 회로는 벽돌 구조가 특징인 비슷한 결과를 가져옵니다:

from rustworkx.generators import path_graph
from qiskit.synthesis import SuzukiTrotter
from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit, generate_xyz_hamiltonian

hamiltonian = generate_xyz_hamiltonian(
    path_graph(6),
    coupling_constants=(0.0, 0.0, 1.0),
    ext_magnetic_field=(0.4, 0.0, 0.0),
)

good_circuit = generate_time_evolution_circuit(
    hamiltonian,
    synthesis=SuzukiTrotter(reps=2),
    time=1.0,
)

good_circuit.draw("mpl", initial_state=True)
이전 코드에서 출력한 회로도입니다.
from qiskit_addon_aqc_tensor import generate_ansatz_from_circuit

ansatz, initial_params = generate_ansatz_from_circuit(
    good_circuit, qubits_initially_zero=True, parameter_name="x"
)
ansatz.assign_parameters(initial_params).draw("mpl", initial_state=True)
이전 코드에서 출력한 회로도입니다.

parametrize_circuit

parametrize_circuit(qc, /, *, parameter_name='theta')

GitHub

회로의 매개변수화된 버전을 만듭니다.

양자 회로가 주어지면, 수치 매개변수가 있는 게이트가 자유 매개변수가 있는 게이트(같은 유형의)로 대체된다는 점을 제외하면 동일한 또 다른 양자 회로를 구성합니다. 새 회로는 매개변수의 원래 값이 포함된 목록과 함께 반환됩니다.

매개변수

  • qc (QuantumCircuit) – 매개변수화할 양자 회로.
  • parameter_name (str) – 의 이름 ParameterVector 반환된 안사츠 회로의 자유 파라미터를 나타냅니다.

리턴 유형

tuple[QuantumCircuit, list[float | None]]

리턴

(ansatz, parameter_values) 를 사용하여 qc 에 이미 매개 변수가 포함되어 있지 않은 한 ansatz.assign_parameters(parameter_values)qc 과 동일하도록 합니다. qc 에 이미 매개변수가 있는 경우 parameter_values 에는 해당 매개변수에 해당하는 항목에 None 이 포함됩니다.

예:

다음 회로를 예로 들어 보겠습니다:

from qiskit import QuantumCircuit

qc = QuantumCircuit(6)
qc.rx(0.4, 0)
qc.ryy(0.2, 2, 3)
qc.h(2)
qc.rz(0.1, 2)
qc.rxx(0.3, 0, 1)
qc.rzz(0.3, 0, 1)
qc.cx(2, 1)
qc.s(1)
qc.h(4)
qc.draw("mpl")
이전 코드에서 출력한 회로도입니다.

위의 회로를 parametrize_circuit()에 전달하면 이 회로에서 숫자 파라미터를 자유 파라미터로 대체하여 얻은 안사츠를 반환합니다:

from qiskit_addon_aqc_tensor import parametrize_circuit

ansatz, initial_params = parametrize_circuit(qc)
ansatz.draw("mpl")
이전 코드에서 출력한 회로도입니다.

또한 parametrize_circuit() 함수는 매개변수를 제공하는데, 이 매개변수를 안사츠에 바인딩하면 원래의 회로와 동일한 회로가 만들어집니다:

ansatz.assign_parameters(initial_params).draw("mpl")
이전 코드에서 출력한 회로도입니다.

원래 회로에 이미 매개변수가 포함된 경우 반환된 매개변수 값에는 해당 매개변수에 해당하는 항목에 None 이 포함되며, 앞의 코드는 작동하지 않습니다. 다음 예는 이 경우 원래 회로를 복구하는 방법을 보여줍니다.

from qiskit.circuit import Parameter

qc = QuantumCircuit(3)
alpha1 = Parameter("alpha1")
alpha2 = Parameter("alpha2")
qc.ry(alpha1, [0])
qc.rz(0.1, [0])
qc.ry(alpha2, [1])
qc.rz(alpha1, [1])
qc.ry(0.2, [2])
qc.rz(0.3, [2])
ansatz, initial_params = parametrize_circuit(qc)
ansatz.assign_parameters(
    {
        param: val
        for param, val in zip(ansatz.parameters, initial_params)
        if val is not None
    },
    inplace=True,
)
ansatz.draw("mpl")
이전 코드에 의해 출력된 회로도
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.