Samplex
class samplomatic.samplex.Samplex
ベース: object
回路パラメータやその他のフィールドに関する確率分布を表します。
Samplex これは、samplomatic ライブラリの中核となる型です。 これは「サンプリング・コンプレックス」を組み合わせた造語です。
抽象的に言えば、サンプレックスとは、あるテンプレート回路のパラメータに関するパラメトリック確率分布を表すとともに、そのテンプレート回路の実行から収集されたデータの後処理に用いるその他の配列値のフィールドも表すものである。 具体的には、この分布からサンプルを抽出し、テンプレート回路で有効な(ランダムな)角度の配列を少なくとも1つ含む配列の集合を生成するメソッド sample() を実装しています。 例えば、あるサンプレックス・インスタンスは、最終測定を含むあるベース回路のすべての層でパウリ・トゥワーリングを実装している場合があり、それにより、そこからサンプリングして得られる角度は、ベース回路内に存在する任意の単一量子ビットゲートと組み合わされたパウリゲートに対応する。また、測定トゥワーリングによって反転した測定結果をどのように反転させるかを記述するブール配列も含まれる。 しかし、その意味論はこれに限定されるものではなく、その構造は拡張性に富んでいます。つまり、新しいグループ型、新しい分布、新しい仮想ゲート伝播手法などをライブラリに追加することが可能です。
内部的には、Samplexは、サンプリングプロセスを手続き的に記述する有向非循環グラフ(DAG)による表現を採用しています。 グラフの各ノードは、 VirtualRegisters の集合と相互作用し、ノード間の接続はレジスタ依存性を表します。つまり、 の場合、 が動作を許可されるには、 がその前にレジスタに対して動作を完了している必要があります。 これは、このグラフの流れが、量子回路のDAGのように実行に関して時間的なものではなく、むしろ、ランダム化を生成するノードから、処理されたランダム化を出力として生成するノードへと流れることを意味する。 ノードには3つの種類があります:
SamplingNodesは、入力から新しいレジスタをインスタンス化する役割を担っており、EvaluationNodesは、レジスタの変換、結合、および削除を担当しており、CollectionNodesは、レジスタの読み取りおよび出力値への書き込みを担当していますsample()。
Samplexは通常、注釈付きのボックス命令を含む基本回路を関数 build() に渡すことで生成されます。 手動で生成することも可能ですが、手間がかかります。また、その場合は、テンプレート回路として使用する互換性のあるパラメトリック量子回路を構築するのもユーザーの責任となります。 次の例では、関数 build() を使用してサンプレックスとテンプレートのペアに組み込まれた単純な回路を示し、その結果として得られるサンプレックスのDAGをプロットしています。 上記で説明した3種類のノードは、それぞれ異なる形状で表されます。
>>> from samplomatic import build, Twirl
>>> from qiskit import QuantumCircuit
>>>
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
... circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
... circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>> samplex.draw()DAGはこのデータモデルの主要な構成要素ですが、このオブジェクトにはその他の情報も格納されています:
- サンプレックス自体はパラメトリックである場合があり(参照
parameters)、パラメータ式を評価します。これらすべてはサンプレックスによって保存されます。 たとえば、 を使って構築された場合build()、サンプレックスは、基本回路が受け入れるすべてのパラメータの値を受け入れます。 - どの
sample()時点でどのような値が入力として期待されるか、またどのような値が返されるかを正確に記述した入力および出力の仕様については、およびinputs()を参照してくださいoutputs()。 - ノイズモデルの要件。これは、どの種類のノイズモデルがサンプレックスのサンプリング要件に対応しているかを規定するものである。
属性のサマリー
コラム「 1 」 | コラム「 2 」 |
|---|---|
num_parameters | サンプリング時に想定されるパラメータの数。 |
param_table | このサンプレックスのパラメータ式を所有 ParameterExpressionTable している。 |
parameters | サンプリング時に値が指定される、ソート済みのパラメータ。 |
passthrough_params | パススルーテンプレートパラメータを駆動するインデックスマッピング。 |
方法の概要
コラム「 1 」 | コラム「 2 」 |
|---|---|
add_edge(a, b) | サンプレックスグラフに辺を追加する。 |
add_input(仕様) | このサンプレックスにサンプリング入力を追加します。 |
add_node(ノード) | samplexグラフにノードを追加します。 |
add_output(仕様) | このsamplexにサンプリング出力を追加します。 |
append_parameter_expression(表現) | samplex にパラメータ式を追加します。 |
draw([cols, subgraph_idxs, layout_method]) | このサンプルで、その plot_graph() 手法を用いてグラフを描いてください。 |
finalize() | すべてのノードとエッジが追加されたことを示し、ノードの探索順序を決定する。 |
inputs() | の必要な入力を指定し、その構築を支援するオブジェクトを返します sample()。 |
outputs() | . の約束された出力を指定するオブジェクトを返します sample()。 |
sample([samplex_input, num_randomizations, ...]) | サンプル。 |
set_passthrough_params(passthrough_params) | パススルーパラメータのマッピングを設定します。 |
属性のドキュメント
num_parameters
サンプリング時に想定されるパラメータの数。
param_table
このサンプレックスのパラメータ式を所有 ParameterExpressionTable している。
インデックスごとに、このテーブルのサンプレックス参照エントリにパラメトリックノードが追加され、サンプリング時にテーブルが評価 sample() されます。 と組み合わせることで passthrough_params、呼び出し側は を呼び出すことなく、テンプレートパラメータの決定論的な部分集合(例: angles RZZGate )のみを評価することができます sample()。 「」および parameters 「」も参照してください append_parameter_expression()。
parameters
サンプリング時に値が指定される、ソート済みのパラメータ。
passthrough_params
パススルーテンプレートパラメータを駆動するインデックスマッピング。
長さが等しく、位置が揃った2つの整数配列のペアを返します (template_idxs, expression_idxs)。テンプレートパラメータのインデックスにある値は、インデックスにある式の param_table 値 sample() から( expression_idxs[i] 参照 set_passthrough_params())の処理中に設定 template_idxs[i] されます。
パススルーパラメータが登録されていない場合、両方の配列は空になります。 返される配列は、内部状態の独立したコピーです。
方法に関するドキュメント
add_edge
add_edge(a: int, b: int) → int
サンプレックスグラフに辺を追加する。
パラメーター
- a – 送信元ノードのノードインデックス。
- b – 宛先ノードのノードインデックス。
戻り値
追加された辺の整数インデックス。
add_input
add_node
add_output
append_parameter_expression
append_parameter_expression(expression: ParameterExpression) → int
samplex にパラメータ式を追加します。
その式を参照するノードを追加するには、まずその式をサンプレックスに追加する必要があります。 指定されたパラメータ式に現れる新しいパラメータごとに、ソートされた順序 parameters でエントリが に挿入されます。
パラメーター
式 – パラメータまたはパラメータ式。
戻り値
パラメトリックノードが、評価済みの式を参照するために使用できるインデックス。
draw
draw(cols: int = 2, subgraph_idxs: None | int | Sequence[int] = None, layout_method: Literal['auto', 'spring', 'graphviz', 'graphviz_curved', 'graphviz_line'] | LayoutMethod = 'auto') → Figure
このサンプルで、その plot_graph() 手法を用いてグラフを描いてください。
パラメーター
- cols – 返される図の列数。
- subgraph_idxs – プロットに含める部分グラフのインデックス。または、すべての部分グラフ
Noneを含める。 - layout_method – 名前で指定された事前定義済みのレイアウトメソッド、またはレイアウトを実装する呼び出し可能オブジェクト。
戻り値
Plotlyのグラフ。
finalize
finalize() → Self
すべてのノードとエッジが追加されたことを示し、ノードの探索順序を決定する。
昇給
SamplexError – ノードの依存関係に競合が検出された場合。
戻り値
チェーン処理用の同じインスタンスです。
inputs
outputs
sample
sample(samplex_input: Mapping[str, Any] | None = None, num_randomizations: int = 1, rng: int | SeedSequence | Generator | None = None, keep_registers: bool = False, max_workers: int | None = None) → SamplexOutput
サンプル。
以下の例では、このメソッドの呼び出し方法を示すために、2つのパラメータを持つ単純な回路をsamplexに組み込んでいます。 特に、samplex ノードへの必須入力(型情報と配列の形状情報の両方を含む)は で列挙されており inputs()、値でバインドする必要がある点に注意してください。
>>> from samplomatic import build, Twirl
>>> from qiskit.circuit import QuantumCircuit, Parameter
>>>
>>> # quickly make a circuit and build it to construct an example simplex
>>> circuit = QuantumCircuit(2)
>>> with circuit.box([Twirl()]):
... circuit.rx(Parameter("a"), 0)
... circuit.rx(Parameter("b"), 0)
... circuit.cz(0, 1)
>>> with circuit.box([Twirl()]):
... circuit.measure_all()
>>>
>>> template, samplex = build(circuit)
>>>
>>> # query the samplex for the expected inputs at sample time, and note that we
>>> # are required to pass a length-2 vector of floats for 'a' and 'b' (alphabetical)
>>> print(inputs := samplex.inputs())
TensorInterface(<
- 'parameter_values' <float64[2]>: Input parameter values to use during sampling.
>)>>> # after binding required values, we can sample 123 randomizations
>>> samplex.sample(
... inputs.bind(parameter_values=[0.1, 0.2]),
... num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})>>> # alternatively, we can provide any mapping object directly to specify inputs
>>> samplex.sample(
... {"parameter_values": [0.1, 0.2]},
... num_randomizations=123,
... )
SamplexOutput({'measurement_flips.meas': ..., 'parameter_values': ...})パラメーター
- samplex_input – 入力名から入力値へのマッピング。詳細は(
inputs()「 Samplex の入力と出力 」ガイドも参照)に記載されている通りです。入力が不要なNone場合は、空にします。 ピリオドを含む名前では、ネストされた辞書展開を使用できます。 なお、 はマッピングオブジェクトであるTensorInterfaceため、完全にバインドされた状態では有効な入力引数となります。 - num_randomizations – サンプリング対象とする無作為化の回数。
- keep_registers – サンプリング中に使用された仮想レジスタを保持し、メタデータキーの下に出力に含めるかどうか
"registers"。 - rng – 乱数生成器のシード値となる整数、生成器自体、またはモジュールが所有するデフォルトの生成器を使用
Noneする場合。 - max_workers – サンプリング、評価、および収集ノードの並列実行に使用できるスレッドの最大数。
set_passthrough_params
set_passthrough_params(passthrough_params: list[tuple[int | None, ParameterExpression]]) → int
パススルーパラメータのマッピングを設定します。
一部のパラメータは、仮想ゲートの伝播の影響を受けず、収集ノードによって設定されることもありません。 これらのパラメータは、元の回路パラメータからテンプレート回路パラメータへとマッピングされるだけです。 この関数は、これらのパラメータのマッピングを設定します。
パラメーター
passthrough_params – パススルーパラメータ用の ParamSpec。
戻り値:passthrough_params 内のテンプレートパラメータの最大インデックス。