Skip to main content
IBM Quantum Platform

QkCircuit

typedef struct QkCircuit QkCircuit

量子コンピューティングの基本要素は量子回路である。 これは、量子プロセッシング・ユニット(QPU)上で一度にワンショットずつ実行できる計算ルーチンである。 回路は、あらかじめ定義された量の量子データ(Qiskitでは、量子ビットのみを直接サポートしている)に対して、ユニタリー演算(ゲート)、測定、リセットを用いて動作する。 さらに、量子回路は、QPUのコントローラによって実行されるリアルタイム計算や制御フロー構成など、古典データに対する演算を含むことができる。 QkCircuit 構造体はQiskitの量子回路データ構造への低レベルインターフェースを公開し、Qiskitの内部データモデルで定義されているものだけを公開する。 そのため、上位の Python。 QuantumCircuit クラスで利用可能な機能が欠けています。

以下は、3量子ビットのGHZ(Greenberger-Horne-Zeilinger)状態を作る量子回路の例である:

ψ=(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は現在、Qiskit内部の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 *clbits

この命令が操作する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 fold

レンダリングされたテキストの折り返しを行う際の行の長さを設定します。 コンソールの幅を自動検出するには、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)

与えられた数のqubitsとclbitsで新しい回路を作る。

QkCircuit *empty = qk_circuit_new(100, 100);

パラメーター

  • num_qubits - 回路に含まれる量子ビットの数。
  • num_clbits - 回路に含まれるclbitsの数。

**リターン

作成された回路へのポインタ。

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

安全

circuitQkCircuitregQkQuantumRegister への有効な非NULLポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 回路へのポインタ.
  • reg - 量子レジスタへのポインタ.

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

安全

circuitQkCircuitregQkClassicalRegister への有効な非NULLポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 回路へのポインタ.
  • reg - クラシックレジスタへのポインタ.

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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - コピーする回路へのポインタ.

**リターン

入力 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 回路へのポインタ.

**リターン

回路が定義されている量子ビットの数。

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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 回路へのポインタ.

**リターン

回路が定義されている量子ビットの数。

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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 回路へのポインタ.

**リターン

回路内の未結合 QkParam シンボルの数。

qk_circuit_free

void qk_circuit_free(QkCircuit *circuit)

サーキットを解放する。

QkCircuit *qc = qk_circuit_new(100, 100);
qk_circuit_free(qc);

安全

circuit が NULL または QkCircuit への有効なポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 解放する回路へのポインタ.

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 の配列へのポインターであることが期待され、長さは標準ゲートの期待値と一致する。 配列の長さが十分でない場合、配列の境界外を読み込むことになるため、この関数の動作は未定義である。 指定されたゲートの量子ビットやパラメータが存在しない場合、NULLポインタになる可能性があります。 qk_gate_num_qubitsqk_gate_num_params をチェックすることで、与えられたゲートに必要な量子ビットとパラメー タの数を知ることができる。

circuitQkCircuit への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - ゲートを追加する回路へのポインタ.
  • gate - 回路に追加する StandardGate。
  • qubits - ゲートを追加する uint32_t qubit インデックスの配列へのポインタ. gate (例: QkGate_GlobalPhase )に対応する量子ビットがない場合、これはヌルポインタになる可能性がある。
  • params - ゲート・パラメータに使う double の値の配列へのポインタ. gate (例: QkGate_H )のパラメータがない場合は、NULLポインタを指定することができる。

**リターン

終了コード。

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

安全

qubits および params は、 QkParam* それぞれ の配列へのポインタであることが uint32_t 期待されます。その長さは、標準ゲートの要件を満たすものでなければなりません。 配列の長さが不十分な場合、配列の範囲外を読み取ることになるため、この関数の動作は未定義となります。 特定のゲートに対応する量子ビットやパラメータが存在しない場合、それはヌルポインタになる可能性があります。 特定のゲートに必要な量子ビット数とパラメータ数を確認するには qk_gate_num_params 、および qk_gate_num_qubits を参照してください。

が有効な、null ではない へのポインタでない circuit 場合 QkCircuit、または params 配列内のいずれかの要素が有効な、null ではない へのポインタでない場合、動作 QkParamは未定義となります。

