Geração de Ansatz
qiskit_addon_aqc_tensor.ansatz_generation
Ferramentas para gerar circuitos ansatz.
AnsatzBlock | Bloco Ansatz. |
OneQubitAnsatzBlock | Bloco ansatz de um qubit. |
TwoQubitAnsatzBlock | Bloco ansatz de dois qubits. |
ZXZ | Bloco ansatz de um qubit baseado na decomposição ZXZ. |
KAK | Bloco ansatz de dois qubits com base na decomposição KAK. |
generate_ansatz_from_circuit
generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')
Gerar um ansatz a partir da estrutura de conectividade de dois qubits de um circuito.
Consulte o material explicativo para obter a motivação.
Parâmetros
- qc (
QuantumCircuit) – Um circuito, que se supõe ser unitário. As barreiras são ignoradas. - qubits_initially_zero (
bool) – SeTrue, a primeira rotação Z em cada qubit é fixada em zero porque essa rotação não tem efeito sobre o estado . - parameter_name (
str) – Nome para oParameterVectorque representam os parâmetros livres no circuito ansatz retornado.
Tipo de retorno
tuple[QuantumCircuit, list[float]]
Retorna
(ansatz, parameter_values) de modo que ansatz.assign_parameters(parameter_values) seja equivalente a qc até uma fase global.
Exemplo:
Considere o seguinte circuito como um exemplo:
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")Se o circuito acima for passado para generate_ansatz_from_circuit()ele retornará um ansatz com rotações KAK parametrizadas de dois qubits nos mesmos locais da entrada:
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")Observe que, no ansatz gerado, todas as portas consecutivas de um único qubit são colapsadas no mesmo bloco ZXZ e todas as portas consecutivas de dois qubits são colapsadas em um único bloco KAK, até as rotações de um único qubit.
Além disso, a função generate_ansatz_from_circuit() fornece parâmetros que, quando vinculados ao ansatz, resultarão em um circuito equivalente ao original, até uma fase global:
ansatz.assign_parameters(initial_params).draw("mpl")Um circuito 1D Trotter leva a um resultado semelhante, com sua estrutura de alvenaria característica:
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')
Crie uma versão parametrizada de um circuito.
Dado um circuito quântico, construa outro circuito quântico que seja idêntico, exceto pelo fato de que todas as portas com parâmetros numéricos são substituídas por portas (do mesmo tipo) com parâmetros livres. O novo circuito é retornado junto com uma lista que contém os valores originais dos parâmetros.
Parâmetros
- qc (
QuantumCircuit) – O circuito quântico a ser parametrizado. - parameter_name (
str) – Nome para oParameterVectorque representam os parâmetros livres no circuito ansatz retornado.
Tipo de retorno
tuple[QuantumCircuit, list[float | None]]
Retorna
(ansatz, parameter_values) de modo que ansatz.assign_parameters(parameter_values) seja idêntico a qc , desde que qc ainda não contenha parâmetros. Se qc já tiver parâmetros, então parameter_values conterá None nas entradas correspondentes a esses parâmetros.
Exemplo:
Considere o seguinte circuito como um exemplo:
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")Se o circuito acima for passado para parametrize_circuit()ele retornará um ansatz obtido a partir desse circuito, substituindo os parâmetros numéricos por parâmetros livres:
from qiskit_addon_aqc_tensor import parametrize_circuit
ansatz, initial_params = parametrize_circuit(qc)
ansatz.draw("mpl")Além disso, a função parametrize_circuit() fornece parâmetros que, quando vinculados ao ansatz, resultarão em um circuito idêntico ao original:
ansatz.assign_parameters(initial_params).draw("mpl")Se o circuito original já contiver parâmetros, os valores de parâmetro retornados conterão None nas entradas correspondentes a esses parâmetros, e o código anterior não funcionará. O exemplo a seguir mostra como recuperar o circuito original nesse caso.
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")