パスマネージャー
qiskit.passmanager
概要
Qiskitパス・マネージャーは LLVMコンパイラーに多少インスパイアされているが、プレーンなソースコードではなく、 Python オブジェクトを入力として受け取るように設計されている。
パス・マネージャーは、入力された Python オブジェクトを中間表現(IR)に変換し、複数のパスにわたってさまざまな変換で最適化し、低くすることができる。 パス・マネージャー・フレームワークは、最適化の文脈に応じて、インターリーブされた変換パスを持つ複数のIRを採用することができる。
現在、Qiskitの内蔵パスマネージャーでは、複数のIRを実際に使用/設計することはありません。 passmanager モジュールの実装は、実際のIRの型には不可知論的であり(つまり、厳密な型チェックは行われない)、IRが後続のパスで必要とされるすべてのメソッドを実装している限り、パス・マネージャーは機能する。 複数のIRを使用するための具体的な設計は、将来のリリースで提供されるかもしれない。
パスはQiskitバックエンドが提供するハードウェア制約を消費する可能性があります。 最後に、IRは Python オブジェクトに変換される。 入力タイプと出力タイプは必ずしも同じではないことに注意。
パス・マネージャーにおけるコンパイルとは、IRを受け取り、何らかの最適化やデータ解析を施した新しいIRを出力する、 Task の一連の実行のことである。 アトミック・タスクとは*、* 受信したIRに対して何らかの処理を行う メソッドを実装した GenericPass のサブクラスであり、受け取ったIRに対して何らかの処理を行う run() メソッドを実装するパスである。 のサブクラスであるフロー・コントローラーを形成することができる。 BaseControllerのサブクラスであり、どのパスが次に実行されるかを決定するための、コンパイル状態に依存する任意のロジックを実装することができます。 自由形式の辞書である PropertySet オブジェクトを介して中間データを共有する。 パスは、タスク実行中にプロパティ・セット・ディクショナリを入力することができる。 フローコントローラは、パスの実行を制御するためにプロパティセットを消費することもできるが、このアクセスは読み取り専用でなければならない。 プロパティ・セットはポータブルであり、実行時にパスからパスへと引き渡される。 プロパティセットに加えて、タスクは WorkflowStatus データ構造も受け取る。 このオブジェクトは、パス・マネージャーが実行されるときに初期化され、基本タスクに引き渡される。 ステータスは、パスが実行されるたびに更新され、パイプラインの状態(実行されたパスの数、失敗の状態など)に関する情報が含まれます。 PropertySetとは対照的に、パイプラインの状態(実行されたパスの数、失敗の状態など)に関する情報が含まれます。
パス・マネージャーはフロー・コントローラーのラッパーであり、以下の責任を持つ
- 最適化タスクのスケジューリング
- 入力 Python オブジェクトを特定の Qiskit IR に変換する、
- プロパティセットとワークフローのステータスを初期化する、
- IRに一連の変換を適用するためにスケジュールされたタスクを実行する、
- IRを出力 Python オブジェクトに戻す。
これは、フローコントローラ自体が型にとらわれないことを示しており、開発者はデータ変換ステップを管理するために BasePassManager のサブクラスを実装しなければならない。 この無知のヴェールによって、特定のパス・マネージャー・タスクに対して最も効率的なデータ表現を選択することができ、一方で異なる入出力タイプに対してフロー制御マシンを再利用することができる。
単一のフローコントローラは、常に単一のIRオブジェクトを受け取り、単一のIRオブジェクトを返す。 複数の入力オブジェクトに対する並列処理は BasePassManager 関数を介してフローコントローラをブロードキャストすることで parallel_map() 関数によってサポートされている。
例
ここでは、ある単純な最適化タスク、すなわち、数字の列を用意し、その中に「5」が含まれている場合はその数字を削除するという課題について検討します。 入力された数値を文字列に変換すれば、このような処理は簡単に実行できるでしょう。 ここではパスマネージャーフレームワークを使用しますが、効率性についてはひとまず脇に置き、カスタムQiskitコンパイラの構築方法を学びます。
from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
class ToyPassManager(BasePassManager):
def _passmanager_frontend(self, input_program: int, **kwargs) -> str:
return str(input_program)
def _passmanager_backend(self, passmanager_ir: str, in_program: int, **kwargs) -> int:
return int(passmanager_ir)このパス・マネージャーは、文字列データに対して最適化タスクを実行しながら、整数値を入出力する。 したがって、入力、IR、出力の型はそれぞれ整数、文字列、整数である。 _passmanager_frontend() メソッドは入力データからIRへの変換を定義し、 _passmanager_backend() はIRから出力データへの変換を定義する。 パスマネージャー・バックエンドには、最終的な変換のために入力プログラムのオリジナルのメタデータを参照するために、フロントエンドへのオリジナルの input_program を含む in_program パラメータも与えられる。
次に、数字が5のときに1桁を削除するパスを実装する。
class RemoveFive(GenericPass):
def run(self, passmanager_ir: str):
return passmanager_ir.replace("5", "")
task = RemoveFive()最後に、パスマネージャーをインスタンス化し、それを使ってタスクをスケジュールします。 パスマネージャーにランダムな数字の列を入力すると、5を含まない新しい数字が返されます。
pm = ToyPassManager()
pm.append(task)
pm.run([123456789, 45654, 36785554])出力:
[12346789, 464, 36784]ここで、条件付き実行の場合を考えてみよう。 入力数字が6桁以下の場合は、「5を取り除く」タスクの実行を避ける。 このような制御は、流量制御装置によって実施することができる。 我々は、フローコントローラーに桁数に関する情報を提供する分析パスから始める。
class CountDigits(GenericPass):
def run(self, passmanager_ir: str):
self.property_set["ndigits"] = len(passmanager_ir)
analysis_task = CountDigits()次に、remove fiveタスクを ConditionalController でラップする。
def digit_condition(property_set):
# Return True when condition is met.
return property_set["ndigits"] > 6
conditional_task = ConditionalController(
tasks=[RemoveFive()],
condition=digit_condition,
)先ほどと同じように、パスマネージャーでこれらのパスをスケジューリングし、実行する。
pm = ToyPassManager()
pm.append(analysis_task)
pm.append(conditional_task)
pm.run([123456789, 45654, 36785554])出力:
[12346789, 45654, 36784]5を取り除く」タスクは、6桁を超える1番目と3番目の入力値に対してのみトリガーされる。
パスマネージャーフレームワークを使用すれば、開発者は複数のパスとフローコントローラを組み合わせることで、最適化タスクを柔軟にカスタマイズできます。 詳細は、以下のクラスAPIドキュメントをご覧ください。
インターフェース
基本クラス
BasePassManager([tasks, max_iteration] ) | パスマネージャベースクラス。 |
BaseController[(オプション)] | コントローラの基本クラス。 |
GenericPass() | シングル・パス・マネージャー・タスクの基本クラス。 |
流量制御器
FlowControllerLinear[(タスク、オプション)] | タスクを次々に実行する標準的なフローコントローラー。 |
ConditionalController[(タスク、条件、...)] | フローコントローラは、条件が真であればパイプラインを1回実行し、条件が偽であれば何もしない。 |
DoWhileController([tasks, do_while, options] ) | プロパティセットの do_while 条件が False になるまで、与えられたタスクをループで実行する。 |
コンパイル状態
PropertySet | デフォルトの辞書のようなオブジェクト。 |
WorkflowStatus([count, completed_passes,...] ) | ワークフローのコンパイルステータスのコレクション。 |
PassManagerState(workflow_status, property_set) | パス・マネージャー・タスクがジェネレーターを通して通信するポータブル・コンテナ・オブジェクト。 |
例外
PassManagerError
exception qiskit.passmanager.PassManagerError(*message)
ベース: QiskitError
パスマネージャーエラー。
エラーメッセージを設定する。