Skip to main content
IBM Quantum Platform

QkTranspileLayout

typedef struct QkTranspileLayout QkTranspileLayout

Il tipo QkTranspileLayout viene utilizzato per modellare le permutazioni introdotte dal transpiler. In generale, il transpiler di Qiskit è unitario fino alla disposizione iniziale e alle permutazioni di uscita. Il layout iniziale è la mappatura dai qubit del circuito virtuale ai qubit fisici sul target e la permutazione in uscita è causata dall'inserimento di swap gate o dall'elisione della permutazione prima che il layout iniziale sia impostato nella pipeline del transpiler. Questo tipo tiene traccia di questi dettagli e fornisce un'interfaccia per ragionare su queste permutazioni.

Ad esempio, se si dispone di un circuito costruito come:

#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);

e durante la fase di layout il transpiler mappa i qubit virtuali di quel circuito nei circuiti fisici come:

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

quindi il circuito sarebbe simile:

#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);

allora il risultato di qk_transpile_layout_initial_layout sarà un array: [2, 1, 0]

Se è stato necessario inserire una porta di scambio nel circuito dopo l'applicazione del layout, verrà impostata una permutazione in uscita. Ad esempio, se è stato inserito uno swap come:

#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);

questo fa sì che lo stato di uscita del qubit 0 si sposti al qubit 1 e il qubit 1’s al qubit 0. Il risultato è che qk_transpile_layout_output_permutation restituisce l'array: [1, 0, 2] per indicare che questa è la posizione finale dello stato di ciascun qubit dopo la mappatura iniziale del layout. Se durante la transpilazione non sono stati effettuati scambi o elisioni di permutazione, si tratterà di un array banale della forma [0, 1, 2] , poiché lo stato di uscita del qubit non viene spostato dal transpiler.

Combinando questi due elementi si ottiene il layout finale, che serve a tracciare la posizione finale di un qubit virtuale nel circuito di ingresso. Quindi, nell'esempio precedente (con lo scambio), la funzione qk_transpile_layout_final_layout restituirebbe [2, 0, 1] perché, in seguito alla disposizione iniziale e a qualsiasi permutazione dell'instradamento, la posizione finale del qubit 0 nel circuito di ingresso è ora il qubit fisico 2, il qubit virtuale 1 nel circuito di ingresso è il qubit fisico 0 e il qubit virtuale 2 nel circuito di ingresso è il qubit fisico 1.

Il transpiler alloca anche qubit ancilla al circuito se la destinazione ha più qubit disponibili rispetto al circuito di ingresso originale. Per questo motivo sono necessarie due funzioni qk_transpile_layout_num_input_qubits e qk_transpile_layout_num_output_qubits che tengono traccia del numero di qubit rispettivamente nel circuito di ingresso e nel circuito di uscita. Inoltre, le funzioni qk_transpile_layout_initial_layout e qk_transpile_layout_final_layout accettano un argomento per filtrare gli ancillas dall'array di output. Se impostato su true, l'array di output sarà filtrato solo sui qubit virtuali del circuito originale in ingresso alla chiamata di transpiler che ha generato QkTranspileLayout.


Funzioni

qk_transpile_layout_num_input_qubits

uint32_t qk_transpile_layout_num_input_qubits(const QkTranspileLayout *layout)

Restituisce al transpiler il numero di qubit nel circuito di ingresso.

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout.

Parametri

  • layout - Un puntatore al sito QkTranspileLayout.

Risultati

Il numero di qubit in ingresso

qk_transpile_layout_num_output_qubits

uint32_t qk_transpile_layout_num_output_qubits(const QkTranspileLayout *layout)

Restituisce il numero di qubit nel circuito di uscita dal transpiler.

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout.

Parametri

  • layout - Un puntatore al sito QkTranspileLayout.

Risultati

Il numero di qubit di uscita

qk_transpile_layout_initial_layout

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

