Skip to main content
IBM Quantum Platform

QkTranspileLayout

typedef struct QkTranspileLayout QkTranspileLayout

Le type QkTranspileLayout est utilisé pour modéliser les permutations introduites par le transpileur. En général, le transpileur de Qiskit préserve l'unité jusqu'à la disposition initiale et les permutations de sortie. La disposition initiale est la correspondance entre les qubits du circuit virtuel et les qubits physiques de la cible, et la permutation de sortie est causée par l'insertion d'une porte de permutation ou l'élision de la permutation avant que la disposition initiale ne soit définie dans le pipeline du transpilateur. Ce type permet de suivre ces détails et fournit une interface permettant de raisonner sur ces permutations.

Par exemple, si vous avez un circuit construit comme suit :

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {0};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {0, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t cx_1_qargs[2] = {0, 2};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

et pendant la phase de mise en page, le transpondeur fait correspondre les qubits virtuels de ce circuit aux circuits physiques comme suit :

0 -> 2, 1 -> 1, 2 -> 0

le circuit ressemblerait donc à

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {2};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t cx_1_qargs[2] = {2, 0};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

alors le résultat de qk_transpile_layout_initial_layout sera un tableau : [2, 1, 0]

Si le routage a été nécessaire pour insérer une porte de permutation dans le circuit après l'application de la mise en page, une permutation de sortie sera définie. Par exemple, si un échange a été inséré comme suit :

#include <qiskit.h>

QkCircuit *qc = qk_circuit_new(3, 0)
uint32_t h_qargs[1] = {2};
qk_circuit_gate(qc, QkGate_H, h_qargs, NULL);
uint32_t cx_0_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_0_qargs, NULL);
uint32_t swap_qargs[2] = {1, 0};
qk_circuit_gate(qc, QkGate_Swap, swap_qargs, NULL);
uint32_t cx_1_qargs[2] = {2, 1};
qk_circuit_gate(qc, QkGate_CX, cx_1_qargs, NULL);

l'état de sortie du qubit 0 se déplace vers le qubit 1 et le qubit 1’s vers le qubit 0. Ainsi, qk_transpile_layout_output_permutation renvoie le tableau : [1, 0, 2] pour indiquer qu'il s'agit de la position finale de l'état de chaque qubit après le mappage initial de la disposition. Si aucune permutation ou élision n'a été effectuée pendant la transpilation, il s'agira d'un tableau trivial de la forme [0, 1, 2] , car l'état de sortie du qubit n'est pas modifié par le transpileur.

En combinant ces deux éléments, on obtient le schéma final qui permet de suivre la position finale d'un qubit virtuel dans le circuit d'entrée. Ainsi, dans l'exemple ci-dessus (avec la permutation), la fonction qk_transpile_layout_final_layout renverrait [2, 0, 1] parce qu'après la disposition initiale et toute permutation de routage, la position finale du qubit 0 dans le circuit d'entrée est maintenant le qubit physique 2, le qubit virtuel 1 dans le circuit d'entrée est le qubit physique 0, et le qubit virtuel 2 dans le circuit d'entrée est le qubit physique 1.

Le transpileur allouera également des qubits ancillaires au circuit si la cible dispose de plus de qubits que le circuit d'entrée original. C'est pourquoi deux fonctions qk_transpile_layout_num_input_qubits et qk_transpile_layout_num_output_qubits sont nécessaires pour déterminer le nombre de qubits dans le circuit d'entrée et le circuit de sortie respectivement. En outre, les fonctions qk_transpile_layout_initial_layout et qk_transpile_layout_final_layout prennent un argument pour filtrer les ancillas du tableau de sortie. Si la valeur est fixée à true, le tableau de sortie sera filtré pour ne retenir que les qubits virtuels du circuit d'entrée original de l'appel au transpilateur qui a généré le site QkTranspileLayout.


Fonctions

qk_transpile_layout_num_input_qubits

uint32_t qk_transpile_layout_num_input_qubits(const QkTranspileLayout *layout)

Renvoie au transpileur le nombre de qubits dans le circuit d'entrée.

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout.

Paramètres

  • layout - Un pointeur sur le site QkTranspileLayout.

Retours

Le nombre de qubits d'entrée

qk_transpile_layout_num_output_qubits

uint32_t qk_transpile_layout_num_output_qubits(const QkTranspileLayout *layout)

