안쯔차 생성
qiskit_addon_aqc_tensor.ansatz_generation
안사츠 회로를 생성하는 도구.
AnsatzBlock | 답변 블록. |
OneQubitAnsatzBlock | 1-큐비트 앤서츠 블록. |
TwoQubitAnsatzBlock | 2쿼비트 앤사츠 블록. |
ZXZ | ZXZ 분해에 기반한 1-큐비트 안사츠 블록. |
KAK | KAK 분해에 기반한 2쿼비트 안사츠 블록. |
generate_ansatz_from_circuit
generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')
회로의 2큐비트 연결 구조에서 안사츠를 생성합니다.
동기 부여에 대한 설명 자료를 참조하세요.
매개변수
- qc (
QuantumCircuit) – 단일 회로로 가정되는 회로입니다. 장벽은 무시됩니다. - qubits_initially_zero (
bool) –True의 경우 각 큐비트의 첫 번째 Z 회전은 0으로 고정되는데, 이는 이러한 회전이 상태 에 영향을 미치지 않기 때문입니다. - 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')
회로의 매개변수화된 버전을 만듭니다.
양자 회로가 주어지면, 수치 매개변수가 있는 게이트가 자유 매개변수가 있는 게이트(같은 유형의)로 대체된다는 점을 제외하면 동일한 또 다른 양자 회로를 구성합니다. 새 회로는 매개변수의 원래 값이 포함된 목록과 함께 반환됩니다.
매개변수
- 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")