Skip to content

梯度结果类 ​

这些类保存由 VQCircuit.get_gradients 和 VQCircuit.get_gradients_and_expectation 执行的梯度和期望值计算结果。它们提供对梯度值的索引访问和批量访问,以及在适用情况下对期望值的访问。


ResGradients ​

ResGradients 存储为单组参数计算的梯度值。当变分量子线路使用一组参数值 [val_0, val_1, ..., val_n] 时,此对象保存对应的梯度值 [gradient_0, gradient_1, ..., gradient_n],其中 gradient_i 是期望值对 val_i 的导数。

方法 ​

at(按扁平索引) ​

返回与给定扁平索引处参数对应的梯度值。

python
res.at(idx: int) -> float
参数类型描述
idxint参数数组的扁平索引 i。返回的梯度对应于 val_i。

返回值: float -- 梯度值。


at(按多维索引) ​

返回参数数组中特定多维位置的梯度值。

python
res.at(idx_s: list[int]) -> float
参数类型描述
idx_slist[int]多维索引 [idx_dim0, idx_dim1, ..., idx_dimN],与 VQCircuit.set_Param 设置的形状匹配。

返回值: float -- 指定位置的梯度值。


gradients ​

以扁平列表形式返回所有梯度值。

python
res.gradients() -> list[float]

返回值: list[float] -- 所有梯度值,形式为 [gradient_0, gradient_1, ..., gradient_n]。


__len__ ​

返回梯度值的数量,等于参数的数量。

python
len(res) -> int

返回值: int -- 梯度值的总数。


ResNGradients ​

ResNGradients 存储 N 组参数的梯度值。当向 VQCircuit.get_gradients 提供 N 组参数值时,此对象保存 N 组梯度值。

方法 ​

at ​

以 ResGradients 对象的形式返回给定索引处组的梯度值。

python
res.at(idx: int) -> ResGradients
参数类型描述
idxint参数组的索引(从 0 开始)。

返回值: ResGradients -- 指定组的梯度值。


data ​

以嵌套列表形式返回所有梯度数据。

python
res.data() -> list[list[float]]

返回值: list[list[float]] -- 一个列表,其中每个元素是对应一个参数组的梯度值列表。


__len__ ​

返回参数组的总数(N)。

python
len(res) -> int

返回值: int -- 梯度组的数量。


ResGradientsAndExpectation ​

ResGradientsAndExpectation 存储为单组参数计算的梯度值和期望值。它对应于使用单个参数组调用 VQCircuit.get_gradients_and_expectation 的结果。

方法 ​

expectation_val ​

返回期望值。

python
res.expectation_val() -> float

返回值: float -- 给定参数下哈密顿量的期望值。


gradients ​

以扁平列表形式返回所有梯度值。

python
res.gradients() -> list[float]

返回值: list[float] -- 所有梯度值 [gradient_0, gradient_1, ..., gradient_n]。


at(按扁平索引) ​

返回给定扁平索引处的梯度值。

python
res.at(idx: int) -> float
参数类型描述
idxint参数数组的扁平索引。

返回值: float -- 梯度值。


at(按多维索引) ​

返回给定多维位置处的梯度值。

python
res.at(idx_s: list[int]) -> float
参数类型描述
idx_slist[int]多维索引。

返回值: float -- 梯度值。


data ​

以元组形式返回期望值和梯度值。

python
res.data() -> tuple[float, list[float]]

返回值: tuple[float, list[float]] -- 第一个元素是期望值,第二个是梯度值列表。


ResNResGradientsAndExpectation ​

ResNResGradientsAndExpectation 存储 N 组参数的梯度值和期望值。当指定 param_group_total 时,由 VQCircuit.get_gradients_and_expectation 返回。

方法 ​

at ​

以 ResGradientsAndExpectation 对象的形式返回给定索引处组的梯度和期望数据。

python
res.at(idx: int) -> ResGradientsAndExpectation
参数类型描述
idxint参数组的索引(从 0 开始)。

返回值: ResGradientsAndExpectation -- 指定组的梯度和期望数据。


data ​

以元组列表形式返回所有数据。

python
res.data() -> list[tuple[float, list[float]]]

返回值: list[tuple[float, list[float]]] -- 一个列表,其中每个元素是一个元组。每个元组的第一个元素是期望值,第二个是该参数组的梯度值列表。


__len__ ​

返回参数组的总数(N)。

python
len(res) -> int

返回值: int -- 梯度和期望组的数量。


示例 ​

python
import numpy as np
from pyqpanda3.vqcircuit import VQCircuit, DiffMethod
from pyqpanda3.hamiltonian import Hamiltonian
from pyqpanda3.core import CNOT, RX, RY

vqc = VQCircuit()
vqc << CNOT(0, 1)
vqc.set_Param([4])
p0 = vqc.Param([0], "theta_0")
p1 = vqc.Param([1], "theta_1")
p2 = vqc.Param([2], "theta_2")
p3 = vqc.Param([3], "theta_3")
vqc << RX(0, p0) << RY(1, p1) << RX(0, p2) << RY(1, p3)

params = np.array([0.5, 0.3, 0.7, 0.2])
hamiltonian = Hamiltonian({"Z0": 1.0})

# Single-group gradients
grads = vqc.get_gradients(params, hamiltonian, DiffMethod.ADJOINT_DIFF)
print(len(grads))
print(grads.at(0))
print(grads.gradients())

# Single-group gradients + expectation
res = vqc.get_gradients_and_expectation(params, hamiltonian, DiffMethod.ADJOINT_DIFF)
print(res.expectation_val())
print(res.gradients())
exp_val, grad_list = res.data()

# Multi-group gradients (2 groups of 4 parameters each)
params_2 = np.array([0.5, 0.3, 0.7, 0.2, 0.1, 0.4, 0.6, 0.8])
grads_n = vqc.get_gradients(params_2, hamiltonian, 2, DiffMethod.ADJOINT_DIFF)
print(len(grads_n))
print(grads_n.at(0).gradients())
print(grads_n.data())

运行结果:

4
-0.9320390859672258
[-0.9320390859672258, -1.3877787807814457e-17, -0.932039085967226, 0.0]
0.3623577544766736
[-0.9320390859672258, -1.3877787807814457e-17, -0.932039085967226, 0.0]
2
[-0.9320390859672258, -1.3877787807814457e-17, -0.932039085967226, 0.0]
[[-0.9320390859672258, -1.3877787807814457e-17, -0.932039085967226, 0.0], [-0.6442176872376911, -4.9439619065339e-17, -0.6442176872376912, 1.3877787807814457e-17]]

另见 ​

Released under the MIT License.