PennyLane : 使用方法 : 量子回路

PennyLane 使用方法 : 量子回路 (翻訳)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/19/2019

* 本ページは、PennyLane : Using PennyLane の次のページを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$

 

使用方法 : 量子回路

PennyLane では、変分量子回路は量子ノード・オブジェクトとして表わされます。量子ノードは回路を構成する 量子関数 と、計算を実行する デバイス の組み合わせです。量子ノード decorator を使用して便利に量子ノードを作成できます。

各古典的インターフェイスは量子ノードの異なるバージョンを使用し、そしてここでは NumPy インターフェイスと使用する標準的な QNode を紹介します。NumPy-interfacing 量子ノードは float や array のような NumPy データ構造を取り、そして NumPy データ構造を返します。それらは NumPy-based 最適化メソッド を使用して最適化できます。PyTorchTensorFlow の Eager mode のような他の PennyLane インターフェイスのための量子ノードは インターフェイス のセクションで紹介されます。

 

量子関数

量子回路は特別な Python 関数、量子回路関数、あるいは短く量子関数として構築されます。例えば :

import pennylane as qml

def my_quantum_function(x, y):
    qml.RZ(x, wires=0)
    qml.CNOT(wires=[0,1])
    qml.RY(y, wires=1)
    return qml.expval(qml.PauliZ(1))

量子関数は次の制約に従う、Python 関数の制限されたサブセットです :

  • 関数の本体はサポートされる PennyLane 演算 か (テンプレート と呼ばれる) 演算のシークエンスだけで構成されなければなりません、行毎に 1 命令を使用します。
  • 関数は、測定関数量子ビット連続値観測可能量 に適用することにより、測定された観測可能値のシングルかタプルを常に返さなければなりません。
  • 算術演算や外部関数による、関数引数の古典的処理は許容されません。一つの現在の例外は単純なスカラー乗算です。

Note
量子演算は量子回路関数の外側では使用できません、総ての Operation は初期化時にキューイングを遂行するために QNode を必要とするからです。

Note
測定された観測可能量は return ステートメントの一部として回路関数の最後に総ての他の演算の後に来なければなりません、そして途中に現れることはできません。

 

デバイスを定義する

量子回路を実行して – そして後で最適化するためには、最初に計算デバイスを指定する必要があります。

デバイスは Device クラスのインスタンスで、シミュレータかハードウェア・デバイスを表わすことができます。それらは デバイス ローダを使用してインスタンス化できます。

dev = qml.device('default.qubit', wires=2)

PennyLane は ‘default.qubit’ シミュレータのような幾つかの基本的なデバイスを提供します ; 追加のデバイスはプラグインとしてインストールできます (より詳細については 利用可能なプラグイン を見てください)。

デバイスの選択は計算のスピードを著しく決定することに注意してください。

 

量子ノードを作成する

一緒に、量子関数とデバイスは量子ノードあるいは QNode オブジェクトを作成するために使用されます、これは量子関数をラップしてそれをデバイスにバインドします。

QNode は次のように明示的に作成できます :

qnode = qml.QNode(my_quantum_function, dev)

QNode は、それが標準的な Python 関数であるかのように、量子回路の結果を計算するために使用できます。それはもとの量子関数と同じ引数を取ります :

>>> qnode(np.pi/4, 0.7)
0.7648421872844883

 

QNode デコレータ

QNode を作成するためのより便利な – そして実際に推奨される – 方法は提供される量子ノード decorator です。decorator は PennyLane 量子演算を含む量子関数を量子デバイス上で実行される QNode に変換します。

Note
decorator は Python-based 量子関数を同じ名前の QNode と完全に置き換えます – そのようなものとして、元の関数はもはやアクセス可能ではありません (しかし func 属性を通してアクセスできます)。

例えば :

dev = qml.device('default.qubit', wires=2)

@qml.qnode(dev)
def qfunc(x):
    qml.RZ(x, wires=0)
    qml.CNOT(wires=[0,1])
    qml.RY(x, wires=1)
    return qml.expval(qml.PauliZ(0))

result = qfunc(0.543)
 

以上