Skip to main content
IBM Quantum Platform

QuantumCircuit クラス

class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

ベース: 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ラジアン単位で測定される回路のグローバル位相。
metadataQiskitがトランスパイラを通して保持するが、それ以外は完全に無視する任意のユーザーマッピング。
name回路のオプションの文字列名。
不変のデータ属性
サマリー
ancillasのリスト AncillaQubit回路によって追跡される
cregsのリスト ClassicalRegister回路によって追跡される
clbitsのリスト Clbit回路によって追跡される
dataCircuitInstructionこの回路を構成する個々の要素の一覧。
_dataPython - 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回路内のコンパイル時の「 Parameters」の数。
num_qubits回路内の量子ビット数。
num_vars外側回路スコープ内のリアルタイム古典変数の総数。
num_stretches外回りのスコープにおけるストレッチの総数。
num_identifiers外回りの変数とストレッチの総数。
op_start_timesトランスパイラ・パスのスケジューリングによって追加される、スケジュールされたオペレーションの開始時刻。
parameters回路によって追跡されるコンパイル時の Parameters に対する、順序付き集合のようなビュー。
qregsのリスト QuantumRegister回路によって追跡される
qubitsのリスト Qubit回路によって追跡される
unitフィールドの単位。 duration フィールドの

data中核となる属性は です。 CircuitInstructionこれは、s を順序付けられた形で公開する、シーケンスのようなオブジェクトです。 append()通常、このオブジェクトを直接変更すべきではありません。 QuantumCircuit これは追加専用操作のみを想定して設計されています(その場合は を使用してください)。 _data回路をその場で変更する操作のほとんどは、トランスパイラ・パス (qiskit.transpiler) として記述する必要があります。C API は、と呼ばれる内部オブジェクトとやり取りしますが、これは、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それに加えて、回路が制御可能な を Gate 記述するために用いられる場合、その回路の は global_phase 出力に何らかの影響を及ぼす可能性がある。 これはラジアン単位で測定され、直接設定可能です。

global_phase

ラジアン単位の電流回路スコープのグローバル位相。

例

from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)
0.0
from numpy import pi

circuit.global_phase = pi/4
print(circuit.global_phase)
0.7853981633974483

回路の は name 、 および to_gate() の Instruction 呼び出しによって to_instruction() 生成される または 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回路上の命令に含まれるコンパイル時パラメータは、. で利用可能です。 setassign_parameters()ParameterVectorこれには(の場合を除き、主に辞書順の)正規の順序があり、これはのリスト形式を使用する際にパラメータが割り当てられる順序と一致するだけでなく、-のような定数時間でのメンバーシップ判定もサポートしています。

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

数値順の並べ替えを尊重するには、a 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() に設定されます。

SwapGateTargetこの transpile() 関数によって生じる順列には2種類あります。1つは、で選択された物理量子ビットに基づいて量子ビットの配置を並べ替える初期配置であり、もう1つは、ルーティング中に挿入されたsによって生じる出力順列である最終配置です。

例

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.

バージョンから非推奨 1.3.0

プロパティ qiskit.circuit.quantumcircuit.QuantumCircuit.duration は Qiskit 1.3.0 で非推奨となりました。 Qiskit 3.0.0 で削除されます。

unit

単位 duration で指定される。

バージョンから非推奨 1.3.0

プロパティ 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: 1

num_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: 1

num_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=())

GitHub

のデフォルトコンストラクタです。 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 qubits
      • QuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
    • オブジェクトを含む Bit オブジェクトのコレクション Bit のコレクションが回路に追加されます。

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

GitHub

回路をコピーする。

パラメーター

name (str) – コピーされた回路に与えられる名前。 Noneの場合、名前はそのまま。

戻り値

現在の回路のディープコピー

戻りの型

QuantumCircuit

同様に、同じデータオブジェクト(ビット、レジスタ、変数など)をすべて含み、命令を一切含まない回路を作成したい場合は、 copy_empty_like(). を使用できます。 回路の新しい層を構築して、 compose()それを裏面に転写したり、回路の指令を完全に書き換えたりする場合、これはよくあることです。

copy_empty_like

copy_empty_like(name=None, *, vars_mode='alike')

GitHub

同じ構造を持つが空の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の空のコピー。

戻りの型

QuantumCircuit

CircuitInstruction場合によっては、回路コンテキスト全体とは別に s のリストを生成し、それに基づいて回路を構築するのが最も便利なこともあります。 コンストラクタは from_instructions() 、命令内で使用されているすべての Qubit および Clbit のインスタンスを自動的に取得し、適切なリソースとすべての命令を持つ新しい QuantumCircuit オブジェクトを作成します。

from_instructions

static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)

GitHub

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

QuantumCircuit のインポーターのレガシー・ラッパーである2つのコンストラクター・メソッドもまだ持っている。 qiskit.qasm2. これらは、従来の互換性設定を自動的に適用します。 load() そして loads()。

from_qasm_file

static from_qasm_file(path)

GitHub

OpenQASM 2.0 プログラムをファイルから読み込み、以下のインスタンスに変換する。 QuantumCircuit.

パラメーター

path (str |PathLike) – OpenQASM 2 プログラムのファイルへのパス

戻り値

OpenQASM 2. 入力された QuantumCircuit オブジェクト。

戻りの型

QuantumCircuit

関連資料

qasm2.load()OpenQASM 2インポーターへの完全なインターフェース。

from_qasm_str

static from_qasm_str(qasm_str)

GitHub

OpenQASM 2.0 プログラムを含む文字列を、次のように変換する。 QuantumCircuit.

パラメーター

qasm_str (str) – OpenQASM 2.0 プログラムを含む文字列。

戻り値

OpenQASM 2 入力に対する QuantumCircuit オブジェクト

戻りの型

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_bits(bits)

GitHub

回路にビットを追加する。

警告

量子回路に既存の layout 属性がある場合 Qubit を追加しても、量子ビットの数が増えるだけです。 レイアウトは更新されない。

パラメーター

bits (Iterable[Bit])

戻りの型

なし

レジスタは add_register(). この方法では、ビットの一部がすでに回路に存在していてもエラーにはならない。 この場合、レジスタはビットの「エイリアス」となる。 これは一般的にハードウェアバックエンドではあまりサポートされていない。 あるビットが入っているレジスタは find_bit().

add_register

add_register(*regs)

GitHub

レジスタを追加する。

警告

量子回路に既存の 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)

GitHub

この回路に、自動記憶とスコープを持つ古典変数を追加する。

変数は回路の最初に "宣言 "されたものとみなされるが、初期化されるのはこのメソッドを呼び出した時点なので、それ以前に定義された変数に依存することができる。

パラメーター

  • name_or_var (str |Var) – 変数名の文字列、または再利用する Var 既存のインスタンスのいずれか。 変数は、回路内で既に使用されている名前を隠蔽することはできません。

  • initial (Any) –

    この変数を初期化する値。 最初の引数が文字列名で与えられた場合、結果の変数の型は最初の式から推測される。 Var.new() を使って手動で希望の型を持つ新しい変数を作成するか、あるいは expr.cast() を使って初期化子を希望の型にキャストします。

    これは Expr ノードか、 expr.lift を使って1つにリフティングできる値でなければならない。

戻り値

作成された変数。 もし Var インスタンスが与えられた場合は、まったく同じオブジェクトが返される。

レイズ

CircuitError - 既存の識別子をシャドウイングするために変数を作成できない場合。

戻りの型

Var

例

名前とイニシャライザー式だけで新しい変数を定義する:

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

GitHub

変数を回路の入力として登録する。

パラメーター

  • name_or_var (str |Var) – 文字列名、または入力変数として使用する既存の Var ノードのいずれか。
  • 型 - 名前が文字列で指定された場合、これは変数に使用する Type でなければならない。 変数に既存の Varとして与えられた場合、これは与えてはならず、代わりにオブジェクト自体から読み込まれる。
  • type_ (Type | None)

戻り値

作成された変数、または渡された変数と同じ変数。

レイズ

CircuitError - 既存の変数をシャドウイングするために変数を作成できない場合。

戻りの型

Var

add_stretch

add_stretch(name_or_stretch)

GitHub

この回路をスコープとする新しいストレッチを宣言する。

パラメーター

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

GitHub

イニシャライザを持たない変数を追加する。

