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, 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

이 인스트럭션의 매개변수 수입니다.

QkCircuitInstructionView

struct QkCircuitInstructionView

명령어 QkDag 또는 QkCircuit 에 대한 비소유자 관점.

이는 와 동일한 정보를 나타내지만 QkCircuitInstruction, 모든 포인터 형식의 필드는 각각의 QkCircuit 또는 에서 차용한 데이터에 대한 원시 뷰입니다 QkDag. 기본이 되는 객체에 대한 변경이나 해제 작업이 발생하면 모든 포인터는 무효화됩니다.

데이터는 모두 할당 과정 없이 Rust의 기본 표현 형식에서 직접 가져오기 때문에, C에서 해당 데이터에 접근하는 데 여러 가지 어려움이 있습니다. 자세한 내용은 아래의 “사용 참고 사항” 섹션을 참조하십시오.

이는 일반적으로 와 qk_circuit_view_instruction 에 의해 생성됩니다 qk_dag_view_instruction.

이 구조체가 가리키는 데이터를 변경하는 것은 정의되지 않은 동작입니다.

사용 참고

이 name 필드는 일반적인 C 문자열과 달리 널 문자로 끝나지 않습니다. 또한 임의의 UTF-8 인코딩 데이터가 포함될 수도 있습니다. 이 멤버는 대부분의 C 문자열 함수와 함께 안전하게 사용할 수 없습니다. 문자열 비교를 수행하려면 를 한계값으로 name_len 설정하여 strncmp 사용하는 것을 고려해 보세요. printf-like 형식의 지정자에서 이 문자열을 사용하려면, 다음과 같이 가변 길이 지정자 형식을 사용해야 합니다

QkCircuitInstructionView view;
qk_circuit_view_instruction(qc, 0, &view);
printf("name: '%*s'\n", view.name_len, view.name);

params 필드를 순회하려면, 런타임에 qk_param_stride 를 호출하여 QkParam 필드의 너비를 확인한 다음, 포인터를 바이트 단위의 오프셋만큼 이동시켜야 합니다. 예를 들어,

QkCircuitInstructionView view;
qk_circuit_view_instruction(qc, 0, &view);
size_t el_size = qk_param_stride();
for (size_t i=0; i < view.num_params; i++) {
const QkParam *p = (const QkParam *)((const char *)view.params + i*el_size);
// ... do something with `p` ...
}

const char *name

명령어 이름을 나타내는 UTF-8 로 인코딩된 name_len 바이트. 이것은 널 종결자가 아닙니다. bounded strncmp by와 같은 함수를 사용할 때 주의해야 합니다. name_len

const uint32_t *qubits

해당 명령어가 사용하는 큐비트.

const uint32_t *clbits

해당 명령어가 사용하는 clbits.

const QkParam *params

num_params``QkParam 인스턴스의 배열. 포인터를 qk_param_stride 바이트만큼 오프셋하여 유효한 *const QkParam 인스턴스를 순회하십시오. 컴파일 타임 API에서는 의 크기가 명시되어 QkParam 있지 않으므로 일반적인 포인터 산술 연산을 사용할 수 없습니다.

size_t name_len

에 있는 널 문자로 끝나지 않은 UTF-8 문자열의 name 길이는 몇 바이트인가요?

uint32_t num_qubits

의 원소 개수는 qubits.

uint32_t num_clbits

의 원소 개수는 clbits.

size_t num_params

의 원소 개수는 params.

QkCircuitDrawerConfig

struct QkCircuitDrawerConfig

함수의 qk_circuit_draw 구성 옵션.

bool bundle_cregs

만약 true그렇다면, 고전적인 레지스터들을 단일 와이어로 묶습니다.

bool merge_wires

이 경우 true, 인접한 전선의 하단 선과 상단 선을 합칩니다.

size_t 접기

렌더링된 텍스트의 줄 바꿈 길이를 설정합니다. 0을 입력하면 콘솔 너비를 자동으로 감지합니다. 를 사용하면 줄 바꿈을 완전히 SIZE_MAX 생략할 수 있습니다.

size_t barrier_label_len

배리어 레이블에 표시할 문자 수를 설정합니다. 이 숫자를 초과할 경우, 레이블은 해당 숫자에서 잘리고 ‘…’가 뒤에 추가됩니다. 0을 사용하면 기본값인 16자이 적용됩니다.


함수

QkDelayUnit

enum QkDelayUnit

회로 지연을 나타내는 단위입니다.

값:

QkDelayUnit_S 열거자

초.

QkDelayUnit_MS 열거자

지정합니다.

QkDelayUnit_US 열거자

마이크로초.

QkDelayUnit_NS 열거자

나노초.

QkDelayUnit_PS 열거자

피코초.

열거자 QkDelayUnit_DT

Dt