パラメーター

  • circuit - ゲートを追加する回路へのポインタ.
  • ゲート – 回路に QkGate 追加する。
  • qubits - ゲートを追加する uint32_t qubit インデックスの配列へのポインタ. gate (例: QkGate_GlobalPhase )に対応する量子ビットがない場合、これはヌルポインタになる可能性がある。
  • params – ゲートパラメータとして使用するパラメータ QkParam* 配列へのポインタ。 パラメータがない場合(例: QkGate_H``gate )、これはヌルポインタになる可能性があります。

**リターン

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

パラメーター

  • gate - QkGate の量子ビット数を取得する。

**リターン

ゲートが作用する量子ビットの数。

qk_gate_num_params

uint32_t qk_gate_num_params(QkGate gate)

QkGate のパラメータ数を取得する。

uint32_t num_params = qk_gate_num_params(QkGate_R);

パラメーター

  • gate - 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 測定値を追加する回路へのポインタ.
  • qubit - 測定する量子ビットの uint32_t
  • clbit - 測定結果を格納する 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - リセットを追加する回路へのポインタ.
  • qubit - リセットするqubitの 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - バリアを追加する回路へのポインタ.
  • num_qubits - バリアの幅の量子ビット数。
  • qubits - バリアを追加する uint32_t qubit インデックスの配列へのポインタ.

**リターン

終了コード。

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 への有効な非NULLポインタである。 QkCircuit
  • matrix 初期化された QkComplex64``4**num_qubits 値へのアラインメントされたポインタである
  • qubits 初期化された uint32_t``num_qubits 値へのアラインメントされたポインタである

パラメーター

  • circuit - ユニタリーを追加する回路へのポインタ.
  • matrix - ユニタリー行列を表す QkComplex64 配列へのポインタ. これは、 2 ^ num_qubits x 2 ^ num_qubits の次元を持つ、行の長さを持つユニタリー行列でなければならない。 (i, j)-番目の要素は matrix[i * 2^n + j] で与えられる。 matrix の内容は、回路に追加される前にこの関数の内部でコピーされるため、呼び出し元は matrix が指す元のメモリの所有権を保持し、呼び出し後も再利用することができ、呼び出し元はそれを解放する責任がある。
  • qubits - 量子ビットインデックスの配列へのポインタ.長さは num_qubits です.
  • num_qubits - ユニタリーが作用する量子ビットの数。
  • check_input - true の場合、この関数は行列がユニタリーであるかどうかを検証します。 もし行列がユニタリーでない場合、これは未定義の動作であり、回路が破損することになります。

**リターン

終了コード。

qk_circuit_inst_unitary

void qk_circuit_inst_unitary(QkCircuit *circuit, size_t index, QkComplex64 *out)

回路内の特定の命令に対応する単位行列を書き出してください。

指定されたインデックスの命令がユニタリでない場合、エラーが発生します。

安全

以下のいずれかに違反した場合、動作は未定義となります:が QkCircuit``circuit 、への有効な(かつNULLではない)ポインタでない場合、 index が回路内の命令数に対して範囲外である場合、 QkComplex64がへの書き込み 4**num_qubits に対して有効でない out 場合。

パラメーター

  • circuit – ユニタリー演算子を取得する回路へのポインタ。
  • index – ユニタリ行列を求める命令のインデックス。
  • out – ユニタリ行列を書き込むための、割り当て済みかつ整列済みのポインタ。

qk_circuit_instruction_kind

QkOperationKind qk_circuit_instruction_kind(const QkCircuit *circuit, size_t index)

「親切な」指導を受けましょう。

安全

が への有効な(NULLではない QkCircuit )ポインタでない circuit 場合、または が回路内の命令数に対して範囲外である index 場合、動作は未定義となる。

パラメーター

  • 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - カウントを取得する回路へのポインタ.

**リターン

回路動作カウントを含む 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 総命令数を取得する回路へのポインタ.

**リターン

回路内の命令の総数。

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 への有効な非 null ポインタでない場合、動作は未定義となる。 index の値は、 qk_circuit_num_instructions が返す値より小さくなければならない。そうでない場合、この関数はパニックに陥る。 instruction が、 QkCircuitInstruction のために十分なスペースを持つメモリ割り当てへの有効な、非 NULL ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - 命令の詳細を取得する回路へのポインタ.
  • 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 への有効な非NULLポインタである。 QkCircuit
  • rotation は、コヒーレントなオブジェクトへの有効な、NULL QkPauliProductRotationではないポインタである。 具体的には、データ配列 rotation->x および rotation->z は、要素 rotation->len に対して読み取り可能でなければなりません。
  • qubits 初期化済みの uint32_t``rotation->len 値への整列ポインタです。