ほとんどの場合 add_var() を使って変数を初期化する。 この関数を使うには、すでに Var というのも、この関数の使用は通常、コピーの文脈でのみ意味をなすからである。

警告

Qiskitは、初期化されていない変数が実行時にどのように評価されるかを一切保証しておらず、ハードウェアによってはこれをエラーとして拒否する場合があります。

この関数は慎重に扱うべきであり、プログラム的に2つの同じような回路を再構築する特別な場合にのみ役立つ低レベルのプリミティブである。

パラメーター

var (Var) – 追加する変数。

add_capture

add_capture(var: Var)

add_capture(stretch: Stretch)

GitHub

スコープから取り込むべき識別子を回路に追加する。

この方法には Var または Stretch ノードが必要で、これは識別子へのハンドルを持っていることを強制する。

これは低レベルのメソッドであり、コントロール・フロー操作を手動で構築する場合にのみ真に役立つ。 with 制御フローのスコープにビルダー・インターフェースを使用している場合、このメソッドを呼び出す必要は通常ありません。 if_test() やその他のスコープ構文) を使用している場合は、このメソッドを呼び出す必要はありません。 ビルダー・インターフェイスは、スコープ内で使用されている識別子をキャプチャすることで、あなたの代わりに自動的に内部スコープをクロージャにします。

パラメーター

var (Union[expr.Var, expr.Stretch]) – スコープからキャプチャする変数またはストレッチを指定します。

レイズ

CircuitError - 既存の識別子をシャドウイングするために識別子を作成できない場合。

ビットとレジスタの操作

インスタンス Bit は、それ自体としては、単に回路がそれぞれのコンテキストで使用する一意のハンドルに過ぎません。 インスタンスと回路があれば、Bit を使用して find_bit()、そのビットが存在するコンテキスト(回路内での整数インデックスや、そのビットが含まれるレジスタなど)を確認できます。

find_bit

find_bit(bit)

GitHub

ある回路を参照するために使用できる回路内の位置を見つける。 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)

GitHub

この回路がレジスタrを持っているかどうかをテストする。

パラメーター

register (Register) – 量子レジスターか古典レジスターか

戻り値

レジスタがこの回路に含まれていれば真。

戻りの型

bool

コンパイル時パラメータの操作

関連資料

コンパイル時のパラメトリゼーション

コンパイル時パラメトライゼーションとは何か、そしてそれが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

GitHub

新しいパラメータや値にパラメータを割り当てる。

が辞書として渡される場合 parameters 、そのキーは現在の回路内のインスタンスである Parameter 必要があります。 辞書の値は、数値または新しいパラメータオブジェクトのいずれかになります。

がリストまたは配列として渡された場合 parameters 、その要素は、アルファベット順に並べ替えられた順序(ただし、のオブジェクト内の ParameterVector 順序は尊重される)で parameters 、現在のパラメータに割り当てられます。

値は、現在の回路オブジェクトまたはそのコピーに割り当てることができる。

注

get_parameter()がマッピングとして指定される場合 parameters 、パラメータ名の文字列をキーとして使用することが可能です。これらは を使用して検索されます。 キーがインスタンスである ParameterVector 場合もあります。その場合は、辞書の値は、そのベクトルと同じ長さの値のシーケンスである必要があります。

flat_input=Falseこれらのケースのいずれかを使用する場合は、設定をそのままにしておく必要があります。これをに変更すると、 True ファストパスが有効になり、すべてのキーが Parameter インスタンスでなければなりません。

パラメーター

  • parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – 新しいパラメータ値を指定する辞書または反復可能オブジェクト。
  • inplace (bool) – Falseの場合、バインドされたパラメータを含む回路のコピーが返されます。 Trueの場合、回路インスタンス自体が変更されます。
  • {parameter: value}flat_input (bool) – もし True が parameters 写像型であるならば、それは の写像であるとみなされる。 get_parameter()デフォルトでは(False)、マッピングには、対応する値のシーケンスを指すキーが含ま ParameterVector れている場合があり、これらはマッピング中に展開されます。また、文字列キーが含まれている場合は、これらは を使用して インスタンス 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 やその他の外部フォーマットとの相互運用時に生じる問題を回避するため、同じ名前のパラメータを複数持つことを禁止しています。 と get_parameter() を使用 has_parameter() すると、指定された文字列名のパラメータについて回路に問い合わせることができます。

has_parameter

has_parameter(name_or_param, /)

GitHub

この回路にパラメータ・オブジェクトが存在するかどうかをチェックする。

パラメーター

name_or_param (str |Parameter) – パラメータ、または確認対象のパラメータ名。 Trueこれがノード Parameter である場合、この関数がを返すためには、パラメータが指定されたものと完全に一致していなければなりません。

戻り値

この回路でマッチングパラメータが割り当て可能かどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_parameter()

Parameter この回路から、名前でインスタンスを取得します。

QuantumCircuit.has_var()

Parameterこれと似た手法ですが、コンパイル時の変数ではなく、実行 expr.Var 時の変数を対象としています。

get_parameter

get_parameter(name: str, default: T) → Parameter | T

get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter

GitHub

この回路スコープでアクセス可能なコンパイル時のパラメータを名前で取得する。

パラメーター

  • 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
関連資料

get_var()

これと似た手法ですが、コンパイル時のパラメータではなく Parameter 、実行時の変数を対象 expr.Var としています。

リアルタイム入力された古典的データを用いた作業

関連資料

qiskit.circuit.classical

変数、式、型システムの仕組み、それらを表現するためのオブジェクト、利用可能な古典的操作について、モジュール・レベルのドキュメント。

リアルタイム古典計算

リアルタイム・データがデータ・モデル全体にどのように適合するかについての議論。 qiskit.circuit データ・モデル全体として

データオブジェクトの追加

新しい Var または Stretch 識別子を追加するためのメソッド。

