Rigetti プロバイダー

ヒント

初回ユーザーは、参加している各量子ハードウェア プロバイダーで使用するために、無料の $500 (USD)Azure Quantum クレジットを自動的に取得します。 クレジットをすべて消費し、不足した場合は、Azure Quantum クレジット プログラムにお申し込みいただけます。

Rigetti 量子プロセッサは、調整可能な超伝導量子ビットに基づくユニバーサルなゲートモデル マシンです。 システムの特徴とデバイス特性には、読み出し機能の強化、量子処理時間の高速化、複数のエンタングリング ゲート ファミリでの高速ゲート時間、アクティブ レジスタ リセットによる迅速なサンプリング、パラメトリック制御が含まれます。

  • 発行元: Rigetti
  • プロバイダー ID: rigetti

Rigetti プロバイダーは、次 targets の機能を利用できるようにします。

ターゲット名 ターゲット ID 量子ビット数 説明
Quantum Virtual Machine (QVM) rigetti.sim.qvm - Quil、Q#、および Qiskit プログラム用のオープンソース シミュレーター。 無料。
Ankaa-2 rigetti.qpu.ankaa-2 84 量子ビット Rigetti の最も強力な使用可能な量子プロセッサ。

注意

Rigetti シミュレーターとハードウェア targets では、Cirq プログラムはサポートされていません。

Rigetti は targets プロファイルに No Control Flow 対応しています。 このtargetプロファイルとその制限事項の詳細については、「Azure Quantum のプロファイルの種類について」を参照してくださいtarget

シミュレーター

Quantum Virtual Machine (QVM) は、Quil 用のオープンソース シミュレーターです。 はrigetti.sim.qvmtargetテキストとして Quil プログラムを受け入れ、そのプログラムをクラウドでホストされている QVM で実行し、シミュレートされた結果を返します。

  • ジョブの種類: Simulation
  • データ形式: rigetti.quil.v1rigetti.qir.v1
  • ターゲット ID: rigetti.sim.qvm
  • ターゲット実行プロファイル: No Control Flow
  • 価格: 無料 ($0)

量子コンピューター

Rigetti の一般公開されている QPU はすべて、Azure Quantum を通じて利用できます。 このリストは予告なく変更される場合があります。

Ankaa-2

マルチチップの 84 量子ビット プロセッサは、他の Rigetti QPU に対して 2.5 倍のパフォーマンス向上を提供します。

  • ジョブの種類: Quantum Program
  • データ形式: rigetti.quil.v1rigetti.qir.v1
  • ターゲット ID: rigetti.qpu.ankaa-2
  • ターゲット実行プロファイル: No Control Flow

価格

Rigetti の課金プランを確認するには、「Azure Quantum の価格」を参照してください。

入力形式

現在、すべての Rigetti targets は次の 2 つの形式を受け入れます。

  • rigetti.quil.v1。これは Quil プログラムのテキストです。
  • rigetti.qir.v1。これは QIR ビットコードです。

また、実行 targets するショットの数を定義するための省略可能な count 整数パラメーターも受け取ります。 省略すると、プログラムは 1 回だけ実行されます。

Quil

すべての Rigetti targets は、Quantum 命令言語を表す Quil プログラムのテキストである入力形式を受け入れますrigetti.quil.v1。 既定では、プログラムは実行前に quilc を使用してコンパイルされます。 ただし、quilc はパルス レベルの制御機能 (Quil-T) をサポートしていないため、これらの機能を使用する場合は、入力としてネイティブ Quil プログラム (Quil-T も含む) を指定し、入力パラメーター skipQuilc: true を指定する必要があります。

Quil プログラムの構築を容易にするために、pyquil-for-azure-quantum パッケージと共に pyQuil を使用できます。 このパッケージがない場合、Quil プログラムを "構築" するために pyQuil を使用できますが、Azure Quantum に送信することはできません。

QIR

すべての Rigetti ハードウェアでは、QIR ベース プロファイル v1 を としてrigetti.qir.v1使用した (QIR) 準拠ジョブの実行Quantum Intermediate Representationがサポートされています。 QIR は、量子計算のために多くの量子言語とプラットフォームをサポートし、高レベルの言語と target マシン間の通信を可能にする共通インターフェイスを提供します。 たとえば、Q#、Quil、または Qiskit ジョブを Rigetti ハードウェアに送信すると、Azure Quantum によって入力が自動的に処理されます。 詳細については、「Quantum Intermediate Representation」を参照してください。

適切な入力形式の選択

Quil または別の QIR 準拠言語を使用する必要がありますか? これは最終的なユース ケースで決まります。 QIR は多くのユーザーにとってアクセスしやすい一方で、現在は Quil の方がより強力です。

QIR 生成をサポートする Qiskit、Q#、または別のツールキットを使用していて、アプリケーションが Azure Quantum 経由で Rigetti targets で動作する場合は、QIR が適しています。 QIR には急速に進化する仕様があり、Rigetti は、時間が経過するにつれて、より高度な QIR プログラムのサポートを引き続き増やしています。今日コンパイルできないものは、明日もコンパイルできる可能性があります。

一方、Quil プログラムは、Azure Quantum を含む任意のプラットフォームから Rigetti システムのユーザーが利用できる機能の完全なセットを表現します。 量子ゲートの分解を調整したり、パルス レベルでプログラムを記述したりする場合は、QIR ではこれらの機能がまだ使用できないため、Quil で作業する必要があります。

Quil ジョブを送信する最も簡単な方法は、pyquil-for-azure-quantum パッケージを使用することです。これは、pyQuil ライブラリのツールとドキュメントを使用できるためです。

また、Quil プログラムを手動で構築し、azure-quantum パッケージを直接使用して送信することもできます。

from pyquil.gates import CNOT, MEASURE, H
from pyquil.quil import Program
from pyquil.quilbase import Declare
from pyquil_for_azure_quantum import get_qpu, get_qvm

# Note that some environment variables must be set to authenticate with Azure Quantum
qc = get_qvm()  # For simulation
# qc = get_qpu("Ankaa-2") for submitting to a QPU

program = Program(
    Declare("ro", "BIT", 2),
    H(0),
    CNOT(0, 1),
    MEASURE(0, ("ro", 0)),
    MEASURE(1, ("ro", 1)),
).wrap_in_numshots_loop(5)

# Optionally pass to_native_gates=False to .compile() to skip the compilation stage
result = qc.run(qc.compile(program))
data_per_shot = result.readout_data["ro"]
# Here, data_per_shot is a numpy array, so you can use numpy methods
assert data_per_shot.shape == (5, 2)
ro_data_first_shot = data_per_shot[0]
assert ro_data_first_shot[0] == 1 or ro_data_first_shot[0] == 0

# Let's print out all the data
print("Data from 'ro' register:")
for i, shot in enumerate(data_per_shot):
    print(f"Shot {i}: {shot}")