Skip to main content
IBM Quantum Platform

Geração de Ansatz

qiskit_addon_aqc_tensor.ansatz_generation

Ferramentas para gerar circuitos ansatz.

AnsatzBlockBloco Ansatz.
OneQubitAnsatzBlockBloco ansatz de um qubit.
TwoQubitAnsatzBlockBloco ansatz de dois qubits.
ZXZBloco ansatz de um qubit baseado na decomposição ZXZ.
KAKBloco 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')

GitHub

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) – Se True, a primeira rotação Z em cada qubit é fixada em zero porque essa rotação não tem efeito sobre o estado 0|0\rangle.
  • parameter_name (str) – Nome para o ParameterVector que 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")
Diagrama de circuito gerado pelo código anterior.

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")
Diagrama de circuito gerado pelo código anterior.

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")
Diagrama de circuito gerado pelo código anterior.

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)
Diagrama de circuito gerado pelo código anterior.
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)
Diagrama de circuito gerado pelo código anterior.

parametrize_circuit

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

GitHub

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 o ParameterVector que 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")
Diagrama de circuito gerado pelo código anterior.

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")
Diagrama de circuito gerado pelo código anterior.

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")
Diagrama de circuito gerado pelo código anterior.

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")
Diagrama de circuito gerado pelo código anterior
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.