回路に付けられた識別子(例えば 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

GitHub

この回路スコープでアクセス可能な変数を名前で取得する。

パラメーター

  • 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 None
関連資料

get_parameter()

同様の方法ですが、実行時変数ではなく expr.Var 、コンパイル時パラメータを対象 Parameter としています。

get_stretch

get_stretch(name: str, default: T) → Stretch | T

get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch

GitHub

この回路スコープでアクセス可能なストレッチを名前で取得する。

パラメーター

  • 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 None

get_identifier

get_identifier(name: str, default: T) → Var | Stretch | T

get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch

GitHub

この回路スコープでアクセス可能な識別子を名前で取得する。

これには現在、リアルタイムのクラシック変数とストレッチの両方が含まれている。

パラメーター

  • name (str) – 取得する識別子の名前。
  • default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、 KeyError 代わりに が発生します。

戻り値

対応する変数。

レイズ

KeyError - デフォルトが与えられていないが、識別子が存在しない場合。

関連資料

get_var()

インスタンスであることが分かっている識別子を取得する。 expr.Var インスタンスです。

get_stretch()

インスタンスであることが分かっている識別子を取得する。 expr.Stretch インスタンスです。

get_parameter()

同様の方法ですが、実行時変数ではなく expr.Var 、コンパイル時パラメータを対象 Parameter としています。

has_var

has_var(name_or_var, /)

GitHub

変数がこのスコープでアクセス可能かどうかをチェックする。

パラメーター

name_or_var (str |Var) – 変数、または確認する変数の名前。 これが expr.Var ノードである場合、この関数がを返すためには True、変数が与えられたものと完全に一致していなければならない。

戻り値

マッチする変数にアクセスできるかどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_var()

この回路から expr.Var この回路からインスタンスを名前で取得する。

QuantumCircuit.has_parameter()

Parameterこれと似た手法ですが、実行 expr.Var 時の変数ではなく、コンパイル時の変数を対象としています。

has_stretch

has_stretch(name_or_stretch, /)

GitHub

ストレッチがこのスコープでアクセス可能かどうかをチェックする。

パラメーター

name_or_stretch (str |Stretch) – ストレッチ、または確認すべきストレッチの名前 これが expr.Stretch ノードである場合、この関数がを返すためには True、伸長が与えられたものと正確に一致しなければならない。

戻り値

マッチするストレッチにアクセスできるかどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_stretch()

この回路から expr.Stretch この回路からインスタンスを名前で取得する。

has_identifier

has_identifier(name_or_ident, /)

GitHub

識別子がこのスコープでアクセス可能かどうかを調べる。

パラメーター

name_or_ident (str |Var |Stretch) – インスタンス、または確認する識別子の名前。 これが または expr.Stretch expr.Var ノードである場合、一致したインスタンスは指定されたものと完全に一致しなければ、この関数は を返す True。

戻り値

マッチする識別子がアクセス可能かどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_identifier()

を取得する。 expr.Var または expr.Stretch インスタンスを取り出す。

QuantumCircuit.has_var()

このメソッドと同じだが、ランタイムの expr.Var 変数でないものは無視する。

QuantumCircuit.has_stretch()

このメソッドと同じだが、ランタイムの expr.Stretch 変数でないものは無視する。

QuantumCircuit.has_parameter()

Parameterこれと似た手法ですが、実行 expr.Var 時の変数ではなく、コンパイル時の変数を対象としています。

また、回路が追跡する識別子の全セットを取得するために使用できるイテレータ・メソッドもいくつかある。 および 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()

GitHub

この回路のスコープ内にあるすべてのリアルタイム・クラシック変数の反復可能値を取得する。

このメソッドは、スコープ内のすべての変数を繰り返し処理する。 より細かいイテレータについては iter_declared_vars(), iter_input_vars() および iter_captured_vars().

戻りの型

イテラブル[* ヴァール]*

iter_stretches

iter_stretches()

GitHub

この回路内のすべてのストレッチを反復可能な形で取得する。

このメソッドは、スコープ内のすべてのストレッチを繰り返し処理する。 より細かいイテレータについては iter_declared_stretches() と iter_captured_stretches().

戻りの型

イテラブル[* ストレッチ]*

iter_input_vars

iter_input_vars()

GitHub

この回路スコープの入力として宣言されているすべてのリアルタイム・クラシック変数を反復可能な形で取得する。 これは、ローカルで宣言された変数 ( iter_declared_vars()参照)とキャプチャされた変数( iter_captured_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_captured_vars

iter_captured_vars()

GitHub

含むスコープから、この回路スコープでキャプチャされているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数 ( iter_input_vars()参照)とローカルで宣言された変数( iter_declared_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_captured_stretches

iter_captured_stretches()

GitHub

この回路スコープでキャプチャされたストレッチを含むスコープから反復可能な形で取得します。 これは、ローカルで宣言されたストレッチを除く( iter_declared_stretches()).

戻りの型

イテラブル[* ストレッチ]*

iter_declared_vars

iter_declared_vars()

GitHub

このスコープで自動保存期間が宣言されているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数( iter_input_vars()参照)とキャプチャされた変数 iter_captured_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_declared_stretches

iter_declared_stretches()

GitHub

このスコープで宣言されているすべてのストレッチを反復可能形式で取得します。 これは、キャプチャされたストレッチを除く( iter_captured_stretches()).

戻りの型

イテラブル[* ストレッチ]*


回路への演算の追加

Instruction この Operation インターフェースを実装するものは何でも、1つの命令として回路に追加できますが、実際に追加したいもののほとんどは または Gate のインスタンスとなるでしょう。

関連資料

操作、指示、ゲート

回路レベル命令 qiskit.circuit-Qiskitが回路レベル命令を定義するために使用するさまざまなインターフェースに関するレベルのドキュメントです。

汎用演算を追加する方法

これらは、ユーザー定義のものも含め、あらゆるオブジェクトを回路に追加するための基本メソッドである。

メソッド
いつ使用するか
append()命令を1つのオブジェクトとして回路に追加する。
_append()と同じである。 append()と同じだが、エラーチェックをほとんど行わない低レベルのインターフェイスである。
compose()ある回路から別の回路に命令をインライン化する。
tensor()のように compose()のようなものだが、厳密には、不連続な量子ビットに作用する回路を結合するためのものである。

QuantumCircuit 回路に演算を追加するには、主に2つの方法がある。 どちらを使うかは、オブジェクトを1つの「命令」として追加したいのか(append())としてオブジェクトを追加したいのか、あるいは2つの回路の命令を結合したいのか(compose()).

draw()1つの命令または演算は、回路図 data では1つのエントリとして表示され、回路可視化ツールで描画される場合は1つのボックスとして表示されます(参照)。 Target1つの命令は、ハードウェアバックエンドを定義する際の「単位」となる(参照)。 qiskit.transpilerdefinitionAn には が伴う Instruction ことがあり、これはトランスパイラー(参照)が必要に応じてハードウェア向けにこれを分解する際のフォールバック手段となるルールの一つです。 qiskit.transpiler.passes.synthesis.pluginかつ ではない は InstructionOperation 、それに関連付けられた高レベル合成手法が登録されている場合にのみ分解可能です(参照)。

InstructionA QuantumCircuit 単体では単なる「単一」ではありません。むしろ、一般的には、型付けされた古典的なメモリ入出力と制御フローを備えた完全なプログラムを表し得るため、より複雑なものです。 Qiskit(およびほとんどのハードウェア)のデータモデルには、仮想量子オペランドを持つ再利用可能な呼び出し可能なサブルーチンの概念はまだ存在しません。 to_instruction()to_gate()ユニタリ演算のみを用いて量子ビットに作用する単純な回路は、 を用いて Gate に変換でき、量子ビットとCLビットにのみ作用する単純な回路は、 を用いて Instruction に変換できます。

append()Gate、 InstructionOperation、または がある場合は、それを回路に追加し、引数 qubit および clbit を として指定してください。

append

append(instruction, qargs=None, cargs=None, *, copy=True)

GitHub

回路の末尾に1つ以上の命令を追加し、その場で回路を変更する。

Instructionおよび cargs は qargs 、指定された の規則に従って展開・展開され、非Bit 指定子(整数インデックスなど)は、それぞれ該当するインスタンスに解決されます。

a CircuitInstruction が指定された場合、それはアンラップされ、この回路のコンテキスト内で検証された後、新しいオブジェクトが回路に追加されます。 この場合、 や cargs を個別に渡す qargs ことはできません。

パラメーター

  • instruction (Operation |CircuitInstruction) –Instruction 追加するインスタンス、またはそのコンテキスト全体を含むもの CircuitInstruction 。 を実装 to_instruction するオブジェクトもサポートされていますが、変換のオーバーヘッドを回避できるため、一般的には を Instruction 直接渡す方が推奨されます。
  • 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実際に回路に追加されたSへのハンドル。

戻りの型

qiskit.circuit.InstructionSet

レイズ

InstructionCircuitError – 渡された操作が のインスタンスでない場合、またはその操作に対して を呼び出 to_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

GitHub

回路の末尾に命令を追加し、その場で回路を変更する。

警告

これは内部のファストパス関数であり、すべての引数が有効であることを確認するのは呼び出し側の責任である。 具体的には以下の通りです:

  • すべてのqubitsとclbitsはすでに回路に存在し、リストに重複があってはならない。
  • 制御フロー演算命令は、回路内に存在する変数にのみ作用しなければならない。
  • 回路はコントロールフロー・ビルダー・コンテキスト内であってはならない。
注

この関数は、以下の場合以外の呼び出し元でも使用できる。 QuantumCircuit 呼び出し元が、すべてのエラーチェック、ブロードキャスト、スコープがすでに実行され、命令が追加される回路への唯一の参照が同じ関数内にあることを確認している場合。 特に QuantumCircuit._append() を呼ぶのは安全ではない。 これは QuantumCircuit._append() はコントロール・フロー・ビルダー・インターフェースのスコープ構文を認識しないからである。

パラメーター

  • インストラクション

    追加する操作とそのコンテキストに関する、完全かつ形式的に CircuitInstruction 正しい記述。

    Operation後方互換性の形式では、これは単なる となる場合があり、その場合は qargs と cargs を明示的に指定する必要があります。

  • qargs – ベア Operation を接続するための、量子ビット用のレガシー引数。 最初の引数が優先 CircuitInstruction 形式の場合、この引数は無視されます。

  • cargs – clbits に対して、 Operation ベアをアタッチするためのレガシー引数。 最初の引数が優先 CircuitInstruction 形式の場合、この引数は無視されます。

  • _standard_gate (bool)

戻り値

追加された命令へのハンドル。

戻りの型

CircuitInstruction

また、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

GitHub

ある回路からの命令を、別の回路の指定された量子ビットや量子ビットに適用する。

注

デフォルトでは、 self はそのままで、新しい回路オブジェクトが作成される。 この関数のほとんどの用途では、 inplace=True を設定し、その場でベース回路を変更する方がはるかに効率的である。

リアルタイム変数 (expr.Var と expr.Stretch インスタンス) を扱う場合、次の 2 つの主要な戦略があります。 compose():

  1. other 回路は、その変数も含めて完全に加法的なものとして扱われる。 other の変数は、 self の変数とは完全に区別する必要があります( var_remap を使用すると便利です)。 other の変数はすべて、 other の変数と入力/キャプチャ/ローカル・スコープが一致するように、出力で新たに宣言されます。 これは一般的に、関係のない2つの回路を接続する場合に必要なものです。
  2. other 回路は、 self の正確な拡張として作成され、 self の最後にある状態の既存の変数に作用することも含めて、 にインライン化された。 この場合、インライン化するこれらの変数をすべて "captures "として宣言した other を作成し、このメソッドで inline_captures=True を使ってリンクする。 これは一般的に、その場でレイヤーを定義して回路を構築する場合や、自分自身から取り出したレイヤーを使って回路を再構築する場合に求められるものだ。 の引数 vars_mode="captures" は、各レイヤーのベースを作成するのに便利だ。 copy_empty_like() への引数が役に立つかもしれない。

パラメーター

  • other (qiskit.circuit.Instruction orQuantumCircuit) – (サブ)回路、または自身に合成するための命令。 QuantumCircuita でない場合、これは が受け入れるもの append なら何でも構いません。

  • qubits (list[Qubit|int]) – 自己を構成する量子ビット。

  • clbits (list[Clbit|int]) – 自己の断片を合成する。

  • front (bool) – True の場合、フロントコンポジションが行われる。 これは、コントロール・フロー・ビルダー・コンテキスト・マネージャー内では不可能である。

  • inplace (bool) – True の場合、オブジェクトを修正する。 そうでなければ、構成された回路を返す。

  • copy (bool) – もし True (デフォルト)なら、入力は共有されたものとして扱われ、将来変更される可能性がある場合、含まれている命令はコピーされる。 不必要なコピーを避けるため、入力をベース回路が所有しているとみなす場合は、これを False 。この場合、 other を後で使用するのは無効であり、一部の命令がその場で変異している可能性がある。

  • var_remap (Mapping) –

    を書き換えるために使用するマッピング expr.Var と expr.Stretchother selfノードを書き換えるために使用するマッピングである。 これは名前の衝突を避けるために使うことができる。

    キーも値も、文字列または直接識別子のインスタンスとして与えることができる。 キーが文字列の場合、任意の 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 を返す)。

戻りの型

QuantumCircuit

レイズ

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

GitHub

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 を返す)。

戻りの型

QuantumCircuit

パラメーター

経験則として:

注意すべき落とし穴もある:

  • 回路の構築中にカスタム Instruction 関数を再利用する場合でも、トランスパイラーは通常、その処理を開始する前に、その関数の各呼び出しを内部の分解構造まで「展開」しなければならない。 to_instruction()とはいえ、-plus-append() パターンの使用を控える必要はありません。トランスパイラーはこの点について、今後徐々に改善されていくからです。
  • compose() は、後方互換性のために、デフォルトでは新しい回路を生成する。 これはより高価で、通常は望むものではないので、 inplace=True。
  • True_append()と compose() (ただし を除く)には append() 、デフォルト値が となるキーワード引数 copy があります。 このような場合、Qiskit がオブジェクトに可変性(ゲートパラメータの取得など)があることを検出した場合、入力 Operation されるインスタンスはコピーされます。 そのオブジェクトを他の場所で再利用しないことが確実な場合は、このコピーが行われないように設定 copy=False すべきです。これにより、大きなオブジェクトの場合、処理速度が大幅に向上することがあります。

標準的な指示を追加する方法

この QuantumCircuit クラスには、Qiskitの標準ライブラリに含まれる多くの命令やゲートを回路に追加するためのヘルパーメソッドが用意されています。 これらは一般的に、関連 qiskit.circuit.library するオブジェクトのインスタンスを手動で作成し、それを に渡すのと同じ効果を持ち、残りの引数は必要 append() に応じて および cargs qargs フィールドに格納されます。

以下のメソッドは、回路に対して特別な非ユニタリ Instruction 演算を適用します:

これらの手法では、制御されていないユニタリ Gate インスタンスを回路に適用します:

ControlledGate以下のメソッドは、制御ゲートでもあるインスタンスに適用 Gate されるため、の直接のサブクラスとなります:

最後に、これらの方法は、特定の一般化された多重制御ゲートを回路に適用し、多くの場合、熱心な合成を行う。 正確な出力はゲートの合成バージョンであることが多いため、制御しているベース・ ゲートの観点からリストアップされている。

このセクションの残りの部分は、個々のメソッドのAPIリストである。

barrier

barrier(*qargs, label=None)

GitHub

Barrier を適用する。 qargs が空の場合、回路内のすべての量子ビットに適用される。

パラメーター

  • qargs (QubitSpecifier) – 1つ以上の量子ビット引数の指定。
  • label (str) – バリアの文字列ラベル。

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

ccx

ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)

