Skip to main content
IBM Quantum Platform

QkCircuit

typedef struct QkCircuit QkCircuit

양자 컴퓨팅의 기본 요소는 양자 회로입니다. 이는 양자 처리 장치(QPU)에서 한 번에 한 번씩 실행할 수 있는 계산 루틴입니다. 회로는 단일 연산(게이트), 측정 및 재설정을 통해 미리 정의된 양의 양자 데이터(키스킷에서는 큐비트만 직접 지원)에 대해 작동합니다. 또한 양자 회로에는 실시간 계산 및 제어 흐름 구성을 포함한 기존 데이터에 대한 연산이 포함될 수 있으며, 이는 QPU의 컨트롤러에 의해 실행됩니다. QkCircuit 구조는 키스킷의 양자 회로 데이터 구조에 대한 낮은 수준의 인터페이스를 노출하며, 키스킷의 내부 데이터 모델에 정의된 것만 노출합니다. 따라서 상위 수준 Python 클래스에서 사용할 수 있는 일부 기능이 누락되어 있습니다 QuantumCircuit 클래스에서 사용할 수 있는 기능이 없습니다.

아래는 3큐비트 그린버거-호른-자일링거(GHZ) 상태를 다음과 같이 정의하는 양자 회로의 예시입니다:

ψ=(000+111)/2|\psi\rangle = \left( |000\rangle + |111\rangle \right) / \sqrt{2}
#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, ResetDelay) 및 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우와 regQkQuantumRegister 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.
  • 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

회로에 포함된 양자 레지스터의 개수.

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우와 regQkClassicalRegister 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.
  • 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

회로에 포함된 클래식 레지스터의 수.

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 복사할 회로에 대한 포인터입니다.

반품

입력의 복사본에 대한 새 포인터 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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

회로가 정의된 큐비트 수입니다.

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

이 회로가 정의된 클비트 수.

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

회로 내의 미결합 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 회로에 대한 포인터입니다.

반품

이 회로의 글로벌 단계.

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

안전

QkParamQkCircuit 를 가리키는 유효하고 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);

안전

qubitsparams 유형은 각각 길이가 표준 게이트에 대한 기대치와 일치하는 uint32_tdouble 배열에 대한 포인터가 될 것으로 예상됩니다. 배열이 충분히 길지 않으면 배열의 범위를 벗어나 읽히므로 이 함수의 동작이 정의되지 않습니다. 주어진 게이트에 큐비트나 파라미터가 없는 경우 널 포인터가 될 수 있습니다. qk_gate_num_qubitsqk_gate_num_params 에서 특정 게이트에 필요한 큐비트 및 매개변수 수를 확인할 수 있습니다.

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 게이트를 추가할 회로에 대한 포인터입니다.
  • 게이트 - 회로에 추가할 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 측정값을 추가할 회로에 대한 포인터입니다
  • 큐비트 - 큐비트가 측정할 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 리셋을 추가할 회로에 대한 포인터입니다
  • 큐비트 - 재설정할 큐비트( 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 이어야 합니다. 불일치가 있는 경우 동작이 정의되지 않은 것입니다.

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 배리어를 추가할 회로에 대한 포인터입니다.
  • 숫자_큐비트 - 배리어의 너비인 큐비트 수입니다.
  • 큐비트 - 배리어를 추가할 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 는 널이 아닌 유효한 포인터입니다 QkCircuit
  • matrix 초기화된 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 카운트를 가져올 회로에 대한 포인터입니다.

반품

회로 연산이 포함된 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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 총 인스트럭션 수를 가져올 회로에 대한 포인터입니다.

반품

회로의 총 명령어 수입니다.

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다. index 값은 qk_circuit_num_instructions 에서 반환한 값보다 작아야 하며, 그렇지 않으면 이 함수는 패닉 상태에 빠집니다. instructionQkCircuitInstruction 을 위한 충분한 공간을 가진 메모리 할당에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 명령어 세부 정보를 가져올 회로에 대한 포인터입니다.
  • 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 는 널이 아닌 유효한 포인터입니다 QkCircuit
  • rotation 일관성 있는 객체를 가리키는 유효하고 QkPauliProductRotationnull이 아닌 포인터입니다. 구체적으로, 및 rotation->x rotation->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 는 널이 아닌 유효한 포인터입니다 QkCircuit
  • measurement 일관성 있는 객체를 가리키는 유효하고 QkPauliProductMeasurementnull이 아닌 포인터입니다. 구체적으로, 및 measurement->x measurement->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

안전

instQkCircuitInstruction 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • inst - 무료 인스트럭션에 대한 포인터입니다.

qk_opcounts_clear

void qk_opcounts_clear(QkOpCounts *op_counts)

회로 작업 횟수 목록의 콘텐츠를 지웁니다.

안전

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

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 지연을 추가할 회로에 대한 포인터입니다.
  • 큐비트 - 지연을 적용할 큐비트의 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 = true
    • merge_wires = true
    • fold = 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 – 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);

안전

circuitQkCircuit 에 대한 유효한 널이 아닌 포인터가 아닌 경우 동작이 정의되지 않습니다.

매개변수

  • 회로 - 복사할 회로에 대한 포인터입니다.
  • vars_mode – 클래식 변수 처리 모드.
  • blocks_mode – 블록 처리 모드.

반품

복사된 회로에 대한 포인터.

qk_circuit_estimate_fidelity

double qk_circuit_estimate_fidelity(const QkCircuit *circuit, const QkTarget *target)

물리적 회로의 충실도를 추정하십시오.

이 함수는 회로 내 각 게이트의 오류율을 곱하여 회로의 충실도를 추정합니다. 이 방법은 실제 하드웨어에서의 실행 정확도를 현실적으로 시뮬레이션하기 위한 것이 아닙니다. 이 기능은 트랜스파일러가 작동 시 다양한 휴리스틱 기법을 적용했을 때의 정확도를 바탕으로, 트랜스파일러가 어떻게 작동할지 대략적으로 파악할 수 있도록 설계되었습니다. 일반적으로 이는 서로 다른 컴파일 결과물을 비교하여, 하드웨어에서 어느 쪽이 더 우수한 실행 품질을 보여줄지 추정하는 데에만 유용합니다.

안전

targetQkTarget``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.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.