Skip to content

梯度结果类

这些类保存由 VQCircuit.get_gradientsVQCircuit.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 -- 梯度值的总数。


__str__

返回所有梯度值及其多维索引的可读字符串表示。


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 -- 梯度组的数量。


__str__

返回所有梯度组的可读字符串表示。


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]] -- 第一个元素是期望值,第二个是梯度值列表。


__str__

返回期望值和所有梯度的可读字符串表示。


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 -- 梯度和期望组的数量。


__str__

返回所有组的可读字符串表示。

示例

python
import numpy as np
from pyqpanda3.vqcircuit import VQCircuit, DiffMethod
from pyqpanda3.hamiltonian import Hamiltonian

vqc = VQCircuit()
# ... 构建 ansatz ...

params = np.array([0.1, 0.2, 0.3, 0.4])
hamiltonian = Hamiltonian(...)

# 单组梯度
grads = vqc.get_gradients(params, hamiltonian, DiffMethod.ADJOINT_DIFF)
print(len(grads))           # 4
print(grads.at(0))          # 对第一个参数的梯度
print(grads.gradients())    # [g0, g1, g2, g3]

# 单组梯度 + 期望值
res = vqc.get_gradients_and_expectation(params, hamiltonian, DiffMethod.ADJOINT_DIFF)
print(res.expectation_val())  # 例如 -0.5234
print(res.gradients())        # [g0, g1, g2, g3]
exp_val, grad_list = res.data()

# 多组梯度(2 组,每组 4 个参数)
params_2 = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])
grads_n = vqc.get_gradients(params_2, hamiltonian, 2, DiffMethod.ADJOINT_DIFF)
print(len(grads_n))            # 2
print(grads_n.at(0).gradients())  # 第一组的梯度
print(grads_n.data())          # [[g0,g1,g2,g3], [g4,g5,g6,g7]]

另见

Released under the MIT License.