QkTranspileLayout
typedef struct QkTranspileLayout QkTranspileLayoutEl 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 -> 0así 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()oqk_transpile_layout_num_output_qubits()parafilter_ancillassiendo 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_qubitsdondenum_qubitses el número de qubits indicado en el valor proporcionado paratarget. Los primeros elementos representan los qubits virtuales enoriginal_dagy 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, porQkTranspileLayoutlo 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.