破壊的変更¶
HugrTranspiler.transpile()が実行可能なプログラムを返すように変更¶
HugrTranspiler.transpile()は、他のエンジンと同様にrun()やsample()で実行できるHugrExecutableを返すようになりました。v0.15.0で返していたCompiledProgramが必要なコードでは、HugrTranspiler.compile()を使用してください。
機能強化¶
Grover Adaptive Searchで使う探索回路を生成¶
Grover Adaptive Search(GAS)向けのGASConverterを追加しました。BinaryModelやOMMX(最適化問題を受け渡すためのデータ形式)の問題を受け取り、0/1変数で表す二次・高次の目的関数(QUBO/HUBO)に対応します。探索の基準となる目的関数値とGrover探索の反復回数を指定して、その基準値を下回る候補を探す回路を作成し、測定結果を解候補の変数の値に戻せます。
探索全体を実行するには、候補の評価、基準値と反復回数の更新、終了条件の判定を行うPythonの繰り返し処理を組み合わせてください。整数でない係数は、既定では共通の倍率を掛けて整数に近似するため、結果に近似誤差が生じる場合があります。
実装例はGrover Adaptive Searchドキュメントを参照してください。
IBM Quantumの実機で実行¶
QiskitExecutorを使って、Qamomileの量子プログラムをIBM Quantumの実機で実行できるようになりました。利用にはqamomile[qiskit]のインストールと、IBM Quantumアカウントおよびインスタンスの設定が必要です。
詳しくはQiskitサポートを参照してください。
HUGRプログラムをSeleneまたはHeliosで実行¶
中間表現であるHUGRに変換した量子プログラムを、ローカルのSeleneシミュレーターまたはNexus経由のQuantinuum Heliosで実行できるようになりました。利用にはqamomile[hugr]をインストールしてください。Heliosには、Nexusアカウントとプロジェクトの設定も必要です。
QIntで量子ビットレジスタを符号なし整数として測定¶
qmc.cast(register, qmc.QInt)で量子ビットレジスタ(Vector[Qubit]型の配列)を符号なし整数として扱い、qmc.measure()でqmc.UIntを取得できるようになりました。先頭の量子ビットが最下位ビット(重みが1の桁)になります。変換には同じ量子ビットを使います。その後の量子操作には、元の変数ではなく、返されたQIntを使用してください。
通常の量子カーネル呼び出しでは、QIntを引数や戻り値として受け渡すこともできます。
import qamomile.circuit as qmc
from qamomile.qiskit import QiskitTranspiler
@qmc.qkernel
def measure_integer() -> qmc.UInt:
register = qmc.qubit_array(3, "register")
register[0] = qmc.x(register[0])
register[1] = qmc.x(register[1])
integer = qmc.cast(register, qmc.QInt)
return qmc.measure(integer)
transpiler = QiskitTranspiler()
executable = transpiler.transpile(measure_integer)この例では整数3が測定されます。QIntはレジスタ幅全体を使用します。int_bitsはQFixedでのみ指定できるため、省略してください。スライス(配列の一部)を変換する場合、範囲の境界は定数である必要があります。
HUGRでは、トランスパイル(実行先に合わせたプログラムの変換)の時点で幅が確定する、0〜64ビットのQIntを測定できます。この幅の上限はHUGRにのみ適用されます。使い方と制限事項はHUGRで量子整数を測定するを参照してください。
ローカルの計算結果を含むジョブを保存・復元¶
job.snapshot()で、定数の期待値などの取得済みのローカル結果も、リモートジョブ(外部サービスに送信した計算)とともに保存できるようになりました。両方を含むグループでも、各結果の型と順序を保って復元できます。復元時には保存済みの結果や送信済みのジョブを使い、量子ジョブを再送信しません。Braketのローカル実行では、先にresult()で結果を取得してください。
復元には、同じ実行可能プログラムと元の実行時引数を使用してください。認証情報と実行時引数はスナップショット(復元に必要な保存データ)に含まれません。以前の形式で保存したリモートジョブも引き続き復元できます。
バグ修正¶
トランスパイルとシリアライズを通してQFixedの幅と値を保持¶
QFixedへのキャストで、レジスタ幅がsymbolicな場合にも、ゼロ以外の定数をint_bitsに指定できるようになりました。トランスパイル時に解決される分岐で幅の異なるレジスタを選択した場合も、選択したレジスタに合わせて固定小数点数の配置を正しく構築します。測定結果のデコード、リソース推定、シリアライズで、選択した量子ビットとその順序を保持するように修正しました。定数の境界で指定したスライスや、量子カーネルの呼び出しを経由する値にも対応します。測定幅を解決できない場合は、空のレジスタとして扱わず、SeparationErrorを通知します。
同じ量子カーネルからQFixedの測定結果と別のレジスタの測定結果をまとめて返すと、トランスパイルに失敗することがあった問題を修正しました。QIntを含む複数の測定結果も、それぞれの型と戻り値の順序を保って返せます。
復元した量子カーネルで整数・固定小数点レジスタを正しく描画¶
シリアライズとデシリアライズを経た後も、回路図がQFixedとQIntのレジスタの実際の量子ビット配線と測定先を保持するようになりました。スライスしたレジスタや、別の量子カーネルから返された整数・固定小数点数のレジスタの配置も修正しました。
QURI Partsで不正な測定回数を受け付ける問題を修正¶
QuriPartsExecutorで、サンプラー(測定結果と出現回数を返す関数)から返された小数部分を含む値や負数を、測定回数としてそのまま受け付けていた問題を修正しました。不正な値はValueErrorで通知します。3.0のように整数と等しい値は、Pythonのintに変換して扱います。
グループ内の未完了ジョブすべてにキャンセルを試行¶
キャンセル時には、あるジョブの状態確認やキャンセルに失敗しても、未完了のすべてのジョブに対してキャンセルを試みるようになりました。失敗はすべてのジョブの処理後にExceptionGroupにまとめて通知されます。グループのキャンセルでプロバイダー由来のエラーを処理するコードでは、この集約された例外を処理してください。
その他の変更¶
Qiskitサポートに、IBM Quantumの認証、Runtimeオプション、実機実行、ジョブの復元に関する説明を追加しました。
QiskitなどのSDKやHUGRなどの中間表現(IR)との連携を「エンジン」と呼ぶように統一しました。サポート先への変換・実行に関わるコードのAPI名も、
backendからengineへ変更しました。