QuantumCircuit クラス
class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
ベース: object
量子回路のコアQiskit表現。
詳細は QuantumCircuit パッケージの他の部分とどのように組み合わされているのか、またQiskitにおける量子回路記述のさまざまな領域について、モジュールレベルのドキュメントを参照してください。 qiskit パッケージとの関係、Qiskitにおける量子回路記述のさまざまな領域については、モジュールレベルのドキュメント qiskit.circuit.
例:
from qiskit import QuantumCircuit
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0, 1)
# Return a text drawing of the circuit.
qc.draw() ┌───┐
q_0: ┤ H ├──■──
└───┘┌─┴─┐
q_1: ─────┤ X ├
└───┘回路属性
QuantumCircuit には少数のパブリック属性があるが、そのほとんどは古い機能である。 その機能のほとんどはメソッドを通じてアクセスされる。
ごく一握りの属性は意図的に変更可能であり、残りは不変とみなされるべきデータ属性である。
変更可能な属性 | サマリー |
|---|---|
global_phase | ラジアン単位で測定される回路のグローバル位相。 |
metadata | Qiskitがトランスパイラを通して保持するが、それ以外は完全に無視する任意のユーザーマッピング。 |
name | 回路のオプションの文字列名。 |
不変のデータ属性 | サマリー |
|---|---|
ancillas | のリスト AncillaQubit回路によって追跡される |
cregs | のリスト ClassicalRegister回路によって追跡される |
clbits | のリスト Clbit回路によって追跡される |
data | 回路を構成する CircuitInstruction回路を構成する個々のリスト。 |
_data | Python - C API QkCircuit オブジェクトへのスペースハンドル。 |
duration | トランスパイラのパスをスケジューリングすることによって追加される回路の合計時間。 この属性は非推奨である。 estimate_duration() を代わりに使うべきである。 |
layout | トランスパイラによって追加されたハードウェアレイアウトと配線情報。 |
num_ancillas | 回路内のアンシラ量子ビットの数。 |
num_clbits | 回路のビット数。 |
num_captured_vars | 捕捉されたリアルタイムのクラシック変数の数。 |
num_captured_stretches | キャプチャされたストレッチの数。 |
num_declared_vars | 外側の回路スコープでローカルに宣言されたリアルタイム・クラシック変数の数。 |
num_declared_stretches | 外回りのスコープでローカルに宣言されたストレッチの数。 |
num_input_vars | 入力されるリアルタイム・クラシック変数の数。 |
num_parameters | コンパイル時 Parameterの数。 |
num_qubits | 回路内の量子ビット数。 |
num_vars | 外側回路スコープ内のリアルタイム古典変数の総数。 |
num_stretches | 外回りのスコープにおけるストレッチの総数。 |
num_identifiers | 外回りの変数とストレッチの総数。 |
op_start_times | トランスパイラ・パスのスケジューリングによって追加される、スケジュールされたオペレーションの開始時刻。 |
parameters | コンパイル時 Parameter回路によって追跡される |
qregs | のリスト QuantumRegister回路によって追跡される |
qubits | のリスト Qubit回路によって追跡される |
unit | フィールドの単位。 duration フィールドの |
中核となる属性は です data。 これは、順序付けられた形式で含まれる s CircuitInstructionを公開する、シーケンスのようなオブジェクトです。 通常、このオブジェクトを直接変更すべきではありません。 QuantumCircuit これは追記専用操作のみを想定して設計されています(その場合は を使用してください append())。 回路をその場で変更する操作のほとんどは、トランスパイラ・パス (qiskit.transpiler) として記述する必要があります。C API は、内部オブジェクトである とやり取りしますが _data、これは、C API 呼び出しに渡すハンドルとして使用される場合を除き、 Python の公開 API の一部ではありません。
data
回路データ(命令とコンテキスト)。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2)
qc.measure([0], [1])
print(qc.data)[CircuitInstruction(operation=Instruction(name='measure', num_qubits=1,
num_clbits=1, params=[]), qubits=(Qubit(QuantumRegister(2, 'q'), 0),),
clbits=(Clbit(ClassicalRegister(2, 'c'), 1),))]戻り値
回路内の CircuitInstruction インスタンスを含むリスト状のオブジェクト。
と並んで dataと並んで global_phase を記述するために回路が使用される場合、回路の出力に何らかの影響を与える可能性がある。 Gate 制御されることがある。 これはラジアン単位で、直接設定できる。
global_phase
ラジアン単位の電流回路スコープのグローバル位相。
例
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)0.0from numpy import pi
circuit.global_phase = pi/4
print(circuit.global_phase)0.7853981633974483回路の name の名前になります。 Instruction または Gate から生じる to_instruction() と to_gate() の呼び出しの名前になります。
name
タイプ: str
人間が読める回路名。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)my_circuit回路に任意の metadata を付けることができます。 Qiskitのコアのどの部分も、これを検査したり、メタデータに基づいて動作を変えたりしませんが、トランスパイラを通して忠実に渡されるので、回路に自分でタグを付けることができます。 QPYで回路をシリアライズする場合( qiskit.qpyを参照)、メタデータはJSONシリアライズされ、その中でJSON互換性のないオブジェクトを扱うためにカスタムシリアライザを渡す必要があるかもしれません。 qpy.dump() を参照)。 このフィールドは、 OpenQASM 2または3へのエクスポート時には無視される。
metadata
回路のメタデータのユーザー定義辞書。
Qiskitはこのマッピングの内容を調べませんが、トランスパイラを通過させて出力に再アタッチするので、独自のメタデータを追跡することができます。
例
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})
print(qc.metadata){'experiment_type': 'Bell state experiment'}QuantumCircuit は、内部の量子ビットと古典ビット、レジスタを追跡するデータ属性を公開する。 これらは Python として表示されます listしかし、それらは不変として扱うべきです。変更してもせいぜい何の効果もなく、むしろシステムの内部データが壊れるだけでしょう。 QuantumCircuit。
qregs
のリスト。 Qubitを追加された順に並べたもの。 変異させてはいけない。
cregs
のリスト。 Clbitを追加された順に並べたもの。 変異させてはいけない。
qubits
のリスト。 Qubitを追加された順に並べたもの。 変異させてはいけない。
ancillas
のリスト。 AncillaQubitを追加された順に並べたもの。 変異させてはいけない。
clbits
のリスト。 Clbitを追加された順に並べたもの。 変異させてはいけない。
例
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qr1 = QuantumRegister(2)
qr2 = QuantumRegister(1)
cr1 = ClassicalRegister(2)
cr2 = ClassicalRegister(1)
qc = QuantumCircuit(qr1, qr2, cr1, cr2)
print("List the qubits in this circuit:", qc.qubits)
print("List the classical bits in this circuit:", qc.clbits)List the qubits in this circuit: [Qubit(QuantumRegister(2, 'q0'), 0),
Qubit(QuantumRegister(2, 'q0'), 1), Qubit(QuantumRegister(1, 'q1'), 0)]
List the classical bits in this circuit: [Clbit(ClassicalRegister(2, 'c0'), 0),
Clbit(ClassicalRegister(2, 'c0'), 1), Clbit(ClassicalRegister(1, 'c1'), 0)]回路上の命令に存在するコンパイル時のパラメータは parameters. の場合を除き、ほとんどレキシカルである)。 ParameterVectorのリスト形式を使うときのパラメーターの順番と同じである。 assign_parameters()また set-をサポートしています。
parameters
回路で定義されたパラメータ。
この属性は Parameter オブジェクトをアルファベット順にソートして返します。 でインスタンス化されたパラメータは ParameterVector でインスタンス化されたパラメータは依然として数値でソートされることに注意。
例
以下のスニペットは、パラメーターの挿入順序は問題ではないことを示している。
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
>>> circuit = QuantumCircuit(1)
>>> circuit.rx(b, 0)
>>> circuit.rz(elephant, 0)
>>> circuit.ry(a, 0)
>>> circuit.parameters # sorted alphabetically!
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])アルファベット順の並べ替えは、数字に関しては直感的でない可能性があることに留意してほしい。 アルファベット順に並べると、"10 "は "2 "の前に来る。
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
>>> circuit = QuantumCircuit(1)
>>> circuit.u(*angles, 0)
>>> circuit.draw()
┌─────────────────────────────┐
q: ┤ U(angle_1,angle_2,angle_10) ├
└─────────────────────────────┘
>>> circuit.parameters
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])数値ソートを尊重するには ParameterVector が使える。
>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
>>> x = ParameterVector("x", 12)
>>> circuit = QuantumCircuit(1)
>>> for x_i in x:
... circuit.rx(x_i, 0)
>>> circuit.parameters
ParameterView([
ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
..., ParameterVectorElement(x[11])
])戻り値
ソートされた Parameter オブジェクトをソートする。
回路をトランスパイルして物理回路を作成した場合、トランスパイラが保存している layout 属性で、トランスパイラが保存している、ソース回路の仮想量子ビットが物理回路のハードウェア量子ビットにどのようにマッピングされるかについての情報を、回路の開始時と終了時の両方で調べることができます。
layout
回路に関連するレイアウト情報を返す。
この属性には、オプションの TranspileLayout オブジェクトが含まれます。 これは通常 transpile() または PassManager.run() の出力に設定され、転置によって入力回路に生じた順列に関する情報を保持する。
によって引き起こされる順列には2種類あります。 transpile() 関数によって引き起こされる順列には2種類あります。 Targetで選択された物理量子ビットに基づいて量子ビットを並べ替える初期レイアウトと SwapGateによって引き起こされる出力順列です。
例
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
# Create circuit to test transpiler on
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.swap(1, 2)
qc.cx(0, 1)
# Add measurements to the circuit
qc.measure([0, 1, 2], [0, 1, 2])
# Specify the QPU to target
backend = GenericBackendV2(3)
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled = pass_manager.run(qc)
# Print the layout after transpilation
print(transpiled.layout.routing_permutation())[0, 1, 2]回路がトランスパレーションの一部としてもスケジューリングされている場合、各命令の個々のタイミングと回路の合計が表示されます。 duration を表示します。
duration
スケジューリング・トランスパイラのパスによって設定される回路の合計時間。 その単位は unit.
プロパティ qiskit.circuit.quantumcircuit.QuantumCircuit.duration は Qiskit 1.3.0 で非推奨となりました。 Qiskit 3.0.0 で削除されます。
unit
単位 duration で指定される。
プロパティ qiskit.circuit.quantumcircuit.QuantumCircuit.unit は Qiskit 1.3.0 で非推奨となりました。 Qiskit 3.0.0 で削除されます。
op_start_times
運転開始時間のリストを返す。
この属性は、スケジュールされた回路内の演算の推定開始時間を計算し、制御フローや他の古典的なフィードフォワード演算を持たない単純な回路に対してのみ機能する。
この属性は、スケジューリング解析パスの1つが量子回路上で実行されると有効になる。
例
from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
# Print the original circuit
print("Original circuit:")
print(qc)
# Transpile the circuit with a specific basis gates list and print the resulting circuit
backend = GenericBackendV2(2, basis_gates=['u1', 'u2', 'u3', 'cx'])
pm = generate_preset_pass_manager(
optimization_level=1, backend=backend, scheduling_method="alap"
)
transpiled_qc = pm.run(qc)
print("Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:")
print(transpiled_qc)
# Print the start times of each instruction in the transpiled circuit
print("Start times of instructions in the transpiled circuit:")
for instruction, start_time in zip(transpiled_qc.data, transpiled_qc.op_start_times):
print(f"{instruction.operation.name}: {start_time}")Original circuit:
┌───┐ ░ ┌─┐
q_0: ┤ H ├──■───░─┤M├───
└───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
└───┘ ░ ║ └╥┘
meas: 2/══════════════╩══╩═
0 1
Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:
┌─────────┐ ░ ┌─────────────────┐┌─┐
q_0 -> 0 ───┤ U2(0,π) ├──────■───░─┤ Delay(1255[dt]) ├┤M├
┌──┴─────────┴───┐┌─┴─┐ ░ └───────┬─┬───────┘└╥┘
q_1 -> 1 ┤ Delay(196[dt]) ├┤ X ├─░─────────┤M├─────────╫─
└────────────────┘└───┘ ░ └╥┘ ║
meas: 2/═══════════════════════════════════╩══════════╩═
1 0
Start times of instructions in the transpiled circuit:
u2: 0
delay: 0
cx: 196
barrier: 2098
delay: 2098
measure: 3353
measure: 2098戻り値
命令の開始予定時刻を表す整数のリスト。 の命令のインデックスに対応する。 QuantumCircuit.data.
レイズ
AttributeError - サーキットが予定されていない場合。
最後に QuantumCircuit は、いくつかの単純なプロパティを動的な読み取り専用の数値属性として公開している。
num_ancillas
アンシラ量子ビットの数を返す。
例
from qiskit import QuantumCircuit, QuantumRegister, AncillaRegister
# Create a 2-qubit quantum circuit
reg = QuantumRegister(2)
qc = QuantumCircuit(reg)
# Create an ancilla register with 1 qubit
anc = AncillaRegister(1)
qc.add_register(anc) # Add the ancilla register to the circuit
print("Number of ancilla qubits:", qc.num_ancillas)Number of ancilla qubits: 1num_clbits
クラシックビットの数を返す。
例
from qiskit import QuantumCircuit
# Create a new circuit with two qubits and one classical bit
qc = QuantumCircuit(2, 1)
print("Number of classical bits:", qc.num_clbits)Number of classical bits: 1num_captured_vars
スコープからキャプチャされたものとしてマークされた回路内のリアルタイム古典変数の数。
これは iter_captured_vars() の長さである。 これがゼロでない場合 num_input_vars はゼロでなければならない。
num_captured_stretches
スコープからキャプチャされたとしてマークされた回路内のストレッチの数。
これは iter_captured_stretches() の長さである。 これがゼロでない場合 num_input_vars はゼロでなければならない。
num_declared_vars
入力またはキャプチャを除く、この回路スコープで宣言されている回路内のリアルタイム・クラシック変数の数。
これは iter_declared_vars() の長さである。
num_declared_stretches
キャプチャを除く、この回路スコープで宣言されている回路のストレッチの数。
これは iter_declared_stretches() の長さである。
num_input_vars
回路入力としてマークされた回路内のリアルタイム古典変数の数。
これは iter_input_vars() の長さである。 これがゼロでない場合 num_captured_vars はゼロでなければならない。
num_identifiers
回路内のリアルタイム古典変数とストレッチの数。
これは以下と等しい。 num_vars() + num_stretches().
num_parameters
回路内のパラメータオブジェクトの数。
num_qubits
量子ビット数を返す。
num_stretches
回路内のストレッチの数。
これは iter_stretches() の長さである。
num_vars
回路内のリアルタイム古典変数の数。
これは iter_vars() の長さである。
新しい回路の作成
メソッド | サマリー |
|---|---|
__init__() | 命令なし回路のデフォルトコンストラクタ。 |
copy() | 既存の回路を完全にコピーする。 |
copy_empty_like() | ある回路から新しい回路へ、何の指示もなしにデータオブジェクトをコピーする。 |
from_instructions() | 命令のリストから必要なデータオブジェクトを推測する。 |
from_qasm_file() | レガシー・インターフェース qasm2.load(). |
from_qasm_str() | レガシー・インターフェース qasm2.loads(). |
デフォルトのコンストラクタ(QuantumCircuit(...))は、初期命令のない回路を生成する。 デフォルトコンストラクタの引数は、量子および古典データストレージを回路にシードし、名前、グローバル位相、および任意のメタデータを提供するために使用することができます。 これらのフィールドはすべて、後で拡張することができる。
__init__
__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())
のデフォルトコンストラクタです。 QuantumCircuit.
パラメーター
-
regs (Register |int |Sequence[Bit]) –
回路に含まれるレジスタ。
-
オブジェクトのリストが
RegisterオブジェクトのリストはQuantumRegisterまたはClassicalRegisterオブジェクトを表します。例:
QuantumCircuit(QuantumRegister(4))QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
-
intのリストの場合、回路に含める量子ビットおよび/または古典ビットの量。 量子ビットの数だけを表す1つのintか、量子ビットと古典ビットの数をそれぞれ表す2つのintを指定することができる。例:
QuantumCircuit(4) # A QuantumCircuit with 4 qubitsQuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
-
-
name (str | None) – 量子回路の名前。 設定されていない場合は、自動生成された文字列が割り当てられる。
-
global_phase (ParameterExpression |float) – 回路のグローバル位相(ラジアン単位)
-
metadata (dict | None) – 回路に関連付ける任意のキー・バリューのメタデータ。 これは、自由形式のデータとして
metadata属性に格納される。 回路に直接使用されることはない。 -
inputs (Iterable[Var]) – この回路で実行時
input変数として宣言する変数はありますか。 これらは、すでに別の場所から作成済みのexpr.Varノードであるはずです。入力も作成する必要がある場合は、. を使用してくださいQuantumCircuit.add_input()。 この引数で指定された変数は、直接 に渡されますadd_input()。 ある回路において、とがinputs同時に成立することはcapturesない。 -
captures (Iterable[Var |Stretch]) – この回路スコープが、包含するスコープから取得すべき変数。 ここで指定された変数は、直接 に渡されます
add_capture()。 ある回路において、とがinputs同時に成立することはcapturesない。 -
declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –
この回路が宣言し、すぐに初期化すべき変数。 この入力を順番に並べることで、後の宣言が前の宣言(入力やキャプチャを含む)に依存するようにできる。 実行時に後で計算される値に依存する必要がある場合は、回路実行の適切な時点で
add_var()を使用します。この引数は、すでに作成された変数のセットを持っている場合に、回路の初期化を便利に行うためのものである。 ここで使用する変数は、直接
add_var()に直接渡される。
レイズ
- CircuitError - もし回路名が与えられていれば、それが有効でない場合。
- CircuitError -
inputsとcapturesの両方が与えられた場合。
既存の回路をお持ちの場合は、そのコピーを copy()を使ってそのコピーを作ることができる。 これは、部分的な回路を残しながら別の回路を拡張したい場合や、前の回路はそのままに、インプレースで変異させることができるバージョンを持ちたい場合に便利である。
copy
copy(name=None)
回路をコピーする。
パラメーター
name (str) – コピーされた回路に与えられる名前。 Noneの場合、名前はそのまま。
戻り値
現在の回路のディープコピー
戻りの型
同様に、同じデータオブジェクト(ビット、レジスタ、変数など)をすべて含み、命令を一切含まない回路を作成したい場合は、 copy_empty_like(). を使用できます。 回路の新しい層を構築して、 compose()それを裏面に転写したり、回路の指令を完全に書き換えたりする場合、これはよくあることです。
copy_empty_like
copy_empty_like(name=None, *, vars_mode='alike')
同じ構造を持つが空のselfのコピーを返す。
その構造には以下のようなものがある:
- 名前とその他のメタデータ
- グローバルフェーズ
- レジスタを含むすべてのqubitsとclbits
varsキーワード引数に従って処理される。
回路にローカル変数の宣言(回路コンストラクタの引数 declarations によって追加されたもの、または add_var()を使用して追加されたもの)が含まれている場合、それらは出力回路で初期化されていない可能性があります。 店舗指示を手動で追加する必要があります ( Store と QuantumCircuit.store()を参照)を追加して初期化する必要がある。
パラメーター
-
name (str | None) – コピーした回路の名前。 Noneの場合、名前はそのまま。
-
vars_mode (Literal['alike', 'captures', 'drop']) –
リアルタイム変数を扱うモード。
同じ
出力回路の変数は、元の回路と同じ宣言セマンティクスを持つ。 例えば、ソースの
input変数は、出力回路のinput変数になる。 ストアがコピーされないため、ローカル変数が初期化されないことに注意。 このため、ユーザーがイニシャライザー・ストアを追加し直さなければ、回路が潜在的に危険な状態になる可能性がある。キャプチャー
すべての変数はキャプチャ変数に変換される。 これは、既存の回路に新しいレイヤーを追加する場合に便利である。
compose()というのもcompose()はキャプチャをベース回路にインライン化できるからです(他の変数はできません)。ドロップ
出力回路には変数が定義されていない。
戻り値
selfの空のコピー。
戻りの型
場合によっては、回路コンテキスト全体とは別に CircuitInstructionのリストを生成し、それから回路を構築するのが最も便利な場合がある。 この from_instructions() コンストラクタは自動的にすべての Qubit と Clbit インスタンスを自動的に取り込み、正しいリソースとすべての命令を持つ新しい QuantumCircuit オブジェクトを生成します。
from_instructions
static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)
の反復可能なものから回路を構成する。 CircuitInstructions.
パラメーター
- instructions (Iterable[CircuitInstruction |tuple[qiskit.circuit.Instruction] | tuple[qiskit.circuit.Instruction, Iterable[Qubit]] | tuple[qiskit.circuit.Instruction, Iterable[Qubit], Iterable[Clbit]]]) – 回路に追加する命令。
- qubits (Iterable[Qubit]) – 回路に追加する任意の量子ビット。 この引数は、例えば、量子ビットの特定の順序を強制するために使うことができる。
- clbits (Iterable[Clbit]) – 回路に追加する古典的なビットがあれば何でも。 この引数は、例えば、古典的なビットの特定の順序を強制するために使うことができる。
- name (str | None) – 回路の名前。
- global_phase (ParameterValueType) – ラジアン単位の回路のグローバル位相。
- metadata (dict | None) – 回路に関連付ける任意のキー・バリューのメタデータ。
戻り値
量子回路。
戻りの型
QuantumCircuit のインポーターのレガシー・ラッパーである2つのコンストラクター・メソッドもまだ持っている。 qiskit.qasm2. これらは、従来の互換性設定を自動的に適用します。 load() そして loads()。
from_qasm_file
static from_qasm_file(path)
OpenQASM 2.0 プログラムをファイルから読み込み、以下のインスタンスに変換する。 QuantumCircuit.
パラメーター
path (str |PathLike) – OpenQASM 2 プログラムのファイルへのパス
戻り値
OpenQASM 2. 入力された QuantumCircuit オブジェクト。
戻りの型
qasm2.load()OpenQASM 2インポーターへの完全なインターフェース。
from_qasm_str
static from_qasm_str(qasm_str)
OpenQASM 2.0 プログラムを含む文字列を、次のように変換する。 QuantumCircuit.
パラメーター
qasm_str (str) – OpenQASM 2.0 プログラムを含む文字列。
戻り値
OpenQASM 2 入力に対する QuantumCircuit オブジェクト
戻りの型
qasm2.loads()OpenQASM 2インポーターへの完全なインターフェース。
回路上のデータオブジェクト
データオブジェクトの追加
メソッド | このようなデータを追加する |
|---|---|
add_bits() | Qubitと Clbits. |
add_register() | QuantumRegister そして ClassicalRegister. |
add_var() | Var ローカルスコープとイニシャライザを持つノード。 |
add_stretch() | Stretch ローカルスコープを持つノード。 |
add_input() | Var 回路の入力として扱われるノード。 |
add_capture() | Var または Stretch スコープからキャプチャされたノード。 |
add_uninitialized_var() | Var ローカルスコープと未定義の状態を持つノード。 |
通常、ほとんどのデータオブジェクト(Qubit, Clbit, ClassicalRegisterなど)を回路に追加する。 __init__() デフォルトのコンストラクタ copy_empty_like(). ただし、後から追加することも可能だ。 スタンドアローン Var ノード( リアルタイム古典計算参照)のような型付けされた古典データは、別々のメソッドで構築することも追加することもできる。
新しいレジスターレス Qubit および Clbit オブジェクトは add_bits(). これらのオブジェクトは、すでに回路内に存在してはならない。 ビットがすでに回路に存在するかどうかは、次のようにしてチェックできる。 find_bit().
add_bits
レジスタは add_register(). この方法では、ビットの一部がすでに回路に存在していてもエラーにはならない。 この場合、レジスタはビットの「エイリアス」となる。 これは一般的にハードウェアバックエンドではあまりサポートされていない。 あるビットが入っているレジスタは find_bit().
add_register
add_register(*regs)
レジスタを追加する。
量子回路に既存の layout 属性がある場合 QuantumRegister を追加しても、量子ビットの数が増えるだけです。 レイアウトは更新されない。
パラメーター
regs (Register |int |Sequence[Bit])
戻りの型
なし
リアルタイムの型付けされた古典的なデータは、回路上では次のようなノードで表現される。 Var ノードで表現される。 Type. これらを回路とは別にインスタンス化することも可能である ( Var.new()を参照)が、型や式の初期化を自動的に管理してくれる回路メソッドを使う方が便利なことが多い。 最も一般的な2つのメソッドは add_var() (ローカルにスコープされた変数)と add_input() (回路への入力)である。 さらに、この方法は add_stretch() は、回路にストレッチを加えるために使うことができる。
add_var
add_var(name_or_var, /, initial)
この回路に、自動記憶とスコープを持つ古典変数を追加する。
変数は回路の最初に "宣言 "されたものとみなされるが、初期化されるのはこのメソッドを呼び出した時点なので、それ以前に定義された変数に依存することができる。
パラメーター
-
name_or_var (str |Var) – 変数名の文字列、または再利用する
Var既存のインスタンスのいずれか。 変数は、回路内で既に使用されている名前を隠蔽することはできません。 -
initial (Any) –
この変数を初期化する値。 最初の引数が文字列名で与えられた場合、結果の変数の型は最初の式から推測される。
Var.new()を使って手動で希望の型を持つ新しい変数を作成するか、あるいはexpr.cast()を使って初期化子を希望の型にキャストします。これは
Exprノードか、expr.liftを使って1つにリフティングできる値でなければならない。
戻り値
作成された変数。 もし Var インスタンスが与えられた場合は、まったく同じオブジェクトが返される。
レイズ
CircuitError - 既存の識別子をシャドウイングするために変数を作成できない場合。
戻りの型
例
名前とイニシャライザー式だけで新しい変数を定義する:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)関連する回路から取り出したり、手動で構築した変数を再利用し、より複雑な式で初期化する:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.classical import expr, types
my_var = expr.Var.new("my_var", types.Uint(8))
cr1 = ClassicalRegister(8, "cr1")
cr2 = ClassicalRegister(8, "cr2")
qc = QuantumCircuit(QuantumRegister(8), cr1, cr2)
# Get some measurement results into each register.
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr1)
qc.reset(range(8))
qc.h(0)
for i in range(1, 8):
qc.cx(0, i)
qc.measure(range(8), cr2)
# Now when we add the variable, it is initialized using the real-time state of the
# two classical registers we measured into above.
qc.add_var(my_var, expr.bit_and(cr1, cr2))add_input
add_input(name_or_var: str, type_: Type, /) → Var
add_input(name_or_var: Var, type_: None = None, /) → Var
変数を回路の入力として登録する。
パラメーター
- name_or_var (str |Var) – 文字列名、または入力変数として使用する既存の
Varノードのいずれか。 - 型 - 名前が文字列で指定された場合、これは変数に使用する
Typeでなければならない。 変数に既存のVarとして与えられた場合、これは与えてはならず、代わりにオブジェクト自体から読み込まれる。 - type_ (Type | None)
戻り値
作成された変数、または渡された変数と同じ変数。
レイズ
CircuitError - 既存の変数をシャドウイングするために変数を作成できない場合。
戻りの型
add_stretch
add_stretch(name_or_stretch)
この回路をスコープとする新しいストレッチを宣言する。
パラメーター
name_or_stretch (str |Stretch) – ストレッチ名の文字列、または再利用する Stretch 既存のインスタンスのいずれか。 ストレッチは、回路内で既に使用されている名前をシャドウすることはできません。
戻り値
創造されたストレッチ。 もし Stretch インスタンスが与えられた場合は、まったく同じオブジェクトが返される。
レイズ
CircuitError - 既存の識別子をシャドウイングするためにストレッチを作成できない場合。
戻りの型
例
名前だけ与えられた新しいストレッチを定義し、使用する:
from qiskit.circuit import QuantumCircuit, Duration
from qiskit.circuit.classical import expr
qc = QuantumCircuit(2)
my_stretch = qc.add_stretch("my_stretch")
qc.delay(expr.add(Duration.dt(200), my_stretch), 1)さらに、プログラムによる回路生成に有用な低レベルの方法が2つある。 インタラクティブに作業する場合、これらの機能は必要ないことが多いだろう。 add_uninitialized_var() のほとんどの使用は copy_empty_like()の一部であり add_capture() のほとんどの使い方は、 コントロール・フロー・ビルダー・インターフェースを使った方がいいだろう。
add_uninitialized_var
add_uninitialized_var(var, /)
イニシャライザを持たない変数を追加する。
ほとんどの場合 add_var() を使って変数を初期化する。 この関数を使うには、すでに Var というのも、この関数の使用は通常、コピーの文脈でのみ意味をなすからである。
Qiskitは、初期化されていない変数が実行時にどのように評価されるかを一切保証しておらず、ハードウェアによってはこれをエラーとして拒否する場合があります。
この関数は慎重に扱うべきであり、プログラム的に2つの同じような回路を再構築する特別な場合にのみ役立つ低レベルのプリミティブである。
パラメーター
var (Var) – 追加する変数。
add_capture
add_capture(var: Var)
add_capture(stretch: Stretch)
スコープから取り込むべき識別子を回路に追加する。
この方法には Var または Stretch ノードが必要で、これは識別子へのハンドルを持っていることを強制する。
これは低レベルのメソッドであり、コントロール・フロー操作を手動で構築する場合にのみ真に役立つ。 with 制御フローのスコープにビルダー・インターフェースを使用している場合、このメソッドを呼び出す必要は通常ありません。 if_test() やその他のスコープ構文) を使用している場合は、このメソッドを呼び出す必要はありません。 ビルダー・インターフェイスは、スコープ内で使用されている識別子をキャプチャすることで、あなたの代わりに自動的に内部スコープをクロージャにします。
パラメーター
var (Union[expr.Var, expr.Stretch]) – スコープからキャプチャする変数またはストレッチを指定します。
レイズ
CircuitError - 既存の識別子をシャドウイングするために識別子を作成できない場合。
ビットとレジスタの操作
インスタンス Bit は、それ自体としては、単に回路がそれぞれのコンテキストで使用する一意のハンドルに過ぎません。 インスタンスと回路があれば、Bit を使用して find_bit()、そのビットが存在するコンテキスト(回路内での整数インデックスや、そのビットが含まれるレジスタなど)を確認できます。
find_bit
find_bit(bit)
ある回路を参照するために使用できる回路内の位置を見つける。 Bit.
特に、この関数は量子ビットの整数インデックスを求めることができ、これはトランスパイルド回路のハードウェアインデックスに対応する。
の回路インデックスは AncillaQubit のインデックスは qubitsのインデックスである。 ancillas.
パラメーター
bit (Bit) – 場所を特定するビット。
戻り値
2タプル。 最初の要素(index)には、 Bit を見つけることができるインデックスが含まれます(以下のいずれか)。 qubits, clbitsのいずれか)。 番目の要素(registers)は、 (register, index) のペアのリストである。 Register を含む。 Bit と Register を含む。)
戻りの型
namedtuple (int, リスト[タプル (レジスタ, int )])
レイズ
- CircuitError - 提供された
Bitが未知の型であった場合。 - CircuitError - 供給された
Bitが回路上に見つからなかった。
例
回路をループし、各操作のqubitとclbitインデックスを取得する:
from qiskit.circuit import QuantumCircuit, Qubit
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])
# The `.qubits` and `.clbits` fields are not integers.
assert isinstance(qc.data[0].qubits[0], Qubit)
# ... but we can use `find_bit` to retrieve them.
assert qc.find_bit(qc.data[0].qubits[0]).index == 0
simple = [
(
instruction.operation.name,
[qc.find_bit(bit).index for bit in instruction.qubits],
[qc.find_bit(bit).index for bit in instruction.clbits],
)
for instruction in qc.data
]同様に、回路にレジスタが既に追加されているかどうかを問い合わせるには has_register().
has_register
has_register(register)
この回路がレジスタrを持っているかどうかをテストする。
パラメーター
register (Register) – 量子レジスターか古典レジスターか
戻り値
レジスタがこの回路に含まれていれば真。
戻りの型
コンパイル時パラメータの操作
コンパイル時パラメトライゼーションとは何か、そしてそれがQiskitのデータモデルにどのように適合するかについて、より完全な議論を行う。
ビットやレジスタ、リアルタイムに型付けされた古典的なデータとは異なり、コンパイル時のシンボリック・パラメータは手動で回路に追加されることはない。 その存在は、回路やグローバル・フェーズに追加された操作に含まれることで推測される。 現在回路内にある全パラメータの順序付きリストは以下にある。 QuantumCircuit.parameters.
インスタンスに対する最も一般的な操作は Parameter インスタンスを数値や別の記号式で置き換えることである。 これは assign_parameters().
assign_parameters
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[False] = False, *, flat_input: bool = False, strict: bool = True) → QuantumCircuit
assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[True] = False, *, flat_input: bool = False, strict: bool = True) → None
新しいパラメータや値にパラメータを割り当てる。
parameters 、辞書として渡される場合、キーは現在の回路のインスタンスでなければならない。 Parameter インスタンスでなければならない。 ディクショナリの値は、数値または新しいパラメータ・オブジェクトのいずれかである。
parameters がリストまたは配列として渡された場合、その要素は、アルファベット順に並べられた parameters の順序で現在のパラメータに割り当てられる。 ParameterVector オブジェクトの順序を尊重する)。
値は、現在の回路オブジェクトまたはそのコピーに割り当てることができる。
マッピングとして parameters を指定する場合、パラメータ名の文字列をキーにすることができる。 get_parameter(). また、キーが ParameterVector この場合、辞書の値はベクトルと同じ長さの値のシーケンスでなければなりません。
これらのケースを使用する場合は、 flat_input=False のままにしておかなければならない。 True に変更すると、高速パスが有効になる。 Parameter インスタンスでなければならない。
パラメーター
- parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – 新しいパラメータ値を指定する辞書または反復可能オブジェクト。
- inplace (bool) – Falseの場合、バインドされたパラメータを含む回路のコピーが返されます。 Trueの場合、回路インスタンス自体が変更されます。
- flat_input (bool) – もし
Trueがparameters写像型であるならば、それは の写像{parameter: value}であるとみなされる。 デフォルトでは(False)、マッピングには、対応する値のシーケンスを指すキーParameterVectorが含まれている場合があり、これらはマッピング処理中に展開されます。また、文字列キーが含まれている場合は、convertToを使用してインスタンスParameterget_parameter()に変換されます。 - strict (bool) – もし
False、マッピングで指定されたパラメータのうち、回路で使用されないものがあれば、それらは無視されます。 (Trueデフォルトの場合)、論理エラーを示すエラーが発生します。
レイズ
- CircuitError - parametersがdictで、回路に存在しないパラメータを含む場合。
- ValueError - parametersがリスト/配列で、長さが回路内のフリー・パラメーターの数と不一致の場合。
戻り値
inplace が False の場合、パラメータをバインドした回路のコピー、それ以外の場合は None。
戻りの型
QuantumCircuit | なし
例
パラメータ化された回路を作成し、パラメータをインプレースで割り当てる。
from qiskit.circuit import QuantumCircuit, Parameter
circuit = QuantumCircuit(2)
params = [Parameter('A'), Parameter('B'), Parameter('C')]
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
circuit.draw('mpl')
circuit.assign_parameters({params[0]: params[2]}, inplace=True)
circuit.draw('mpl')

