Skip to main content
IBM Quantum Platform

QkCustomOp

typedef struct QkCustomOp QkCustomOp

C 언어로 정의된 연산의 표현.

이 연산 객체는 객체가 QkCircuit.에 대한 연산을 수행하기 위해 준수해야 하는 최소한의 기능을 포함하고 있습니다.

을 사용하여 구현할 수 있는 모든 객체는 회로에 추가되도록 동적으로 디스패치됩니다 QkCustomOp . 다시 말해, 이 회로는 자신이 받아들이는 객체의 유형을 인식하지 못하지만, 해당 객체가 어떤 연산에서든 기대되는 기능을 갖추고 있는 한 정상적으로 작동합니다.

이를 위해, 각 연산은 다음 두 부분으로 정의됩니다. - 연산 구조체에 대한 원본 포인터. - 이 연산의 기능을 정의하는 함수 슬롯이 포함된 vtable에 대한 포인터. 자세한 내용은 qk_custom_op_vtable_new()의 내용을 참조하십시오.

다음은 그 모습이 어떻게 보이는지에 대한 간단한 예시입니다:

// Define an operation with a single attribute.
struct foo_gate {
   uint32_t num_qubits;
};
// Represents the name of the operation.
const char *FOO_NAME = "foo";
// Design the required methods for the vtable.
const char *foo_name(const void *gate) {
   // Cast void to original pointer.
   struct foo_gate *_self = (struct foo_gate *)gate;
   // Cast once more to consume it
   (void)_self;
   return FOO_NAME;
}
uint32_t foo_num_qubits(const void *gate) {
   struct foo_gate *self = (struct foo_gate *)gate;
   // Used stored attirbute as return value.
   return self->num_qubits;
}
// Use same logic below for required methods that have
// fixed values.
uint32_t foo_num_clbits(const void *gate) {
   struct foo_gate *_self = (struct foo_gate *)gate;
   (void)_self;
   return 0;
}
// Implement all required methods.
// Build list of entries for the vtable (at least 7 required entries)
QkCustomOpVtableEntry entries[7] = {
   {.slot = 0, .func = foo_name},
   {.slot = 1, .func = foo_num_qubits},
   {.slot = 2, .func = foo_num_clbits},
   // ...
   // End with sentinel value
   {.slot = -1, .func = NULL},
};
// Create a vtable
QkCustomOpVtable *foo_vtable = qk_custom_op_vtable_new(entries);
// Declare a sample instance
struct foo_gate foo_3q = {
   .num_qubits = 3,
};
// Create the custom operation
QkCustomOp *foo_3q_custom = qk_custom_op_new(&foo_3q, foo_vtable);
// Add to a circuit
QkCircuit *circuit = qk_circuit_new(3, 0);
uint32_t qubits[3] = {0, 1, 2};
qk_circuit_custom_operation(circuit, foo_3q_custom, qubits, NULL, NULL);

데이터 유형.

QkCustomOpSlot

enum QkCustomOpSlot

C 도메인에서 오는 QkCustomOp 의 Vtable 인덱스를 나타냅니다.

각 명명된 인덱스는 Rust의 및 Operation CustomOperation 트레이트에 포함된 필수 /opt ional 메서드를 나타냅니다.

값:

열거자 QkCustomOpSlot_Name

열거자 QkCustomOpSlot_NumQubits

열거자 QkCustomOpSlot_NumClbits

열거자 QkCustomOpSlot_NumParams

열거자 QkCustomOpSlot_Directive

열거자 QkCustomOpSlot_IsUnitary

열거자 QkCustomOpSlot_NumCtrlQubits

열거자 QkCustomOpSlot_Label

열거자 QkCustomOpSlot_Definition

열거자 QkCustomOpSlot_Eq

열거자 QkCustomOpSlot_Clone

열거자 QkCustomOpSlot_Delete


함수

qk_custom_operation_new

QkCustomOp *qk_custom_operation_new(void *operation, const QkCustomOpVtable *v_table)

C 언어로 완전히 정의된 양자 연산을 기반으로 QkCustomOp 한 를 구축합니다.

다음은 그 모습이 어떻게 보이는지에 대한 간단한 예시입니다:

// Define an operation with a single attribute.
struct foo_gate {
    uint32_t num_qubits;
}

// Implement all required methods
uint32_t foo_num_qubits(const void *gate) {
struct foo_gate *self = (struct foo_gate *)gate;
// Used stored attirbute as return value.
return self->num_qubits;
}

// Build list of entries for the vtable (at least 7 required entries)
QkVtableEntry entries[7] = {
    {.slot = QkCustomOpSlot_NumQubits, .func = foo_num_qubits},
// ...
// End with sentinel value
    {.slot = -1, .func = NULL},
};

// Create a vtable
QkCustomOpVtable *foo_vtable = qk_custom_operation_vtable_new(entries);

// Declare a sample instance
struct foo_gate foo_3q = {
    .num_qubits = 3,
};

// Create the custom operation
QkCustomOp foo_3q_custom = qk_custom_operation_new(&foo_3q, foo_vtable);

안전