Renvoie le nombre de qubits dans le circuit de sortie du transpileur.

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout.

Paramètres

  • layout - Un pointeur sur le site QkTranspileLayout.

Retours

Le nombre de qubits de sortie

qk_transpile_layout_initial_layout

bool qk_transpile_layout_initial_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *initial_layout)

Interroger la disposition initiale d'un site QkTranspileLayout.

Le tableau de sortie de cette fonction représente la correspondance entre les qubits virtuels du circuit d'entrée d'origine et le qubit physique du circuit de sortie. L'indice du tableau correspond au qubit virtuel et la valeur correspond au qubit physique. Par exemple, un tableau de sortie contenant :

[1, 0, 2]

indique que la disposition représente le qubit virtuel 0 -> qubit physique 1, le qubit virtuel 1 -> qubit physique -> 0, et le qubit virtuel 2 -> qubit physique 2.

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout. initial_layout doit être un pointeur valide et non nul avec une allocation suffisante pour stocker la taille nécessaire à la mise en page initiale. Si filter_ancillas est vrai, ce sera le nombre de qubits d'entrée (qui peut être vérifié avec qk_transpile_layout_num_input_qubits()) ou le nombre de qubits de sortie si filter_ancillas est faux (qui peut être interrogé avec qk_transpile_layout_num_output_qubits()).

Paramètres

  • layout - Un pointeur sur le site QkTranspileLayout.
  • filter_ancillas – Si cette option est définie sur « true », le tableau de sortie n'inclura aucun index pour les ancillas ajoutés par le transcompilateur.
  • initial_layout - Un pointeur sur le tableau dans lequel cette fonction écrira la disposition initiale. Il doit y avoir suffisamment d'espace pour le tableau complet, qui sera soit qk_transpile_layout_num_input_qubits() , soit qk_transpile_layout_num_output_qubits() , filter_ancillas étant respectivement vrai ou faux.

Retours

True si un initial_layout a été écrit sur initial_layout et false s'il n'y a pas de layout initial.

qk_transpile_layout_output_permutation

bool qk_transpile_layout_output_permutation(const QkTranspileLayout *layout, uint32_t *output_permutation)

Interroger la permutation de sortie d'un QkTranspileLayout

Le tableau de sortie de cette fonction représente la permutation induite par le transpileur où l'index indique le qubit au début du circuit et la valeur est la position du qubit à la fin du circuit. Par exemple, un tableau de sortie de :

[1, 2, 0]

indique que le qubit 0 du début du circuit se trouve sur le qubit 1 à la fin du circuit, 1 -> 2, et 2 -> 0.

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout. output_permutation doit être un pointeur valide et non nul, doté d'une allocation suffisante pour stocker la taille nécessaire à la permutation de sortie. Il s'agira toujours du nombre de qubits de sortie sur le site QkTranspileLayout qui peut être interrogé à l'aide du site qk_transpile_layout_num_output_qubits().

Paramètres

  • layout - Un pointeur sur le site QkTranspileLayout.
  • output_permutation - Pointeur sur le tableau dans lequel cette fonction écrira la permutation de sortie. Il doit y avoir suffisamment d'espace pour la sortie, qui correspondra au nombre de qubits de sortie dans le schéma. Il peut être interrogé à l'aide de qk_transpile_layout_num_output_qubits.

Retours

True si une permutation de sortie a été écrite sur output_permutation false si QkTranspileLayout ne contient pas de permutation de sortie.

qk_transpile_layout_final_layout

void qk_transpile_layout_final_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *final_layout)

Interroger la présentation finale d'un QkTranspileLayout

Le tableau de sortie représente la correspondance entre le qubit virtuel dans le circuit d'entrée original et le qubit physique à la fin du circuit de transposition qui a l'état de ce qubit. L'indice du tableau représente le qubit virtuel et la valeur représente le qubit physique à la fin du circuit transposé qui a l'état de ce qubit virtuel. Par exemple, un tableau de sortie de :

[2, 0, 1]

indique que l'état du qubit virtuel 0’s dans le circuit original est sur le qubit physique 2 à la fin du circuit transposé, 1 -> 0, et 2 -> 1.

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout. final_layout doit être un pointeur valide et non nul avec une allocation suffisante pour stocker la taille nécessaire à la mise en page finale. Si filter_ancillas est vrai, ce sera le nombre de qubits d'entrée (qui peut être vérifié avec qk_transpile_layout_num_input_qubits()) ou le nombre de qubits de sortie si filter_ancillas est faux (qui peut être interrogé avec qk_transpile_layout_num_output_qubits()).