Interrogare il layout iniziale di un sito QkTranspileLayout.

L'array di output di questa funzione rappresenta la mappatura dai qubit virtuali del circuito di input originale al qubit fisico nel circuito di output. L'indice dell'array rappresenta il qubit virtuale, mentre il valore rappresenta il qubit fisico. Ad esempio, un array di output di:

[1, 0, 2]

indica che il layout mappa il qubit virtuale 0 -> il qubit fisico 1, il qubit virtuale 1 -> il qubit fisico -> 0 e il qubit virtuale 2 -> il qubit fisico 2.

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout. initial_layout deve essere un puntatore valido, non nullo, con un'allocazione sufficientemente grande da memorizzare le dimensioni necessarie per il layout iniziale. Se filter_ancillas è vero, questo sarà il numero di qubit in ingresso (che può essere controllato con qk_transpile_layout_num_input_qubits()) o il numero di qubit in uscita se filter_ancillas è falso (che può essere interrogato con qk_transpile_layout_num_output_qubits()).

Parametri

  • layout - Un puntatore al sito QkTranspileLayout.
  • filter_ancillas – Se impostato su true, l'array di output non includerà alcun indice relativo agli ancilla aggiunti dal transpiler.
  • initial_layout - Puntatore all'array in cui questa funzione scriverà il layout iniziale. Deve avere spazio sufficiente per l'intera matrice, che sarà qk_transpile_layout_num_input_qubits() o qk_transpile_layout_num_output_qubits() se filter_ancillas è rispettivamente vero o falso.

Risultati

True se c'è un layout iniziale scritto in initial_layout e false se non c'è un layout iniziale.

qk_transpile_layout_output_permutation

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

Interrogare la permutazione di uscita di un QkTranspileLayout

L'array di output di questa funzione rappresenta la permutazione indotta dal transpiler, dove l'indice indica il qubit all'inizio del circuito e il valore è la posizione del qubit alla fine del circuito. Ad esempio, un array di output di:

[1, 2, 0]

indica che il qubit 0 all'inizio del circuito si trova al qubit 1 alla fine del circuito, 1 -> 2, e 2 -> 0.

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout. output_permutation deve essere un puntatore valido, non nullo, con un'allocazione sufficientemente grande da memorizzare la dimensione necessaria per la permutazione in uscita. Questo sarà sempre il numero di qubit di uscita in QkTranspileLayout che può essere interrogato con qk_transpile_layout_num_output_qubits().

Parametri

  • layout - Un puntatore al sito QkTranspileLayout.
  • output_permutation - Puntatore all'array in cui questa funzione scriverà la permutazione di uscita. Questo deve avere spazio sufficiente per l'uscita, che sarà il numero di qubit di uscita nel layout. Questo può essere interrogato con qk_transpile_layout_num_output_qubits.

Risultati

Vero se esiste una permutazione di uscita che è stata scritta in output_permutation falso se QkTranspileLayout non contiene una permutazione di uscita.

qk_transpile_layout_final_layout

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

Interrogare il layout finale di un file QkTranspileLayout

L'array di uscita rappresenta la mappatura dal qubit virtuale nel circuito di ingresso originale al qubit fisico alla fine del circuito transpile che ha lo stato di quel qubit. L'indice dell'array rappresenta il qubit virtuale e il valore rappresenta il qubit fisico alla fine del circuito transpilato che ha lo stato di quel qubit virtuale. Ad esempio, una matrice di uscita di:

[2, 0, 1]

indica che lo stato del qubit virtuale 0’s nel circuito originale è sul qubit fisico 2 alla fine del circuito transpilato, 1 -> 0, e 2 -> 1.

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout. final_layout deve essere un puntatore valido, non nullo, con un'allocazione sufficientemente grande da memorizzare le dimensioni necessarie per il layout finale. Se filter_ancillas è vero, questo sarà il numero di qubit in ingresso (che può essere controllato con qk_transpile_layout_num_input_qubits()) o il numero di qubit in uscita se filter_ancillas è falso (che può essere interrogato con qk_transpile_layout_num_output_qubits()).

