OpenQASM 3
qiskit.qasm3
Qiskitは、量子プログラムの OpenQASM 3 表現を変換するためのいくつかのツールを提供しています。 QuantumCircuit クラスを提供します。 これらは、 OpenQASM 3によって表現されたダイナミックサーキット機能に対するQiskitのサポートが増加するにつれて進化し続ける。
OpenQASM へのエクスポート 3
高レベルの関数は単純に dump() と dumps()で、それぞれファイル(ファイル名で指定)と Python 文字列にエクスポートする。
dump
qiskit.qasm3.dump(circuit, stream, **kwargs)
オブジェクトを QuantumCircuit オブジェクトを OpenQASM 3 ストリームからファイルのようなオブジェクトにシリアライズする。
パラメーター
- circuit (QuantumCircuit) – シリアライズする回路。
- stream (TextIOBase) – ストリームのようなオブジェクトで、 OpenQASM 3 のシリアライズをダンプする
- **kwargs – 引数
Exporterコンストラクタ。
戻りの型
なし
dumps
qiskit.qasm3.dumps(circuit, **kwargs)
オブジェクトを QuantumCircuit オブジェクトを OpenQASM 3 文字列でシリアライズする。
パラメーター
- circuit (QuantumCircuit) – シリアライズする回路。
- **kwargs – 引数
Exporterコンストラクタ。
戻り値
OpenQASM 3 シリアル化
戻りの型
これらのエクスポータ関数はどちらも、メイン Exporter クラスのラッパーである。 1回のセッションで複数の回路をダンプするなど、より複雑な書き出しが必要な場合は、完全なインターフェイスを使用する方が便利で速いかもしれません。
エクスポーター
class qiskit.qasm3.Exporter(includes=('stdgates.inc', ), basis_gates=('U', ), disable_constants=False, alias_classical_registers=None, allow_aliasing=None, indent=' ', experimental=<ExperimentalFeatures: 0>, annotation_handlers=None, implicit_defcals=None)
ベース: object
QASM3 exporter メインクラス。
パラメーター
-
includes (Sequence[str]) –
インクルードするファイル名。
注現時点では、標準ライブラリ・ファイル
stdgates.inc、エクスポータが正しく理解できるのは、それが定義するゲートを知っているという意味においてのみである。 他のインクルードを指定することもできるが、エクスポータが別のgate定義を出力するのを避けるため、basis_gates引数に、それらが定義するゲートの名前を渡す必要がある。 -
basis_gates (Sequence[str]) – バックエンドの基本ゲートセット。
-
disable_constants (bool) –
Trueの場合、数値パラメータ値には常に浮動小数点定数を返す。False(デフォルト)の場合、 OpenQASM 3つの定数(pi、euler、tau)の倍数に近い値が、代わりにこれらの定数で出力され、出力の精度が向上する可能性があります。 -
alias_classical_registers (bool | None) –
Trueの場合、ビットは複数のレジスタに含まれる可能性がある。 その場合、レジスタは "エイリアス "定義を使って発行されることになるが、これは OpenQASM 3のコンシューマーではあまりサポートされていないかもしれない。関連資料パラメータ
allow_aliasingallow_aliasingに指定した値は、ここで指定した値よりも優先される。 -
allow_aliasing (bool | None) –
Trueの場合、ビットは複数のレジスタに含まれる可能性がある。 その場合、レジスタは "エイリアス "定義を使って発行されることになるが、これは OpenQASM 3のコンシューマーではあまりサポートされていないかもしれない。 デフォルトはFalseまたはalias_classical_registersの値。バージョン 0.25.0 で追加されました。 -
indent (str) – インデントされたブロック内の各レベルで使用するインデント文字列。 インデントを無効にするには空文字列を設定する。
-
experimental (ExperimentalFeatures) – エクスポート中に有効にする実験的な機能。 参照
ExperimentalFeaturesを参照のこと。 -
annotation_handlers (dict[str, OpenQASM3Serializer] | None) – 名前空間と注釈シリアライザーのマッピング。 オブジェクト
Annotationオブジェクトに出会うと、このマッピングの中でアノテーションのnamespace属性に一致する、このマッピングで最も具体的な名前空間がそのオブジェクトのシリアライズに使用されます。 -
implicit_defcals (dict[str, DefcalInstruction] | None) – のマッピング
Instruction.nameを関連するDefcalInstructionオブジェクトにマッピングする。 入力回路内のキー名を持つすべての命令は、指定されたDefcalInstructionに対応するdefcalステートメントが定義されているかのように出力されるべきである。 キー名とDefcalInstruction.nameは一致する必要はない。defcalの名前は、 OpenQASM 3 キーワードと衝突することはない。
dump
dumps
これらのインターフェースはすべて QASM3ExporterError を上げる。
QASM3ExporterError
exception qiskit.qasm3.QASM3ExporterError(*message)
ベース: QASM3Error
OpenQASM 3 エクスポーターの実行中にエラーが発生しました。
エラーメッセージを設定する。
試験的機能
OpenQASM 3言語は、ハードウェアの性能の向上とともに進化し続けているため、Qiskitが確実にターゲットとできる最終的な構文はありません。 進化する言語を表現するため、正式な標準化の前に機能をリリースすることもあります。これは、 OpenQASM 3 デザイン委員会でのレビュープロセスが進むにつれ、変更する必要があるかもしれません。 デフォルトでは、エクスポータは言語の標準的な機能のみをサポートする。 これらの早期リリース機能を有効にするには、 experimental のキーワード引数を使用します。 dump() と dumps(). 利用可能な機能フラグは以下の通り:
ExperimentalFeatures
class qiskit.qasm3.ExperimentalFeatures(*values)
ベース: Flag
OpenQASM 3 エクスポーターがサポートする実験的機能のフラグ。
これらは実験的なもので、 OpenQASM 3仕様がまだ正式に受け入れていないため、構文が確定していない可能性があり、変更される可能性が高い。
SWITCH_CASE_V1
デフォルト値: 1
によって提案された switch-case 文のエクスポートをサポートします。 https://github.com/openqasm/openqasm/pull/463 bfa787aa3078 によって提案されたswitch case文のエクスポートをサポートする。
これらは出力フォーマットを持っている:
switch (i) {
case 0:
case 1:
x $0;
break;
case 2: {
z $0;
}
break;
default: {
cx $0, $1;
}
break;
}これは、安定化された switch ステートメントの構文とは異なる。 このフラグが渡されない場合、パーサーは代わりに安定化構文を使用して出力する:
switch (i) {
case 0, 1 {
x $0;
}
case 2 {
z $0;
}
default {
cx $0, $1;
}
}複数の実験的機能を有効にしたい場合は、 flag1 | flag2 のように、 | 演算子を使用してフラグを組み合わせてください。
例えば、 switch サポートの初期セマンティクスを使用してエクスポートを実行する:
from qiskit import qasm3, QuantumCircuit, QuantumRegister, ClassicalRegister
# Build the circuit
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
with qc.switch(creg) as case:
with case(0):
qc.x(0)
with case(1, 2):
qc.x(1)
with case(case.DEFAULT):
qc.x(2)
# Export to an OpenQASM 3 string.
qasm_string = qasm3.dumps(qc, experimental=qasm3.ExperimentalFeatures.SWITCH_CASE_V1)実験的なフラグによって可能になるすべての機能は、当然ながら一過性のものである。 フラグを削除する必要が生じた場合は、 Qiskitの標準的な非推奨ポリシーに従います。 これらの実験的なフラッグは、妥当な限りそのままにしておく。
しかし、これらの実験的フラグを使用して生成された OpenQASM 3コードの消費者に対して、 OpenQASM 3言語仕様がフラグのベースとなる提案を変更した場合、サポートウィンドウを保証することはできません。 これらのフラグを使用して作成された OpenQASM 3コードを消費するために使用しているツールは、Qiskitがそのフラグを提供し続けている間に、更新されたりサポートが削除されたりする可能性があります。 プログラムの長期保存のために、結果の実験的な OpenQASM 3コードに頼るべきではありません。
OpenQASM からのインポート 3
OpenQASM 3からのインポートに対するQiskitのサポートは初期段階にあり、実装が大幅に変更されることが予想されるため、現在提供されているのは高レベルの2つの機能のみです。 つの関数は load() と loads()である。 dump() と dumps()それぞれ、指定されたファイルから間接的にプログラムをロードする関数と、指定された文字列から直接プログラムをロードする関数である。
まだ試験的なリリース期間中ですが、どちらの機能を使うにも、 qiskit_qasm3_import パッケージをインストールする必要があります。 これはQiskitを qasm3-import :
pip install qiskit[qasm3-import]この機能はいずれQiskitに統合され、オプションのインポートが不要になるものと期待していますが、その時期は未定です。
load
qiskit.qasm3.load(filename, *, num_qubits=None, annotation_handlers=None)
filename ファイルから OpenQASM 3 プログラムをロードする。
パラメーター
- filename (str) – プログラムをロードするファイル名。
- num_qubits (int | None) – キーワード引数は、物理/仮想量子ビットの数を指定します。
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – キーが(親)ネームスペースで、値がそれらのネームスペースの子要素を処理できるシリアライザであるマッピング。 が必要です
qiskit_qasm3_import>=0.6.0。
戻り値
OpenQASM 3 プログラムの回路図。
戻りの型
レイズ
QASM3ImporterError - OpenQASM 3 ファイルが無効な場合、または、 3 ファイルで表すことができない場合、 3 ファイルで表すことができない場合、 3 ファイルで表すことができる。 QuantumCircuit.
annotation_handlers 。 これには qiskit_qasm3_import>=0.6.0 が必要だ。
loads
qiskit.qasm3.loads(program, *, num_qubits=None, annotation_handlers=None)
与えられた文字列から OpenQASM 3 プログラムをロードする。
例
引数 num_qubits の有無にかかわらず、 OpenQASM3 文字列を量子回路にロードする。
from qiskit import qasm3
# An OpenQASM 3 program that only uses 2 physical qubits.
prog = '''
OPENQASM 3.0;
include "stdgates.inc";
h $0;
cx $0, $1;
'''
# The importer can be supplied with the number of qubits in the target backend.
# so the result is full width.
qc = qasm3.loads(prog, num_qubits=5)
assert qc.num_qubits == 5パラメーター
- program (str) – OpenQASM 3 プログラム。
- num_qubits (int | None) – 物理/仮想量子ビットの数。
- annotation_handlers (dict[str, annotation.OpenQASM3Serializer] | None) – キーが(親)ネームスペースで、値がそれらのネームスペースの子要素を処理できるシリアライザであるマッピング。 が必要です
qiskit_qasm3_import>=0.6.0。
戻り値
OpenQASM 3 プログラムの回路図。
戻りの型
レイズ
- QASM3ImporterError - OpenQASM 3 ファイルが無効な場合、または、 3 ファイルで表すことができない場合、 3 ファイルで表すことができない場合、 3 ファイルで表すことができる。
QuantumCircuit. - ValueError - qasm3_ckt の量子ビット数が num_qubits より多い場合。
annotation_handlers 。 これには qiskit_qasm3_import>=0.6.0 が必要だ。
これら2つの機能はいずれも、失敗時に QASM3ImporterError を上げる。
QASM3ImporterError
exception qiskit.qasm3.QASM3ImporterError(*message)
ベース: QASM3Error
OpenQASM 3 インポーターでエラーが発生しました。
エラーメッセージを設定する。
例えば、 OpenQASM 3 を使って量子プログラムを定義し、それを loads() を使って直接 QuantumCircuit:
import qiskit.qasm3
program = """
OPENQASM 3.0;
include "stdgates.inc";
input float[64] a;
qubit[3] q;
bit[2] mid;
bit[3] out;
let aliased = q[0:1];
gate my_gate(a) c, t {
gphase(a / 2);
ry(a) c;
cx c, t;
}
gate my_phase(a) c {
ctrl @ inv @ gphase(a) c;
}
my_gate(a * 2) aliased[0], q[{1, 2}][0];
measure q[0] -> mid[0];
measure q[1] -> mid[1];
while (mid == "00") {
reset q[0];
reset q[1];
my_gate(a) q[0], q[1];
my_phase(a - pi/2) q[1];
mid[0] = measure q[0];
mid[1] = measure q[1];
}
if (mid[0]) {
let inner_alias = q[{0, 1}];
reset inner_alias;
}
out = measure q;
"""
circuit = qiskit.qasm3.loads(program)
circuit.draw("mpl")
実験的なインポートインターフェース
上記のインポート関数は、 OpenQASM プロジェクト自身が提供する ANTLR ベースのリファレンスパーサーに依存しています。これは、実行可能なパーサーというよりも、言語リファレンスとして意図されています。 使用するには、 qiskit-qasm3-import という拡張機能がインストールされている必要があります。
QiskitはRustで書かれたネイティブパーサーを開発しており、Qiskitのコアパッケージの一部として利用可能です。 このパーサーはまだ初期の実験段階であるため、機能が不足しており、インターフェイスも変化・拡張している。しかし、現在サポートしている OpenQASM 3 のサブセットでは、一般的に桁違いにパフォーマンスが高く、内部ではパース失敗時のエラー診断も優れている。
上記のメイン・インターフェースと同様の機能を持つ実験的なインターフェースをすぐに使うことができる:
load_experimental
qiskit.qasm3.load_experimental(pathlike_or_filelike, /, *, custom_gates=None, include_path=None)
OpenQASM 3 プログラムをソースファイルから QuantumCircuit.
OpenQASM 3 インポーターのこのネイティブバージョンは、現在実験的なものである。 よりもはるかに高速である。 load()しかし、サポートされる機能セットが少ない。
パラメーター
- pathlike_or_filelike (str |os.PathLike |io.TextIOBase) – プログラムソース これは、ファイルパス、またはオープン・テキスト・ストリーム・オブジェクトとして与えられる。 ストリームがすでにオープンされている場合、 Python のスペースで消費されるのに対し、ファイル名はRustのスペースでオープンされ消費される。お使いのシステムや、ストリームがデフォルトでどのようにバッファリングされているかによって、パフォーマンス特性が若干異なる場合がある。
- custom_gates (Iterable[CustomGate]) – Python 特定の名前のゲートに使用するコンストラクタ。 供給されない場合、Qiskitは OpenQASM 3.0 標準ライブラリファイル
stdgates.incで定義されたゲートのための独自の標準ライブラリコンストラクタを使用します。 - include_path (Iterable[str]) –
includeステートメントを解決するときに検索するパス。 指定されない場合、Qiskitはこれがstdgates.incのみを含む場所を指すように手配します。 パスは順番に試される。
戻り値
構築された回路オブジェクト。
戻りの型
レイズ
.QASM3ImporterError - 構文解析または意味解析中にエラーが発生した場合。 解析エラーの場合、ほとんどのエラーメッセージはターミナルに出力され、見やすく整形される。
loads_experimental
qiskit.qasm3.loads_experimental(source, /, *, custom_gates=None, include_path=None)
文字列から OpenQASM 3 プログラムをロードする。 QuantumCircuit.
OpenQASM 3 インポーターのこのネイティブバージョンは、現在実験的なものである。 よりもはるかに高速である。 loads()しかし、サポートされる機能セットが少ない。
パラメーター
- source (str) – プログラム・ソースを Python の文字列で指定する。
- custom_gates (Iterable[CustomGate]) – Python 特定の名前のゲートに使用するコンストラクタ。 供給されない場合、Qiskitは OpenQASM 3.0 標準ライブラリファイル
stdgates.incで定義されたゲートのための独自の標準ライブラリコンストラクタを使用します。 - include_path (Iterable[str]) –
includeステートメントを解決するときに検索するパス。 指定されない場合、Qiskitはこれがstdgates.incのみを含む場所を指すように手配します。 パスは順番に試される。
戻り値
構築された回路オブジェクト。
戻りの型
レイズ
.QASM3ImporterError - 構文解析または意味解析中にエラーが発生した場合。 解析エラーの場合、ほとんどのエラーメッセージはターミナルに出力され、見やすく整形される。
この2つの関数はどちらも実験的なものです。 ExperimentalWarning を発行することを意味し、 そのインターフェースはQiskit 1.x リリースシリーズ内で変更される可能性があります。 特に、ネイティブ・パーサーは、デフォルト・バージョンの load() そして loads(). 実験的なインターフェイスを使用するリスクを喜んで受け入れるのであれば、警告を無効にすることができる:
import warnings
from qiskit.exceptions import ExperimentalWarning
warnings.filterwarnings("ignore", category=ExperimentalWarning, module="qiskit.qasm3")この2つの関数により、インクルード・パスをパスの反復可能なものとして指定したり、特定のゲートに使用するカスタム Python コンストラクタを指定したりすることができる。 これらのカスタムコンストラクタは CustomGate オブジェクトで指定します:
CustomGate
class qiskit.qasm3.CustomGate(constructor, name, num_params, num_qubits)
ベース: object
Python、宣言される可能性のある特定のゲートを表す Python -空間オブジェクトを構築する方法について空間から受信した情報。
constructor
呼び出し可能な Python オブジェクト。 num_params 角度を位置引数として受け取り、ゲートを表すオブジェクトを返す。 Gate オブジェクトを返します。
name
OpenQASM 3 プログラムに表示されるゲート名。 これは必ずしもQiskitがゲートにつけた名前と同一ではない。
num_params
ゲートが必要とする角度のようなパラメータの数。
num_qubits
ゲートが作用する量子ビットの数。
が custom_gates 指定されていない場合、Qiskitは OpenQASM 3標準ライブラリファイルで定義 stdgates.incされているゲートに対して、標準ライブラリのゲートオブジェクトを使用しようとします。 このモジュールには以下のゲート配列が用意されています。これを基に構築したい場合は、以下をご利用ください:
qiskit.qasm3.STDGATES_INC_GATES
のタプル。 CustomGate オブジェクト。 stdgates.inc インクルードファイルで使用するQiskitコンストラクタを指定する。