BlockCollector
class qiskit.dagcircuit.BlockCollector(dag)
Basen: object
Diese Klasse implementiert verschiedene Strategien zur Aufteilung eines DAG (gerichteter azyklischer Graph) in Knotengruppen, die bestimmte Kriterien erfüllen. Es funktioniert sowohl mit der DAGCircuit als auch DAGDependency mit der Darstellung eines DAG, wobei letztere die Kommutativität zwischen den Knoten berücksichtigt.
Das Sammeln von Knoten aus der DAGDependency führt im Allgemeinen zu optimaleren Ergebnissen, ist aber langsamer, da zuvor eine DAGDependency konstruiert werden muss. Daher sollte DAGCircuit mit niedrigeren Transpiler-Einstellungen und DAGDependency mit höheren Transpiler-Einstellungen verwendet werden.
Im Allgemeinen gibt es mehrere Möglichkeiten, maximale Blöcke zu sammeln. Die hier verwendeten Ansätze sind von der Form "ausgehend von den Eingangsknoten eines DAG, sammeln gierig den größten Block von Knoten, die bestimmte Kriterien erfüllen". Für weitere Einzelheiten siehe https://github.com/Qiskit/qiskit/issues/5775.
Parameter
dag (Union[DAGCircuit, DAGDependency]) – Die Eingabe-DAG.
Erhöht
DAGCircuitError – Das Eingabeobjekt ist kein DAG.
Methoden
collect_all_matching_blocks
collect_all_matching_blocks(filter_fn, split_blocks=True, min_block_size=2, split_layers=False, collect_from_back=False, max_block_width=None)
Sammelt alle Blöcke, die einer bestimmten Filterfunktion filter_fn entsprechen. Dabei wird iterativ der größte Block gefunden, der nicht mit filter_fn übereinstimmt, dann der größte Block, der mit filter_fn übereinstimmt, und so weiter, bis keine nicht erfassten Knoten mehr übrig sind. Intuitiv hilft das Auffinden größerer Blöcke von nicht übereinstimmenden Knoten, um später größere Blöcke von übereinstimmenden Knoten zu finden.
Nachdem die Blöcke gesammelt wurden, können sie optional veredelt werden. Die Option split_blocks ermöglicht es, gesammelte Blöcke in Unterblöcke über disjunkte Qubit-Teilmengen aufzuteilen. Die Option split_layers ermöglicht es, gesammelte Blöcke in Schichten nicht überlappender Anweisungen aufzuteilen. Die Option min_block_size gibt die Mindestanzahl von Gates im Block an, damit der Block gesammelt wird. Die Option max_block_width gibt die maximale Anzahl von Qubits an, über die ein Block definiert werden kann.
Standardmäßig werden die Blöcke in der Richtung von den Eingängen zu den Ausgängen der Schaltung gesammelt. Die Option collect_from_back ermöglicht es, diese Richtung zu ändern, d.h. Blöcke von den Ausgängen zu den Eingängen der Schaltung zu sammeln.
Gibt nur die Liste der übereinstimmenden Blöcke zurück.
collect_matching_block
collect_matching_block(filter_fn, max_block_width)
Sammelt iterativ den größten Block von Eingabeknoten (d. h. Knoten mit _in_degree gleich 0), die einer bestimmten Filterfunktion entsprechen. Beispiele hierfür sind das Sammeln von Blöcken von Swap-Gattern, Blöcken von linearen Gattern (CXs und SWAPs), Blöcken von Clifford-Gattern, Blöcken von Ein-Qubit-Gattern, Blöcken von Zwei-Qubit-Gattern, usw. Hier bedeutet "iterativ", dass, sobald ein Knoten gesammelt wurde, die _in_degree jedes seiner unmittelbaren Nachfolger um 1 verringert wird, so dass mehr Knoten eingegeben werden können und für das Sammeln im aktuellen Block in Frage kommen. Gibt den Block der gesammelten Knoten zurück.
Parameter
Rückgabetyp
Liste [ DAGOpNode | DAGDepNode ]