Skip to main content
IBM Quantum Platform

Paramètres couramment utilisés pour la transpilation

  • Le code de cette page a été développé en tenant compte des exigences suivantes. Nous recommandons d'utiliser ces versions ou des versions plus récentes.

    qiskit[all]~=2.5.1
    qiskit-ibm-runtime~=0.47.0
    

Cette page décrit certains des paramètres les plus couramment utilisés pour la transpilation locale. Ces paramètres sont configurés à l'aide des arguments de generate_preset_pass_manager ou transpile.


Degré d'approximation

Vous pouvez utiliser le degré d'approximation pour spécifier à quel point vous souhaitez que le circuit résultant corresponde au circuit souhaité (d'entrée). Il s'agit d'un nombre flottant compris entre ( 0.0 - 1.0 ), où 0.0 correspond à l'approximation maximale et 1.0 (par défaut) à l'absence d'approximation. Les valeurs plus petites sacrifient la précision de la sortie à la facilité d'exécution (c'est-à-dire moins de portes). La valeur par défaut est 1.0.

Dans la synthèse unitaire à deux qubits (utilisée dans les étapes initiales de tous les niveaux et pour l'étape d'optimisation avec le niveau d'optimisation 3), cette valeur spécifie la fidélité cible de la décomposition de sortie. En d'autres termes, quelle est la quantité d'erreur introduite lorsqu'une représentation matricielle d'un circuit est convertie en portes discrètes. Si le degré d'approximation est plus faible (plus d'approximation), le circuit de sortie de la synthèse sera plus différent de la matrice d'entrée, mais il aura probablement moins de portes (parce que toute opération arbitraire à deux qubits peut être décomposée parfaitement avec au plus trois portes CX) et sera plus facile à exécuter.

Lorsque le degré d'approximation est inférieur à 1.0, des circuits comportant une ou deux portes CX peuvent être synthétisés, ce qui entraîne moins d'erreurs au niveau du matériel, mais plus au niveau de l'approximation. La CX étant la porte la plus coûteuse en termes d'erreur, il peut être avantageux d'en diminuer le nombre au détriment de la fidélité de la synthèse (cette technique a été utilisée pour augmenter le volume quantique sur les dispositifs IBM® ) : Validating quantum computers using randomized model circuits ).

À titre d'exemple, nous générons un site aléatoire à deux qubits UnitaryGate qui sera synthétisé au cours de la phase initiale. Un réglage de approximation_degree inférieur à 1.0 peut générer un circuit approximatif. Nous devons également spécifier le site basis_gates pour permettre à la méthode de synthèse de savoir quelles portes elle peut utiliser pour la synthèse approximative.

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager

UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)

qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
    optimization_level=1,
    approximation_degree=0.85,
    basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])

Output:

2

On obtient ainsi un résultat de 2 , car l'approximation nécessite moins de portes CX.


Graine du générateur de nombres aléatoires

Certaines parties du transpilateur sont stochastiques, de sorte que des exécutions répétées de la transpilation peuvent donner des résultats différents. Pour obtenir un résultat reproductible, vous pouvez définir la graine du générateur de nombres pseudo-aléatoires à l'aide de l'argument seed_transpiler . Des essais répétés utilisant la même semence donneront les mêmes résultats.

Exemple :

pass_manager = generate_preset_pass_manager(
    optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")

Output:

Output of the previous code cell

Disposition initiale

Avant la transpilation, les qubits contenus dans votre circuit sont des qubits virtuels qui ne correspondent pas nécessairement à des qubits physiques sur le backend cible. Vous pouvez spécifier le mappage initial des qubits virtuels aux qubits physiques en utilisant l'argument initial_layout . Notez que la disposition finale des qubits peut différer de la disposition initiale, car le transpileur peut permuter les qubits en utilisant des portes de permutation ou d'autres moyens.

Dans l'exemple ci-dessous, nous construisons une disposition initiale pour le backend fictif FakeSherbrooke en créant un objet Layout objet. Notre schéma fait correspondre le premier qubit de notre circuit au qubit 5 de Sherbrooke, et le deuxième qubit de notre circuit au qubit 6 de Sherbrooke. Notez que les qubits physiques sont toujours représentés par des nombres entiers.

Note

Le backend FakeSherbrooke fictif de qiskit_ibm_runtime est utilisé dans ces exemples, mais vous pouvez l'essayer sur n'importe quel backend réel ou fictif compatible avec Qiskit. Vos résultats peuvent varier.

from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout

backend = FakeSherbrooke()

a, b = qubits
initial_layout = Layout({a: 5, b: 6})

pass_manager = generate_preset_pass_manager(
    optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output:

Output of the previous code cell

Outre la spécification d'un objet Layout, vous pouvez également transmettre une liste d'entiers, où le ii -ème élément de la liste contient le qubit physique auquel le ii -ème qubit doit être associé. Par exemple :

initial_layout = [5, 6]

pass_manager = generate_preset_pass_manager(
    optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output:

Output of the previous code cell

Vous pouvez utiliser la fonction plot_error_map pour générer un diagramme du graphique du dispositif avec les informations d'erreur et les qubits physiques étiquetés. Vous pouvez également consulter des diagrammes similaires sur la page des ressources informatiques.

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output:

Output of the previous code cell

Options de la phase de transpilation et des plugins

Ces options sont précédées de _method. Ils influencent le fonctionnement du transpondeur et sont utilisés pour essayer d'obtenir un résultat meilleur, différent ou spécifique de la part du transpondeur.

  • init_method (str) - Le plugin à utiliser pour l'étape d'initialisation.

  • layout_method (str) - La passe de sélection de la mise en page (trivial, dense, sabre). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de mise en page.

  • optimization_method (str) - Le plugin à utiliser pour l'étape d'optimisation.

  • routing_method (str) - Nom du passage de routage (basic, lookahead, default, sabre, none). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de routage.

  • scheduling_method (str) - Nom du laissez-passer d'ordonnancement. Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de planification.

    • as_soon_as_possible: Programmer les instructions avec avidité : le plus tôt possible sur une ressource qubit (alias : asap).
    • as_late_as_possible: Programmer les instructions en retard. Il s'agit de maintenir les qubits dans l'état fondamental lorsque cela est possible (alias : alap).
  • translation_method (str) - Nom de la passe de traduction (unroller, translator, synthesis). Il peut également s'agir du nom du plugin externe à utiliser pour l'étape de traduction.

  • unitary_synthesis_method (str) - Le nom de la méthode de synthèse unitaire à utiliser. Par défaut, default est utilisé.

Pour obtenir une liste de tous les plugins installés pour une étape donnée, lancez list_stage_plugins("stage_name"). Par exemple, si vous souhaitez obtenir une liste de tous les plugins installés pour l'étape de routage, exécutez list_stage_plugins(routing).


Etapes suivantes

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.