Circuits aléatoires
qiskit.circuit.random
Aperçu
Le module qiskit.circuit.random offre des fonctions qui peuvent être utilisées pour générer des circuits arbitraires avec des portes sélectionnées de manière aléatoire à partir d'un ensemble donné de portes.
Ces circuits peuvent être utilisés pour évaluer le matériel quantique existant et estimer les performances des transpileurs de circuits quantiques et de l'infrastructure logicielle. Les fonctions ci-dessous peuvent générer des circuits quantiques sur mesure en respectant diverses propriétés telles que le nombre de qubits, la profondeur du circuit, la carte de couplage, l'ensemble de portes, etc.
Génération de circuits arbitraires
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)
Générer des circuits aléatoires de taille et de forme arbitraires.
Cette fonction génère un circuit aléatoire en sélectionnant au hasard des portes dans l'ensemble des portes standard de qiskit.circuit.library.standard_gates. Par exemple :
from qiskit.circuit.random import random_circuit
circ = random_circuit(2, 2, measure=True)
circ.draw(output='mpl')
Paramètres
- num_qubits (int) – nombre de fils quantiques
- depth (int) – niveaux opérationnels (c'est-à-dire la longueur du chemin critique)
- max_operands (int) – nombre maximal de qubits par opérande pour chaque porte (entre 1 et 4)
- measure (bool) – si True, mesure tous les qubits à la fin
- conditional (bool) – si Vrai, insérer des mesures intermédiaires et des conditionnelles
- reset (bool) – si True, l'insertion du milieu se réinitialise
- seed (int) – définit une graine aléatoire (facultatif)
- num_operand_distribution (dict) – une répartition des portes qui précise la proportion de portes à 1 qubit, 2 qubits, 3 qubits, …, n qubits dans le circuit aléatoire. Il faut s'attendre à un écart par rapport aux ratios spécifiés, qui dépend de la taille du circuit aléatoire demandé. (facultatif)
Retours
circuit construit
Type de retour
Rises
CircuitError - lorsque les options données ne sont pas valides
Génération de circuits arbitraires respectant le couplage des 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)
Génère un circuit aléatoire de taille et de forme arbitraires qui respecte strictement le graphe d'interaction passé en argument. Le graphe d'interaction est un graphe G=(V, E) où V sont les qubits du circuit, et E est l'ensemble des interactions de portes à deux qubits entre deux qubits particuliers du circuit.
Cette fonction génère un circuit aléatoire en sélectionnant au hasard les portes 1Q et 2Q dans l'ensemble des portes standard de qiskit.circuit.library.standard_gates. L'utilisateur peut attacher une valeur numérique comme métadonnée à l'arête du graphique indiquant le poids de l'arête en question, ces poids étant normalisés en fonction des probabilités de sélection des arêtes. Si toutes les pondérations des arêtes sont définies comme nulles, la probabilité que chaque paire de qubits soit sélectionnée est fixée à 1/N, où N est le nombre d'arêtes dans le graphe d'interaction introduit, c'est-à-dire que chaque arête est tirée uniformément. Si le poids d'une arête est fixé à zéro, cette arête particulière ne sera pas incluse dans le circuit de sortie.
La transmission d'une liste de tuples de qubits de contrôle, de qubits cibles et de probabilités associées est également acceptable pour spécifier un graphe d'interaction.
Si des valeurs numériques sont présentes en tant que probabilités, mais que certaines d'entre elles sont nulles ou négatives, l'adresse max_operands=2 soulèvera la question suivante : ValueError.
Si max_operands est fixé à 1, il n'y a pas d'opérations 2Q et il n'est donc pas nécessaire de s'occuper des bords. Dans ce cas, la fonction renverra un circuit à partir de la fonction random_circuit, qui sera transmise avec max_operands égal à 1.
Si max_operands est fixé à 2, alors dans chaque itération while 2Q les portes sont choisies aléatoirement, et les paires de qubits qui existent dans le graphe d'interaction d'entrée sont également choisies aléatoirement sur la base de la probabilité attachée à la paire de qubits. Ensuite, dans une itération for, les portes 2Q sont appliquées aux paires de qubits choisies au hasard, dans le but d'atteindre le nombre de 2Q sur n'importe quelle paire de qubits jusqu'au critère min_2q_gate_per_edge dès que possible dans une itération donnée. Si certains qubits sont encore inactifs après l'application des portes 2Q pour cette itération particulière, des portes 1Q choisies au hasard sont appliquées à ces qubits inactifs si insert_1q_oper a la valeur True.
Exemple :
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')
Paramètres
- interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]) – Graphique d'interaction
- min_2q_gate_per_edge (int) – Nombre minimal de fois où chaque paire de qubits doit être utilisée dans le circuit aléatoire. (facultatif, default:1 )
- max_operands (int) – Nombre maximal de qubits par opérande pour chaque porte (doit être 1 ou 2) (facultatif, default:2 )
- measure (bool) – Si la valeur est True, mesurer tous les qubits à la fin. (facultatif, valeur par défaut : False)
- conditional (bool) – Si la valeur est « True », insérer les mesures intermédiaires et les conditions. (facultatif, valeur par défaut : False)
- reset (bool) – Si la valeur est True, les réinitialisations intermédiaires sont insérées. (facultatif, valeur par défaut : False)
- seed (int) – définit une graine aléatoire. (Si aucune valeur n'est indiquée, une graine aléatoire est choisie) (facultatif)
- insert_1q_oper (bool) – Intégrer des opérations d' 1Q s au circuit. (facultatif, valeur par défaut : True)
- prob_conditional (float) – Probabilité inférieure à 1.0; cela sert à contrôler l'activation des conditions dans le circuit. (facultatif, valeur par défaut : 0.1 )
- prob_reset (float) – Probabilité inférieure à 1.0; ce paramètre sert à contrôler la fréquence des réinitialisations dans le circuit. (facultatif, valeur par défaut : 0.1 )
Retours
circuit construit
Type de retour
Rises
- CircuitError - Lorsque max_operands n'est pas 1 ou 2.
- CircuitError - Lorsque max_operands est fixé à 1, mais qu'aucune opération 1Q n'est autorisée en fixant insert_1q_oper à false.
- CircuitError - Lorsque le graphe d'interaction n'a pas d'arêtes, seules les portes 1Q sont possibles dans le circuit, mais insert_1q_oper est fixé à False.
- CircuitError - Lorsqu'un objet de graphe d'interaction non valide est transmis.
- ValueError - Étant donné max_operands=2, lorsqu'une arête a la probabilité Aucune mais pas toutes, ou qu'une des probabilités est négative.
Génération de circuits arbitraires avec des portes Clifford
random_clifford_circuit
qiskit.circuit.random.random_clifford_circuit(num_qubits, num_gates, gates='all', seed=None)
Générer un circuit de Clifford pseudo-aléatoire.
Cette fonction génère un circuit de Clifford en sélectionnant au hasard le nombre choisi de portes de Clifford parmi l'ensemble des portes standard dans qiskit.circuit.library.standard_gates. Par exemple :
from qiskit.circuit.random import random_clifford_circuit
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
circ.draw(output='mpl')
Paramètres
- num_qubits (int) – nombre de fils quantiques.
- num_gates (int) – le nombre de portes dans le circuit.
- gates (list[str]) – liste facultative de noms de portes de Clifford à partir desquels l'échantillon est prélevé de manière aléatoire. Si
"all"(valeur par défaut), toutes les portes de Clifford de la bibliothèque standard sont utilisées. - seed (int | np.random.Generator) – définit la graine aléatoire/le générateur (facultatif).
Retours
circuit construit
Type de retour