"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 不含参线路采样:\n",
"from mindquantum.core.gates import Measure # 引入测量门\n",
"\n",
"circ = Circuit() # 初始化量子线路\n",
"circ += H.on(0) # H门作用在第0位量子比特\n",
"circ += X.on(1, 0) # X门作用在第1位量子比特且受第0位量子比特控制\n",
"circ += Measure('q0').on(0) # 在0号量子比特作用一个测量,并将该测量命名为'q0'\n",
"circ += Measure('q1').on(1) # 在1号量子比特作用一个测量,并将该测量命名为'q1'\n",
"circ.svg() # 绘制SVG格式的量子线路图片"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n"
],
"text/plain": []
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"shots: 1000\n",
"Keys: q1 q0│0.00 0.127 0.254 0.381 0.508 0.635\n",
"───────────┼───────────┴───────────┴───────────┴───────────┴───────────┴\n",
" 00│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n",
" │\n",
" 11│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒\n",
" │\n",
"{'00': 508, '11': 492}\n",
"
\n"
],
"text/plain": [
"shots: 1000\n",
"Keys: q1 q0│0.00 0.127 0.254 0.381 0.508 0.635\n",
"───────────┼───────────┴───────────┴───────────┴───────────┴───────────┴\n",
" 00│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n",
" │\n",
" 11│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒\n",
" │\n",
"{'00': 508, '11': 492}"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset()\n",
"result = sim.sampling(circ, shots=1000) # 对上面定义的线路采样1000次\n",
"result"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"MindSpore Quantum还提供了采样结果绘制SVG图的功能:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result.svg() # 打印出测量结果的SVG格式"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们可以看到,采样1000中,'00'出现了508次,'11'出现了492次(在你运行时,结果可能会不同)。我们搭建的线路实际上制备出了一个贝尔态$\\frac{\\sqrt{2}}{2}|00⟩+\\frac{\\sqrt{2}}{2}|11⟩$。直观上,我们可以看到对该状态进行测量得到'00'的概率为$\\frac{1}{2}$,得到'11'的概率为$\\frac{1}{2}$,采样结果符合概率,细微的误差是由模拟器噪声导致。"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 含参线路采样:\n",
"para_circ = Circuit() # 初始化量子线路\n",
"para_circ += H.on(0) # H门作用在第0位量子比特\n",
"para_circ += X.on(1, 0) # X门作用在第1位量子比特且受第0位量子比特控制\n",
"para_circ += RY('theta').on(1) # RY(theta)门作用在第1位量子比特\n",
"para_circ += Measure('q0').on(0) # 在0号量子比特作用一个测量,并将该测量命名为'q0'\n",
"para_circ += Measure('q1').on(1) # 在1号量子比特作用一个测量,并将该测量命名为'q1'\n",
"para_circ.svg() # 绘制SVG格式的量子线路图片"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sim.reset()\n",
"result = sim.sampling(para_circ, {'theta': 0}, shots=1000) # 将上面定义的线路参数'theta'赋值为0采样1000次\n",
"result.svg()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"我们可以看到,采样结果中'00'出现了517次,'11'出现了483次(在你运行时,结果可能会不同)。事实上把RY门参数赋值为0,它即为我们熟悉的I门,相当于不对线路做任何操作,因此该采样线路与上面不含参线路本质是同一个,可以观察到二次采样结果几乎相同,符合预期结果。\n",
"\n",
"## 模拟器支持情况\n",
"\n",
"当前 MindSpore Quantum 支持多种模拟器,具体情况如下:\n",
"\n",
"|模拟器名称|特性|是否支持GPU|单精度支持|多精度支持|\n",
"|--|--|--|--|--|\n",
"|`mqvector`|全振幅模拟器|❌|✅|✅|\n",
"|`mqvector_gpu`|GPU版全振幅模拟器|✅|✅|✅|\n",
"|`mqmatrix`|密度矩阵模拟器|❌|✅|✅|\n",
"|[NoiseBackend](https://mindspore.cn/mindquantum/docs/zh-CN/r0.11/simulator/mindquantum.simulator.NoiseBackend.html#mindquantum.simulator.NoiseBackend)|噪声模拟器,教程请参考:[噪声模拟器](https://mindspore.cn/mindquantum/docs/zh-CN/r0.11/middle_level/noise_simulator.html)|✅|✅|✅|\n",
"\n",
"> 请注意,`mqvector_gpu`后端仅支持在CUDA 11及以上版本的环境中运行。\n",
"\n",
"## 模拟器的选择\n",
"\n",
"我们知道,量子态的维度是随着比特数的增多而指数增加的,因此模拟大比特量子系统时,需要的物理内存将急剧增加。下面,我们给出不同比特下,存储一个全振幅量子态所需要的内存空间:\n",
"\n",
"|比特数|mindquantum.complex128|mindquantum.complex64|\n",
"|--|--|--|\n",
"|6|1kB|0.5kB|\n",
"|16|1MB|0.5MB|\n",
"|26|1GB|0.5GB|\n",
"|30|16GB|8GB|\n",
"|36|1TB|0.5TB|\n",
"|40|16TB|8TB|\n",
"|46|1PB|0.5PB|\n",
"\n",
"由此可见,在模拟大比特系统时,我们可以考虑使用单精度类型来减小内存占用量。在 MindSpore Quantum 中,我们可以通过 `dtype` 来方便的修改模拟器的数据类型:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"mqvector simulator with 2 qubits (little endian), dtype: mindquantum.complex64.\n",
"Current quantum state:\n",
"1¦00⟩\n"
]
}
],
"source": [
"import mindquantum as mq\n",
"from mindquantum.simulator import Simulator\n",
"\n",
"sim = Simulator('mqvector', 2, dtype=mq.complex64)\n",
"print(sim)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"下面我们给出一些经验规则,帮助大家来合理的选择不同的模拟器:\n",
"\n",
"- 量子系统小于8比特时:`mqvector`。在小比特时,CPU反而会比GPU运行快速。\n",
"- 量子系统大于8比特时:`mqvector_gpu`。在大比特时,GPU将会发挥其并行运算优势。\n",
"- 混态模拟时:`mqmatrix`。`mqmatrix`是密度矩阵模拟器,因此支持混态系统的模拟。\n",
"- 量子系统含噪声时:[NoiseBackend](https://mindspore.cn/mindquantum/docs/zh-CN/r0.11/simulator/mindquantum.simulator.NoiseBackend.html#mindquantum.simulator.NoiseBackend)。通过该模拟器,我们可以方便的往线路中添加不同的量子信道,达到对噪声系统的模拟。\n",
"- 当进行量子化学模拟时:`mindquantum.complex128`。量子化学模拟需要模拟基态能量达到化学精度,因此建议用双精度类型。\n",
"- 当进行量子机器学习时:`mindquantum.complex64`。机器学习类任务对精度要求不敏感,因此建议用单精度类型。\n",
"\n",
"想进一步学习如何对量子线路做测量操作,想了解采样结果分布的理论解释,请点击:[量子测量教程](https://www.mindspore.cn/mindquantum/docs/zh-CN/r0.11/beginner/quantum_measurement.html)。"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" Software | \n",
" Version | \n",
"
\n",
"mindquantum | 0.9.11 |
\n",
"scipy | 1.10.1 |
\n",
"numpy | 1.24.4 |
\n",
"\n",
" System | \n",
" Info | \n",
"
\n",
"Python | 3.8.17 |
OS | Linux x86_64 |
Memory | 16.62 GB |
CPU Max Thread | 16 |
Date | Tue Jan 2 16:51:35 2024 |
\n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from mindquantum.utils.show_info import InfoTable\n",
"\n",
"InfoTable('mindquantum', 'scipy', 'numpy')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "MindSpore",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.17"
}
},
"nbformat": 4,
"nbformat_minor": 4
}