GitHub

CCXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ccz

ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)

GitHub

CCZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ch

ch(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CHGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cp

cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CPhaseGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

crx

crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CRXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cry

cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CRYGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

crz

crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CRZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cs

cs(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CSGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

csdg

csdg(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CSdgGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cswap

cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)

GitHub

CSwapGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

csx

csx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CSXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cu

cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CUGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cx

cx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cy

cy(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CYGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cz

cz(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

CZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

dcx

dcx(qubit1, qubit2)

GitHub

DCXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

delay

delay(duration, qarg=None, unit=None)

GitHub

適用する Delay. qarg が None の場合、すべての量子ビットに適用される。 複数の量子ビットに適用する場合、同じ持続時間のディレイが作成される。

パラメーター

  • duration (Object) – 遅延時間 これが Exprの定数式でなければならない。 Duration.
  • qarg (Object) – qubit引数でこの遅延を適用する。
  • unit (str | None) – ただし、 duration が Expr の場合は指定してはならない。 対応ユニット: 's' 'ms'、 'us'、 'ns'、 'ps'、 'dt'。 デフォルトは 'dt'、つまりターゲットとなるバックエンドに応じた整数の時間単位である。

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

レイズ

CircuitError - 引数の書式が悪い場合。

ecr

ecr(qubit1, qubit2)

GitHub

ECRGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

h

h(qubit)

GitHub

HGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

id

id(qubit)

GitHub

IGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

initialize

initialize(params, qubits=None, normalize=False)

GitHub

量子ビットを特定の状態に初期化する。

量子ビットの初期化は、まず量子ビットを ∣0⟩|0\rangle にリセットし、続いてクラスを呼び出して StatePreparation 量子ビットを指定された状態に準備することで行われます。 これらの手順は両方とも、説明書 Initialize に記載されています。

パラメーター

  • params (Statevector | Sequence[complex] | str |int) –

    初期化する状態は、以下のいずれかである。

    • 初期化する状態ベクトルまたは複素振幅のベクトル。
    • パウリ固有状態 Z、X、Y の基底状態のラベル。 Statevector.from_label() を参照してください。 適用される量子ビットのインデックスに対して、ラベルの順序が逆になっている点に注意してください。 例「label '01' 」では、量子ビット0を ∣1⟩|1\rangle に、量子ビット1を ∣0⟩|0\rangle に初期化します。
    • どの量子ビットを ∣1⟩|1\rangle に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を ∣1⟩|1\rangle に、量子ビット 1 を ∣0⟩|0\rangle に初期化する。
  • qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。 None の場合、初期化は回路内のすべての量子ビットに適用される。

  • normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。

戻り値

作成されたインストラクションへのハンドル。

例

(∣0⟩−∣1⟩)/2(|0\rangle - |1\rangle) / \sqrt{2} の状態の量子ビットを用意する。

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) ├
     └──────────────────────────────┘

文字列から、状態 ∣10⟩|10\rangle にある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)

GitHub

iSwapGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

mcp

mcp(lam, control_qubits, target_qubit, ctrl_state=None)

GitHub

MCPhaseGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

mcrx

mcrx(theta, q_controls, q_target, use_basis_gates=False)

GitHub

多重制御X回転ゲートを適用

パラメーター

mcry

mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)

GitHub

複数制御のY回転ゲートを適用

パラメーター

mcrz

mcrz(lam, q_controls, q_target, use_basis_gates=False)

GitHub

複数制御のZ回転ゲートを適用

パラメーター

mcx

mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)

