QkCircuit
typedef struct QkCircuit QkCircuit양자 컴퓨팅의 기본 요소는 양자 회로입니다. 이는 양자 처리 장치(QPU)에서 한 번에 한 번씩 실행할 수 있는 계산 루틴입니다. 회로는 단일 연산(게이트), 측정 및 재설정을 통해 미리 정의된 양의 양자 데이터(키스킷에서는 큐비트만 직접 지원)에 대해 작동합니다. 또한 양자 회로에는 실시간 계산 및 제어 흐름 구성을 포함한 기존 데이터에 대한 연산이 포함될 수 있으며, 이는 QPU의 컨트롤러에 의해 실행됩니다. QkCircuit 구조는 키스킷의 양자 회로 데이터 구조에 대한 낮은 수준의 인터페이스를 노출하며, 키스킷의 내부 데이터 모델에 정의된 것만 노출합니다. 따라서 상위 수준 Python 클래스에서 사용할 수 있는 일부 기능이 누락되어 있습니다 QuantumCircuit 클래스에서 사용할 수 있는 기능이 없습니다.
아래는 3큐비트 그린버거-호른-자일링거(GHZ) 상태를 다음과 같이 정의하는 양자 회로의 예시입니다:
#include <qiskit.h>
// Create a circuit with three qubits and 3 classical bits
QkCircuit *qc = qk_circuit_new(3, 0);
// H gate on qubit 0, putting this qubit in a superposition of |0> + |1>.
qk_circuit_gate(qc, QkGate_H, (uint32_t[]){0}, NULL);
// A CX (CNOT) gate on control qubit 0 and target qubit 1 generating a Bell state.
qk_circuit_gate(qc, QkGate_CX, (uint32_t[]){0, 1}, NULL);
// A CX (CNOT) gate on control qubit 0 and target qubit 2 generating a GHZ state.
qk_circuit_gate(qc, QkGate_CX, (uint32_t[]){0, 2}, NULL);
// Free the created circuit.
qk_circuit_free(qc);회로 C API는 현재 키스킷의 내부 Rust 데이터 모델에 정의된 연산이 포함된 회로 생성만 지원합니다. 일반적으로 여기에는 표준 게이트 라이브러리의 게이트, 표준 비단일 연산(현재 Barrier, Measure, Reset및 Delay) 및 UnitaryGate. 이 기능은 Rust 데이터 모델이 더 많은 기능을 기본적으로 지원하도록 확장됨에 따라 시간이 지남에 따라 확장될 예정입니다.
데이터 유형.
QkOpCount
struct QkOpCount
작업 이름과 회로의 인스턴스 수로 표시되는 개별 작업 수입니다.
const char *name
작업 이름을 나타내는 널로 끝나는 문자열입니다
size_t 카운트
회로에서 이 작업의 인스턴스 수입니다
QkOpCounts
struct QkOpCounts
회로에 있는 모든 연산 유형의 총 개수를 나타내는 OpCount 객체의 배열입니다.
QkOpCount *데이터
회로의 각 연산 유형에 대한 OpCount 객체를 포함하는 len 크기의 배열입니다
size_t len
의 요소 수 data
QkCircuitInstruction
struct QkCircuitInstruction
회로 명령어 표현입니다.
이 구조체는 QkCircuit 의 개별 인스트럭션에 포함된 데이터를 나타냅니다. 기본 객체에 대한 포인터는 아니지만 검사할 명령어의 속성 사본을 포함합니다.
char *name
인스트럭션 이름
uint32_t *큐비트
이 명령어가 연산하는 큐비트 인덱스 배열에 대한 포인터입니다.
uint32_t *클비츠
이 인스트럭션이 연산하는 clbit 인덱스 배열에 대한 포인터입니다.
QkParam **매개변수
이 인스트럭션의 파라미터 값 배열에 대한 포인터입니다.
uint32_t num_qubits
이 인스트럭션의 큐비트 수입니다.
uint32_t num_clbits
이 인스트럭션의 클럭 비트 수입니다.
uint32_t num_params
이 인스트럭션의 매개변수 수입니다.
QkCircuitDrawerConfig
struct QkCircuitDrawerConfig
함수의 qk_circuit_draw 구성 옵션.
bool bundle_cregs
만약 true그렇다면, 고전적인 레지스터들을 단일 와이어로 묶습니다.
bool merge_wires
이 경우 true, 인접한 전선의 하단 선과 상단 선을 합칩니다.
size_t 접기
렌더링된 텍스트의 줄 바꿈 길이를 설정합니다. 0을 입력하면 콘솔 너비를 자동으로 감지합니다. 를 사용하면 줄 바꿈을 완전히 SIZE_MAX 생략할 수 있습니다.
함수
QkDelayUnit
enum QkDelayUnit
회로 지연을 나타내는 단위입니다.
값:
QkDelayUnit_S 열거자
초.
QkDelayUnit_MS 열거자
지정합니다.
QkDelayUnit_US 열거자
마이크로초.
QkDelayUnit_NS 열거자
나노초.
QkDelayUnit_PS 열거자
피코초.
QkVarsMode
enum QkVarsMode
기존 회로를 기반으로 새로운 회로를 생성하는 작업에 사용되는 클래식 변수 복사 모드.
값:
QkVarsMode_Alike 열거자
각 변수는 입력에서 가졌던 것과 동일한 유형을 가집니다.
QkVarsMode_Captures 열거자
각 변수는 "캡처"가 됩니다.
QkVarsMode_Drop 열거자
변수 데이터를 복사하지 마십시오.
QkBlocksMode
enum QkBlocksMode
기존 회로를 기반으로 새로운 회로를 생성하는 연산을 위해 제어 흐름 명령어에서 블록을 복사할 때 사용할 모드.
값:
QkBlocksMode_Drop 열거자
블록을 내려놓으세요.
QkBlocksMode_Keep 열거자
블록을 유지하세요.
qk_circuit_new
QkCircuit *qk_circuit_new(uint32_t num_qubits, uint32_t num_clbits)
주어진 큐비트와 클릿 수로 새로운 회로를 구성합니다.
예
QkCircuit *empty = qk_circuit_new(100, 100);매개변수
- 숫자_큐비트 - 회로에 포함된 큐비트 수입니다.
- 숫자_클릿 - 회로에 포함된 클릿의 수입니다.
반품
생성된 회로에 대한 포인터입니다.
qk_circuit_add_quantum_register
void qk_circuit_add_quantum_register(QkCircuit *circuit, const QkQuantumRegister *reg)
주어진 양자 회로에 양자 레지스터 추가하기
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr = qk_quantum_register_new(1024, "my_little_register");
qk_circuit_add_quantum_register(qc, qr);
qk_quantum_register_free(qr);
qk_circuit_free(qc);안전
circuit 가 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우와 reg 가 QkQuantumRegister 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
- reg - 양자 레지스터에 대한 포인터
qk_circuit_num_quantum_registers
size_t qk_circuit_num_quantum_registers(const QkCircuit *circuit)
회로에 포함된 양자 레지스터의 개수를 구하십시오.
회로에 추가된 양자 레지스터의 개수를 반환합니다.
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr1 = qk_quantum_register_new(2, "qr1");
QkQuantumRegister *qr2 = qk_quantum_register_new(3, "qr2");
qk_circuit_add_quantum_register(qc, qr1);
qk_circuit_add_quantum_register(qc, qr2);
size_t num_qregs = qk_circuit_num_quantum_registers(qc);
printf("Number of quantum registers: %zu\n", num_qregs); // Prints: 2
qk_quantum_register_free(qr1);
qk_quantum_register_free(qr2);
qk_circuit_free(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
회로에 포함된 양자 레지스터의 개수.
qk_circuit_get_quantum_register
const QkQuantumRegister *qk_circuit_get_quantum_register(const QkCircuit *circuit, size_t qreg_idx)
지정된 인덱스에 있는 양자 레지스터를 반환합니다.
지정된 인덱스에 있는 양자 레지스터에 대한 차용 포인터를 반환합니다. 반환된 포인터는 회로가 존재하는 한, 그리고 수정되지 않는 한 유효합니다. 호출자는 반환된 포인터를 해제해서는 안 됩니다.
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr1 = qk_quantum_register_new(2, "qr1");
qk_circuit_add_quantum_register(qc, qr1);
const QkQuantumRegister *retrieved = qk_circuit_get_quantum_register(qc, 0);
qk_quantum_register_free(qr1);
qk_circuit_free(qc);안전
QkCircuit가 유효한, null이 아닌 포인터가 아니거나, 범위를 벗어난 경우 qreg_idx``circuit (회로의 양자 레지스터 수 이상인 경우), 동작은 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
- qreg_idx – 가져올 양자 레지스터의 인덱스.
반품
지정된 인덱스에 있는 양자 레지스터를 가리키는 차용된 포인터입니다. 이 포인터를 비우지 마십시오.
qk_circuit_add_classical_register
void qk_circuit_add_classical_register(QkCircuit *circuit, const QkClassicalRegister *reg)
주어진 양자 회로에 클래식 레지스터 추가하기
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr = qk_classical_register_new(24, "my_big_register");
qk_circuit_add_classical_register(qc, cr);
qk_classical_register_free(cr);
qk_circuit_free(qc);안전
circuit 가 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우와 reg 가 QkClassicalRegister 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
- reg - 클래식 레지스터에 대한 포인터
qk_circuit_num_classical_registers
size_t qk_circuit_num_classical_registers(const QkCircuit *circuit)
회로에 있는 고전적 레지스터의 개수를 구하십시오.
회로에 추가된 클래식 레지스터의 개수를 반환합니다.
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr1 = qk_classical_register_new(2, "cr1");
QkClassicalRegister *cr2 = qk_classical_register_new(3, "cr2");
qk_circuit_add_classical_register(qc, cr1);
qk_circuit_add_classical_register(qc, cr2);
size_t num_cregs = qk_circuit_num_classical_registers(qc);
printf("Number of classical registers: %zu\n", num_cregs); // Prints: 2
qk_classical_register_free(cr1);
qk_classical_register_free(cr2);
qk_circuit_free(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
회로에 포함된 클래식 레지스터의 수.
qk_circuit_get_classical_register
const QkClassicalRegister *qk_circuit_get_classical_register(const QkCircuit *circuit, size_t creg_idx)
지정된 인덱스에 있는 클래식 레지스터를 반환합니다.
지정된 인덱스에 있는 클래식 레지스터에 대한 차용 포인터를 반환합니다. 반환된 포인터는 회로가 존재하는 한, 그리고 수정되지 않는 한 유효합니다. 호출자는 반환된 포인터를 해제해서는 안 됩니다.
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkClassicalRegister *cr1 = qk_classical_register_new(2, "cr1");
qk_circuit_add_classical_register(qc, cr1);
const QkClassicalRegister *retrieved = qk_circuit_get_classical_register(qc, 0);
qk_classical_register_free(cr1);
qk_circuit_free(qc);안전
QkCircuit가 유효하고 null이 아닌 포인터가 아니거나, 범위를 벗어난 경우 creg_idx``circuit (회로의 고전 레지스터 수 이상인 경우), 동작은 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
- creg_idx – 가져올 클래식 레지스터의 인덱스.
반품
지정된 인덱스에 있는 클래식 레지스터를 가리키는 빌린 포인터입니다. 이 포인터를 비우지 마십시오.
qk_circuit_copy
QkCircuit *qk_circuit_copy(const QkCircuit *circuit)
QkCircuit 의 복사본을 만듭니다.
예
QkCircuit *qc = qk_circuit_new(100, 100);
QkCircuit *copy = qk_circuit_copy(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 복사할 회로에 대한 포인터입니다.
반품
입력의 복사본에 대한 새 포인터 circuit.
qk_circuit_num_qubits
uint32_t qk_circuit_num_qubits(const QkCircuit *circuit)
회로에 포함된 큐비트 수를 가져옵니다.
예
QkCircuit *qc = qk_circuit_new(100, 100);
uint32_t num_qubits = qk_circuit_num_qubits(qc); // num_qubits==100안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
회로가 정의된 큐비트 수입니다.
qk_circuit_num_clbits
uint32_t qk_circuit_num_clbits(const QkCircuit *circuit)
회로에 포함된 클릿 수를 가져옵니다.
예
QkCircuit *qc = qk_circuit_new(100, 50);
uint32_t num_clbits = qk_circuit_num_clbits(qc); // num_clbits==50안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
이 회로가 정의된 클비트 수.
qk_circuit_num_param_symbols
size_t qk_circuit_num_param_symbols(const QkCircuit *circuit)
회로 내 객체에 QkParam 포함된 바인딩되지 않은 심볼의 개수를 구하십시오.
예
QkCircuit *qc = qk_circuit_new(2, 0);
QkParam *x = qk_param_new_symbol("x");
QkParam *y = qk_param_new_symbol("y");
uint32_t q0[1] = {0};
const QkParam *rx_param[1] = {x};
const QkParam *ry_param[1] = {y};
qk_circuit_parameterized_gate(qc, QkGate_RX, q0, rx_param);
qk_circuit_parameterized_gate(qc, QkGate_RY, q0, ry_param);
// check the number of QkParam symbols
size_t num_symbols = qk_circuit_num_param_symbols(qc); // == 2
qk_param_free(x);
qk_param_free(y);
qk_circuit_free(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
회로 내의 미결합 QkParam 기호의 수.
qk_circuit_global_phase
QkParam *qk_circuit_global_phase(const QkCircuit *circuit)
회로의 전역 위상을 구하십시오.
이 함수는 회로의 전역 위상 값의 복사본을 반환하며, 사용 후에는 :c:func:qk_param_free 를 통해 해당 값을 해제해야 합니다.
예
QkCircuit *qc = qk_circuit_new(100, 100);
QkParam *phase = qk_circuit_global_phase(qc);
qk_param_free(phase);
qk_circuit_free(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
반품
이 회로의 글로벌 단계.
qk_circuit_set_global_phase
QkExitCode qk_circuit_set_global_phase(QkCircuit *circuit, const QkParam *phase)
회로의 전체 위상을 설정하십시오.
이 함수는 새로운 전역 페이즈를 설정할 때 이를 복사하므로, 호출자가 해당 QkParam 페이즈에 대한 소유권을 유지하게 되며, 설정 후에는 :c:func:qk_param_free 를 통해 페이즈의 값을 해제해야 합니다.
예
QkCircuit *qc = qk_circuit_new(100, 100);
QkParam *new_global_phase = qk_param_from_double(1.23);
qk_circuit_set_global_phase(qc, new_global_phase);
qk_param_free(new_global_phase);
qk_circuit_free(qc);안전
QkParam가 QkCircuit 를 가리키는 유효하고 null이 아닌 포인터가 아니거나, phase``circuit 가 를 가리키는 유효하고 null이 아닌 포인터가 아닌 경우, 동작은 정의되지 않습니다.
매개변수
- 회로 - 회로에 대한 포인터입니다.
- phase – 설정할 전역 페이즈에 대한 포인터.
반품
QkExitCode_Success 전역 위상이 성공적으로 설정된 후. 오류가 발생하면, QkExitCode_ParameterNameConflict 새로운 매개변수 기호가 기존 매개변수 기호와 이름이 중복됨을 나타냅니다. QkExitCode_ParameterError 매개변수 심볼을 추적하려고 할 때 발생하는 기타 일반적인 오류에 대해 설명합니다.
qk_circuit_free
void qk_circuit_free(QkCircuit *circuit)
회로를 해제합니다.
예
QkCircuit *qc = qk_circuit_new(100, 100);
qk_circuit_free(qc);안전
circuit 이 null이 아니거나 QkCircuit 에 대한 유효한 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 해제할 회로에 대한 포인터입니다.
qk_circuit_gate
QkExitCode qk_circuit_gate(QkCircuit *circuit, QkGate gate, const uint32_t *qubits, const double *params)
회로에 QkGate 을 추가합니다.
예
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);안전
qubits 및 params 유형은 각각 길이가 표준 게이트에 대한 기대치와 일치하는 uint32_t 및 double 배열에 대한 포인터가 될 것으로 예상됩니다. 배열이 충분히 길지 않으면 배열의 범위를 벗어나 읽히므로 이 함수의 동작이 정의되지 않습니다. 주어진 게이트에 큐비트나 파라미터가 없는 경우 널 포인터가 될 수 있습니다. qk_gate_num_qubits 및 qk_gate_num_params 에서 특정 게이트에 필요한 큐비트 및 매개변수 수를 확인할 수 있습니다.
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 게이트를 추가할 회로에 대한 포인터입니다.
- 게이트 - 회로에 추가할 StandardGate.
- 큐비트 - 게이트를 추가할
uint32_t큐비트 인덱스 배열에 대한 포인터입니다.gate에 대한 큐비트가 없는 경우 널 포인터가 될 수 있습니다(예:QkGate_GlobalPhase). - params - 게이트 매개변수에 사용할
double값의 배열에 대한 포인터입니다.gate에 대한 매개 변수가 없는 경우 널 포인터가 될 수 있습니다(예:QkGate_H).
반품
종료 코드입니다.
qk_circuit_parameterized_gate
QkExitCode qk_circuit_parameterized_gate(QkCircuit *circuit, QkGate gate, const uint32_t *qubits, const QkParam *const *params)
회로에 QkParam* 매개변수를 QkGate 추가합니다.
예
QkCircuit *qc = qk_circuit_new(100, 0);
QkParam *theta = qk_param_new_symbol("theta");
uint32_t qubit[1] = {0};
const QkParam* params[1] = {theta};
qk_circuit_parameterized_gate(qc, QkGate_RX, qubit, params); // add RX(theta) to the circuit안전
와 params qubits 유형은 각각 QkParam* 형 uint32_t 배열에 대한 포인터여야 하며, 그 길이는 표준 게이트의 기대값과 일치해야 합니다. 배열의 길이가 충분하지 않은 경우, 이 함수는 배열의 범위를 벗어난 영역을 읽게 되므로 동작이 정의되지 않습니다. 주어진 게이트에 큐비트나 매개변수가 없는 경우, 이는 null 포인터일 수 있습니다. 특정 게이트에 필요한 큐비트와 매개변수의 수를 확인하려면 qk_gate_num_params 와 를 qk_gate_num_qubits 참조하십시오.
가 유효하고 null이 아닌 포인터가 아니거나, params 배열의 요소 중 하나라도 circuit``QkCircuit 유효하고 null이 아닌 포인터가 아닌 QkParam경우, 동작은 정의되지 않습니다.
매개변수
- 회로 - 게이트를 추가할 회로에 대한 포인터입니다.
- 게이트 – 회로에 추가할
QkGate부분. - 큐비트 - 게이트를 추가할
uint32_t큐비트 인덱스 배열에 대한 포인터입니다.gate에 대한 큐비트가 없는 경우 널 포인터가 될 수 있습니다(예:QkGate_GlobalPhase). - params – 게이트 매개변수로 사용할 매개변수
QkParam*배열에 대한 포인터. 매개변수가 없는gate경우(예:QkGate_H) 이 값은 null 포인터가 될 수 있습니다.
반품
QkExitCode_Success 추가 작업이 성공적으로 완료되면. 실패 시, 새로운 매개변수 심볼의 이름이 QkExitCode_ParameterNameConflict 기존 심볼과 중복됨을 나타냅니다. QkExitCode_ParameterError 매개변수 심볼을 추적하려고 할 때 발생하는 기타 일반적인 오류에 대해 설명합니다.
qk_gate_num_qubits
uint32_t qk_gate_num_qubits(QkGate gate)
QkGate 에 대한 큐비트 수를 가져옵니다.
예
uint32_t num_qubits = qk_gate_num_qubits(QkGate_CCX);매개변수
- 게이트 - 큐비트 수를 가져올
QkGate.
반품
게이트가 작동하는 큐비트 수입니다.
qk_gate_num_params
uint32_t qk_gate_num_params(QkGate gate)
QkGate 에 대한 매개변수 수를 가져옵니다.
예
uint32_t num_params = qk_gate_num_params(QkGate_R);매개변수
- 게이트 - 큐비트 수를 가져올
QkGate.
반품
게이트에 있는 매개변수 수입니다.
qk_circuit_measure
QkExitCode qk_circuit_measure(QkCircuit *circuit, uint32_t qubit, uint32_t clbit)
회로에 측정값 추가
예
QkCircuit *qc = qk_circuit_new(100, 1);
qk_circuit_measure(qc, 0, 0);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 측정값을 추가할 회로에 대한 포인터입니다
- 큐비트 - 큐비트가 측정할
uint32_t - clbit - 측정 결과를 저장할
uint32_t
반품
종료 코드입니다.
qk_circuit_reset
QkExitCode qk_circuit_reset(QkCircuit *circuit, uint32_t qubit)
회로에 리셋 추가
예
QkCircuit *qc = qk_circuit_new(100, 0);
qk_circuit_reset(qc, 0);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 리셋을 추가할 회로에 대한 포인터입니다
- 큐비트 - 재설정할 큐비트(
uint32_t)
반품
종료 코드입니다.
qk_circuit_barrier
QkExitCode qk_circuit_barrier(QkCircuit *circuit, const uint32_t *qubits, uint32_t num_qubits)
회로에 장벽을 추가합니다.
예
QkCircuit *qc = qk_circuit_new(100, 1);
uint32_t qubits[5] = {0, 1, 2, 3, 4};
qk_circuit_barrier(qc, qubits, 5);안전
qubits 이 가리키는 배열의 길이는 num_qubits 이어야 합니다. 불일치가 있는 경우 동작이 정의되지 않은 것입니다.
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 배리어를 추가할 회로에 대한 포인터입니다.
- 숫자_큐비트 - 배리어의 너비인 큐비트 수입니다.
- 큐비트 - 배리어를 추가할
uint32_t큐비트 인덱스 배열에 대한 포인터입니다.
반품
종료 코드입니다.
qk_circuit_unitary
QkExitCode qk_circuit_unitary(QkCircuit *circuit, const QkComplex64 *matrix, const uint32_t *qubits, uint32_t num_qubits, bool check_input)
회로에 임의의 유니타리 행렬을 추가합니다.
예
QkComplex64 c0 = {0, 0}; // 0+0i
QkComplex64 c1 = {1, 0}; // 1+0i
const uint32_t num_qubits = 1;
QkComplex64 unitary[2*2] = {c0, c1, // row 0
c1, c0}; // row 1
QkCircuit *circuit = qk_circuit_new(1, 0); // 1 qubit circuit
uint32_t qubit[1] = {0}; // qubit to apply the unitary on
qk_circuit_unitary(circuit, unitary, qubit, num_qubits, true);안전
다음 중 하나라도 위반하면 동작이 정의되지 않습니다:
circuit는 널이 아닌 유효한 포인터입니다QkCircuitmatrix초기화된QkComplex64``4**num_qubits값들에 대한 정렬된 포인터입니다qubits초기화된uint32_t``num_qubits값들에 대한 정렬된 포인터입니다
매개변수
- 회로 - 단위를 추가할 회로에 대한 포인터입니다.
- 행렬 - 단일 행렬을 나타내는
QkComplex64배열에 대한 포인터입니다. 이것은 행 단위의 단일 행렬이어야 합니다2 ^ num_qubits x 2 ^ num_qubits. 보다 명시적으로:(i, j)-번째 요소는matrix[i * 2^n + j]에 의해 제공됩니다.matrix의 내용은 회로에 추가되기 전에 이 함수 내부에 복사되므로 호출자는matrix이 가리키는 원본 메모리의 소유권을 유지하며 호출 후 재사용할 수 있고 호출자는 이를 해제할 책임이 있습니다. - 큐비트 - 길이가
num_qubits인 큐비트 인덱스 배열에 대한 포인터입니다. - num_퀴비트 - 유니티가 작동하는 큐비트 수입니다.
- check_input - 참이면 이 함수는 행렬이 단일 행렬인지 확인합니다. False로 설정하면 호출자는 행렬이 단일 행렬인지 확인할 책임이 있으며, 행렬이 단일 행렬이 아닌 경우 정의되지 않은 동작이 발생하여 회로가 손상됩니다.
반품
종료 코드입니다.
qk_circuit_inst_unitary
void qk_circuit_inst_unitary(QkCircuit *circuit, size_t index, QkComplex64 *out)
회로 내의 특정 명령에 해당하는 단위 행렬을 적어 보십시오.
지정된 인덱스의 명령어가 단일 행렬이 아닐 경우 오류가 발생합니다.
안전
다음 중 하나라도 위반될 경우 동작이 정의되지 않습니다: 가 유효한 null이 아닌 포인터가 아닐 경우 circuit , QkCircuit회로의 명령어 수에 비해 범위를 벗어날 경우 index , QkComplex64에 대한 4**num_qubits 쓰기 연산 횟수에 대해 유효하지 않을 out 경우.
매개변수
- 회로 – 유니터리를 가져올 회로를 가리키는 포인터.
- index – 단위 행렬을 구할 명령어의 인덱스.
- out – 단항 행렬을 기록할 할당 및 정렬된 포인터.
qk_circuit_instruction_kind
QkOperationKind qk_circuit_instruction_kind(const QkCircuit *circuit, size_t index)
“유형”별 회로 강의를 수강하세요.
안전
가 유효하고 null이 아닌 포인터가 아니거나 QkCircuit , 회로의 명령어 수에 비해 범위를 벗어난 index 경우 동작이 circuit 정의되지 않습니다.
매개변수
- circuit – 명령어 종류를 가져올 회로에 대한 포인터.
- index – 종류를 조회할 명령어의 인덱스.
반품
주어진 인덱스에 있는 명령어의 종류를 나타내는 열거형 QkOperationKind 값.
qk_circuit_count_ops
QkOpCounts qk_circuit_count_ops(const QkCircuit *circuit)
회로의 명령어에 대한 문자열 이름 목록과 그 개수를 반환합니다.
구조체에 할당된 메모리를 제대로 해제하려면 qk_opcounts_clear 을 호출해야 합니다. 이렇게 하지 않고 QkOpCounts 구조체를 삭제하면 QkOpCount 의 저장된 배열이 할당된 상태로 유지되어 메모리 누수가 발생합니다.
예
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubits[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubits, NULL);
QkOpCounts counts = qk_circuit_count_ops(qc);
// .. once done
qk_opcounts_clear(&counts);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 카운트를 가져올 회로에 대한 포인터입니다.
반품
회로 연산이 포함된 QkOpCounts 구조체입니다.
qk_circuit_num_instructions
size_t qk_circuit_num_instructions(const QkCircuit *circuit)
회로의 총 명령어 수를 반환합니다.
예
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);
size_t num = qk_circuit_num_instructions(qc); // 1안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 총 인스트럭션 수를 가져올 회로에 대한 포인터입니다.
반품
회로의 총 명령어 수입니다.
qk_circuit_get_instruction
void qk_circuit_get_instruction(const QkCircuit *circuit, size_t index, QkCircuitInstruction *instruction)
회로의 명령어에 대한 명령어 세부 정보를 반환합니다.
이 함수는 회로에서 주어진 명령어에 대한 명령어 세부 정보를 가져오는 데 사용됩니다.
이 함수는 제공된 QkCircuitInstruction 에 내부적으로 메모리를 할당하므로 qk_circuit_instruction_clear 을 호출하여 메모리를 확보할 책임이 있습니다.
예
QkCircuitInstruction inst;
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t qubit[1] = {0};
qk_circuit_gate(qc, QkGate_H, qubit, NULL);
qk_circuit_get_instruction(qc, 0, &inst);
qk_circuit_instruction_clear(&inst);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다. index 값은 qk_circuit_num_instructions 에서 반환한 값보다 작아야 하며, 그렇지 않으면 이 함수는 패닉 상태에 빠집니다. instruction 이 QkCircuitInstruction 을 위한 충분한 공간을 가진 메모리 할당에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 명령어 세부 정보를 가져올 회로에 대한 포인터입니다.
- index - 인스트럭션 세부 정보를 가져올 인스트럭션 인덱스입니다.
- 명령어 - 작성할 위치에 대한 포인터
QkCircuitInstruction
qk_circuit_pauli_product_rotation
void qk_circuit_pauli_product_rotation(QkCircuit *circuit, const QkPauliProductRotation *rotation, const uint32_t *qubits)
회로에 QkPauliProductRotation 를 적용한다.
예
// build a IXYZ Pauli rotation
bool x[4] = {false, true, true, false};
bool z[4] = {false, false, true, true};
QkParam *angle = qk_param_from_double(1.0);
QkPauliProductRotation rotation = {x, z, 4, angle};
// append it to a circuit
QkCircuit *circuit = qk_circuit_new(10, 1);
uint32_t qubits[4] = {0, 1, 2, 3};
qk_circuit_pauli_product_rotation(circuit, &rotation, qubits);
// do something with the circuit... and then free it
qk_param_free(angle);
qk_circuit_free(circuit);안전
다음 중 하나라도 위반하면 동작이 정의되지 않습니다:
circuit는 널이 아닌 유효한 포인터입니다QkCircuitrotation일관성 있는 객체를 가리키는 유효하고QkPauliProductRotationnull이 아닌 포인터입니다. 구체적으로, 및rotation->xrotation->z데이터 배열은 개rotation->len요소에 대해 읽을 수 있어야 합니다.qubits초기화된uint32_t``rotation->len값을 가리키는 정렬된 포인터입니다.
매개변수
- 회로 – 연산을 적용할 회로.
- rotation – 적용할
QkPauliProductRotation객체에 대한 포인터. - 큐비트 – 큐비트 배열을 가리키는 포인터.
qk_circuit_inst_pauli_product_rotation
QkExitCode qk_circuit_inst_pauli_product_rotation(const QkCircuit *circuit, size_t index, QkPauliProductRotation *instruction)
회로 명령어에서 데이터를 QkPauliProductRotation 가져옵니다.
인덱스 에 QkPauliProductRotation 명령어가 있는 index 회로의 경우, 이 함수는 instruction 포인터에 데이터의 QkPauliProductRotation 복사본을 할당합니다. 이 데이터는 회로와 별개로 존재하므로, 수동으로. qk_pauli_product_rotation_clear을 사용하여 해제해야 합니다.
지정된 위치의 index 명령어가 가 아닐 QkPauliProductRotation경우, 이 함수는 오류를 QkExitCode_InvalidOperationKind 반환합니다. . qk_circuit_instruction_kind을 사용하여 해당 명령어가 올바른 유형인지 확인할 수 있습니다.
안전
가 유효하고 null이 아닌 포인터가 QkCircuit아닐 circuit 경우 동작이 정의되지 않습니다. 의 값은 가 반환하는 index 값보다 qk_circuit_num_instructions 작아야 합니다. 그렇지 않으면 이 함수는 패닉 상태가 됩니다. 가 를 저장할 충분한 공간이 있는 메모리 할당을 QkPauliProductRotation가리키는 유효하고 null이 아닌 포인터가 아닌 경우, 동작은 instruction 정의되지 않습니다.
매개변수
- circuit – 명령어 세부 정보를 가져올 회로에 대한 포인터.
- index – 회로 명령어 인덱스.
- 명령 – 데이터를 저장하기 위해
QkPauliProductRotation할당된 영역을 가리키는 포인터.
반품
QkExitCode_Success 데이터가 해당 명령어에 기록되었는지, 아니면 QkExitCode_InvalidOperationKind 인덱스가. QkPauliProductRotation를 가리키지 않았는지.
qk_circuit_pauli_product_measurement
void qk_circuit_pauli_product_measurement(QkCircuit *circuit, const QkPauliProductMeasurement *measurement, const uint32_t *qubits, uint32_t clbit)
회로에 QkPauliProductMeasurement 를 적용한다.
예
// build a XZ Pauli measurement
bool x[2] = {true, false};
bool z[2] = {false, true};
QkPauliProductMeasurement measure = {x, z, 2, false};
// append it to a circuit
QkCircuit *circuit = qk_circuit_new(10, 1);
uint32_t qubits[2] = {0, 2};
uint32_t clbit = 0;
qk_circuit_pauli_product_measurement(circuit, &measure, qubits, clbit);
// do something with the circuit... and then free it
qk_circuit_free(circuit);안전
다음 중 하나라도 위반하면 동작이 정의되지 않습니다:
circuit는 널이 아닌 유효한 포인터입니다QkCircuitmeasurement일관성 있는 객체를 가리키는 유효하고QkPauliProductMeasurementnull이 아닌 포인터입니다. 구체적으로, 및measurement->xmeasurement->z데이터 배열은 개measurement->len요소에 대해 읽을 수 있어야 합니다.qubits초기화된uint32_t``rotation->len값을 가리키는 정렬된 포인터입니다.
매개변수
- 회로 – 연산을 적용할 회로.
- 측정 – 적용할
QkPauliProductMeasurement대상에 대한 포인터. - 큐비트 – 큐비트 배열을 가리키는 포인터.
- clbit – 측정 큐비트를 지정하는
uint32_t단일 매개변수.
qk_circuit_inst_pauli_product_measurement
QkExitCode qk_circuit_inst_pauli_product_measurement(const QkCircuit *circuit, size_t index, QkPauliProductMeasurement *instruction)
회로 명령어에서 데이터를 QkPauliProductMeasurement 가져옵니다.
인덱스 에 QkPauliProductMeasurement 명령어가 있는 index 회로의 경우, 이 함수는 instruction 포인터에 데이터의 QkPauliProductMeasurement 복사본을 할당합니다. 이 데이터는 회로와 별개로 존재하므로, 수동으로 해제해야 qk_pauli_product_measurement_clear 합니다.
지정된 위치의 index 명령어가 가 아닐 QkPauliProductMeasurement경우, 이 함수는 오류를 QkExitCode_InvalidOperationKind 반환합니다. ... qk_circuit_instruction_kind를 사용하여 해당 명령어가 올바른 유형인지 확인하십시오.
안전
가 유효하고 null이 아닌 포인터가 QkCircuit아닐 circuit 경우 동작이 정의되지 않습니다. 의 값은 가 반환하는 index 값보다 qk_circuit_num_instructions 작아야 합니다. 그렇지 않으면 이 함수는 패닉 상태가 됩니다. 가 를 저장할 충분한 공간이 있는 메모리 할당을 QkPauliProductMeasurement가리키는 유효하고 null이 아닌 포인터가 아닌 경우, 동작은 instruction 정의되지 않습니다.
매개변수
- circuit – 명령어 세부 정보를 가져올 회로에 대한 포인터.
- index – 회로 명령어 인덱스.
- 명령 – 데이터를 저장하기 위해
QkPauliProductMeasurement할당된 영역을 가리키는 포인터.
반품
QkExitCode_Success 데이터가 해당 명령어에 기록되었는지, 아니면 QkExitCode_InvalidOperationKind 인덱스가. QkPauliProductMeasurement를 가리키지 않았는지.
qk_circuit_instruction_clear
void qk_circuit_instruction_clear(QkCircuitInstruction *inst)
회로 명령 객체의 데이터를 지웁니다.
이 함수는 제공된 QkCircuitInstruction 포인터에 대한 할당을 해제하는 것이 아니라 인스트럭션에 포함된 데이터에 대한 내부 할당만 해제합니다. QkCircuitInstruction 을 저장하는 데 사용되는 실제 할당량을 할당하고 해제하는 것은 귀하의 책임입니다.
예
QkCircuitInstruction *inst = malloc(sizeof(QkCircuitInstruction));
QkCircuit *qc = qk_circuit_new(100, 0);
uint32_t q0[1] = {0};
qk_circuit_gate(qc, QkGate_H, q0, NULL);
qk_circuit_get_instruction(qc, 0, inst);
qk_circuit_instruction_clear(inst); // clear internal allocations
free(inst); // free struct
qk_circuit_free(qc); // free the circuit안전
inst 이 QkCircuitInstruction 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- inst - 무료 인스트럭션에 대한 포인터입니다.
qk_opcounts_clear
void qk_opcounts_clear(QkOpCounts *op_counts)
회로 작업 횟수 목록의 콘텐츠를 지웁니다.
안전
op_counts 이 qk_circuit_count_ops 에서 반환한 객체가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- op_counts -
qk_circuit_count_ops에서 반환된 연산 카운트 목록입니다.
qk_circuit_delay
QkExitCode qk_circuit_delay(QkCircuit *circuit, uint32_t qubit, double duration, QkDelayUnit unit)
회로에 지연 인스트럭션을 추가합니다.
예
QkCircuit *qc = qk_circuit_new(1, 0);
qk_circuit_delay(qc, 0, 100.0, QkDelayUnit_NS);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 지연을 추가할 회로에 대한 포인터입니다.
- 큐비트 - 지연을 적용할 큐비트의
uint32_t인덱스입니다. - 기간 - 지연 기간입니다.
- 단위 - 기간의 단위를 나타내는 열거형입니다.
반품
종료 코드입니다.
qk_circuit_draw
char *qk_circuit_draw(const QkCircuit *circuit, const QkCircuitDrawerConfig *config)
회로도를 텍스트로 그려주세요.
예
QkCircuit *circuit = qk_circuit_new(2, 1);
qk_circuit_gate(circuit, QkGate_H, (uint32_t[]){0}, NULL);
qk_circuit_gate(circuit, QkGate_CX, (uint32_t[]){0, 1}, NULL);
qk_circuit_measure(circuit, 0, 0);
qk_circuit_measure(circuit, 1, 0);
QkCircuitDrawerConfig config = {false, true, 0};
char *circ_str = qk_circuit_draw(circuit, &config);
printf("%s", circ_str);
qk_str_free(circ_str);
qk_circuit_free(circuit);안전
가 유효하고 NULL이 아닌 구조체 포인터가 QkCircuit아니거나, 가 config NULL이 circuit 아니면서 유효하지 않은 구조체 QkCircuitDrawerConfig 포인터인 경우 동작이 정의되지 않습니다.
매개변수
-
회로 – 그릴 회로를 가리키는 포인터.
-
config – 구조체에
QkCircuitDrawerConfig대한 포인터 또는 NULL. NULL인 경우, 서랍은 다음 기본값을 사용합니다:bundle_cregs = truemerge_wires = truefold = 0
반품
회로 표현이 포함된 널 종료 문자열을 가리키는 포인터. 작업이 끝나면 할당된 메모리를 해제하려면 를 qk_str_free 사용해야 합니다.
qk_circuit_to_dag
QkDag *qk_circuit_to_dag(const QkCircuit *circuit)
주어진 회로를 DAG로 변환하십시오.
새로운 DAG는 서킷에서 복사됩니다; 원본 circuit 참조는 여전히 호출자가 소유하며, 여전히 해제되어야 합니다 qk_circuit_free. 사용이 완료된 반환된 qk_dag_free DAG는 반드시 로 해제해야 합니다.
예
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr = qk_quantum_register_new(3, "qr");
qk_circuit_add_quantum_register(qc, qr);
qk_quantum_register_free(qr);
QkDag *dag = qk_circuit_to_dag(qc);
qk_dag_free(dag);
qk_circuit_free(qc);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 – DAG를 생성할 회로에 대한 포인터.
반품
새 DAG에 대한 포인터.
qk_circuit_copy_empty_like
QkCircuit *qk_circuit_copy_empty_like(const QkCircuit *circuit, QkVarsMode vars_mode, QkBlocksMode blocks_mode)
자신의 구조는 동일하지만 비어 있는 복사본을 반환합니다.
해당 구조에는 다음이 포함됩니다:
- 글로벌 단계
- 모든 큐비트와 클래비트, 레지스터를 포함하여.
예
QkCircuit *qc = qk_circuit_new(10, 10);
for (int i = 0; i < 10; i++) {
qk_circuit_measure(qc, i, i);
uint32_t qubits[1] = {i};
qk_circuit_gate(qc, QkGate_H, qubits, NULL);
}
// As the circuit does not contain any control-flow instructions,
// vars_mode and blocks_mode do not have any effect.
QkCircuit *copy = qk_circuit_copy_empty_like(qc, QkVarsMode_Alike, QkBlocksMode_Drop);
size_t num_copy_instructions = qk_circuit_num_instructions(copy); // 0
// do something with the copy
qk_circuit_free(qc);
qk_circuit_free(copy);안전
circuit 이 QkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 회로 - 복사할 회로에 대한 포인터입니다.
- vars_mode – 클래식 변수 처리 모드.
- blocks_mode – 블록 처리 모드.
반품
복사된 회로에 대한 포인터.
qk_circuit_estimate_fidelity
double qk_circuit_estimate_fidelity(const QkCircuit *circuit, const QkTarget *target)
물리적 회로의 충실도를 추정하십시오.
이 함수는 회로 내 각 게이트의 오류율을 곱하여 회로의 충실도를 추정합니다. 이 방법은 실제 하드웨어에서의 실행 정확도를 현실적으로 시뮬레이션하기 위한 것이 아닙니다. 이 기능은 트랜스파일러가 작동 시 다양한 휴리스틱 기법을 적용했을 때의 정확도를 바탕으로, 트랜스파일러가 어떻게 작동할지 대략적으로 파악할 수 있도록 설계되었습니다. 일반적으로 이는 서로 다른 컴파일 결과물을 비교하여, 하드웨어에서 어느 쪽이 더 우수한 실행 품질을 보여줄지 추정하는 데에만 유용합니다.
안전
와 target 가 QkTarget``QkCircuit 각각 에 대한 유효하고 null이 아닌 포인터가 아닌 경우 circuit , 동작은 정의되지 않습니다.
매개변수
- 회로 – 충실도를 추정할 회로를 가리키는 포인터.
- target – 회로가 실행될 대상에 대한 포인터입니다. 이는 회로 내 각 명령어의 오류율을 구하는 데 사용됩니다.
반품
회로의 계산된 충실도. target회로가 물리적 회로가 아닌 경우(즉, 에 circuit 포함되지 않은 명령어가 있는 경우), 이 함수는 NaN를 반환합니다.
qk_circuit_get_control_flow_instruction
QkControlFlowInstruction *qk_circuit_get_control_flow_instruction(const QkCircuit *circuit, size_t inst_idx, const QkControlFlowInstruction *parent_cf)
지정된 인덱스에 있는 회로에서 제어 흐름 명령어를 가져옵니다.
이 함수는 지정된 인덱스에 있는 제어 흐름 명령어에 대한 정보를 담고 있는 불투명 QkControlFlowInstruction 구조체에 대한 포인터를 반환합니다. 위 위치의 inst_idx 명령어는 제어 흐름 명령어여야 합니다(예: IfElse,ForLoop 등).
예
QkCircuit *circuit = ...; // Assume circuit contains a control flow instruction at index 0
QkControlFlowInstruction *cf_inst = qk_circuit_get_control_flow_instruction(circuit, 0, NULL);
QkControlFlowKind kind = qk_control_flow_kind(cf_inst);
qk_control_flow_instruction_free(cf_inst);안전
가 QkCircuit 객체에 대한 유효한 포인터가 아니거나, 가 inst_idx 회로의 명령어 목록 내에서 유효한 인덱스가 아니거나, 위치 에 inst_idx 있는 명령어가 제어 흐름 명령어가 아닌 경우 circuit , 해당 동작은 정의되지 않습니다. QkControlFlowInstruction가 null이 아니라면 parent_cf , 반드시 에 대한 유효한 포인터여야 합니다.
매개변수
- 회로 – 제어 흐름 명령어가 포함된 회로를 가리키는 포인터.
- inst_idx – 회로의 명령어 목록에서 해당 명령어의 인덱스.
- parent_cf – 상위 제어 흐름 명령어를 가리키는 포인터. 단
NULL, 이 명령어가 회로의 최상위 수준에 있는 경우에는 예외입니다. 이는 최상위 회로에 대해 올바른 큐비트 및 클비트 매핑을 계산하는 데 사용됩니다.
반품
새로 할당된 QkControlFlowInstruction 객체를 가리키는 포인터.
qk_control_flow_instruction_free
void qk_control_flow_instruction_free(QkControlFlowInstruction *cf_inst)
객체를 QkControlFlowInstruction 해제합니다.
예
QkCircuit *circuit = ...; // Assume circuit contains a control flow instruction at index 0
QkControlFlowInstruction *cf_inst = qk_circuit_get_control_flow_instruction(circuit, 0, NULL);
qk_control_flow_instruction_free(cf_inst);안전
qk_circuit_get_control_flow_instruction가 함수에서 반환된 유효한 포인터가 아니거나, 동일한 포인터에 대해 이 함수가 두 번 이상 호출된 경우 cf_inst , 동작이 정의되지 않습니다.
매개변수
- cf_inst – 해제할 제어 흐름 명령어를 가리키는 포인터.
qk_circuit_to_python
PyObject *qk_circuit_to_python(QkCircuit *qc)
객체의 QkCircuit 소유권을 Python 에 전달합니다.
결과로 생성된 Python 객체는 . 이 아니라 QuantumCircuit, CircuitData내부 객체이며, 일반적으로 . QuantumCircuit._data으로 접근됩니다. 를 사용하여 완전한 QuantumCircuit``qk_circuit_to_python_full 객체를 생성할 수 있습니다.
이 함수를 호출한 후에는 QkCircuit 포인터를 사용하는 것이 안전하지 않습니다. 특히, 이를 지우거나 해제하려고 시도해서는 안 됩니다. 호출자는 해당 객체를 소유하고 QkCircuit있어야 하며, 빌린 참조를 가지고 있어서는 안 됩니다(예를 들어 qk_circuit_borrow_from_python , 에서 가져온 QkCircuit * 객체는 소유권이 없습니다).
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 초기화되고 소유권이 있는 에 대한 유효한 비공백 포인터가 QkCircuit 아닌 circuit 경우 동작이 정의되지 않습니다.
매개변수
- qc – 소유된 객체.
반품
해당 객체에 대한 Python 참조.
qk_circuit_to_python_full
PyObject *qk_circuit_to_python_full(QkCircuit *qc)
객체의 QkCircuit 소유권을 Python 에 전달하고 완전한 객체를 QuantumCircuit생성합니다.
여기에는 완전체를 생성하기 위한 추가적인 PythonQuantumCircuit-공간 논리가 포함되는데, 이는 가 내부 QuantumCircuit._data 체에만 해당하기 QkCircuit 때문이다.
이 함수를 호출한 후에는 QkCircuit 포인터를 사용하는 것이 안전하지 않습니다. 특히, 이를 지우거나 해제하려고 시도해서는 안 됩니다. 호출자는 해당 객체를 소유하고 QkCircuit있어야 하며, 빌린 참조를 가지고 있어서는 안 됩니다(예를 들어 qk_circuit_borrow_from_python , 에서 가져온 QkCircuit * 객체는 소유권이 없습니다).
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 초기화되고 소유권이 있는 에 대한 유효한 비공백 포인터가 QkCircuit 아닌 circuit 경우 동작이 정의되지 않습니다.
매개변수
- qc – 소유된 객체.
반품
해당 객체에 대한 Python 참조.
qk_circuit_borrow_from_python
QkCircuit *qk_circuit_borrow_from_python(PyObject *ob)
Python 객체에서 QkCircuit 포인터를 가져옵니다.
이 함수의 입력값은 *가 *QuantumCircuit 아니라 의 출력값이어야 QuantumCircuit._data한다는 점에 유의하십시오. 이는 올바른 참조 카운팅 세미언틱스를 적용하기 위해 필요합니다.
이 코드는 Python 참조를 가져와, 해당 참조가 올바른 유형일 경우 그 QkCircuit 포인터를 추출합니다. 반환된 포인터는 해당 ob 포인터에서 빌려온 것입니다. 의 유형이 올바르지 않은 PyObject 경우, 반환 값은 이 NULL 되며 Python 인터프리터의 예외 상태가 설정됩니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 사용할 수도 있습니다 qk_circuit_convert_from_python. 이는 논리적으로는 이 함수와 완전히 동일하지만, Python 변환 함수 계열에 PyArg_Parse* 대한 “변환기” 함수로 직접 사용할 수 있습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 Python 객체를 가리키는 유효한 비공백 포인터가 아닌 ob 경우 동작이 정의되지 않습니다.
매개변수
- ob – 차용된 Python 객체.
반품
네이티브 객체에 대한 포인터이거나, NULLPython 객체의 유형이 올바르지 않은 경우.
qk_circuit_convert_from_python
int qk_circuit_convert_from_python(PyObject *object, void *address)
Python 객체에서 QkCircuit 포인터를 가져옵니다.
이 함수의 입력값은 *가 *QuantumCircuit 아니라 의 출력값이어야 QuantumCircuit._data한다는 점에 유의하십시오. 이는 올바른 참조 카운팅 세미언틱스를 적용하기 위해 필요합니다.
이 코드는 Python 참조를 가져와, 해당 QkCircuit 포인터가 올바른 유형인 경우 이를 address``로 추출합니다. 반환된 포인터는 해당 object 포인터에서 빌려온 것입니다. 의 PyObject 유형이 올바르지 않은 경우, 반환 값은 0이 되며, Python 인터프리터의 예외 상태가 설정되고 는 변경되지 address 않습니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 qk_circuit_borrow_from_python사용할 수도 있는데, 이는 논리적으로는 이와 완전히 동일하지만 직접 사용할 때 더 자연스러운 시그니처를 갖습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 유효한 null이 아닌 Python 객체 포인터가 object 아니거나, 가 올바른 유형의 쓰기 가능한 address 데이터에 대한 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 객체 – 빌려온 Python 객체.
- 주소 – 출력을 기록할 위치.
반품
성공 시 1, 실패 시 0.
qk_quantum_register_to_python
PyObject *qk_quantum_register_to_python(QkQuantumRegister *qr)
객체의 QkQuantumRegister 소유권을 Python 에 전달합니다.
이 함수를 호출한 후에는 QkQuantumRegister 포인터를 사용하는 것이 안전하지 않습니다. 특히, 이를 지우거나 해제하려고 시도해서는 안 됩니다. 호출자는 해당 객체를 소유하고 QkQuantumRegister있어야 하며, 빌린 참조를 가지고 있어서는 안 됩니다(예를 들어 qk_quantum_register_borrow_from_python , 에서 가져온 QkQuantumRegister * 객체는 소유권이 없습니다).
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 초기화되고 소유권이 있는 에 대한 유효한 비공백 포인터가 QkQuantumRegister 아닌 qr 경우 동작이 정의되지 않습니다.
매개변수
- qr – 소유된 객체.
반품
해당 객체에 대한 Python 참조.
qk_quantum_register_borrow_from_python
const QkQuantumRegister *qk_quantum_register_borrow_from_python(PyObject *ob)
Python 객체에서 QkQuantumRegister 포인터를 가져옵니다.
이 코드는 Python 참조를 가져와, 해당 참조가 올바른 유형일 경우 그 QkQuantumRegister 포인터를 추출합니다. 반환된 포인터는 해당 ob 포인터에서 빌려온 것입니다. 의 유형이 올바르지 않은 PyObject 경우, 반환 값은 이 NULL 되며 Python 인터프리터의 예외 상태가 설정됩니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 사용할 수도 있습니다 qk_quantum_register_convert_from_python. 이는 논리적으로는 이 함수와 완전히 동일하지만, Python 변환 함수 계열에 PyArg_Parse* 대한 “변환기” 함수로 직접 사용할 수 있습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 Python 객체를 가리키는 유효한 비공백 포인터가 아닌 ob 경우 동작이 정의되지 않습니다.
매개변수
- ob – 차용된 Python 객체.
반품
네이티브 객체에 대한 포인터이거나, NULLPython 객체의 유형이 올바르지 않은 경우.
qk_quantum_register_convert_from_python
int qk_quantum_register_convert_from_python(PyObject *object, void *address)
Python 객체에서 QkQuantumRegister 포인터를 가져옵니다.
이 코드는 Python 참조를 가져와, 해당 QkQuantumRegister 포인터가 올바른 유형인 경우 이를 address``로 추출합니다. 반환된 포인터는 해당 object 포인터에서 빌려온 것입니다. 의 PyObject 유형이 올바르지 않은 경우, 반환 값은 0이 되며, Python 인터프리터의 예외 상태가 설정되고 는 변경되지 address 않습니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 qk_quantum_register_borrow_from_python사용할 수도 있는데, 이는 논리적으로는 이와 완전히 동일하지만 직접 사용할 때 더 자연스러운 시그니처를 갖습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 유효한 null이 아닌 Python 객체 포인터가 object 아니거나, 가 올바른 유형의 쓰기 가능한 address 데이터에 대한 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 객체 – 빌려온 Python 객체.
- 주소 – 출력을 기록할 위치.
반품
성공 시 1, 실패 시 0.
qk_classical_register_to_python
PyObject *qk_classical_register_to_python(QkClassicalRegister *cr)
객체의 QkClassicalRegister 소유권을 Python 에 전달합니다.
이 함수를 호출한 후에는 QkClassicalRegister 포인터를 사용하는 것이 안전하지 않습니다. 특히, 이를 지우거나 해제하려고 시도해서는 안 됩니다. 호출자는 해당 객체를 소유하고 QkClassicalRegister있어야 하며, 빌린 참조를 가지고 있어서는 안 됩니다(예를 들어 qk_classical_register_borrow_from_python , 에서 가져온 QkClassicalRegister * 객체는 소유권이 없습니다).
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 초기화되고 소유권이 있는 에 대한 유효한 비공백 포인터가 QkClassicalRegister 아닌 cr 경우 동작이 정의되지 않습니다.
매개변수
- cr – 소유된 객체.
반품
해당 객체에 대한 Python 참조.
qk_classical_register_borrow_from_python
const QkClassicalRegister *qk_classical_register_borrow_from_python(PyObject *ob)
Python 객체에서 QkClassicalRegister 포인터를 가져옵니다.
이 코드는 Python 참조를 가져와, 해당 참조가 올바른 유형일 경우 그 QkClassicalRegister 포인터를 추출합니다. 반환된 포인터는 해당 ob 포인터에서 빌려온 것입니다. 의 유형이 올바르지 않은 PyObject 경우, 반환 값은 이 NULL 되며 Python 인터프리터의 예외 상태가 설정됩니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 사용할 수도 있습니다 qk_classical_register_convert_from_python. 이는 논리적으로는 이 함수와 완전히 동일하지만, Python 변환 함수 계열에 PyArg_Parse* 대한 “변환기” 함수로 직접 사용할 수 있습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 Python 객체를 가리키는 유효한 비공백 포인터가 아닌 ob 경우 동작이 정의되지 않습니다.
매개변수
- ob – 차용된 Python 객체.
반품
네이티브 객체에 대한 포인터이거나, NULLPython 객체의 유형이 올바르지 않은 경우.
qk_classical_register_convert_from_python
int qk_classical_register_convert_from_python(PyObject *object, void *address)
Python 객체에서 QkClassicalRegister 포인터를 가져옵니다.
이 코드는 Python 참조를 가져와, 해당 QkClassicalRegister 포인터가 올바른 유형인 경우 이를 address``로 추출합니다. 반환된 포인터는 해당 object 포인터에서 빌려온 것입니다. 의 PyObject 유형이 올바르지 않은 경우, 반환 값은 0이 되며, Python 인터프리터의 예외 상태가 설정되고 는 변경되지 address 않습니다.
이 함수를 호출하려면 Python 인터프리터가 연결되어 있어야 합니다.
또한 를 qk_classical_register_borrow_from_python사용할 수도 있는데, 이는 논리적으로는 이와 완전히 동일하지만 직접 사용할 때 더 자연스러운 시그니처를 갖습니다.
안전
호출자는 Python 인터프리터에 연결되어 있어야 합니다. 가 유효한 null이 아닌 Python 객체 포인터가 object 아니거나, 가 올바른 유형의 쓰기 가능한 address 데이터에 대한 포인터가 아닌 경우 동작이 정의되지 않습니다.
매개변수
- 객체 – 빌려온 Python 객체.
- 주소 – 출력을 기록할 위치.
반품
성공 시 1, 실패 시 0.