Zufällige Schaltungen
qiskit.circuit.random
Übersicht
Das Modul qiskit.circuit.random modul bietet Funktionen, mit denen sich beliebige Schaltungen mit Gattern erzeugen lassen, die zufällig aus einer gegebenen Menge von Gattern ausgewählt werden.
Diese Schaltungen können zum Benchmarking bestehender Quanten-Hardware und zur Abschätzung der Leistung von Quantenschaltkreis-Transpilern und Software-Infrastrukturen verwendet werden. Mit den nachstehenden Funktionen können maßgeschneiderte Quantenschaltungen unter Berücksichtigung verschiedener Eigenschaften wie Anzahl der Qubits, Tiefe der Schaltung, Kopplungskarte, Gattermenge usw. erzeugt werden.
Erzeugen beliebiger Schaltungen
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)
Erzeugen von Zufallsschaltungen beliebiger Größe und Form.
Diese Funktion erzeugt eine zufällige Schaltung durch zufällige Auswahl von Gattern aus der Menge der Standardgatter in qiskit.circuit.library.standard_gates. Zum Beispiel:
from qiskit.circuit.random import random_circuit
circ = random_circuit(2, 2, measure=True)
circ.draw(output='mpl')
Parameter
- num_qubits (int) – anzahl der Quantendrähte
- depth (int) – Ebenen der Abläufe (d. h. Länge des kritischen Pfades)
- max_operands (int) – maximale Anzahl an Qubit-Operanden pro Gatter (zwischen 1 und 4)
- measure (bool) – wenn True, alle Qubits am Ende messen
- conditional (bool) – wenn Wahr, mittlere Messungen und Bedingungen einfügen
- reset (bool) – wenn True, Mitte einfügen setzt zurück
- seed (int) – Zufallszahl-Startwert festlegen (optional)
- num_operand_distribution (dict) – eine Verteilung von Gatter, die das Verhältnis von 1-Qubit-, 2-Qubit-, 3-Qubit-, …, n-Qubit-Gattern im Zufallsschaltkreis angibt. Es ist mit einer Abweichung von den angegebenen Verhältnissen zu rechnen, die von der Größe der angeforderten Zufallsschaltung abhängt. (optional)
Rückgabe
aufgebaute Schaltung
Rückgabetyp
*Erhebt sich
CircuitError - wenn ungültige Optionen angegeben werden
Erzeugung beliebiger Schaltungen unter Berücksichtigung der Qubit-Kopplung
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)
Erzeugt zufällige Schaltkreise beliebiger Größe und Form, die den als Argument übergebenen Interaktionsgraphen strikt einhalten. Der Interaktionsgraph ist ein Graph G=(V, E), wobei V die Qubits in der Schaltung sind und E die Menge der Zwei-Qubit-Gate-Interaktionen zwischen zwei bestimmten Qubits in der Schaltung ist.
Diese Funktion erzeugt eine zufällige Schaltung durch zufällige Auswahl von 1Q und 2Q Gattern aus der Menge der Standardgatter in qiskit.circuit.library.standard_gates. Der Benutzer kann einen numerischen Wert als Metadaten an die Kante des Graphen anhängen, der das Kantengewicht für diese bestimmte Kante angibt. Diese Kantengewichte würden auf die Wahrscheinlichkeiten der ausgewählten Kanten normalisiert. Wenn alle Kantengewichte als None übergeben werden, dann wird die Wahrscheinlichkeit, dass jedes Qubit-Paar ausgewählt wird, auf 1/N gesetzt, wobei N die Anzahl der Kanten in dem übergebenen Interaktionsgraphen ist, d.h. jede Kante wird gleichmäßig gezogen. Wenn ein Gewicht einer Kante auf Null gesetzt wird, wird diese Kante nicht in die Ausgangsschaltung aufgenommen.
Die Übergabe einer Liste von Tupeln aus Kontroll-Qubit, Ziel-Qubit und zugehöriger Wahrscheinlichkeit ist ebenfalls akzeptabel, um einen Interaktionsgraphen zu spezifizieren.
Wenn numerische Werte als Wahrscheinlichkeiten vorhanden sind, aber einige/alle keine oder negative Werte sind, wird auf max_operands=2 eine ValueError angezeigt.
Wenn max_operands auf 1 gesetzt ist, gibt es keine 2Q Operationen, so dass die Kanten nicht beachtet werden müssen. In diesem Fall gibt die Funktion einen Schaltkreis von der Funktion random_circuit zurück, der mit max_operands als 1 übergeben würde.
Wenn max_operands auf 2 gesetzt ist, werden in jeder while-Iteration 2Q Gatter zufällig ausgewählt, und Qubit-Paare, die im Eingangsinteraktionsgraphen vorhanden sind, werden ebenfalls zufällig auf der Grundlage der dem Qubit-Paar zugeordneten Wahrscheinlichkeit ausgewählt. Dann werden in einer For-Iteration 2Q Gatter auf die zufällig ausgewählten Qubit-Paare angewandt, mit dem Ziel, die Anzahl von 2Q auf jedem Qubit-Paar zu min_2q_gate_per_edge Kriterien so schnell wie möglich innerhalb einer bestimmten Iteration zu erreichen. Wenn nun einige Qubits nach der Anwendung von 2Q Gattern für diese bestimmte Iteration noch im Leerlauf sind, dann werden zufällig ausgewählte 1Q Gatter auf diese Leerlauf-Qubits angewendet, wenn insert_1q_oper auf True gesetzt ist.
Beispiel:
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')
Parameter
- interaction_graph (PyGraph | PyDiGraph | List[Tuple[int, int, float]]) – Interaktionsdiagramm
- min_2q_gate_per_edge (int) – Mindestanzahl der Einsätze, die jedes Qubit-Paar in der Zufallsschaltung haben muss. (optional, default:1 )
- max_operands (int) – Maximale Anzahl an Qubit-Operanden pro Gatter (sollte 1 oder 2 betragen) (optional, default:2 )
- measure (bool) – Wenn „True“, werden am Ende alle Qubits gemessen. (optional, Standardwert: False)
- conditional (bool) – Falls „True“, füge Zwischenwerte und Bedingungen ein. (optional, Standardwert: False)
- reset (bool) – Wenn „True“, werden die mittleren Rücksätze eingefügt. (optional, Standardwert: False)
- seed (int) – legt einen Zufallsstartwert fest. (Falls nicht angegeben, wird ein Zufallswert ausgewählt) (optional)
- insert_1q_oper (bool) – Fügen Sie „ 1Q “-Operationen in die Schaltung ein. (optional, Standard: True)
- prob_conditional (float) – Wahrscheinlichkeit kleiner als 1.0; dies dient zur Steuerung des Auftretens von Bedingungen in der Schaltung. (optional, Standard: 0.1 )
- prob_reset (float) – Wahrscheinlichkeit kleiner als 0, 1.0; dies dient dazu, das Auftreten eines Resets in der Schaltung zu steuern. (optional, Standard: 0.1 )
Rückgabe
aufgebaute Schaltung
Rückgabetyp
*Erhebt sich
- CircuitError - Wenn max_operands nicht 1 oder 2 ist.
- CircuitError - Wenn max_operands auf 1 gesetzt ist, aber keine 1Q Operationen erlaubt sind, indem insert_1q_oper auf false gesetzt wird.
- CircuitError - Wenn der Interaktionsgraph keine Kanten hat, also nur 1Q Gatter in der Schaltung möglich sind, aber insert_1q_oper auf False gesetzt ist.
- CircuitError - Wenn ein ungültiges Interaktionsgraphenobjekt übergeben wird.
- ValueError - Gegeben max_operands=2, wenn irgendeine Kante die Wahrscheinlichkeit Keine hat, aber nicht alle, oder irgendeine der Wahrscheinlichkeiten negativ ist.
Erzeugen beliebiger Schaltungen mit Clifford-Gattern
random_clifford_circuit
qiskit.circuit.random.random_clifford_circuit(num_qubits, num_gates, gates='all', seed=None)
Erzeugen Sie eine pseudo-zufällige Clifford-Schaltung.
Diese Funktion erzeugt eine Clifford-Schaltung durch zufällige Auswahl der gewählten Anzahl von Clifford-Gattern aus der Menge der Standard-Gatter in qiskit.circuit.library.standard_gates. Zum Beispiel:
from qiskit.circuit.random import random_clifford_circuit
circ = random_clifford_circuit(num_qubits=2, num_gates=6)
circ.draw(output='mpl')
Parameter
- num_qubits (int) – anzahl der Quantendrähte.
- num_gates (int) – anzahl der Gatter in der Schaltung.
- gates (list[str]) – optionale Liste von Clifford-Gate-Namen, aus der eine Zufallsstichprobe gezogen wird. Wenn
"all"(Standard), werden alle Clifford-Gatter der Standardbibliothek verwendet. - seed (int | np.random.Generator) – setzt den Zufallsgenerator (optional).
Rückgabe
aufgebaute Schaltung
Rückgabetyp