GitHub

MCXGate応募する。

multi-cX ゲートは、異なるアンシラ量子ビットの数を使用し、回路の深さが異なる様々な技術を用いて実装することができる。 これらのモードは以下の通りである:

  • 'noancilla':0アンシラ量子ビットを必要とする。
  • 'recursion':4つ以上のコントロールを使用する場合は1つのアンシラ量子ビットを必要とし、そうでない場合は0。
  • 'v-chain':制御量子ビットの数より2少ないアンシラを必要とする。
  • 'v-chain-dirty':クリーンアンシラの場合と同じ(ただし、回路は長くなる)。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

バージョンから非推奨 2.1

qiskit.circuit.quantumcircuit.QuantumCircuit.mcx()の引数 mode は Qiskit 2.1 で非推奨となりました。 発売日から3ヶ月以内に削除されます。 代わりに、回路に汎用MCXGateを追加し、トランスパイルで hls_config 、合成方法を指定する。 また、特定の分解は次のサイトで入手できる。 https://qisk.it/mcx.

パラメーター

戻り値

作成されたインストラクションへのハンドル。

レイズ

  • ValueError - 指定されたモードがわからない場合、または渡されたアンシラ量子ビットの数が少なすぎる場合。
  • AttributeError - アンシラ・クビットが渡されていないが、必要である場合。

戻りの型

InstructionSet

measure

measure(qubit, cbit)

GitHub

Z基底の量子ビット(qubit)を古典ビット(cbit)に変換する。

量子状態が測定されると、量子ビットは計算(パウリZ)基底で ∣0⟩\lvert 0 \rangle または ∣1⟩\lvert 1 \rangle のいずれかに投影される。古典ビット cbit は、その投影結果をそれぞれ 0 または 1 として示す。 この操作は非可逆的である。

パラメーター

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

レイズ

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)

GitHub

MSGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

p

p(theta, qubit)

GitHub

PhaseGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

pauli

pauli(pauli_string, qubits)

GitHub

PauliGate応募する。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

prepare_state

prepare_state(state, qubits=None, label=None, normalize=False)

GitHub

特定の状態の量子ビットを準備する。

このクラスは状態を準備するユニタリーを実装している。 とは異なり initialize() と異なり、最初に量子ビットをリセットしない。

パラメーター

  • state (Statevector | Sequence[complex] | str |int) –

    初期化する状態は、以下のいずれかである。

    • 初期化する状態ベクトルまたは複素振幅のベクトル。
    • パウリ固有状態 Z、X、Y の基底状態のラベル。 Statevector.from_label() を参照してください。 適用される量子ビットのインデックスに対して、ラベルの順序が逆になっている点に注意してください。 ラベル「01」を例にとると、量子ビット0は ∣1⟩|1\rangle に、量子ビット1は ∣0⟩|0\rangle に初期化されます。
    • どの量子ビットを ∣1⟩|1\rangle に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を ∣1⟩|1\rangle に、量子ビット 1 を ∣0⟩|0\rangle に初期化する。
  • qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。 None の場合、初期化は回路内のすべての量子ビットに適用される。

  • label (str | None) – ゲートの任意のラベル

  • normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。

戻り値

先ほど初期化された命令へのハンドル

戻りの型

InstructionSet

例

(∣0⟩−∣1⟩)/2(|0\rangle - |1\rangle) / \sqrt{2} の状態の量子ビットを用意する。

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) ├
     └─────────────────────────────────────┘

文字列から、状態 ∣10⟩|10\rangle にある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)

GitHub

RGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rcccx

rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)

GitHub

RC3XGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rccx

rccx(control_qubit1, control_qubit2, target_qubit)

GitHub

RCCXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

reset

reset(qubit)

GitHub

量子ビットをデフォルト状態にリセットする。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – リセットする量子ビット。

戻り値

ハンドルを追加した。

戻りの型

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit)

GitHub

RVGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

任意の回転軸 vv を中心とした回転。 ∣v∣|v| はラジアン単位の回転角度。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rx

rx(theta, qubit, label=None)

GitHub

RXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rxx

rxx(theta, qubit1, qubit2)

GitHub

RXXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ry

ry(theta, qubit, label=None)

GitHub

RYGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ryy

ryy(theta, qubit1, qubit2)

GitHub

RYYGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rz

rz(phi, qubit)

GitHub

RZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rzx

rzx(theta, qubit1, qubit2)

GitHub

RZXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rzz

rzz(theta, qubit1, qubit2)

GitHub

RZZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

s

s(qubit)

GitHub

SGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sdg

sdg(qubit)

GitHub

SdgGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

store

store(lvalue, rvalue, /)

GitHub

与えられたリアルタイム古典式 rvalue の結果を、 lvalue で定義されたメモリー位置に格納する。

通常、 lvalue は Var ノードとなり、 rvalue Expr である。 expr.lift() に上げることができるものなら何でも Expr に上げることができるものであれば、どちらの場所でも許される。

パラメーター

  • lvalue (Any) – 回路内のメモリー位置の有効な指定子。 これは通常 Var ノードに書き込むこともできる。 Clbit または ClassicalRegister に書き込むこともできる。 メモリー・ロケーションはすでに回路内に存在していなければならない。
  • rvalue (Any) – リアルタイム古典式で、その結果が与えられたメモリー位置に書き込まれる。

戻りの型

InstructionSet

関連資料

Store

この操作を表すバックグラウンド Instruction クラス。

add_var()

このメソッドで書き込み可能な新しい変数を回路内に作成する。

swap

swap(qubit1, qubit2)

GitHub

SwapGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sx

sx(qubit)

GitHub

SXGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sxdg

sxdg(qubit)

GitHub

SXdgGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

t

t(qubit)

GitHub

TGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

tdg

tdg(qubit)

GitHub

TdgGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

u

u(theta, phi, lam, qubit)

GitHub

UGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

unitary

unitary(obj, qubits, label=None)

GitHub

obj で指定されたユニタリーゲートを qubits に適用する。

パラメーター

  • obj (np.ndarray | Gate | BaseOperator) – 単位演算子。
  • qubits (Sequence[QubitSpecifier]) – 変換を適用する回路量子ビット。
  • label (str | None) – バックエンドの統一名[デフォルト:なし]。

戻り値

量子回路。

戻りの型

QuantumCircuit

例

ユニタリー行列で指定されたゲートを量子回路に適用する

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)

GitHub

XGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

y

y(qubit)

GitHub

YGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

z

z(qubit)

GitHub

ZGate応募する。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

回路への制御フローの追加

関連資料

回路の制御フロー

制御フローのオペレーションが全体の中でどのように表現されるかについての議論。 qiskit.circuit コンテキストでどのように表現されるかを議論する。

QuantumCircuit Qiskitがサポートするすべての制御フロー操作に対応するメソッドを備えています。 これらには、呼び出すための2つの形式があります。 ControlFlowOp1つ目は、命令のブロック本体を引数として QuantumCircuit 受け取り、単にそれに対応するものを生成して追加するだけの、非常にシンプルな利便性向上のためのラッパーです。

2つ目の形式は、「 ビルダーインターフェース 」と呼ばれ、制御フローの構築にはこれを強くお勧めします。 withここでは、各メソッドは演算のリアルタイム判別値のみを受け取り、. を使用して指定したコンテキストマネージャを返します。 その後、それらのブロック内で通常の QuantumCircuit メソッドを使用して制御フローの本体を構築すると、Qiskitは内側のブロックに必要なデータリソースを自動的に追跡し、for文を with 離れる際に完全 ControlFlowOp な制御フローを構築します。 このようにプログラムで制御フローを構築する方が、はるかに簡単で、ミスも起こりにくい。

コントロール・フロー・ビルダー・インターフェースを使用する際、演算が定義されていないにもかかわらず、量子ビットをブロックに含めたい場合がある。 この場合 noop() メソッドを使用します。