Parametri

  • layout - Un puntatore al sito QkTranspileLayout.
  • filter_ancillas – Se impostato su true, l'array di output non includerà alcun indice relativo agli ancilla aggiunti dal transpiler.
  • final_layout - Puntatore all'array in cui questa funzione scriverà il layout finale. Questo deve avere spazio sufficiente per l'uscita, che sarà il numero di qubit di ingresso o di uscita a seconda del valore di 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)

Genera un QkTranspileLayout da una mappatura del layout iniziale

Questo genererà un QkTranspileLayout con il layout iniziale impostato (e nessuna permutazione dell'output) da una mappatura fornita. Lo scopo di questa funzione è consentire la creazione di un passaggio di layout personalizzato che crei anche un QkTranspileLayout utilizzabile con funzioni di fase successive come qk_transpile_stage_routing.

Sicurezza

Il comportamento è indefinito se original_dag e target non target sono rispettivamente un puntatore valido, QkTarget allineato e non nullo a un QkDag o a un. qubit_mapping deve essere un puntatore valido a un array contiguo di uint32_t con spazio sufficiente per il numero di qubit indicato in target.

Parametri

  • original_dag – Un puntatore al dag originale prima dell'esecuzione di un passaggio di layout personalizzato. Questo dag deve avere un numero di qubit inferiore o uguale a target.
  • target – Un puntatore al target su cui è stato eseguito il layout. Questo target deve avere un numero fisso di qubit impostato.
  • qubit_mapping – Un puntatore all'array di mappatura del layout. Questo array deve avere lo stesso numero di elementi dei qubit presenti nel target e ogni elemento è un numero intero univoco che deve rientrare nell'intervallo compreso tra 0 e num_qubits dove num_qubits è il numero di qubit indicato nel valore fornito per target. I primi elementi rappresentano i qubit virtuali in original_dag e il valore rappresenta il qubit fisico nel target a cui è mappato il qubit virtuale. Ad esempio, un array di [1, 0, 2] mapperebbe il qubit virtuale 0 -> qubit fisico 1, il qubit virtuale 1 -> qubit fisico 0 e il qubit virtuale 2 -> qubit fisico 2. Gli elementi che non sono presenti nel dag originale vengono trattati come qubit ancillari, ma devono comunque essere mappati su un qubit fisico. Questo array verrà copiato nell'output, QkTranspileLayout quindi è necessario liberarlo dopo aver chiamato questa funzione.

Risultati

L'oggetto QkTranspileLayout con il layout iniziale impostato

qk_transpile_layout_free

void qk_transpile_layout_free(QkTranspileLayout *layout)

Liberare un oggetto QkTranspileLayout

Sicurezza

Il comportamento non è definito se layout non è un puntatore valido e non nullo a un QkTranspileLayout.

Parametri

  • layout - un puntatore al layout da liberare

qk_transpile_layout_to_python

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

Genera un oggetto PythonTranspileLayout -space da un QkTranspileLayout.

L'oggetto spazio creato Python è una copia di quello QkTranspileLayout fornito, la rappresentazione dei dati è diversa tra C e Python e i dati non vengono spostati in Python come per alcune altre *_to_python funzioni.

Sicurezza

Il comportamento è indefinito se layout e non circuit sono puntatori validi e non nulli rispettivamente a QkCircuit e QkTranspileLayout . Si presume che il thread che sta attualmente eseguendo questa funzione detenga il GIL ( Python ). Questo è necessario per creare l'oggetto Python restituito da questa funzione.

Parametri

  • layout – un puntatore a un QkTranspileLayout.
  • circuito – un puntatore all'originale QkCircuit.

Risultati

il puntatore PyObject per l'oggetto TranspileLayout dello spazio Python.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.