열거자 QkDelayUnit_EXPR

고전적 표현

열거자 QkDelayUnit_Unknown

알 수 없음

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)

회로에 장벽을 추가합니다.

만약 가 qubits 라면 NULL, num_qubits 는 무시되고 회로 내의 모든 큐비트에 배리어가 적용된다. 이는 편의상 제공되는 기능일 뿐입니다. 여러 개의 전체 폭 배리어가 필요한 경우, 직접 올퀀핏 버퍼를 할당하여 재사용하는 것이 더 효율적입니다.

예

QkCircuit *qc = qk_circuit_new(100, 1);
uint32_t qubits[5] = {0, 1, 2, 3, 4};
qk_circuit_barrier(qc, qubits, 5);

안전

가 에 대한 유효하고 null이 아닌 포인터가 circuit 아닌 경우, 동작은 정의되지 않습니다 QkCircuit. 가 가 qubits 아니라면 NULL, 는 정렬되어 있어야 하며, 중복이 없고 회로 범위 내에 모두 포함되는 유효한 num_qubits 초기화 값들을 가리켜야 한다.

매개변수

  • 회로 - 배리어를 추가할 회로에 대한 포인터입니다.
  • 큐비트 - 배리어를 추가할 uint32_t 큐비트 인덱스 배열에 대한 포인터입니다.
  • num_qubits – 장벽의 너비를 이루는 큐비트의 수. 가 null인 qubits 경우 무시됩니다.

반품

종료 코드입니다.

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

안전

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 을 호출하여 메모리를 확보할 책임이 있습니다.

이 함수의 할당 없는 버전인 도 참조하십시오 [qk_circuit_view_instruction].

예

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_view_instruction

void qk_circuit_view_instruction(const QkCircuit *circuit, size_t index, QkCircuitInstructionView *out)

회로 내의 특정 명령에 대한 직접적인 관점을 적어보세요.

저장된 정보에 대한 자세한 내용은 [여기] QkCircuitInstructionView 를 참조하십시오. 내의 모든 포인터는 에서 차용된 QkCircuitInstructionView 것이며 circuit, 회로를 어떤 방식으로든 변경하거나 해제하면 무효화됩니다.

일반적으로 호출 스택 내에 이 뷰를 위한 공간을 할당하며, 포인터나 해당 포인터가 가리키는 데이터를 해제하거나 변경해서는 안 됩니다.

이 함수의 출력값에 대해 소유된 버전을 할당하는 함수도 [qk_circuit_get_instruction] 참조하십시오.

예

QkCircuit *qc = qk_circuit_new(1, 1);
qk_circuit_measure(qc, 0, 0);

QkCircuitInstructionView view;
qk_circuit_view_instruction(qc, 0, &view);
printf("name: '%.*s'\n", view.name_len, view.name);

이 코드는 표준 출력에 “name: ‘measure’”를 출력합니다.

안전

다음과 같은 상황에서는 동작이 정의되지 않습니다:

  • circuit 유효한 QkCircuit.을 가리키는 정렬된 포인터가 아닙니다.
  • index 회로에서 유효한 명령어 인덱스가 아닙니다.
  • out 정렬이 맞지 않거나 단일 쓰기 작업에 유효하지 않습니다.

매개변수

  • 회로 – 명령어를 가져올 회로.
  • index –. 내 명령어의 인덱스 circuit.
  • out – 결과를 기록할 메모리 [out] 위치.

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

안전

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)

회로에 지연 인스트럭션을 추가합니다.

이 함수에서는 일부 변형이 QkDelayUnit 지원되지 않습니다:

  • QkDelayUnit_DT : 반환값 QkExitCode_IncorrectDelayUnit, 대신 qk_circuit_delay_dt 를 사용하세요.
  • QkDelayUnit_EXPR : 반환값 QkExitCode_IncorrectDelayUnit. 지연 시간 삽입에는 지원되지 않습니다.
  • QkDelayUnit_Unknown : 잘못된 입력입니다. QkExitCode_CInputError.를 반환합니다.

예

QkCircuit *qc = qk_circuit_new(1, 0);
qk_circuit_delay(qc, 0, 100.0, QkDelayUnit_NS);

안전

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

매개변수

  • 회로 - 지연을 추가할 회로에 대한 포인터입니다.
  • 큐비트 - 지연을 적용할 큐비트의 uint32_t 인덱스입니다.
  • 기간 - 지연 기간입니다.
  • 단위 - 기간의 단위를 나타내는 열거형입니다.

반품

종료 코드입니다.

qk_circuit_delay_dt

QkExitCode qk_circuit_delay_dt(QkCircuit *circuit, uint32_t qubit, int64_t duration)

회로에 dt 단위의 지속 시간을 갖는 지연 명령어를 추가하십시오.