QuantumCircuit.has_control_flow_op()回路に が ControlFlowOp 含まれているかどうかを確認するには、ヘルパーメソッド を使用できます。

box

box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)

GitHub

より大きなコンテキストの中でアトミックに扱われる、この回路上の操作の box 。

ボックス」とは、無条件に入力される制御フローの構成要素である。 ボックスの中身は、ボックスの始点と終点がバリアであるかのような振る舞いをする( barrier()を参照)、ただし、ボックスの中を "ずっと "通過することは許される。 ボックスは、変数、ストレッチ、コンパイラー・パスのための明示的なスコープでもある。

この関数を呼び出すには2つの形式がある:

  • 位置情報を QuantumCircuit 渡し、それに作用する と clbits を qubits 指定します。 この形式では、a BoxOp が即座に作成され、circuit を本体として追加されます。
  • body、 qubits 、 clbits のない with ステートメントで使用する。 これが「ビルダー・インターフェース・フォーム」である。 QuantumCircuitbox に命令を追加するために、 Python with スコープ内の他のメソッドを使う。 これは好ましい形式であり、エラーの可能性がはるかに低い。

例

ビルダー・インターフェイスを使って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 位置指定で渡された場合、それは直ちにボックスの本体として使用され、および clbits``qubits も指定する必要があります。 指定されない場合、またはオブジェクトの Annotation 反復可能オブジェクトが指定された場合、このメソッドのコンテキストマネージャ形式が呼び出されます。
  • qubits (Sequence[QubitSpecifier] | None) – 明示的な形式において、その演算 BoxOp を適用する量子ビット。
  • clbits (Sequence[ClbitSpecifier] | None) – 明示的な形式において、それを BoxOp 適用する clbits。
  • label (str | None) – 命令のオプションの文字列ラベル。
  • BoxOpduration (None) –. に対する(任意の)明示的な期間。 スケジューリングパスは、必要に応じて遅延を挿入しつつ、含まれるスコープが指定された期間に一致するようにスケジューリングされるという制約があります。
  • unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – の単位は duration。
  • annotations (Iterable[Annotation]) – その箱に入れるべきあらゆる Annotation 物体。 このメソッドをコンテキストマネージャ形式で使用する場合は、代わりにこの引数を唯一の位置引数として渡すことができます。

break_loop

break_loop()

GitHub

BreakLoopOp応募する。

警告

if_test()「builder」形式のコンテキストマネージャー( for_loop() や while_loop())を使用している場合、このメソッドを呼び出せるのはループコンテキスト内のみです。それ以外の場合、その操作の「リソース幅」を特定できないためです。 if_else()これではすぐに無効な回路が生じてしまうため、(コンテキストマネージャーを使用せずに)再利用可能なループ本体を構築しようとする場合は、およびの if_test() コンテキストマネージャーを使用しない形式も併せて使用する必要があります。 その BreakLoopOp 命令は、直近のスコープだけでなく、それを囲むループ内のすべてのリソースにまたがる必要がある点に注意してください。

戻り値

作成された命令へのハンドル。

レイズ

CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。

戻りの型

InstructionSet

continue_loop

continue_loop()

GitHub

ContinueLoopOp応募する。

警告

if_test()「builder」形式のコンテキストマネージャー( for_loop() や while_loop())を使用している場合、このメソッドを呼び出せるのはループコンテキスト内のみです。それ以外の場合、その操作の「リソース幅」を特定できないためです。 if_else()これではすぐに無効な回路が生じてしまうため、(コンテキストマネージャーを使用せずに)再利用可能なループ本体を構築しようとする場合は、およびの if_test() コンテキストマネージャーを使用しない形式も併せて使用する必要があります。 その ContinueLoopOp 命令は、直近のスコープだけでなく、それを囲むループ内のすべてのリソースにまたがる必要がある点に注意してください。

戻り値

作成された命令へのハンドル。

レイズ

CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。

戻りの型

InstructionSet

for_loop

for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | None, body: None, qubits: None, clbits: None, *, label: str | None) → ForLoopContext

for_loop(indexset: Iterable[int], loop_parameter: Parameter | Var | 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

GitHub

この回路に for のループを作る。

この関数を呼び出すには、2つの方法があります。 body``labelすべての引数(ただし、を除く場合がある)を指定して呼び出されると、指定された を持つ ForLoopOp が作成されます。 もし body (および qubits および clbits) が渡されない場合、これはコンテキストマネージャとして機能し、その範囲に入るとループ変数が提供されます(変数が指定されている場合は、その変数が再利用されます)。また、スコープが終了すると自動的に が ForLoopOp 生成されます。 この形式では、スコープが自動的に処理してくれるため、使用している量子ビット(qubit)やクラビット(clbit)を個別に追跡する必要はありません。

例:

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|expr.Var]) –

    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)

GitHub

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を参照する場合。

戻り値

作成された命令へのハンドル。

戻りの型

InstructionSet

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

GitHub

この回路で if 。

この関数を呼び出すには、2つの方法があります。 true_body``labelすべての引数(ただし、を除く場合がある)が指定されて呼び出された場合、指定された を持つ IfElseOp を作成し、 の false 条件による分岐は発生しません( メソッド if_else() も参照してください)。 ただし、(および qubits および clbits) が渡されない場合 true_body 、これはコンテキストマネージャとして機能し、 ステートメントを構築 if するために使用できます。 この with 文の戻り値は、チェーン可能なコンテキストマネージャであり、これを使用して後続 else のブロックを作成することができます。 この形式では、スコープが自動的に処理してくれるため、使用している量子ビット(qubit)やクラビット(clbit)を個別に追跡する必要はありません。

例:

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

GitHub

この回路に switch/case 構造を作成する。

この関数を呼び出すには、2つの方法があります。 labelすべての引数(ただし、を除く場合がある)を指定して呼び出されると、指定されたケース構造を持つ が SwitchCaseOp 作成されます。 もし cases (および qubits および clbits) が渡されない場合、これはコンテキストマネージャとして機能し、スコープが終了した際に自動的に を SwitchCaseOp 生成します。 この形式では、スコープが自動的に処理してくれるため、使用している量子ビット(qubit)やクラビット(clbit)を個別に追跡する必要はありません。

使用例:

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

GitHub

この回路に 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)

GitHub

操作を追加することなく、与えられた量子ビットを現在のスコープ内で使用されているものとしてマークする。

のトップスコープで呼び出された場合、これは(無効な入力に対して例外を発生させる以外には)何の効果もない。 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

has_control_flow_op()

GitHub

その回路の演算の中に、その ControlFlowOp インスタンスが含まれているかどうかを確認します。

戻りの型

bool

回路を他のオブジェクトに変換する

「一般的な演算の追加方法」 で説明したように、2つのヘルパーメソッドを使用することで、回路を または の GateInstruction いずれかに変換することができます。

to_instruction

to_instruction(parameter_map=None, label=None)

GitHub

この回路を使って○○ Instruction を作成してください。

関連資料

circuit_to_instruction()

この方法の根本的な原動力。

パラメーター

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータから、命令で使用されるパラメータへの対応付け。 None の場合、既存の回路パラメータもその命令のパラメータとして使用されます。
  • label (str | None) – オプションのゲートラベル。

戻り値

この回路をカプセル化した複合命令(次のようになる。

分解された背中)。

戻りの型

qiskit.circuit.Instruction

to_gate

to_gate(parameter_map=None, label=None)

GitHub

この回路を使って を作成してください Gate 。 回路は量子ビットにのみ作用し、ユニタリー演算のみを含むものでなければならない。

関連資料

circuit_to_gate()

この方法の根本的な原動力。

パラメーター

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータから、ゲートで使用されるパラメータへの対応関係。 Noneその場合、既存の回路パラメータもゲートのパラメータとして設定されます。
  • label (str | None) – オプションのゲートラベル。

戻り値

この回路を内包する複合ゲート(逆分解可能)。

戻りの型

ゲート

さらに、回路全体を次の DAGCircuit 表記に変換することもできます:

to_dag

to_dag(*, copy_operations=True)

GitHub

DAGCircuitこの回路を.に変換してください。

これは単純なラッパーです circuit_to_dag()。

パラメーター

copy_operations (bool) – 個々の命令をディープコピーするかどうか。 に設定すると False、操作は安価になるが、DAG内の命令への変更は元の回路に影響を与える。

