Circuitos aleatórios
qiskit.circuit.random
Visão geral
O módulo qiskit.circuit.random oferece funções que podem ser usadas para gerar circuitos arbitrários com portas selecionadas aleatoriamente de um determinado conjunto de portas.
Esses circuitos podem ser usados para aferir o hardware quântico existente e estimar o desempenho dos transpiladores de circuitos quânticos e da infraestrutura de software. As funções abaixo podem gerar circuitos quânticos sob medida, respeitando várias propriedades, como o número de qubits, a profundidade do circuito, o mapa de acoplamento, o conjunto de portas etc.
Gerando circuitos arbitrários
random_circuit
qiskit.circuit.random.random_circuit(num_qubits, depth, max_operands=4, measure=False, conditional=False, reset=False, seed=None, num_operand_distribution=None)
Gerar circuitos aleatórios de tamanho e forma arbitrários.
Essa função gerará um circuito aleatório selecionando aleatoriamente as portas do conjunto de portas padrão em qiskit.circuit.library.standard_gates. Por exemplo:
from qiskit.circuit.random import random_circuit
circ = random_circuit(2, 2, measure=True)
circ.draw(output='mpl')
Parâmetros
- num_qubits (int) – número de fios quânticos
- depth (int) – níveis de operações (ou seja, comprimento do caminho crítico)
- max_operands (int) – número máximo de qubits por operando em cada porta (entre 1 e 4)
- measure (bool) – se verdadeiro, medir todos os qubits no final
- conditional (bool) – se for True, insira medidas intermediárias e condicionais
- reset (bool) – se for True, a inserção do meio é redefinida
- seed (int) – define a semente aleatória (opcional)
- num_operand_distribution (dict) – uma distribuição de portas que especifica a proporção de portas de 1 qubit, 2 qubits, 3 qubits, …, n qubits no circuito aleatório. É de se esperar um desvio em relação às proporções especificadas, que depende do tamanho do circuito aleatório solicitado. (opcional)
Retorna
circuito construído
Tipo de retorno
**Levanta-se
CircuitError - quando são fornecidas opções inválidas
Gerando circuitos arbitrários respeitando o acoplamento de qubits
random_circuit_from_graph
qiskit.circuit.random.random_circuit_from_graph(interaction_graph, min_2q_gate_per_edge=1, max_operands=2, measure=False, conditional=False, reset=False, seed=None, insert_1q_oper=True, prob_conditional=0.1, prob_reset=0.1)
Gera um circuito aleatório de tamanho e forma arbitrários que respeita estritamente o gráfico de interação passado como argumento. O gráfico de interação é um gráfico G=(V, E) em que V são os qubits no circuito e E é o conjunto de interações de porta de dois qubits entre dois qubits específicos no circuito.
Essa função gerará um circuito aleatório selecionando aleatoriamente as portas 1Q e 2Q do conjunto de portas padrão em qiskit.circuit.library.standard_gates. O usuário pode anexar um valor numérico como metadados à borda do gráfico, indicando o peso da borda para essa borda específica. Esses pesos de borda seriam normalizados para as probabilidades de as bordas serem selecionadas. Se todos os pesos das bordas forem passados como None (Nenhum), a probabilidade de cada par de qubits ser selecionado será definida como 1/N, em que N é o número de bordas no gráfico de interação passado, ou seja, cada borda é desenhada uniformemente. Se qualquer peso de uma borda for definido como zero, essa borda específica não será incluída no circuito de saída.
Passar uma lista de tuplas de qubit de controle, qubit de destino e probabilidade associada também é aceitável como forma de especificar um gráfico de interação.
Se os valores numéricos estiverem presentes como probabilidades, mas alguns/alguns forem Nenhum ou negativos, quando max_operands=2 isso gerará um ValueError.
Se max_operands for definido como 1, então não haverá 2Q operações, portanto, não há necessidade de cuidar das bordas; nesse caso, a função retornará um circuito da função random_circuit, que seria passada com max_operands como 1.
Se max_operands for definido como 2, em cada iteração while 2Q gates são escolhidos aleatoriamente, e os pares de qubits que existem no gráfico de interação de entrada também são escolhidos aleatoriamente com base na probabilidade associada ao par de qubits. Em seguida, em uma iteração forçada, as portas 2Q são aplicadas aos pares de qubits escolhidos aleatoriamente com o objetivo de atingir a contagem de 2Q em qualquer par de qubits para os critérios min_2q_gate_per_edge o mais rápido possível em uma determinada iteração. Agora, se alguns qubits ainda estiverem ociosos após a aplicação de 2Q gates para essa iteração específica, então 1Q gates escolhidos aleatoriamente serão aplicados a esses qubits ociosos se insert_1q_oper estiver definido como True.
Exemplo:
from qiskit.circuit.random.utils import random_circuit_from_graph
import rustworkx as rx
pydi_graph = rx.PyDiGraph()
pydi_graph.add_nodes_from(range(7))
cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22), (4, 5, 0.13), (5, 6, 0.17)]
pydi_graph.add_edges_from(cp_map)
# cp_map can be passed in directly as interaction_graph
qc = random_circuit_from_graph(pydi_graph, min_2q_gate_per_edge=2, seed=12345)
qc.draw(output='mpl')
Parâmetros
- interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]) – Gráfico de interação
- min_2q_gate_per_edge (int) – Número mínimo de vezes que cada par de qubits deve ser utilizado no circuito aleatório. (opcional, default:1 )
- max_operands (int) – número máximo de qubits por operando em cada porta (deve ser 1 ou 2) (opcional, default:2 )
- measure (bool) – Se for True, medir todos os qubits no final. (opcional, padrão: False)
- conditional (bool) – Se for verdadeiro, insira as medidas intermediárias e as condições. (opcional, padrão: False)
- reset (bool) – Se for True, insira os reinícios intermediários. (opcional, padrão: False)
- seed (int) – define uma semente aleatória. (Se for "Nenhum", será escolhida uma semente aleatória) (opcional)
- insert_1q_oper (bool) – Inserir operações de " 1Q " no circuito. (opcional, padrão: True)
- prob_conditional (float) – Probabilidade inferior a 1.0; isso é usado para controlar a ocorrência de condições no circuito. (opcional, padrão: 0.1 )
- prob_reset (float) – Probabilidade inferior a 1.0; isso é usado para controlar a ocorrência de reinicialização no circuito. (opcional, padrão: 0.1 )
Retorna
circuito construído
Tipo de retorno
**Levanta-se
- CircuitError - Quando max_operands não for 1 ou 2.
- CircuitError - Quando max_operands é definido como 1, mas não são permitidas operações em 1Q, definindo insert_1q_oper como false.
- CircuitError - Quando o gráfico de interação não tem bordas, apenas 1Q gates são possíveis no circuito, mas insert_1q_oper está definido como False.
- CircuitError - Quando um objeto de gráfico de interação inválido é passado.
- ValueError - Dado max_operands=2, quando qualquer borda tem probabilidade Nenhuma, mas nem todas, ou qualquer uma das probabilidades é negativa.
Gerando circuitos arbitrários com portas Clifford
random_clifford_circuit
qiskit.circuit.random.random_clifford_circuit(num_qubits, num_gates, gates='all', seed=None)
Gerar um circuito Clifford pseudo-aleatório.
Essa função gerará um circuito Clifford selecionando aleatoriamente a quantidade escolhida de portas Clifford do conjunto de portas padrão em qiskit.circuit.library.standard_gates. Por exemplo:
from qiskit.circuit.random import random_clifford_circuit
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
circ.draw(output='mpl')
Parâmetros
- num_qubits (int) – número de fios quânticos.
- num_gates (int) – número de portas no circuito.
- gates (list[str]) – lista opcional de nomes de portas Clifford para amostragem aleatória. Se
"all"(padrão), use todas as portas de Clifford na biblioteca padrão. - seed (int | np.random.Generator) – define a semente/gerador aleatório (opcional).
Retorna
circuito construído
Tipo de retorno