こんにちは、NVIDIA製の新しいシミュレータを頑張って使います。cuTensorNetは新しい技術ですのでほとんど資料がないため探すのが大変かと思います。本日はcuTensorNetから状態ベクトルを求める方法をGoogle Cirqを使ってみてみます。
参考:
Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES
SPDX-License-Identifier: BSD-3-Clause
最初にツールを読み込みます。不足している分はインストールしてください。
import cirq
from cirq.testing import random_circuit
import cupy as cp
import numpy as np
from cuquantum import contract, CircuitToEinsum
今回は10量子ビットのランダム回路を実行してみます。Google Cirqにのっとって作ってみます。
num_qubits = 10
n_moments = 6
op_density = 0.9
gate_domain = {cirq.H: 1,
cirq.S: 1,
cirq.T: 1,
cirq.CNOT: 2,
cirq.CZ: 2}
circuit = random_circuit(num_qubits, n_moments, op_density=op_density, gate_domain=gate_domain, random_state=6)
print(circuit)
こちらをテンソルネットワークに変換しますが、関数が用意されていました。
myconverter = CircuitToEinsum(circuit, dtype='complex128', backend=cp)
expression, operands = myconverter.state_vector()
sv = contract(expression, *operands)
sv.reshape(1, 2**num_qubits)
最終的にはEinsum形式で複素数を記述したものを状態ベクトルに変換します。
測定をせずに全体の縮約を取ればOKです。最終的にはテンソルから状態ベクトルのベクトルへと変換して完了です。
array([[0.35355339+0.j , 0. +0.j , 0.25 +0.25j, ...,
0. +0.j , 0. +0.j , 0. +0.j ]])
できました。結構高速に状態ベクトルを取得できました。小さなモデルを作ったときなどは状態ベクトルで確認をしながら計算しますので便利かと思います。以上です。