戻り値

この同じ回路を表す有向非循環グラフ(DAG)。

戻りの型

qiskit.dagcircuit.DAGCircuit

ヘルパー変異法

には2つの上位メソッドがある。 QuantumCircuit がある。 デフォルトでは、これらのレジスタも追加される。

measure_active

measure_active(inplace=True)

GitHub

すべての非アイドル量子ビットに測定を追加する。 測定中の非アイドル量子ビットの数に等しいサイズの新しい ClassicalRegister を作成する。

inplace=False の場合、測定値を含む新しい回路を返す。

パラメーター

inplace (bool) – 測定はすべてその場で行うか、新しいサーキットに戻す。

戻り値

inplace = False のとき、測定値を含む回路を返す。

戻りの型

QuantumCircuit

measure_all

measure_all(inplace=True, add_bits=True)

GitHub

すべての量子ビットに測定値を加える。

デフォルトでは、新しい古典的ビットを ClassicalRegister に新しい古典ビットを追加する。 add_bits=False の場合、測定結果はすでに存在する古典ビットに格納され、量子ビット n は古典ビット n に測定される。

inplace=False の場合、測定値を含む新しい回路を返す。

パラメーター

  • inplace (bool) – 測定はすべてその場で行うか、新しいサーキットに戻す。
  • add_bits (bool) – 結果を保存するために新しいビットを追加するかどうか。

戻り値

inplace=False のとき、測定値を含む回路を返す。

戻りの型

QuantumCircuit

レイズ

CircuitError - もし add_bits=False 、クラシックのビットが足りない。

には QuantumCircuit 、「減法」的な手法も2つあります。 RemoveFinalMeasurementsclear()これは、この QuantumCircuit 機能が想定しているユースケースではありません。通常は、の代わりにを使用 copy_empty_like() し、をそのトランスパイラ・パス形式として実行 remove_final_measurements() するようにしてください。

clear

clear()

GitHub

自分の中の指示をすべてクリアにする。

回路をクリアしてもメタデータは残る。

関連資料

copy_empty_like()

命令を持たず、量子型と古典型のデータをすべて同じように追跡する新しい回路を、元の回路を変異させることなく生成する方法。

戻りの型

なし

remove_final_measurements

remove_final_measurements(inplace=True)

GitHub

すべての量子ビットの最終的な測定とバリアが存在する場合、それを削除する。 この操作の結果としてアイドルになったこれらの測定値からの値を格納するために使用された古典的レジスタを削除し、削除されたレジスタによってのみ参照される古典的ビット、またはまったく参照されないがこの操作の結果としてアイドルになった古典的ビットを削除する。

測定とバリアは、(他の測定やバリアは別として)その後に他の操作がない場合、最終的なものとみなされる

注

この方法は、特に新しくアイドル状態になった古典的なビットやレジスタの削除など、かなり複雑な動作をする。 不必要なクラシック・データを後から削除するよりも、最初から追加しない方がはるかに効率的だ。

関連資料

RemoveFinalMeasurements

最終的な計測と障壁を取り除くトランスパイラー・パス。 これは古典的なデータを削除するものではない。 これがあなたのゴールなら、そう呼べばいい:

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 の場合、結果の回路を返す。

戻りの型

QuantumCircuit


回路特性

シンプルな回路メトリクス

量子回路を構築する際、回路の "大きさ "やノイズの多い量子デバイス上で実行できる能力を定量化するのに役立ついくつかの特性がある。 これらの中には、量子ビット数のように簡単に理解できるものもあれば、深さやテンソル成分の数のようにもう少し説明が必要なものもある。 ここでは、これらの特性をすべて説明し、実際のデバイスで動作させたときに回路がどのように変化するかを理解するための準備として、それらが変化する条件を強調する。

次の回路を考えてみよう:

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() == 19

count_ops

count_ops()

GitHub

回路内の各操作種類を数える。

戻り値

各種類の処理件数を、件数の多い順に並べた内訳。

戻りの型

OrderedDict [ 文字列, 整数 ]

depth

depth(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

リターンサーキットの深さ(クリティカルパスの長さ)。

量子回路の深さとは、その回路で定義された計算を完了するために、量子ゲートを何層並列に実行すればよいかを示す尺度である。 量子ゲートの実装には時間がかかるため、回路の深さは量子コンピューターが回路を実行するのにかかる時間にほぼ対応する。

警告

この動作は、回路にコントロール・フロー動作が含まれている場合、うまく定義できない。

パラメーター

filter_function (Callable[[CircuitInstruction], bool]) – どの命令が深さの増加にカウントされるかを決定する関数。 CircuitInstruction単一の位置指定引数として. を受け取るべきである。 関数が返す False 命令は、回路の深さの計算においては無視されます。 Barrierデフォルトでは、. などの「ディレクティブ」を除外します。

戻り値

回路の深さ。

戻りの型

int

例

回路全体の深さを簡単に計算できる:

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) == 1

get_instructions

get_instructions(name)

GitHub

名前に一致する指示を得る。

パラメーター

name (str) – 取得するコマンドの名前。

戻り値

命令、qargs、cargs)のリスト。

戻りの型

リスト ( タプル )

num_connected_components

num_connected_components(unitary_only=False)

GitHub

この回路を因数分解すると、いくつの絡み合わない部分回路になるか。

パラメーター

unitary_only (bool) – グラフのユニタリー部分のみを計算する。

戻り値

回路に接続されている部品の数。

戻りの型

int

num_nonlocal_gates

num_nonlocal_gates()

GitHub

非局所ゲートの数を返す。

条件付き非局所ゲートも含まれる。

戻りの型

int

num_tensor_factors

num_tensor_factors()

GitHub

回路のユニタリー(量子)部分のみのテンソル因子の数を計算する。

ノード

これは後方互換性のためであり、Qiskitの将来のリリースでは削除される予定です。 代わりに num_unitary_factors を呼ぶべきである。

戻りの型

int

num_unitary_factors

num_unitary_factors()

GitHub

回路のユニタリー(量子)部分のみのテンソル因子の数を計算する。

戻りの型

int

size