모든 지속 시간의 경우와 마찬가지로, 이 값은 양수여야 합니다. 그렇지 않으면, 이 함수는 입력 오류와 함께 반환됩니다.

예

QkCircuit *qc = qk_circuit_new(1, 0);
qk_circuit_delay_dt(qc, 0, 100);

안전

circuit 가 이거나 NULL 정렬되지 않은 경우, 동작은 정의되지 않습니다.

매개변수

  • 회로 - 지연을 추가할 회로에 대한 포인터입니다.
  • 큐비트 - 지연을 적용할 큐비트의 uint32_t 인덱스입니다.
  • 지속 시간 – 지연 시간(정수 값).

반품

종료 코드. 지속 시간이 음수인 경우, 를 반환합니다 ExitCode_CInputError.

qk_circuit_delay_unit

QkDelayUnit qk_circuit_delay_unit(const QkCircuit *circuit, size_t index)

지연 명령어의 지속 시간 단위를 가져옵니다.

사용자는 qk_circuit_instruction_kind.을 사용하여 여기서 호출되는 명령어가 지연 명령어인지 확인해야 합니다.

예

QkCircuit *qc = qk_circuit_new(1, 0);
qk_circuit_delay_dt(qc, 0, 100);
QkDelayUnit unit = qk_circuit_delay_unit(qc, 0);

안전

circuit 가 이거나 NULL, 정렬되지 circuit 않았거나, 범위를 벗어난 index 경우, 동작은 정의되지 않습니다.

매개변수

  • 회로 - 지연을 추가할 회로에 대한 포인터입니다.
  • index – 지연 시간 세부 정보를 가져올 명령어 인덱스. 인덱스가 유효 범위 내에 있지 않으면 정의되지 않은 동작이 발생할 수 있습니다. 회로의 현재 길이를 확인하려면 qk_circuit_num_instructions 를 사용해 주세요.

반품

지연의 시간 단위.

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, 16};

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
    • barrier_label_len = 16

반품

회로 표현이 포함된 널 종료 문자열을 가리키는 포인터. 작업이 끝나면 할당된 메모리를 해제하려면 를 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);

안전

가 null이 아니거나 함수에서 반환된 유효한 포인터가 아닐 cf_inst 경우 qk_circuit_get_control_flow_instruction, 또는 동일한 포인터에 대해 이 함수가 두 번 이상 호출된 경우, 동작이 정의되지 않습니다.

매개변수

  • cf_inst – 해제할 제어 흐름 명령어를 가리키는 포인터.

qk_circuit_custom_operation

QkExitCode qk_circuit_custom_operation(QkCircuit *circuit, QkCustomOp *operation, const uint32_t *qubits, const uint32_t *clbits, QkParam **params)

회로에 QkCustomOp 를 추가합니다. 프로세스 내에서 인스턴스를 소진하고 있습니다.

이 항목의 추가 여부는 그 타당성에 따라 결정되며 QkCustomOp , 거부될 수도 있습니다. 생성 과정에서 오류가 발생하거나 해당 연산이 유효하지 않은 입력을 수신하여 연산의 vtable이 null 포인터를 가리키는 경우 qk_custom_operation_vtable_new, 해당 연산은 거부되며 예기치 않은 null 포인터로 인해 가 반환됩니다 ExitCode .

안전

qubits, clbits, 및 params 유형은 각각 uint32_t (의 qubits경우 clbits) 또는 QkParam (의 경우 params)의 배열을 가리키는 포인터여야 하며, 이 배열의 길이는 표준 연산에 대한 기대값과 일치해야 합니다. 배열의 길이가 충분하지 않은 경우, 이 함수는 배열의 범위를 벗어난 영역을 읽게 되므로 동작이 정의되지 않습니다. 주어진 연산에 대한 큐비트나 매개변수가 없는 경우, 이 값은 null 포인터가 될 수 있습니다.

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

매개변수

  • circuit – circuit 객체를 가리키는 포인터입니다.
  • 연산 – 객체 QkCustomOp .
  • 큐비트 – 연산을 적용할 큐비트 uint32_t 인덱스 배열을 가리키는 포인터입니다. ( operation 예를 들어 QkGate_GlobalPhase)와 같이 큐비트가 없는 경우, 이는 null 포인터가 될 수 있습니다.
  • clbits – 연산을 적용할 uint32_t 큐비트 인덱스 배열을 가리키는 포인터. ( operation 예를 들어 QkGate_GlobalPhase)와 같이 큐비트가 없는 경우, 이는 null 포인터가 될 수 있습니다.
  • params – 연산 매개변수로 사용할 QkParam 값들의 배열을 가리키는 포인터입니다. ( operation 예: QkGate_H)와 같이 매개변수가 없는 경우, 이는 null 포인터가 될 수 있습니다.

반품

ExitCode.

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에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.