Skip to main content
IBM Quantum Platform

QkTranspileLayout

typedef struct QkTranspileLayout QkTranspileLayout

El tipo QkTranspileLayout se utiliza para modelar las permutaciones introducidas por el transpilador. En general, el transpilador de Qiskit preserva la unidad hasta la disposición inicial y las permutaciones de salida. El diseño inicial es la correspondencia entre los qubits del circuito virtual y los qubits físicos del objetivo, y la permutación de salida se produce por la inserción de una puerta de intercambio o por la elisión de la permutación antes de que se establezca el diseño inicial en el transpilador. Este tipo rastrea estos detalles y proporciona una interfaz para razonar sobre estas permutaciones.

Por ejemplo si tuvieras un circuito construido como:

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

y durante la etapa de maquetación el transpilador mapea los qubits virtuales de ese circuito a los circuitos físicos como:

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

así que el circuito quedaría así:

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

entonces el resultado de qk_transpile_layout_initial_layout será un array: [2, 1, 0]

Si se ha tenido que insertar una puerta de intercambio en el circuito después de aplicar el diseño, se establecerá una permutación de salida. Por ejemplo, si se insertara un intercambio como:

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

esto provoca que el estado de salida del qubit 0 pase al qubit 1 y el qubit 1’s al qubit 0. Esto da como resultado que qk_transpile_layout_output_permutation devuelva la matriz: [1, 0, 2] para indicar que esta es la posición final del estado de cada qubit después del mapeo de disposición inicial. Si no se han realizado intercambios o elisiones de permutación durante la transpilación, será una matriz trivial de la forma [0, 1, 2] , ya que el estado de salida del qubit no es movido por el transpilador.

Luego, combinando estos dos, se obtiene el trazado final que sirve para rastrear la posición final de un qubit virtual en el circuito de entrada. Así que del ejemplo anterior (con el intercambio), la función qk_transpile_layout_final_layout devolvería [2, 0, 1] porque siguiendo la disposición inicial y luego cualquier permutación de enrutamiento la posición final del qubit 0 en el circuito de entrada es ahora el qubit físico 2, el qubit virtual 1 en el circuito de entrada es el qubit físico 0, y el qubit virtual 2 en el circuito de entrada es el qubit físico 1.

El transpilador también asignará qubits ancilla al circuito si el objetivo tiene más qubits disponibles que el circuito de entrada original. Esto es lo que hace que sean necesarias dos funciones qk_transpile_layout_num_input_qubits y qk_transpile_layout_num_output_qubits que rastrean el número de qubits en el circuito de entrada y en el circuito de salida respectivamente. Además, las funciones qk_transpile_layout_initial_layout y qk_transpile_layout_final_layout toman un argumento para filtrar las ancillas de la matriz de salida. Si se establece en true, la matriz de salida se filtrará a sólo los qubits virtuales en el circuito de entrada original a la llamada del transpilador que generó el QkTranspileLayout.


Funciones

qk_transpile_layout_num_input_qubits

uint32_t qk_transpile_layout_num_input_qubits(const QkTranspileLayout *layout)

Devuelve al transpilador el número de qubits del circuito de entrada.

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout.

Parámetros

  • layout - Un puntero a la página QkTranspileLayout.

Devuelve

El número de qubits de entrada

qk_transpile_layout_num_output_qubits

uint32_t qk_transpile_layout_num_output_qubits(const QkTranspileLayout *layout)

Devuelve el número de qubits en el circuito de salida del transpilador.

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout.

Parámetros

  • layout - Un puntero a la página QkTranspileLayout.

Devuelve

El número de qubits de salida

qk_transpile_layout_initial_layout

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

Consulta de la disposición inicial de un QkTranspileLayout.

La matriz de salida de esta función representa la correspondencia entre los qubits virtuales del circuito de entrada original y el qubit físico del circuito de salida. El índice de la matriz corresponde al qubit virtual, y el valor, al qubit físico. Por ejemplo, una matriz de salida de:

[1, 0, 2]

indica que la disposición mapea qubit virtual 0 -> qubit físico 1, qubit virtual 1 -> qubit físico -> 0, y qubit virtual 2 -> qubit físico 2.

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout. initial_layout debe ser un puntero válido, no nulo, con una asignación lo suficientemente grande como para almacenar el tamaño necesario para la disposición inicial. Si filter_ancillas es verdadero, será el número de qubits de entrada (que puede comprobarse con qk_transpile_layout_num_input_qubits()) o el número de qubits de salida si filter_ancillas es falso (que puede consultarse con qk_transpile_layout_num_output_qubits()).

Parámetros

  • layout - Un puntero a la página QkTranspileLayout.
  • filter_ancillas : si se establece en «true», la matriz de salida no incluirá índices para ninguna de las «ancillas» añadidas por el transpilador.
  • initial_layout - Un puntero a la matriz donde esta función escribirá el diseño inicial. Debe tener espacio suficiente para el array completo que será qk_transpile_layout_num_input_qubits() o qk_transpile_layout_num_output_qubits() para filter_ancillas siendo verdadero o falso respectivamente.

Devuelve

True si hubo un initial_layout escrito en initial_layout y false si no hay layout inicial.

qk_transpile_layout_output_permutation

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

Consultar la permutación de salida de un QkTranspileLayout

La matriz de salida de esta función representa la permutación inducida por el transpilador, donde el índice indica el qubit al principio del circuito y el valor es la posición del qubit al final del circuito. Por ejemplo, una matriz de salida de:

[1, 2, 0]

indica que el qubit 0 del inicio del circuito está en el qubit 1 al final del circuito, 1 -> 2, y 2 -> 0.

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout. output_permutation debe ser un puntero válido, no nulo, con una asignación lo suficientemente grande como para almacenar el tamaño necesario para la salida\permutación. Este será siempre el número de qubits de salida en el QkTranspileLayout que se puede consultar con qk_transpile_layout_num_output_qubits().

Parámetros

  • layout - Un puntero a la página QkTranspileLayout.
  • output_permutation - Un puntero a la matriz donde esta función escribirá la permutación de salida. Esto debe tener suficiente espacio para la salida que será el número de qubits de salida en el diseño. Puede consultarse en qk_transpile_layout_num_output_qubits.

Devuelve

True si hay una permutación de salida que se escribió en output_permutation false si el QkTranspileLayout no contiene una permutación de salida.

qk_transpile_layout_final_layout

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

Consultar la disposición final de un QkTranspileLayout

La matriz de salida representa el mapeo del qubit virtual en el circuito de entrada original al qubit físico al final del circuito de transpilación que tiene el estado de ese qubit. El índice de la matriz representa el qubit virtual y el valor representa el qubit físico al final del circuito transpilado que tiene el estado de ese qubit virtual. Por ejemplo, una matriz de salida de:

[2, 0, 1]

indica que el estado del qubit virtual 0’s en el circuito original está en el qubit físico 2 al final del circuito transpilado, 1 -> 0, y 2 -> 1.

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout. final_layout debe ser un puntero válido, no nulo, con una asignación lo suficientemente grande como para almacenar el tamaño necesario para la disposición final. Si filter_ancillas es verdadero, será el número de qubits de entrada (que puede comprobarse con qk_transpile_layout_num_input_qubits()) o el número de qubits de salida si filter_ancillas es falso (que puede consultarse con qk_transpile_layout_num_output_qubits()).

Parámetros

  • layout - Un puntero a la página QkTranspileLayout.
  • filter_ancillas : si se establece en «true», la matriz de salida no incluirá índices para ninguna de las «ancillas» añadidas por el transpilador.
  • final\layout - Un puntero a la matriz donde esta función escribirá el diseño final. Debe tener espacio suficiente para la salida, que será el número de qubits de entrada o de salida dependiendo del valor 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)

Generar un QkTranspileLayout a partir de un mapa de diseño inicial

Esto generará un QkTranspileLayout con el diseño inicial establecido (y sin permutación de salida) a partir de una asignación proporcionada. El objetivo de esta función es permitir la creación de un paso de diseño personalizado que también cree un QkTranspileLayout que se pueda utilizar con funciones de etapas posteriores, como qk_transpile_stage_routing.

Seguridad

El comportamiento es indefinido si original_dag y target no target son punteros válidos, alineados y distintos de nulo a o QkDag QkTarget respectivamente. qubit_mapping debe ser un puntero válido a una matriz contigua de uint32_t con espacio suficiente para el número de qubits indicado en target.

Parámetros

  • original_dag : un puntero al dag original antes de ejecutar un paso de diseño personalizado. Este dag debe tener menos o el mismo número de qubits que target.
  • target : un puntero al objetivo en el que se ejecutó el diseño. Este objetivo debe tener un número fijo de qubits establecido.
  • qubit_mapping : un puntero a la matriz de asignación de diseño. Esta matriz debe tener el mismo número de elementos que hay qubits en el objetivo y cada elemento es un entero único y todos deben estar en el rango de 0 a num_qubits donde num_qubits es el número de qubits indicado en el valor proporcionado para target. Los primeros elementos representan los qubits virtuales en original_dag y el valor representa el qubit físico en el objetivo al que se asigna el qubit virtual. Por ejemplo, una matriz de [1, 0, 2] asignaría el qubit virtual 0 al qubit físico 1, el qubit virtual 1 al qubit físico 0 y el qubit virtual 2 al qubit físico 2. Los elementos que no se encuentran en el dag original se tratan como qubits auxiliares, pero aún así deben asignarse a un qubit físico. Esta matriz se copiará en la salida, por QkTranspileLayout lo que deberá liberarla después de llamar a esta función.

Devuelve

El objeto « QkTranspileLayout » con el diseño inicial establecido

qk_transpile_layout_free

void qk_transpile_layout_free(QkTranspileLayout *layout)

Liberar un objeto QkTranspileLayout

Seguridad

El comportamiento es indefinido si layout no es un puntero válido y no nulo a QkTranspileLayout.

Parámetros

  • layout - un puntero al layout a liberar

qk_transpile_layout_to_python

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

Generar un objeto de TranspileLayout espacio Python a partir de un QkTranspileLayout.

El objeto de espacio Python creado es una copia del QkTranspileLayout proporcionado, la representación de los datos es diferente entre C y Python y los datos no se mueven a Python como ocurre con otras *_to_python funciones.

Seguridad

El comportamiento es indefinido si layout y no circuit son punteros válidos y distintos de nulo a y QkCircuit``QkTranspileLayout respectivamente. Se supone que el subproceso que está ejecutando actualmente esta función mantiene el GIL ( Python ). Esto es necesario para crear el objeto « Python » devuelto por esta función.

Parámetros

  • diseño : un puntero a un QkTranspileLayout.
  • circuito : un puntero al original QkCircuit.

Devuelve

el puntero PyObject para el espacio Python objeto TranspileLayout.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.