場違いな値をリストでバインドし、元の回路のコピーを得る。
from qiskit.circuit import QuantumCircuit, ParameterVector
circuit = QuantumCircuit(2)
params = ParameterVector('P', 2)
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
bound_circuit = circuit.assign_parameters([1, 2])
bound_circuit.draw('mpl')
circuit.draw('mpl')

この回路では、パラメータを Parameter また、 OpenQASM や他の外部フォーマットと相互運用する際の問題を避けるために、同じ名前のパラメータを複数持つことを禁止している。 を使用することができます。 has_parameter() と get_parameter() を使うと、指定した文字列名のパラメータを回路に問い合わせることができます。
has_parameter
has_parameter(name_or_param, /)
この回路にパラメータ・オブジェクトが存在するかどうかをチェックする。
パラメーター
name_or_param (str |Parameter) – パラメータ、またはチェックするパラメータ名。 これが Parameter ノードである場合、この関数が True を返すためには、パラメータは指定されたものとまったく同じでなければならない。
戻り値
この回路でマッチングパラメータが割り当て可能かどうか。
戻りの型
QuantumCircuit.get_parameter()
この回路から Parameter この回路からインスタンスを名前で取得する。
get_parameter
get_parameter(name: str, default: T) → Parameter | T
get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter
この回路スコープでアクセス可能なコンパイル時のパラメータを名前で取得する。
パラメーター
- name (str) – 取得するパラメータの名前。
- default (Any) – 指定された場合、パラメータが存在しないときはこの値が返されます。 指定されていない場合は、
KeyError代わりに が発生します。
戻り値
対応するパラメータ。
レイズ
KeyError - デフォルトが与えられていないが、パラメータが回路に存在しない場合。
戻りの型
例
回路から名前を指定してパラメータを取得する:
from qiskit.circuit import QuantumCircuit, Parameter
my_param = Parameter("my_param")
# Create a parametrized circuit.
qc = QuantumCircuit(1)
qc.rx(my_param, 0)
# We can use 'my_param' as a parameter, but let's say we've lost the Python object
# and need to retrieve it.
my_param_again = qc.get_parameter("my_param")
assert my_param == my_param_again回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:
assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is Noneリアルタイム入力された古典的データを用いた作業
変数、式、型システムの仕組み、それらを表現するためのオブジェクト、利用可能な古典的操作について、モジュール・レベルのドキュメント。
リアルタイム・データがデータ・モデル全体にどのように適合するかについての議論。 qiskit.circuit データ・モデル全体として
回路に付けられた識別子(例えば Var または Stretchなど)に付けられた識別子を、メソッド get_var(), get_stretch()または get_identifier(). また、回路に指定した識別子が含まれているかどうかは has_var(), has_stretch()または has_identifier().
get_var
get_var(name: str, default: T) → Var | T
get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var
この回路スコープでアクセス可能な変数を名前で取得する。
パラメーター
- name (str) – 取得する変数の名前。
- default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、
KeyError代わりに が発生します。
戻り値
対応する変数。
レイズ
KeyError - デフォルトが与えられず、変数が存在しない場合。
例
回路から名前を指定して変数を取り出す:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_var = qc.add_var("my_var", False)
# We can use 'my_var' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_var_again = qc.get_var("my_var")
assert my_var == my_var_again回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:
assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is Noneget_stretch
get_stretch(name: str, default: T) → Stretch | T
get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch
この回路スコープでアクセス可能なストレッチを名前で取得する。
パラメーター
- name (str) – 取得する区間の名前。
- default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、
KeyError代わりに が発生します。
戻り値
対応するストレッチ。
レイズ
KeyError - デフォルトが与えられず、変数が存在しない場合。
例
回路からストレッチを名前で取り出す:
from qiskit.circuit import QuantumCircuit
# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_stretch = qc.add_stretch("my_stretch")
# We can use 'my_stretch' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_stretch_again = qc.get_stretch("my_stretch")
assert my_stretch == my_stretch_again回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:
assert qc.get_stretch("my_stretch", None) == my_stretch
assert qc.get_stretch("unknown_stretch", None) is Noneget_identifier
get_identifier(name: str, default: T) → Var | Stretch | T
get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch
この回路スコープでアクセス可能な識別子を名前で取得する。
これには現在、リアルタイムのクラシック変数とストレッチの両方が含まれている。
パラメーター
- name (str) – 取得する識別子の名前。
- default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、
KeyError代わりに が発生します。
戻り値
対応する変数。
レイズ
KeyError - デフォルトが与えられていないが、識別子が存在しない場合。
インスタンスであることが分かっている識別子を取得する。 expr.Var インスタンスです。
インスタンスであることが分かっている識別子を取得する。 expr.Stretch インスタンスです。
has_var
has_var(name_or_var, /)
変数がこのスコープでアクセス可能かどうかをチェックする。
パラメーター
name_or_var (str |Var) – 変数、または確認する変数の名前。 これが expr.Var ノードである場合、この関数がを返すためには True、変数が与えられたものと完全に一致していなければならない。
戻り値
マッチする変数にアクセスできるかどうか。
戻りの型
この回路から expr.Var この回路からインスタンスを名前で取得する。
has_stretch
has_stretch(name_or_stretch, /)
ストレッチがこのスコープでアクセス可能かどうかをチェックする。
パラメーター
name_or_stretch (str |Stretch) – ストレッチ、または確認すべきストレッチの名前 これが expr.Stretch ノードである場合、この関数がを返すためには True、伸長が与えられたものと正確に一致しなければならない。
戻り値
マッチするストレッチにアクセスできるかどうか。
戻りの型
この回路から expr.Stretch この回路からインスタンスを名前で取得する。
has_identifier
has_identifier(name_or_ident, /)
識別子がこのスコープでアクセス可能かどうかを調べる。
パラメーター
name_or_ident (str |Var |Stretch) – インスタンス、または確認する識別子の名前。 これが または expr.Stretch expr.Var ノードである場合、一致したインスタンスは指定されたものと完全に一致しなければ、この関数は を返す True。
戻り値
マッチする識別子がアクセス可能かどうか。
戻りの型
QuantumCircuit.get_identifier()
を取得する。 expr.Var または expr.Stretch インスタンスを取り出す。
このメソッドと同じだが、ランタイムの expr.Var 変数でないものは無視する。
このメソッドと同じだが、ランタイムの expr.Stretch 変数でないものは無視する。
また、回路が追跡する識別子の全セットを取得するために使用できるイテレータ・メソッドもいくつかある。 および iter_input_vars() と iter_captured_vars() は空になる。入力とキャプチャは互いに排他的だからである。 すべてのイテレータは、その長さを含む対応するダイナミック・プロパティを QuantumCircuit に対応するダイナミック・プロパティを持ちます: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_varsまたは num_declared_stretches.
iter_vars
iter_vars()
この回路のスコープ内にあるすべてのリアルタイム・クラシック変数の反復可能値を取得する。
このメソッドは、スコープ内のすべての変数を繰り返し処理する。 より細かいイテレータについては iter_declared_vars(), iter_input_vars() および iter_captured_vars().
戻りの型
iter_stretches
iter_stretches()
この回路内のすべてのストレッチを反復可能な形で取得する。
このメソッドは、スコープ内のすべてのストレッチを繰り返し処理する。 より細かいイテレータについては iter_declared_stretches() と iter_captured_stretches().
戻りの型
iter_input_vars
iter_input_vars()
この回路スコープの入力として宣言されているすべてのリアルタイム・クラシック変数を反復可能な形で取得する。 これは、ローカルで宣言された変数 ( iter_declared_vars()参照)とキャプチャされた変数( iter_captured_vars()).
戻りの型
iter_captured_vars
iter_captured_vars()
含むスコープから、この回路スコープでキャプチャされているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数 ( iter_input_vars()参照)とローカルで宣言された変数( iter_declared_vars()).
戻りの型
iter_captured_stretches
iter_captured_stretches()
この回路スコープでキャプチャされたストレッチを含むスコープから反復可能な形で取得します。 これは、ローカルで宣言されたストレッチを除く( iter_declared_stretches()).
戻りの型
iter_declared_vars
iter_declared_vars()
このスコープで自動保存期間が宣言されているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数( iter_input_vars()参照)とキャプチャされた変数 iter_captured_vars()).
戻りの型
iter_declared_stretches
iter_declared_stretches()
このスコープで宣言されているすべてのストレッチを反復可能形式で取得します。 これは、キャプチャされたストレッチを除く( iter_captured_stretches()).
戻りの型
回路への演算の追加
インターフェイスを実装しているものなら何でも、1つの命令として回路に追加できる。 Operation インターフェイスを実装するものなら何でも、1つの命令として回路に追加できる。 Instruction または Gate インスタンスになります。
回路レベル命令 qiskit.circuit-Qiskitが回路レベル命令を定義するために使用するさまざまなインターフェースに関するレベルのドキュメントです。
汎用演算を追加する方法
これらは、ユーザー定義のものも含め、あらゆるオブジェクトを回路に追加するための基本メソッドである。
メソッド | いつ使用するか |
|---|---|
append() | 命令を1つのオブジェクトとして回路に追加する。 |
_append() | と同じである。 append()と同じだが、エラーチェックをほとんど行わない低レベルのインターフェイスである。 |
compose() | ある回路から別の回路に命令をインライン化する。 |
tensor() | のように compose()のようなものだが、厳密には、不連続な量子ビットに作用する回路を結合するためのものである。 |
QuantumCircuit 回路に演算を追加するには、主に2つの方法がある。 どちらを使うかは、オブジェクトを1つの「命令」として追加したいのか(append())としてオブジェクトを追加したいのか、あるいは2つの回路の命令を結合したいのか(compose()).
1つの命令または操作は、回路の data 回路ビジュアライザ( draw()). 一つの命令は、ハードウェアバックエンドが定義されるかもしれない「単位」である( Target). アン Instruction は definitionこれはトランスパイラ( qiskit.transpilerを参照)が必要な場合に、ハードウェア用に分解するための1つのルールである。 を Operation でもない Instruction でもないものは、関連する高レベル合成メソッドが登録されている場合にのみ分解できる ( qiskit.transpiler.passes.synthesis.plugin).
A QuantumCircuit だけでは単一の Instruction型付けされた古典的なメモリー入出力と制御フローを持つ完全なプログラムを表すことができるからだ。 Qiskitの(そしてほとんどのハードウェアの)データモデルには、仮想量子オペランドを持つ再利用可能な呼び出し可能サブルーチンという概念がまだない。 量子ビットにのみ作用する単純な回路を、ユニタリー演算で Gate を使って to_gate()に変換し、量子ビットと clbits にのみ作用する単純な回路は Instruction に変換できる。 to_instruction().
を持っている場合 Operation, Instructionまたは Gateでqubitとclbit引数を指定し、回路に追加する。 append().
append
append(instruction, qargs=None, cargs=None, *, copy=True)
回路の末尾に1つ以上の命令を追加し、その場で回路を変更する。
qargs と cargs は、所定のルールに従って展開され、放送される。 Instructionの規則に従って展開され放送される。Bit 非指定子(整数インデックスなど)は、関連するインスタンスに解決される。
もし CircuitInstruction が与えられると、それがアンラップされ、この回路のコンテキストで検証され、新しいオブジェクトが回路に追加される。 この場合、 qargs 、 cargs 。
パラメーター
- instruction (Operation |CircuitInstruction) –
Instructionインスタンスを追加するかCircuitInstructionを追加する。 - qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – 命令を適用する対象の指定
Qubit子。 - cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – 命令を適用する対象の指定
Clbit子。 - copy (bool) – もし
True(デフォルト)なら、入力されたinstructionがシンボリック・パラメータを含んでいる場合、回路に追加する前にコピーされるため、同じ命令が含まれるかもしれない他の回路に影響を与えることなく、安全に変異させることができる。 この命令が他の回路で使われることがないと確信できる場合は、False、わずかなスピードアップを図ることができる。
戻り値
へのハンドルである。 CircuitInstruction実際に回路に追加された
戻りの型
レイズ
CircuitError - のインスタンスでない場合は Instruction .
append() のデータモデルを誤って壊してしまわないように、かなりのエラーチェックを行っている。 QuantumCircuit. 既知のデータからプログラムで回路を生成する場合、fast-path appender _append()を使用することで、このエラーチェックの多くを省略することができますが、有効なデータのみを渡していることを確認する責任は呼び出し側にあるというリスクを伴います。
_append
_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction
_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation
回路の末尾に命令を追加し、その場で回路を変更する。
これは内部のファストパス関数であり、すべての引数が有効であることを確認するのは呼び出し側の責任である。 具体的には以下の通りです:
- すべてのqubitsとclbitsはすでに回路に存在し、リストに重複があってはならない。
- 制御フロー演算命令は、回路内に存在する変数にのみ作用しなければならない。
- 回路はコントロールフロー・ビルダー・コンテキスト内であってはならない。
この関数は、以下の場合以外の呼び出し元でも使用できる。 QuantumCircuit 呼び出し元が、すべてのエラーチェック、ブロードキャスト、スコープがすでに実行され、命令が追加される回路への唯一の参照が同じ関数内にあることを確認している場合。 特に QuantumCircuit._append() を呼ぶのは安全ではない。 これは QuantumCircuit._append() はコントロール・フロー・ビルダー・インターフェースのスコープ構文を認識しないからである。
パラメーター
-
インストラクション
完全な整形式
CircuitInstruction操作とそのコンテキストを追加する。レガシー互換形式では、これは裸の
Operationその場合は、qargsとcargsを明示的に指定しなければならない。 -
qargs - レガシー引数。
Operationをつける。 第一引数が優先形式の場合は無視される。CircuitInstructionの場合は無視される。 -
cargs - clbitsのレガシー引数。
Operationを付ける。 第一引数が優先形式の場合は無視される。CircuitInstructionの場合は無視される。 -
_standard_gate (bool)
戻り値
追加された命令へのハンドル。
戻りの型
また、2つの回路を結合し、ある回路の命令を別の回路の指定された量子ビットや量子ビットに適用したい場合もある。 この「インライン化」操作は compose() Qiskitで compose() は、一般的に to_instruction()-プラスappend() の組み合わせよりも強力である。なぜなら、型付けされた古典的なデータも一緒にリンクでき、回路の制御フロー操作を別の回路に結合できるからである。
の欠点は compose() の欠点は、オペランドの書き換えがより複雑になることと、ある回路オブジェクトから別の回路オブジェクトにデータを移動しなければならないことである。 もし、あなたが自分自身のために回路を構築していて、生のパフォーマンスが核心的な目標であるならば、一時的なレイヤー回路を構築するのではなく、ベース回路をパスアラウンドさせ、アルゴリズムの異なる部分をベース回路に直接書き込ませることを検討すること。
compose
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[True] = True, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → None
compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[False] = False, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → QuantumCircuit
ある回路からの命令を、別の回路の指定された量子ビットや量子ビットに適用する。
デフォルトでは、 self はそのままで、新しい回路オブジェクトが作成される。 この関数のほとんどの用途では、 inplace=True を設定し、その場でベース回路を変更する方がはるかに効率的である。
リアルタイム変数 (expr.Var と expr.Stretch インスタンス) を扱う場合、次の 2 つの主要な戦略があります。 compose():
other回路は、その変数も含めて完全に加法的なものとして扱われる。otherの変数は、selfの変数とは完全に区別する必要があります(var_remapを使用すると便利です)。otherの変数はすべて、otherの変数と入力/キャプチャ/ローカル・スコープが一致するように、出力で新たに宣言されます。 これは一般的に、関係のない2つの回路を接続する場合に必要なものです。other回路は、selfの正確な拡張として作成され、selfの最後にある状態の既存の変数に作用することも含めて、 にインライン化された。 この場合、インライン化するこれらの変数をすべて "captures "として宣言したotherを作成し、このメソッドでinline_captures=Trueを使ってリンクする。 これは一般的に、その場でレイヤーを定義して回路を構築する場合や、自分自身から取り出したレイヤーを使って回路を再構築する場合に求められるものだ。 の引数vars_mode="captures"は、各レイヤーのベースを作成するのに便利だ。copy_empty_like()への引数が役に立つかもしれない。
パラメーター
-
other (qiskit.circuit.Instruction orQuantumCircuit) – (サブ)回路、または自己に合成するための指示。 でない場合は
QuantumCircuitでない場合はappendである。 -
front (bool) –
Trueの場合、フロントコンポジションが行われる。 これは、コントロール・フロー・ビルダー・コンテキスト・マネージャー内では不可能である。 -
inplace (bool) –
Trueの場合、オブジェクトを修正する。 そうでなければ、構成された回路を返す。 -
copy (bool) – もし
True(デフォルト)なら、入力は共有されたものとして扱われ、将来変更される可能性がある場合、含まれている命令はコピーされる。 不必要なコピーを避けるため、入力をベース回路が所有しているとみなす場合は、これをFalse。この場合、otherを後で使用するのは無効であり、一部の命令がその場で変異している可能性がある。 -
var_remap (Mapping) –
を書き換えるために使用するマッピング
expr.Varとexpr.Stretchotherselfノードを書き換えるために使用するマッピングである。 これは名前の衝突を避けるために使うことができる。キーも値も、文字列または直接識別子のインスタンスとして与えることができる。 キーが文字列の場合、任意の
VarまたはStretchにマッチします。 値が文字列の場合、新しいキーがそれにマッチするたびに、新しいVarまたはStretchが生成される。 値がVarである場合、そのtypeは、置き換えられる変数のそれと正確に一致しなければならない。 -
inline_captures (bool) –
もし
Trueの場合、otherのすべての「キャプチャされた」識別子ノードは、 ですでに宣言されている識別子を参照するものとみなされる。QuantumCircuitのすべての "キャプチャされた "識別子ノードは、self(入力/キャプチャ/ローカル型のいずれかとして)ですでに宣言されている識別子を指すと仮定され、otherの使用法は既存の識別子に適用される。 で使用する既存の回路のレイヤーを構築したい場合は、 の引数を使用するとよい。compose()で使用するために既存の回路のレイヤーを構築したい場合、vars_mode="captures"の引数が役に立つかもしれない。copy_empty_like()を使うと便利だ。vars_remapのリマッピングは、このインライン化された変数を評価する前に行われる。これが
False(デフォルト)の場合、otherの識別子はすべて、selfの識別子と区別される必要があり、それらのために新しい宣言が行われる。 -
wrap (bool) – もしTrueなら、selfに合成する前に、もう1つの回路をゲート(または命令(それがユニタリ命令だけを含むかどうかによる)にラップする。 このオプションを使うよりも、ほとんどの場合、手動で
to_instruction()またはto_gate()またはappend().
戻り値
構成された回路(inplace==True の場合は None を返す)。
戻りの型
レイズ
- CircuitError -
otherの幅がselfよりも広い場合など、2つの回路間で正しいワイヤーマッピングができない場合。 - CircuitError -
self、部分的に構築されたコントロールフローコンテキストがアクティブな状態で、新しい回路を生成しようとする場合、例えばコンテキストマネージャのフォームであるif_test(),for_loop()およびwhile_loop(). - CircuitError - この動作に明確な意味はない。
例
>>> lhs.compose(rhs, qubits=[3, 2], inplace=True) ┌───┐ ┌─────┐ ┌───┐
lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├ lqr_1_0: ───┤ H ├───────────────
├───┤ ┌─┴─┐└─────┘ ├───┤
lqr_1_1: ───┤ X ├─── rqr_1: ┤ X ├─────── lqr_1_1: ───┤ X ├───────────────
┌──┴───┴──┐ └───┘ ┌──┴───┴──┐┌───┐
lqr_1_2: ┤ U1(0.1) ├ + = lqr_1_2: ┤ U1(0.1) ├┤ X ├───────
└─────────┘ └─────────┘└─┬─┘┌─────┐
lqr_2_0: ─────■───── lqr_2_0: ─────■───────■──┤ Tdg ├
┌─┴─┐ ┌─┴─┐ └─────┘
lqr_2_1: ───┤ X ├─── lqr_2_1: ───┤ X ├───────────────
└───┘ └───┘
lcr_0: 0 ═══════════ lcr_0: 0 ═══════════════════════
lcr_1: 0 ═══════════ lcr_1: 0 ═══════════════════════2つの回路を結合しようとしている場合、それは完全に不連続なqubitsとclbitsに適用される、 tensor() は、手動でビットオブジェクトを追加して compose().
tensor
tensor(other, inplace=False)
Tensor self with other.
リトルエンディアンの慣習では、左端の演算が回路の一番下に来ることを覚えておいてほしい。 詳細はドキュメントも参照のこと。
┌────────┐ ┌─────┐ ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├ = q_0: ─┤ top ├──
└────────┘ └─────┘ ┌┴─────┴─┐
q_1: ┤ bottom ├
└────────┘パラメーター
- other (QuantumCircuit) – この回路をテンソルするもう1つの回路。
- inplace (bool) –
Trueの場合、オブジェクトを修正する。 そうでなければ、構成された回路を返す。
戻りの型
QuantumCircuit | なし
例
from qiskit import QuantumCircuit
top = QuantumCircuit(1)
top.x(0);
bottom = QuantumCircuit(2)
bottom.cry(0.2, 0, 1);
tensored = bottom.tensor(top)
tensored.draw('mpl')
戻り値
テンサード回路( inplace=True の場合は None を返す)。
戻りの型
パラメーター
- other (QuantumCircuit)
- inplace (bool)
経験則として:
- シングル
Operation,InstructionまたはGateを使うべきである。append()または_append(). - もし
QuantumCircuit再利用したい大きな回路のための単一のアトミック命令を表すものがある場合、おそらくはto_instruction()またはto_gate()を呼び出し、その結果をappend(). - もし
QuantumCircuit他の回路のより大きな「層」を表したり、型付けされた古典的な変数や制御フローを含んでいる場合はcompose()を使用して別の回路にマージする必要があります。 tensor()のどちらかよりもはるかに稀である。append()またはcompose(). 内部的には、ほとんどがadd_bits()そしてcompose().
注意すべき落とし穴もある:
- カスタム
Instructionを再利用する場合であっても、トランスパイラは一般に、その作業を開始する前に、各呼び出しをその内部分解まで "アンロール "する必要があります。 の使用を妨げるものではありません。to_instruction()-プラスappend()パターンを使うことを妨げるものではない。 compose()は、後方互換性のために、デフォルトでは新しい回路を生成する。 これはより高価で、通常は望むものではないので、inplace=True。- どちらも
append()そしてcompose()と_append()) にはcopyキーワード引数があり、デフォルトはTrueです。 このような場合Operationインスタンスはコピーされます。 オブジェクトを他の場所で再利用しないことが確実であれば、copy=False、このコピーを防ぐように設定すべきである。
標準的な指示を追加する方法
この QuantumCircuit クラスには、Qiskitの標準ライブラリに含まれる多くの命令やゲートを回路に追加するためのヘルパーメソッドが用意されています。 これらは一般的に、関連 qiskit.circuit.library するオブジェクトのインスタンスを手動で作成し、それを に渡すのと同じ効果を持ち、残りの引数は必要 append() に応じて および cargs qargs フィールドに格納されます。
以下のメソッドは、特別な非ユニタリー演算を適用する。 Instruction を適用する:
これらの方法は、制御されないユニタリー Gate インスタンスを適用する:
以下のメソッドが適用される。 Gate の直接のサブクラスである。 ControlledGate:
ccx() | CCXGate |
ccz() | CCZGate |
ch() | CHGate |
cp() | CPhaseGate |
crx() | CRXGate |
cry() | CRYGate |
crz() | CRZGate |
cs() | CSGate |
csdg() | CSdgGate |
cswap() | CSwapGate |
csx() | CSXGate |
cu() | CUGate |
cx() | CXGate |
cy() | CYGate |
cz() | CZGate |
最後に、これらの方法は、特定の一般化された多重制御ゲートを回路に適用し、多くの場合、熱心な合成を行う。 正確な出力はゲートの合成バージョンであることが多いため、制御しているベース・ ゲートの観点からリストアップされている。
このセクションの残りの部分は、個々のメソッドのAPIリストである。
barrier
barrier(*qargs, label=None)
Barrier を適用する。 qargs が空の場合、回路内のすべての量子ビットに適用される。
パラメーター
- qargs (QubitSpecifier) – 1つ以上の量子ビット引数の指定。
- label (str) – バリアの文字列ラベル。
戻り値
を追加した。
戻りの型
ccx
ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)
適用する CCXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 最初の制御として使用される量子ビット。
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 第2の制御として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
ccz
ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)
適用する CCZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 最初の制御として使用される量子ビット。
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 第2の制御として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'10')で表す。 デフォルトは「11」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
ch
ch(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CHGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cp
cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CPhaseGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
crx
crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CRXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cry
cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CRYGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
crz
crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CRZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cs
cs(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CSGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
csdg
csdg(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CSdgGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cswap
cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)
適用する CSwapGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- target_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列で表す(例:
'1')。 デフォルトは'1'。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
csx
csx(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CSXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cu
cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CUGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- phi (ParameterExpression |float) – ゲートの回転角度。
- lam (ParameterExpression |float) – ゲートの回転角度。
- gamma (ParameterExpression |float) – Uゲートが適用された場合、そのゲートに適用されるグローバル位相。
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cx
cx(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 制御用として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cy
cy(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CYGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 対照群として使用された量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
cz
cz(control_qubit, target_qubit, label=None, ctrl_state=None)
適用する CZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 対照群として使用された量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
dcx
dcx(qubit1, qubit2)
適用する DCXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
delay
delay(duration, qarg=None, unit=None)
適用する Delay. qarg が None の場合、すべての量子ビットに適用される。 複数の量子ビットに適用する場合、同じ持続時間のディレイが作成される。
パラメーター
- duration (Object) – 遅延時間 これが
Exprの定数式でなければならない。Duration. - qarg (Object) – qubit引数でこの遅延を適用する。
- unit (str | None) – ただし、
durationがExprの場合は指定してはならない。 対応ユニット:'s''ms'、'us'、'ns'、'ps'、'dt'。 デフォルトは'dt'、つまりターゲットとなるバックエンドに応じた整数の時間単位である。
戻り値
を追加した。
戻りの型
レイズ
CircuitError - 引数の書式が悪い場合。
ecr
ecr(qubit1, qubit2)
適用する ECRGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
h
h(qubit)
適用する HGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
id
id(qubit)
適用する IGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
initialize
initialize(params, qubits=None, normalize=False)
量子ビットを特定の状態に初期化する。
量子ビットの初期化は、まず量子ビットを にリセットし、その後に StatePreparation クラスを呼び出して、指定された状態の量子ビットを準備します。 この2つのステップの両方がインストラクションに含まれている。 Initialize 指導に含まれている。
パラメーター
-
params (Statevector | Sequence[complex] | str |int) –
初期化する状態は、以下のいずれかである。
- 初期化する状態ベクトルまたは複素振幅のベクトル。
- パウリ固有状態Z, X, Yの基底状態のラベル。
Statevector.from_label()を参照してください。 ラベルの順番が、適用する量子ビットのインデックスに対して逆になっていることに注意。 例ラベル'01'は、量子ビット0を に、量子ビット1を に初期化する。 - どの量子ビットを に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を に、量子ビット 1 を に初期化する。
-
qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。
Noneの場合、初期化は回路内のすべての量子ビットに適用される。 -
normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。
戻り値
作成されたインストラクションへのハンドル。
例
の状態の量子ビットを用意する。
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.initialize([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()出力:
┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
└──────────────────────────────┘、文字列から2つの量子ビットを初期化する。ラベルの順序は量子ビットのインデックスに対して逆になっている。 基底状態のラベルの詳細については、以下を参照のこと。 Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()出力:
┌──────────────────┐
q_0: ┤0 ├
│ Initialize(0,1) │
q_1: ┤1 ├
└──────────────────┘複素振幅の配列から2つの量子ビットを初期化する。
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.initialize([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()出力:
┌────────────────────────────────────┐
q_0: ┤0 ├
│ Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└────────────────────────────────────┘iswap
iswap(qubit1, qubit2)
適用する iSwapGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
mcp
mcp(lam, control_qubits, target_qubit, ctrl_state=None)
適用する MCPhaseGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- lam (ParameterExpression |float) – 回転の角度。
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – 対照群として使用された量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
mcrx
mcry
mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)
複数制御のY回転ゲートを適用
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- q_controls (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – 対照群として使用された量子ビット。
- q_target (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- q_ancillae (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – 補助量子ビットの一覧。
- mode (str | None) – 使用する実装モード。
- use_basis_gates (bool) – p、u、cx基底ゲートを使用
mcrz
mcx
mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)
適用する MCXGate.
multi-cX ゲートは、異なるアンシラ量子ビットの数を使用し、回路の深さが異なる様々な技術を用いて実装することができる。 これらのモードは以下の通りである:
'noancilla':0アンシラ量子ビットを必要とする。'recursion':4つ以上のコントロールを使用する場合は1つのアンシラ量子ビットを必要とし、そうでない場合は0。'v-chain':制御量子ビットの数より2少ないアンシラを必要とする。'v-chain-dirty':クリーンアンシラの場合と同じ(ただし、回路は長くなる)。
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
qiskit.circuit.quantumcircuit.QuantumCircuit.mcx()の引数 mode は Qiskit 2.1 で非推奨となりました。 発売日から3ヶ月以内に削除されます。 代わりに、回路に汎用MCXGateを追加し、トランスパイルで hls_config 、合成方法を指定する。 また、特定の分解は次のサイトで入手できる。 https://qisk.it/mcx.
パラメーター
- control_qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – 対照群として使用された量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
- ancilla_qubits (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int] | Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – モードの要件に応じて、アンシラとして使用される量子ビット。
- mode (str | None) – モードの選択については、上記で詳しく説明した。
- ctrl_state (str |int | None) – 制御状態を10進数、またはビット列(例:'1')で表す。 デフォルトは「1」の状態で制御する。
戻り値
作成されたインストラクションへのハンドル。
レイズ
- ValueError - 指定されたモードがわからない場合、または渡されたアンシラ量子ビットの数が少なすぎる場合。
- AttributeError - アンシラ・クビットが渡されていないが、必要である場合。
戻りの型
measure
measure(qubit, cbit)
Z基底の量子ビット(qubit)を古典ビット(cbit)に変換する。
量子状態が測定されると、量子ビットは計算(パウリZ)基底で または のいずれかに投影される。古典ビット cbit は、その投影結果をそれぞれ 0 または 1 として示す。 この操作は非可逆的である。
パラメーター
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 測定対象の量子ビット。
- cbit (Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]) – 測定結果を格納するための標準的なビット。
戻り値
を追加した。
戻りの型
レイズ
CircuitError - 引数の書式が悪い場合。
例
この例では、量子ビットが測定され、その測定結果が古典ビット(通常、図では二重線で表現される)に格納される:
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw() ┌───┐┌─┐
q: ┤ H ├┤M├
└───┘└╥┘
c: 1/══════╩═
0一対一測定のショートカットとして、 qubits と cbits のリストで measure を呼び出すことができる。 この2つのフォームは同じ結果をもたらす:
circuit = QuantumCircuit(2, 2)
circuit.measure([0,1], [0,1])circuit = QuantumCircuit(2, 2)
circuit.measure(0, 0)
circuit.measure(1, 1)リストの代わりに QuantumRegister と ClassicalRegister を使うことができる。
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)これは、以下と同じ意味になります。
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])ms
ms(theta, qubits)
適用する MSGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
p
p(theta, qubit)
適用する PhaseGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
pauli
pauli(pauli_string, qubits)
適用する PauliGate.
パラメーター
- pauli_string (str) – 適用するパウリ演算子を表す文字列。
- qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – このゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
prepare_state
prepare_state(state, qubits=None, label=None, normalize=False)
特定の状態の量子ビットを準備する。
このクラスは状態を準備するユニタリーを実装している。 とは異なり initialize() と異なり、最初に量子ビットをリセットしない。
パラメーター
-
state (Statevector | Sequence[complex] | str |int) –
初期化する状態は、以下のいずれかである。
- 初期化する状態ベクトルまたは複素振幅のベクトル。
- パウリ固有状態Z, X, Yの基底状態のラベル。
Statevector.from_label()を参照してください。 ラベルの順番が、適用する量子ビットのインデックスに対して逆になっていることに注意。 例 ラベル「01」は、量子ビット0を 、量子ビット1を に初期化する。 - どの量子ビットを に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を に、量子ビット 1 を に初期化する。
-
qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。
Noneの場合、初期化は回路内のすべての量子ビットに適用される。 -
label (str | None) – ゲートの任意のラベル
-
normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。
戻り値
先ほど初期化された命令へのハンドル
戻りの型
例
の状態の量子ビットを用意する。
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(1)
circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()出力:
┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
└─────────────────────────────────────┘状態 の2つの量子ビットを文字列から準備する。ラベルの順番は量子ビットのインデックスに対して逆になっている。 基底状態のラベルの詳細については、以下を参照のこと。 Statevector.from_label().
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()出力:
┌─────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,1) │
q_1: ┤1 ├
└─────────────────────────┘複素振幅の配列から2つの量子ビットを初期化する
import numpy as np
from qiskit import QuantumCircuit
circuit = QuantumCircuit(2)
circuit.prepare_state([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()出力:
┌───────────────────────────────────────────┐
q_0: ┤0 ├
│ State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1 ├
└───────────────────────────────────────────┘r
r(theta, phi, qubit)
適用する RGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- phi (ParameterExpression |float) – x-y平面上の回転軸の角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rcccx
rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)
適用する RC3XGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 最初の制御として使用される量子ビット。
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 第2の制御として使用される量子ビット。
- control_qubit3 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 第3の制御として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rccx
rccx(control_qubit1, control_qubit2, target_qubit)
適用する RCCXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- control_qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 最初の制御として使用される量子ビット。
- control_qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – 第2の制御として使用される量子ビット。
- target_qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートが作用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
reset
reset(qubit)
量子ビットをデフォルト状態にリセットする。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – リセットする量子ビット。
戻り値
ハンドルを追加した。
戻りの型
rv
rv(vx, vy, vz, qubit)
適用する RVGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
任意の回転軸 を中心とした回転。 はラジアン単位の回転角度。
パラメーター
- vx (ParameterExpression |float) – 回転軸のx成分。
- vy (ParameterExpression |float) – 回転軸のy成分。
- vz (ParameterExpression |float) – 回転軸のz成分。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rx
rx(theta, qubit, label=None)
適用する RXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rxx
rxx(theta, qubit1, qubit2)
適用する RXXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – 回転の角度。
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
ry
ry(theta, qubit, label=None)
適用する RYGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
ryy
ryy(theta, qubit1, qubit2)
適用する RYYGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rz
rz(phi, qubit)
適用する RZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- phi (ParameterExpression |float) – ゲートの回転角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rzx
rzx(theta, qubit1, qubit2)
適用する RZXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
rzz
rzz(theta, qubit1, qubit2)
適用する RZZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
s
s(qubit)
適用する SGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
sdg
sdg(qubit)
適用する SdgGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
store
store(lvalue, rvalue, /)
与えられたリアルタイム古典式 rvalue の結果を、 lvalue で定義されたメモリー位置に格納する。
通常、 lvalue は Var ノードとなり、 rvalue Expr である。 expr.lift() に上げることができるものなら何でも Expr に上げることができるものであれば、どちらの場所でも許される。
パラメーター
- lvalue (Any) – 回路内のメモリー位置の有効な指定子。 これは通常
Varノードに書き込むこともできる。ClbitまたはClassicalRegisterに書き込むこともできる。 メモリー・ロケーションはすでに回路内に存在していなければならない。 - rvalue (Any) – リアルタイム古典式で、その結果が与えられたメモリー位置に書き込まれる。
戻りの型
swap
swap(qubit1, qubit2)
適用する SwapGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- qubit1 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- qubit2 (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
sx
sx(qubit)
適用する SXGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
sxdg
sxdg(qubit)
適用する SXdgGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
t
t(qubit)
適用する TGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
tdg
tdg(qubit)
適用する TdgGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
u
u(theta, phi, lam, qubit)
適用する UGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- theta (ParameterExpression |float) – ゲートの回転角度。
- phi (ParameterExpression |float) – ゲートの回転角度。
- lam (ParameterExpression |float) – ゲートの回転角度。
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
unitary
unitary(obj, qubits, label=None)
obj で指定されたユニタリーゲートを qubits に適用する。
パラメーター
- obj (np.ndarray | Gate | BaseOperator) – 単一演算子。
- qubits (Sequence[QubitSpecifier]) – 変換を適用する回路量子ビット。
- label (str | None) – バックエンドの統一名[デフォルト:なし]。
戻り値
量子回路。
戻りの型
例
ユニタリー行列で指定されたゲートを量子回路に適用する
from qiskit import QuantumCircuit
matrix = [[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0]]
circuit = QuantumCircuit(2)
circuit.unitary(matrix, [0, 1])x
x(qubit, label=None)
適用する XGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
- qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
- label (str | None) – 回路内のゲートの文字列ラベル。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
y
y(qubit)
適用する YGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
z
z(qubit)
適用する ZGate.
このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。
パラメーター
qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。
戻り値
作成されたインストラクションへのハンドル。
戻りの型
回路への制御フローの追加
制御フローのオペレーションが全体の中でどのように表現されるかについての議論。 qiskit.circuit コンテキストでどのように表現されるかを議論する。
制御フロー命令 | |
|---|---|
if_test() | IfElseOpTrue ボディのみで |
if_else() | IfElseOpTrue 、 False ボディ |
while_loop() | WhileLoopOp |
switch() | SwitchCaseOp |
for_loop() | ForLoopOp |
box() | BoxOp |
break_loop() | BreakLoopOp |
continue_loop() | ContinueLoopOp |
QuantumCircuit Qiskitがサポートするすべての制御フロー操作に対応するメソッドを備えています。 これらを呼び出すには、2つの方法があります。 1つ目は、命令のブロック本体を引数 QuantumCircuit として受け取り、単にそれに対応するものを生成して ControlFlowOp追加するだけの、非常にシンプルな利便性向上のためのラッパーです。
つ目の形式は、コントロール・フローを構築するために使うことを強く推奨するもので、 ビルダー・インターフェイスと呼ばれる。 ここでは、メソッドは操作のリアルタイム判別だけを取り、 with を使って入力したコンテキスト・マネージャーを返す。 その後、これらのブロック内で通常の QuantumCircuit Qiskitは自動的にどのデータリソースが内部ブロックに必要かを追跡し、完全な ControlFlowOpwith を構築します。 この方法でプログラム的に制御フローを構築する方が、はるかにシンプルで、エラーの発生も少ない。
コントロール・フロー・ビルダー・インターフェースを使用する際、演算が定義されていないにもかかわらず、量子ビットをブロックに含めたい場合がある。 この場合 noop() メソッドを使用します。
回路に ControlFlowOp が含まれているかどうかを調べるには、ヘルパー・メソッド QuantumCircuit.has_control_flow_op().
box
box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)
より大きなコンテキストの中でアトミックに扱われる、この回路上の操作の box 。
ボックス」とは、無条件に入力される制御フローの構成要素である。 ボックスの中身は、ボックスの始点と終点がバリアであるかのような振る舞いをする( barrier()を参照)、ただし、ボックスの中を "ずっと "通過することは許される。 ボックスは、変数、ストレッチ、コンパイラー・パスのための明示的なスコープでもある。
この関数を呼び出すには2つの形式がある:
- を渡す。
QuantumCircuit位置的に、qubitsとclbitsに作用する。 この形式ではBoxOpが即座に作成され、回路をボディとして付加される。 body、qubits、clbitsのないwithステートメントで使用する。 これが「ビルダー・インターフェース・フォーム」である。QuantumCircuitboxに命令を追加するために、 Pythonwithスコープ内の他のメソッドを使う。 これは好ましい形式であり、エラーの可能性がはるかに低い。
例
ビルダー・インターフェイスを使って2つのボックスを順番に追加する。 この回路の2つのボックスは同時に実行することができ、2つ目のボックスは、量子ビットがアイドル状態であっても、そのボックスの間、量子ビット8へのデータフロー依存性を明示的に挿入する。
from qiskit.circuit import QuantumCircuit, Annotation
class MyAnnotation(Annotation):
namespace = "my.namespace"
qc = QuantumCircuit(9)
with qc.box():
qc.cz(0, 1)
qc.cz(2, 3)
with qc.box([MyAnnotation()]):
qc.cz(4, 5)
qc.cz(6, 7)
qc.noop(8)ボックスの明示的な構造を使って。 これは、上記と同じ回路を作るものであり、なぜ以前の形式がインタラクティブな使用に適しているのかを示すものである。
from qiskit.circuit import QuantumCircuit, BoxOp
body_0 = QuantumCircuit(4)
body_0.cz(0, 1)
body_0.cz(2, 3)
# Note that the qubit indices inside a body related only to the body. The
# association with qubits in the containing circuit is made by the ``qubits``
# argument to `QuantumCircuit.box`.
body_1 = QuantumCircuit(5)
body_1.cz(0, 1)
body_1.cz(2, 3)
qc = QuantumCircuit(9)
qc.box(body_0, [0, 1, 2, 3], [])
qc.box(body_1, [4, 5, 6, 7, 8], [])パラメーター
- body_or_annotations (QuantumCircuit |Iterable[Annotation]) – 最初の位置引数は無名である。 を位置指定で渡すと、その
QuantumCircuitが位置指定で渡された場合、それは即座にボックスのボディとして使用され、qubitsとclbitsも指定されなければならない。 オブジェクトのイテレート可能なイテレートが与えられた場合。Annotationオブジェクトが与えられた場合、このメソッドのコンテキスト・マネージャ形式が起動される。 - qubits (Sequence[QubitSpecifier] | None) – を適用する量子ビットを
BoxOpを適用する。 - clbits (Sequence[ClbitSpecifier] | None) – 明示的な形式で、それを適用する
BoxOp対象。 - label (str | None) – 命令のオプションの文字列ラベル。
- duration (None) – オプションの明示的持続時間
BoxOp. スケジューリングパスは、必要であれば遅延の挿入も含め、与えられた期間に合わせて含まれるスコープをスケジューリングするよう制約される。 - unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – の単位は
duration。 - annotations (Iterable[Annotation]) – ボックスが持つべき
Annotationオブジェクトがあるはずだ。 このメソッドがコンテキスト・マネージャー形式で使われる場合、代わりにこの引数を唯一の位置引数として渡すことができる。
break_loop
break_loop()
適用する BreakLoopOp.
コンテキストマネージャーの「ビルダー」フォームを使用している場合 if_test(), for_loop() または while_loop()を使用している場合、ループコンテキスト内にいるときのみこのメソッドを呼び出すことができる。 そのため、(コンテキスト・マネージャーを使わずに)再利用可能なループ本体を構築しようとする場合は、コンテキスト・マネージャーを使わない形式の if_test() と if_else(). この BreakLoopOp 命令は、直前のスコープだけでなく、ループを含むすべてのリソースにまたがっていなければならない。
戻り値
作成された命令へのハンドル。
レイズ
CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。
戻りの型
continue_loop
continue_loop()
適用する ContinueLoopOp.
コンテキストマネージャーの「ビルダー」フォームを使用している場合 if_test(), for_loop() または while_loop()を使用している場合、ループコンテキスト内にいるときのみこのメソッドを呼び出すことができる。 そのため、(コンテキスト・マネージャーを使わずに)再利用可能なループ本体を構築しようとする場合は、コンテキスト・マネージャーを使わない形式の if_test() と if_else(). この ContinueLoopOp 命令は、直前のスコープだけでなく、ループを含むすべてのリソースにまたがっていなければならない。
戻り値
作成された命令へのハンドル。
レイズ
CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。
戻りの型
for_loop
for_loop(indexset: Iterable[int], loop_parameter: Parameter | None, body: None, qubits: None, clbits: None, *, label: str | None) → ForLoopContext
for_loop(indexset: Iterable[int], loop_parameter: Parameter | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
この回路に for のループを作る。
この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定された引数を持つ ForLoopOpbody を作成する。 body (および qubits と clbits )が渡されない場合、これはコンテキスト・マネージャーとして機能し、入力されるとループ変数を提供し(変数が与えられていない限り、その変数は再利用される)、スコープが終了すると自動的に ForLoopOp を自動的に構築する。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。
例:
from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 1)
with qc.for_loop(range(5)) as i:
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((0, True)):
qc.break_loop()パラメーター
-
indexset (Iterable[int]) – ループする整数のコレクション。 常に必要だ。
-
loop_parameter (Optional[Parameter]) –
indexsetからの値が割り当てられるbody内で使用されるパラメータ。 コンテキスト・マネージャー形式では、この引数が与えられない場合、ループ・パラメーターが割り当てられ、withステートメントの値として返される。 これは、体内で使用される場合にのみ回路に組み込まれる。このメソッドのマニュアル形式でこの引数が
Noneの場合、indexsetの各項目についてbodyが1回繰り返されるが、それらの値は無視される。 -
body (Optional[QuantumCircuit]) – 繰り返し実行されるループ本体。 コンテキスト・マネージャー・モードを使用する場合は省略する。
-
qubits (Optional[Sequence[QubitSpecifier]]) – ループ本体が実行されるべき回路量子ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
-
clbits (Optional[Sequence[ClbitSpecifier]]) – ループ本体が実行されるべき回路ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
-
label (Optional[str]) – 回路内の命令の文字列ラベル。
戻り値
呼び出しのシグネチャに応じて、forループを作成するためのコンテキスト・マネージャー(ブロックの最後で自動的に回路に追加される)、または追加されたループ操作のハンドルが渡される。 InstructionSet または、追加されたループ操作のハンドルである。
戻りの型
InstructionSet または ForLoopContext
レイズ
CircuitError - 誤った呼び出し規約が使用された場合。
if_else
if_else(condition, true_body, false_body, qubits, clbits, label=None)
適用する IfElseOp.
このメソッドは、関連するコンテキスト・マネージャー・フォームを持たない。 if_test() メソッドですでに処理されているからです。 その else の部分を次のように使うことができる:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((bits[2], 0)) as else_:
qc.h(0)
with else_:
qc.x(0)パラメーター
- condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool]) – 回路の実行時にリアルタイムで評価される条件であり、これが真の場合、の評価がトリガー
true_bodyされる。 指定された値との等価性をテストするClassicalRegister値のタプルとして、あるいは値bool``intまたは値のいずれかと比較するClbit値のintタプルとして指定できます。 - true_body (QuantumCircuit) –
conditionが真の場合に実行される回路体。 - false_body (QuantumCircuit) –
conditionが偽の場合に実行される回路。 - qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – if/else文を実行すべき回路クビット。
- clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – if/else文が実行される対象となる回路ビット。
- label (str | None) – 回路内の命令の文字列ラベル。
レイズ
CircuitError - 提供された条件が、包囲回路外のClbitsを参照する場合。
戻り値
作成された命令へのハンドル。
戻りの型
if_test
if_test(condition: tuple[ClassicalRegister | Clbit, int]) → IfContext
if_test(condition: tuple[ClassicalRegister | Clbit, int], true_body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet
この回路で if 。
この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定された を持つ IfElseOptrue_body を作成し、 false の条件に対する分岐はありません( のメソッドも参照してください)。 if_else() メソッドも参照)。 しかし、 true_body (および qubits 、 clbits )が渡されない場合、これはコンテキスト・マネージャーとして機能し、 if ステートメントを構築するために使用することができる。 with ステートメントの返り値は連鎖可能なコンテキスト・マネージャーであり、後続の else ブロックの作成に使用できる。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。
例:
from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Qubit(), Clbit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 1)
with qc.if_test((bits[3], 0)) as else_:
qc.x(2)
with else_:
qc.h(2)
qc.z(2)パラメーター
- condition (Tuple[Union[ClassicalRegister, Clbit], int]) – 回路実行中にリアルタイムで評価される条件。真であれば、
true_bodyの評価がトリガーされる。 指定されたintと等しいかどうかをテストされるClassicalRegisterのタプルとして、またはboolまたはintのいずれかと比較されるClbitのタプルとして指定することができる。 - true_body (Optional[QuantumCircuit]) –
conditionが真の場合に実行される回路体。 - qubits (Optional[Sequence[QubitSpecifier]]) – if/elseを実行する回路の量子ビット。
- clbits (Optional[Sequence[ClbitSpecifier]]) – if/elseを実行する回路ビット。
- label (Optional[str]) – 回路内の命令の文字列ラベル。
戻り値
呼び出しのシグネチャに応じて、 if ブロックを作成するためのコンテキスト・マネージャー(ブロックの最後で自動的に回路に追加される)、または追加された条件付き操作のハンドルがある。 InstructionSet 追加された条件操作のハンドル。
戻りの型
InstructionSet または IfContext
レイズ
- CircuitError - 提供された条件が、包囲回路外のClbitsを参照する場合。
- CircuitError - 誤った呼び出し規約が使用された場合。
戻り値
作成された命令へのハンドル。
switch
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: None, qubits: None, clbits: None, *, label: str | None) → SwitchContext
switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: Iterable[tuple[Any, QuantumCircuit]], qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
この回路に switch/case 構造を作成する。
この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定されたケース構造を持つ SwitchCaseOp を生成します。 cases (および qubits と clbits )が渡されない場合、これはコンテキスト・マネージャーとして動作し、スコープが終了すると自動的に SwitchCaseOp を自動的に構築します。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。
使用例:
from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
qc.h([0, 1, 2])
qc.measure([0, 1, 2], [0, 1, 2])
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.z(1)
with case(case.DEFAULT):
qc.cx(0, 1)パラメーター
- target (Union[ClassicalRegister, Clbit]) – 古典的な値で1つを切り替える。 これは整数のようでなければならない。
- cases (Iterable[Tuple[Any, QuantumCircuit]]) – 大文字小文字の指定子の並び。 各タプルは1つのケース本体(2番目の項目)を定義する。 タプルの最初の項目は、単一の整数値、特別な値
CASE_DEFAULTまたは複数の整数値のタプルである。 各整数値が順番に試され、最初にマッチした整数に対応するボディに制御が移る。CASE_DEFAULTはすべての可能な値にマッチする。 コンテキスト・マネージャー形式では省略。 - qubits (Sequence[Qubit]) – すべてのケースボディが実行される回路量子ビット。 コンテキスト・マネージャー形式では省略。
- clbits (Sequence[Clbit]) – すべてのケースボディが実行される回路ビット。 コンテキスト・マネージャー形式では省略。
- label (Optional[str]) – 回路内の命令の文字列ラベル。
戻り値
コンテキストマネージャーモードで使用する場合は、 with 。このリソースは、switch文のケースを生成するために繰り返し入力できるオブジェクトを返す。 完全な形式が使用される場合、これは作成された命令へのハンドルを返す。
戻りの型
InstructionSet または SwitchCaseContext
レイズ
CircuitError - 誤った呼び出し規約が使用された場合。
while_loop
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: None, qubits: None, clbits: None, *, label: str | None) → WhileLoopContext
while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet
この回路に while のループを作る。
この関数を呼び出すには2つの形式がある。 すべての引数 (label を除く) を指定して呼び出すと、指定された body を持つ WhileLoopOp を作成する。body(およびqubitsとclbits) が *渡されていない* 場合は、コンテキストマネージャーとして動作し、スコープが終了すると自動的に WhileLoopOp` を構築する。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。
使用例:
from qiskit.circuit import QuantumCircuit, Clbit, Qubit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
with qc.while_loop((bits[2], 0)):
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)パラメーター
- condition (Tuple[Union[ClassicalRegister, Clbit], int]) –
bodyを実行する前にチェックされる等号条件。 条件の左辺は必ずClassicalRegisterまたはClbitでなければならず、右辺は整数または真偽値でなければならない。 - body (Optional[QuantumCircuit]) – 繰り返し実行されるループ本体。 コンテキスト・マネージャー・モードを使用する場合は省略する。
- qubits (Optional[Sequence[Qubit]]) – ループ本体が実行されるべき回路量子ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
- clbits (Optional[Sequence[Clbit]]) – ループ本体が実行されるべき回路ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
- label (Optional[str]) – 回路内の命令の文字列ラベル。
戻り値
コンテキストマネージャーモードで使用される場合、これは with リソースとして使用されるべきである。 完全な形式が使用される場合、これは作成された命令へのハンドルを返す。
戻りの型
InstructionSet または WhileLoopContext
レイズ
CircuitError - 誤った呼び出し規約が使用された場合。
noop
noop(*qargs)
操作を追加することなく、与えられた量子ビットを現在のスコープ内で使用されているものとしてマークする。
のトップスコープで呼び出された場合、これは(無効な入力に対して例外を発生させる以外には)何の効果もない。 QuantumCircuit. コントロール・フロー・ビルダー内では、もしその量子ビットがまだ使われていなければ、その量子ビットはコントロール・フロー・ブロックによって "使われる "ことになる。
例:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(3)
with qc.box():
# This control-flow block will only use qubits 0 and 1.
qc.cx(0, 1)
with qc.box():
# This control-flow block will contain only the same operation as the previous
# block, but it will also mark qubit 2 as "used" by the box.
qc.cx(0, 1)
qc.noop(2)パラメーター
*qargs ( Qubit |* QuantumRegister* |* int* |* slice* |* Sequence** [ Qubit | int** ]* ) – 有効な量子ビット指定子の可変長リスト。 ここでは、各引数に対して、量子ビットまたは量子ビットの集合として渡すことができるものはすべて有効です。
レイズ
CircuitError - もし要求された量子ビットが回路に有効でない場合。
has_control_flow_op
回路を他のオブジェクトに変換する
一般的な操作を追加する方法で説明したように、回路を Instruction または Gate に変換できます。
to_instruction
to_instruction(parameter_map=None, label=None)
この回路から Instruction この回路から
circuit_to_instruction()
この方法の根本的な原動力。
パラメーター
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータから命令で使用されるパラメータへの対応付け。 「None」の場合、既存の回路パラメータもこの命令のパラメータとして使用されます。
- label (str | None) – オプションのゲートラベル。
戻り値
この回路をカプセル化した複合命令(次のようになる。
分解された背中)。
戻りの型
to_gate
to_gate(parameter_map=None, label=None)
この回路から Gate この回路から この回路は量子ビットにのみ作用し、ユニタリー演算のみを含んでいなければならない。
circuit_to_gate()
この方法の根本的な原動力。
パラメーター
- parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータからゲートで使用されるパラメータへの対応関係。 その場合
None、既存の回路パラメータもゲートをパラメータ化することになります。 - label (str | None) – オプションのゲートラベル。
戻り値
この回路を内包する複合ゲート(逆分解可能)。
戻りの型
さらに、回路全体を次の DAGCircuit 表現に変換できます:
to_dag
to_dag(*, copy_operations=True)
この回路を.に変換してください DAGCircuit。
これは単純なラッパーです circuit_to_dag()。
パラメーター
copy_operations (bool) – 個々の命令をディープコピーするかどうか。 に設定すると False、操作は安価になるが、DAG内の命令への変更は元の回路に影響を与える。
戻り値
この同じ回路を表す有向非循環グラフ(DAG)。
戻りの型
ヘルパー変異法
には2つの上位メソッドがある。 QuantumCircuit がある。 デフォルトでは、これらのレジスタも追加される。
measure_active
measure_active(inplace=True)
すべての非アイドル量子ビットに測定を追加する。 測定中の非アイドル量子ビットの数に等しいサイズの新しい ClassicalRegister を作成する。
inplace=False の場合、測定値を含む新しい回路を返す。
パラメーター
inplace (bool) – 測定はすべてその場で行うか、新しいサーキットに戻す。
戻り値
inplace = False のとき、測定値を含む回路を返す。
戻りの型
measure_all
measure_all(inplace=True, add_bits=True)
すべての量子ビットに測定値を加える。
デフォルトでは、新しい古典的ビットを ClassicalRegister に新しい古典ビットを追加する。 add_bits=False の場合、測定結果はすでに存在する古典ビットに格納され、量子ビット n は古典ビット n に測定される。
inplace=False の場合、測定値を含む新しい回路を返す。
パラメーター
戻り値
inplace=False のとき、測定値を含む回路を返す。
戻りの型
レイズ
CircuitError - もし add_bits=False 、クラシックのビットが足りない。
にも2つの "減算法 "がある。 QuantumCircuit もある。 これは QuantumCircuit の代わりに copy_empty_like() の代わりに clear()の代わりに remove_final_measurements() をトランスパイラ・パスの形として実行する。 RemoveFinalMeasurements.
clear
clear()
自分の中の指示をすべてクリアにする。
回路をクリアしてもメタデータは残る。
命令を持たず、量子型と古典型のデータをすべて同じように追跡する新しい回路を、元の回路を変異させることなく生成する方法。
戻りの型
なし
remove_final_measurements
remove_final_measurements(inplace=True)
すべての量子ビットの最終的な測定とバリアが存在する場合、それを削除する。 この操作の結果としてアイドルになったこれらの測定値からの値を格納するために使用された古典的レジスタを削除し、削除されたレジスタによってのみ参照される古典的ビット、またはまったく参照されないがこの操作の結果としてアイドルになった古典的ビットを削除する。
測定とバリアは、(他の測定やバリアは別として)その後に他の操作がない場合、最終的なものとみなされる
この方法は、特に新しくアイドル状態になった古典的なビットやレジスタの削除など、かなり複雑な動作をする。 不必要なクラシック・データを後から削除するよりも、最初から追加しない方がはるかに効率的だ。
最終的な計測と障壁を取り除くトランスパイラー・パス。 これは古典的なデータを削除するものではない。 これがあなたのゴールなら、そう呼べばいい:
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import RemoveFinalMeasurements
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.barrier()
qc.measure([0, 1], [0, 1])
pass_ = RemoveFinalMeasurements()
just_bell = pass_(qc)パラメーター
inplace (bool) – すべての測定は、その場で削除するか、新しい回路を戻す。
戻り値
inplace=False の場合、結果の回路を返す。
戻りの型
回路特性
シンプルな回路メトリクス
量子回路を構築する際、回路の "大きさ "やノイズの多い量子デバイス上で実行できる能力を定量化するのに役立ついくつかの特性がある。 これらの中には、量子ビット数のように簡単に理解できるものもあれば、深さやテンソル成分の数のようにもう少し説明が必要なものもある。 ここでは、これらの特性をすべて説明し、実際のデバイスで動作させたときに回路がどのように変化するかを理解するための準備として、それらが変化する条件を強調する。
次の回路を考えてみよう:
from qiskit import QuantumCircuit
qc = QuantumCircuit(12)
for idx in range(5):
qc.h(idx)
qc.cx(idx, idx+5)
qc.cx(1, 7)
qc.x(8)
qc.cx(1, 9)
qc.x(7)
qc.cx(1, 11)
qc.swap(6, 11)
qc.swap(6, 9)
qc.swap(6, 10)
qc.x(6)
qc.draw('mpl')
プロットから、この回路が12個の量子ビットを持ち、ハダマード、CNOT、X、SWAPゲートの集合であることが容易にわかる。 しかし、これをプログラム的に数値化するにはどうすればいいのだろうか? すべての量子ビットに対して同時に単一量子ビットゲートを行うことができるので、この回路の量子ビット数は回路の width() に等しい:
assert qc.width() == 12を使って直接量子ビット数を得ることもできる。 num_qubits:
assert qc.num_qubits == 12量子ビットだけで構成される量子回路の場合、回路の幅は量子ビットの数に等しい。 これは量子コンピューティングで使われる定義である。 しかし、古典的なレジスタと古典的に制御されたゲートを持つより複雑な回路では、この等価性は崩れる。 そのため、今後は量子回路の量子ビット数を幅とは呼ばないことにする。
また、回路内のゲートの数とタイプを取得するのも簡単だ。 count_ops():
qc.count_ops()OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])回路を計算することで、生の操作回数だけを得ることもできる。 size():
assert qc.size() == 19count_ops
depth
depth(filter_function=<function QuantumCircuit.<lambda>>)
リターンサーキットの深さ(クリティカルパスの長さ)。
量子回路の深さとは、その回路で定義された計算を完了するために、量子ゲートを何層並列に実行すればよいかを示す尺度である。 量子ゲートの実装には時間がかかるため、回路の深さは量子コンピューターが回路を実行するのにかかる時間にほぼ対応する。
この動作は、回路にコントロール・フロー動作が含まれている場合、うまく定義できない。
パラメーター
filter_function (Callable[[CircuitInstruction], bool]) – 深さを増やすためにどの命令をカウントするかを決定する関数。 単一の位置指定引数として受け取る必要があります CircuitInstruction。 関数が返す命令は、回路深度 False の計算において無視されます。 デフォルトでは、. Barrierなどの「ディレクティブ」を除外します。
戻り値
回路の深さ。
戻りの型
例
回路全体の深さを簡単に計算できる:
from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(4)
qc.h(0)
qc.cx(0, 1)
qc.h(2)
qc.cx(2, 3)
assert qc.depth() == 2マルチクビットゲートの深さだけを計算するように、前の例を修正する:
assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1get_instructions
num_connected_components
num_connected_components(unitary_only=False)
この回路を因数分解すると、いくつの絡み合わない部分回路になるか。
パラメーター
unitary_only (bool) – グラフのユニタリー部分のみを計算する。
戻り値
回路に接続されている部品の数。
戻りの型
num_nonlocal_gates
num_tensor_factors
num_tensor_factors()
回路のユニタリー(量子)部分のみのテンソル因子の数を計算する。
ノード
これは後方互換性のためであり、Qiskitの将来のリリースでは削除される予定です。 代わりに num_unitary_factors を呼ぶべきである。
戻りの型
num_unitary_factors
size
size(filter_function=<function QuantumCircuit.<lambda>>)
回路の総命令数を返します。
パラメーター
filter_function (callable) – いくつかの命令をフィルタリングする関数。 (Instruction、list(Qubit)、list(Clbit))のタプルを入力とする。 デフォルトでは、バリアやスナップショットのような「ディレクティブ」をフィルタリングする。
戻り値
ゲート操作の総数。
戻りの型
width
スケジュール情報のアクセス
もし QuantumCircuit がトランスパイルパイプラインの一部としてスケジューリングされている場合、個々の量子ビットのタイミング情報にアクセスすることができます。 回路全体のタイミング情報は estimate_duration() メソッドと op_start_times 属性によって取得できます。
estimate_duration
estimate_duration(target, unit='s')
予定されたサーキットの所要時間を見積もる
この方法は、与えられたターゲットから提供された持続時間に基づいて回路内の最長持続時間パスを見つけることにより、回路持続時間の推定値を計算する。 この方法は、制御フローや他の古典的なフィードフォワード演算を持たない単純な回路にのみ有効である。
パラメーター
- target (Target) – インスタンス
Targetもしターゲットに回路内のいずれかの命令の継続時間データがない場合、その命令の継続時間を含むインスタンスQiskitErrorが発生します。 これは、トランスピレーションのターゲットとして使用されるのと同じターゲット・オブジェクトでなければならない。 - unit (str) – 継続時間を返す単位。 デフォルトは秒を表す "s "だが、秒を返すためのSI接頭辞を指定することもできる。 例えば、これを "n "に設定すると、ナノ秒単位で返される。 このタイプでサポートされている値は、"f"、"p"、"n"、"u"、"μ"、"m"、"k"、"M"、"G"、"T"、"P "である。 さらに、"dt "単位の整数を出力するために、"dt "の値も受け入れられる。 これを機能させるには、
targetで "dt "を指定する必要がある。
戻り値
指定された単位の回路のシングルショットの実行にかかる推定時間。
レイズ
QiskitError - 回路がスケジューリングされていない場合、または(パラメータ化された遅延など)推定継続時間の計算を妨げる他の詳細が含まれている場合。
戻りの型
qubit_duration
qubit_duration(*qubits)
与えられた量子ビットの、遅延を除いた最初と最後の命令の開始時刻と停止時刻の間の時間を返す。 時間単位は self.unit。
パラメーター
*qubits ( Qubit | int ) – 量子ビット数 self 含める。
戻り値
非遅延命令の最初の開始時刻から最後の停止時刻までの時間を返す
戻りの型
qubit_start_time
qubit_start_time(*qubits)
与えられた量子ビットの、遅延を除いた最初の命令の開始時刻を返す。 時間単位は self.unit。
量子ビットを超える命令がない場合は0を返す
パラメーター
- * Qubits -
selfに含まれるキュービット。 量子ビットには整数を使用できる - self.qubits. (indices of)
戻り値
遅延を除いた最初の命令の開始時刻を量子ビット数で返す
レイズ
CircuitError - self がまだ予定されていない回線である場合。
戻りの型
qubit_stop_time
qubit_stop_time(*qubits)
与えられた量子ビットの、遅延を除いた最後の命令の停止時間を返す。 時間単位は self.unit。
量子ビットを超える命令がない場合は0を返す
パラメーター
- * Qubits -
selfに含まれるキュービット。 量子ビットには整数を使用できる - self.qubits. (indices of)
戻り値
遅延を除いた最後の命令の停止時間を、量子ビットに渡って返す
レイズ
CircuitError - self がまだ予定されていない回線である場合。
戻りの型
抽象回路と物理回路
回路は、量子アルゴリズムのかなり低レベルの抽象化である。 しかし、その中にも違いは存在する。 量子プログラマーは、多くの場合、多種多様なゲートや命令を使用したいと考えており、すべての量子ビットが互いに相互作用する環境で作業を行う。 しかし、量子ハードウェアは通常、利用できるネイティブゲートが限られており、特定のペアのハードウェア量子ビット同士しか相互作用できない。 これら2つの仕組みを、それぞれ「抽象回路」と「物理回路」と呼ぶ。
Qiskitには、物理的な回路を区別する2つの方法があります。 これは歴史的な理由から、あいまいなチェックになっている。もともとQiskitはこの区別をまったくしていなかった(だから transpile() がそう呼ばれ、 compile! と呼ばれないのはそのためである)。 最も明確な方法は layout この属性がセットされている場合、回路は物理的であることを意図している。 より古い、より暗黙的な方法は、オブジェクトのメタデータである。 Qubit オブジェクトと QuantumRegister インスタンスのメタデータである。 この量子レジスタは q と呼ばれ、インデックス順にすべての回路の量子ビットを所有する。 繰り返しになるが、歴史的な理由から、これはデフォルトコンストラクタの QuantumCircuit(int [, int]) 。
通常は QuantumCircuit を作成し、(量子ビットのメタデータに関係なく)抽象的な意味でそれを構築する。 次に transpile() を呼び出して回路をコンパイルし、ハードウェアがサポートする回路にする。 しかし、最初からハードウェア的に効率的な回路を書きたい場合には、コンパイル・インフラ全体をショートカットできる ensure_physical() メソッドを使用する。 これにより、初期量子ビットメタデータをどのように定義しても、回路が物理的であるとみなされるためのすべての要件が満たされ、量子ビットインデックスがハードウェア量子ビットにマッピングされることが保証されます。
仮想から物理へのマッピングと配線の選択をより完全に制御するには、プリセット・コンパイル・パイプラインのレイアウトと配線 <transpiler-preset-stage-routing> のステージを参照してください。
ensure_physical
ensure_physical(num_qubits=None, *, apply_layout=True)
この回路を、与えられた量子ビット数で、正規の物理的な形にする。
いくつかのQiskitトランスパイラ・パスは、物理的量子ビットで定義された回路に適用した場合にのみ意味を持つ。 量子ビットインデックスが物理量子ビットに対応する回路を手動で構築した場合、この関数を使用して回路のメタデータが正規の物理形式と一致することを確認します。 これは、量子ビットデータを "q" と呼ばれる1つのレジスタに置き換えることを意味する。 layout フィールドを設定することである。
回路がまだレイアウトを持っていない場合、この方法( apply_layout=True )は、プリセット・コンパイル・パイプラインのフル・トリビアル・レイアウト法を適用するのと等価である。
回路がすでに正規の物理的なものであれば、何も起こらない。 このメソッドでは、回路内の量子ビットの数を変更することはできない。 layout セットを持っている場合、このメソッドは回路の量子ビット数を変更できない。
パラメーター
- num_qubits (int | None) – もし与えられたら、このサイズまでアンシラで回路を拡張する。 アンシラは常に回路の最上位量子ビット・インデックスとなる。 もし与えなければ(デフォルト)、回路は同じ幅のままです。 このオプションは、回路がすでに
layout. - apply_layout (bool) – もしtrue(デフォルト)なら
layout属性を適切に設定し、回路が幅num_qubitsのバックエンドに対して、アンシラ拡張を含む "trivial "レイアウトでレイアウトされたように見えるようにする。 これは、その回路がすでに.layout.
戻り値
回路が物理的に変更されたかどうか。
レイズ
- ValueError -
num_qubitsが回路に対して小さすぎる場合。 - CircuitError -
num_qubits、回路を拡張しようとするが、回路にはすでにレイアウトが設定されている場合。
戻りの型
命令型メソッド
QuantumCircuit にも、ごく少数のメソッドが含まれている。 Instruction-のようなメソッドも含まれている。 最初に回路を Instruction (to_instruction())または Gate (to_gate())に変換し、対応するメソッドを呼び出せば、よりよい統合とより多くのAPIサポートが得られるかもしれません。
control
control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)
この回路の管理バージョンを返す。
元の回路はゲートに変換され、結果として得られる回路にはこのゲートの制御版が含まれる。 この制御ゲートは、 Falseが annotated の場合に ControlledGate として実装され、がの場合に AnnotatedOperationannotated として実装される True。
qiskit.circuit.quantumcircuit.QuantumCircuit.control()’の引数は、Qiskit 2.3annotated 以降で非推奨となっています。 Qiskit では削除されます。 3.0 QuantumCircuit.controlメソッドは、annotated=Noneを受け付けなくなりました。 新しいデフォルトはannotated=Trueです。これにより、新しい量子回路内の制御ゲートは AnnotatedOperation として表現されます(専用の制御ゲートクラスが既に存在しない場合)。 以前の動作を維持するには、明示的にannotated=Falseを設定できます。 ただし、annotated=Trueの使用が推奨されます。これにより制御回路の構築がトランスパイラに委ねられ、さらに追加の制御ゲート最適化が可能となるためです(通常、より高品質な回路につながります)。
パラメーター
- num_ctrl_qubits (int) – 追加するコントロールの数。 デフォルトは
1です。 - label (str | None) – 可視化のために制御ゲートに付与するオプションのラベル。 デフォルトは
Noneです。 制御ゲートがアノテーション付き操作として実装されている場合は無視される。 - ctrl_state (str |int | None) – ゲートの制御状態。整数またはビット列(例:
"110")として指定される。 デフォルトではNone、全ビットが1の状態になります2**num_ctrl_qubits - 1。 - annotated (bool | None) – 制御ゲートを制御ゲートとして実装するか、注釈付き操作として実装するかを示します。
戻り値
この回路の制御バージョン。
戻りの型
レイズ
CircuitError - 回路に非単位動作が含まれ、制御できない場合。
inverse
inverse(annotated=False)
この回路を反転させる。
これは、すべてのゲートを再帰的に反転させることによって行われる。
パラメーター
annotated (bool) – は、逆ゲートが注釈付きゲートとして実装できるかどうかを示す。
戻り値
反転回路
戻りの型
レイズ
CircuitError - 回路が反転できない場合
例
を入力する:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘出力:
┌───┐
q_0: ──────■──────┤ H ├
┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
└───────────┘power
power(power, matrix_power=False, annotated=False)
この回路を power のべき乗にする。
power が正の整数で、 matrix_power と annotated の両方が False の場合、この実装ではデフォルトで repeat を呼び出す。 そうでない場合は、回路はゲートに変換され、このゲートを所定のべき乗に引き上げた新しい回路が返される。 与えられたべき乗に引き上げられたゲートは、 annotated が False の場合はユニタリーゲートとして、 annotated が True の場合は注釈付き演算として実装される。
パラメーター
- power (float) – この回路を引き上げる力。
- matrix_power (bool) – は、内部パワーゲートがユニタリーゲートとして実装可能かどうかを示す。
- annotated (bool) – は、内側のパワーゲートが注釈付き操作として実装できるかどうかを示す。
レイズ
CircuitError - 回路をユニタリーゲートに変換する必要があるが、ユニタリーでない場合。
戻り値
この回路を実装した回路は、 power のべき乗になる。
戻りの型
repeat
reverse_ops
reverse_ops()
指示の順序を逆にして回路を反転させる。
これは、すべての命令を再帰的に反転させることによって行われる。 ゲートを反転(アジョイント)することはない。
戻り値
逆回路。
戻りの型
例
を入力する:
┌───┐
q_0: ┤ H ├─────■──────
└───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
└──────────┘出力:
┌───┐
q_0: ─────■──────┤ H ├
┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
└──────────┘視覚化
Qiskitには、回路がどのように見えるかを手早く感じるための描画ツールがいくつか含まれています。 このツールは、主に Matplotlib - またはテキストベースの図面を作成することを主な対象としています。 また、 LaTeX のバックエンドもあるが、これは単純な回路を描くためのもので、あまり活発にメンテナンスされていない。
Qiskitのすべての視覚化ツールの主要ドキュメント。
draw
draw(output=None, scale=None, filename=None, style=None, interactive=False, plot_barriers=True, reverse_bits=None, justify=None, vertical_compression='medium', idle_wires=None, with_layout=True, fold=None, ax=None, initial_state=False, cregbundle=None, wire_order=None, expr_len=30, measure_arrows=None, barrier_label_len=16)
量子回路を描く。 出力パラメータを使用して、描画形式を選択します:
text
コンソールで表示できるASCIIアート TextDrawing。
mpl
matplotlibを使用して Python のみで色を表現した画像。
latex
LaTeX を通じて収集された高品質な画像。
これは設計上、任意のユーザー入力 pdflatex に対してインストール済みのシステム版を呼び出すことになっています(例:でカスタムコードを Instruction.labelレンダリングする場合など)。したがって、信頼できる入力に対してのみ使用してください。
latex_source
LaTeX の未コンパイルの生出力。 これは、描画 latex プログラムによって描画される内容のソースです。
条件と Expr コンディションと SwitchCaseOp.target フィールドのノードのサポートは予備的なものであり、不完全なものである。 text 、 mpl のドロワーは、データの依存関係を表示するために最善の努力をするが、 LaTeX-based のドロワーは、これらの依存関係を完全にスキップする。
パラメーター
-
output (str | None) – 回路の描画に使用する出力方法を選択します。 有効な選択肢は
text,mpl,latex,latex_sourceです。デフォルトでは、ユーザー設定ファイル(通常は~/.qiskit/settings.conf)に代替バックエンドがデフォルトとして設定されていない限り、textドロワーが使用されます。 例えば、circuit_drawer = latexです。 出力kwargが設定されている場合、ユーザー設定ファイルのデフォルトよりも、そのバックエンドが常に使用される。 -
scale (float | None) – 描画する画像のスケール(
< 1.0の場合は縮小)。mpl、latex、latex_source出力でのみ使用される。 デフォルトは1.0。 -
filename (str | None) – 画像を保存するファイルパス。 デフォルトは
None(結果はファイルに保存されない)。 -
スタイル名、スタイルJSONファイルのファイル名、またはスタイルを指定する辞書。
- 対応するスタイル名は
"iqp"(デフォルト)、"iqp-dark"、"clifford"、"textbook"、"bw"。 - JSONファイルが与えられた場合、例えば
my_style.jsonまたはmy_style(拡張子.jsonは省略可)、この関数はその場所からスタイル辞書の読み込みを試みます。 JSONファイルは、視覚化の仕様を完全に指定しなければならないことに注意してください。 ファイルはqiskit/visualization/circuit/styles、現在の作業ディレクトリ、および~/.qiskit/settings.confで指定された場所で検索される。 - 辞書が指定されている場合、各エントリはデフォルトの設定を上書きします。 キー
"name"が指定された場合、そのスタイルに基づいてデフォルトの設定が適用されます。 たとえば、スタイル{"name": "textbook", "subfontsize": 5}``"textbook"を読み込み、サブフォントサイズ(ゲートの角度など)を に設定します5。 Noneの場合はデフォルトのスタイル"iqp"が使用され、指定された場合は~/.qiskit/settings.confで指定されたデフォルトのスタイルが使用されます。
- 対応するスタイル名は
-
interactive (bool) –
Trueに設定すると、回路を新しいウィンドウで表示します( の場合、これは使用している matplotlib バックエンドがサポートしているかどうかに依存します)。mpltextまたはlatex_source出力タイプで使用された場合、これは何の効果もなく、静かに無視されることに注意。 デフォルトはFalse。 -
reverse_bits (bool | None) –
Trueに設定すると、出力可視化のためにレジスタ内のビット順序を逆にする。 ユーザー設定ファイル(通常は~/.qiskit/settings.conf)に別の値が設定されていない限り、デフォルトはFalseです。 例えば、circuit_reverse_bits = Trueです。 -
plot_barriers (bool) – 出力回路の描画バリアを有効/無効にする。 デフォルトは
Trueです。 -
justify (str | None) – オプションは
"left"、"right"、"none"(str)。 それ以外が指定された場合は、左寄せが代わりに使われる。 オプションがある場合、出力回路のどこにゲートを配置すべきかを指す。noneその結果、各ゲートはそれぞれの列に配置される。 デフォルトはleft。 -
vertical_compression (str | None) –
highmediumまたは。lowテキスト出力によって生成された線を統合するので、描画の縦方向のスペースが小さくなる。 デフォルトはmedium。text出力でのみ使用され、それ以外は無視される。 -
idle_wires (bool |str | None) – 出力の可視化に、未使用の配線(回路要素のない配線)を含めるか(含めないか)。 文字列
"auto"も可能です。この場合、回路にレイアウトが添付されていない限り、未使用の配線が表示されます。 ユーザー設定ファイル(通常は~/.qiskit/settings.conf)に別の値が設定されていない限り、デフォルト"auto"は です。 例えば、circuit_idle_wires = Falseです。 -
with_layout (bool) – 物理的なレイアウトにラベルを貼り、レイアウト情報を含める。 デフォルトは
Trueです。 -
fold (int | None) – ページネーションを設定する。 -1 を使って無効にすることができる。
textでは、線の長さを設定する。 これは、図面がコンソールに収まらない場合に便利である。 None (デフォルト) の場合、shutil.get_terminal_size()を使ってコンソールの幅を推測しようとします。 ただし、jupyterで実行する場合、デフォルトの行の長さは80文字に設定されている。mplでは、折りたたむ前の(視覚的な)レイヤーの数である。 デフォルトは25。 -
ax (Any | None) – mplバックエンドのみで使用されます。 可視化出力に使用するオプションの
matplotlib.axes.Axesオブジェクト。 指定がない場合、新しいmatplotlib Figureが作成され使用されます。 また、指定された場合、冗長であるため図は返されません。 -
initial_state (bool) – 量子ビットワイヤーの先頭に 、古典的なワイヤーに 。 デフォルトは
Falseです。 -
cregbundle (bool | None) –
Trueに設定すると、古典的なレジスタを束ねる。outputが"text"に設定されている場合を除き、デフォルトはTrueである。 -
wire_order (list[int] | None) – ビットの表示の順番を変更するための整数のリスト。 このリストには、0から(
num_qubits+num_clbits)までの範囲のビットを持つ、各ビットのエントリーがなければならない。 -
expr_len (int) – の条件に
Exprの条件にControlFlowOp. この数を超えると、文字列はその数で切り捨てられ、末尾に「...」が追加される。 -
measure_arrows (bool | None) – 「True」の場合、各小節ボックスから、小節値が配置されているクラシックビットまたはレジスタまで矢印を描画します。 Falseの場合、矢印は描画せず、代わりに小節枠にビットまたはレジスタの名前を表示します。 ユーザー設定ファイル(通常は
~/.qiskit/settings.conf)に別の値が設定されていない限り、デフォルトTrueは です。 例えば、circuit_measure_arrows = Falseなどです。 -
barrier_label_len (int) – 出力回路でラベル
Barrierとして表示する文字数。 この文字数を超えた場合、文字列はその文字数で切り詰められ、末尾に「…」が追加されます。
戻り値
TextDrawing または matplotlib.figure または PIL.Image または str:
-
TextDrawing(ifoutput='text')アスキーアートとして印刷できるドローイング。
-
matplotlib.figure.Figure(ifoutput='mpl')回路図の matplotlib figure オブジェクト。
-
PIL.Image(ifoutput='latex')回路図のイメージのメモリ内表現。
-
str(ifoutput='latex_source')回路図を視覚化するための LaTeX のソースコード。
レイズ
- VisualizationError - 無効な出力方法が選択された場合
- ImportError - 出力メソッドがインストールされていないライブラリを必要とする場合。
例
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
コア draw() ドライバに加えて、2つの視覚化関連のヘルパーメソッドがあります。これらは主に、いくつかの内部命令を素早くアンラップしたり、描画中の量子ビットのラベル付け規則を逆にしたりするのに便利です。 基底ゲートの書き換えを含む、より一般的な変異については、トランスパイラ(qiskit.transpiler).
decompose
decompose(gates_to_decompose=None, reps=1)
この回路で分解パスを呼び出し、1レベルを分解する(浅い分解)。
パラメーター
- gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – 分解対象とするゲートの任意の部分集合。 ゲートタイプ(例
HGate:)や、ゲート名(例:「h」)、ゲートラベル(例:「My H Gate」)、あるいはこれらを任意に組み合わせたリストを指定できます。 ゲート名が入力された場合、その名前のゲートは、ラベルの有無にかかわらずすべて展開されます。 デフォルトでは、回路内のすべてのゲートが対象となります。 - reps (int) – 回路を分解する回数は任意である。 例えば、
reps=2は、circuit.decompose().decompose()を呼び出すことに等しい。
戻り値
1レベル分解回路
戻りの型
reverse_bits
reverse_bits()
配線の順序を逆にした回路を返す。
回路は "垂直に "反転している。 回路が複数のレジスタにわたって定義されている場合、結果として得られる回路は同じレジスタを持つが、その順序は反転する。
この方法は、リトルエンディアンで書かれた回路をビッグエンディアンと等価なものに変換するのに便利である。
戻り値
ビットの順序を逆にした回路。
戻りの型
例
を入力する:
┌───┐
a_0: ┤ H ├──■─────────────────
└───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
└───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
└───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
└───┘┌─┴─┐
b_1: ────────────────────┤ X ├
└───┘出力:
┌───┐
b_0: ────────────────────┤ X ├
┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
└───┘パラメーター