量子数据集¶
PennyLane 提供了 data 子包,用于下载、创建、存储和操作量子数据集,其中量子数据集是从各种量子系统获得的 量子数据 的集合,这些数据描述了量子系统及其演化。
在PennyLane中加载数据集¶
我们可以通过load()或load_interactive()函数访问所需类型的数据。这些函数会下载所需的数据集,或者如果之前已下载,则从本地存储加载它们。
要指定要加载的数据集,必须指定数据类别 (data_name),以及特定类别的关键字参数。有关可用数据集的完整列表,请参见数据集网站。load() 函数返回一个 list,其中包含所需的数据。
>>> H2datasets = qml.data.load("qchem", molname="H2", basis="STO-3G", bondlength=1.1)
>>> print(H2datasets)
[<Dataset = molname: H2, basis: STO-3G, bondlength: 1.1, attributes: ['basis', 'basis_rot_groupings', ...]>]
>>> H2data = H2datasets[0]
我们可以通过提供一个值的列表而不是单个值来加载多个参数值的数据集。要加载所有可能的值,请使用特殊值 FULL 或字符串 "full":
>>> H2datasets = qml.data.load("qchem", molname="H2", basis="full", bondlength=[0.5, 1.1])
>>> print(H2datasets)
[<Dataset = molname: H2, basis: STO-3G, bondlength: 0.5, attributes: ['basis', 'basis_rot_groupings', ...]>,
<Dataset = molname: H2, basis: STO-3G, bondlength: 1.1, attributes: ['basis', 'basis_rot_groupings', ...]>,
<Dataset = molname: H2, basis: CC-PVDZ, bondlength: 0.5, attributes: ['basis', 'basis_rot_groupings', ...]>,
<Dataset = molname: H2, basis: CC-PVDZ, bondlength: 1.1, attributes: ['basis', 'basis_rot_groupings', ...]>,
<Dataset = molname: H2, basis: 6-31G, bondlength: 0.5, attributes: ['basis', 'basis_rot_groupings', ...]>,
<Dataset = molname: H2, basis: 6-31G, bondlength: 1.1, attributes: ['basis', 'basis_rot_groupings', ...]>]
当我们只想下载大型数据集的一部分时,可以指定所需的属性(称为“属性”)。例如,我们可以如下下载或加载数据集的分子和能量:
>>> part = qml.data.load("qchem", molname="H2", basis="STO-3G", bondlength=1.1,
... attributes=["molecule", "fci_energy"])[0]
>>> part.molecule
<Molecule = H2, Charge: 0, Basis: STO-3G, Orbitals: 2, Electrons: 2>
>>> part.fci_energy
-1.0791924385860894
要确定某种数据集可用的属性,我们可以使用函数 list_attributes():
>>> qml.data.list_attributes(data_name="qchem")
['molname',
'basis',
'bondlength',
...
'vqe_params',
'vqe_energy']
注意
属性的默认值如下:
分子:
basis是可用的最小基组,通常是"STO-3G",而bondlength是分子的最佳键长,或者在未知最佳键长时的替代值。自旋系统:
periodicity是"open",lattice是"chain", 并且layout是1x4对于chain系统和2x2对于rectangular系统。
在PennyLane中使用数据集¶
加载后,可以访问数据集的属性:
>>> H2data.molecule
<Molecule = H2, Charge: 0, Basis: STO-3G, Orbitals: 2, Electrons: 2>
>>> print(H2data.hf_state)
[1 1 0 0]
加载的数据项与PennyLane完全兼容。因此,我们可以直接在PennyLane电路中使用它们,如下所示:
>>> dev = qml.device("default.qubit",wires=4)
>>> @qml.qnode(dev)
... def circuit():
... qml.BasisState(H2data.hf_state, wires = [0, 1, 2, 3])
... for op in H2data.vqe_gates:
... qml.apply(op)
... return qml.expval(H2data.hamiltonian)
>>> print(circuit())
-1.0791430411076344
查看可用数据集名称¶
我们可以调用
list_data_names() 函数来获取当前可用数据集名称的快照。
此函数返回如下所示的字符串列表。
>>> qml.data.list_data_names()
["bars-and-stripes",
"downscaled-mnist",
"hamlib-max-3-sat",
"hamlib-maxcut",
"hamlib-travelling-salesperson-problem",
"hidden-manifold",
"hyperplanes",
"ketgpt",
"learning-dynamics-incoherently",
"linearly-separable",
"mnisq",
"mqt-bench",
"plus-minus",
"qchem",
"qspin",
"rydberggpt",
"two-curves"]
请注意,这个例子限制了函数调用的结果以确保清晰,并且随着更多数据的可用,这些函数调用的结果将会改变。
查看可用数据集¶
我们可以调用
list_datasets() 函数来获取当前可用数据的快照。
这个函数返回一个嵌套字典,如下所示。
>>> available_data = qml.data.list_datasets()
>>> available_data.keys()
dict_keys(["qspin", "qchem"])
>>> available_data["qchem"].keys()
dict_keys(["H2", "LiH", ...])
>>> available_data['qchem']['H2'].keys()
dict_keys(["6-31G", "STO-3G"])
>>> print(available_data['qchem']['H2']['STO-3G'])
["0.5", "0.54", "0.62", "0.66", ...]
请注意,这个例子为了清晰起见限制了函数调用的结果,随着更多数据的可用性,这些函数调用的结果将会改变。
创建自定义数据集¶
data中的功能还包括创建和读取自定义数据集。
我们可以使用自定义数据集来存储在PennyLane及其支持数据中生成的任何数据。
要创建数据集,我们可以执行以下操作:
>>> coeffs = [1, 0.5]
>>> observables = [qml.Z(0), qml.X(1)]
>>> H = qml.Hamiltonian(coeffs, observables)
>>> energies, _ = np.linalg.eigh(qml.matrix(H)) #Calculate the energies
>>> dataset = qml.data.Dataset(data_name = "Example", hamiltonian=H, energies=energies)
>>> dataset.data_name
"Example"
>>> dataset.hamiltonian
1.0 * Z(0) + 0.5 * X(1)
>>> dataset.energies
array([-1.5, -0.5, 0.5, 1.5])
我们可以将这个 Dataset 写入存储并按如下方式读取:
>>> dataset.write("./path/to/dataset.h5")
>>> read_dataset = qml.data.Dataset()
>>> read_dataset.read("./path/to/dataset.h5")
>>> read_dataset.data_name
"Example"
>>> read_dataset.hamiltonian
1.0 * Z(0) + 0.5 * X(1)
>>> read_dataset.energies
array([-1.5, -0.5, 0.5, 1.5])
有关读取和写入自定义数据集的更多详细信息,包括元数据,请参阅 data 模块文档。