パラメーター

  • circuit – 演算を適用する回路。
  • rotation – 適用する QkPauliProductRotation オブジェクトへのポインタ。
  • qubits – 量子ビット配列へのポインタ。

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 への有効な非NULLポインタである。 QkCircuit
  • measurement は、コヒーレントなオブジェクトへの有効な、NULL QkPauliProductMeasurementではないポインタである。 具体的には、データ配列 measurement->x および measurement->z は、要素 measurement->len に対して読み取り可能でなければなりません。
  • qubits 初期化済みの uint32_t``rotation->len 値への整列ポインタです。

パラメーター

  • circuit – 演算を適用する回路。
  • 測定 – 適用する QkPauliProductMeasurement へのポインタ。
  • qubits – 量子ビット配列へのポインタ。
  • 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • inst - 解放する命令へのポインタ。

qk_opcounts_clear

void qk_opcounts_clear(QkOpCounts *op_counts)

回路動作回数リストの内容をクリアする。

安全

op_countsqk_circuit_count_ops によって返されたオブジェクトでない場合の動作は未定義である。

パラメーター

  • op_counts - qk_circuit_count_ops から返された op カウントリスト。

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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - ディレイを追加する回路へのポインタ.
  • qubit - 遅延を適用する量子ビットのインデックス( uint32_t ).
  • duration - 遅延時間。
  • unit - 持続時間の単位を表す列挙型。

**リターン

終了コード。

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ではないへのポインタでない circuit 場合、またはが QkCircuitNULLではなく config 、構造 QkCircuitDrawerConfig 体への無効なポインタである場合、動作は未定義となる。

パラメーター

  • circuit – 描画する回路へのポインタ。

  • 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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit – DAGを作成する回路へのポインタ。

**リターン

新しいDAGへのポインタ。

qk_circuit_copy_empty_like

QkCircuit *qk_circuit_copy_empty_like(const QkCircuit *circuit, QkVarsMode vars_mode, QkBlocksMode blocks_mode)

自身と同じ構造を持つが空のコピーを返す。

その構造には以下が含まれます:

  • グローバルフェーズ
  • すべての量子ビットと量子ビット(clbits)、レジスタを含む。

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 への有効な非 null ポインタでない場合、動作は未定義となる。

パラメーター

  • circuit - コピーする回路へのポインタ.
  • vars_mode – 古典変数の処理モード。
  • blocks_mode – ブロック処理のモード。

**リターン

コピーされた回路へのポインタ。

qk_circuit_to_python

PyObject *qk_circuit_to_python(QkCircuit *qc)

オブジェクトの QkCircuit 所有権を Python に渡す。

結果として得られる Python オブジェクトはそれ自体ではなく QuantumCircuit、その内部のオブジェクト CircuitDataであり、通常はとしてアクセスされます QuantumCircuit._data。 を使用して qk_circuit_to_python_full 、完全な QuantumCircuit オブジェクトを作成できます。

この関数を呼び出した後、ポインタ QkCircuit を使用することは安全ではありません。 特に、これを消去したり解放したりしようとしないでください。 呼び出し元は、 QkCircuitそのオブジェクトを所有していなければならず、借用した参照を保持しているだけではいけません(たとえば、から取得 QkCircuit * した qk_circuit_borrow_from_python は所有されていません)。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、初期化済みかつ所有権が保持されているへの有効な( QkCircuitNULLでない)ポインタでない circuit 場合、動作は未定義となる。

パラメーター

  • qc – 所有されているオブジェクト。

**リターン

そのオブジェクトへの Python 参照。

qk_circuit_to_python_full

PyObject *qk_circuit_to_python_full(QkCircuit *qc)

オブジェクト QkCircuit の所有権を Python に渡して、完全な QuantumCircuitを作成します。

これには、 QuantumCircuit完全な を生成するための追加の Python -空間論理が含まれます。なぜなら、 QkCircuit は内部 QuantumCircuit._data 体のみに対応するからです。