Paramètres

  • layout - Un pointeur sur le site QkTranspileLayout.
  • filter_ancillas – Si cette option est définie sur « true », le tableau de sortie n'inclura aucun index pour les ancillas ajoutés par le transcompilateur.
  • final_layout - Un pointeur sur le tableau dans lequel cette fonction écrira la disposition finale. Il doit y avoir suffisamment d'espace pour la sortie, qui sera soit le nombre de qubits d'entrée, soit le nombre de qubits de sortie, en fonction de la valeur de filter_ancillas.

qk_transpile_layout_generate_from_mapping

QkTranspileLayout *qk_transpile_layout_generate_from_mapping(const QkDag *original_dag, const QkTarget *target, const uint32_t *qubit_mapping)

Générer un QkTranspileLayout à partir d'un mappage de disposition initial

Cela générera un QkTranspileLayout avec la disposition initiale définie (et aucune permutation de sortie) à partir d'un mappage fourni. Cette fonction permet de créer un passage de mise en page personnalisé qui génère également un QkTranspileLayout que vous pouvez utiliser avec des fonctions d'étape ultérieures telles que qk_transpile_stage_routing.

Sécurité

Le comportement est indéfini si original_dag et target ne target sont pas respectivement un pointeur valide, QkTarget aligné et non nul vers un QkDag ou un. qubit_mapping doit être un pointeur valide vers un tableau contigu de uint32_t avec suffisamment d'espace pour le nombre de qubits indiqué dans target.

Paramètres

  • original_dag – Pointeur vers le dag d'origine avant l'exécution d'un passage de mise en page personnalisé. Ce dag doit avoir moins ou autant de qubits que target.
  • target – Pointeur vers la cible sur laquelle la disposition a été exécutée. Cette cible doit avoir un nombre fixe de qubits défini.
  • qubit_mapping – Pointeur vers le tableau de mappage de disposition. Ce tableau doit comporter autant d'éléments qu'il y a de qubits dans la cible, chaque élément étant un entier unique compris entre 0 et num_qubitsnum_qubits est le nombre de qubits indiqué dans la valeur fournie pour target. Les premiers éléments représentent les qubits virtuels dans original_dag et la valeur représente le qubit physique dans la cible auquel le qubit virtuel est mappé. Par exemple, un tableau de [1, 0, 2] correspondrait au qubit virtuel 0 -> qubit physique 1, au qubit virtuel 1 -> qubit physique 0 et au qubit virtuel 2 -> qubit physique 2. Les éléments qui ne figurent pas dans le dag original sont traités comme des qubits auxiliaires, mais doivent tout de même être mappés à un qubit physique. Ce tableau sera copié dans la sortie, vous QkTranspileLayout devez donc le libérer après avoir appelé cette fonction.

Retours

L'objet QkTranspileLayout avec la mise en page initiale définie

qk_transpile_layout_free

void qk_transpile_layout_free(QkTranspileLayout *layout)

Libérer un objet QkTranspileLayout

Sécurité

Le comportement est indéfini si layout n'est pas un pointeur valide et non nul vers QkTranspileLayout.

Paramètres

  • layout - un pointeur sur le layout à libérer

qk_transpile_layout_to_python

PyObject *qk_transpile_layout_to_python(const QkTranspileLayout *layout, const QkCircuit *circuit)

Générer un objet de TranspileLayout l'espace Python à partir d'un QkTranspileLayout.

L'objet espace- Python créé est une copie de celui QkTranspileLayout fourni, la représentation des données est différente entre C et Python, et les données ne sont pas déplacées vers Python comme pour certaines autres *_to_python fonctions.

Sécurité

Le comportement est indéfini si layout et ne circuit sont pas des pointeurs valides et non QkTranspileLayout nuls vers respectivement QkCircuit et. On suppose que le thread qui exécute actuellement cette fonction détient le GIL d' Python. Ceci est nécessaire pour créer l'objet d' Python renvoyé par cette fonction.

Paramètres

  • mise en page – un pointeur vers un fichier QkTranspileLayout.
  • circuit – un pointeur vers l'original QkCircuit.

Retours

le pointeur d' PyObject s pour l'espace d' Python s TranspileLayout.

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