QkCircuit
typedef struct QkCircuit QkCircuit量子コンピューティングの基本要素は量子回路である。 これは、量子プロセッシング・ユニット(QPU)上で一度にワンショットずつ実行できる計算ルーチンである。 回路は、あらかじめ定義された量の量子データ(Qiskitでは、量子ビットのみを直接サポートしている)に対して、ユニタリー演算(ゲート)、測定、リセットを用いて動作する。 さらに、量子回路は、QPUのコントローラによって実行されるリアルタイム計算や制御フロー構成など、古典データに対する演算を含むことができる。 QkCircuit 構造体はQiskitの量子回路データ構造への低レベルインターフェースを公開し、Qiskitの内部データモデルで定義されているものだけを公開する。 そのため、上位の Python。 QuantumCircuit クラスで利用可能な機能が欠けています。
以下は、3量子ビットのGHZ(Greenberger-Horne-Zeilinger)状態を作る量子回路の例である:
#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);安全
circuit 、 QkCircuit 、 reg 、 QkQuantumRegister への有効な非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);安全
circuit 、 QkCircuit 、 reg 、 QkClassicalRegister への有効な非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);安全
circuit が QkCircuit への有効な非 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安全
circuit が QkCircuit への有効な非 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安全
circuit が QkCircuit への有効な非 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);安全
circuit が QkCircuit への有効な非 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);安全
qubits 、 params の型は、それぞれ uint32_t 、 double の配列へのポインターであることが期待され、長さは標準ゲートの期待値と一致する。 配列の長さが十分でない場合、配列の境界外を読み込むことになるため、この関数の動作は未定義である。 指定されたゲートの量子ビットやパラメータが存在しない場合、NULLポインタになる可能性があります。 qk_gate_num_qubits と qk_gate_num_params をチェックすることで、与えられたゲートに必要な量子ビットとパラメー タの数を知ることができる。
circuit が QkCircuit への有効な非 null ポインタでない場合、動作は未定義となる。
パラメーター
- circuit - ゲートを追加する回路へのポインタ.
- gate - 回路に追加する StandardGate。
- qubits - ゲートを追加する
uint32_tqubit インデックスの配列へのポインタ.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_tqubit インデックスの配列へのポインタ.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);安全
circuit が QkCircuit への有効な非 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);安全
circuit が QkCircuit への有効な非 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 でなければならない。 不一致の場合、動作は未定義となる。
circuit が QkCircuit への有効な非 null ポインタでない場合、動作は未定義となる。
パラメーター
- circuit - バリアを追加する回路へのポインタ.
- num_qubits - バリアの幅の量子ビット数。
- qubits - バリアを追加する
uint32_tqubit インデックスの配列へのポインタ.
**リターン
終了コード。
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ポインタである。QkCircuitmatrix初期化された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);安全
circuit が QkCircuit への有効な非 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安全
circuit が QkCircuit への有効な非 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);安全
circuit が QkCircuit への有効な非 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ポインタである。QkCircuitrotationは、コヒーレントなオブジェクトへの有効な、NULLQkPauliProductRotationではないポインタである。 具体的には、データ配列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ポインタである。QkCircuitmeasurementは、コヒーレントなオブジェクトへの有効な、NULLQkPauliProductMeasurementではないポインタである。 具体的には、データ配列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安全
inst が QkCircuitInstruction への有効な非 null ポインタでない場合、動作は未定義となる。
パラメーター
- inst - 解放する命令へのポインタ。
qk_opcounts_clear
void qk_opcounts_clear(QkOpCounts *op_counts)
回路動作回数リストの内容をクリアする。
安全
op_counts が qk_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);安全
circuit が QkCircuit への有効な非 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 = truemerge_wires = truefold = 0
**リターン
回路の表現を含む、ヌル終端文字列へのポインタ。 処理が完了したら、必ず を使用して割り当てられた qk_str_free メモリを解放してください。
qk_circuit_to_dag
QkDag *qk_circuit_to_dag(const QkCircuit *circuit)
与えられた回路を有向非循環グラフ(DAG)に変換する。
新しいDAGは回路からコピーされる。元の circuit 参照は依然として呼び出し元が所有しており、解放される必要がある。 qk_circuit_free 使用が終了したら qk_dag_free 、返されたDAGを解放する必要があります。
例
QkCircuit *qc = qk_circuit_new(0, 0);
QkQuantumRegister *qr = qk_quantum_register_new(3, "qr");
qk_circuit_add_quantum_register(qc, qr);
qk_quantum_register_free(qr);
QkDag *dag = qk_circuit_to_dag(qc);
qk_dag_free(dag);
qk_circuit_free(qc);安全
circuit が QkCircuit への有効な非 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);安全
circuit が QkCircuit への有効な非 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。