operation struct에 포함된 데이터가 다음을 수행할 수 있도록 보장하는 것은 구현자의 책임입니다:

  • 여러 스레드가 동시에 안전하게 액세스할 수 있어야 합니다.
  • 레이스 조건을 유발하지 않으면서 다른 스레드에 의해 변경 불가능한 상태로 차용될 수 있어야 한다.
  • 운영 기간 내내 보존되어야 한다.

지정된 v_table 포인터가 null이거나 정렬되지 않은 경우 동작이 정의되지 않습니다.

이러한 조건을 준수하지 않을 경우, 정의되지 않은 동작이 발생할 수 있습니다.

매개변수

  • 작업 – 작업 구조체에 대한 소유 포인터.
  • v_table – struct가 operation 가리키는 데이터와 함께 작동하도록 올바르게 구성된 v_table에 대한 포인터입니다.

리턴

.을 가리키는 포인터 QkCustomOp.

qk_custom_operation_free

void qk_custom_operation_free(QkCustomOp *data)

소유 중인 :c:typeQkCustomOp:을 해제합니다.

일반적으로 이 메서드를 호출할 필요는 없습니다. :c:func:qk_circuit_custom_operation 가 해당 객체의 소유권을 가져가기 때문입니다.

이 함수는 가 주어지면 아무 작업도 수행하지 않습니다 NULL.

안전

data 가 null이 아니거나 :c:type:QkCustomOp에 대한 유효한 소유 포인터가 아닌 경우, 해당 동작은 정의되지 않습니다.

매개변수

  • data – 해제할 데이터에 대한 소유 포인터.

qk_custom_operation_vtable_new

const QkCustomOpVtable *qk_custom_operation_vtable_new(const QkVtableEntry *slots)

의 인스턴스 QkVtableEntry 목록을 기반으로 QkCustomOpVtable 를 생성합니다.

vtable은 인덱스와 올바른 인자 및 반환 유형을 가진 함수에 대한 포인터를 포함하는 슬롯들의 모음으로 구성됩니다.

올바른 슬롯을 확인하려면 다음 표를 참조하십시오.

슬롯
인수(들)의 유형
리턴 유형
색인
필수
기본값
nameconst void *char *QkCustomOpSlot_Name예해당사항 없음
num_qubitsconst void *uint32_tQkCustomOpSlot_NumQubits예해당사항 없음
num_clbitsconst void *uint32_tQkCustomOpSlot_NumClbits아니오0
num_paramsconst void *uint32_tQkCustomOpSlot_NumParams아니오0
directiveconst void *boolQkCustomOpSlot_Directive아니오false
is_unitaryconst void *boolQkCustomOpSlot_IsUnitary아니오true
num_ctrl_qubitsconst void *uint32_tQkCustomOpSlot_NumCtrlQubits아니오0
labelconst void *char *QkCustomOpSlot_Label아니오NULL
definitionconst void *, QkParam **QkCircuit *QkCustomOpSlot_Definition아니오NULL
eqconst void *, const void *boolQkCustomOpSlot_Eq아니오포인터 비교
cloneconst void *void *QkCustomOpSlot_Clone아니오포인터 별칭
deletevoid *voidQkCustomOpSlot_Delete아니오무연산

각 함수는 Rust에서 void 포인터로 인식되며, 올바른 시그니처를 가진 함수 포인터로 변환됩니다.

필수 슬롯을 수신하지 못하면 vtable이 생성되지 않으며, 이 함수는 NULL 포인터를 반환합니다. 선택적 슬롯이 포함되지 않더라도 vtable은 여전히 생성되며, 해당 슬롯들은 해당 메서드의 기본 구현체로 연결됩니다.

슬롯에 유효한 인덱스(센티넬 값 제외)가 없는 경우, 제공된 함수 포인터는 무시됩니다. 이를 통해 위 차트에서 필수 메서드가 아닌 메서드가 추가되거나 제거되더라도 프로그램이 여전히 문제없이 실행될 수 있도록 보장합니다.

모든 슬롯 목록은 끝에 QkVtableEntry 값이 지정된 센티넬로 구분되어야 합니다. 센티넬은 다음과 같이 표시되어야 합니다:

QkVtableEntry sentinel = {.slot = -1, .func = NULL};

이 함수는 센티넬이 발견된 후부터 뒤따르는 모든 슬롯의 읽기를 중단합니다.

안전

구분용 센티넬 값이 없는 항목 목록이 제공될 경우, 동작은 정의되지 않습니다.

전환 과정에서 전달된 함수 포인터의 시그니처가 올바르지 않은 경우, 정의되지 않은 동작이 발생할 수도 있습니다.

매개변수

  • slots – 센티넬 값을 가진 항목으로 구분된 항목 목록에 대한 포인터.

리턴

생성된 vtable에 대한 포인터이거나, 필요한 항목이 누락된 경우에는 null 포인터입니다.

qk_custom_operation_vtable_free

void qk_custom_operation_vtable_free(const QkCustomOpVtable *v_table)

QkCustomOpVtable 포인터를 해제합니다

안전

가 이거나 NULL , 에 대한 정렬되지 않은 유효하지 않은 포인터인 v_table 경우 정의되지 않은 동작이 발생할 수 있습니다 QkCustomOpVtable.

매개변수

  • v_table – QkCustomOpVtable 객체에 대한 포인터.
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.