パスマネージャー
qiskit.passmanager
概要
Qiskitのパスマネージャーは、 LLVMコンパイラを参考に開発されています。 コンパイラインフラストラクチャでは、役割が「タスク」、「フローコントローラ」、「パスマネージャ」という3つの主要なコンポーネントに分割されています。
コンパイルパイプラインは、一連のオブジェクト Task を実行します。各オブジェクトは、中間表現(IR)を入力として受け取り、処理を実行し、場合によっては異なるIRを出力として返します。 ここで、がインターフェースを定義 Task しており、アトミックタスクとは、をサブクラス化し GenericPass 、その抽象 run() メソッドを実装するパスである。 これは、カスタムコンパイラパスを実装する際に基底クラスとして使用すべきクラスです。
フローコントローラは、一連のタスクに対する実行モデルを提供します。 最も単純なフローコントローラは FlowControllerLinear、一連のタスクを直線的な順序で実行するだけのものです。 より高度なフロー制御には、ループや条件分岐が含まれます。 これらは、例えば、Qiskitのプリセットトランスパイラパイプラインにおいて、収束基準が満たされるまで最適化が実行される、より高い最適化レベルで利用されています。
パスマネージャーは、必要な分析のスケジュール設定や、ユーザーによるタスク順序の変更を可能にするなど、タスクの管理を担当します。 Qiskitはこのモジュールで2つのIR汎用パスマネージャーを提供しており、また、IR DAGCircuit として特化したパスマネージャーも提供しています qiskit.transpiler。 IR汎用タイプは以下の通りです:
-
BasePassManager: IRが固定されたパスマネージャー。 このパスマネージャーでは、実行するタスクのセットを変更することができ、. を利用して複数の入力の並列実行をサポートしていますparallel_map()。 このクラスでは、入力プログラム表現を内部IRへ変換する機能に加え、出力プログラム形式への変換機能もサポートしています。これは、によって返されるような、Qiskitのトランス
DAGCircuitパイル用プリセット・パス・マネージャーの基底クラスBasePassManagerですgenerate_preset_pass_manager()。 ここでは、入出力プログラム形式QuantumCircuitとして、への暗黙の変換およびからの暗黙の変換が使用されています。 -
MultiStagePassManager: 各ステージでIRを維持または低減できる、ステージ型パスマネージャー。 ステージは、またはTaskその反復可能オブジェクトによって定義され、これらを内にグループ化することも可能ですBasePassManager。 各段は、現在の段の出力IRが次の段の入力IRと一致するように設定する必要があります。なお、(現時点では)自動変換機能はありません。
また、パスマネージャーは、コンテキスト PropertySet 情報をすべてのタスクに伝達するためのインフラストラクチャと、自己検査用のコールバック関数も提供します。 これはフリーフォームの辞書であり PropertySet 、実行中にパスによって値が設定・参照されるほか、フローコントローラによって参照され、パスの実行を制御することもできます。 このプロパティセットは移植性があり、実行時にパスからパスへと引き継がれます。 プロパティセットに加え、タスクにはデータ WorkflowStatus 構造も割り当てられます。 このオブジェクトは、パスマネージャーが実行された際に初期化され、基盤となるタスクに渡されます。 ステータスは各パスが実行されるたびに更新され、パイプラインの状態(実行されたパスの数、失敗状態など)に関する情報が含まれます。これに対し PropertySet、には最適化対象のIRに関する情報が含まれます。
コールバックは、以下のシグネチャを期待するインスタンス GenericPass によって呼び出されます:
def callback(
*,
task: Task[IR_IN, IR_OUT],
passmanager_ir: IR_OUT,
property_set: PropertySet,
running_time: float,
count: int
) -> None:
...なお、このシグネチャは、モジュール qiskit.transpiler で定義されているパスおよびパスマネージャーの場合、若干異なります。
例
ここでは、ある単純な最適化タスク、すなわち、数字の列を用意し、その中に「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()次に、条件が満たされた場合にのみ保存されたタスクを実行する で、 ConditionalController 「5つ削除」タスクをラップします。
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ドキュメントをご覧ください。
インターフェース
成功
GenericPass() | シングル・パス・マネージャー・タスクの基本クラス。 |
Task() | パスマネージャータスクのインターフェース。 |
パス管理者
BasePassManager( [タスク数, 最大反復回数] ) | パスマネージャベースクラス。 |
MultiStagePassManager(**ステージ) | 複数のIRをサポートするステージド・パスマネージャー。 |
流量制御器
BaseController( [オプション] ) | コントローラの基本クラス。 |
FlowControllerLinear( [タスク、オプション] ) | タスクを次々に実行する標準的なフローコントローラー。 |
ConditionalController( [タスク、条件、……] ) | フローコントローラは、条件が真であればパイプラインを1回実行し、条件が偽であれば何もしない。 |
DoWhileController( [タスク, do_while, オプション] ) | プロパティセットの do_while 条件が False になるまで、与えられたタスクをループで実行する。 |
コンパイル状態
PropertySet | デフォルトの辞書のようなオブジェクト。 |
WorkflowStatus( [count, completed_passes,...] ) | ワークフローのコンパイルステータスのコレクション。 |
PassManagerState(ワークフローのステータス, プロパティの設定) | パス・マネージャー・タスクがジェネレーターを通して通信するポータブル・コンテナ・オブジェクト。 |
例外
PassManagerError
exception qiskit.passmanager.PassManagerError(*message)
ベース: QiskitError
パスマネージャーエラー。
エラーメッセージを設定する。