QkTranspileLayout
typedef struct QkTranspileLayout QkTranspileLayoutQkTranspileLayout 유형은 트랜스파일러가 도입한 순열을 모델링하는 데 사용됩니다. 일반적으로 키스킷의 트랜스파일러는 초기 레이아웃과 출력 순열까지 단일 보존합니다. 초기 레이아웃은 가상 회로 큐비트에서 타겟의 물리적 큐비트로 매핑하는 것이며, 출력 순열은 트랜스파일러 파이프라인에서 초기 레이아웃이 설정되기 전에 스왑 게이트 삽입 또는 순열 생략으로 인해 발생합니다. 이 유형은 이러한 세부 사항을 추적하고 이러한 순열을 추론할 수 있는 인터페이스를 제공합니다.
예를 들어 다음과 같이 구성된 회로가 있다고 가정해 보겠습니다:
#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);로 설정하고 레이아웃 단계에서 트랜스파일러는 해당 회로의 가상 큐비트를 물리적 회로에 다음과 같이 매핑합니다:
0 -> 2, 1 -> 1, 2 -> 0회로는 이렇게 생겼을 것입니다:
#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);를 입력하면 qk_transpile_layout_initial_layout 의 결과는 배열이 됩니다: [2, 1, 0]
레이아웃이 적용된 후 회로에 스왑 게이트를 삽입하기 위해 라우팅이 필요한 경우 출력 순열이 설정됩니다. 예를 들어 다음과 같이 스왑을 삽입한 경우입니다:
#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);이렇게 하면 큐비트 0의 출력 상태가 큐비트 1로, 큐비트 1’s 가 큐비트 0으로 이동합니다. 그 결과 qk_transpile_layout_output_permutation 배열이 반환됩니다: [1, 0, 2] 이는 초기 레이아웃 매핑 후 각 큐비트 상태의 최종 위치임을 나타냅니다. 트랜스파일링 중에 스왑이나 순열 생략이 이루어지지 않은 경우, 큐비트의 출력 상태가 트랜스파일러에 의해 이동되지 않으므로 [0, 1, 2] 형식의 사소한 배열이 됩니다.
그런 다음 이 두 가지를 결합하면 입력 회로에서 가상 큐비트의 최종 위치를 추적하는 최종 레이아웃이 됩니다. 따라서 위의 예제(스왑 사용)에서 qk_transpile_layout_final_layout 함수는 초기 레이아웃과 라우팅 순열에 따라 입력 회로에서 큐비트 0의 최종 위치가 물리적 큐비트 2, 입력 회로에서 가상 큐비트 1이 물리적 큐비트 0, 입력 회로에서 가상 큐비트 2가 물리적 큐비트 1이 되므로 [2, 0, 1] 을 반환하게 됩니다.
또한 트랜스파일러는 대상에 원래 입력 회로보다 더 많은 큐비트를 사용할 수 있는 경우 회로에 앤실라 큐비트를 할당합니다. 따라서 입력 회로와 출력 회로에서 각각 큐비트 수를 추적하는 qk_transpile_layout_num_input_qubits 및 qk_transpile_layout_num_output_qubits 함수가 두 개 필요하게 됩니다. 또한 qk_transpile_layout_initial_layout 및 qk_transpile_layout_final_layout 함수는 인수를 받아 출력 배열에서 부수어를 필터링합니다. True로 설정하면 출력 배열은 QkTranspileLayout 을 생성한 트랜스파일러 호출의 원래 입력 회로에 있는 가상 큐비트만 필터링됩니다.
함수
qk_transpile_layout_num_input_qubits
uint32_t qk_transpile_layout_num_input_qubits(const QkTranspileLayout *layout)
입력 회로의 큐비트 수를 트랜스파일러에 반환합니다.
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 레이아웃 -
QkTranspileLayout에 대한 포인터입니다.
리턴
입력 큐비트 수
qk_transpile_layout_num_output_qubits
uint32_t qk_transpile_layout_num_output_qubits(const QkTranspileLayout *layout)
트랜스파일러에서 출력 회로의 큐비트 수를 반환합니다.
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 레이아웃 -
QkTranspileLayout에 대한 포인터입니다.
리턴
출력 큐비트 수
qk_transpile_layout_initial_layout
bool qk_transpile_layout_initial_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *initial_layout)
QkTranspileLayout 의 초기 레이아웃을 쿼리합니다.
이 함수의 출력 배열은 원래 입력 회로의 가상 큐비트와 출력 회로의 물리적 큐비트 간의 매핑을 나타냅니다. 배열의 인덱스는 가상 큐비트이고, 값은 물리적 큐비트입니다. 예를 들어 다음과 같은 출력 배열:
[1, 0, 2]는 레이아웃이 가상 큐비트 0 -> 물리 큐비트 1, 가상 큐비트 1 -> 물리 큐비트 -> 0, 가상 큐비트 2 -> 물리 큐비트 2로 매핑됨을 나타냅니다.
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다. initial_layout 는 초기 레이아웃에 필요한 크기를 저장할 수 있을 만큼 충분히 큰 할당량을 가진 유효한 널이 아닌 포인터여야 합니다. filter_ancillas 이 참이면 입력 큐비트 수( qk_transpile_layout_num_input_qubits() 에서 확인할 수 있음), filter_ancillas 이 거짓이면 출력 큐비트 수( qk_transpile_layout_num_output_qubits() 에서 조회 가능)가 됩니다.
매개변수
- 레이아웃 -
QkTranspileLayout에 대한 포인터입니다. - filter_ancillas – true로 설정하면 출력 배열에 트랜스파일러가 추가한 앵실라의 인덱스가 포함되지 않습니다.
- initial_layout - 이 함수가 초기 레이아웃을 기록할 배열에 대한 포인터입니다. 여기에는 전체 배열을 위한 충분한 공간이 있어야 하며,
filter_ancillas이 참 또는 거짓일 경우qk_transpile_layout_num_input_qubits()또는qk_transpile_layout_num_output_qubits()이 됩니다.
리턴
initial_layout 에 초기_layout이 작성된 경우 참이고 초기 레이아웃이 없으면 거짓입니다.
qk_transpile_layout_output_permutation
bool qk_transpile_layout_output_permutation(const QkTranspileLayout *layout, uint32_t *output_permutation)
의 출력 순열을 쿼리합니다 QkTranspileLayout
이 함수의 출력 배열은 트랜스파일러가 유도한 순열을 나타내며, 인덱스는 회로 시작 시점의 큐비트를 나타내고 값은 회로 종료 시점의 큐비트 위치를 나타냅니다. 예를 들어 다음과 같은 출력 배열이 있습니다:
[1, 2, 0]는 회로 시작의 큐비트 0이 회로 끝의 큐비트 1, 1 -> 2, 2 -> 0에 있음을 나타냅니다.
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다. output_permutation 는 출력_퍼뮤테이션에 필요한 크기를 저장할 수 있을 만큼 충분히 큰 할당을 가진 유효한 널이 아닌 포인터여야 합니다. 이는 항상 qk_transpile_layout_num_output_qubits() 으로 쿼리할 수 있는 QkTranspileLayout 의 출력 큐비트 수입니다.
매개변수
- 레이아웃 -
QkTranspileLayout에 대한 포인터입니다. - 출력_퍼뮤테이션 - 이 함수가 출력 순열을 기록할 배열에 대한 포인터입니다. 여기에는 레이아웃의 출력 큐비트 수가 될 출력을 위한 충분한 공간이 있어야 합니다.
qk_transpile_layout_num_output_qubits으로 조회할 수 있습니다.
리턴
output_permutation 에 기록된 출력 순열이 있으면 참, QkTranspileLayout 에 출력 순열이 없으면 거짓입니다.
qk_transpile_layout_final_layout
void qk_transpile_layout_final_layout(const QkTranspileLayout *layout, bool filter_ancillas, uint32_t *final_layout)
최종 레이아웃 쿼리 QkTranspileLayout
출력 배열은 원래 입력 회로의 가상 큐비트에서 해당 큐비트의 상태를 가진 트랜스파일 회로의 끝에 있는 물리적 큐비트로의 매핑을 나타냅니다. 배열 인덱스는 가상 큐비트를 나타내고 값은 해당 가상 큐비트의 상태를 가진 트랜스파일링된 회로의 끝에 있는 물리적 큐비트를 나타냅니다. 예를 들어, 다음과 같은 출력 배열이 있습니다:
[2, 0, 1]는 원래 회로의 가상 큐비트 0’s 상태가 트랜스파일된 회로의 끝에 있는 물리적 큐비트 2, 1 -> 0, 2 -> 1에 있음을 나타냅니다.
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다. final_layout 는 최종 레이아웃에 필요한 크기를 저장할 수 있을 만큼 충분히 큰 할당량을 가진 유효한 널이 아닌 포인터여야 합니다. filter_ancillas 이 참이면 입력 큐비트 수( qk_transpile_layout_num_input_qubits() 에서 확인할 수 있음), filter_ancillas 이 거짓이면 출력 큐비트 수( qk_transpile_layout_num_output_qubits() 에서 조회 가능)가 됩니다.
매개변수
- 레이아웃 -
QkTranspileLayout에 대한 포인터입니다. - filter_ancillas – true로 설정하면 출력 배열에 트랜스파일러가 추가한 앵실라의 인덱스가 포함되지 않습니다.
- final_layout - 이 함수가 최종 레이아웃을 기록할 배열에 대한 포인터입니다. 여기에는 필터_안실라의 값에 따라 입력 또는 출력 큐비트 수가 되는 출력을 위한 충분한 공간이 있어야 합니다.
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)
초기 레이아웃 매핑으로부터 QkTranspileLayout 생성
이것은 제공된 매핑으로부터 초기 레이아웃이 설정된 (그리고 출력 QkTranspileLayout 순열이 없는) 를 생성합니다. 이 함수의 목적은 사용자 정의 레이아웃 패스를 생성할 수 있도록 하여, 이후 단계 함수(예: qk_transpile_stage_routing )에서 사용할 수 있는 객체를 QkTranspileLayout 생성하는 것입니다.
안전
타겟이 유효하고 정렬된 target , null이 아닌 또는 original_dag``QkDag 포인터가 QkTarget 아닐 경우 동작이 정의되지 않습니다. qubit_mapping 는 target에 명시된 큐비트 수를 수용할 수 있는 충분한 공간을 가진 연속 uint32_t 배열에 대한 유효한 포인터여야 합니다.
매개변수
- original_dag – 사용자 정의 레이아웃 패스를 실행하기 전의 원본 DAG에 대한 포인터. 이 다그는 의 큐비트 수보다
target적거나 같아야 한다. - target – 레이아웃이 실행된 대상에 대한 포인터. 이 대상에는 고정된 수의 큐비트가 설정되어 있어야 합니다.
- qubit_mapping – 레이아웃 매핑 배열에 대한 포인터. 이 배열은 대상 큐비트 수와 동일한 개수의 요소를 가져야 하며, 각 요소는 고유한 정수여야 하고 모두 0부터 사이의 범위에 속해야
num_qubits합니다.target여기서num_qubits는 제공된 값 에 표시된 큐비트 수입니다. 첫 번째 요소들은 가상 큐비트를 나타내며original_dag, 해당 값은 가상 큐비트가 매핑되는 대상의 물리적 큐비트를 나타냅니다. 예를 들어, 배열은 가상 큐비트 0을 물리적 큐비트 1에, 가상 큐비트 1을 물리적[1, 0, 2]큐비트 0에, 그리고 가상 큐비트 2를 물리적 큐비트 2에 매핑합니다. 원본 DAG에 존재하지 않는 요소들은 보조 큐비트로 처리되지만, 여전히 물리적 큐비트로 매핑되어야 합니다. 이 배열은 출력으로 복사될QkTranspileLayout것이므로, 이 함수를 호출한 후에도 반드시 해제해야 합니다.
리턴
초기 레이아웃이 설정된 QkTranspileLayout 객체
qk_transpile_layout_free
void qk_transpile_layout_free(QkTranspileLayout *layout)
QkTranspileLayout 개체 무료화
안전
layout 이 QkTranspileLayout 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 레이아웃 - 무료 레이아웃에 대한 포인터입니다
qk_transpile_layout_to_python
PyObject *qk_transpile_layout_to_python(const QkTranspileLayout *layout, const QkCircuit *circuit)
Python -space TranspileLayout 객체를 생성합니다 QkTranspileLayout.
생성된 Python 객체는 제공된 QkTranspileLayout 객체의 복사본이며, C와 Python 간 데이터 표현 방식이 다릅니다. 또한 일부 다른 *_to_python 함수와 달리 데이터가 Python로 이동되지 않습니다.
안전
와 circuit 가 QkCircuit``QkTranspileLayout 각각 유효하고 null이 layout 아닌 포인터가 아닐 경우 동작이 정의되지 않습니다. 현재 이 함수를 실행 중인 스레드가 GIL( Python )을 보유하고 있다고 가정합니다. 이것은 이 함수가 반환하는 Python 객체를 생성하는 데 필요합니다.
매개변수
- 레이아웃 –.
QkTranspileLayout에 대한 포인터 - 회로 – 원본에 대한
QkCircuit포인터.
리턴
Python 공간의 TranspileLayout 객체에 대한 PyObject 포인터.