size(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

回路の総命令数を返します。

パラメーター

filter_function (callable) – いくつかの命令をフィルタリングする関数。 (Instruction、list(Qubit)、list(Clbit))のタプルを入力とする。 デフォルトでは、バリアやスナップショットのような「ディレクティブ」をフィルタリングする。

戻り値

ゲート操作の総数。

戻りの型

int

width

width()

GitHub

回路内の量子ビットと clbits の数を返す。

戻り値

回路の幅。

戻りの型

int

スケジュール情報のアクセス

もし QuantumCircuit がトランスパイルパイプラインの一部としてスケジューリングされている場合、個々の量子ビットのタイミング情報にアクセスすることができます。 回路全体のタイミング情報は estimate_duration() メソッドと op_start_times 属性によって取得できます。

estimate_duration

estimate_duration(target, unit='s')

GitHub

予定されたサーキットの所要時間を見積もる

この方法は、与えられたターゲットから提供された持続時間に基づいて回路内の最長持続時間パスを見つけることにより、回路持続時間の推定値を計算する。 この方法は、制御フローや他の古典的なフィードフォワード演算を持たない単純な回路にのみ有効である。

パラメーター

  • target (Target) – 回路内のいずれかの命令について、ターゲットに実行時間データが存在しない場合、その命令の実行時間を格納するインスタンスが QiskitErrorTarget が発生します。 これは、トランスパイルのターゲットとして使用されるものと同じターゲットオブジェクトである必要があります。
  • unit (str) – 継続時間を返す単位。 デフォルトは秒を表す "s "だが、秒を返すためのSI接頭辞を指定することもできる。 例えば、これを "n "に設定すると、ナノ秒単位で返される。 このタイプでサポートされている値は、"f"、"p"、"n"、"u"、"μ"、"m"、"k"、"M"、"G"、"T"、"P "である。 さらに、"dt "単位の整数を出力するために、"dt "の値も受け入れられる。 これを機能させるには、 target で "dt "を指定する必要がある。

戻り値

指定された単位の回路のシングルショットの実行にかかる推定時間。

レイズ

QiskitError - 回路がスケジューリングされていない場合、または(パラメータ化された遅延など)推定継続時間の計算を妨げる他の詳細が含まれている場合。

戻りの型

int | float

qubit_duration

qubit_duration(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最初と最後の命令の開始時刻と停止時刻の間の時間を返す。 時間単位は self.unit。

パラメーター

*qubits ( Qubit | int ) – 量子ビット数 self 含める。

戻り値

非遅延命令の最初の開始時刻から最後の停止時刻までの時間を返す

戻りの型

浮動小数点

qubit_start_time

qubit_start_time(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最初の命令の開始時刻を返す。 時間単位は self.unit。

量子ビットを超える命令がない場合は0を返す

パラメーター

  • * Qubits - self に含まれるキュービット。 量子ビットには整数を使用できる
  • self.qubits. (indices of)

戻り値

遅延を除いた最初の命令の開始時刻を量子ビット数で返す

レイズ

CircuitError - self がまだ予定されていない回線である場合。

戻りの型

浮動小数点

qubit_stop_time

qubit_stop_time(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最後の命令の停止時間を返す。 時間単位は 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)

GitHub

この回路を、与えられた量子ビット数で、正規の物理的な形にする。

いくつかの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 、回路を拡張しようとするが、回路にはすでにレイアウトが設定されている場合。

戻りの型

bool

estimate_fidelity

estimate_fidelity(target)

GitHub

物理回路の忠実度を推定する。

この関数は、回路内の各ゲートのエラー率の積を計算し、回路の忠実度を推定します:

..数学::

ラベル

推定回路忠実度

prod_ {g in text{gates}} bigl(1 - operatorname {error} (g)bigr)

ここで、 error⁡(g)\operatorname{error}(g) は、ターゲット内の回路による命令 gg に対するターゲット側のエラー率である。 None回路が物理的なものでない場合、つまり回路内の命令(operation や qargs など)がターゲットに見つからない場合、これは を返します。 この手法は、実際のハードウェア上での実行精度を現実的にシミュレートすることを目的としたものではありません。 これは、トランスパイラーが動作する際に、さまざまなヒューリスティックの精度に応じてどのように機能するかを概算するために設計されています。 通常、これは異なるコンパイル出力を互いに比較し、ハードウェア上でより高品質な実行結果が得られるのはどちらかを推定するためにのみ有用です。

パラメーター

target (Target) – 回路が実行されるインスタンスであり Target 、回路内の命令のエラー率を取得するために使用されます。

戻り値

指定されたターゲット上で回路を実行した際の推定忠実度。 回路内の命令のうち、ターゲットに存在しないものがあれば

レイズ

QiskitError – 回路に制御フロー操作が含まれている場合。

戻りの型

float | None


命令型メソッド

InstructionQuantumCircuit また、細部において非常に~に似たメソッドが少数含まれています。 Instruction まず、回路を状況に応じて (to_instruction()) または Gate (to_gate()) に変換してから、対応するメソッドを呼び出すと、より優れた統合機能や、より多くの API サポートが得られる可能性があります。

control

control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)

GitHub

この回路の管理バージョンを返す。

元の回路はゲートに変換され、その結果得られる回路には、このゲートの制御されたバージョンが含まれる。 True``Falseこの制御ゲートは、 が のときは annotated として ControlledGate 、 が のときは annotated として AnnotatedOperation 実装される。

2.3 以降非推奨

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) – 制御ゲートを制御ゲートとして実装するか、注釈付き操作として実装するかを示します。

戻り値

この回路の制御バージョン。

戻りの型

QuantumCircuit

レイズ

CircuitError - 回路に非単位動作が含まれ、制御できない場合。

inverse

inverse(annotated=False)

GitHub

この回路を反転させる。

これは、すべてのゲートを再帰的に反転させることによって行われる。

パラメーター

annotated (bool) – は、逆ゲートが注釈付きゲートとして実装できるかどうかを示す。

戻り値

反転回路

戻りの型

QuantumCircuit

レイズ

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)

GitHub

この回路を power のべき乗にする。

power が正の整数で、 matrix_power と annotated の両方が False の場合、この実装ではデフォルトで repeat を呼び出す。 そうでない場合は、回路はゲートに変換され、このゲートを所定のべき乗に引き上げた新しい回路が返される。 与えられたべき乗に引き上げられたゲートは、 annotated が False の場合はユニタリーゲートとして、 annotated が True の場合は注釈付き演算として実装される。

パラメーター

  • power (float) – この回路を引き上げる力。
  • matrix_power (bool) – は、内部パワーゲートがユニタリーゲートとして実装可能かどうかを示す。
  • annotated (bool) – は、内側のパワーゲートが注釈付き操作として実装できるかどうかを示す。

レイズ

CircuitError - 回路をユニタリーゲートに変換する必要があるが、ユニタリーでない場合。

戻り値

この回路を実装した回路は、 power のべき乗になる。

戻りの型

QuantumCircuit

repeat

repeat(reps, *, insert_barriers=False)

GitHub

reps 回繰り返す。

パラメーター

  • reps (int) – この回路を何回繰り返すべきか。
  • insert_barriers (bool) – サーキットの反復の間にバリアを入れるかどうか。

戻り値

reps この回路の繰り返しを含む回路。

戻りの型

QuantumCircuit

reverse_ops

reverse_ops()

GitHub

指示の順序を逆にして回路を反転させる。

これは、すべての命令を再帰的に反転させることによって行われる。 ゲートを反転(アジョイント)することはない。

戻り値

逆回路。

戻りの型

QuantumCircuit

例

を入力する:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

出力:

                 ┌───┐
q_0: ─────■──────┤ H ├
     ┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
     └──────────┘

視覚化

Qiskitには、回路がどのように見えるかを手早く感じるための描画ツールがいくつか含まれています。 このツールは、主に Matplotlib - またはテキストベースの図面を作成することを主な対象としています。 また、 LaTeX のバックエンドもあるが、これは単純な回路を描くためのもので、あまり活発にメンテナンスされていない。

関連資料

qiskit.visualization

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)

GitHub

量子回路を描く。 出力パラメータを使用して、描画形式を選択します:

text

コンソールで表示できるASCIIアート TextDrawing。

mpl

matplotlibを使用して Python のみで色を表現した画像。

latex

LaTeX を通じて収集された高品質な画像。

警告

Instruction.labelこれは、設計上、任意のユーザー入力に対して pdflatex インストール済みのシステム版を呼び出すことになっています(たとえば、でカスタムコードをレンダリングする場合など)。したがって、信頼できる入力に対してのみ使用してください。

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 (結果はファイルに保存されない)。

  • style (dict |str | 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 バックエンドがサポートしているかどうかに依存します)。 mpl textまたは 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) – high medium または。 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) – 量子ビットワイヤーの先頭に ∣0⟩|0\rangle、古典的なワイヤーに 00。 デフォルトはFalseです。

  • cregbundle (bool | None) – True に設定すると、古典的なレジスタを束ねる。 output が "text" に設定されている場合を除き、デフォルトは True である。

  • wire_order (list[int] | None) – ビットの表示の順番を変更するための整数のリスト。 このリストには、0から(num_qubits + num_clbits)までの範囲のビットを持つ、各ビットのエントリーがなければならない。

  • ControlFlowOpexpr_len (int) – の条件式で が Expr 使用された場合に表示される文字数。 この数値を超えた場合、文字列はその数値の位置で切り詰められ、末尾に「…」が追加されます。

  • 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 (if output='text')

    アスキーアートとして印刷できるドローイング。

  • matplotlib.figure.Figure (if output='mpl')

    回路図の matplotlib figure オブジェクト。

  • PIL.Image (if output='latex')

    回路図のイメージのメモリ内表現。

  • str (if output='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)

GitHub

この回路で分解パスを呼び出し、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レベル分解回路

戻りの型

QuantumCircuit

reverse_bits

reverse_bits()

GitHub

配線の順序を逆にした回路を返す。

回路は "垂直に "反転している。 回路が複数のレジスタにわたって定義されている場合、結果として得られる回路は同じレジスタを持つが、その順序は反転する。

この方法は、リトルエンディアンで書かれた回路をビッグエンディアンと等価なものに変換するのに便利である。

戻り値

ビットの順序を逆にした回路。

戻りの型

QuantumCircuit

例

を入力する:

     ┌───┐
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 ├──■─────────────────
     └───┘

パラメーター

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