この関数を呼び出した後、ポインタ QkCircuit を使用することは安全ではありません。 特に、これを消去したり解放したりしようとしないでください。 呼び出し元は、 QkCircuitそのオブジェクトを所有していなければならず、借用した参照を保持しているだけではいけません(たとえば、から取得 QkCircuit * した qk_circuit_borrow_from_python は所有されていません)。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、初期化済みかつ所有権が保持されているへの有効な( QkCircuitNULLでない)ポインタでない circuit 場合、動作は未定義となる。

パラメーター

  • qc – 所有されているオブジェクト。

**リターン

そのオブジェクトへの Python 参照。

qk_circuit_borrow_from_python

QkCircuit *qk_circuit_borrow_from_python(PyObject *ob)

PythonQkCircuit オブジェクトからポインタを取得します。

なお、この関数への入力は *ではなく *QuantumCircuit、 の出力であることに注意 QuantumCircuit._dataしてください。 これは、正しい参照カウントのセマンティクスを確実に適用するために必要です。

これは Python への参照を取得し、その型が正しい場合、その QkCircuit ポインタを抽出します。 返されるポインタは、その ob ポインタから借用されたものです。 が PyObject 正しい型でない場合、戻り値は NULL となり、 Python インタプリタの例外状態が設定されます。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_circuit_convert_from_pythonを使用することもできます。これは論理的にはこの関数と全く同じですが、 Python コンバータ PyArg_Parse* 関数のファミリー向けの「コンバータ」関数として直接使用することができます。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、 Python オブジェクトへの有効な(NULLではない)ポインタでない ob 場合、動作は未定義となります。

パラメーター

  • ob – Python から借用したオブジェクト。

**リターン

ネイティブオブジェクトへのポインタ、あるいは NULLPython オブジェクトの型が正しくない場合。

qk_circuit_convert_from_python

int qk_circuit_convert_from_python(PyObject *object, void *address)

PythonQkCircuit オブジェクトからポインタを取得します。

なお、この関数への入力は *ではなく *QuantumCircuit、 の出力であることに注意 QuantumCircuit._dataしてください。 これは、正しい参照カウントのセマンティクスを確実に適用するために必要です。

これは Python への参照を受け取り、その QkCircuit ポインタが正しい型であれば、 addressそれをに抽出します。 返されるポインタは、その object ポインタから借用されたものです。 が正しい PyObject 型でない場合、戻り値は 0 となり、 Python インタプリタの例外状態が設定され、 address は変更されません。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_circuit_borrow_from_pythonを使用することもできます。これは論理的にはこれと全く同じですが、直接使用する際のシグネチャがより自然になっています。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が Python オブジェクトへの有効な(NULLではない)ポインタでない object 場合、またはが正しい型の書き込み可能なデータへのポインタでない address 場合、動作は未定義となります。

パラメーター

  • object – 借用された Python オブジェクト。
  • アドレス – 出力を書き込む場所。

**リターン

成功時は1、失敗時は0。

qk_quantum_register_to_python

PyObject *qk_quantum_register_to_python(QkQuantumRegister *qr)

オブジェクトの QkQuantumRegister 所有権を Python に渡す。

この関数を呼び出した後、ポインタ QkQuantumRegister を使用することは安全ではありません。 特に、これを消去したり解放したりしようとしないでください。 呼び出し元は、 QkQuantumRegisterそのオブジェクトを所有していなければならず、借用した参照を保持しているだけではいけません(たとえば、から取得 QkQuantumRegister * した qk_quantum_register_borrow_from_python は所有されていません)。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、初期化済みかつ所有権が保持されているへの有効な( QkQuantumRegisterNULLでない)ポインタでない qr 場合、動作は未定義となる。

パラメーター

  • qr – 所有されているオブジェクト。

**リターン

そのオブジェクトへの Python 参照。

qk_quantum_register_borrow_from_python

const QkQuantumRegister *qk_quantum_register_borrow_from_python(PyObject *ob)

PythonQkQuantumRegister オブジェクトからポインタを取得します。

これは Python への参照を取得し、その型が正しい場合、その QkQuantumRegister ポインタを抽出します。 返されるポインタは、その ob ポインタから借用されたものです。 が PyObject 正しい型でない場合、戻り値は NULL となり、 Python インタプリタの例外状態が設定されます。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_quantum_register_convert_from_pythonを使用することもできます。これは論理的にはこの関数と全く同じですが、 Python コンバータ PyArg_Parse* 関数のファミリー向けの「コンバータ」関数として直接使用することができます。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、 Python オブジェクトへの有効な(NULLではない)ポインタでない ob 場合、動作は未定義となります。

