Circuiti casuali
qiskit.circuit.random
Panoramica
Il modulo qiskit.circuit.random offre funzioni che possono essere utilizzate per generare circuiti arbitrari con porte selezionate casualmente da un dato insieme di porte.
Questi circuiti possono essere utilizzati per il benchmarking dell'hardware quantistico esistente e per stimare le prestazioni dei transpiler di circuiti quantistici e dell'infrastruttura software. Le funzioni seguenti possono generare circuiti quantistici su misura rispettando varie proprietà come il numero di qubit, la profondità del circuito, la mappa di accoppiamento, l'insieme dei gate, ecc.
Generazione di circuiti arbitrari
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)
Generare circuiti casuali di dimensione e forma arbitrarie.
Questa funzione genera un circuito casuale selezionando casualmente le porte dall'insieme delle porte standard in qiskit.circuit.library.standard_gates. Ad esempio:
from qiskit.circuit.random import random_circuit
circ = random_circuit(2, 2, measure=True)
circ.draw(output='mpl')
Parametri
- num_qubits (int) – numero di fili quantici
- depth (int) – livelli operativi (ovvero lunghezza del percorso critico)
- max_operands (int) – numero massimo di qubit per ogni porta (da 1 a 4)
- measure (bool) – se Vero, misurare tutti i qubit alla fine
- conditional (bool) – se Vero, inserire misure centrali e condizionali
- reset (bool) – se è vero, inserisce il centro di ripristino
- seed (int) – imposta il seme casuale (facoltativo)
- num_operand_distribution (dict) – una distribuzione delle porte che specifica il rapporto tra le porte a 1 qubit, 2 qubit, 3 qubit, …, n qubit nel circuito casuale. È prevedibile uno scostamento dai rapporti specificati, che dipende dalle dimensioni del circuito casuale richiesto. (facoltativo)
Risultati
circuito costruito
Tipo di restituzione
Alza
CircuitError - quando vengono fornite opzioni non valide
Generazione di circuiti arbitrari rispettando l'accoppiamento dei qubit
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)
Genera un circuito casuale di forma e dimensioni arbitrarie che rispetta rigorosamente il grafo delle interazioni passato come argomento. Il grafico delle interazioni è un grafo G=(V, E) dove V sono i qubit del circuito ed E è l'insieme delle interazioni tra due qubit del circuito.
Questa funzione genera un circuito casuale selezionando casualmente le porte 1Q e 2Q dall'insieme delle porte standard in qiskit.circuit.library.standard_gates. L'utente può allegare un valore numerico come metadata al bordo del grafo, indicando il peso del bordo per quel particolare bordo. Questi pesi dei bordi sarebbero normalizzati alle probabilità che i bordi vengano selezionati. Se tutti i pesi dei bordi vengono passati come Nessuno, allora la probabilità che ogni coppia di qubit venga selezionata è impostata su 1/N, dove N è il numero di bordi nel grafo di interazione passato, cioè ogni bordo viene estratto in modo uniforme. Se il peso di un bordo è impostato a zero, quel particolare bordo non sarà incluso nel circuito di uscita.
Il passaggio di un elenco di tuple di qubit di controllo, qubit di destinazione e probabilità associata è accettabile anche come metodo per specificare un grafo di interazione.
Se i valori numerici sono presenti come probabilità, ma alcuni o alcuni sono Nessuno, o negativi, quando max_operands=2 solleverà un ValueError.
Se max_operandi è impostato a 1, allora non ci sono operazioni 2Q, quindi non è necessario occuparsi degli spigoli; in tal caso la funzione restituirà un circuito dalla funzione random_circuito, che verrebbe passata con max_operandi pari a 1.
Se max_operands è impostato su 2, in ogni iterazione while 2Q le porte vengono scelte in modo casuale e anche le coppie di qubit che esistono nel grafo delle interazioni in ingresso vengono scelte in modo casuale in base alla probabilità legata alla coppia di qubit. In seguito, in un'iterazione for 2Q le porte vengono applicate alle coppie di qubit scelte casualmente, con l'obiettivo di raggiungere il più presto possibile il numero di 2Q su qualsiasi coppia di qubit rispetto ai criteri di min_2q_gate_per_edge all'interno di una particolare iterazione. Ora, se alcuni qubit sono ancora inattivi dopo aver applicato le porte 2Q per quella particolare iterazione, a quei qubit inattivi vengono applicate porte 1Q scelte a caso se insert_1q_oper è impostato su True.
Esempio:
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')
Parametri
- interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]) – Grafico di interazione
- min_2q_gate_per_edge (int) – Numero minimo di volte in cui ogni coppia di qubit deve essere utilizzata nel circuito casuale. (facoltativo, default:1 )
- max_operands (int) – numero massimo di qubit per ogni porta (dovrebbe essere 1 o 2) (facoltativo, default:2 )
- measure (bool) – Se True, misurare tutti i qubit alla fine. (facoltativo, impostazione predefinita: False)
- conditional (bool) – Se vero, inserire le misure intermedie e le condizioni. (facoltativo, impostazione predefinita: False)
- reset (bool) – Se True, si inseriscono dei reset intermedi. (facoltativo, impostazione predefinita: False)
- seed (int) – imposta un seme casuale. (Se non specificato, viene scelto un seme casuale) (facoltativo)
- insert_1q_oper (bool) – Inserire le operazioni dell' 1Q e nel circuito. (facoltativo, impostazione predefinita: True)
- prob_conditional (float) – Probabilità inferiore all' 1.0; viene utilizzata per controllare l'attivazione delle condizioni nel circuito. (facoltativo, impostazione predefinita: 0.1 )
- prob_reset (float) – Probabilità inferiore all' 1.0; questo valore viene utilizzato per controllare il verificarsi del reset nel circuito. (facoltativo, impostazione predefinita: 0.1 )
Risultati
circuito costruito
Tipo di restituzione
Alza
- CircuitError - Quando max_operandi non è 1 o 2.
- CircuitError - Quando max_operands è impostato su 1, ma non sono consentite operazioni 1Q impostando insert_1q_oper su false.
- CircuitError - Quando il grafo delle interazioni non ha bordi, quindi nel circuito sono possibili solo porte 1Q, ma insert_1q_oper è impostato su False.
- CircuitError - Quando viene passato un oggetto del grafo di interazione non valido.
- ValueError - Dato max_operands=2, quando un bordo qualsiasi ha probabilità Nessuna ma non tutte, o una qualsiasi delle probabilità è negativa.
Generazione di circuiti arbitrari con porte Clifford
random_clifford_circuit
qiskit.circuit.random.random_clifford_circuit(num_qubits, num_gates, gates='all', seed=None)
Generare un circuito Clifford pseudocasuale.
Questa funzione genera un circuito Clifford selezionando casualmente la quantità scelta di porte Clifford dall'insieme di porte standard in qiskit.circuit.library.standard_gates. Ad esempio:
from qiskit.circuit.random import random_clifford_circuit
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
circ.draw(output='mpl')
Parametri
- num_qubits (int) – numero di fili quantici.
- num_gates (int) – numero di porte del circuito.
- gates (list[str]) – elenco opzionale di nomi di porte Clifford da cui campionare in modo casuale. Se
"all"(valore predefinito), utilizza tutte le porte Clifford della libreria standard. - seed (int | np.random.Generator) – imposta il seme/generatore casuale (opzionale).
Risultati
circuito costruito
Tipo di restituzione