パラメーター

  • ob – Python から借用したオブジェクト。

**リターン

ネイティブオブジェクトへのポインタ、あるいは NULLPython オブジェクトの型が正しくない場合。

qk_quantum_register_convert_from_python

int qk_quantum_register_convert_from_python(PyObject *object, void *address)

PythonQkQuantumRegister オブジェクトからポインタを取得します。

これは Python への参照を受け取り、その QkQuantumRegister ポインタが正しい型であれば、 addressそれをに抽出します。 返されるポインタは、その object ポインタから借用されたものです。 が正しい PyObject 型でない場合、戻り値は 0 となり、 Python インタプリタの例外状態が設定され、 address は変更されません。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_quantum_register_borrow_from_pythonを使用することもできます。これは論理的にはこれと全く同じですが、直接使用する際のシグネチャがより自然になっています。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が Python オブジェクトへの有効な(NULLではない)ポインタでない object 場合、またはが正しい型の書き込み可能なデータへのポインタでない address 場合、動作は未定義となります。

パラメーター

  • object – 借用された Python オブジェクト。
  • アドレス – 出力を書き込む場所。

**リターン

成功時は1、失敗時は0。

qk_classical_register_to_python

PyObject *qk_classical_register_to_python(QkClassicalRegister *cr)

オブジェクトの QkClassicalRegister 所有権を Python に渡す。

この関数を呼び出した後、ポインタ QkClassicalRegister を使用することは安全ではありません。 特に、これを消去したり解放したりしようとしないでください。 呼び出し元は、 QkClassicalRegisterそのオブジェクトを所有していなければならず、借用した参照を保持しているだけではいけません(たとえば、から取得 QkClassicalRegister * した qk_classical_register_borrow_from_python は所有されていません)。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、初期化済みかつ所有権が保持されているへの有効な( QkClassicalRegisterNULLでない)ポインタでない cr 場合、動作は未定義となる。

パラメーター

  • cr – 所有されているオブジェクト。

**リターン

そのオブジェクトへの Python 参照。

qk_classical_register_borrow_from_python

const QkClassicalRegister *qk_classical_register_borrow_from_python(PyObject *ob)

PythonQkClassicalRegister オブジェクトからポインタを取得します。

これは Python への参照を取得し、その型が正しい場合、その QkClassicalRegister ポインタを抽出します。 返されるポインタは、その ob ポインタから借用されたものです。 が PyObject 正しい型でない場合、戻り値は NULL となり、 Python インタプリタの例外状態が設定されます。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_classical_register_convert_from_pythonを使用することもできます。これは論理的にはこの関数と全く同じですが、 Python コンバータ PyArg_Parse* 関数のファミリー向けの「コンバータ」関数として直接使用することができます。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が、 Python オブジェクトへの有効な(NULLではない)ポインタでない ob 場合、動作は未定義となります。

パラメーター

  • ob – Python から借用したオブジェクト。

**リターン

ネイティブオブジェクトへのポインタ、あるいは NULLPython オブジェクトの型が正しくない場合。

qk_classical_register_convert_from_python

int qk_classical_register_convert_from_python(PyObject *object, void *address)

PythonQkClassicalRegister オブジェクトからポインタを取得します。

これは Python への参照を受け取り、その QkClassicalRegister ポインタが正しい型であれば、 addressそれをに抽出します。 返されるポインタは、その object ポインタから借用されたものです。 が正しい PyObject 型でない場合、戻り値は 0 となり、 Python インタプリタの例外状態が設定され、 address は変更されません。

この関数を呼び出すには、 Python のインタプリタに接続されている必要があります。

また、 qk_classical_register_borrow_from_pythonを使用することもできます。これは論理的にはこれと全く同じですが、直接使用する際のシグネチャがより自然になっています。

安全

呼び出し元は、 Python のインタプリタに接続されている必要があります。 が Python オブジェクトへの有効な(NULLではない)ポインタでない object 場合、またはが正しい型の書き込み可能なデータへのポインタでない address 場合、動作は未定義となります。

パラメーター

  • object – 借用された Python オブジェクト。
  • アドレス – 出力を書き込む場所。

**リターン

成功時は1、失敗時は0。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。