提交 af346570 编写于 作者: Q Quleaf

update to 2.0.1

上级 476abd12
...@@ -33,7 +33,7 @@ English | [简体中文](README_CN.md) ...@@ -33,7 +33,7 @@ English | [简体中文](README_CN.md)
</a> </a>
<!-- PyPI --> <!-- PyPI -->
<a href="https://pypi.org/project/paddle-quantum/"> <a href="https://pypi.org/project/paddle-quantum/">
<img src="https://img.shields.io/badge/pypi-v2.0.0-orange.svg?style=flat-square&logo=pypi"/> <img src="https://img.shields.io/badge/pypi-v2.0.1-orange.svg?style=flat-square&logo=pypi"/>
</a> </a>
<!-- Python --> <!-- Python -->
<a href="https://www.python.org/"> <a href="https://www.python.org/">
...@@ -55,12 +55,13 @@ Paddle Quantum aims at establishing a bridge between artificial intelligence (AI ...@@ -55,12 +55,13 @@ Paddle Quantum aims at establishing a bridge between artificial intelligence (AI
## Features ## Features
- Easy-to-use - Easy-to-use
- Many online learning resources (16+ tutorials) - Many online learning resources (17+ tutorials)
- High efficiency in building QNN with various QNN templates - High efficiency in building QNN with various QNN templates
- Automatic differentiation - Automatic differentiation
- Versatile - Versatile
- Multiple optimization tools and GPU mode - Multiple optimization tools and GPU mode
- Simulation with 25+ qubits - Simulation with 25+ qubits
- Flexible noise models
- Featured Toolkits - Featured Toolkits
- Toolboxes for Chemistry & Optimization - Toolboxes for Chemistry & Optimization
- LOCCNet for distributed quantum information processing - LOCCNet for distributed quantum information processing
...@@ -143,8 +144,9 @@ We provide tutorials covering combinatorial optimization, quantum chemistry, qua ...@@ -143,8 +144,9 @@ We provide tutorials covering combinatorial optimization, quantum chemistry, qua
14. [Entanglement Distillation -- Protocol design with LOCCNet](./tutorial/LOCC) 14. [Entanglement Distillation -- Protocol design with LOCCNet](./tutorial/LOCC)
15. [Quantum Teleportation](./tutorial/LOCC) 15. [Quantum Teleportation](./tutorial/LOCC)
16. [Quantum State Discrimination](./tutorial/LOCC) 16. [Quantum State Discrimination](./tutorial/LOCC)
17. [Noise Model and Quantum Channel](./tutorial/Noise)
With the latest LOCCNet module, Paddle Quantum can efficiently simulate distributed quantum information processing tasks. Interested readers can start with this [tutorial on LOCCNet](./tutorial/LOCC/LOCCNET_Tutorial_EN.ipynb). In addition, Paddle Quantum supports QNN training on GPU. For users who want to get into more details, please check out the tutorial [Use Paddle Quantum on GPU](./introduction/PaddleQuantum_GPU_EN.ipynb). With the latest LOCCNet module, Paddle Quantum can efficiently simulate distributed quantum information processing tasks. Interested readers can start with this [tutorial on LOCCNet](./tutorial/LOCC/LOCCNET_Tutorial_EN.ipynb). In addition, Paddle Quantum supports QNN training on GPU. For users who want to get into more details, please check out the tutorial [Use Paddle Quantum on GPU](./introduction/PaddleQuantum_GPU_EN.ipynb). Moreover, Paddle Quantum could design robust quantum algorithms under noise. For more information, please see [Noise tutorial](./tutorial/Noise/Noise_EN.ipynb).
### API documentation ### API documentation
...@@ -177,6 +179,8 @@ So far, we have done several projects with the help of Paddle Quantum as a power ...@@ -177,6 +179,8 @@ So far, we have done several projects with the help of Paddle Quantum as a power
[5] Wang, K., Song, Z., Zhao, X., Wang Z. & Wang, X. Detecting and quantifying entanglement on near-term quantum devices. arXiv:2012.14311 (2020). [[pdf]](https://arxiv.org/pdf/2012.14311.pdf) [5] Wang, K., Song, Z., Zhao, X., Wang Z. & Wang, X. Detecting and quantifying entanglement on near-term quantum devices. arXiv:2012.14311 (2020). [[pdf]](https://arxiv.org/pdf/2012.14311.pdf)
[6] Zhao, X., Zhao, B., Wang, Z., Song, Z., & Wang, X. LOCCNet: a machine learning framework for distributed quantum information processing. arXiv:2101.12190 (2021). [[pdf]](https://arxiv.org/pdf/2101.12190.pdf)
## Frequently Asked Questions ## Frequently Asked Questions
1. **Question:** What is quantum machine learning? What are the applications? 1. **Question:** What is quantum machine learning? What are the applications?
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
</a> </a>
<!-- PyPI --> <!-- PyPI -->
<a href="https://pypi.org/project/paddle-quantum/"> <a href="https://pypi.org/project/paddle-quantum/">
<img src="https://img.shields.io/badge/pypi-v2.0.0-orange.svg?style=flat-square&logo=pypi"/> <img src="https://img.shields.io/badge/pypi-v2.0.1-orange.svg?style=flat-square&logo=pypi"/>
</a> </a>
<!-- Python --> <!-- Python -->
<a href="https://www.python.org/"> <a href="https://www.python.org/">
...@@ -55,12 +55,13 @@ ...@@ -55,12 +55,13 @@
## 特色 ## 特色
- 轻松上手 - 轻松上手
- 丰富的在线学习资源(16+ 教程案例) - 丰富的在线学习资源(17+ 教程案例)
- 通过模板高效搭建量子神经网络 - 通过模板高效搭建量子神经网络
- 自动微分框架 - 自动微分框架
- 功能丰富 - 功能丰富
- 提供多种优化工具和 GPU 模式 - 提供多种优化工具和 GPU 模式
- 高性能模拟器支持25+量子比特的模拟运算 - 高性能模拟器支持25+量子比特的模拟运算
- 支持多种噪声模型的模拟
- 特色工具集 - 特色工具集
- 提供组合优化和量子化学等前沿领域的计算工具箱 - 提供组合优化和量子化学等前沿领域的计算工具箱
- 分布式量子信息处理模组 LOCCNet - 分布式量子信息处理模组 LOCCNet
...@@ -148,8 +149,9 @@ Paddle Quantum(量桨)建立起了人工智能与量子计算的桥梁,为 ...@@ -148,8 +149,9 @@ Paddle Quantum(量桨)建立起了人工智能与量子计算的桥梁,为
- [纠缠蒸馏 -- LOCCNet 设计协议](./tutorial/LOCC) - [纠缠蒸馏 -- LOCCNet 设计协议](./tutorial/LOCC)
- [量子隐态传输](./tutorial/LOCC) - [量子隐态传输](./tutorial/LOCC)
- [量子态分辨](./tutorial/LOCC) - [量子态分辨](./tutorial/LOCC)
- [噪声模型与量子信道](./tutorial/Noise)
随着 LOCCNet 模组的推出,量桨现已支持分布式量子信息处理任务的高效模拟和开发。感兴趣的读者请参见[教程](./tutorial/LOCC/LOCCNET_Tutorial_CN.ipynb)此外,Paddle Quantum 也支持在 GPU 上进行量子机器学习的训练,具体的方法请参考案例:[在 GPU 上使用 Paddle Quantum](./introduction/PaddleQuantum_GPU_CN.ipynb) 随着 LOCCNet 模组的推出,量桨现已支持分布式量子信息处理任务的高效模拟和开发。感兴趣的读者请参见[教程](./tutorial/LOCC/LOCCNET_Tutorial_CN.ipynb)Paddle Quantum 也支持在 GPU 上进行量子机器学习的训练,具体的方法请参考案例:[在 GPU 上使用 Paddle Quantum](./introduction/PaddleQuantum_GPU_CN.ipynb)。此外,量桨可以基于噪声模块进行含噪算法的开发以及研究,详情请见[噪声模块教程](./tutorial/Noise/Noise_CN.ipynb)
### API 文档 ### API 文档
...@@ -179,7 +181,7 @@ Paddle Quantum 使用 setuptools 的 develop 模式进行安装,相关代码 ...@@ -179,7 +181,7 @@ Paddle Quantum 使用 setuptools 的 develop 模式进行安装,相关代码
[5] Wang, K., et al. Detecting and quantifying entanglement on near-term quantum devices. arXiv:2012.14311 (2020). [[pdf]](https://arxiv.org/pdf/2012.14311.pdf) [5] Wang, K., et al. Detecting and quantifying entanglement on near-term quantum devices. arXiv:2012.14311 (2020). [[pdf]](https://arxiv.org/pdf/2012.14311.pdf)
[6] Zhao, X., Zhao, B., Wang, Z., Song, Z., & Wang, X. LOCCNet: a machine learning framework for distributed quantum information processing. arXiv:2101.12190 (2021). [[pdf]](https://arxiv.org/pdf/2101.12190.pdf)
## FAQ ## FAQ
......
...@@ -1551,7 +1551,6 @@ ...@@ -1551,7 +1551,6 @@
" self.theta = self.create_parameter(shape=shape, \n", " self.theta = self.create_parameter(shape=shape, \n",
" default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n", " default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n",
" dtype=dtype, is_bias=False)\n", " dtype=dtype, is_bias=False)\n",
" self.H = paddle.to_tensor(H)\n",
" \n", " \n",
" # 定义损失函数和前向传播机制\n", " # 定义损失函数和前向传播机制\n",
" def forward(self):\n", " def forward(self):\n",
...@@ -1704,7 +1703,7 @@ ...@@ -1704,7 +1703,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.0" "version": "3.6.10"
}, },
"toc": { "toc": {
"base_numbering": 1, "base_numbering": 1,
......
...@@ -17,281 +17,174 @@ Paddle_QAOA: To learn more about the functions and properties of this applicatio ...@@ -17,281 +17,174 @@ Paddle_QAOA: To learn more about the functions and properties of this applicatio
you could check the corresponding Jupyter notebook under the Tutorial folder. you could check the corresponding Jupyter notebook under the Tutorial folder.
""" """
import os import paddle
from paddle_quantum.circuit import UAnsatz
from paddle_quantum.utils import pauli_str_to_matrix
from paddle_quantum.QAOA.QAOA_Prefunc import Generate_H_D, Generate_default_graph
from paddle_quantum.QAOA.QAOA_Prefunc import Draw_benchmark
from paddle_quantum.QAOA.QAOA_Prefunc import Draw_cut_graph, Draw_original_graph
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import networkx as nx import networkx as nx
import paddle
from paddle_quantum.circuit import UAnsatz
from paddle_quantum.utils import pauli_str_to_matrix
from paddle_quantum.QAOA.QAOA_Prefunc import generate_graph, H_generator
# Random seed for optimizer # Random seed for optimizer
SEED = 1024 SEED = 1024
__all__ = [ __all__ = [
"circuit_QAOA", "circuit_QAOA",
"circuit_extend_QAOA",
"Net", "Net",
"Paddle_QAOA", "Paddle_QAOA",
] ]
def circuit_QAOA(E, V, n, p, gamma, beta):
def circuit_QAOA(theta, adjacency_matrix, N, P):
""" """
This function constructs the parameterized QAOA circuit which is composed of P layers of two blocks: This function constructs the parameterized QAOA circuit which is composed of P layers of two blocks:
one block is based on the problem Hamiltonian H which encodes the classical problem, one block is based on the problem Hamiltonian H which encodes the classical problem,
and the other is constructed from the driving Hamiltonian describing the rotation around Pauli X and the other is constructed from the driving Hamiltonian describing the rotation around Pauli X
acting on each qubit. It outputs the final state of the QAOA circuit. acting on each qubit. It outputs the final state of the QAOA circuit.
Args: Args:
theta: parameters to be optimized in the QAOA circuit E: edges of the graph
adjacency_matrix: the adjacency matrix of the graph encoding the classical problem V: vertices of the graph
N: number of qubits, or equivalently, the number of parameters in the original classical problem n: number of qubits in th QAOA circuit
P: number of layers of two blocks in the QAOA circuit p: number of layers of two blocks in the QAOA circuit
gamma: parameter to be optimized in the QAOA circuit, parameter for the first block
beta: parameter to be optimized in the QAOA circui, parameter for the second block
Returns: Returns:
the QAOA circuit the QAOA circuit
""" """
cir = UAnsatz(n)
cir = UAnsatz(N)
# prepare the input state in the uniform superposition of 2^N bit-strings in the computational basis
cir.superposition_layer() cir.superposition_layer()
# This loop defines the QAOA circuit with P layers of two blocks for layer in range(p):
for layer in range(P): for (u, v) in E:
# The second and third loops construct the first block which involves two-qubit operation cir.cnot([u, v])
# e^{-i\gamma Z_iZ_j} acting on a pair of qubits or nodes i and j in the circuit in each layer. cir.rz(gamma[layer], v)
for row in range(N): cir.cnot([u, v])
for col in range(N): for v in V:
if adjacency_matrix[row, col] and row < col: cir.rx(beta[layer], v)
cir.cnot([row, col])
cir.rz(theta[layer][0], col)
cir.cnot([row, col])
# This loop constructs the second block only involving the single-qubit operation e^{-i\beta X}.
for i in range(N):
cir.rx(theta[layer][1], i)
return cir return cir
def circuit_extend_QAOA(theta, adjacency_matrix, N, P):
"""
This is an extended version of the QAOA circuit, and the main difference is the block constructed
from the driving Hamiltonian describing the rotation around an arbitrary direction on each qubit.
Args:
theta: parameters to be optimized in the QAOA circuit
input_state: input state of the QAOA circuit which usually is the uniform superposition of 2^N bit-strings
in the computational basis
adjacency_matrix: the adjacency matrix of the problem graph encoding the original problem
N: number of qubits, or equivalently, the number of parameters in the original classical problem
P: number of layers of two blocks in the QAOA circuit
Returns:
the extended QAOA circuit
Note:
If this circuit_extend_QAOA function is used to construct QAOA circuit, then we need to change the parameter layer
in the Net function defined below from the Net(shape=[D, 2]) for circuit_QAOA function to Net(shape=[D, 4])
because the number of parameters doubles in each layer in this QAOA circuit.
"""
cir = UAnsatz(N)
# prepare the input state in the uniform superposition of 2^N bit-strings in the computational basis
cir.superposition_layer()
for layer in range(P):
for row in range(N):
for col in range(N):
if adjacency_matrix[row, col] and row < col:
cir.cnot([row, col])
cir.rz(theta[layer][0], col)
cir.cnot([row, col])
for i in range(N):
cir.u3(*theta[layer][1:], i)
return cir
class Net(paddle.nn.Layer): class Net(paddle.nn.Layer):
""" """
It constructs the net for QAOA which combines the QAOA circuit with the classical optimizer which sets rules It constructs the net for QAOA which combines the QAOA circuit with the classical optimizer which sets rules
to update parameters described by theta introduced in the QAOA circuit. to update parameters described by theta introduced in the QAOA circuit.
""" """
def __init__( def __init__(
self, self,
shape, p,
param_attr=paddle.nn.initializer.Uniform(low=0.0, high=np.pi), dtype="float64",
dtype="float64",
): ):
super(Net, self).__init__() super(Net, self).__init__()
self.theta = self.create_parameter( self.p = p
shape=shape, attr=param_attr, dtype=dtype, is_bias=False self.gamma = self.create_parameter(shape = [self.p],
) default_initializer = paddle.nn.initializer.Uniform(
low = 0.0,
def forward(self, adjacency_matrix, N, P, METHOD): high = 2 * np.pi
""" ),
This function constructs the loss function for the QAOA circuit. dtype = dtype,
is_bias = False)
Args: self.beta = self.create_parameter(shape = [self.p],
adjacency_matrix: the adjacency matrix generated from the graph encoding the classical problem default_initializer = paddle.nn.initializer.Uniform(
N: number of qubits low = 0.0,
P: number of layers high = 2 * np.pi
METHOD: which version of QAOA is chosen to solve the problem, i.e., standard version labeled by 1 or ),
extended version by 2. dtype = dtype, is_bias = False)
Returns:
the loss function for the parameterized QAOA circuit and the circuit itself
""" def forward(self, n, E, V, H_D_list):
cir = circuit_QAOA(E, V, n, self.p, self.gamma, self.beta)
# Generate the problem_based quantum Hamiltonian H_problem based on the classical problem in paddle
H_problem = H_generator(N, adjacency_matrix)
# The standard QAOA circuit: the function circuit_QAOA is used to construct the circuit, indexed by METHOD 1.
if METHOD == 1:
cir = circuit_QAOA(self.theta, adjacency_matrix, N, P)
# The extended QAOA circuit: the function circuit_extend_QAOA is used to construct the net, indexed by METHOD 2.
elif METHOD == 2:
cir = circuit_extend_QAOA(self.theta, adjacency_matrix, N, P)
else:
raise ValueError("Wrong method called!")
cir.run_state_vector() cir.run_state_vector()
loss = cir.expecval(H_problem) loss = -cir.expecval(H_D_list)
return loss, cir return loss, cir
def Paddle_QAOA(n, p, E, V, H_D_list, ITR, LR):
def Paddle_QAOA(classical_graph_adjacency, N, P, METHOD, ITR, LR):
""" """
This is the core function to run QAOA. This is the core function to run QAOA.
Args: Args:
classical_graph_adjacency: adjacency matrix to describe the graph which encodes the classical problem n: number of qubits (default value N=4)
N: number of qubits (default value N=4) E: edges of the graph
P: number of layers of blocks in the QAOA circuit (default value P=4) V: vertices of the graph
METHOD: which version of the QAOA circuit is used: 1, standard circuit (default); 2, extended circuit p: number of layers of blocks in the QAOA circuit (default value p=4)
ITR: number of iteration steps for QAOA (default value ITR=120) ITR: number of iteration steps for QAOA (default value ITR=120)
LR: learning rate for the gradient-based optimization method (default value LR=0.1) LR: learning rate for the gradient-based optimization method (default value LR=0.1)
Returns: Returns:
the optimized QAOA circuit the optimized QAOA circuit
summary_iter
summary_loss
""" """
# Construct the net or QAOA circuits based on the standard modules net = Net(p)
if METHOD == 1:
net = Net(shape=[P, 2])
# Construct the net or QAOA circuits based on the extended modules
elif METHOD == 2:
net = Net(shape=[P, 4])
else:
raise ValueError("Wrong method called!")
# Classical optimizer
opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters()) opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())
# Gradient descent loop
summary_iter, summary_loss = [], [] summary_iter, summary_loss = [], []
for itr in range(1, ITR + 1): for itr in range(1, ITR + 1):
loss, cir = net( loss, cir = net(n, E, V, H_D_list)
classical_graph_adjacency, N, P, METHOD
)
loss.backward() loss.backward()
opt.minimize(loss) opt.minimize(loss)
opt.clear_grad() opt.clear_grad()
if itr % 10 == 0: if itr % 10 == 0:
print("iter:", itr, " loss:", "%.4f" % loss.numpy()) print("iter:", itr, " loss:", "%.4f" % loss.numpy())
summary_loss.append(loss[0][0].numpy()) summary_loss.append(loss[0][0].numpy())
summary_iter.append(itr) summary_iter.append(itr)
theta_opt = net.parameters()[0].numpy() gamma_opt = net.gamma.numpy()
# print("Optimized parameters theta:\n", theta_opt) print("优化后的参数 gamma:\n", gamma_opt)
beta_opt = net.beta.numpy()
print("优化后的参数 beta:\n", beta_opt)
os.makedirs("output", exist_ok=True) return cir, summary_iter, summary_loss
np.savez("./output/summary_data", iter=summary_iter, energy=summary_loss)
return cir def main(n = 4, E = None):
def main(N=4):
paddle.seed(SEED) paddle.seed(SEED)
# number of qubits or number of nodes in the graph
N = 4 p = 4 # number of layers in the circuit
classical_graph, classical_graph_adjacency = generate_graph(N, GRAPHMETHOD=1) ITR = 120 #number of iterations
print(classical_graph_adjacency) LR = 0.1 #learning rate
# Convert the Hamiltonian's list form to matrix form if E is None:
H_matrix = pauli_str_to_matrix(H_generator(N, classical_graph_adjacency), N) G, V, E = Generate_default_graph(n)
else:
H_diag = np.diag(H_matrix).real G = nx.Graph()
H_max = np.max(H_diag) V = range(n)
H_min = np.min(H_diag) G.add_nodes_from(V)
G.add_edges_from(E)
print(H_diag)
print('H_max:', H_max, ' H_min:', H_min) Draw_original_graph(G)
pos = nx.circular_layout(classical_graph) #construct the Hamiltonia
nx.draw(classical_graph, pos, width=4, with_labels=True, font_weight='bold') H_D_list, H_D_matrix = Generate_H_D(E, n)
plt.show() H_D_diag = np.diag(H_D_matrix).real
H_max = np.max(H_D_diag)
classical_graph, classical_graph_adjacency = generate_graph(N, 1) H_min = -H_max
opt_cir = Paddle_QAOA(classical_graph_adjacency, N=4, P=4, METHOD=1, ITR=120, LR=0.1) print(H_D_diag)
print('H_max:', H_max, ' H_min:', H_min)
# Load the data of QAOA
x1 = np.load('./output/summary_data.npz') cir, summary_iter, summary_loss = Paddle_QAOA(n, p, E, V, H_D_list, ITR, LR)
H_min = np.ones([len(x1['iter'])]) * H_min H_min = np.ones([len(summary_iter)]) * H_min
Draw_benchmark(summary_iter, summary_loss, H_min)
# Plot loss
loss_QAOA, = plt.plot(x1['iter'], x1['energy'], alpha=0.7, marker='', linestyle="--", linewidth=2, color='m') prob_measure = cir.measure(plot=True)
benchmark, = plt.plot(x1['iter'], H_min, alpha=0.7, marker='', linestyle=":", linewidth=2, color='b') cut_bitstring = max(prob_measure, key=prob_measure.get)
plt.xlabel('Number of iteration') print("找到的割的比特串形式:", cut_bitstring)
plt.ylabel('Performance of the loss function for QAOA')
Draw_cut_graph(V, E, G, cut_bitstring)
plt.legend(handles=[
loss_QAOA,
benchmark
],
labels=[
r'Loss function $\left\langle {\psi \left( {\bf{\theta }} \right)} '
r'\right|H\left| {\psi \left( {\bf{\theta }} \right)} \right\rangle $',
'The benchmark result',
], loc='best')
# Show the plot
plt.show()
# Measure the output state of the QAOA circuit for 1024 shots by default
prob_measure = opt_cir.measure(plot=True)
# Find the max value in measured probability of bitstrings
max_prob = max(prob_measure.values())
# Find the bitstring with max probability
solution_list = [result[0] for result in prob_measure.items() if result[1] == max_prob]
print("The output bitstring:", solution_list)
# Draw the graph representing the first bitstring in the solution_list to the MaxCut-like problem
head_bitstring = solution_list[0]
node_cut = ["blue" if head_bitstring[node] == "1" else "red" for node in classical_graph]
edge_cut = [
"solid" if head_bitstring[node_row] == head_bitstring[node_col] else "dashed"
for node_row, node_col in classical_graph.edges()
]
nx.draw(
classical_graph,
pos,
node_color=node_cut,
style=edge_cut,
width=4,
with_labels=True,
font_weight="bold",
)
plt.show()
if __name__ == "__main__": if __name__ == "__main__":
main() n = int(input("Please input the number of vertices: "))
user_input_edge_flag = int(input("Please choose if you want to input edges yourself (0 for yes, 1 for no): "))
if user_input_edge_flag == 1:
main(n)
else:
E = []
prompt = "Please input tuples indicating edges (e.g., (0, 1)), input 'z' if finished: "
while True:
edge = input(prompt)
if edge == 'z':
main(n, E)
break
else:
edge = eval(edge)
E.append(edge)
...@@ -15,134 +15,173 @@ ...@@ -15,134 +15,173 @@
""" """
Aid func Aid func
""" """
from matplotlib import pyplot import matplotlib.pyplot as plt
import numpy as np import numpy as np
from numpy import abs, array, binary_repr, diag, kron, max, ones, real, where, zeros import networkx as nx
import networkx from paddle_quantum.utils import pauli_str_to_matrix
def plot_graph(measure_prob_distribution, graph, N): def Draw_original_graph(G):
""" """
This function plots the graph encoding the combinatorial problem such as Max-Cut and the final graph encoding the This is to draw the original graph
approximate solution obtained from QAOA Args:
G: the constructed graph
Returns:
Null
"""
pos = nx.circular_layout(G)
options = {
"with_labels": True,
"font_size": 20,
"font_weight": "bold",
"font_color": "white",
"node_size": 2000,
"width": 2
}
nx.draw_networkx(G, pos, **options)
ax = plt.gca()
ax.margins(0.20)
plt.axis("off")
plt.show()
return
def Draw_cut_graph(V, E, G, cut_bitstring):
"""
This is to draw the graph after cutting
Args: Args:
measure_prob_distribution: the measurement probability distribution which is sampled from the output state V: vertices in the graph
of optimized QAOA circuit. E: edges in the graph
graph: graph encoding the topology of the classical combinatorial problem, such as Max-Cut problem cut_bitstring: bit string indicate whether vertices belongs to the first group or the second group
N: number of qubits, or number of nodes in the graph Returns:
Return: Null
three graphs: the first displays the graph topology of the classical problem;
the second is the bar graph for the measurement distribution for each bitstring in the output state
the third plots the graph corresponding to the bitstring with maximal measurement probability
""" """
node_cut = ["blue" if cut_bitstring[v] == "1" else "red" for v in V]
# Find the position of max value in the measure_prob_distribution
max_prob_pos_list = where(
measure_prob_distribution == max(measure_prob_distribution))
# Store the max value from ndarray to list
max_prob_list = max_prob_pos_list[0].tolist()
# Store it in the binary format
solution_list = [binary_repr(index, width=N) for index in max_prob_list]
print("The output bitstring:", solution_list)
# Draw the graph representing the first bitstring in the solution_list to the MaxCut-like problem
head_bitstring = solution_list[0]
node_cut = [
"blue" if head_bitstring[node] == "1" else "red" for node in graph
]
edge_cut = [ edge_cut = [
"solid" "solid" if cut_bitstring[u] == cut_bitstring[v] else "dashed"
if head_bitstring[node_row] == head_bitstring[node_col] else "dashed" for (u, v) in G.edges()
for node_row, node_col in graph.edges() ]
]
pos = nx.circular_layout(G)
pos = networkx.circular_layout(graph)
options = {
pyplot.figure(0) "with_labels": True,
networkx.draw(graph, pos, width=4, with_labels=True, font_weight="bold") "font_size": 20,
"font_weight": "bold",
# when N is large, it is not suggested to plot this figure "font_color": "white",
pyplot.figure(1) "node_size": 2000,
name_list = [binary_repr(index, width=N) for index in range(0, 2**N)] "width": 2
pyplot.bar( }
range(len(real(measure_prob_distribution))),
real(measure_prob_distribution), nx.draw(
width=0.7, G,
tick_label=name_list, ) pos,
pyplot.xticks(rotation=90) node_color = node_cut,
style = edge_cut,
pyplot.figure(2) **options
networkx.draw( )
graph, ax = plt.gca()
pos, ax.margins(0.20)
node_color=node_cut, plt.axis("off")
style=edge_cut, plt.show()
width=4,
with_labels=True, return
font_weight="bold", )
pyplot.show()
def Generate_default_graph(n):
def generate_graph(N, GRAPHMETHOD):
""" """
It plots an N-node graph which is specified by Method 1 or 2. This is to generate a default graph if no input
Args:
Args: n: number of vertices
N: number of nodes (vertices) in the graph Returns:
METHOD: choose which method to generate a graph G: the graph
Returns: E: edges list
the specific graph and its adjacency matrix V: vertices list
"""
G = nx.Graph()
V = range(n)
G.add_nodes_from(V)
E = []
for i in range(n - 1):
E.append((i, i + 1))
E.append((0, n - 1))
G.add_edges_from(E)
return G, V, E
def Generate_H_D(E, n):
""" """
# Method 1 generates a graph by self-definition This is to construct Hamiltonia H_D
if GRAPHMETHOD == 1: Args:
print("Method 1 generates the graph from self-definition using EDGE description") E: edges of the graph
graph = networkx.Graph() Returns:
graph_nodelist = range(N) Hamiltonia list
graph.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0)]) Hamiltonia H_D
graph_adjacency = networkx.to_numpy_matrix(graph, nodelist=graph_nodelist)
# Method 2 generates a graph by using its adjacency matrix directly
elif GRAPHMETHOD == 2:
print("Method 2 generates the graph from networks using adjacency matrix")
graph_adjacency = np.array([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0]])
graph = networkx.Graph(graph_adjacency)
else:
print("Method doesn't exist ")
return graph, graph_adjacency
def H_generator(N, adjacency_matrix):
""" """
This function maps the given graph via its adjacency matrix to the corresponding Hamiltiona H_c. H_D_list = []
for (u, v) in E:
H_D_list.append([-1.0, 'z' + str(u) + ',z' + str(v)])
print(H_D_list)
H_D_matrix = pauli_str_to_matrix(H_D_list, n)
return H_D_list, H_D_matrix
def Draw_benchmark(summary_iter, summary_loss, H_min):
"""
This is draw the learning tendency, and difference bwtween it and the benchmark
Args: Args:
N: number of qubits, or number of nodes in the graph, or number of parameters in the classical problem summary_iter: indicate which iteration
adjacency_matrix: the adjacency matrix generated from the graph encoding the classical problem summary_loss: indicate the energy of that iteration
H_min: benchmark value H_min
Returns: Returns:
the problem-based Hmiltonian H's list form generated from the graph_adjacency matrix for the given graph NULL
""" """
H_list = [] plt.figure(1)
# Generate the Hamiltonian H_c from the graph via its adjacency matrix loss_QAOA, = plt.plot(
for row in range(N): summary_iter,
for col in range(N): summary_loss,
if adjacency_matrix[row, col] and row < col: alpha=0.7,
# Construct the Hamiltonian in the list form for the calculation of expectation value marker='',
H_list.append([1.0, 'z' + str(row) + ',z' + str(col)]) linestyle="--",
linewidth=2,
return H_list color='m')
benchmark, = plt.plot(
summary_iter,
H_min,
alpha=0.7,
marker='',
linestyle=":",
linewidth=2,
color='b')
plt.xlabel('Number of iteration')
plt.ylabel('Performance of the loss function for QAOA')
plt.legend(
handles=[loss_QAOA, benchmark],
labels=[
r'Loss function $\left\langle {\psi \left( {\bf{\theta }} \right)} '
r'\right|H\left| {\psi \left( {\bf{\theta }} \right)} \right\rangle $',
'The benchmark result',
],
loc='best')
# Show the picture
plt.show()
return
def main(): def main():
# number of qubits or number of nodes in the graph # number of qubits or number of nodes in the graph
N = 4 n = 4
classical_graph, classical_graph_adjacency = generate_graph(N, GRAPHMETHOD=1) G, V, E = Generate_default_graph(n)
print(classical_graph_adjacency) Draw_original_graph(G)
pos = networkx.circular_layout(classical_graph)
networkx.draw(classical_graph, pos, width=4, with_labels=True, font_weight='bold')
pyplot.show()
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -15,93 +15,41 @@ ...@@ -15,93 +15,41 @@
""" """
main main
""" """
import numpy as np import numpy as np
import matplotlib.pyplot as plt
import networkx as nx import networkx as nx
import paddle import paddle
from paddle_quantum.utils import pauli_str_to_matrix from paddle_quantum.QAOA.QAOA_Prefunc import Generate_H_D, Draw_cut_graph, Draw_original_graph, Generate_default_graph
from paddle_quantum.QAOA.Paddle_QAOA import Paddle_QAOA from paddle_quantum.QAOA.Paddle_QAOA import Paddle_QAOA
from paddle_quantum.QAOA.QAOA_Prefunc import generate_graph, H_generator
def main(N=4):
# number of qubits or number of nodes in the graph
N = 4
classical_graph, classical_graph_adjacency = generate_graph(N, GRAPHMETHOD=1)
print(classical_graph_adjacency)
# Convert the Hamiltonian's list form to matrix form
H_matrix = pauli_str_to_matrix(H_generator(N, classical_graph_adjacency), N)
H_diag = np.diag(H_matrix).real
H_max = np.max(H_diag)
H_min = np.min(H_diag)
print(H_diag)
print('H_max:', H_max, ' H_min:', H_min)
pos = nx.circular_layout(classical_graph)
nx.draw(classical_graph, pos, width=4, with_labels=True, font_weight='bold')
plt.show()
classical_graph, classical_graph_adjacency = generate_graph(N, 1)
opt_cir = Paddle_QAOA(classical_graph_adjacency, N=4, P=4, METHOD=1, ITR=120, LR=0.1)
# Load the data of QAOA
x1 = np.load('./output/summary_data.npz')
H_min = np.ones([len(x1['iter'])]) * H_min
# Plot loss
loss_QAOA, = plt.plot(x1['iter'], x1['energy'], alpha=0.7, marker='', linestyle="--", linewidth=2, color='m')
benchmark, = plt.plot(x1['iter'], H_min, alpha=0.7, marker='', linestyle=":", linewidth=2, color='b')
plt.xlabel('Number of iteration')
plt.ylabel('Performance of the loss function for QAOA')
plt.legend(handles=[
loss_QAOA,
benchmark
],
labels=[
r'Loss function $\left\langle {\psi \left( {\bf{\theta }} \right)} '
r'\right|H\left| {\psi \left( {\bf{\theta }} \right)} \right\rangle $',
'The benchmark result',
], loc='best')
# Show the plot
plt.show()
# Measure the output state of the QAOA circuit for 1024 shots by default
prob_measure = opt_cir.measure(plot=True)
# Find the max value in measured probability of bitstrings
max_prob = max(prob_measure.values())
# Find the bitstring with max probability
solution_list = [result[0] for result in prob_measure.items() if result[1] == max_prob]
print("The output bitstring:", solution_list)
# Draw the graph representing the first bitstring in the solution_list to the MaxCut-like problem
head_bitstring = solution_list[0]
node_cut = ["blue" if head_bitstring[node] == "1" else "red" for node in classical_graph]
edge_cut = [ SEED = 1024
"solid" if head_bitstring[node_row] == head_bitstring[node_col] else "dashed"
for node_row, node_col in classical_graph.edges() def main(n = 4):
] paddle.seed(SEED)
nx.draw(
classical_graph, p = 4 # number of layers in the circuit
pos, ITR = 120 #number of iterations
node_color=node_cut, LR = 0.1 #learning rate
style=edge_cut,
width=4, G, V, E = Generate_default_graph(n)
with_labels=True, G.add_nodes_from(V)
font_weight="bold", G.add_edges_from(E)
)
plt.show() Draw_original_graph(G)
#construct the Hamiltonia
H_D_list, H_D_matrix = Generate_H_D(E, n)
H_D_diag = np.diag(H_D_matrix).real
H_max = np.max(H_D_diag)
print(H_D_diag)
print('H_max:', H_max)
cir, _, _ = Paddle_QAOA(n, p, E, V, H_D_list, ITR, LR)
prob_measure = cir.measure(plot=True)
cut_bitstring = max(prob_measure, key=prob_measure.get)
print("找到的割的比特串形式:", cut_bitstring)
Draw_cut_graph(V, E, G, cut_bitstring)
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -17,4 +17,4 @@ Paddle Quantum Library ...@@ -17,4 +17,4 @@ Paddle Quantum Library
""" """
name = "paddle_quantum" name = "paddle_quantum"
__version__ = "2.0.0" __version__ = "2.0.1"
...@@ -14,22 +14,15 @@ ...@@ -14,22 +14,15 @@
import gc import gc
import math import math
import warnings
from functools import reduce from functools import reduce
from collections import defaultdict from collections import defaultdict
import numpy as np import numpy as np
from numpy import binary_repr, eye, identity
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from paddle_quantum.simulator import transfer_state, init_state_gen, measure_state
from paddle_quantum.simulator import StateTransfer, init_state_gen, measure_state
import paddle import paddle
from paddle import kron as pp_kron from paddle import matmul, trace, real, imag, reshape
from paddle import reshape as complex_reshape
from paddle import matmul, transpose, trace, real, imag
from paddle import multiply
from paddle import reshape, cast, eye, zeros
from paddle_quantum.utils import dagger, pauli_str_to_matrix from paddle_quantum.utils import dagger, pauli_str_to_matrix
from paddle_quantum.intrinsic import * from paddle_quantum.intrinsic import *
from paddle_quantum.state import density_op from paddle_quantum.state import density_op
...@@ -41,36 +34,40 @@ __all__ = [ ...@@ -41,36 +34,40 @@ __all__ = [
class UAnsatz: class UAnsatz:
r"""基于 PaddlePaddle 的动态图机制实现量子线路的 ``class`` 。 r"""基于 PaddlePaddle 的动态图机制实现量子路的 ``class`` 。
用户可以通过实例化该 ``class`` 来搭建自己的量子线路。 用户可以通过实例化该 ``class`` 来搭建自己的量子路。
Attributes: Attributes:
n (int): 该线路的量子比特数 n (int): 该路的量子比特数
""" """
def __init__(self, n): def __init__(self, n):
r"""UAnsatz 的构造函数,用于实例化一个 UAnsatz 对象 r"""UAnsatz 的构造函数,用于实例化一个 UAnsatz 对象
Args: Args:
n (int): 该线路的量子比特数 n (int): 该路的量子比特数
""" """
self.n = n self.n = n
self.__has_channel = False
self.__state = None self.__state = None
self.__run_state = '' self.__run_state = ''
# Record history of adding gates to the circuit # Record history of adding gates to the circuit
self.__history = [] self.__history = []
def run_state_vector(self, input_state=None, store_state=True): def run_state_vector(self, input_state=None, store_state=True):
r"""运行当前的量子线路,输入输出的形式为态矢量。 r"""运行当前的量子电路,输入输出的形式为态矢量。
Warning:
该方法只能运行无噪声的电路。
Args: Args:
input_state (Tensor, optional): 输入的态矢量,默认为 :math:`|00...0\rangle` input_state (Tensor, optional): 输入的态矢量,默认为 :math:`|00...0\rangle`
store_state (Bool, optional): 是否存储输出的态矢量,默认为 ``True`` ,即存储 store_state (Bool, optional): 是否存储输出的态矢量,默认为 ``True`` ,即存储
Returns: Returns:
Tensor: 量子线路输出的态矢量 Tensor: 量子路输出的态矢量
代码示例: 代码示例:
...@@ -96,41 +93,36 @@ class UAnsatz: ...@@ -96,41 +93,36 @@ class UAnsatz:
The output state vector is [[0.62054458+0.j 0.18316521+0.28526291j 0.62054458+0.j 0.18316521+0.28526291j]] The output state vector is [[0.62054458+0.j 0.18316521+0.28526291j 0.62054458+0.j 0.18316521+0.28526291j]]
""" """
# Throw a warning when cir has channel
if self.__has_channel == True:
warnings.warn('The noiseless circuit will be run.', RuntimeWarning)
state = init_state_gen(self.n, 0) if input_state is None else input_state state = init_state_gen(self.n, 0) if input_state is None else input_state
old_shape = state.shape old_shape = state.shape
assert reduce(lambda x, y: x * y, old_shape) == 2 ** self.n, 'The length of the input vector is not right' assert reduce(lambda x, y: x * y, old_shape) == 2 ** self.n, 'The length of the input vector is not right'
state = complex_reshape(state, (2 ** self.n,)) state = reshape(state, (2 ** self.n,))
state_conj = paddle.conj(state) state_conj = paddle.conj(state)
assert paddle.abs(paddle.real(paddle.sum(multiply(state_conj, state))) - 1) < 1e-8, \ assert paddle.abs(real(paddle.sum(paddle.multiply(state_conj, state))) - 1) < 1e-8, \
'Input state is not a normalized vector' 'Input state is not a normalized vector'
for history_ele in self.__history: state = transfer_by_history(state, self.__history)
if history_ele[0] == 'u':
state = StateTransfer(state, 'u', history_ele[1], history_ele[2])
elif history_ele[0] in {'x', 'y', 'z', 'h'}:
state = StateTransfer(state, history_ele[0], history_ele[1], params=history_ele[2])
elif history_ele[0] == 'SWAP':
state = StateTransfer(state, 'SWAP', history_ele[1])
elif history_ele[0] == 'CNOT':
state = StateTransfer(state, 'CNOT', history_ele[1])
if store_state: if store_state:
self.__state = state self.__state = state
# Add info about which function user called # Add info about which function user called
self.__run_state = 'state_vector' self.__run_state = 'state_vector'
return complex_reshape(state, old_shape) return reshape(state, old_shape)
def run_density_matrix(self, input_state=None, store_state=True): def run_density_matrix(self, input_state=None, store_state=True):
r"""运行当前的量子线路,输入输出的形式为密度矩阵。 r"""运行当前的量子路,输入输出的形式为密度矩阵。
Args: Args:
input_state (Tensor, optional): 输入的密度矩阵,默认为 :math:`|00...0\rangle \langle00...0|` input_state (Tensor, optional): 输入的密度矩阵,默认为 :math:`|00...0\rangle \langle00...0|`
store_state (bool, optional): 是否存储输出的密度矩阵,默认为 ``True`` ,即存储 store_state (bool, optional): 是否存储输出的密度矩阵,默认为 ``True`` ,即存储
Returns: Returns:
Tensor: 量子线路输出的密度矩阵 Tensor: 量子路输出的密度矩阵
代码示例: 代码示例:
...@@ -159,9 +151,33 @@ class UAnsatz: ...@@ -159,9 +151,33 @@ class UAnsatz:
[0.47686058-0.03603751j 0.35403671+0.j ]] [0.47686058-0.03603751j 0.35403671+0.j ]]
""" """
state = paddle.to_tensor(density_op(self.n)) if input_state is None else input_state state = paddle.to_tensor(density_op(self.n)) if input_state is None else input_state
assert state.shape == [2 ** self.n, 2 ** self.n], "The dimension is not right"
assert paddle.real(state).shape == [2 ** self.n, 2 ** self.n], "The dimension is not right" if self.__has_channel == False:
state = matmul(self.U, matmul(state, dagger(self.U))) state = matmul(self.U, matmul(state, dagger(self.U)))
else:
dim = 2 ** self.n
shape = (dim, dim)
num_ele = dim ** 2
identity = paddle.eye(dim, dtype='float64')
identity = paddle.cast(identity, 'complex128')
identity = reshape(identity, [num_ele])
u_start = 0
for i, history_ele in enumerate(self.__history):
if history_ele[0] == 'channel':
# Combine preceding unitary operations
unitary = transfer_by_history(identity, self.__history[u_start:i])
sub_state = paddle.zeros(shape, dtype='complex128')
# sum all the terms corresponding to different Kraus operators
for op in history_ele[1]:
pseudo_u = reshape(transfer_state(unitary, op, history_ele[2]), shape)
sub_state += pseudo_u @ state @ dagger(pseudo_u)
state = sub_state
u_start = i + 1
# Apply unitary operations left
unitary = reshape(transfer_by_history(identity, self.__history[u_start:(i + 1)]), shape)
state = matmul(unitary, matmul(state, dagger(unitary)))
if store_state: if store_state:
self.__state = state self.__state = state
...@@ -172,10 +188,13 @@ class UAnsatz: ...@@ -172,10 +188,13 @@ class UAnsatz:
@property @property
def U(self): def U(self):
r"""量子线路的酉矩阵形式。 r"""量子电路的酉矩阵形式。
Warning:
该属性只限于无噪声的电路。
Returns: Returns:
Tensor: 当前线路的酉矩阵表示 Tensor: 当前路的酉矩阵表示
代码示例: 代码示例:
...@@ -198,24 +217,18 @@ class UAnsatz: ...@@ -198,24 +217,18 @@ class UAnsatz:
[ 0. +0.j 0.70710678+0.j 0. +0.j -0.70710678+0.j] [ 0. +0.j 0.70710678+0.j 0. +0.j -0.70710678+0.j]
[ 0.70710678+0.j 0. +0.j -0.70710678+0.j 0. +0.j]] [ 0.70710678+0.j 0. +0.j -0.70710678+0.j 0. +0.j]]
""" """
state = eye(2 ** self.n, dtype='float64') # Throw a warning when cir has channel
if self.__has_channel == True:
warnings.warn('The unitary matrix of the noiseless circuit will be given.', RuntimeWarning)
dim = 2 ** self.n
shape = (dim, dim)
num_ele = dim ** 2
state = paddle.eye(dim, dtype='float64')
state = paddle.cast(state, 'complex128') state = paddle.cast(state, 'complex128')
state = reshape(state, [num_ele])
state = transfer_by_history(state, self.__history)
shape = (2 ** self.n, 2 ** self.n) return reshape(state, shape)
num_ele = reduce(lambda x, y: x * y, shape)
state = paddle.reshape(state, [num_ele])
for history_ele in self.__history:
if history_ele[0] == 'u':
state = StateTransfer(state, 'u', history_ele[1], history_ele[2])
elif history_ele[0] in {'x', 'y', 'z', 'h'}:
state = StateTransfer(state, history_ele[0], history_ele[1], params=history_ele[2])
elif history_ele[0] == 'SWAP':
state = StateTransfer(state, 'SWAP', history_ele[1])
elif history_ele[0] == 'CNOT':
state = StateTransfer(state, 'CNOT', history_ele[1])
return paddle.reshape(state, shape)
""" """
Common Gates Common Gates
...@@ -232,7 +245,7 @@ class UAnsatz: ...@@ -232,7 +245,7 @@ class UAnsatz:
Args: Args:
theta (Tensor): 旋转角度 theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -263,7 +276,7 @@ class UAnsatz: ...@@ -263,7 +276,7 @@ class UAnsatz:
Args: Args:
theta (Tensor): 旋转角度 theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -293,7 +306,7 @@ class UAnsatz: ...@@ -293,7 +306,7 @@ class UAnsatz:
Args: Args:
theta (Tensor): 旋转角度 theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -315,7 +328,7 @@ class UAnsatz: ...@@ -315,7 +328,7 @@ class UAnsatz:
def cnot(self, control): def cnot(self, control):
r"""添加一个 CNOT 门。 r"""添加一个 CNOT 门。
对于 2 量子比特的量子线路,当 ``control`` 为 ``[0, 1]`` 时,其矩阵形式为: 对于 2 量子比特的量子路,当 ``control`` 为 ``[0, 1]`` 时,其矩阵形式为:
.. math:: .. math::
...@@ -325,7 +338,7 @@ class UAnsatz: ...@@ -325,7 +338,7 @@ class UAnsatz:
\end{align} \end{align}
Args: Args:
control (list): 作用在的 qubit 的编号,``control[0]`` 为控制位,``control[1]`` 为目标位,其值都应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 control (list): 作用在的 qubit 的编号,``control[0]`` 为控制位,``control[1]`` 为目标位,其值都应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -339,7 +352,7 @@ class UAnsatz: ...@@ -339,7 +352,7 @@ class UAnsatz:
assert 0 <= control[0] < self.n and 0 <= control[1] < self.n,\ assert 0 <= control[0] < self.n and 0 <= control[1] < self.n,\
"the qubit should >= 0 and < n(the number of qubit)" "the qubit should >= 0 and < n(the number of qubit)"
assert control[0] != control[1], "the control qubit is the same as the target qubit" assert control[0] != control[1], "the control qubit is the same as the target qubit"
self.__history.append(['CNOT', control]) self.__history.append(['CNOT', control, None])
def swap(self, control): def swap(self, control):
r"""添加一个 SWAP 门。 r"""添加一个 SWAP 门。
...@@ -353,7 +366,7 @@ class UAnsatz: ...@@ -353,7 +366,7 @@ class UAnsatz:
\end{align} \end{align}
Args: Args:
control (list): 作用在的 qubit 的编号,``control[0]`` 和 ``control[1]`` 是想要交换的位,其值都应该在 :math:`[0, n)`范围内, :math:`n` 为该量子线路的量子比特数 control (list): 作用在的 qubit 的编号,``control[0]`` 和 ``control[1]`` 是想要交换的位,其值都应该在 :math:`[0, n)`范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -364,9 +377,10 @@ class UAnsatz: ...@@ -364,9 +377,10 @@ class UAnsatz:
cir = UAnsatz(num_qubits) cir = UAnsatz(num_qubits)
cir.swap([0, 1]) cir.swap([0, 1])
""" """
assert 0 <= control[0] < self.n and 0 <= control[1] < self.n, "the qubit should >= 0 and < n(the number of qubit)" assert 0 <= control[0] < self.n and 0 <= control[1] < self.n,\
"the qubit should >= 0 and < n(the number of qubit)"
assert control[0] != control[1], "the indices needed to be swapped should not be the same" assert control[0] != control[1], "the indices needed to be swapped should not be the same"
self.__history.append(['SWAP', control]) self.__history.append(['SWAP', control, None])
def x(self, which_qubit): def x(self, which_qubit):
r"""添加单量子比特 X 门。 r"""添加单量子比特 X 门。
...@@ -378,7 +392,7 @@ class UAnsatz: ...@@ -378,7 +392,7 @@ class UAnsatz:
\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -408,7 +422,7 @@ class UAnsatz: ...@@ -408,7 +422,7 @@ class UAnsatz:
\begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix} \begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -438,7 +452,7 @@ class UAnsatz: ...@@ -438,7 +452,7 @@ class UAnsatz:
\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python .. code-block:: python
...@@ -468,7 +482,7 @@ class UAnsatz: ...@@ -468,7 +482,7 @@ class UAnsatz:
H = \frac{1}{\sqrt{2}}\begin{bmatrix} 1&1\\1&-1 \end{bmatrix} H = \frac{1}{\sqrt{2}}\begin{bmatrix} 1&1\\1&-1 \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
""" """
assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)" assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)"
self.__history.append(['h', [which_qubit], None]) self.__history.append(['h', [which_qubit], None])
...@@ -483,7 +497,7 @@ class UAnsatz: ...@@ -483,7 +497,7 @@ class UAnsatz:
S = \begin{bmatrix} 1&0\\0&i \end{bmatrix} S = \begin{bmatrix} 1&0\\0&i \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
""" """
assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)" assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)"
self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])), self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])),
...@@ -500,7 +514,7 @@ class UAnsatz: ...@@ -500,7 +514,7 @@ class UAnsatz:
T = \begin{bmatrix} 1&0\\0&e^\frac{i\pi}{4} \end{bmatrix} T = \begin{bmatrix} 1&0\\0&e^\frac{i\pi}{4} \end{bmatrix}
Args: Args:
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
""" """
assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)" assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)"
self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])), self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])),
...@@ -526,7 +540,7 @@ class UAnsatz: ...@@ -526,7 +540,7 @@ class UAnsatz:
theta (Tensor): 旋转角度 :math:`\theta` 。 theta (Tensor): 旋转角度 :math:`\theta` 。
phi (Tensor): 旋转角度 :math:`\phi` 。 phi (Tensor): 旋转角度 :math:`\phi` 。
lam (Tensor): 旋转角度 :math:`\lambda` 。 lam (Tensor): 旋转角度 :math:`\lambda` 。
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
""" """
assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)" assert 0 <= which_qubit < self.n, "the qubit should >= 0 and < n(the number of qubit)"
self.__history.append(['u', [which_qubit], [theta, phi, lam]]) self.__history.append(['u', [which_qubit], [theta, phi, lam]])
...@@ -643,8 +657,8 @@ class UAnsatz: ...@@ -643,8 +657,8 @@ class UAnsatz:
assert len(which_qubits) == 3, "You should add this gate on three qubits" assert len(which_qubits) == 3, "You should add this gate on three qubits"
assert len(theta) == 81, "The length of theta is supposed to be 81" assert len(theta) == 81, "The length of theta is supposed to be 81"
psi = paddle.reshape(x=theta[: 60], shape=[4, 15]) psi = reshape(x=theta[: 60], shape=[4, 15])
phi = paddle.reshape(x=theta[60:], shape=[7, 3]) phi = reshape(x=theta[60:], shape=[7, 3])
self.universal_2_qubit_gate(psi[0], which_qubits[:2]) self.universal_2_qubit_gate(psi[0], which_qubits[:2])
self.u3(phi[0][0], phi[0][1], phi[0][2], which_qubits[2]) self.u3(phi[0][0], phi[0][1], phi[0][2], which_qubits[2])
...@@ -730,14 +744,14 @@ class UAnsatz: ...@@ -730,14 +744,14 @@ class UAnsatz:
# Which_qubits is list-like # Which_qubits is list-like
def measure(self, which_qubits=None, shots=2 ** 10, plot=False): def measure(self, which_qubits=None, shots=2 ** 10, plot=False):
r"""对量子线路输出的量子态进行测量。 r"""对量子路输出的量子态进行测量。
Warning: Warning:
当 ``plot`` 为 ``True`` 时,当前量子线路的量子比特数需要小于 6 ,否则无法绘制图片,会抛出异常。 当 ``plot`` 为 ``True`` 时,当前量子路的量子比特数需要小于 6 ,否则无法绘制图片,会抛出异常。
Args: Args:
which_qubits (list, optional): 要测量的qubit的编号,默认全都测量 which_qubits (list, optional): 要测量的qubit的编号,默认全都测量
shots (int, optional): 该量子线路输出的量子态的测量次数,默认为 1024 次;若为 0,则返回测量结果的精确概率分布 shots (int, optional): 该量子路输出的量子态的测量次数,默认为 1024 次;若为 0,则返回测量结果的精确概率分布
plot (bool, optional): 是否绘制测量结果图,默认为 ``False`` ,即不绘制 plot (bool, optional): 是否绘制测量结果图,默认为 ``False`` ,即不绘制
Returns: Returns:
...@@ -809,25 +823,24 @@ class UAnsatz: ...@@ -809,25 +823,24 @@ class UAnsatz:
return result if not plot else self.__measure_hist(result, which_qubits, shots) return result if not plot else self.__measure_hist(result, which_qubits, shots)
def expecval(self, H): def expecval(self, H):
r"""量子线路输出的量子态关于可观测量 H 的期望值。 r"""量子路输出的量子态关于可观测量 H 的期望值。
Hint: Hint:
如果想输入的可观测量的矩阵为 :math:`0.7Z\otimes X\otimes I+0.2I\otimes Z\otimes I` 。则 ``H`` 应为 ``[[0.7, 'z0,x1'], [0.2, 'z1']]`` 。 如果想输入的可观测量的矩阵为 :math:`0.7Z\otimes X\otimes I+0.2I\otimes Z\otimes I` 。则 ``H`` 应为 ``[[0.7, 'z0,x1'], [0.2, 'z1']]`` 。
Args: Args:
H (list): 可观测量的相关信息 H (list): 可观测量的相关信息
Returns: Returns:
Tensor: 量子线路输出的量子态关于 H 的期望值 Tensor: 量子路输出的量子态关于 H 的期望值
代码示例: 代码示例:
.. code-block:: python .. code-block:: python
import numpy as np
import paddle import paddle
from paddle_quantum.circuit import UAnsatz from paddle_quantum.circuit import UAnsatz
n = 5 n = 5
H_info = [[0.1, 'x1'], [0.2, 'y0,z4']] H_info = [[0.1, 'x1'], [0.2, 'y0,z4']]
theta = paddle.to_tensor(np.ones(3)) theta = paddle.ones([3], dtype='float64')
cir = UAnsatz(n) cir = UAnsatz(n)
cir.rx(theta[0], 0) cir.rx(theta[0], 0)
cir.rz(theta[1], 1) cir.rz(theta[1], 1)
...@@ -900,6 +913,54 @@ class UAnsatz: ...@@ -900,6 +913,54 @@ class UAnsatz:
for i in range(self.n): for i in range(self.n):
self.ry(_theta, i) self.ry(_theta, i)
def linear_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 Ry 门,Rz 门和 CNOT 门的线性纠缠层。
Attention:
``theta`` 的维度为 ``(depth, n, 2)`` ,最低维内容为对应的 ``ry`` 和 ``rz`` 的参数。
Args:
theta (Tensor): Ry 门和 Rz 门的旋转角度
depth (int): 纠缠层的深度
which_qubits(list): 作用的量子比特编号
代码示例:
.. code-block:: python
import paddle
from paddle_quantum.circuit import UAnsatz
n = 2
DEPTH = 3
theta = paddle.ones([DEPTH, n, 2], dtype='float64')
cir = UAnsatz(n)
cir.linear_entangled_layer(theta, DEPTH, [0, 1])
cir.run_state_vector()
print(cir.measure(shots = 0))
::
{'00': 0.646611169077063, '01': 0.06790630495474384, '10': 0.19073671025717626, '11': 0.09474581571101756}
"""
assert self.n > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'the shape of theta is not right'
assert theta.shape[2] == 2, 'the shape of theta is not right'
# assert theta.shape[1] == self.n, 'the shape of theta is not right'
assert theta.shape[0] == depth, 'the depth of theta has a mismatch'
if which_qubits is None:
which_qubits = np.arange(self.n)
for repeat in range(depth):
for i, q in enumerate(which_qubits):
self.ry(theta[repeat][i][0], q)
for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i], which_qubits[i + 1]])
for i, q in enumerate(which_qubits):
self.rz(theta[repeat][i][1], q)
for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i + 1], which_qubits[i]])
def real_entangled_layer(self, theta, depth, which_qubits=None): def real_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的强纠缠层。 r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的强纠缠层。
...@@ -907,7 +968,7 @@ class UAnsatz: ...@@ -907,7 +968,7 @@ class UAnsatz:
这一层量子门的数学表示形式为实数酉矩阵。 这一层量子门的数学表示形式为实数酉矩阵。
Attention: Attention:
``theta`` 的维度为 ``(depth, n, 1)`` ``theta`` 的维度为 ``(depth, n, 1)``
Args: Args:
theta (Tensor): Ry 门的旋转角度 theta (Tensor): Ry 门的旋转角度
...@@ -918,13 +979,11 @@ class UAnsatz: ...@@ -918,13 +979,11 @@ class UAnsatz:
.. code-block:: python .. code-block:: python
import numpy as np
import paddle import paddle
from paddle_quantum.circuit import UAnsatz from paddle_quantum.circuit import UAnsatz
n = 2 n = 2
DEPTH = 3 DEPTH = 3
theta = np.ones([DEPTH, n, 1]) theta = paddle.ones([DEPTH, n, 1], dtype='float64')
theta = paddle.to_tensor(theta)
cir = UAnsatz(n) cir = UAnsatz(n)
cir.real_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1]) cir.real_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1])
cir.run_state_vector() cir.run_state_vector()
...@@ -945,7 +1004,7 @@ class UAnsatz: ...@@ -945,7 +1004,7 @@ class UAnsatz:
for repeat in range(depth): for repeat in range(depth):
for i, q in enumerate(which_qubits): for i, q in enumerate(which_qubits):
self.ry(theta=theta[repeat][i][0], which_qubit=q) self.ry(theta[repeat][i][0], q)
for i in range(len(which_qubits) - 1): for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i], which_qubits[i + 1]]) self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([which_qubits[-1], which_qubits[0]]) self.cnot([which_qubits[-1], which_qubits[0]])
...@@ -957,7 +1016,7 @@ class UAnsatz: ...@@ -957,7 +1016,7 @@ class UAnsatz:
这一层量子门的数学表示形式为复数酉矩阵。 这一层量子门的数学表示形式为复数酉矩阵。
Attention: Attention:
``theta`` 的维度为 ``(depth, n, 3)`` ,最低维内容为对应的 ``u3`` 的参数 ``(theta, phi, lam)`` ``theta`` 的维度为 ``(depth, n, 3)`` ,最低维内容为对应的 ``u3`` 的参数 ``(theta, phi, lam)``
Args: Args:
theta (Tensor): U3 门的旋转角度 theta (Tensor): U3 门的旋转角度
...@@ -968,13 +1027,11 @@ class UAnsatz: ...@@ -968,13 +1027,11 @@ class UAnsatz:
.. code-block:: python .. code-block:: python
import numpy as np
import paddle import paddle
from paddle_quantum.circuit import UAnsatz from paddle_quantum.circuit import UAnsatz
n = 2 n = 2
DEPTH = 3 DEPTH = 3
theta = np.ones([DEPTH, n, 3]) theta = paddle.ones([DEPTH, n, 3], dtype='float64')
theta = paddle.to_tensor(theta)
cir = UAnsatz(n) cir = UAnsatz(n)
cir.complex_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1]) cir.complex_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1])
cir.run_state_vector() cir.run_state_vector()
...@@ -995,7 +1052,7 @@ class UAnsatz: ...@@ -995,7 +1052,7 @@ class UAnsatz:
for repeat in range(depth): for repeat in range(depth):
for i, q in enumerate(which_qubits): for i, q in enumerate(which_qubits):
self.u3(theta[repeat][i][0], theta[repeat][i][1], theta[repeat][i][2], which_qubit=q) self.u3(theta[repeat][i][0], theta[repeat][i][1], theta[repeat][i][2], q)
for i in range(len(which_qubits) - 1): for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i], which_qubits[i + 1]]) self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([which_qubits[-1], which_qubits[0]]) self.cnot([which_qubits[-1], which_qubits[0]])
...@@ -1065,7 +1122,7 @@ class UAnsatz: ...@@ -1065,7 +1122,7 @@ class UAnsatz:
这一层量子门的数学表示形式为实数酉矩阵。 这一层量子门的数学表示形式为实数酉矩阵。
Attention: Attention:
``theta`` 的维度为 ``(depth, n-1, 4)`` ``theta`` 的维度为 ``(depth, n-1, 4)``
Args: Args:
theta(Tensor): Ry 门的旋转角度 theta(Tensor): Ry 门的旋转角度
...@@ -1075,13 +1132,11 @@ class UAnsatz: ...@@ -1075,13 +1132,11 @@ class UAnsatz:
.. code-block:: python .. code-block:: python
import numpy as np
import paddle import paddle
from paddle_quantum.circuit import UAnsatz from paddle_quantum.circuit import UAnsatz
n = 4 n = 4
DEPTH = 3 DEPTH = 3
theta = np.ones([DEPTH, n-1, 4]) theta = paddle.ones([DEPTH, n - 1, 4], dtype='float64')
theta = paddle.to_tensor(theta)
cir = UAnsatz(n) cir = UAnsatz(n)
cir.real_block_layer(paddle.to_tensor(theta), DEPTH) cir.real_block_layer(paddle.to_tensor(theta), DEPTH)
cir.run_density_matrix() cir.run_density_matrix()
...@@ -1114,7 +1169,7 @@ class UAnsatz: ...@@ -1114,7 +1169,7 @@ class UAnsatz:
这一层量子门的数学表示形式为复数酉矩阵。 这一层量子门的数学表示形式为复数酉矩阵。
Attention: Attention:
``theta`` 的维度为 ``(depth, n-1, 12)`` ``theta`` 的维度为 ``(depth, n-1, 12)``
Args: Args:
theta (Tensor): U3 门的角度信息 theta (Tensor): U3 门的角度信息
...@@ -1124,13 +1179,11 @@ class UAnsatz: ...@@ -1124,13 +1179,11 @@ class UAnsatz:
.. code-block:: python .. code-block:: python
import numpy as np
import paddle import paddle
from paddle_quantum.circuit import UAnsatz from paddle_quantum.circuit import UAnsatz
n = 4 n = 4
DEPTH = 3 DEPTH = 3
theta = np.ones([DEPTH, n-1, 12]) theta = paddle.ones([DEPTH, n - 1, 12], dtype='float64')
theta = paddle.to_tensor(theta)
cir = UAnsatz(n) cir = UAnsatz(n)
cir.complex_block_layer(paddle.to_tensor(theta), DEPTH) cir.complex_block_layer(paddle.to_tensor(theta), DEPTH)
cir.run_density_matrix() cir.run_density_matrix()
...@@ -1156,6 +1209,414 @@ class UAnsatz: ...@@ -1156,6 +1209,414 @@ class UAnsatz:
self.__add_complex_layer(theta[i][:int((self.n - 1) / 2)], [0, self.n - 2]) self.__add_complex_layer(theta[i][:int((self.n - 1) / 2)], [0, self.n - 2])
self.__add_complex_layer(theta[i][int((self.n - 1) / 2):], [1, self.n - 1]) self.__add_complex_layer(theta[i][int((self.n - 1) / 2):], [1, self.n - 1])
"""
Channels
"""
@apply_channel
def amplitude_damping(self, gamma, which_qubit):
r"""添加振幅阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \begin{bmatrix} 0 & \sqrt{\gamma} \\ 0 & 0 \end{bmatrix}.
Args:
gamma (float): 减振概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
gamma = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.amplitude_damping(gamma, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.5 +0.j 0. +0.j 0. +0.j 0.47434165+0.j]
[0. +0.j 0.05 +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0.47434165+0.j 0. +0.j 0. +0.j 0.45 +0.j]]
"""
assert 0 <= gamma <= 1, 'the parameter gamma should be in range [0, 1]'
e0 = paddle.to_tensor([[1, 0], [0, np.sqrt(1 - gamma)]], dtype='complex128')
e1 = paddle.to_tensor([[0, np.sqrt(gamma)], [0, 0]], dtype='complex128')
return [e0, e1]
@apply_channel
def generalized_amplitude_damping(self, gamma, p, which_qubit):
r"""添加广义振幅阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{p} \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \sqrt{p} \begin{bmatrix} 0 & \sqrt{\gamma} \\ 0 & 0 \end{bmatrix},\\
E_2 = \sqrt{1-p} \begin{bmatrix} \sqrt{1-\gamma} & 0 \\ 0 & 1 \end{bmatrix},
E_3 = \sqrt{1-p} \begin{bmatrix} 0 & 0 \\ \sqrt{\gamma} & 0 \end{bmatrix}.
Args:
gamma (float): 减振概率,其值应该在 :math:`[0, 1]` 区间内
p (float): 激发概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
gamma = 0.1
p = 0.2
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.generalized_amplitude_damping(gamma, p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.46 +0.j 0. +0.j 0. +0.j 0.47434165+0.j]
[0. +0.j 0.01 +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0.04 +0.j 0. +0.j]
[0.47434165+0.j 0. +0.j 0. +0.j 0.49 +0.j]]
"""
assert 0 <= gamma <= 1, 'the parameter gamma should be in range [0, 1]'
assert 0 <= p <= 1, 'The parameter p should be in range [0, 1]'
e0 = paddle.to_tensor(np.sqrt(p) * np.array([[1, 0], [0, np.sqrt(1 - gamma)]], dtype='complex128'))
e1 = paddle.to_tensor(np.sqrt(p) * np.array([[0, np.sqrt(gamma)], [0, 0]]), dtype='complex128')
e2 = paddle.to_tensor(np.sqrt(1 - p) * np.array([[np.sqrt(1 - gamma), 0], [0, 1]], dtype='complex128'))
e3 = paddle.to_tensor(np.sqrt(1 - p) * np.array([[0, 0], [np.sqrt(gamma), 0]]), dtype='complex128')
return [e0, e1, e2, e3]
@apply_channel
def phase_damping(self, gamma, which_qubit):
r"""添加相位阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \begin{bmatrix} 0 & 0 \\ 0 & \sqrt{\gamma} \end{bmatrix}.
Args:
gamma (float): phase damping 信道的参数,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.phase_damping(p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.5 +0.j 0. +0.j 0. +0.j 0.47434165+0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0.47434165+0.j 0. +0.j 0. +0.j 0.5 +0.j]]
"""
assert 0 <= gamma <= 1, 'the parameter gamma should be in range [0, 1]'
e0 = paddle.to_tensor([[1, 0], [0, np.sqrt(1 - gamma)]], dtype='complex128')
e1 = paddle.to_tensor([[0, 0], [0, np.sqrt(gamma)]], dtype='complex128')
return [e0, e1]
@apply_channel
def bit_flip(self, p, which_qubit):
r"""添加比特反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1-p} I,
E_1 = \sqrt{p} X.
Args:
p (float): 发生 bit flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.bit_flip(p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.45+0.j 0. +0.j 0. +0.j 0.45+0.j]
[0. +0.j 0.05+0.j 0.05+0.j 0. +0.j]
[0. +0.j 0.05+0.j 0.05+0.j 0. +0.j]
[0.45+0.j 0. +0.j 0. +0.j 0.45+0.j]]
"""
assert 0 <= p <= 1, 'the probability p of a bit flip should be in range [0, 1]'
e0 = paddle.to_tensor([[np.sqrt(1-p), 0], [0, np.sqrt(1-p)]], dtype='complex128')
e1 = paddle.to_tensor([[0, np.sqrt(p)], [np.sqrt(p), 0]], dtype='complex128')
return [e0, e1]
@apply_channel
def phase_flip(self, p, which_qubit):
r"""添加相位反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1 - p} I,
E_1 = \sqrt{p} Z.
Args:
p (float): 发生 phase flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.phase_flip(p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.5+0.j 0. +0.j 0. +0.j 0.4+0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0.4+0.j 0. +0.j 0. +0.j 0.5+0.j]]
"""
assert 0 <= p <= 1, 'the probability p of a phase flip should be in range [0, 1]'
e0 = paddle.to_tensor([[np.sqrt(1-p), 0], [0, np.sqrt(1-p)]], dtype='complex128')
e1 = paddle.to_tensor([[np.sqrt(p), 0], [0, -np.sqrt(p)]], dtype='complex128')
return [e0, e1]
@apply_channel
def bit_phase_flip(self, p, which_qubit):
r"""添加比特相位反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1 - p} I,
E_1 = \sqrt{p} Y.
Args:
p (float): 发生 bit phase flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.bit_phase_flip(p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[ 0.45+0.j 0. +0.j 0. +0.j 0.45+0.j]
[ 0. +0.j 0.05+0.j -0.05+0.j 0. +0.j]
[ 0. +0.j -0.05+0.j 0.05+0.j 0. +0.j]
[ 0.45+0.j 0. +0.j 0. +0.j 0.45+0.j]]
"""
assert 0 <= p <= 1, 'the probability p of a bit phase flip should be in range [0, 1]'
e0 = paddle.to_tensor([[np.sqrt(1-p), 0], [0, np.sqrt(1-p)]], dtype='complex128')
e1 = paddle.to_tensor([[0, -1j * np.sqrt(p)], [1j * np.sqrt(p), 0]], dtype='complex128')
return [e0, e1]
@apply_channel
def depolarizing(self, p, which_qubit):
r"""添加去极化信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1-p} I,
E_1 = \sqrt{p/3} X,
E_2 = \sqrt{p/3} Y,
E_3 = \sqrt{p/3} Z.
Args:
p (float): depolarizing 信道的参数,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p = 0.1
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.depolarizing(p, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.46666667+0.j 0. +0.j 0. +0.j 0.43333333+0.j]
[0. +0.j 0.03333333+0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0.03333333+0.j 0. +0.j]
[0.43333333+0.j 0. +0.j 0. +0.j 0.46666667+0.j]]
"""
assert 0 <= p <= 1, 'the parameter p should be in range [0, 1]'
e0 = paddle.to_tensor([[np.sqrt(1-p), 0], [0, np.sqrt(1-p)]], dtype='complex128')
e1 = paddle.to_tensor([[0, np.sqrt(p/3)], [np.sqrt(p/3), 0]], dtype='complex128')
e2 = paddle.to_tensor([[0, -1j * np.sqrt(p/3)], [1j * np.sqrt(p/3), 0]], dtype='complex128')
e3 = paddle.to_tensor([[np.sqrt(p/3), 0], [0, -np.sqrt(p/3)]], dtype='complex128')
return [e0, e1, e2, e3]
@apply_channel
def pauli_channel(self, p_x, p_y, p_z, which_qubit):
r"""添加泡利信道。
Args:
p_x (float): 泡利矩阵 X 的对应概率,其值应该在 :math:`[0, 1]` 区间内
p_y (float): 泡利矩阵 Y 的对应概率,其值应该在 :math:`[0, 1]` 区间内
p_z (float): 泡利矩阵 Z 的对应概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
Note:
三个输入的概率加起来需要小于等于 1。
代码示例:
.. code-block:: python
from paddle_quantum.circuit import UAnsatz
N = 2
p_x = 0.1
p_y = 0.2
p_z = 0.3
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.pauli_channel(p_x, p_y, p_z, 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[ 0.35+0.j 0. +0.j 0. +0.j 0.05+0.j]
[ 0. +0.j 0.15+0.j -0.05+0.j 0. +0.j]
[ 0. +0.j -0.05+0.j 0.15+0.j 0. +0.j]
[ 0.05+0.j 0. +0.j 0. +0.j 0.35+0.j]]
"""
prob_list = [p_x, p_y, p_z]
assert sum(prob_list) <= 1, 'the sum of probabilities should be smaller than or equal to 1 '
X = np.array([[0, 1], [1, 0]], dtype='complex128')
Y = np.array([[0, -1j], [1j, 0]], dtype='complex128')
Z = np.array([[1, 0], [0, -1]], dtype='complex128')
I = np.array([[1, 0], [0, 1]], dtype='complex128')
op_list = [X, Y, Z]
for i, prob in enumerate(prob_list):
assert 0 <= prob <= 1, 'the parameter p' + str(i + 1) + ' should be in range [0, 1]'
op_list[i] = paddle.to_tensor(np.sqrt(prob_list[i]) * op_list[i])
op_list.append(paddle.to_tensor(np.sqrt(1 - sum(prob_list)) * I))
return op_list
@apply_channel
def customized_channel(self, ops, which_qubit):
r"""添加自定义的量子信道。
Args:
ops (list): 表示信道的 Kraus 算符的列表
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子电路的量子比特数
代码示例:
.. code-block:: python
import paddle
from paddle_quantum.circuit import UAnsatz
N = 2
k1 = paddle.to_tensor([[1, 0], [0, 0]], dtype='complex128')
k2 = paddle.to_tensor([[0, 0], [0, 1]], dtype='complex128')
cir = UAnsatz(N)
cir.h(0)
cir.cnot([0,1])
cir.customized_channel([k1, k2], 0)
final_state = cir.run_density_matrix()
print(final_state.numpy())
::
[[0.5+0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0. +0.j]
[0. +0.j 0. +0.j 0. +0.j 0.5+0.j]]
"""
completeness = paddle.to_tensor([[0, 0], [0, 0]], dtype='complex128')
for op in ops:
assert isinstance(op, paddle.Tensor), 'The input operators should be Tensors.'
assert op.shape == [2, 2], 'The shape of each operator should be [2, 2].'
assert op.dtype.name == 'COMPLEX128', 'The dtype of each operator should be COMPLEX128.'
completeness += matmul(dagger(op), op)
assert np.allclose(completeness.numpy(), np.eye(2, dtype='complex128')), 'Kraus operators should satisfy completeness.'
return ops
def __local_H_prob(cir, hamiltonian, shots=1024): def __local_H_prob(cir, hamiltonian, shots=1024):
r""" r"""
...@@ -1166,7 +1627,7 @@ def __local_H_prob(cir, hamiltonian, shots=1024): ...@@ -1166,7 +1627,7 @@ def __local_H_prob(cir, hamiltonian, shots=1024):
""" """
# Add one ancilla, which we later measure and process the result # Add one ancilla, which we later measure and process the result
new_cir = UAnsatz(cir.n + 1) new_cir = UAnsatz(cir.n + 1)
input_state = pp_kron(cir.run_state_vector(store_state=False), init_state_gen(1)) input_state = paddle.kron(cir.run_state_vector(store_state=False), init_state_gen(1))
# Used in fixed Rz gate # Used in fixed Rz gate
_theta = paddle.to_tensor(np.array([-np.pi / 2])) _theta = paddle.to_tensor(np.array([-np.pi / 2]))
......
...@@ -13,11 +13,13 @@ ...@@ -13,11 +13,13 @@
# limitations under the License. # limitations under the License.
import math import math
from functools import wraps
import numpy as np import numpy as np
from numpy import binary_repr from numpy import binary_repr
import paddle import paddle
from paddle import multiply, add, to_tensor from paddle import multiply, add, to_tensor
from paddle_quantum.simulator import StateTransfer
def dic_between2and10(n): def dic_between2and10(n):
...@@ -115,3 +117,38 @@ def vec_expecval(H, vec): ...@@ -115,3 +117,38 @@ def vec_expecval(H, vec):
vec_conj = paddle.conj(vec) vec_conj = paddle.conj(vec)
result = paddle.sum(multiply(vec_conj, H_vec(H, vec))) result = paddle.sum(multiply(vec_conj, H_vec(H, vec)))
return result return result
def transfer_by_history(state, history):
r"""
It transforms the input state according to the history give.
Note:
这是内部函数,你并不需要直接调用到该函数。
"""
for history_ele in history:
if history_ele[0] != 'channel':
state = StateTransfer(state, history_ele[0], history_ele[1], params=history_ele[2])
return state
def apply_channel(func):
r"""
Decorator for channels.
Note:
这是内部函数,你并不需要直接调用到该函数。
"""
@wraps(func)
def inner(self, *args):
"""
args should include channel parameters and which_qubit
"""
which_qubit = args[-1]
assert 0 <= which_qubit < self.n, "the qubit's index should >= 0 and < n(the number of qubit)"
self._UAnsatz__has_channel = True
ops = func(self, *args)
self._UAnsatz__history.append(['channel', ops, [which_qubit]])
return inner
...@@ -136,7 +136,7 @@ class LoccAnsatz(UAnsatz): ...@@ -136,7 +136,7 @@ class LoccAnsatz(UAnsatz):
status (LoccStatus or list): 作为LOCC下的量子电路的输入的 LOCC 态节点,其类型应该为 ``LoccStatus`` 或由其组成的 ``list`` status (LoccStatus or list): 作为LOCC下的量子电路的输入的 LOCC 态节点,其类型应该为 ``LoccStatus`` 或由其组成的 ``list``
Returns: Returns:
LoccStatus or list: 量子线路运行后得到的 LOCC 态节点,类型为 ``LoccStatus`` 或由其组成的 ``list`` LoccStatus or list: 量子路运行后得到的 LOCC 态节点,类型为 ``LoccStatus`` 或由其组成的 ``list``
""" """
if isinstance(status, LoccStatus): if isinstance(status, LoccStatus):
assert int(log2(sqrt(status.state.numpy().size))) == self.n, "the length of qubits should be same" assert int(log2(sqrt(status.state.numpy().size))) == self.n, "the length of qubits should be same"
...@@ -262,11 +262,34 @@ class LoccAnsatz(UAnsatz): ...@@ -262,11 +262,34 @@ class LoccAnsatz(UAnsatz):
theta (Tensor): 旋转角度 :math:`\theta` 。 theta (Tensor): 旋转角度 :math:`\theta` 。
phi (Tensor): 旋转角度 :math:`\phi` 。 phi (Tensor): 旋转角度 :math:`\phi` 。
lam (Tensor): 旋转角度 :math:`\lambda` 。 lam (Tensor): 旋转角度 :math:`\lambda` 。
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该量子线路的量子比特数 which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该量子路的量子比特数
""" """
which_qubit = self.party[which_qubit] which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).u3(theta, phi, lam, which_qubit) super(LoccAnsatz, self).u3(theta, phi, lam, which_qubit)
def universal_2_qubit_gate(self, theta, which_qubits):
r"""添加 2-qubit 通用门,这个通用门需要 15 个参数。
Args:
theta (Tensor): 2-qubit 通用门的参数,其维度为 ``(15, )``
which_qubits(list): 作用的量子比特编号
"""
super(LoccAnsatz, self).universal_2_qubit_gate(theta, which_qubits)
def universal_3_qubit_gate(self, theta, which_qubits):
r"""添加 3-qubit 通用门,这个通用门需要 81 个参数。
Note:
参考: https://cds.cern.ch/record/708846/files/0401178.pdf
Args:
theta (Tensor): 3-qubit 通用门的参数,其维度为 ``(81, )``
which_qubits(list): 作用的量子比特编号
"""
super(LoccAnsatz, self).universal_3_qubit_gate(theta, which_qubits)
def superposition_layer(self): def superposition_layer(self):
r"""添加一层 Hadamard 门。 r"""添加一层 Hadamard 门。
""" """
...@@ -280,7 +303,37 @@ class LoccAnsatz(UAnsatz): ...@@ -280,7 +303,37 @@ class LoccAnsatz(UAnsatz):
for which_qubit in self.party.qubits: for which_qubit in self.party.qubits:
self.ry(_theta, which_qubit) self.ry(_theta, which_qubit)
def real_entangled_layer(self, theta, depth): def linear_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 Ry 门,Rz 门和 CNOT 门的线性纠缠层。
Attention:
``theta`` 的维度为 ``(depth, m, 2)`` ,最低维内容为对应的 ``ry`` 和 ``rz`` 的参数。
Args:
theta (Tensor): Ry 门和 Rz 门的旋转角度
depth (int): 纠缠层的深度
which_qubits(list): 作用的量子比特编号
"""
assert self.m > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'the shape of theta is not right'
assert theta.shape[2] == 2, 'the shape of theta is not right'
# assert theta.shape[1] == self.m, 'the shape of theta is not right'
assert theta.shape[0] == depth, 'the depth of theta has a mismatch'
if which_qubits is None:
which_qubits = list(range(self.m))
for repeat in range(depth):
for i, q in enumerate(which_qubits):
self.ry(theta[repeat][i][0], q)
for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i], which_qubits[i + 1]])
for i, q in enumerate(which_qubits):
self.rz(theta[repeat][i][1], q)
for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i + 1], which_qubits[i]])
def real_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的强纠缠层。 r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的强纠缠层。
Note: Note:
...@@ -297,15 +350,18 @@ class LoccAnsatz(UAnsatz): ...@@ -297,15 +350,18 @@ class LoccAnsatz(UAnsatz):
assert self.m > 1, 'you need at least 2 qubits' assert self.m > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'the shape of theta is not right' assert len(theta.shape) == 3, 'the shape of theta is not right'
assert theta.shape[2] == 1, 'the shape of theta is not right' assert theta.shape[2] == 1, 'the shape of theta is not right'
assert theta.shape[1] == len(self.party), 'the shape of theta is not right' # assert theta.shape[1] == len(self.party), 'the shape of theta is not right'
assert theta.shape[0] == depth, 'the depth of theta has a mismatch' assert theta.shape[0] == depth, 'the depth of theta has a mismatch'
if which_qubits is None:
which_qubits = list(range(self.m))
for repeat in range(depth): for repeat in range(depth):
for i in range(self.party.qubits): for i, q in enumerate(which_qubits):
self.ry(theta=theta[repeat][i][0], which_qubit=i) self.ry(theta[repeat][i][0], q)
for idx in range(0, self.m - 1): for i in range(len(which_qubits) - 1):
self.cnot(control=[idx, idx + 1]) self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([len(self.party) - 1, 0]) self.cnot([which_qubits[-1], which_qubits[0]])
def complex_entangled_layer(self, theta, depth, which_qubits=None): def complex_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 U3 门和 CNOT 门的强纠缠层。 r"""添加 ``depth`` 层包含 U3 门和 CNOT 门的强纠缠层。
...@@ -321,44 +377,35 @@ class LoccAnsatz(UAnsatz): ...@@ -321,44 +377,35 @@ class LoccAnsatz(UAnsatz):
depth (int): 纠缠层的深度 depth (int): 纠缠层的深度
which_qubits(list): 作用的量子比特编号 which_qubits(list): 作用的量子比特编号
""" """
if which_qubits is None:
which_qubits = list(range(0, len(self.party)))
assert self.m > 1, 'you need at least 2 qubits' assert self.m > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'the shape of theta is not right' assert len(theta.shape) == 3, 'the shape of theta is not right'
assert theta.shape[2] == 3, 'the shape of theta is not right' assert theta.shape[2] == 3, 'the shape of theta is not right'
# assert theta.shape[1] == self.m, 'the shape of theta is not right' # assert theta.shape[1] == self.m, 'the shape of theta is not right'
assert theta.shape[0] == depth, 'the depth of theta has a mismatch' assert theta.shape[0] == depth, 'the depth of theta has a mismatch'
if which_qubits is None:
which_qubits = list(range(self.m))
for repeat in range(depth): for repeat in range(depth):
for i, q in enumerate(which_qubits): for i, q in enumerate(which_qubits):
self.u3(theta[repeat][i][0], theta[repeat][i][1], theta[repeat][i][2], q) self.u3(theta[repeat][i][0], theta[repeat][i][1], theta[repeat][i][2], q)
for i in range(self.m - 1): for i in range(len(which_qubits) - 1):
self.cnot([which_qubits[i], which_qubits[i + 1]]) self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([which_qubits[-1], which_qubits[0]]) self.cnot([which_qubits[-1], which_qubits[0]])
def universal_2_qubit_gate(self, theta, which_qubits): def real_block_layer(self, theta, depth):
r"""添加 2-qubit 通用门,这个通用门需要 15 个参数。 r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的弱纠缠层。
Args:
theta (Tensor): 2-qubit 通用门的参数,其维度为 ``(15, )``
which_qubits(list): 作用的量子比特编号
"""
super(LoccAnsatz, self).universal_2_qubit_gate(theta, which_qubits)
def universal_3_qubit_gate(self, theta, which_qubits):
r"""添加 3-qubit 通用门,这个通用门需要 81 个参数。
Note:
参考: https://cds.cern.ch/record/708846/files/0401178.pdf
Note:
这一层量子门的数学表示形式为实数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, m-1, 4)`` 。
Args: Args:
theta (Tensor): 3-qubit 通用门的参数,其维度为 ``(81, )`` theta(Tensor): Ry 门的旋转角度
which_qubits(list): 作用的量子比特编号 depth(int): 纠缠层的深度
""" """
super(LoccAnsatz, self).universal_3_qubit_gate(theta, which_qubits)
def real_block_layer(self, theta, depth):
assert self.m > 1, 'you need at least 2 qubits' assert self.m > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'The dimension of theta is not right' assert len(theta.shape) == 3, 'The dimension of theta is not right'
_depth, _number, block = theta.shape _depth, _number, block = theta.shape
...@@ -376,6 +423,18 @@ class LoccAnsatz(UAnsatz): ...@@ -376,6 +423,18 @@ class LoccAnsatz(UAnsatz):
self.__add_real_layer(theta[i][int((self.m - 1) / 2):], [1, self.m - 1]) self.__add_real_layer(theta[i][int((self.m - 1) / 2):], [1, self.m - 1])
def complex_block_layer(self, theta, depth): def complex_block_layer(self, theta, depth):
r"""添加 ``depth`` 层包含 U3 门和 CNOT 门的弱纠缠层。
Note:
这一层量子门的数学表示形式为复数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, m-1, 12)`` 。
Args:
theta (Tensor): U3 门的角度信息
depth (int): 纠缠层的深度
"""
assert self.m > 1, 'you need at least 2 qubits' assert self.m > 1, 'you need at least 2 qubits'
assert len(theta.shape) == 3, 'The dimension of theta is not right' assert len(theta.shape) == 3, 'The dimension of theta is not right'
assert depth > 0, 'depth must be greater than zero' assert depth > 0, 'depth must be greater than zero'
...@@ -450,6 +509,154 @@ class LoccAnsatz(UAnsatz): ...@@ -450,6 +509,154 @@ class LoccAnsatz(UAnsatz):
for i in range(position[0], position[1], 2): for i in range(position[0], position[1], 2):
self.__add_complex_block(theta[int((i - position[0]) / 2)], [i, i + 1]) self.__add_complex_block(theta[int((i - position[0]) / 2)], [i, i + 1])
def amplitude_damping(self, gamma, which_qubit):
r"""添加振幅阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \begin{bmatrix} 0 & \sqrt{\gamma} \\ 0 & 0 \end{bmatrix}.
Args:
gamma (float): 减振概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).amplitude_damping(gamma, which_qubit)
def generalized_amplitude_damping(self, gamma, p, which_qubit):
r"""添加广义振幅阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt(p) \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \sqrt(p) \begin{bmatrix} 0 & \sqrt{\gamma} \\ 0 & 0 \end{bmatrix},\\
E_2 = \sqrt(1-p) \begin{bmatrix} \sqrt{1-\gamma} & 0 \\ 0 & 1 \end{bmatrix},
E_3 = \sqrt(1-p) \begin{bmatrix} 0 & 0 \\ \sqrt{\gamma} & 0 \end{bmatrix}.
Args:
gamma (float): 减振概率,其值应该在 :math:`[0, 1]` 区间内
p (float): 激发概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).generalized_amplitude_damping(gamma, p, which_qubit)
def phase_damping(self, gamma, which_qubit):
r"""添加相位阻尼信道。
其 Kraus 算符为:
.. math::
E_0 = \begin{bmatrix} 1 & 0 \\ 0 & \sqrt{1-\gamma} \end{bmatrix},
E_1 = \begin{bmatrix} 0 & 0 \\ 0 & \sqrt{\gamma} \end{bmatrix}.
Args:
gamma (float): phase damping 信道的参数,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).phase_damping(gamma, which_qubit)
def bit_flip(self, p, which_qubit):
r"""添加比特反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1-p} I,
E_1 = \sqrt{p} X.
Args:
p (float): 发生 bit flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).bit_flip(p, which_qubit)
def phase_flip(self, p, which_qubit):
r"""添加相位反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1 - p} I,
E_1 = \sqrt{p} Z.
Args:
p (float): 发生 phase flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).phase_flip(p, which_qubit)
def bit_phase_flip(self, p, which_qubit):
r"""添加比特相位反转信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1 - p} I,
E_1 = \sqrt{p} Y.
Args:
p (float): 发生 bit phase flip 的概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).bit_phase_flip(p, which_qubit)
def depolarizing(self, p, which_qubit):
r"""添加去极化信道。
其 Kraus 算符为:
.. math::
E_0 = \sqrt{1-p} I,
E_1 = \sqrt{p/3} X,
E_2 = \sqrt{p/3} Y,
E_3 = \sqrt{p/3} Z.
Args:
p (float): depolarizing 信道的参数,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).depolarizing(p, which_qubit)
def pauli_channel(self, p_x, p_y, p_z, which_qubit):
r"""添加泡利信道。
Args:
p_x (float): 泡利矩阵 X 的对应概率,其值应该在 :math:`[0, 1]` 区间内
p_y (float): 泡利矩阵 Y 的对应概率,其值应该在 :math:`[0, 1]` 区间内
p_z (float): 泡利矩阵 Z 的对应概率,其值应该在 :math:`[0, 1]` 区间内
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
Note:
三个输入的概率加起来需要小于等于 1。
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).pauli_channel(p_x, p_y, p_z, which_qubit)
def customized_channel(self, ops, which_qubit):
r"""添加自定义的量子信道。
Args:
ops (list): 表示信道的 Kraus 算符的列表
which_qubit (int): 该信道作用在的 qubit 的编号,其值应该在 :math:`[0, m)` 范围内, :math:`m` 为该参与方的量子比特数
"""
which_qubit = self.party[which_qubit]
super(LoccAnsatz, self).customized_channel(ops, which_qubit)
class LoccNet(paddle.nn.Layer): class LoccNet(paddle.nn.Layer):
r"""用于设计我们的 LOCC 下的 protocol,并进行验证或者训练。 r"""用于设计我们的 LOCC 下的 protocol,并进行验证或者训练。
......
...@@ -24,6 +24,7 @@ __all__ = [ ...@@ -24,6 +24,7 @@ __all__ = [
"vec", "vec",
"vec_random", "vec_random",
"w_state", "w_state",
"GHZ_state",
"density_op", "density_op",
"density_op_random", "density_op_random",
"completely_mixed_computational", "completely_mixed_computational",
...@@ -57,7 +58,7 @@ def vec(n): ...@@ -57,7 +58,7 @@ def vec(n):
[[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]] [[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]
""" """
assert n > 0, 'qubit number must be larger than 1' assert n > 0, 'qubit number must be larger than 1'
state = concatenate(([[1.0]], np_zeros([1, 2**n - 1])), axis=1) state = concatenate(([[1.0]], np_zeros([1, (2 ** n) - 1])), axis=1)
return state.astype("complex128") return state.astype("complex128")
...@@ -75,11 +76,11 @@ def vec_random(n, real_or_complex=2): ...@@ -75,11 +76,11 @@ def vec_random(n, real_or_complex=2):
assert real_or_complex == 1 or real_or_complex == 2, 'real_or_complex must be 1 or 2' assert real_or_complex == 1 or real_or_complex == 2, 'real_or_complex must be 1 or 2'
# real # real
if real_or_complex == 1: if real_or_complex == 1:
psi = np_random.randn(1, 2**n) psi = np_random.randn(1, 2 ** n)
# complex # complex
else: else:
psi = np_random.randn(1, 2**n) + 1j * np_random.randn(1, 2**n) psi = np_random.randn(1, 2 ** n) + 1j * np_random.randn(1, 2 ** n)
psi = psi/np.linalg.norm(psi) psi = psi / np.linalg.norm(psi)
return psi.astype("complex128") return psi.astype("complex128")
...@@ -109,16 +110,46 @@ def w_state(n, coeff=None): ...@@ -109,16 +110,46 @@ def w_state(n, coeff=None):
""" """
assert n > 0, 'qubit number must be larger than 1' assert n > 0, 'qubit number must be larger than 1'
c = coeff if coeff is not None else np.ones((1, 2**n))/np.sqrt(n) c = coeff if coeff is not None else np.ones((1, 2 ** n)) / np.sqrt(n)
assert c.shape[0] == 1 and c.shape[1] == 2**n, 'The dimension of coeff is not right' assert c.shape[0] == 1 and c.shape[1] == 2 ** n, 'The dimension of coeff is not right'
state = np_zeros((1, 2**n)) state = np_zeros((1, 2 ** n))
for i in range(n): for i in range(n):
state[0][2**i] = c[0][n-i-1] state[0][2 ** i] = c[0][n - i - 1]
return state.astype("complex128") return state.astype("complex128")
def GHZ_state(n):
r"""生成一个 GHZ-state 的 numpy 形式。
Args:
n (int): 量子比特数量
Returns:
numpy.ndarray: 一个形状为 ``(1, 2**n)`` 的 numpy 数组
代码示例:
.. code-block:: python
from paddle_quantum.state import GHZ_state
vector = GHZ_state(3)
print(vector)
::
[[0.70710678+0.j 0. +0.j 0. +0.j 0. +0.j
0. +0.j 0. +0.j 0. +0.j 0.70710678+0.j]]
"""
assert n > 2, 'qubit number must be larger than 2'
state = np_zeros((1, 2 ** n))
state[0][0] = 1 / np.sqrt(2)
state[0][-1] = 1 / np.sqrt(2)
return state.astype("complex128")
def density_op(n): def density_op(n):
r"""生成密度矩阵 :math:`|00..0\rangle \langle00..0|` 的 numpy 形式。 r"""生成密度矩阵 :math:`|00..0\rangle \langle00..0|` 的 numpy 形式。
...@@ -145,7 +176,7 @@ def density_op(n): ...@@ -145,7 +176,7 @@ def density_op(n):
""" """
assert n > 0, 'qubit number must be positive' assert n > 0, 'qubit number must be positive'
rho = np_zeros((2**n, 2**n)) rho = np_zeros((2 ** n, 2 ** n))
rho[0, 0] = 1 rho[0, 0] = 1
return rho.astype("complex128") return rho.astype("complex128")
...@@ -163,17 +194,17 @@ def density_op_random(n, real_or_complex=2, rank=None): ...@@ -163,17 +194,17 @@ def density_op_random(n, real_or_complex=2, rank=None):
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组 numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
""" """
assert n > 0, 'qubit number must be positive' assert n > 0, 'qubit number must be positive'
rank = rank if rank is not None else 2**n rank = rank if rank is not None else 2 ** n
assert 0 < rank <= 2**n, 'rank is an invalid number' assert 0 < rank <= 2 ** n, 'rank is an invalid number'
if real_or_complex == 1: if real_or_complex == 1:
psi = np_random.randn(2**n, rank) psi = np_random.randn(2 ** n, rank)
else: else:
psi = np_random.randn(2**n, rank) + 1j*np_random.randn(2**n, rank) psi = np_random.randn(2 ** n, rank) + 1j * np_random.randn(2 ** n, rank)
psi_dagger = psi.conj().T psi_dagger = psi.conj().T
rho = np_matmul(psi, psi_dagger) rho = np_matmul(psi, psi_dagger)
rho = rho/np_trace(rho) rho = rho / np_trace(rho)
return rho.astype('complex128') return rho.astype('complex128')
...@@ -209,7 +240,7 @@ def completely_mixed_computational(n): ...@@ -209,7 +240,7 @@ def completely_mixed_computational(n):
[0. +0.j 0. +0.j 0. +0.j 0.25+0.j]] [0. +0.j 0. +0.j 0. +0.j 0.25+0.j]]
""" """
assert n > 0, 'qubit number must be positive' assert n > 0, 'qubit number must be positive'
rho = np_eye(2**n)/2**n rho = np_eye(2 ** n) / (2 ** n)
return rho.astype('complex128') return rho.astype('complex128')
...@@ -225,7 +256,7 @@ def bell_state(n): ...@@ -225,7 +256,7 @@ def bell_state(n):
Args: Args:
n (int): 量子比特数量必须为大于等于 2 的偶数 n (int): 量子比特数量必须为大于等于 2 的偶数
Returns: Returns:
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组 numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
...@@ -248,8 +279,8 @@ def bell_state(n): ...@@ -248,8 +279,8 @@ def bell_state(n):
assert n > 0, "Qubit number must be positive" assert n > 0, "Qubit number must be positive"
assert n % 2 == 0, "Qubit number must be even" assert n % 2 == 0, "Qubit number must be even"
dim = 2**n dim = 2 ** n
local_dim = 2**int(n/2) local_dim = 2 ** int(n / 2)
coeff = 1 / local_dim coeff = 1 / local_dim
state = np.zeros((dim, dim)) state = np.zeros((dim, dim))
for i in range(0, dim, local_dim + 1): for i in range(0, dim, local_dim + 1):
...@@ -309,7 +340,7 @@ def bell_diagonal_state(p1, p2, p3, p4): ...@@ -309,7 +340,7 @@ def bell_diagonal_state(p1, p2, p3, p4):
psi_m_vec = np.array([[0, coeff, -coeff, 0]]) psi_m_vec = np.array([[0, coeff, -coeff, 0]])
psi_m_mat = np.matmul(psi_m_vec.T, psi_m_vec) psi_m_mat = np.matmul(psi_m_vec.T, psi_m_vec)
state = p1*phi_p_mat + p2*psi_p_mat + p3*phi_m_mat + p4*psi_m_mat state = p1 * phi_p_mat + p2 * psi_p_mat + p3 * phi_m_mat + p4 * psi_m_mat
return state.astype("complex128") return state.astype("complex128")
...@@ -324,7 +355,7 @@ def R_state(p): ...@@ -324,7 +355,7 @@ def R_state(p):
p|\Psi^{+}\rangle\langle\Psi^{+}| + (1 - p)|11\rangle\langle11| p|\Psi^{+}\rangle\langle\Psi^{+}| + (1 - p)|11\rangle\langle11|
Args: Args:
p (float): 控制生成 R-state 的参数属于 :math:`[0, 1]` 区间内 p (float): 控制生成 R-state 的参数属于 :math:`[0, 1]` 区间内
Returns: Returns:
numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组 numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组
...@@ -352,7 +383,7 @@ def R_state(p): ...@@ -352,7 +383,7 @@ def R_state(p):
state_11 = np.zeros((4, 4)) state_11 = np.zeros((4, 4))
state_11[3, 3] = 1 state_11[3, 3] = 1
state = p*psi_p_mat + (1-p)*state_11 state = p * psi_p_mat + (1 - p) * state_11
return state.astype("complex128") return state.astype("complex128")
...@@ -367,7 +398,7 @@ def S_state(p): ...@@ -367,7 +398,7 @@ def S_state(p):
p|\Phi^{+}\rangle\langle\Phi^{+}| + (1 - p)|00\rangle\langle00| p|\Phi^{+}\rangle\langle\Phi^{+}| + (1 - p)|00\rangle\langle00|
Args: Args:
p (float): 控制生成 S-state 的参数属于 :math:`[0, 1]` 区间内 p (float): 控制生成 S-state 的参数属于 :math:`[0, 1]` 区间内
Returns: Returns:
numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组 numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组
...@@ -393,7 +424,7 @@ def S_state(p): ...@@ -393,7 +424,7 @@ def S_state(p):
psi0 = np.zeros_like(phi_p) psi0 = np.zeros_like(phi_p)
psi0[0, 0] = 1 psi0[0, 0] = 1
state = p * phi_p + (1-p) * psi0 state = p * phi_p + (1 - p) * psi0
return state.astype("complex128") return state.astype("complex128")
...@@ -407,8 +438,8 @@ def isotropic_state(n, p): ...@@ -407,8 +438,8 @@ def isotropic_state(n, p):
p(\frac{1}{\sqrt{D}} \sum_{j=0}^{D-1}|j\rangle_{A}|j\rangle_{B}) + (1 - p)\frac{I}{2^n} p(\frac{1}{\sqrt{D}} \sum_{j=0}^{D-1}|j\rangle_{A}|j\rangle_{B}) + (1 - p)\frac{I}{2^n}
Args: Args:
n (int): 量子比特数量 n (int): 量子比特数量
p (float): 控制生成 isotropic state 的参数属于 :math:`[0, 1]` 区间内 p (float): 控制生成 isotropic state 的参数属于 :math:`[0, 1]` 区间内
Returns: Returns:
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组 numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
...@@ -430,7 +461,7 @@ def isotropic_state(n, p): ...@@ -430,7 +461,7 @@ def isotropic_state(n, p):
""" """
assert 0 <= p <= 1, "Probability must be in [0, 1]" assert 0 <= p <= 1, "Probability must be in [0, 1]"
dim = 2**n dim = 2 ** n
state = p*bell_state(n) + (1-p)*np.eye(dim)/dim state = p * bell_state(n) + (1 - p) * np.eye(dim) / dim
return state return state
...@@ -23,15 +23,17 @@ with open("README.md", "r", encoding="utf-8") as fh: ...@@ -23,15 +23,17 @@ with open("README.md", "r", encoding="utf-8") as fh:
setuptools.setup( setuptools.setup(
name='paddle-quantum', name='paddle-quantum',
version='2.0.0', version='2.0.1',
author='Institute for Quantum Computing, Baidu INC.', author='Institute for Quantum Computing, Baidu INC.',
author_email='quantum@baidu.com', author_email='quantum@baidu.com',
description='Paddle Quantum is a quantum machine learning (QML) toolkit developed based on Baidu PaddlePaddle.', description='Paddle Quantum is a quantum machine learning (QML) toolkit developed based on Baidu PaddlePaddle.',
long_description=long_description, long_description=long_description,
long_description_content_type="text/markdown", long_description_content_type="text/markdown",
url='http://qml.baidu.com', url='http://qml.baidu.com',
packages=['paddle_quantum', 'paddle_quantum.GIBBS', 'paddle_quantum.QAOA', 'paddle_quantum.SSVQE', 'paddle_quantum.VQE', 'paddle_quantum.VQSD', packages=['paddle_quantum', 'paddle_quantum.GIBBS', 'paddle_quantum.QAOA', 'paddle_quantum.SSVQE',
'paddle_quantum.GIBBS.example', 'paddle_quantum.QAOA.example', 'paddle_quantum.SSVQE.example', 'paddle_quantum.VQE.example', 'paddle_quantum.VQSD.example'], 'paddle_quantum.VQE', 'paddle_quantum.VQSD', 'paddle_quantum.GIBBS.example',
'paddle_quantum.QAOA.example', 'paddle_quantum.SSVQE.example', 'paddle_quantum.VQE.example',
'paddle_quantum.VQSD.example'],
install_requires=['paddlepaddle>=2.0.1', 'scipy', 'networkx', 'matplotlib', 'interval', 'tqdm'], install_requires=['paddlepaddle>=2.0.1', 'scipy', 'networkx', 'matplotlib', 'interval', 'tqdm'],
python_requires='>=3.6, <4', python_requires='>=3.6, <4',
classifiers=[ classifiers=[
......
{
"cells": [
{
"cell_type": "markdown",
"id": "7cebc922",
"metadata": {},
"source": [
"# 在 Paddle Quantum 中模拟含噪量子电路\n",
"\n",
"<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
]
},
{
"cell_type": "markdown",
"id": "c2cf6d87",
"metadata": {},
"source": [
"## 噪声简介\n",
"\n",
"在理想模型中,我们通常假设量子电路是在一个**封闭系统**中执行的。然而在真实的量子设备中,系统会通过和环境的相互作用产生**非相干噪声(incoherent noise)**。在近期的量子设备上,噪声的影响是难以忽略的。因此,如何设计在噪声影响下依然鲁棒(robust)的量子算法对于量子计算的实用化来说是至关重要的。利用 Paddle Quantum 中的噪声模块,我们现在可以在设计并模拟量子算法的同时研究噪声对其的影响,从而进一步的探索对应的错误缓释(error mitigation)方案。\n",
"\n",
"## Paddle Quantum 中的噪声建模\n",
"\n",
"### 噪声模型与量子信道\n",
"\n",
"对于一个封闭的量子系统,其演化总是幺正(unitary)的。数学上,我们通常用酉变换的语言来描述一个参数化量子电路 $U(\\vec{\\theta})$ 的作用, \n",
"\n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}) \\rho U^\\dagger(\\vec{\\theta}),\n",
"\\tag{1}\n",
"$$\n",
"\n",
"其中 $\\rho$ 表示初始量子态, $\\vec{\\theta}$ 表示电路的参数向量。那么最简单的一类噪声模型,是我们在控制量子系统执行具体逻辑门的时候参数的噪声化,\n",
"\n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}+\\vec{\\epsilon}) \\rho U^\\dagger(\\vec{\\theta}+\\vec{\\epsilon}),\n",
"\\tag{2}\n",
"$$\n",
"\n",
"其中 $\\vec{\\epsilon}$ 可以是从高斯分布中采样出的白噪声。这样的噪声被称为**相干噪声(coherent noise)**,通常是由于硬件系统没有校准或者量子控制层面的误差。在某些特定情况下,相干噪声会比非相干噪声更具有破坏性 [1]。此外,值得注意的是相干噪声的建模也是用酉变换的语言 $U(\\vec{\\epsilon})$ 来描述的。\n",
"\n",
"相比于相干噪声,人们更为关注的问题是**开放系统**中的产生的非相干噪声,这样一个系统的演化往往是非幺正(non-unitary)的。这种情况下,我们需要通过一个更广义的映射来描述系统的演化,即 $\\rho \\longrightarrow \\mathcal{E}(\\rho)$,这种映射也被称之为一个**量子信道(quantum channel)**。为了方便讨论,我们这里采用 *operator-sum representation* [2] 将一个量子信道表示为\n",
"\n",
"$$\n",
"\\mathcal{E}(\\rho) = \\sum_{k=0}^{m-1} E_k \\rho E_k^{\\dagger},\n",
"\\tag{3}\n",
"$$\n",
"\n",
"其中 $\\{E_k\\}$ 被称为 *Kraus* 算符,同时还满足完备性条件 $\\sum_k E_k^\\dagger E_k = I$。注意到,量子信道数学上是 completely positive 和 trace-preserving 的。\n",
"\n",
"\n",
"利用这种表示方法,我们可以直观的理解非相干噪声是如何影响量子态的:对于一个一开始处于纯态 $\\rho = |\\psi\\rangle\\langle \\psi|$ 的量子系统,经过一个噪声量子信道(例如 $m = 2$ )时,我们将得到一个混态 $\\mathcal{E}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger$。以简单的单个量子比特上的比特反转(bit flip)噪声为例,其表达形式为\n",
"\n",
"$$\n",
"\\mathcal{E}_{BF}(\\rho) = (1 - p) I \\rho I+ p X \\rho X,\n",
"\\tag{4}\n",
"$$\n",
"\n",
"其中 $X,I$ 是泡利矩阵。 对应的 *Kruas* 算符为:\n",
"\n",
"$$\n",
"E_0 = \\sqrt{1-p}\n",
"\\begin{bmatrix}\n",
"1 &0 \\\\\n",
"0& 1 \n",
"\\end{bmatrix},\n",
"E_1 = \\sqrt{p}\n",
"\\begin{bmatrix}\n",
"0& 1 \\\\\n",
"1&0\n",
"\\end{bmatrix}.\n",
"\\tag{5}\n",
"$$\n",
"\n",
"该信道的物理含义可以理解为存在 $p$ 的概率将 $|0\\rangle$ 态反转到 $|1\\rangle$ 态上,反之亦然。在 Paddle Quantum 中,可以通过 `UAnsatz.bit_flip(p, which_qubit)` 来添加该信道,其中 `p` 代表噪声大小。\n",
"\n",
"**注释:** 对于一个量子信道,其 *Kraus* 算符表示未必是唯一的 [3]。"
]
},
{
"cell_type": "markdown",
"id": "aaa538b0",
"metadata": {},
"source": [
"### Paddle Quantum 中添加信道的方式\n",
"\n",
"接下来我们以比特反转信道为例,展示如何用 Paddle Quantum 中的噪声模块来实现对噪声的模拟。首先,将一个量子比特初始化为 $|0\\rangle$ 态。"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "689ef041",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:16:08.247239Z",
"start_time": "2021-04-08T05:16:08.036136Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"{'0': 1024}"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import paddle\n",
"from paddle_quantum.circuit import UAnsatz\n",
"\n",
"# 设置量子比特数\n",
"num_qubits = 1\n",
"\n",
"# 初始化量子电路\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# 制备 |0> 态\n",
"init_state = cir.run_density_matrix()\n",
"\n",
"# 进行计算基上测量,默认 shots=1024\n",
"cir.measure(plot=True)"
]
},
{
"cell_type": "markdown",
"id": "aec448b7",
"metadata": {},
"source": [
"之后,我们加上一个 $p=0.1$ 的比特反转噪声,并测量通过信道之后的量子比特。 \n",
"**注释:** 噪声信道只支持在 density matrix 模式下运行。"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "dafbad73",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:16:09.221527Z",
"start_time": "2021-04-08T05:16:08.977847Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"经过了 bit flip 信道之后的量子态是:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n"
]
}
],
"source": [
"# 噪声水平\n",
"p = 0.1\n",
"\n",
"# 添加比特反转信道\n",
"cir.bit_flip(p, 0)\n",
"\n",
"# 执行电路\n",
"# 注释:噪声信道只能在 density matrix 模式下运行\n",
"fin_state = cir.run_density_matrix()\n",
"\n",
"# 测量结果\n",
"cir.measure(plot=True)\n",
"print('经过了 bit flip 信道之后的量子态是:\\n', fin_state.numpy())"
]
},
{
"cell_type": "markdown",
"id": "ec2b613e",
"metadata": {},
"source": [
"可以看到,经过了比特反转信道(概率为 $p=0.1$)之后的量子态变成了混合态 $0.9 | 0 \\rangle \\langle 0 | + 0.1 | 1 \\rangle \\langle 1 |$。\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "fda5577a",
"metadata": {},
"source": [
"### 常用噪声信道\n",
"\n",
"除了比特反转信道之外,Paddle Quantum 也支持模拟其他常用的噪声信道。\n",
"\n",
"\n",
"- **相位反转信道(Phase Flip Channel)**\n",
"\n",
" 与比特反转信道类似,相位反转信道会以 $p$ 的概率来反转一个量子比特的相位,其表达形式为\n",
" \n",
" $$\n",
" \\mathcal{E}_{PF}(\\rho) = (1 - p) \\rho + p Z \\rho Z.\n",
" \\tag{6}\n",
" $$\n",
"\n",
"\n",
"- **比特相位反转信道(Bit-Phase Flip Channel)**\n",
"\n",
" $$\n",
" \\mathcal{E}_{BPF}(\\rho) = (1-p) \\rho + p Y \\rho Y.\n",
" \\tag{7}\n",
" $$\n",
"\n",
"\n",
"- **去极化信道 (Depolarizing Channel)**\n",
"\n",
" 通过去极化信道之后,将会有 $p$ 的概率处于最大混态 $I/2$ 和 $1-p$ 的概率维持不变。可以表示为对称地施加泡利噪声,\n",
" \n",
" $$\n",
" \\mathcal{E}_{D}(\\rho) = (1 - p) \\rho + \\frac{p}{3}\n",
" \\left( X \\rho X+ Y \\rho Y + Z \\rho Z \\right).\n",
" \\tag{8}\n",
" $$\n",
"\n",
"\n",
"- **泡利信道(Pauli Channel)**\n",
"\n",
" 该信道会以非对称的形式施加泡利噪声。表达形式为\n",
" \n",
" $$\n",
" \\mathcal{E}_{Pauli}(\\rho) = (1 - p_x - p_y - p_z) \\rho + p_x X \\rho X + p_y Y \\rho Y + p_z Z \\rho Z.\n",
" \\tag{9}\n",
" $$\n",
"\n",
"\n",
"- **振幅阻尼信道(Amplitude Damping Channel)**\n",
"\n",
" 振幅阻尼信道可以用来模拟当系统受到**能量耗散**时引入的噪声。表达形式为,\n",
" \n",
" $$\n",
" \\mathcal{E}_{AD}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger,\n",
" \\tag{10}\n",
" $$\n",
" \n",
" 其中 $\\gamma$ 表示耗散系数,\n",
" \n",
" $$\n",
" E_0 = \n",
" \\begin{bmatrix}\n",
" 1 & 0 \\\\ 0 & \\sqrt{1 - \\gamma}\n",
" \\end{bmatrix},\n",
" E_1 = \n",
" \\begin{bmatrix}\n",
" 0 & \\sqrt{\\gamma} \\\\ 0 & 0\n",
" \\end{bmatrix}.\n",
" \\tag{11}\n",
" $$ \n",
"\n",
"\n",
"- **相位阻尼信道(Phase Damping Channel)**\n",
"\n",
" 相位阻尼信道描述的是当系统没有与外界环境交换能量,却损失了**量子信息**的情况下的噪声模型。其表达形式为\n",
" \n",
" $$\n",
" \\mathcal{E}_{PD}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger,\n",
" \\tag{12}\n",
" $$\n",
" \n",
" 其中 $\\gamma$ 表示损失系数,\n",
" \n",
" $$\n",
" E_0 = \n",
" \\begin{bmatrix}\n",
" 1 & 0 \\\\ 0 & \\sqrt{1 - \\gamma}\n",
" \\end{bmatrix}, \n",
" E_1 = \n",
" \\begin{bmatrix}\n",
" 0 & 0 \\\\ 0 & \\sqrt{\\gamma}\n",
" \\end{bmatrix}.\n",
" \\tag{13}\n",
" $$\n",
"\n",
"\n",
"- **广义振幅阻尼信道(Generalized Amplitude Damping Channel)**\n",
"\n",
" 该信道描述的是系统与外界环境在**有限温度下交换能量**的噪声模型,同时也是**超导量子计算中的常见噪声** [4]。其表达形式较为复杂,感兴趣的读者可以进一步的阅读 [API 文档](https://qml.baidu.com/api/paddle_quantum.circuit.uansatz.html) 和相应的参考文献。\n",
"\n",
"\n",
"**注释:** 在 Paddle Quantum 中,我们可以通过 `UAnsatz.phase_flip()`,`UAnsatz.bit_phase_flip()`, `UAnsatz.depolarizing()`,`UAnsatz.pauli_channel()`, `UAnsatz.amplitude_damping()`,`UAnsatz.phase_damping()`以及 `UAnsatz.generalized_amplitude_damping()` 来添加上述噪声。\n",
"\n",
"**注释:** 通常会选择振幅阻尼信道和相位阻尼信道来建模实际量子设备中的噪声,因为这两种信道可以较好的描述真实量子系统中的物理过程(可以用来建模 $T_1$ 和 $T_2$ 噪声)。"
]
},
{
"cell_type": "markdown",
"id": "9c831b79",
"metadata": {},
"source": [
"### 自定义信道\n",
"\n",
"此外,我们也可以通过 `UAnsatz.customized_channel()` 来向电路中添加自定义噪声。具体的,该方法支持用自定义的 *Kraus* 算符来建模任意的噪声模型,我们自定义的方式来搭建比特反转信道为例:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a6596c31",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:17:30.681411Z",
"start_time": "2021-04-08T05:17:30.658883Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"经过了自定义信道之后的量子态是:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n",
"\n",
"经过了比特反转信道之后的量子态是:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n",
"\n",
"两个态是否相同? True\n"
]
}
],
"source": [
"import paddle\n",
"import numpy as np\n",
"from paddle_quantum.circuit import UAnsatz\n",
"\n",
"# 设置噪声参数\n",
"p = 0.1\n",
"\n",
"# 我们用自定义的 Kraus 算符来描述一个比特反转信道\n",
"# 注意 Kraus 算符的数据类型应为 complex_128\n",
"e_0 = paddle.to_tensor(np.sqrt(1 - p) * np.array([[1, 0], [0, 1]], dtype='complex128'))\n",
"e_1 = paddle.to_tensor(np.sqrt(p) * np.array([[0, 1], [1, 0]], dtype='complex128'))\n",
"Kraus_ops = [e_0, e_1]\n",
"\n",
"# 初始化量子电路\n",
"num_qubits = 1\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# 添加自定义噪声,其输入为 Kraus 算符的列表\n",
"cir.customized_channel(Kraus_ops, 0)\n",
"\n",
"# 执行电路\n",
"fin_state = cir.run_density_matrix()\n",
"\n",
"# 比较结果\n",
"cir_1 = UAnsatz(num_qubits)\n",
"cir_1.bit_flip(p, 0)\n",
"fin_state_1 = cir_1.run_density_matrix()\n",
"print('经过了自定义信道之后的量子态是:\\n', fin_state.numpy())\n",
"print('\\n经过了比特反转信道之后的量子态是:\\n', fin_state_1.numpy())\n",
"print('\\n两个态是否相同?', bool((fin_state - fin_state_1).abs().sum() < 1e-8))"
]
},
{
"cell_type": "markdown",
"id": "e9577b5e",
"metadata": {},
"source": [
"按照上述例子,用户可以通过自定义 *Kraus* 算符的方式实现特定的信道。"
]
},
{
"cell_type": "markdown",
"id": "b8adc0fc",
"metadata": {},
"source": [
"## 拓展:Paddle Quantum 模拟含噪纠缠资源\n",
"\n",
"\n",
"许多重要的量子技术,例如量子隐形传态、态转换、分布式量子计算等都需要纠缠资源的预先分配。以纠缠量子比特对为例,在理想情况下,我们希望分配的纠缠资源处于**最大纠缠态**(Maximally entangled state)。但是在实际的应用中,纠缠资源往往在制备、传输以及保存的过程中会和环境发生相互作用,从而引入噪声。下面,我们用 Paddle Quantum 中的去极化信道来模拟一个简单的场景,白噪声对贝尔态的影响:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "840210e5",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:24:35.552425Z",
"start_time": "2021-04-08T05:24:35.519733Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"初态和贝尔态之间的保真度为 1\n",
"经过了传输(去极化信道)之后的纠缠对和贝尔态的保真度为 0.81333\n",
"又经过了存储(振幅阻尼信道)之后的纠缠对和贝尔态的保真度为 0.66752\n"
]
}
],
"source": [
"import paddle\n",
"from paddle import matmul, trace\n",
"from paddle_quantum.circuit import UAnsatz\n",
"from paddle_quantum.state import bell_state\n",
"\n",
"# 噪声参数\n",
"p_trans = 0.1\n",
"p_store = 0.01\n",
"\n",
"# 创建用来模拟噪声的量子电路\n",
"num_qubits = 2\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# 这里的初态是制备好的贝尔态\n",
"init_state = paddle.to_tensor(bell_state(2))\n",
"\n",
"# 分别在两个量子比特上添加去极化信道,表示在传输过程中引入的噪声\n",
"cir.depolarizing(p_trans, 0)\n",
"cir.depolarizing(p_trans, 1)\n",
"\n",
"# 用模拟噪声的电路来演化该初态\n",
"status_mid = cir.run_density_matrix(init_state)\n",
"\n",
"# 分别在两个量子比特上添加振幅阻尼信道,表示在保存过程中引入的噪声\n",
"cir.amplitude_damping(p_store, 0)\n",
"cir.amplitude_damping(p_store, 1)\n",
"\n",
"# 用模拟噪声的电路来演化该初态\n",
"status_fin = cir.run_density_matrix(status_mid)\n",
"fidelity_mid = paddle.real(trace(matmul(init_state, status_mid)))\n",
"fidelity_fin = paddle.real(trace(matmul(init_state, status_fin)))\n",
"\n",
"print(\"初态和贝尔态之间的保真度为\", 1)\n",
"print(\"经过了传输(去极化信道)之后的纠缠对和贝尔态的保真度为 {:.5f}\".format(fidelity_mid.numpy()[0]))\n",
"print(\"又经过了存储(振幅阻尼信道)之后的纠缠对和贝尔态的保真度为 {:.5f}\".format(fidelity_fin.numpy()[0]))"
]
},
{
"cell_type": "markdown",
"id": "d6f209be",
"metadata": {},
"source": [
"**注释:** 在 [纠缠蒸馏](https://qml.baidu.com/tutorials/loccnet/entanglement-distillation-with-loccnet.html) 的教程中我们介绍了如何利用 Paddle Quantm 中的 LoccNet 模块来研究纠缠蒸馏,即利用多个含噪声的纠缠对来提取高保真度的纠缠对,感兴趣的读者可以前往阅读。"
]
},
{
"cell_type": "markdown",
"id": "ba1b1b03",
"metadata": {},
"source": [
"## 应用: Paddle Quantum 模拟含噪变分量子本征求解器(VQE)\n",
"\n",
"\n",
"变分量子本征求解器(Variational Quantum Eigensolver)[5] 可以用变分量子电路来计算某个给定哈密顿量的基态能量,关于其具体的原理和背景在之前的教程 [变分量子本征求解器](https://qml.baidu.com/tutorials/variational-quantum-eigensolver.html) 中有详细的讲解,感兴趣的读者可以前往阅读。\n",
"\n",
"在这里,我们尝试用一个简单的 VQE 电路来求解如下哈密顿量的基态能量:\n",
"\n",
"$$ \n",
"H = 0.4 \\, Z \\otimes I + 0.4 \\, I \\otimes Z + 0.2 \\, X \\otimes X. \n",
"\\tag{14}\n",
"$$\n",
"\n",
"特别地,我们将在电路中引入振幅阻尼信道来模拟电路运行时的 $T_1$ 噪声,让我们分别来看一下含噪电路和非含噪电路在该任务上的表现:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "15667852",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:34:47.301281Z",
"start_time": "2021-04-08T05:34:47.293619Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import paddle\n",
"from paddle_quantum.circuit import UAnsatz\n",
"from paddle_quantum.utils import pauli_str_to_matrix\n",
"\n",
"# 首先生成泡利字符串表示下的哈密顿量\n",
"H_info = [[0.4, 'z0'], [0.4, 'z1'], [0.2, 'x0,x1']]\n",
"\n",
"# 把记录的关于哈密顿量的信息转化为矩阵表示\n",
"H_matrix = pauli_str_to_matrix(H_info, num_qubits)\n",
"\n",
"# 超参数设置\n",
"num_qubits = 2\n",
"theta_size = 4\n",
"ITR = 100\n",
"LR = 0.4\n",
"SEED = 999 \n",
"p = 0.1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "067b17a6",
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-08T05:34:51.742273Z",
"start_time": "2021-04-08T05:34:47.726698Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"========== Training Noisy VQE ==========\n",
"iter: 0 loss: -0.0782\n",
"iter: 10 loss: -0.6395\n",
"iter: 20 loss: -0.6548\n",
"iter: 30 loss: -0.6547\n",
"iter: 40 loss: -0.6591\n",
"iter: 50 loss: -0.6608\n",
"iter: 60 loss: -0.6618\n",
"iter: 70 loss: -0.6621\n",
"iter: 80 loss: -0.6621\n",
"iter: 90 loss: -0.6621\n",
"========== Training Noise Free VQE ==========\n",
"iter: 0 loss: 0.1521\n",
"iter: 10 loss: -0.7413\n",
"iter: 20 loss: -0.8208\n",
"iter: 30 loss: -0.8170\n",
"iter: 40 loss: -0.8169\n",
"iter: 50 loss: -0.8241\n",
"iter: 60 loss: -0.8238\n",
"iter: 70 loss: -0.8245\n",
"iter: 80 loss: -0.8245\n",
"iter: 90 loss: -0.8246\n",
"\n",
"含噪电路计算得到的基态能量是: -0.6621559864367315 Ha\n",
"不含噪电路计算得到的基态能量是: -0.8246026782552648 Ha\n",
"真实的基态能量为: -0.8246211251235321 Ha\n"
]
}
],
"source": [
"class vqe_noisy(paddle.nn.Layer):\n",
" \n",
" def __init__(self, shape, dtype='float64'):\n",
" super(vqe_noisy, self).__init__()\n",
" \n",
" # 初始化一个长度为theta_size的可学习参数列表,并用[0, 2*pi]的均匀分布来填充初始值\n",
" self.theta = self.create_parameter(shape=shape, \n",
" default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n",
" dtype=dtype, is_bias=False)\n",
" \n",
" # 定义损失函数和前向传播机制\n",
" def forward(self):\n",
" \n",
" # 初始量子电路\n",
" cir = UAnsatz(num_qubits)\n",
" \n",
" # 添加参数化量子电路\n",
" cir.ry(self.theta[0], 0)\n",
" cir.ry(self.theta[1], 1)\n",
" \n",
" cir.cnot([0, 1])\n",
" \n",
" cir.ry(self.theta[2], 0)\n",
" cir.ry(self.theta[3], 1)\n",
" \n",
" # 添加振幅阻尼 AD 噪声\n",
" cir.amplitude_damping(p, 0)\n",
" cir.amplitude_damping(p, 1)\n",
" \n",
" # 运行密度矩阵模式\n",
" cir.run_density_matrix()\n",
" \n",
" # 关于观测量 H_info 的期望值\n",
" loss = cir.expecval(H_info)\n",
" \n",
" return loss\n",
" \n",
"# 创建一个不含噪声的 VQE 电路\n",
"class vqe_noise_free(paddle.nn.Layer):\n",
" \n",
" def __init__(self, shape, dtype='float64'):\n",
" super(vqe_noise_free, self).__init__()\n",
" \n",
" self.theta = self.create_parameter(shape=shape, \n",
" default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n",
" dtype=dtype, is_bias=False)\n",
" \n",
" def forward(self):\n",
" \n",
" cir = UAnsatz(num_qubits)\n",
" cir.ry(self.theta[0], 0)\n",
" cir.ry(self.theta[1], 1) \n",
" cir.cnot([0, 1])\n",
" cir.ry(self.theta[2], 0)\n",
" cir.ry(self.theta[3], 1)\n",
" cir.run_density_matrix()\n",
" loss = cir.expecval(H_info)\n",
" \n",
" return loss\n",
" \n",
"# 训练含噪 VQE 电路\n",
"print('========== Training Noisy VQE ==========')\n",
"loss_list = []\n",
"parameter_list = []\n",
"\n",
"# 定义参数维度\n",
"vqe = vqe_noisy([theta_size])\n",
"\n",
"# 一般来说,我们利用Adam优化器来获得相对好的收敛,当然你可以改成SGD或者是RMS prop.\n",
"opt = paddle.optimizer.Adam(learning_rate = LR, parameters = vqe.parameters()) \n",
"\n",
"# 优化循环\n",
"for itr in range(ITR):\n",
"\n",
" # 前向传播计算损失函数\n",
" loss = vqe()\n",
"\n",
" # 反向传播极小化损失函数\n",
" loss.backward()\n",
" opt.minimize(loss)\n",
" opt.clear_grad()\n",
"\n",
" # 记录学习曲线\n",
" loss_list.append(loss.numpy()[0])\n",
" parameter_list.append(vqe.parameters()[0].numpy())\n",
" if itr % 10 == 0:\n",
" print('iter:', itr, ' loss: %.4f' % loss.numpy())\n",
" \n",
"# 用同样的方式训练不含噪的 VQE 电路\n",
"print('========== Training Noise Free VQE ==========')\n",
"loss_list_no_noise = []\n",
"parameter_list_no_noise = []\n",
"\n",
"vqe_no_noise = vqe_noise_free([theta_size])\n",
"opt_no_noise = paddle.optimizer.Adam(learning_rate = LR, parameters = vqe_no_noise.parameters()) \n",
"\n",
"for itr in range(ITR):\n",
"\n",
" loss = vqe_no_noise()\n",
"\n",
" loss.backward()\n",
" opt_no_noise.minimize(loss)\n",
" opt_no_noise.clear_grad()\n",
"\n",
" loss_list_no_noise.append(loss.numpy()[0])\n",
" parameter_list_no_noise.append(vqe_no_noise.parameters()[0].numpy())\n",
" if itr % 10 == 0:\n",
" print('iter:', itr, ' loss: %.4f' % loss.numpy())\n",
"\n",
"\n",
"print('\\n含噪电路计算得到的基态能量是: ', loss_list[-1], \"Ha\")\n",
"print('不含噪电路计算得到的基态能量是: ', loss_list_no_noise[-1], \"Ha\")\n",
"print('真实的基态能量为: ', np.linalg.eigh(H_matrix)[0][0], \"Ha\")"
]
},
{
"cell_type": "markdown",
"id": "f8310983",
"metadata": {},
"source": [
"可以看到,含噪的变分量子本征求解器的效果要差于不含噪的版本,无法达到化学精度的要求 $\\varepsilon = 0.0016$ Ha。"
]
},
{
"cell_type": "markdown",
"id": "12608b8d",
"metadata": {},
"source": [
"## 总结\n",
"\n",
"噪声是 NISQ 时代量子设备的一个不可忽视的特征。在近期的量子技术中,我们有必要将噪声考虑进计算模型中。因此,设计对于噪声鲁棒的量子算法,乃至于设计噪声抑制方案,都是 NISQ 时代的一大重要方向。基于 Paddle Quantum 新增的噪声模块,我们希望为开发者提供贴近真实系统的近期量子计算应用的开发平台,帮助使用者一起思考如何更好地使用含噪量子设备以及如何设计出更鲁棒的量子算法,进而更好地通过近期量子设备实现人工智能、量子化学等领域的应用。\n"
]
},
{
"cell_type": "markdown",
"id": "8599bc86",
"metadata": {},
"source": [
"---\n",
"\n",
"## 参考文献\n",
"\n",
"[1] Iverson, J. K., & Preskill, J. Coherence in logical quantum channels. [New Journal of Physics, 22(7), 073066 (2020).](https://iopscience.iop.org/article/10.1088/1367-2630/ab8e5c)\n",
"\n",
"[2] Nielsen, M. A. & Chuang, I. L. Quantum computation and quantum information. Cambridge university press (2010).\n",
"\n",
"[3] Preskill, J. Quantum Information Lecture Notes. Chapter 3 (2018).\n",
"\n",
"[4] Chirolli, L., & Burkard, G. Decoherence in solid-state qubits. [Advances in Physics, 57(3), 225-285 (2008).](https://www.tandfonline.com/doi/abs/10.1080/00018730802218067)\n",
"\n",
"[5] Peruzzo, A. et al. A variational eigenvalue solver on a photonic quantum processor. [Nat. Commun. 5, 4213 (2014).](https://www.nature.com/articles/ncomms5213)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.0"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simulating noisy quantum circuits with Paddle Quantum\n",
"\n",
"<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction to quantum noises\n",
"\n",
"In ideal models, we usually assume that quantum circuits are operating on a **closed physical system**. However, real quantum devices suffer from **incoherent noises** introduced by unwanted interactions between the system and the environment. This type of noise can significantly change the performance of quantum computation tasks and hence can hardly be ignored for near-term quantum devices. Consequently, designing robust quantum algorithms under the presence of noise is crucial for utilizing quantum computation in the real world. With the noise module of Paddle Quantum, we can now not only design and simulate quantum algorithms but also examine various noises' influence and further develop error mitigation schemes.\n",
"\n",
"## Building noise models in Paddle Quantum\n",
"\n",
"### Noise model and quantum channel\n",
" \n",
"The evolution of a closed quantum system is always unitary. Mathematically, we can describe such a process as implementing a parameterized quantum circuit $U(\\vec{\\theta})$,\n",
"\n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}) \\rho U^\\dagger(\\vec{\\theta}),\n",
"\\tag{1}\n",
"$$\n",
"\n",
"where $\\rho$ is the initial quantum state, $\\vec{\\theta}$ is a vector containing all the parameters. The most intuitive type of noise one can think of is the error that appears in these parameters, \n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}+\\vec{\\epsilon}) \\rho U^\\dagger(\\vec{\\theta}+\\vec{\\epsilon}),\n",
"\\tag{2}\n",
"$$\n",
"\n",
"$\\vec{\\epsilon}$ can be a white noise sampled from Gaussian distributions. This kind of noise is a specific example of **coherent noises**. Coherent noise usually occurs due to device calibration errors or quantum control errors. We want to emphasize that one also uses unitary transformation $U(\\vec{\\epsilon})$ to describe coherent noises. In certain cases, coherent noises can be more damaging than incoherent noises [1]. \n",
"\n",
"Most of the time, the real problem lies on the evolution of an **open quantum system** that is non-unitary. Under this circumstance, we need a more general description beyond the unitary transformation to characterize incoherent noises, the language of **quantum channels**. To keep the discussion precise, we use *operator-sum representation* [2] to introduce a quantum channel as \n",
"\n",
"$$\n",
"\\mathcal{E}(\\rho) = \\sum_{k=0}^{m-1} E_k \\rho E_k^{\\dagger},\n",
"\\tag{3}\n",
"$$\n",
"\n",
"where $\\{E_k\\}$ are *Kraus* operators, and they satisfy the completeness condition $\\sum_k E_k^\\dagger E_k = I$. Mathematically, a quantum channel is completely positive and trace-preserving [2].\n",
"\n",
"Under this representation, we can explicitly observe the results of implementing a quantum channel: Suppose we start with a pure state $\\rho = |\\psi\\rangle\\langle \\psi|$, then we send it through a noisy quantum channel (e.g., $m = 2$ ). Eventually, we will get a mixed state $\\mathcal{E}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger$. Let's take the bit flip noise as an example: \n",
"\n",
"$$\n",
"\\mathcal{E}_{BF}(\\rho) = (1 - p) I \\rho I+ p X \\rho X,\n",
"\\tag{4}\n",
"$$\n",
"\n",
"where $X,I$ are Pauli operators. The corresponding *Kraus* operators are:\n",
"\n",
"$$\n",
"E_0 = \\sqrt{1-p}\n",
"\\begin{bmatrix}\n",
"1&0 \\\\\n",
"0&1\n",
"\\end{bmatrix},\n",
"E_1 = \\sqrt{p}\n",
"\\begin{bmatrix}\n",
"0& 1 \\\\\n",
"1 &0\n",
"\\end{bmatrix}.\n",
"\\tag{5}\n",
"$$\n",
"\n",
"The physical meaning of this quantum channel is there exist a probability $p$ that the state $|0\\rangle$ will flip into $|1\\rangle$, and vice versa. In Paddle Quantum, we can use this quantum channel by `UAnsatz.bit_flip(p, which_qubit)`, where `p` is the noise level.\n",
"\n",
"**Note:** For a quantum channel, the Kraus operator representation is not necessarily unique [3]."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Implementation with Paddle Quantum\n",
"\n",
"In this section, we will learn how to build a noise model in Paddle Quantum. First, we initialize a qubit to $|0\\rangle$. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T02:32:24.919291Z",
"start_time": "2021-04-09T02:32:22.237264Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"{'0': 1024}"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import paddle\n",
"from paddle_quantum.circuit import UAnsatz\n",
"\n",
"# Define the number of qubits, here we use one single qubit\n",
"num_qubits = 1\n",
"\n",
"# Initialize the quantum circuit\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# Initialize the qubit to |0><0| \n",
"init_state = cir.run_density_matrix()\n",
"\n",
"# Mesure in the computational basis \n",
"cir.measure(plot=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, we add a bit flip channel with $p=0.1$, and measure the qubit after this channel.\n",
"**Note:** Noisy module in Paddle Quantum only supports density matrix operation mode."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T02:32:25.168455Z",
"start_time": "2021-04-09T02:32:24.926709Z"
},
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Quantum state after the bit flip quantum channel:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n"
]
}
],
"source": [
"# Noise level\n",
"p = 0.1\n",
"\n",
"# Add the bit flip noisy channel\n",
"cir.bit_flip(p, 0)\n",
"\n",
"# Execute the circuit\n",
"# Note: Noisy module in Paddle Quantum only supports density matrix operation mode\n",
"fin_state = cir.run_density_matrix()\n",
"\n",
"# Measure in the computational basis\n",
"cir.measure(plot=True)\n",
"print('Quantum state after the bit flip quantum channel:\\n', fin_state.numpy())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we can see, the quantum state has been transformed to a mixed state $0.9 | 0 \\rangle \\langle 0 | + 0.1 | 1 \\rangle \\langle 1 |$ (with probability $p=0.1$ ) after the bit flip channel.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Common quantum channels\n",
"\n",
"Paddle Quantum supports many other common noisy channels.\n",
"\n",
"- **Phase Flip Channel**\n",
"\n",
" Similar to the bit-flip channel, the phase flip channel flips the phase of a qubit with probability $p$, \n",
" \n",
" $$\n",
" \\mathcal{E}_{PF}(\\rho) = (1 - p) \\rho + p Z \\rho Z.\n",
" \\tag{6}\n",
" $$\n",
"\n",
"\n",
"- **Bit-Phase Flip Channel**\n",
"\n",
" $$\n",
" \\mathcal{E}_{BPF}(\\rho) = (1-p) \\rho + p Y \\rho Y.\n",
" \\tag{7}\n",
" $$\n",
"\n",
"\n",
"- **Depolarizing Channel**\n",
"\n",
" The quantum state will be in the maximally mixed state $I/2$ with probability $p$ or in the original state with probability $1-p$ after the single qubit depolarizing channel. The depolarizing channel can also be understood as applying Pauli noises symmetrically, \n",
" \n",
" $$\n",
" \\mathcal{E}_{D}(\\rho) = (1 - p) \\rho + \\frac{p}{3}\n",
" \\left( X \\rho X+ Y \\rho Y + Z \\rho Z \\right).\n",
" \\tag{8}\n",
" $$\n",
"\n",
"\n",
"- **Pauli Channel**\n",
"\n",
" The Pauli channel applies Pauli noises asymmetrically, \n",
" \n",
" $$\n",
" \\mathcal{E}_{Pauli}(\\rho) = (1 - p_x - p_y - p_z) \\rho + p_x X \\rho X + p_y Y \\rho Y + p_z Z \\rho Z.\n",
" \\tag{9}\n",
" $$\n",
"\n",
"\n",
"- **Amplitude Damping Channel**\n",
"\n",
" The amplitude damping channel can be used to model the process of **energy dissipation**, \n",
" \n",
" $$\n",
" \\mathcal{E}_{AD}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger,\n",
" \\tag{10}\n",
" $$\n",
" \n",
" where $\\gamma$ is the damping factor,\n",
" \n",
" $$\n",
" E_0 = \n",
" \\begin{bmatrix}\n",
" 1 & 0 \\\\ 0 & \\sqrt{1 - \\gamma}\n",
" \\end{bmatrix},\n",
" E_1 = \n",
" \\begin{bmatrix}\n",
" 0 & \\sqrt{\\gamma} \\\\ 0 & 0\n",
" \\end{bmatrix}.\n",
" \\tag{11}\n",
" $$ \n",
"\n",
"\n",
"- **Phase Damping Channel**\n",
"\n",
" The phase damping channel describes the loss of **quantum information** without loss of energy, \n",
" \n",
" $$\n",
" \\mathcal{E}_{PD}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger,\n",
" \\tag{12}\n",
" $$\n",
" \n",
" where $\\gamma$ is the damping factor,\n",
" \n",
" $$\n",
" E_0 = \n",
" \\begin{bmatrix}\n",
" 1 & 0 \\\\ 0 & \\sqrt{1 - \\gamma}\n",
" \\end{bmatrix}, \n",
" E_1 = \n",
" \\begin{bmatrix}\n",
" 0 & 0 \\\\ 0 & \\sqrt{\\gamma}\n",
" \\end{bmatrix}.\n",
" \\tag{13}\n",
" $$\n",
"\n",
"\n",
"- **Generalized Amplitude Damping Channel**\n",
"\n",
" The generalized amplitude damping channel describes energy exchange between the system and the environment at **finite temperatures**. It is a common noise in superconducting quantum computations [4]. Interested readers can find more information here [API document](https://qml.baidu.com/api/paddle_quantum.circuit.uansatz.html).\n",
"\n",
"\n",
"**Note:** In Paddle Quantum, we can use these noisy channels through `UAnsatz.phase_flip()`, `UAnsatz.bit_phase_flip()`, `UAnsatz.depolarizing()`, `UAnsatz.pauli_channel()`, `UAnsatz.amplitude_damping()`, `UAnsatz.phase_damping()`, and `UAnsatz.generalized_amplitude_damping()`.\n",
"\n",
"**Note:** One usually choose the amplitude damping channel and the phase damping channel to model noises since they describe the physical process in real quantum systems (modeling $T_1$ and $T_2$ process)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Customized Channel\n",
"\n",
"One can also use `UAnsatz.customized_channel()` in Paddle Quantum to add customized noisy channels. This is accomplished through user-defined Kraus operators. Here, we provide an example to reproduce the bit flip channel using customized_channel function:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T02:54:20.758898Z",
"start_time": "2021-04-09T02:54:20.599327Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"quantum state after the customized channel:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n",
"\n",
" quantum state after the bit flip channel:\n",
" [[0.9+0.j 0. +0.j]\n",
" [0. +0.j 0.1+0.j]]\n",
"\n",
" are the two the same? True\n"
]
}
],
"source": [
"import paddle\n",
"import numpy as np\n",
"from paddle_quantum.circuit import UAnsatz\n",
"\n",
"# Noise level\n",
"p = 0.1\n",
"\n",
"# We use customized Kraus operator to represent the bit flip channel\n",
"# Note that the data type of a Kraus operator is complex_128\n",
"a_0 = paddle.to_tensor(np.sqrt(1 - p) * np.array([[1, 0], [0, 1]], dtype='complex128'))\n",
"a_1 = paddle.to_tensor(np.sqrt(p) * np.array([[0, 1], [1, 0]], dtype='complex128'))\n",
"Kraus_ops = [a_0, a_1]\n",
"\n",
"# Initialize the circuit\n",
"num_qubits = 1\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# Add customized channel, input is a list of Kraus operators\n",
"cir.customized_channel(Kraus_ops, 0)\n",
"\n",
"# Execute the circuit\n",
"fin_state = cir.run_density_matrix()\n",
"\n",
"\n",
"# Compare the results\n",
"cir_1 = UAnsatz(num_qubits)\n",
"cir_1.bit_flip(p, 0)\n",
"fin_state_1 = cir_1.run_density_matrix()\n",
"print('quantum state after the customized channel:\\n', fin_state.numpy())\n",
"print('\\n quantum state after the bit flip channel:\\n', fin_state_1.numpy())\n",
"print('\\n are the two the same?', bool((fin_state - fin_state_1).abs().sum() < 1e-8))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discussion: Simulating noisy entanglement resources with Paddle Quantum\n",
"\n",
"Many important quantum technologies require pre-shared entanglement resources, including quantum teleportation, state transformation, and distributed quantum computing. For instance, we want the allocated entanglement resources are in **maximally entangled states** under ideal circumstances. But in reality, noise always exists due to interactions between the system and the environment during preparation stage, transmission, and preservation. Here, we use the depolarized channel to simulate how a white noise could affect Bell states: "
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T02:58:30.352039Z",
"start_time": "2021-04-09T02:58:30.311223Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fidelity between the initial state and the Bell state 1\n",
"after transmission (depolarized channel), the fidelity between the entangled state and Bell state 0.81333\n",
"after preservation (amplitude damping channel), the fidelity between the entangled state and Bell state 0.66752\n"
]
}
],
"source": [
"import paddle\n",
"from paddle import matmul, trace\n",
"from paddle_quantum.circuit import UAnsatz\n",
"from paddle_quantum.state import bell_state\n",
"\n",
"# Noise level\n",
"p_trans = 0.1\n",
"p_store = 0.01\n",
"\n",
"# Initialize the circuit\n",
"num_qubits = 2\n",
"cir = UAnsatz(num_qubits)\n",
"\n",
"# The initial state is Bell state\n",
"init_state = paddle.to_tensor(bell_state(2))\n",
"\n",
"# Apply the depolarized channel to each qubit, modeling the noise introduced by transmission\n",
"cir.depolarizing(p_trans, 0)\n",
"cir.depolarizing(p_trans, 1)\n",
"\n",
"# Execute the circuit \n",
"status_mid = cir.run_density_matrix(init_state)\n",
"\n",
"# Apply the amplitude damping channel to each qubit, modeling the noise introduced by storage\n",
"cir.amplitude_damping(p_store, 0)\n",
"cir.amplitude_damping(p_store, 1)\n",
"\n",
"# Execute the circuit\n",
"status_fin = cir.run_density_matrix(status_mid)\n",
"fidelity_mid = paddle.real(trace(matmul(init_state, status_mid)))\n",
"fidelity_fin = paddle.real(trace(matmul(init_state, status_fin)))\n",
"\n",
"print(\"Fidelity between the initial state and the Bell state\", 1)\n",
"print(\"after transmission (depolarized channel), the fidelity between the entangled state and Bell state {:.5f}\".format(fidelity_mid.numpy()[0]))\n",
"print(\"after preservation (amplitude damping channel), the fidelity between the entangled state and Bell state {:.5f}\".format(fidelity_fin.numpy()[0]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Note:** Interested readers can check tutorials on the LOCCNet module of Paddle Quantum, where we discuss the concept of [entanglement distillation](https://qml.baidu.com/tutorials/loccnet/entanglement-distillation-with-loccnet.html)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Application: Simulating noisy VQE with Paddle Quantum\n",
"\n",
"\n",
"Variational Quantum Eigensolver (VQE) [5] is designed to find the ground state energy of a given molecular Hamiltonian using variational quantum circuits. Interested readers can find more details from the previous tutorial [VQE](https://qml.baidu.com/tutorials/variational-quantum-eigensolver.html).\n",
"\n",
"For illustration purposes, we use VQE to find the ground state energy for the following Hamiltonian: \n",
"\n",
"$$ \n",
"H = 0.4 \\, Z \\otimes I + 0.4 \\, I \\otimes Z + 0.2 \\, X \\otimes X. \n",
"\\tag{14}\n",
"$$\n",
"\n",
"Then, we add the amplitude damping channel and compare the performance of the noisy circuit and the noiseless circuit on this task:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T03:06:13.534545Z",
"start_time": "2021-04-09T03:06:13.523978Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import paddle\n",
"from paddle_quantum.circuit import UAnsatz\n",
"from paddle_quantum.utils import pauli_str_to_matrix\n",
"\n",
"# Construct Hamiltonian using Pauli string\n",
"H_info = [[0.4, 'z0'], [0.4, 'z1'], [0.2, 'x0,x1']]\n",
"\n",
"# Convert the Pauli string to a matrix\n",
"H_matrix = pauli_str_to_matrix(H_info, num_qubits)\n",
"\n",
"# Hyperparameters\n",
"num_qubits = 2\n",
"theta_size = 4\n",
"ITR = 100\n",
"LR = 0.4\n",
"SEED = 999 \n",
"p = 0.1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T03:06:36.986422Z",
"start_time": "2021-04-09T03:06:32.444713Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"========== Training Noisy VQE ==========\n",
"iter: 0 loss: 0.1974\n",
"iter: 10 loss: -0.6107\n",
"iter: 20 loss: -0.6515\n",
"iter: 30 loss: -0.6567\n",
"iter: 40 loss: -0.6600\n",
"iter: 50 loss: -0.6620\n",
"iter: 60 loss: -0.6618\n",
"iter: 70 loss: -0.6621\n",
"iter: 80 loss: -0.6621\n",
"iter: 90 loss: -0.6621\n",
"========== Training Noise Free VQE ==========\n",
"iter: 0 loss: -0.5251\n",
"iter: 10 loss: -0.7949\n",
"iter: 20 loss: -0.8090\n",
"iter: 30 loss: -0.8227\n",
"iter: 40 loss: -0.8241\n",
"iter: 50 loss: -0.8242\n",
"iter: 60 loss: -0.8246\n",
"iter: 70 loss: -0.8246\n",
"iter: 80 loss: -0.8246\n",
"iter: 90 loss: -0.8246\n",
"\n",
"Ground state energy from noisy circuit: -0.6621521112461377 Ha\n",
"Ground state energy from noiseless circuit: -0.8246151650552795 Ha\n",
"Actual ground state energy: -0.8246211251235321 Ha\n"
]
}
],
"source": [
"class vqe_noisy(paddle.nn.Layer):\n",
" \n",
" def __init__(self, shape, dtype='float64'):\n",
" super(vqe_noisy, self).__init__()\n",
" \n",
" # Initialize a learnable parameter list with length theta_size, initial values are sampled from uniform distribution between [0, 2*pi]\n",
" self.theta = self.create_parameter(shape=shape, \n",
" default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n",
" dtype=dtype, is_bias=False)\n",
" \n",
" # Define loss function and forward function\n",
" def forward(self):\n",
" \n",
" # Initialize circuit\n",
" cir = UAnsatz(num_qubits)\n",
" \n",
" # Add parameterized gates\n",
" cir.ry(self.theta[0], 0)\n",
" cir.ry(self.theta[1], 1)\n",
" \n",
" cir.cnot([0, 1])\n",
" \n",
" cir.ry(self.theta[2], 0)\n",
" cir.ry(self.theta[3], 1)\n",
" \n",
" # Add amplitude damping channel\n",
" cir.amplitude_damping(p, 0)\n",
" cir.amplitude_damping(p, 1)\n",
" \n",
" # Execute the circuit\n",
" cir.run_density_matrix()\n",
" \n",
" # Expectation value of Hamiltonian \n",
" loss = cir.expecval(H_info)\n",
" \n",
" return loss\n",
" \n",
"# Construct a noiseless circuit\n",
"class vqe_noise_free(paddle.nn.Layer):\n",
" \n",
" def __init__(self, shape, dtype='float64'):\n",
" super(vqe_noise_free, self).__init__()\n",
" \n",
" self.theta = self.create_parameter(shape=shape, \n",
" default_initializer=paddle.nn.initializer.Uniform(low=0., high=2*np.pi), \n",
" dtype=dtype, is_bias=False)\n",
" \n",
" def forward(self):\n",
" \n",
" cir = UAnsatz(num_qubits)\n",
" cir.ry(self.theta[0], 0)\n",
" cir.ry(self.theta[1], 1) \n",
" cir.cnot([0, 1])\n",
" cir.ry(self.theta[2], 0)\n",
" cir.ry(self.theta[3], 1)\n",
" cir.run_density_matrix()\n",
" loss = cir.expecval(H_info)\n",
" \n",
" return loss\n",
" \n",
"# Train noisy VQE circuit\n",
"print('========== Training Noisy VQE ==========')\n",
"loss_list = []\n",
"parameter_list = []\n",
"\n",
"# Define the dimension of parameters\n",
"vqe = vqe_noisy([theta_size])\n",
"\n",
"# Generally, we use Adam optimizer to get a better convergence, you can change to SVG or RMS prop.\n",
"opt = paddle.optimizer.Adam(learning_rate = LR, parameters = vqe.parameters()) \n",
"\n",
"# Optimization iteration\n",
"for itr in range(ITR):\n",
"\n",
" # Forward, to calculate loss function\n",
" loss = vqe()\n",
"\n",
" # Backpropagate to minimize the loss function\n",
" loss.backward()\n",
" opt.minimize(loss)\n",
" opt.clear_grad()\n",
"\n",
" # Record the learning curve\n",
" loss_list.append(loss.numpy()[0])\n",
" parameter_list.append(vqe.parameters()[0].numpy())\n",
" if itr % 10 == 0:\n",
" print('iter:', itr, ' loss: %.4f' % loss.numpy())\n",
" \n",
"# Train the noiseless VQE in the same way\n",
"print('========== Training Noise Free VQE ==========')\n",
"loss_list_no_noise = []\n",
"parameter_list_no_noise = []\n",
"\n",
"vqe_no_noise = vqe_noise_free([theta_size])\n",
"opt_no_noise = paddle.optimizer.Adam(learning_rate = LR, parameters = vqe_no_noise.parameters()) \n",
"\n",
"for itr in range(ITR):\n",
"\n",
" loss = vqe_no_noise()\n",
"\n",
" loss.backward()\n",
" opt_no_noise.minimize(loss)\n",
" opt_no_noise.clear_grad()\n",
"\n",
" loss_list_no_noise.append(loss.numpy()[0])\n",
" parameter_list_no_noise.append(vqe_no_noise.parameters()[0].numpy())\n",
" if itr % 10 == 0:\n",
" print('iter:', itr, ' loss: %.4f' % loss.numpy())\n",
"\n",
"\n",
"print('\\nGround state energy from noisy circuit: ', loss_list[-1], \"Ha\")\n",
"print('Ground state energy from noiseless circuit: ', loss_list_no_noise[-1], \"Ha\")\n",
"print('Actual ground state energy: ', np.linalg.eigh(H_matrix)[0][0], \"Ha\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we can see, noisy VQE behaves much worse than the noiseless version as expected and couldn't satisfy chemical accuracy $\\varepsilon = 0.0016$ Ha."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion\n",
"\n",
"Noise is an unavoidable feature of quantum devices in the NISQ era. Therefore, designing robust quantum algorithms under the presence of noise and further developing error mitigation schemes are two important research directions. With the noise module in Paddle Quantum, we hope to provide a platform simulating real physical systems and help developing near-term quantum computation applications. Standing together with the research community, the noise module will help us explore what we can achieve with noisy devices, design more robust quantum algorithms, and eventually leads to trustworthy quantum solutions in areas including AI and quantum chemistry.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## References\n",
"\n",
"[1] Iverson, J. K., & Preskill, J. Coherence in logical quantum channels. [New Journal of Physics, 22(7), 073066 (2020).](https://iopscience.iop.org/article/10.1088/1367-2630/ab8e5c)\n",
"\n",
"[2] Nielsen, M. A. & Chuang, I. L. Quantum computation and quantum information. Cambridge university press (2010).\n",
"\n",
"[3] Preskill, J. Quantum Information Lecture Notes. Chapter 3 (2018).\n",
"\n",
"[4] Chirolli, L., & Burkard, G. Decoherence in solid-state qubits. [Advances in Physics, 57(3), 225-285 (2008).](https://www.tandfonline.com/doi/abs/10.1080/00018730802218067)\n",
"\n",
"[5] Peruzzo, A. et al. A variational eigenvalue solver on a photonic quantum processor. [Nat. Commun. 5, 4213 (2014).](https://www.nature.com/articles/ncomms5213)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.10"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}
...@@ -215,7 +215,7 @@ ...@@ -215,7 +215,7 @@
}, },
{ {
"data": { "data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAApn0lEQVR4nO2df6xexXnnP4+vYydu1Ma89mYdwNeQZZuQ3QrCVZSkUpqkJCHuClOVtiSG3qRUXm6b7kpRqxhZ6kZsrdL+Q6gSRCxKcLlXCQlVFLclYoGEXWk3kFx2AfNDxsYJYErCxQ6RIigJZvaPc974+PX5/XPOe74fafSeM+fX886ZM8/MPM/MmHMOIYQQw2VV1wIIIYToFikCIYQYOFIEQggxcKQIhBBi4EgRCCHEwFndtQBl2LBhg9uyZUvXYgghRK944IEHXnDObZyM76Ui2LJlC8vLy12LIYQQvcLMnoqLV9eQEEIMHCkCIYQYOFIEQggxcKQIhBBi4EgRCCHEwKlFEZjZzWb2vJk9knDczOxvzeyQmT1sZu+MHJs3s4NhmK9DHiHKsLQEW7bAqlXB79JS1xL5ic/p5JNsPsmSiXOucgDeB7wTeCTh+Fbgm4AB7wbuD+NPAw6Hv+vD7fVZz7vgggtcn1lcdG521jmz4HdxsWuJxOKic+vWOQcnwrp1ejeTNJVOdXwTPr1Dn2SJAiy7uDI6LrJMALakKIIvAh+L7B8ANgEfA76YdF5S6LMiiMsgZs4tLHQtWbP4rvxmZ09+J+MwO9u1ZH7RRDrVVWj69A59kiVKkiJoy0ZwOvBMZP9IGJcUfwpmtsPMls1seWVlpTFBm2bXLnjppZPjnIMbb6y/6ehL03RpCXbsgKeeCv7rU08F+z41lZ9+ulj8UHkqdjhStXSK+yZeeimIL4JP79AnWfLQG2Oxc26Pc27OOTe3ceMpI6R7Q9KH5FzxjJ+GT4VvXR96k2zeXCy+SXxR4JMsLYFZ/LEy6TT+n3UpF5/eoU+y5KEtRfAscGZk/4wwLil+akn6kKDe2oJPhW8fake7d8O6dSfHrVsXxLeJTwp8kl27ApkmMSueTtH/mUTRQrPKO6yifOOu9SU/5Sauv6hMIN1G8FucbCz+rjthLP4+gaF4fbh9Wtaz6rARdNVnHddvGNd/WFU+s/hnmNX4Z3Lia3/pJD7YMZpMq6byFBSXJel/VjWsLi46NxqduM9olH2fKjaKtGt9yE+T0KSxGPgy8Bzwc4J+/iuBq4CrwuMGfAF4EtgPzEWu/UPgUBg+med5VRVBlxb9tMw/fn4d8vlU+PrqQeEjTSlw3/JUmlKpUmiW+Z9V/pdP31keGlUEbYeqiiDp5c3MNK+9o7WVaPilX8qWr0jm6qrwTaoF+Vg78pGmChbf8pRP/zOP8k3Kv1Wu7QIpgghptZGmC83FRefWrDn5WWvWnPysumqFbWdA1fyr01Qa+panfPqfWcojTdYq13aBFEGErP7Jppt3WR9T35qbY/oqt280ocB9fDe+/M+swjrtnlWu7QIpgghxL6+O2lJd+FaLyItPBmpxMnXnKR+6O+JkKPs/0/5PVr6ucm3bSBFMsLgY2AS6aBHkla/rD60ovtV+xMn43q1Tlwx1fzvTZEyWIoghy1bQh8LXJ3woIETz+FC4tSlDU+6lXSBFEEOarWA0quURXtFGK6OPLRlRDB+6O9qWoUq+9umbkCKIIc6DB5x73eumrwDzrWYi+svQWgRJ+FTA5yVJEfRmrqEm2L4dbr4ZRqMTcaMRfOlLwbFpwqcpJ0S/8WH6hK5l8HkqkDJYoCT6xdzcnFteXu5ajF6xalWQYScxg9dea18e0W+WloJKxNNPB3MC7d7dfuWpSxmSJsubnYUf/KAdGcpgZg845+ZOiZciGAZ9zbhC+EhfK1ZJimDQXUNp+DoVcFm6bkoLMU1UmWbax7JFiiCGNvr/imSGOjLO9u2wZ0/QAjALfvfsmT5biBBtULZi5a1tIc6C7HtoeqnKpj0SinjwyNtHiPop4/Ezec3CQvF7dO3thNxH89O0j3KRzNB1xhFi2shTuYor9OuokHU9BiNJEchYHEPThtUihqa+GqWE8JWs73vcfRN1tzaL/w6LlgldO200aiw2s4vM7ICZHTKznTHHrzOzB8PwhJm9GDl2PHJsXx3yVKVpw2oRQ1NZo5SPBikhmqJIfs9aOjVuzE1SfbnocqveOm3ENROKBGCGYOWxs4E1wEPAuSnn/ylwc2T/p0Wf2XTXkHPNjhps2kYgu4IYEkXze1Z3a571Sqp00XY5IpmmbATAe4A7I/tXA1ennP9/gA9F9r1UBE1TJDMUzTiyK4ghUTS/l11DYFJB9LFy1aQiuBS4KbJ/BfD5hHNnCdY2nonEvQosA/cBl+R55jQogibp2iAlRJuUye9plaskRTH2EoITU9j3ZY6hMUmKoO1xBJcBtzvnjkfiZl1gvPg48Dkze2vchWa2w8yWzWx5ZWWlDVl7S5XBLkL0jTL5ffv2wDj72mvBb3Q8TdKYmxtuONHHfzwswbwZB1CROhTBs8CZkf0zwrg4LgO+HI1wzj0b/h4G7gXOj7vQObfHOTfnnJvbuHFjVZmngiQDmbcGKSEaoIn8nqQoyk7e2PYA0sLENROKBGA1cBg4ixPG4nfEnPc24AeE8xuFceuBteH2BuAgKYbmcVDXUHY/Zx+nyBWiLHXk9zz3KNsN5csAUpocUAZsBZ4g8B7aFcZdA1wcOeezwLUT170X2B8qj/3AlXmeJ0UQLJwjg7AQyRR1yMhTAJdxxPBpAGmjiqDtMHRFsLgYn1lkEBYioG6X0rL3dS5/K6KN7zpJEWjSuRR8HZSV1h8pg7AQxfvy0waZRcuBXbtgfr7Y5I15jNnj0cxF71EbcdrB99DWgDJfB2WlDXjxQT4huqZoX35Si2A0ql4OxJUla9YE9x53WyV19bZlI1CLIAGfl3ZMqh2MRppWWggo7lKa5HkE1cuBSXfU0Sgo4o8eDX6feirYTqKN6eKlCBLImo+kS5Iy7fXXdyOPEL5R1KU0aezAsWPx5xctB6LuqG98I/z85/mum51tp3InRZBAWo2ia9uBFpkRIp0y30jc2IEmBmfmVSKtjv2J6y/yPXRpI6hrXnIhhP80YStMs0fEubvWOSYI2QiKkVSjuOMOf20HQoh6aaL1nda1G22RAGzYAJdf3vzSllIEMYy7fq64Iti/9dYTTUWfbQdCiPpJm5eoTDdxknKBE/fasAE++cl4I3ITFU8pggmyFpfWhG5CCKi2EP2kcoGT73X0aLpBue6K5yAVQZoWz3IbrWuCq64NzkKIatTpYh53rzRqr3jGGQ58D1WMxVnGnzwDUaoab3werCaEyEed634UWRWtSlmBFq8PyFo8uo3FpbtewFoIUZ06v+Oke00yGgVG5bLG6kYXr+8TWcbeNubyl8FZiP5TZ1kRd681a4KCf2xQXlyEF15oZrzQ4BRBlrG3jcFaMjgL0X/qLCvi7nXzzUHBH+etVDtx/UW+hyZtBHWSZEuQjUCIYeDbAlFoPYITtPFytIKYEMPGxwpfo4oAuAg4ABwCdsYc/wSwAjwYhj+KHJsnWKLyIDCf53l9WJim6ZWGhBB+U6QMaKtimKQIVlftWjKzGeALwIeAI8D3zGyfc+6xiVNvc859auLa04D/BswBDnggvPbHVeXqGhmEhRg2ecuA8cC08TiC8cA0aG8iyTqMxe8CDjnnDjvnfgZ8BdiW89qPAHc5546Fhf9dBK2L3iODsBDDJm8ZkDUwrY3Bp3UogtOBZyL7R8K4SX7HzB42s9vN7MyC12JmO8xs2cyWV1ZWahC7WdpwQxVC+EveMiBrmcyy01gUoS330X8Etjjnfo2g1r+36A2cc3ucc3POubmNGzfWLmDdaM0AIYbN9u3B+sYzM8H+zEywP1kGpLUc2lopsQ5F8CxwZmT/jDDuFzjnjjrnXgl3bwIuyHttn0mbtVAIMd0sLcHevXD8eLB//HiwP1mbT2s5tGVrrEMRfA84x8zOMrM1wGXAvugJZrYpsnsx8Hi4fSfwYTNbb2brgQ+HcUII0Wvy1ubTeg/asjVW9hpyzr1qZp8iKMBngJudc4+a2TUErkr7gP9iZhcDrwLHCNxJcc4dM7P/TqBMAK5xziWsEiqEEP0hae6guPjt2+N7DHbvPtmjCJqxNQ5u0jkhhGiD1atPdAtFmZmBV1/Nf5+lpaAV8fTTQUtg9+76J52r3CIQQghxKnFKIC0+iaTWQp0MbtI5IYRog9nZYvFdIkUghBAN0KexRFIEYrqpa1im1hYVBenTWCIpghj0zU8JdQ3LbGt4p5g6+jKWSF5DE0xOAAVBc85XTS5SqGstQa0tKqYELVWZk7aGdIsWKDIsM60ZqKlkxZQjRTCBvnkPKdtXl3dYZlbXj6aSFVOOFMEE+uY9o0r/fF63jaxmYJ/cP4QogRTBBPrmPaNKX11et42sZmDd7h/yRhAZtJ5F4pYt8z00vVSl1hP2CLP49f7M6ntGm+uK+riQrfCKJrMICUtVqkUQQ19cvgZBHX11WdWrss3AMtU2eSOIDDrJInHawffQh8XrRU1UrR7lvT6pGZgWX0auNlo4otc0mUVIaBF0XqiXCVIEA6NKX12Vbp+0wr7sfdvshhK9pMkskqQI1DUk/CGpq6VKX10Vf+C0NnrZ+8obQWTQRRaRIhB+0NQ0DlVsDGmFfdn79mkCGtEJnWSRuGZC0QBcBBwADgE7Y45/GngMeBi4B5iNHDsOPBiGfXmep66hKaSp9nAVG0OaTPL+ET2EprqGzGwG+ALwUeBc4GNmdu7Eaf8PmHPO/RpwO/A3kWMvO+fOC8PFVeURPaWpId1VqldpbfS0+9bhBK6xBqJN4rRDkQC8B7gzsn81cHXK+ecD/zuy/9Oiz1SLYArxwYgaZ5Quaqiuo6Wg1oZoCBo0Fp8OPBPZPxLGJXEl8M3I/uvNbNnM7jOzS5IuMrMd4XnLKysrlQQWHtK1ETXJRgHFDNV1OIHX6UiuloXIQ5x2KBKAS4GbIvtXAJ9POPdy4D5gbSTu9PD3bOAHwFuznqkWwZTS9pDu6PNmZuppkdThBJ50DygmS56WhYbRDwqaGkdAzq4h4ELgceDfpNzrFuDSrGdKEQyQMgVWWlfPuHBOKnDLjuKpo4sr6R5m9Y6hUBfU4GhSEawGDgNnAWuAh4B3TJxzPvAkcM5E/Ppx6wDYABwEzs16phRBDylb81xcdG40OrUwyyqw4gq5NWuce93rsgv/pAI8z3+oy0aQpKSKKJSs1okPdhnRKo0pguDebAWeCAv7XWHcNcDF4fbdwI+YcBMF3gvsD5XHfuDKPM+TIugZZQvHuOvyFlhJhVyREJWxyH+oo7uljhZKVkGv6S4GR6OKoO0gRdAz6p6OIU+BlafbJy2sWnVyAd527TnP87IUzsJC/D0WFrr5T6JzkhSBRhaL5ik7RiBuneAoaaN4q64k9NprJ++3vXRdkhfV1q2B948ZXHFF+kjsO+6Iv/c4vmtPLeENUgSiecpOxzAzk3wsq8DavTsoLKsQdddse+m6uAFr8/Owd+8JBencyddMupi2veCO6C9xzQTfg7qGekZZG0Fa102efvesbqXZ2eTuk8muJx88bPLYPaIyq+tHTIC6hkRnlK15zs4mx+eptaZdPx4gdsMNMBrFnxet7ftQe87TDRWVWV0/Ii9x2sH3oBbBQGhzUZqua/t5yGoRFFlwRwwS5DUkeknVgizv9X0oMOMU1tg7qk2Z+5BWIhYpAjFdDLUw6vp/96X1JGJJUgQWHOsXc3Nzbnl5uWsxRFeMJ4iLTsy2bp08XppmaSnwXDp+/NRjs7OBzUV4jZk94Jybm4yXsVj0jzpn5xT5GCvfOCUAzY2nEK0gRSC6p+hUyW0P7ppm8qZ9nPKN4pymue4xUgSiW8qsVdz24C6fqbLeQJG0z6Nk61pnWrRPnOHA9yBj8RRRZtBTnwyWTRp3s9Ih69lF0r7IJH4asOYtyGtIeEnZGTC79p7JQ9MKK60gz/PsImmfNRNskXcnOiNJEchrSHTLli3xk8tNgxdK0/9t1apT5xuCYOTz5s3Zzy4q39JSYCt4+ung/j/9KRw9mv960TnyGhJ+Ms3TIDRt1E6zleR5dtG037795PWbr79+et/dwJAiEN3S5Rw+TS/s3rRRO60gz/PsImkfl1Y+zL8k6iGuv6hoAC4CDgCHgJ0xx9cCt4XH7we2RI5dHcYfAD6S53l12Aj60MUsGqSNhd3bMGonyVjns/tknBep0OCaxTMES1SezYk1i8+dOOePgRvD7cuA28Ltc8Pz1xKsefwkMJP1zKqKQPlatLawe5c1jjqevbjo3MxMelqJ3pCkCCobi83sPcBnnXMfCfevDlsafxU5587wnO+Y2Wrgh8BGYGf03Oh5ac+saiyeZvukyEmaofW115RJIH4qjyjjtBK9oUlj8enAM5H9I2Fc7DnOuVeBnwCjnNcCYGY7zGzZzJZXVlYqCayBqSKzD71KJmna9tAWWaOJhziAb0rpjbHYObfHOTfnnJvbuHFjpXtpYKrI9Jgpm0nKjJT2lTSlJ++gqaIORfAscGZk/4wwLvacsGvoV4CjOa+tnWn2WPQW32rJWR4vZTPJNE2Il6T0ZmaCtAK/3qkoT5zhoEgAVgOHCYy9Y2PxOybO+RNONhZ/Ndx+Bycbiw/TgrHYOXkNtUoZw6sPL2hh4YShdGYm2M+i7EhpH0l7b/K46CU0OcUEsBV4gsDrZ1cYdw1wcbj9euBrBG6i3wXOjly7K7zuAPDRPM/TFBOeklR4F51PyIdCpqwM07ZgfNF3OjOj2pXHNKoI2g5SBB6SVnAWrSX7UJiWlcEXJdZ0ayrpnaqF4DVJikBzDYl6SHO3hGKumFmunW1QRYbJOXl2725vtG1bq7clve9JhuRu2wM015BoljR3y6KGVx/curJkSDN+T87J0+aUC0nG6ssvr9egG/dO45BPdj+Iayb4HtQ15CF5Rurm7a7wpXuliKEUnBuNuu8KyeqyqTMdo+9Uo497AbIRiEapu/D2wWuoqKHUh37xPAvINFE4+6C8RSZSBKJ5fCi82yCr1t1lLTjvAjJNPXsI77/HJCkC2QhEfXTZN94mWbaKLvvFowPlkpiZSb9H0cF/4/OvuCLYv/XW6X7/U4gUgRBFyTKUdj1XyVghJ3H8ePKxolNkTNOUGh7R9kB8KQIhspj8KiGodY9Gp57b5lwlWaVFUqsgrbVQdIqMaZpSwxM60a1x/UW+B9kIRCPE9XFnGUG76hfPu7BOUQNu2uC/uP86TVNqeEKT4ynRgDIhUkgaiPWGN/i5QHve9RKKDm5Luu9oBC+/3J/06TFNjqfUgDIxDMp2riZ1ccQVctD9QKm86yUUNeAnDf6D+PSJHo+er6l8S9PFeEopAjE9VOlcLVqwd20Qbqq0SJqe+9ix+POPHdMC9jXTyTT5cf1FvgfZCEQsVTpXk64djaoNlCpjQ8hzTdsDuHyYCHDKib720SgIdZue0IAyMfVUMVxmTSlRxiBcprBeWDj1fyRd06ahWiOHG6Wt5JUiENNP1Vpr3QVrmXUYkpSZDzVvjRxujLYaXEmKQF5Dwn/yer60NQVzXoq6f6RN7dzmFNyiddqaeb0RryEzO83M7jKzg+Hv+phzzjOz75jZo2b2sJn9fuTYLWb2fTN7MAznVZFHTCFFDMBZ6xC3TVGDbprBumvjtGiUrmder+o1tBO4xzl3DnBPuD/JS8AfOOfeAVwEfM7M3hQ5/ufOufPC8GBFecS0UXTkqk/zHdW1DoOZ3DGnnE48hSJUVQTbgL3h9l7gkskTnHNPOOcOhtv/AjwPbKz4XNF38vr75/WX94Xo/9q1C+bn87dQ4koDM7jqqmA7Kb3anphG1E7njdk4w0HeALwY2bbofsL57wIeB1aF+7cQLFr/MHAdsDbl2h3AMrC8efPmei0ool2KuEj0yW2xDtePotNcyJtnKmjLDk9ZryHgbuCRmLBtsuAHfpxyn01hof/uiTgD1hK0KP4iSx4nr6H+U6Rw71NB15TSSrtvnxSliKXN6axKK4K0EBbsm1ykoE8475eB/wtcmnKv9wP/lOe5UgQ9p6i/f1/cFpuagC3tvpr0rfek6fK660FJiqCqjWAfMB9uzwPfmDzBzNYAXwf+3jl3+8SxTeGvEdgXHqkoj+gDRVwkik6a1iVNuX6k3bdrdxNRmTQzWFuzfFdVBNcCHzKzg8CF4T5mNmdmN4Xn/B7wPuATMW6iS2a2H9gPbAD+sqI8og/kdZGoY2L2Ng2pTbl+pN23SFrKoOwlabq8NV+JuGaC70FdQ1NAnu6eOkYKt21faKobK+2+Wc/sk51lgKS9nrpNQGhksegdScMtITk+St45+6cdpYP3JPWA1j1YXusRxKDWsuekDbCqMrW0r2MQmkLp4D1J4yDH4wuiq6K+4Q31P3+wikBrbveA3buDQn8S5/JZy2RIDVA69J6XXz6xffRo/WXVYBWB1tzuAdu3J3cB5anNdj1uvwnKNGOnMR0GRBtl1WAVgVrLPWF2Nj4+T22283H7NVO2GTtt6TAw2iirBmsslv2sJ/g2tXSXKNMOkjpfu4zFE6i13BNUmz2BmrGDpI2yarCKQOVLj/BpaukukdF3kLRRVg1WEUBy+SK3UuElasZOHXnLmqbrQqvrvV3/meySHtvjYLgVUeEJ4wzYl7mXRCo+lTWDNRYnIXucEKINuihrZCzOiexxQog28KmskSKYQPY4IUQb+FTWSBFMIHucEKINfCprpAgmkFupEKINfCpr5DUUw/btKviFEM3g46J7lVoEZnaamd1lZgfD3/UJ5x2PrE62LxJ/lpndb2aHzOy2cFlLIYToBUXHHPk663HVrqGdwD3OuXOAe8L9OF52zp0Xhosj8X8NXOec+3fAj4ErK8ojhBCtUKZQ93XW46qKYBuwN9zeS7AAfS7CBes/CIwXtC90vRBCdEmZQj3LZbSrWQ2qKoI3O+eeC7d/CLw54bzXm9mymd1nZpeEcSPgRefcq+H+EeD0pAeZ2Y7wHssrKysVxRZCiGqUGQeQ5jLaZbdRpiIws7vN7JGYsC16XrgwctIw5dlwNNvHgc+Z2VuLCuqc2+Ocm3POzW3cuLHo5UIIUStlxgGkuYx22W2UqQiccxc65/5DTPgG8CMz2wQQ/j6fcI9nw9/DwL3A+cBR4E1mNvZcOgN4tvI/EkKIFigzDiDNZbTLkcZVu4b2AfPh9jzwjckTzGy9ma0NtzcAvw48FrYgvg1cmna9EEL4SN5xAJP9/hA/k2iXI42rKoJrgQ+Z2UHgwnAfM5szs5vCc94OLJvZQwQF/7XOucfCY58BPm1mhwhsBn9XUR4hhGiEOENu1vTQRfr9Ox1p7JzrXbjgggtcURYXnZuddc4s+F1cLHyLXPep6zlCiO4Zf88QfNNBcR6Edeuyv+/xtZNhdjb9eU2VH8CyiylTOy/Uy4SiimBxMXhp0Rdh5tzCQqHbxN4nmhmyjgsh+kPc95y3QB8zqTyi5U8XJCmCQaxHkDTvtxncemv+4d1Z84drLQMhpoek7zmKWdAtVPQeXZUJg16PIMnq7lwx16wsq75P84sLIaqR57vNMuQm9ftv3erXcriDUARpL6tIIZ1l1fdpfnEhRDWyvts8htw4z6L5edi716/5hgahCHbvDl5CHEUK6Syrvk/ziwshqhH3PY/LkSJTRk96Ft1xh4fzDcUZDnwPZbyGFhbSrf4LC87NzATxMzPJhmR5DQkxHJr4nrs0IDNkr6ExSS91YSH+xRT1KqoDKRIhpoOkb7moS2mdJCmCQXgNZbF6NRw/fmr8zAy8+uqp8U0xHnwSbTauW6cV0oToG2nfMnT3nQ/aayiLOCWQFt8Uvs5VLoTIJjryeH4++Vv2aYnKMWoR4E+LYNWqoJE4SZavshCiW+JaAHF0/S2rRZDCjh3F4ptC7qdC9JO41nwcvn7LUgTADTfAwkLQAoDgd2EhiB/TxspBcj8VohpdrfCVZzxS2rfcldy/IM6C7Hso6zVUljxzDNXl6SOvISHK0eVcX0meQFGPoCQ52pQbeQ2VJ22+kN275ekjhA90Oa/P0hJcfnn8MZ/mI0qyEUgR5CDNiLt5c/xLHI3ghReal00IEZD0nULwPR47Fnyvu3c3U0nbsAGOHj01PqtAb9NJpBFjsZmdZmZ3mdnB8Hd9zDkfMLMHI+FfxwvYm9ktZvb9yLHzqsjTFGlG3KS+waNHu59ISoghkWaIPXq0+Xl9rr++nI3PByeRqsbincA9zrlzgHvC/ZNwzn3bOXeec+484IPAS8D/iJzy5+PjzrkHK8rTCGlG3LSXJf9/Idoj7juNo6mxOWXHB3jhJBJnOMgbgAPApnB7E3Ag4/wdwFJk/xbg0qLPbdtY7FyyEXdxMdlAFDd3SPQ+o1EQZBgWoh7SvkcfFoZJoi0nEZqYawh4MbJt0f2E878F/KfI/i2hMnkYuA5Ym+e5XSiCNEajZE+BKFkrHjXp4SBvJDEUsjx4xhNLDvEbKK0IgLuBR2LCtsmCH/hxyn02ASvA6ybiDFgL7AX+IuX6HcAysLx58+YWkiw/ed2/8mTQJiae0hKaYkjkWWJyqN9AUy2C3F1DwH8F9qQcfz/wT3me61uLwLl8Ne6k6WebbrJ2OduhEF0w2QW7apW+AeeSFUFVY/E+YD7cnge+kXLux4AvRyPMbFP4a8AlBC2NXjK5+EScgSiPF0ATngJaQlP0gTpH10a/xxdeSHYr1TcQUFURXAt8yMwOAheG+5jZnJndND7JzLYAZwL/c+L6JTPbD+wHNgB/WVEer8nyamjKU8AH9zQh0hhP2tbU8o36BjKIayb4HnzsGspLF15DshEI36mj+zKte9b3b6DXXkNdhT4rgq6Q15DwmarLN+Yp6BcXT/bwG438+A4011BJ2p5iQgjRLFXn28lzva8rAJadmqIMWo9ACOEtVUfX5nGI8HEFwKWleCUA7RqypQiEEJ1TdfnGNGPw2BsprsUA3XoOpSmhPs01JGqi84UphKiJsnk5jwt2Ekktiq1bT3gjJdGl51CaEmpzriEpAg9o2nWuTaTQppO877WrvJzUorjjjvQlJLteATBJCY1GLdst4izIvodp8xqalpG/vrvoiXIUea++5eW00fw+eM+1/c0g91F/qeo65wu+FQKiHoq8V1/y8thduok5vep2xW7TtTtJEahrqEPGzW2X4MHbt1GPmspiOinyXn0YwRvtnoqjSndQE11fVWwjdSFF0BFNZtbJ57TVZ+9DISDqp8h77XqRlaUlmJ9PtgsU9UaaxEcX1FqIayb4Hqahayir2VpH87Dt/kfZCKaTou81b1dHE10sadNP19E95UvXV1mQjcAv2shQXfTZayqL6aSNQrtqpSFrvY868n3f7WBSBJ7RRobqe+1F1I8virqJ/J/mIVRXy7Tvrd4kRSAbQUe00ZeqPnu/aXvMhU/jVZpwLEjK1zMz9c0nVHUEtLfEaQffwzS0CJxrvnbW99rLNNPFu6lSC687rzbRIlB+zwZ1DU03SR9qnR9wW90KvnRfNEkXfc1luwqbKGCbKrSHkHeq0IgiAH4XeBR4DZhLOe8igvWNDwE7I/FnAfeH8bcBa/I8V4rgZNqoCaU9o25lM4RaXRf2m7LKpymlpUK7fZpSBG8HfhW4N0kRADPAk8DZwBrgIeDc8NhXgcvC7RuBhTzPlSI4mTZql0nPGI3qLbj77pWRl648usq8KzkdTA9JiqCSsdg597hz7kDGae8CDjnnDjvnfgZ8BdgWLlj/QeD28Ly9BAvYi4K0MaI36V5Hj9Y7wGYoo5O7GHhV1tApp4Pppw2vodOBZyL7R8K4EfCic+7VifhYzGyHmS2b2fLKykpjwvaRNj7UovcqW3APpdDpyvukzHQGXY8WFs2TqQjM7G4zeyQmbGtDwDHOuT3OuTnn3NzGjRvbfLT3tPGhJj1jNIo/v2zBPaRCx4c5ZvIwtS6T4heszjrBOXdhxWc8C5wZ2T8jjDsKvMnMVoetgnG8KMj4g9y1K6iJb94cFJx1fqhJz4D4dWDLFtxt/BdRnO3b9Q6mmVoWrzeze4E/c86dsqK8ma0GngB+k6Cg/x7wcefco2b2NeAfnHNfMbMbgYedczdkPU+L1/vF0pIKbiH6QCOL15vZb5vZEeA9wD+b2Z1h/FvM7A6AsLb/KeBO4HHgq865R8NbfAb4tJkdIrAZ/F0VeUQ39KWLQwgRTy0tgrZRi0AIIYrTSItACCFE/5EiEEKIgSNFIIQQA0eKQAghBk4vjcVmtgIkrPabygbghZrFqQPJVRxfZZNcxfFVtmmUa9Y5d8qI3F4qgrKY2XKcxbxrJFdxfJVNchXHV9mGJJe6hoQQYuBIEQghxMAZmiLY07UACUiu4vgqm+Qqjq+yDUauQdkIhBBCnMrQWgRCCCEmkCIQQoiBM3WKwMx+18weNbPXzCzRxcrMLjKzA2Z2yMx2RuLPMrP7w/jbzGxNTXKdZmZ3mdnB8Hd9zDkfMLMHI+FfzeyS8NgtZvb9yLHz2pIrPO945Nn7IvGNpFde2czsPDP7TvjOHzaz348cqzXNkvJM5PjaMA0OhWmyJXLs6jD+gJl9pIocJeT6tJk9FqbPPWY2GzkW+15bkusTZrYSef4fRY7Nh+/9oJnN1ylXTtmui8j1hJm9GDnWSJqZ2c1m9ryZPZJw3Mzsb0OZHzazd0aOVUuvuIWM+xyAtwO/CtwLzCWcMwM8CZwNrAEeAs4Nj30VuCzcvhFYqEmuvwF2hts7gb/OOP804BiwLty/Bbi0gfTKJRfw04T4RtIrr2zAvwfOCbffAjwHvKnuNEvLM5Fz/hi4Mdy+DLgt3D43PH8tcFZ4n5kW5fpAJB8tjOVKe68tyfUJ4PMx154GHA5/14fb69uUbeL8PwVubiHN3ge8E3gk4fhW4JuAAe8G7q8rvaauReCce9w5dyDjtHcBh5xzh51zPwO+AmwzMwM+CNwenrcXuKQm0baF98t730uBbzrnXso4rypF5foFDadXLtmcc0845w6G2/8CPA80sZZpbJ5Jkfd24DfDNNoGfMU594pz7vvAofB+rcjlnPt2JB/dR7AaYNPkSa8kPgLc5Zw75pz7MXAXcFGHsn0M+HKNz4/FOfe/CCp/SWwD/t4F3EewwuMmakivqVMEOTkdeCayfySMGwEvumAxnWh8HbzZOfdcuP1D4M0Z51/GqZlvd9gkvM7M1rYs1+vNbNnM7ht3V9FsehWRDQAzexdBDe/JSHRdaZaUZ2LPCdPkJwRplOfaJuWKciVBrXJM3HttU67fCd/P7WY2XtK2yfQqdP+wG+0s4FuR6KbSLIskuSunV+aaxT5iZncD/zbm0C7n3DfalmdMmlzRHeecM7NEv91Qy/9HglXdxlxNUBiuIfAj/gxwTYtyzTrnnjWzs4Fvmdl+goKuEjWn2a3AvHPutTC6dJpNI2Z2OTAH/EYk+pT36px7Mv4OtfOPwJedc6+Y2X8maE19sKVn5+Uy4Hbn3PFIXJdp1gi9VATOuQsr3uJZ4MzI/hlh3FGC5tbqsEY3jq8sl5n9yMw2OeeeCwut51Nu9XvA151zP4/ce1wzfsXMvgT8WZtyOeeeDX8PW7BG9fnAP1AhveqSzcx+GfhngorAfZF7l06zGJLyTNw5RyxYq/tXCPJUnmublAszu5BAuf6Gc+6VcXzCe62jUMuUyzl3NLJ7E4FNaHzt+yeuvbcGmXLLFuEy4E+iEQ2mWRZJcldOr6F2DX0POMcCj5c1BC97nwssL98m6J8HmAfqamHsC++X576n9EmGBeG4X/4SINazoAm5zGz9uFvFzDYAvw481nB65ZVtDfB1gr7T2yeO1ZlmsXkmRd5LgW+FabQPuMwCr6KzgHOA71aQpZBcZnY+8EXgYufc85H42PfaolybIrsXE6xpDkFL+MOhfOuBD3Ny67hx2UL53kZgfP1OJK7JNMtiH/AHoffQu4GfhJWd6unVhPW7ywD8NkEf2SvAj4A7w/i3AHdEztsKPEGgyXdF4s8m+EgPAV8D1tYk1wi4BzgI3A2cFsbPATdFzttCoOFXTVz/LWA/QWG2CLyxLbmA94bPfij8vbLp9Cog2+XAz4EHI+G8JtIsLs8QdDVdHG6/PkyDQ2GanB25dld43QHgozXn+Sy57g6/hXH67Mt6ry3J9VfAo+Hzvw28LXLtH4bpeAj4ZJ1y5ZEt3P8scO3EdY2lGUHl77kwPx8hsOdcBVwVHjfgC6HM+4l4RVZNL00xIYQQA2eoXUNCCCFCpAiEEGLgSBEIIcTAkSIQQoiBI0UghBADR4pACCEGjhSBEEIMnP8PNRUZ2fYpuekAAAAASUVORK5CYII=\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -417,16 +417,16 @@ ...@@ -417,16 +417,16 @@
" :param theta: 参数\n", " :param theta: 参数\n",
" :return: Y 旋转矩阵\n", " :return: Y 旋转矩阵\n",
" \"\"\"\n", " \"\"\"\n",
" return np.array([[np.cos(theta/2), -np.sin(theta/2)],\n", " return np.array([[np.cos(theta / 2), -np.sin(theta / 2)],\n",
" [np.sin(theta/2), np.cos(theta/2)]])\n", " [np.sin(theta / 2), np.cos(theta / 2)]])\n",
"\n", "\n",
"def Rz(theta):\n", "def Rz(theta):\n",
" \"\"\"\n", " \"\"\"\n",
" :param theta: 参数\n", " :param theta: 参数\n",
" :return: Z 旋转矩阵\n", " :return: Z 旋转矩阵\n",
" \"\"\"\n", " \"\"\"\n",
" return np.array([[np.cos(theta/2) - np.sin(theta/2) * 1j, 0],\n", " return np.array([[np.cos(theta / 2) - np.sin(theta / 2) * 1j, 0],\n",
" [0, np.cos(theta/2) + np.sin(theta/2) * 1j]])\n", " [0, np.cos(theta / 2) + np.sin(theta / 2) * 1j]])\n",
"\n", "\n",
"# 经典 -> 量子数据编码器\n", "# 经典 -> 量子数据编码器\n",
"def datapoints_transform_to_state(data, n_qubits):\n", "def datapoints_transform_to_state(data, n_qubits):\n",
...@@ -842,7 +842,7 @@ ...@@ -842,7 +842,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 10,
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2021-03-02T09:15:50.771171Z", "end_time": "2021-03-02T09:15:50.771171Z",
...@@ -877,7 +877,7 @@ ...@@ -877,7 +877,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAATsAAAD5CAYAAABYi5LMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAg6klEQVR4nO3de5BkZ3nf8e/TPd1z2dnZXe0FARISBJEgAhGxYlyhKlBWIhb+QGA5sUQlEQmxcgE7sYOrrIoruEQRhEMZkypiI2M5wlU2UHIVJSokimyhsstczGKwiOQAkrCxFqHV3rU7l749+aPPLK3Zfp9z+jLbp6d/n6qunZm3z2W6zzx7znmffh5zd0REdrrKpHdARORSULATkZmgYCciM0HBTkRmgoKdiMwEBTsRmQlzgy5gZoeBjwJV4BPufteW8auAe4CDwEngn7r7U3nrrS6ueG33ob5jlYrF+xSMW7RoMBgu133GUMuGq83ZpkVPGHabOYZddpSEpnDZYDAvjSoajZaNVpu7zU6w3mCsE421m+E2O81G/5+vn8Gba6McDlRWrnBa64We62snHnD3w6Nsb5wGCnZmVgU+Bvwj4Cngq2Z2v7s/1vO0DwOfdPd7zezHgQ8C/yxv3bXdh3jJT32479jCUi1ctj6f/jXm6umT17laNTlWqcYnvdW59Hg4FkTCak5Qj8aHHcsz7LLt4I91lGWjsUarE6632U6Pd4JlW812epsbrXibG+llN9bSQWvtuY302Olnwm2eP/a9vj9f/bNPhssV0t6g9sq3F3pq488+cWD0DY7PoJexPwo87u5PunsD+BRw05bnXAs8lH39hT7jIjLFrFIt9CibQYPdi4G/7vn+qexnvf4c+Ins67cDu81s/3C7JyLlYjMT7Ip4L/AGM/s68AbgKND3XN7MbjezI2Z2pL12dht2RUTGyqY32A06QXEUuLLn+yuyn13g7t8nO7Mzs2XgZnc/3W9l7n43cDfAwqGX60O6IiVnZlRr9UnvxlAGDXZfBa4xs5fSDXK3AO/ofYKZHQBOunsHuIPuzKyI7BBlPGsrYqBg5+4tM3sP8ADd1JN73P1RM7sTOOLu9wNvBD5oZg78EfDuIuuuzc/x4r9xWd+xlxzcFS57aGU+GFtIjq0spH/9pWCmFmA+mK2dD2ZjF4KxWiW+q1CrpmdGo2VzVhuKZo8j7RGq6TTb6WWbwWxsNNsKsBHMuK4GM67nGumx5xrxbOyxs+lZ1adPryXHvndiNTl2+thKuM3jK/0nQRuP3hcuV0h2GTuNBs6zc/fPA5/f8rP/3PP1fcAYXlURKRsDbJT/PSdo4GAnIrNshs7sRGSGzdJlrIjMMDMqMzIbKyIzrHvPTmd2IrLTTfFl7HROq4jIhBiVSrXQI3dNZofN7Ftm9riZ/WKf8ZeY2RfM7Otm9oiZvaVn7I5suW+Z2ZuK7HlpzuyW5qu85qq9fceufVGcV3T5cjrP7sBS+v7CniDPbjHIhwNYmEvnn9WDfLh6UEVkLq/qSTTcSed7WTBGJ85NG61YUyBIX/BKusqNV9LvWTPnV2kEeXgbQW7fWrDi1Vb8+jxzLp1n94Ng7Mkgz+6RxbgKUKpKy7Gc3NFCbDyXsQUrKP0S8Bl3/3Uzu5ZuytvV2de3AK8CXgT8gZm9wt3TCZGUKNiJSPkZRmVuLBMUFyooAZjZZgWl3mDnwOaZzh7g+9nXNwGfcvcN4Ltm9ni2vi9FG1SwE5HixnfPrl8Fpddtec4vA//HzH4G2AX8w55lv7xl2a3Vly6ie3YiMoCBqp4c2KxqlD1uH3BjtwL/w92vAN4C/I6ZDR2zdGYnIsUZWLXwmd1xd78+MZZbQQl4F3AYwN2/ZGYLwIGCy15EZ3YiUpiNr3jnhQpKZlanO+Fw/5bnfA+4AcDMXgksAM9mz7vFzOazCkzXAH+at0Gd2YlIcWO6Z1ewgtJ/BH7TzH6O7mTFO73b4ehRM/sM3cmMFvDuvJlYKFGwm5+rcM0Ldvcdu+ayuMTTC3enU0/2zKdPXpfr6Tet7v07NG2qbJxPjtlGOm3AGumyPtaOt0kj3dXJW8GyrXRjF+/kHCO5qSkJOZUxwj+YuXRqRWV+MTlWn0sfBwCLtfSyPr+cHOss9T8uATaI00BWguPvsiCFJCohthaUnAI4drL/8VfNaSJVVHVuPGGjQAWlx4DXJ5b9APCBQbZXmmAnIuVnZmHr0jJTsBORgdiQBV0nTcFORAaS17S+rBTsRKQ4Q5exIrLzdUs8KdiJyE5nNrZZ3UutNMGuVq1weSKFJEotATi4lE5jWK6kK35Uzh9Pj62dCbdpq+nxzrnTybH2+XQzcF9Lp7MAdNbTKS0epaU002kpntORy4dMPclrylKpBykbQeqJ1dPd4iq74uo4lSCFpLJnf3psuX/Xu+4694XbnF8+mByLOrc12+k0meOr6VQigEcSVYAqYdmc4nRmJyI7npkmKERkRgz/UfzJUrATkYEoz05Edjwzo5pTxbusFOxEZCCaoBCRnc+gosvY0cxVLNkcJ6ocAXF6SfXsM+mx1ZPJsdbxp8Ntdk4dS461o9STc+eSY42z6dQSgOb5dHpJaz3dvKXTTL8+nUbQjIftTD1JH3qVWnqstiuoerKyFG5zfm+QerKSTj2p7r88PXbwReE28fTrt2/5BcmxtVb6NTiwFFdauWy5/9/RXM57UoSSikVkRqjqiYjMginOs5vOaRURmQij+0mMIo/cdeU3yf6ImX0je3zbzE73jLV7xraWc+9LZ3YiUtyYzuyKNMl295/ref7PAK/tWcWau183yDZ1ZiciA7GKFXrkuNAk290bwGaT7JRbgd8bZb8V7ERkANYtzV7gkaNfk+y+ja7N7CrgpcBDPT9eyHrRftnM3lZkz3UZKyKFDVgI4ICZHen5/m53v3uIzd4C3Lelg9hV7n7UzF4GPGRm33T3J6KVlCbYzVUs2W1puZaTs7WWzpcLc+l+8L302Ik4z651Ml0eau1EuozTxunnkmN5eXatMM8uXfanuRbk2TVzO9ANxXJuUEd5eLXFKM8uXe6rvjsnz25fOs9u8WC6vNZ8UD6LnO5s1Wr/nDeAWj3dNW9X0AltX9CVDGBvIg+vOqZZ1AFST0Ztkr3pFuDdvT9w96PZv0+a2cN07+eFwU6XsSJSmBnU5yqFHjmKNMnGzP4WsA/4Us/P9pnZfPb1AbrtFh/buuxWpTmzE5HyM2wsZ4gFm2RDNwh+KmuOvemVwMfNrEP3hO2u3lncFAU7ESnOxnc5nNckO/v+l/ss90Xg1YNuT8FORAozxhfsLjUFOxEpzKw7mTiNFOxEpDAzKzL5UEqlCXYGzCfSFeYr3vfnm6JOYO2oFFMw1ng2PQawdux0euzZU8mxjdPpEk/rZ9JlmgA2zqbHW+vp9JJWkHrinfi17eR0H0up5LTbi9IX5oLUk/mVdOrJ/EqQIgK01qMua8Ol4ETdzgAqu9PdxyqLe5JjS7vSaSm7g/JYAMsL25d60r2MVbATkRmge3YisuPZGGdjLzUFOxEpbFx5dpOgYCciA6mqB4WI7HSbHxebRgp2IlKY8uzGwMyoJ1JPbCOdrgFQaaQrVjSfO50ca585kRxbDyqXQJxesnosnQqzdiqdHrEejAE0zqdTJxrn0lVPorSUTk7qSTseTsqryj1Xq6bHFtKHZfN88HsGKTYA7cZw6SWVWrrKSH0lfQwBdIJjrLLnUHJsYSX9Ai7V068dwGJifBxXn7pnJyIzQ8FORHY8pZ6IyExQIQARmQnT/NnY6dxrEZmYasUKPfKM2Df2NjP7Tva4rch+68xORAob1z27UfrGmtllwPuA6wEHvpYtm06RoETBrmKkU09acTWQzlo69aRzPmp+k05piRrj5C0bpZesHk831dk4m04t6Y6nX4fzzXR1krWgckkzJ7Wk7cPlnuRl2S8E+7u4kU4hWYrSaIas0AJ5TX7SlU02Ti+H663uTx9/1Vb6OLF2+ljIu4qcTzyhMobckzHes7vQNxbAzDb7xqbKq99KN8ABvAl40N1PZss+CBwmp69saYKdiEyB8c3G9usb+7q+m7y4b2zhnrO9FOxEpDDDqBWvZ7edfWMHpmAnIoUZ+Z+O6bFdfWOPAm/csuzDeTuj2VgRKc6gUrFCjxxD942l237xxqx/7D7gxuxnIZ3ZiUhh3TO7yfaNdfeTZvZ+ugET4M7NyYqIgp2IDGQcs7owfN/Y7Of3APcMsj0FOxEpbMB7dqVSqmCXqpMV5RwB+HqQZxeMNc+n85waZ9P5cBB3Aovy4aJcurXTcYmnM0Fu2npQqinKs2tMqMTTWnBPZ72TvpXc9nSenZ2NN1oNykrVl6MyTuljITqGIM4BZWMtOWStKM8u3WEN0sU1x1LiyYy5nM5xZVWqYCci5aczOxHZ8Yzx3bO71BTsRKQ41bMTkVmgMzsRmRm6ZyciO56ZUdNs7Gii/B1rpTtKAXQ20tP/ndUobSA99d9ajVMKoi5Xw46da8Ulis4HKSTRsmtB/kh+6sn2lHiqB/d9hk53WY2Pk6hrWdSdrb2eTgOJxgC8kT6OojFrp/enaumSUwD1RDAaxwlZ9zJ2DCuagNIEOxGZDuP4uNgkKNiJSGGaoBCR2WAwpbfsFOxEpLgBi3eWioKdiBSmy1gRmQ26jB0DC/7H6KQrXQB4UCGi3Qy6UQVj7UZc7r61HqSXrKXXuxGsN0oRyRuPxyZR9SRvvemzgyhpNRpbyMmJ2BV0JmsFY9H72VqPO995kBblUUqVp9+zvGCT+juyMXUXm9YzuymN0SIyKWbFHvnriZtkZ8/5J2b2mJk9ama/2/Pzdk8D7YvKufdTnjM7EZkKlTGkJxdpkm1m1wB3AK9391NmdqhnFWvuft0g21SwE5HCuk2yx7KqIk2yfxr4mLufAnD3Y6NsUJexIlJcwUvYApexRRpdvwJ4hZn9iZl92cwO94wtmNmR7OdvK7LrOrMTkcIMG+QydtQm2XPANXR7xF4B/JGZvdrdTwNXuftRM3sZ8JCZfdPdn8hbmYhIYQNMxo7aJPsp4Cvu3gS+a2bfphv8vuruRwHc/Ukzexh4LTAdwS7sWhRMw0M8hR+ll3Qaw6eetBvpfYqWjVI9mjkVRqJlt2MMtq/hTiRKo6lXRvhdgvdl2LHoGALwIO3Hm0HFlCDdqpLz4m53HtyYqp5caJJNN8jdArxjy3M+C9wK/LaZHaB7Wftk1hh71d03sp+/HviVvA2WJtiJSPld4ibZDwA3mtljQBv4BXc/YWZ/H/i4mXXozjvc1TuLm6JgJyIDGVdOcV6TbHd34OezR+9zvgi8etDtKdiJyECmNYVDwU5ECuumlUznx8UU7ERkICrLLiIzYUpP7BTsRKS4cc3GTsJUBDvLybOjE+fEpXgnvd5OToJZJ8qfCvK9om5deTlt8bLDrTdvmzmvfFru7xKNDfe75O1rJ3hfovcsOk6iPLq8ZaeS6TJWRGbElMY6BTsRKU59Y0VkZij1RER2PJ3ZiciMMM3GisgMKNhfooyG+phbXqMMM5s3s09n418xs6tH3tMhebuTfIjIYMy98KNsBg52PY0y3gxcC9xqZtduedq7gFPu/nLgI8CHRt1RESkJ7xR7lMwwZ3YXGmW4ewPYbJTR6ybg3uzr+4AbbFqncETkecw7hR5lM0ywK9Io48Jz3L0FnAH2D7ODIlIm3v3EUpFHjhH7xt5mZt/JHrcV2fOJTlCY2e3A7QBXXnllzrNFZOLcx3KJOkrfWDO7DHgfcD3dDyZ+LVv2VLTNYc7sijTKuPAcM5sD9gAntq7I3e929+vd/fr9Bw4MsSsicqmN6TK2yO2wVN/YNwEPuvvJbOxB4DA5hgl2FxplmFmdbqOM+7c8535g89TyJ4GHshLLIjLtxjNBMUrf2CLLXmTgy9iCjTJ+C/gdM3scOEk3IA7NLScmV6rJIQtaLVklPZbXwakSrje9bJSQmdeRK142Grv0/8/k/y7R2HCvUd7/3JXgfYnes+g4iY6vvGWn00CXsdvSN3aA5S9a2cAKNMpYB/7xsDslIiXlDBLstqtv7FG6AbB32Yfzdman/bcjItvKsXar0CNHkdthnyULar19Y/lhi8V9WQ/ZG7OfhfRxMREZzBhmY0fpGwtgZu+nGzAB7nT3k3nbVLATkeLcu4+xrGq4vrHZ2D3APYNsT8FORAZTwk9HFKFgJyIDKeNHwYpQsBORAYznExSTUJpg5wSdo3Ly7Gyulhyr1NK/YqWeHsvLn6rW0+PVejrvrx7kc9VyaiVEy0ZjbR++BkNe97GUvDy7YX+XYccgzo2M3rNoLDqGICfPs1ZPjkW5pZ2c1m3bWr3MHTq5M62lVJpgJyLlZ+gyVkRmxZT2wlWwE5EBjC/15FJTsBOR4gb7uFipKNiJyAAc0wSFiMwEndmNyKGTuhdQyZnen0tP4Vej1JNgrLYYb3NuIZ3uEi07fz6dxrCYkzPQDFJI4vSSIOUip/xTe8j7M3m9RaM0kcUgb2UxSOWIlgOYW0i/L3EqUTAWHEMANr+QHgtSpjw45vNSS1J/R2MpKeleqOR6GZUn2InIVHDNxorIzqczOxGZBY6CnYjsfO6ON5uT3o2hKNiJyACm9zJWZdlFpDh3vNMu9MiT1yTbzN5pZs+a2Teyx7/qGWv3/HxrOfe+SnNm50ArMcnjwRQ9xNP7laWl5Fht12JybG4pvc7ushvBWJCWspZOyFxuxgfI8BVI0gs2OpNJPRk2vWRXsNzSfHw4z6+kU5TmV+aTY7Vd6WNhLjiGAKwepJ4EY15NH0PtnAOhkchNGduHvMYwG1ukSXbm0+7+nj6rWHP36wbZZmmCnYhMAy901lbAhSbZAGa22SR7a7AbG13Gikhxm7OxRR6xoo2ubzazR8zsPjPrbb24YGZHsubZbyuy6zqzE5HiBpuNHbVJ9ueA33P3DTP718C9wI9nY1e5+1EzexnwkJl9092fiFamYCciAxhoNnakJtmbbRMznwB+pWfsaPbvk2b2MPBaIAx2uowVkeI2Pxs7+mVsbpNsM3thz7dvBf4i+/k+M5vPvj4AvJ4C9/p0ZiciAxnHZ2MLNsn+WTN7K9ACTgLvzBZ/JfBxM+vQPWG7q88s7kVKE+zcoZlIg/BqOmUAoLKwa6ix+ko6LSUaA1hYXU+OtdbT6SXtxvAzWZWz6XSXejOdkrFQSR+ceekswx7WeZcMw1Y9idJLFval00cgTi+Jxuq7g+MkGAOoLKaPP+bTaSteS6eltNbjd6WRyOEaT4Hh8SUVF2iSfQdwR5/lvgi8etDtlSbYiUj5uTve0sfFRGSnUyEAEZkN0/vZWAU7ESnOwdsKdiKy47n6xorIjNBlrIjseO50NBs7GgcaiaQvr+WU0VlaTo5Vdu9Njs3vPZ0ca5xdDbfZaaRz6TpB+6dKkENWrac7j0Hctax+Ln0A7g7y/lrbVlYqHp+rpX/XqAvYsGWaAJYOpI+jhf27g7E9ybH63pVwm5Xlvckxr6Vz9NqWfg02Wul8S4DVRC5nsnvfINzxvPZmJVWaYCci5eeOgp2IzAJXK0URmQE6sxORWeDutBuaoBCRGaDLWBHZ+TQbOzp3T6eeLKdTSwB8Pj39X9mzPz12/rnk2K7Lhz9Vt6A71tzCuWAsfjsa59P71Aq6lo1Scspzuo+lWFDCCeI0m+h1qC+nu27lpZ5E6SVLh/YFY3uTY9WVy8JtRsdfZz5d/mkt1WoPWM1JF1pLpEWNJfWE6b1np0rFIlKYe3c2tsgjz4h9Y28zs+9kj9uK7HtpzuxEZDpESfNFjdI31swuA94HXE/38whfy5Y9FW1TZ3YiUlzH6TRahR45LvSNdfcGsNk3tog3AQ+6+8kswD0IHM5bSMFORApzGNdl7Ch9Y4su+zwKdiJSXDYbW+RB1je253H7gFv7HHC1u7+G7tnbvaPsuu7ZichABpiN3a6+sUeBN25Z9uG8nSlNsOt4ekp9tRXv5vJiuipFde+h5NhcUKrGKvFJ7+56OgWitivdGaq+kk43mN97Ptxm83zQ0Szodhall+SlnnSGLHsSVXeBvNST9Gs7F762caev+b1B6snBveltHrg8OVY9dEW4TXYfSA55cNyuNtKv+5mN+H7YmdX+x3V7yDSi53HojCep+ELfWLrB6xbgHb1PMLMXuvvT2bcX+sbSbb/4X8xsM1/oRvp0IduqNMFORMrPGU9S8Sh9Y939pJm9n27ABLjT3U/mbVPBTkSKc6fTHM9nY4ftG5uN3QPcM8j2FOxEpDhVPRGR2aDPxorIDHAfzycoJkHBTkQGoErFI2t1OhxfbfQd278U7+biUrpiBZ30NH3V0uklVk+nOADYrnSllaXlE8mxhYPpSivN59IVUQBaUerJev/XDqDTTL8GeQ2Ph/1fvBJUfgGwajr1pLqQbqoTpfXUluL3rLqyNz0WVCep7k+nnrD3BeE2O8sHk2Orlq7Sci6YBDi1Fk8QnE6lngzbPalXBzo56UplVZpgJyLl57guY0VkBvjwNQ4nTcFORAYy7KdqJk3BTkQKU99YEZkN7rjO7ERkx/P84hFlpWAnIoU50NEExWiaHefY+f65Yod2xV2jakEnq7270nlOPpdeb6WeLsUEMLcnvV7W0rl0ndX0WG0tLvHkjXSenW+spceCUlbeyflfetgE0pwSWVZJ59nZXLrEky2m3xdbiN+zSpAbact7k2Od+XRpqM6udH4ewGp1MTl2YjWd//iD59J5k8+c2wi3efy5/uOtsZR40mWsiMwI5dmJyI7XnY3VmZ2I7HRTHOzUcEdEinOn3WwXeuTJa5Ld87ybzczN7Prs+6vNbK2nefZvFNl1ndmJSGHOeD5BUbRJtpntBv498JUtq3jC3a8bZJs6sxOR4gZrpRgp2iT7/cCHgHQqQkGlObNrtDt871T/9InlerybzU46hWStmV52ub6cHFtcSacbAMxX0v+7WWM1PdZKpw1YK34/K0EKSVTKyoIxfEIza0F5La+mSzx5kLLitbjEU7uWTgPxeroz2Yant3muGb9+Z4JyTFF6yROn0sfQk8fiUmCrZ/sfR+OaRR3TPbt+ja5f1/sEM/u7wJXu/j/N7Be2LP9SM/s6cBb4JXf/47wNlibYiUj5dSsVFw52B8zsSM/3d7v73UUWNLMK8KtkHcW2eBp4ibufMLMfAT5rZq9y97PROhXsRKS4bIKioFGaZO8G/jbwsJkBXA7cb2ZvdfcjwEZ3d/xrZvYE8AqgN7BeRMFORIobX+pJ2CTb3c8AFzqMm9nDwHvd/YiZHQROunvbzF4GXAM8mbdBBTsRKcwZT4mngk2yU/4BcKeZNYEO8G/UJFtExmuwe3bxqnKaZG/5+Rt7vv594PcH3Z6CnYgMQIUARrbWaPN/nzrTdyyvWsPx1XTKwYGldBrDnvkgLWU+nW4AsFRLj9er6VSYWiW9r3P1veE2g9VSDSq/BEMEQ9myec/or+PxexaNRm93dCw0c46TVjM9vr6evjRbHaHT1/FEpy+Iq5d85wfp6jj/72g46ciZ4/3TVtqtcVx+5r+3ZVWaYCci5edAQ/XsRGQWtHVmJyI7nQNTestOwU5EinPXmZ2IzAid2YnIjue4zuxGtdFo88Rfneo79syZuBrIvl1BeslSunnL3mBsMafSylI9nXqyGIzVq+lqH7VqnOYRpYFETYeitJQ825V60g5m9KLJvugPrZlzyrHeSn+mcy1oD/jcerpqzJnVdOUSgBPn0uOpxjiQrlwC6dSSTaefPtr3560ghaao7mzsyKuZiNIEOxEpP92zE5GZoXt2IrLjdVNPpjPaKdiJSGHKsxORmeCuj4uJyIyY1svYgbqLWdd/y/o8PpI1xOj3vJ/Kxh81sw+NZ1dFZNKcbrXMIo+yGfTM7s10SyBfQ7cT0K9zcUeg/cB/BX7E3Z81s3vN7AZ3/8NoxY21Df760cf7jtUW0l3AAKr1dNeo6lw6560yl471efllQXMsLCq3FIxFy+WxIfPhov3ZTp0hL4U8OKvwnHVG2+y00mPtoDJvqxF0bgPajf4d8wCa6+kuYc3z6TJOG8/FRXk3zh7vvy/r58PlihlfUrGZHQY+SrdS8Sfc/a7E824G7gP+XtZ/AjO7A3gX0AZ+1t0fyNveoH1jbwI+6V1fBvaa2Qu3POdlwHfc/dns+z8Abh5wOyJSQpsTFEUekZ4m2W8GrgVuNbNr+zzvoibZ2fNuAV4FHAb+e7a+0KDBrl+vxxdvec7jwN80s6vNbA54G8/vIiQiU2oz9aTII8coTbJvAj7l7hvu/l26MedH8zY4aLDL5e6ngH8LfBr4Y+Av6Z5qXsTMbjezI2Z2pLMRN/4VkcnbnI0t8iDrG9vzuL1nVbknTr1NsrfsRpGTrovk3rMzs3cDP519+1XiXo8AuPvngM9ly99OIthlDXPvBqhddtV0TvGIzJgB8uyivrGhnCbZQ8k9s3P3j7n7de5+HfBZ4J9ns7I/Bpxx96f77Oih7N99wL8DPjGuHRaRyRnjZewgTbL/Evgxuk2yry+wbF+DzsZ+HngL3WvkVeBfbA6Y2TeygAjwUTP7O9nXd7r7twfcjoiU0Bg/QTFKk+w14HfN7FeBF9HNDvnTvA1aNJV/KZnZs8BfZd8eAPrPn0tZ6T0rp9735Sp3PzjKyszsf9MThHIcd/fDwbreAvwaP2yS/YFUk+zeYJd9/5+Afwm0gP/g7v8rd9/LEux6mdmRYa/1ZTL0npWT3pcfGvtsrIhIGSnYichMKGuwu3vSOyAD03tWTnpfMqW8ZyciMm5lPbMTERmriQY7lYyaPmZ22My+lb1nv9hnfN7MPp2Nf8XMrp7Abs6UAu/JVWb2h9nf0MNmdsUk9nPSJn1m11sy6na6JaOep6dk1A3u/irgcjO74ZLupQCFK1W8Czjl7i8HPkL3Q9yyTQq+Jx+mW63oNcCdwAcv7V6Ww6SDnUpGTZcilSpuAu7Nvr4PuMGGLbYnRRR5T64FHsq+/kKf8Zkw6WCnklHTpcj7deE57t4CzgD7L8nezaYi78mfAz+Rff12YHd2xTRTJh3scg1SMkpE+nov8AYz+zrwBrqfRZ25v6FL3nBnO0tGybYrUm1i8zlPZWfie4ATl2b3ZlLue+Lu3yc7szOzZeBmdz99qXawLC75mZ1KRk21C5UqzKxOt1LF/Vuecz9wW/b1TwIPuZI5t1Pue2JmB7L6cAB3APdc4n0shUlfxn4eeJLufbnfpBvIgG7JqJ7nfdTMHgP+BLhLJaMmI7sH9x7gAeAvgM+4+6NmdqeZvTV72m8B+83sceDngYtSIWR8Cr4nbwS+ZWbfBl4AfGAiOzth+gSFiMyESZ/ZiYhcEgp2IjITFOxEZCYo2InITFCwE5GZoGAnIjNBwU5EZoKCnYjMhP8PWyDVapqkw5MAAAAASUVORK5CYII=\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 2 Axes>" "<Figure size 432x288 with 2 Axes>"
] ]
...@@ -891,7 +891,7 @@ ...@@ -891,7 +891,7 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"主程序段总共运行了 28.894441843032837 秒\n" "主程序段总共运行了 30.048875331878662 秒\n"
] ]
} }
], ],
...@@ -960,7 +960,7 @@ ...@@ -960,7 +960,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.10" "version": "3.7.0"
}, },
"toc": { "toc": {
"base_numbering": 1, "base_numbering": 1,
......
...@@ -136,9 +136,9 @@ ...@@ -136,9 +136,9 @@
" \"\"\"\n", " \"\"\"\n",
" train_x, train_y = [], []\n", " train_x, train_y = [], []\n",
" num_samples, seed_para = 0, 0\n", " num_samples, seed_para = 0, 0\n",
" while num_samples <Ntrain + Ntest:\n", " while num_samples < Ntrain + Ntest:\n",
" np.random.seed((seed_data + 10) * 1000 + seed_para + num_samples)\n", " np.random.seed((seed_data + 10) * 1000 + seed_para + num_samples)\n",
" data_point = np.random.rand(2) * 2-1\n", " data_point = np.random.rand(2) * 2 - 1\n",
"\n", "\n",
" # If the modulus of the data point is less than (0.7 - gap), mark it as 0\n", " # If the modulus of the data point is less than (0.7 - gap), mark it as 0\n",
" if np.linalg.norm(data_point) < 0.7-boundary_gap / 2:\n", " if np.linalg.norm(data_point) < 0.7-boundary_gap / 2:\n",
...@@ -202,7 +202,7 @@ ...@@ -202,7 +202,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAApn0lEQVR4nO2df6xexXnnP4+vYydu1Ma89mYdwNeQZZuQ3QrCVZSkUpqkJCHuClOVtiSG3qRUXm6b7kpRqxhZ6kZsrdL+Q6gSRCxKcLlXCQlVFLclYoGEXWk3kFx2AfNDxsYJYErCxQ6RIigJZvaPc974+PX5/XPOe74fafSeM+fX886ZM8/MPM/MmHMOIYQQw2VV1wIIIYToFikCIYQYOFIEQggxcKQIhBBi4EgRCCHEwFndtQBl2LBhg9uyZUvXYgghRK944IEHXnDObZyM76Ui2LJlC8vLy12LIYQQvcLMnoqLV9eQEEIMHCkCIYQYOFIEQggxcKQIhBBi4EgRCCHEwKlFEZjZzWb2vJk9knDczOxvzeyQmT1sZu+MHJs3s4NhmK9DHiHKsLQEW7bAqlXB79JS1xL5ic/p5JNsPsmSiXOucgDeB7wTeCTh+Fbgm4AB7wbuD+NPAw6Hv+vD7fVZz7vgggtcn1lcdG521jmz4HdxsWuJxOKic+vWOQcnwrp1ejeTNJVOdXwTPr1Dn2SJAiy7uDI6LrJMALakKIIvAh+L7B8ANgEfA76YdF5S6LMiiMsgZs4tLHQtWbP4rvxmZ09+J+MwO9u1ZH7RRDrVVWj69A59kiVKkiJoy0ZwOvBMZP9IGJcUfwpmtsPMls1seWVlpTFBm2bXLnjppZPjnIMbb6y/6ehL03RpCXbsgKeeCv7rU08F+z41lZ9+ulj8UHkqdjhStXSK+yZeeimIL4JP79AnWfLQG2Oxc26Pc27OOTe3ceMpI6R7Q9KH5FzxjJ+GT4VvXR96k2zeXCy+SXxR4JMsLYFZ/LEy6TT+n3UpF5/eoU+y5KEtRfAscGZk/4wwLil+akn6kKDe2oJPhW8fake7d8O6dSfHrVsXxLeJTwp8kl27ApkmMSueTtH/mUTRQrPKO6yifOOu9SU/5Sauv6hMIN1G8FucbCz+rjthLP4+gaF4fbh9Wtaz6rARdNVnHddvGNd/WFU+s/hnmNX4Z3Lia3/pJD7YMZpMq6byFBSXJel/VjWsLi46NxqduM9olH2fKjaKtGt9yE+T0KSxGPgy8Bzwc4J+/iuBq4CrwuMGfAF4EtgPzEWu/UPgUBg+med5VRVBlxb9tMw/fn4d8vlU+PrqQeEjTSlw3/JUmlKpUmiW+Z9V/pdP31keGlUEbYeqiiDp5c3MNK+9o7WVaPilX8qWr0jm6qrwTaoF+Vg78pGmChbf8pRP/zOP8k3Kv1Wu7QIpgghptZGmC83FRefWrDn5WWvWnPysumqFbWdA1fyr01Qa+panfPqfWcojTdYq13aBFEGErP7Jppt3WR9T35qbY/oqt280ocB9fDe+/M+swjrtnlWu7QIpgghxL6+O2lJd+FaLyItPBmpxMnXnKR+6O+JkKPs/0/5PVr6ucm3bSBFMsLgY2AS6aBHkla/rD60ovtV+xMn43q1Tlwx1fzvTZEyWIoghy1bQh8LXJ3woIETz+FC4tSlDU+6lXSBFEEOarWA0quURXtFGK6OPLRlRDB+6O9qWoUq+9umbkCKIIc6DB5x73eumrwDzrWYi+svQWgRJ+FTA5yVJEfRmrqEm2L4dbr4ZRqMTcaMRfOlLwbFpwqcpJ0S/8WH6hK5l8HkqkDJYoCT6xdzcnFteXu5ajF6xalWQYScxg9dea18e0W+WloJKxNNPB3MC7d7dfuWpSxmSJsubnYUf/KAdGcpgZg845+ZOiZciGAZ9zbhC+EhfK1ZJimDQXUNp+DoVcFm6bkoLMU1UmWbax7JFiiCGNvr/imSGOjLO9u2wZ0/QAjALfvfsmT5biBBtULZi5a1tIc6C7HtoeqnKpj0SinjwyNtHiPop4/Ezec3CQvF7dO3thNxH89O0j3KRzNB1xhFi2shTuYor9OuokHU9BiNJEchYHEPThtUihqa+GqWE8JWs73vcfRN1tzaL/w6LlgldO200aiw2s4vM7ICZHTKznTHHrzOzB8PwhJm9GDl2PHJsXx3yVKVpw2oRQ1NZo5SPBikhmqJIfs9aOjVuzE1SfbnocqveOm3ENROKBGCGYOWxs4E1wEPAuSnn/ylwc2T/p0Wf2XTXkHPNjhps2kYgu4IYEkXze1Z3a571Sqp00XY5IpmmbATAe4A7I/tXA1ennP9/gA9F9r1UBE1TJDMUzTiyK4ghUTS/l11DYFJB9LFy1aQiuBS4KbJ/BfD5hHNnCdY2nonEvQosA/cBl+R55jQogibp2iAlRJuUye9plaskRTH2EoITU9j3ZY6hMUmKoO1xBJcBtzvnjkfiZl1gvPg48Dkze2vchWa2w8yWzWx5ZWWlDVl7S5XBLkL0jTL5ffv2wDj72mvBb3Q8TdKYmxtuONHHfzwswbwZB1CROhTBs8CZkf0zwrg4LgO+HI1wzj0b/h4G7gXOj7vQObfHOTfnnJvbuHFjVZmngiQDmbcGKSEaoIn8nqQoyk7e2PYA0sLENROKBGA1cBg4ixPG4nfEnPc24AeE8xuFceuBteH2BuAgKYbmcVDXUHY/Zx+nyBWiLHXk9zz3KNsN5csAUpocUAZsBZ4g8B7aFcZdA1wcOeezwLUT170X2B8qj/3AlXmeJ0UQLJwjg7AQyRR1yMhTAJdxxPBpAGmjiqDtMHRFsLgYn1lkEBYioG6X0rL3dS5/K6KN7zpJEWjSuRR8HZSV1h8pg7AQxfvy0waZRcuBXbtgfr7Y5I15jNnj0cxF71EbcdrB99DWgDJfB2WlDXjxQT4huqZoX35Si2A0ql4OxJUla9YE9x53WyV19bZlI1CLIAGfl3ZMqh2MRppWWggo7lKa5HkE1cuBSXfU0Sgo4o8eDX6feirYTqKN6eKlCBLImo+kS5Iy7fXXdyOPEL5R1KU0aezAsWPx5xctB6LuqG98I/z85/mum51tp3InRZBAWo2ia9uBFpkRIp0y30jc2IEmBmfmVSKtjv2J6y/yPXRpI6hrXnIhhP80YStMs0fEubvWOSYI2QiKkVSjuOMOf20HQoh6aaL1nda1G22RAGzYAJdf3vzSllIEMYy7fq64Iti/9dYTTUWfbQdCiPpJm5eoTDdxknKBE/fasAE++cl4I3ITFU8pggmyFpfWhG5CCKi2EP2kcoGT73X0aLpBue6K5yAVQZoWz3IbrWuCq64NzkKIatTpYh53rzRqr3jGGQ58D1WMxVnGnzwDUaoab3werCaEyEed634UWRWtSlmBFq8PyFo8uo3FpbtewFoIUZ06v+Oke00yGgVG5bLG6kYXr+8TWcbeNubyl8FZiP5TZ1kRd681a4KCf2xQXlyEF15oZrzQ4BRBlrG3jcFaMjgL0X/qLCvi7nXzzUHBH+etVDtx/UW+hyZtBHWSZEuQjUCIYeDbAlFoPYITtPFytIKYEMPGxwpfo4oAuAg4ABwCdsYc/wSwAjwYhj+KHJsnWKLyIDCf53l9WJim6ZWGhBB+U6QMaKtimKQIVlftWjKzGeALwIeAI8D3zGyfc+6xiVNvc859auLa04D/BswBDnggvPbHVeXqGhmEhRg2ecuA8cC08TiC8cA0aG8iyTqMxe8CDjnnDjvnfgZ8BdiW89qPAHc5546Fhf9dBK2L3iODsBDDJm8ZkDUwrY3Bp3UogtOBZyL7R8K4SX7HzB42s9vN7MyC12JmO8xs2cyWV1ZWahC7WdpwQxVC+EveMiBrmcyy01gUoS330X8Etjjnfo2g1r+36A2cc3ucc3POubmNGzfWLmDdaM0AIYbN9u3B+sYzM8H+zEywP1kGpLUc2lopsQ5F8CxwZmT/jDDuFzjnjjrnXgl3bwIuyHttn0mbtVAIMd0sLcHevXD8eLB//HiwP1mbT2s5tGVrrEMRfA84x8zOMrM1wGXAvugJZrYpsnsx8Hi4fSfwYTNbb2brgQ+HcUII0Wvy1ubTeg/asjVW9hpyzr1qZp8iKMBngJudc4+a2TUErkr7gP9iZhcDrwLHCNxJcc4dM7P/TqBMAK5xziWsEiqEEP0hae6guPjt2+N7DHbvPtmjCJqxNQ5u0jkhhGiD1atPdAtFmZmBV1/Nf5+lpaAV8fTTQUtg9+76J52r3CIQQghxKnFKIC0+iaTWQp0MbtI5IYRog9nZYvFdIkUghBAN0KexRFIEYrqpa1im1hYVBenTWCIpghj0zU8JdQ3LbGt4p5g6+jKWSF5DE0xOAAVBc85XTS5SqGstQa0tKqYELVWZk7aGdIsWKDIsM60ZqKlkxZQjRTCBvnkPKdtXl3dYZlbXj6aSFVOOFMEE+uY9o0r/fF63jaxmYJ/cP4QogRTBBPrmPaNKX11et42sZmDd7h/yRhAZtJ5F4pYt8z00vVSl1hP2CLP49f7M6ntGm+uK+riQrfCKJrMICUtVqkUQQ19cvgZBHX11WdWrss3AMtU2eSOIDDrJInHawffQh8XrRU1UrR7lvT6pGZgWX0auNlo4otc0mUVIaBF0XqiXCVIEA6NKX12Vbp+0wr7sfdvshhK9pMkskqQI1DUk/CGpq6VKX10Vf+C0NnrZ+8obQWTQRRaRIhB+0NQ0DlVsDGmFfdn79mkCGtEJnWSRuGZC0QBcBBwADgE7Y45/GngMeBi4B5iNHDsOPBiGfXmep66hKaSp9nAVG0OaTPL+ET2EprqGzGwG+ALwUeBc4GNmdu7Eaf8PmHPO/RpwO/A3kWMvO+fOC8PFVeURPaWpId1VqldpbfS0+9bhBK6xBqJN4rRDkQC8B7gzsn81cHXK+ecD/zuy/9Oiz1SLYArxwYgaZ5Quaqiuo6Wg1oZoCBo0Fp8OPBPZPxLGJXEl8M3I/uvNbNnM7jOzS5IuMrMd4XnLKysrlQQWHtK1ETXJRgHFDNV1OIHX6UiuloXIQ5x2KBKAS4GbIvtXAJ9POPdy4D5gbSTu9PD3bOAHwFuznqkWwZTS9pDu6PNmZuppkdThBJ50DygmS56WhYbRDwqaGkdAzq4h4ELgceDfpNzrFuDSrGdKEQyQMgVWWlfPuHBOKnDLjuKpo4sr6R5m9Y6hUBfU4GhSEawGDgNnAWuAh4B3TJxzPvAkcM5E/Ppx6wDYABwEzs16phRBDylb81xcdG40OrUwyyqw4gq5NWuce93rsgv/pAI8z3+oy0aQpKSKKJSs1okPdhnRKo0pguDebAWeCAv7XWHcNcDF4fbdwI+YcBMF3gvsD5XHfuDKPM+TIugZZQvHuOvyFlhJhVyREJWxyH+oo7uljhZKVkGv6S4GR6OKoO0gRdAz6p6OIU+BlafbJy2sWnVyAd527TnP87IUzsJC/D0WFrr5T6JzkhSBRhaL5ik7RiBuneAoaaN4q64k9NprJ++3vXRdkhfV1q2B948ZXHFF+kjsO+6Iv/c4vmtPLeENUgSiecpOxzAzk3wsq8DavTsoLKsQdddse+m6uAFr8/Owd+8JBencyddMupi2veCO6C9xzQTfg7qGekZZG0Fa102efvesbqXZ2eTuk8muJx88bPLYPaIyq+tHTIC6hkRnlK15zs4mx+eptaZdPx4gdsMNMBrFnxet7ftQe87TDRWVWV0/Ii9x2sH3oBbBQGhzUZqua/t5yGoRFFlwRwwS5DUkeknVgizv9X0oMOMU1tg7qk2Z+5BWIhYpAjFdDLUw6vp/96X1JGJJUgQWHOsXc3Nzbnl5uWsxRFeMJ4iLTsy2bp08XppmaSnwXDp+/NRjs7OBzUV4jZk94Jybm4yXsVj0jzpn5xT5GCvfOCUAzY2nEK0gRSC6p+hUyW0P7ppm8qZ9nPKN4pymue4xUgSiW8qsVdz24C6fqbLeQJG0z6Nk61pnWrRPnOHA9yBj8RRRZtBTnwyWTRp3s9Ih69lF0r7IJH4asOYtyGtIeEnZGTC79p7JQ9MKK60gz/PsImmfNRNskXcnOiNJEchrSHTLli3xk8tNgxdK0/9t1apT5xuCYOTz5s3Zzy4q39JSYCt4+ung/j/9KRw9mv960TnyGhJ+Ms3TIDRt1E6zleR5dtG037795PWbr79+et/dwJAiEN3S5Rw+TS/s3rRRO60gz/PsImkfl1Y+zL8k6iGuv6hoAC4CDgCHgJ0xx9cCt4XH7we2RI5dHcYfAD6S53l12Aj60MUsGqSNhd3bMGonyVjns/tknBep0OCaxTMES1SezYk1i8+dOOePgRvD7cuA28Ltc8Pz1xKsefwkMJP1zKqKQPlatLawe5c1jjqevbjo3MxMelqJ3pCkCCobi83sPcBnnXMfCfevDlsafxU5587wnO+Y2Wrgh8BGYGf03Oh5ac+saiyeZvukyEmaofW115RJIH4qjyjjtBK9oUlj8enAM5H9I2Fc7DnOuVeBnwCjnNcCYGY7zGzZzJZXVlYqCayBqSKzD71KJmna9tAWWaOJhziAb0rpjbHYObfHOTfnnJvbuHFjpXtpYKrI9Jgpm0nKjJT2lTSlJ++gqaIORfAscGZk/4wwLvacsGvoV4CjOa+tnWn2WPQW32rJWR4vZTPJNE2Il6T0ZmaCtAK/3qkoT5zhoEgAVgOHCYy9Y2PxOybO+RNONhZ/Ndx+Bycbiw/TgrHYOXkNtUoZw6sPL2hh4YShdGYm2M+i7EhpH0l7b/K46CU0OcUEsBV4gsDrZ1cYdw1wcbj9euBrBG6i3wXOjly7K7zuAPDRPM/TFBOeklR4F51PyIdCpqwM07ZgfNF3OjOj2pXHNKoI2g5SBB6SVnAWrSX7UJiWlcEXJdZ0ayrpnaqF4DVJikBzDYl6SHO3hGKumFmunW1QRYbJOXl2725vtG1bq7clve9JhuRu2wM015BoljR3y6KGVx/curJkSDN+T87J0+aUC0nG6ssvr9egG/dO45BPdj+Iayb4HtQ15CF5Rurm7a7wpXuliKEUnBuNuu8KyeqyqTMdo+9Uo497AbIRiEapu/D2wWuoqKHUh37xPAvINFE4+6C8RSZSBKJ5fCi82yCr1t1lLTjvAjJNPXsI77/HJCkC2QhEfXTZN94mWbaKLvvFowPlkpiZSb9H0cF/4/OvuCLYv/XW6X7/U4gUgRBFyTKUdj1XyVghJ3H8ePKxolNkTNOUGh7R9kB8KQIhspj8KiGodY9Gp57b5lwlWaVFUqsgrbVQdIqMaZpSwxM60a1x/UW+B9kIRCPE9XFnGUG76hfPu7BOUQNu2uC/uP86TVNqeEKT4ynRgDIhUkgaiPWGN/i5QHve9RKKDm5Luu9oBC+/3J/06TFNjqfUgDIxDMp2riZ1ccQVctD9QKm86yUUNeAnDf6D+PSJHo+er6l8S9PFeEopAjE9VOlcLVqwd20Qbqq0SJqe+9ix+POPHdMC9jXTyTT5cf1FvgfZCEQsVTpXk64djaoNlCpjQ8hzTdsDuHyYCHDKib720SgIdZue0IAyMfVUMVxmTSlRxiBcprBeWDj1fyRd06ahWiOHG6Wt5JUiENNP1Vpr3QVrmXUYkpSZDzVvjRxujLYaXEmKQF5Dwn/yer60NQVzXoq6f6RN7dzmFNyiddqaeb0RryEzO83M7jKzg+Hv+phzzjOz75jZo2b2sJn9fuTYLWb2fTN7MAznVZFHTCFFDMBZ6xC3TVGDbprBumvjtGiUrmder+o1tBO4xzl3DnBPuD/JS8AfOOfeAVwEfM7M3hQ5/ufOufPC8GBFecS0UXTkqk/zHdW1DoOZ3DGnnE48hSJUVQTbgL3h9l7gkskTnHNPOOcOhtv/AjwPbKz4XNF38vr75/WX94Xo/9q1C+bn87dQ4koDM7jqqmA7Kb3anphG1E7njdk4w0HeALwY2bbofsL57wIeB1aF+7cQLFr/MHAdsDbl2h3AMrC8efPmei0ool2KuEj0yW2xDtePotNcyJtnKmjLDk9ZryHgbuCRmLBtsuAHfpxyn01hof/uiTgD1hK0KP4iSx4nr6H+U6Rw71NB15TSSrtvnxSliKXN6axKK4K0EBbsm1ykoE8475eB/wtcmnKv9wP/lOe5UgQ9p6i/f1/cFpuagC3tvpr0rfek6fK660FJiqCqjWAfMB9uzwPfmDzBzNYAXwf+3jl3+8SxTeGvEdgXHqkoj+gDRVwkik6a1iVNuX6k3bdrdxNRmTQzWFuzfFdVBNcCHzKzg8CF4T5mNmdmN4Xn/B7wPuATMW6iS2a2H9gPbAD+sqI8og/kdZGoY2L2Ng2pTbl+pN23SFrKoOwlabq8NV+JuGaC70FdQ1NAnu6eOkYKt21faKobK+2+Wc/sk51lgKS9nrpNQGhksegdScMtITk+St45+6cdpYP3JPWA1j1YXusRxKDWsuekDbCqMrW0r2MQmkLp4D1J4yDH4wuiq6K+4Q31P3+wikBrbveA3buDQn8S5/JZy2RIDVA69J6XXz6xffRo/WXVYBWB1tzuAdu3J3cB5anNdj1uvwnKNGOnMR0GRBtl1WAVgVrLPWF2Nj4+T22283H7NVO2GTtt6TAw2iirBmsslv2sJ/g2tXSXKNMOkjpfu4zFE6i13BNUmz2BmrGDpI2yarCKQOVLj/BpaukukdF3kLRRVg1WEUBy+SK3UuElasZOHXnLmqbrQqvrvV3/meySHtvjYLgVUeEJ4wzYl7mXRCo+lTWDNRYnIXucEKINuihrZCzOiexxQog28KmskSKYQPY4IUQb+FTWSBFMIHucEKINfCprpAgmkFupEKINfCpr5DUUw/btKviFEM3g46J7lVoEZnaamd1lZgfD3/UJ5x2PrE62LxJ/lpndb2aHzOy2cFlLIYToBUXHHPk663HVrqGdwD3OuXOAe8L9OF52zp0Xhosj8X8NXOec+3fAj4ErK8ojhBCtUKZQ93XW46qKYBuwN9zeS7AAfS7CBes/CIwXtC90vRBCdEmZQj3LZbSrWQ2qKoI3O+eeC7d/CLw54bzXm9mymd1nZpeEcSPgRefcq+H+EeD0pAeZ2Y7wHssrKysVxRZCiGqUGQeQ5jLaZbdRpiIws7vN7JGYsC16XrgwctIw5dlwNNvHgc+Z2VuLCuqc2+Ocm3POzW3cuLHo5UIIUStlxgGkuYx22W2UqQiccxc65/5DTPgG8CMz2wQQ/j6fcI9nw9/DwL3A+cBR4E1mNvZcOgN4tvI/EkKIFigzDiDNZbTLkcZVu4b2AfPh9jzwjckTzGy9ma0NtzcAvw48FrYgvg1cmna9EEL4SN5xAJP9/hA/k2iXI42rKoJrgQ+Z2UHgwnAfM5szs5vCc94OLJvZQwQF/7XOucfCY58BPm1mhwhsBn9XUR4hhGiEOENu1vTQRfr9Ox1p7JzrXbjgggtcURYXnZuddc4s+F1cLHyLXPep6zlCiO4Zf88QfNNBcR6Edeuyv+/xtZNhdjb9eU2VH8CyiylTOy/Uy4SiimBxMXhp0Rdh5tzCQqHbxN4nmhmyjgsh+kPc95y3QB8zqTyi5U8XJCmCQaxHkDTvtxncemv+4d1Z84drLQMhpoek7zmKWdAtVPQeXZUJg16PIMnq7lwx16wsq75P84sLIaqR57vNMuQm9ftv3erXcriDUARpL6tIIZ1l1fdpfnEhRDWyvts8htw4z6L5edi716/5hgahCHbvDl5CHEUK6Syrvk/ziwshqhH3PY/LkSJTRk96Ft1xh4fzDcUZDnwPZbyGFhbSrf4LC87NzATxMzPJhmR5DQkxHJr4nrs0IDNkr6ExSS91YSH+xRT1KqoDKRIhpoOkb7moS2mdJCmCQXgNZbF6NRw/fmr8zAy8+uqp8U0xHnwSbTauW6cV0oToG2nfMnT3nQ/aayiLOCWQFt8Uvs5VLoTIJjryeH4++Vv2aYnKMWoR4E+LYNWqoJE4SZavshCiW+JaAHF0/S2rRZDCjh3F4ptC7qdC9JO41nwcvn7LUgTADTfAwkLQAoDgd2EhiB/TxspBcj8VohpdrfCVZzxS2rfcldy/IM6C7Hso6zVUljxzDNXl6SOvISHK0eVcX0meQFGPoCQ52pQbeQ2VJ22+kN275ekjhA90Oa/P0hJcfnn8MZ/mI0qyEUgR5CDNiLt5c/xLHI3ghReal00IEZD0nULwPR47Fnyvu3c3U0nbsAGOHj01PqtAb9NJpBFjsZmdZmZ3mdnB8Hd9zDkfMLMHI+FfxwvYm9ktZvb9yLHzqsjTFGlG3KS+waNHu59ISoghkWaIPXq0+Xl9rr++nI3PByeRqsbincA9zrlzgHvC/ZNwzn3bOXeec+484IPAS8D/iJzy5+PjzrkHK8rTCGlG3LSXJf9/Idoj7juNo6mxOWXHB3jhJBJnOMgbgAPApnB7E3Ag4/wdwFJk/xbg0qLPbdtY7FyyEXdxMdlAFDd3SPQ+o1EQZBgWoh7SvkcfFoZJoi0nEZqYawh4MbJt0f2E878F/KfI/i2hMnkYuA5Ym+e5XSiCNEajZE+BKFkrHjXp4SBvJDEUsjx4xhNLDvEbKK0IgLuBR2LCtsmCH/hxyn02ASvA6ybiDFgL7AX+IuX6HcAysLx58+YWkiw/ed2/8mTQJiae0hKaYkjkWWJyqN9AUy2C3F1DwH8F9qQcfz/wT3me61uLwLl8Ne6k6WebbrJ2OduhEF0w2QW7apW+AeeSFUFVY/E+YD7cnge+kXLux4AvRyPMbFP4a8AlBC2NXjK5+EScgSiPF0ATngJaQlP0gTpH10a/xxdeSHYr1TcQUFURXAt8yMwOAheG+5jZnJndND7JzLYAZwL/c+L6JTPbD+wHNgB/WVEer8nyamjKU8AH9zQh0hhP2tbU8o36BjKIayb4HnzsGspLF15DshEI36mj+zKte9b3b6DXXkNdhT4rgq6Q15DwmarLN+Yp6BcXT/bwG438+A4011BJ2p5iQgjRLFXn28lzva8rAJadmqIMWo9ACOEtVUfX5nGI8HEFwKWleCUA7RqypQiEEJ1TdfnGNGPw2BsprsUA3XoOpSmhPs01JGqi84UphKiJsnk5jwt2Ekktiq1bT3gjJdGl51CaEmpzriEpAg9o2nWuTaTQppO877WrvJzUorjjjvQlJLteATBJCY1GLdst4izIvodp8xqalpG/vrvoiXIUea++5eW00fw+eM+1/c0g91F/qeo65wu+FQKiHoq8V1/y8thduok5vep2xW7TtTtJEahrqEPGzW2X4MHbt1GPmspiOinyXn0YwRvtnoqjSndQE11fVWwjdSFF0BFNZtbJ57TVZ+9DISDqp8h77XqRlaUlmJ9PtgsU9UaaxEcX1FqIayb4Hqahayir2VpH87Dt/kfZCKaTou81b1dHE10sadNP19E95UvXV1mQjcAv2shQXfTZayqL6aSNQrtqpSFrvY868n3f7WBSBJ7RRobqe+1F1I8virqJ/J/mIVRXy7Tvrd4kRSAbQUe00ZeqPnu/aXvMhU/jVZpwLEjK1zMz9c0nVHUEtLfEaQffwzS0CJxrvnbW99rLNNPFu6lSC687rzbRIlB+zwZ1DU03SR9qnR9wW90KvnRfNEkXfc1luwqbKGCbKrSHkHeq0IgiAH4XeBR4DZhLOe8igvWNDwE7I/FnAfeH8bcBa/I8V4rgZNqoCaU9o25lM4RaXRf2m7LKpymlpUK7fZpSBG8HfhW4N0kRADPAk8DZwBrgIeDc8NhXgcvC7RuBhTzPlSI4mTZql0nPGI3qLbj77pWRl648usq8KzkdTA9JiqCSsdg597hz7kDGae8CDjnnDjvnfgZ8BdgWLlj/QeD28Ly9BAvYi4K0MaI36V5Hj9Y7wGYoo5O7GHhV1tApp4Pppw2vodOBZyL7R8K4EfCic+7VifhYzGyHmS2b2fLKykpjwvaRNj7UovcqW3APpdDpyvukzHQGXY8WFs2TqQjM7G4zeyQmbGtDwDHOuT3OuTnn3NzGjRvbfLT3tPGhJj1jNIo/v2zBPaRCx4c5ZvIwtS6T4heszjrBOXdhxWc8C5wZ2T8jjDsKvMnMVoetgnG8KMj4g9y1K6iJb94cFJx1fqhJz4D4dWDLFtxt/BdRnO3b9Q6mmVoWrzeze4E/c86dsqK8ma0GngB+k6Cg/x7wcefco2b2NeAfnHNfMbMbgYedczdkPU+L1/vF0pIKbiH6QCOL15vZb5vZEeA9wD+b2Z1h/FvM7A6AsLb/KeBO4HHgq865R8NbfAb4tJkdIrAZ/F0VeUQ39KWLQwgRTy0tgrZRi0AIIYrTSItACCFE/5EiEEKIgSNFIIQQA0eKQAghBk4vjcVmtgIkrPabygbghZrFqQPJVRxfZZNcxfFVtmmUa9Y5d8qI3F4qgrKY2XKcxbxrJFdxfJVNchXHV9mGJJe6hoQQYuBIEQghxMAZmiLY07UACUiu4vgqm+Qqjq+yDUauQdkIhBBCnMrQWgRCCCEmkCIQQoiBM3WKwMx+18weNbPXzCzRxcrMLjKzA2Z2yMx2RuLPMrP7w/jbzGxNTXKdZmZ3mdnB8Hd9zDkfMLMHI+FfzeyS8NgtZvb9yLHz2pIrPO945Nn7IvGNpFde2czsPDP7TvjOHzaz348cqzXNkvJM5PjaMA0OhWmyJXLs6jD+gJl9pIocJeT6tJk9FqbPPWY2GzkW+15bkusTZrYSef4fRY7Nh+/9oJnN1ylXTtmui8j1hJm9GDnWSJqZ2c1m9ryZPZJw3Mzsb0OZHzazd0aOVUuvuIWM+xyAtwO/CtwLzCWcMwM8CZwNrAEeAs4Nj30VuCzcvhFYqEmuvwF2hts7gb/OOP804BiwLty/Bbi0gfTKJRfw04T4RtIrr2zAvwfOCbffAjwHvKnuNEvLM5Fz/hi4Mdy+DLgt3D43PH8tcFZ4n5kW5fpAJB8tjOVKe68tyfUJ4PMx154GHA5/14fb69uUbeL8PwVubiHN3ge8E3gk4fhW4JuAAe8G7q8rvaauReCce9w5dyDjtHcBh5xzh51zPwO+AmwzMwM+CNwenrcXuKQm0baF98t730uBbzrnXso4rypF5foFDadXLtmcc0845w6G2/8CPA80sZZpbJ5Jkfd24DfDNNoGfMU594pz7vvAofB+rcjlnPt2JB/dR7AaYNPkSa8kPgLc5Zw75pz7MXAXcFGHsn0M+HKNz4/FOfe/CCp/SWwD/t4F3EewwuMmakivqVMEOTkdeCayfySMGwEvumAxnWh8HbzZOfdcuP1D4M0Z51/GqZlvd9gkvM7M1rYs1+vNbNnM7ht3V9FsehWRDQAzexdBDe/JSHRdaZaUZ2LPCdPkJwRplOfaJuWKciVBrXJM3HttU67fCd/P7WY2XtK2yfQqdP+wG+0s4FuR6KbSLIskuSunV+aaxT5iZncD/zbm0C7n3DfalmdMmlzRHeecM7NEv91Qy/9HglXdxlxNUBiuIfAj/gxwTYtyzTrnnjWzs4Fvmdl+goKuEjWn2a3AvHPutTC6dJpNI2Z2OTAH/EYk+pT36px7Mv4OtfOPwJedc6+Y2X8maE19sKVn5+Uy4Hbn3PFIXJdp1gi9VATOuQsr3uJZ4MzI/hlh3FGC5tbqsEY3jq8sl5n9yMw2OeeeCwut51Nu9XvA151zP4/ce1wzfsXMvgT8WZtyOeeeDX8PW7BG9fnAP1AhveqSzcx+GfhngorAfZF7l06zGJLyTNw5RyxYq/tXCPJUnmublAszu5BAuf6Gc+6VcXzCe62jUMuUyzl3NLJ7E4FNaHzt+yeuvbcGmXLLFuEy4E+iEQ2mWRZJcldOr6F2DX0POMcCj5c1BC97nwssL98m6J8HmAfqamHsC++X576n9EmGBeG4X/4SINazoAm5zGz9uFvFzDYAvw481nB65ZVtDfB1gr7T2yeO1ZlmsXkmRd5LgW+FabQPuMwCr6KzgHOA71aQpZBcZnY+8EXgYufc85H42PfaolybIrsXE6xpDkFL+MOhfOuBD3Ny67hx2UL53kZgfP1OJK7JNMtiH/AHoffQu4GfhJWd6unVhPW7ywD8NkEf2SvAj4A7w/i3AHdEztsKPEGgyXdF4s8m+EgPAV8D1tYk1wi4BzgI3A2cFsbPATdFzttCoOFXTVz/LWA/QWG2CLyxLbmA94bPfij8vbLp9Cog2+XAz4EHI+G8JtIsLs8QdDVdHG6/PkyDQ2GanB25dld43QHgozXn+Sy57g6/hXH67Mt6ry3J9VfAo+Hzvw28LXLtH4bpeAj4ZJ1y5ZEt3P8scO3EdY2lGUHl77kwPx8hsOdcBVwVHjfgC6HM+4l4RVZNL00xIYQQA2eoXUNCCCFCpAiEEGLgSBEIIcTAkSIQQoiBI0UghBADR4pACCEGjhSBEEIMnP8PNRUZ2fYpuekAAAAASUVORK5CYII=\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -221,7 +221,7 @@ ...@@ -221,7 +221,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -242,10 +242,10 @@ ...@@ -242,10 +242,10 @@
], ],
"source": [ "source": [
"# Set parameters\n", "# Set parameters\n",
"Ntrain=200 # Specify the training set size\n", "Ntrain = 200 # Specify the training set size\n",
"Ntest=100 # Specify the test set size\n", "Ntest = 100 # Specify the test set size\n",
"boundary_gap=0.5 # Set the width of the decision boundary\n", "boundary_gap = 0.5 # Set the width of the decision boundary\n",
"seed_data=2 # Fixed random seed\n", "seed_data = 2 # Fixed random seed\n",
"\n", "\n",
"# Generate data set\n", "# Generate data set\n",
"train_x, train_y, test_x, test_y = circle_data_point_generator(\n", "train_x, train_y, test_x, test_y = circle_data_point_generator(\n",
...@@ -405,16 +405,16 @@ ...@@ -405,16 +405,16 @@
" :param theta: parameter\n", " :param theta: parameter\n",
" :return: Y rotation matrix\n", " :return: Y rotation matrix\n",
" \"\"\"\n", " \"\"\"\n",
" return np.array([[np.cos(theta/2), -np.sin(theta/2)],\n", " return np.array([[np.cos(theta / 2), -np.sin(theta / 2)],\n",
" [np.sin(theta/2), np.cos(theta/2)]])\n", " [np.sin(theta / 2), np.cos(theta / 2)]])\n",
"\n", "\n",
"def myRz(theta):\n", "def myRz(theta):\n",
" \"\"\"\n", " \"\"\"\n",
" :param theta: parameter\n", " :param theta: parameter\n",
" :return: Z rotation matrix\n", " :return: Z rotation matrix\n",
" \"\"\"\n", " \"\"\"\n",
" return np.array([[np.cos(theta/2)-np.sin(theta/2) * 1j, 0],\n", " return np.array([[np.cos(theta / 2) - np.sin(theta / 2) * 1j, 0],\n",
" [0, np.cos(theta/2) + np.sin(theta/2) * 1j]])\n", " [0, np.cos(theta / 2) + np.sin(theta / 2) * 1j]])\n",
"\n", "\n",
"# Classical -> Quantum Data Encoder\n", "# Classical -> Quantum Data Encoder\n",
"def datapoints_transform_to_state(data, n_qubits):\n", "def datapoints_transform_to_state(data, n_qubits):\n",
...@@ -540,9 +540,9 @@ ...@@ -540,9 +540,9 @@
" # The default depth is depth = 1\n", " # The default depth is depth = 1\n",
" # Build the entangleed layer and Ry rotation layer\n", " # Build the entangleed layer and Ry rotation layer\n",
" for d in range(3, depth + 3):\n", " for d in range(3, depth + 3):\n",
" for i in range(n-1):\n", " for i in range(n - 1):\n",
" cir.cnot([i, i + 1])\n", " cir.cnot([i, i + 1])\n",
" cir.cnot([n-1, 0])\n", " cir.cnot([n - 1, 0])\n",
" for i in range(n):\n", " for i in range(n):\n",
" cir.ry(theta[i][d], i)\n", " cir.ry(theta[i][d], i)\n",
"\n", "\n",
...@@ -759,9 +759,9 @@ ...@@ -759,9 +759,9 @@
" ax = fig.add_subplot(111)\n", " ax = fig.add_subplot(111)\n",
" x_label = np.linspace(-0.9, 0.9, 3)\n", " x_label = np.linspace(-0.9, 0.9, 3)\n",
" y_label = np.linspace(0.9, -0.9, 3)\n", " y_label = np.linspace(0.9, -0.9, 3)\n",
" ax.set_xticks([0, Num_points // 2, Num_points-1])\n", " ax.set_xticks([0, Num_points // 2, Num_points - 1])\n",
" ax.set_xticklabels(x_label)\n", " ax.set_xticklabels(x_label)\n",
" ax.set_yticks([0, Num_points // 2, Num_points-1])\n", " ax.set_yticks([0, Num_points // 2, Num_points - 1])\n",
" ax.set_yticklabels(y_label)\n", " ax.set_yticklabels(y_label)\n",
" im = ax.imshow(heat_data, cmap=plt.cm.RdBu)\n", " im = ax.imshow(heat_data, cmap=plt.cm.RdBu)\n",
" plt.colorbar(im)\n", " plt.colorbar(im)\n",
...@@ -799,15 +799,15 @@ ...@@ -799,15 +799,15 @@
" # Run forward propagation to calculate loss function\n", " # Run forward propagation to calculate loss function\n",
" loss, train_acc, state_predict_useless \\\n", " loss, train_acc, state_predict_useless \\\n",
" = net(state_in=input_state, label=train_y[itr * BATCH:(itr + 1) * BATCH])\n", " = net(state_in=input_state, label=train_y[itr * BATCH:(itr + 1) * BATCH])\n",
" if itr% 50 == 0:\n", " if itr % 50 == 0:\n",
" # Calculate the correct rate on the test set test_acc\n", " # Calculate the correct rate on the test set test_acc\n",
" input_state_test = paddle.to_tensor(datapoints_transform_to_state(test_x, N))\n", " input_state_test = paddle.to_tensor(datapoints_transform_to_state(test_x, N))\n",
" loss_useless, test_acc, state_predict_useless \\\n", " loss_useless, test_acc, state_predict_useless \\\n",
" = net(state_in=input_state_test,label=test_y)\n", " = net(state_in=input_state_test,label=test_y)\n",
" print(\"epoch:\", ep, \"iter:\", itr,\n", " print(\"epoch:\", ep, \"iter:\", itr,\n",
" \"loss: %.4f\"% loss.numpy(),\n", " \"loss: %.4f\" % loss.numpy(),\n",
" \"train acc: %.4f\"% train_acc,\n", " \"train acc: %.4f\" % train_acc,\n",
" \"test acc: %.4f\"% test_acc)\n", " \"test acc: %.4f\" % test_acc)\n",
"\n", "\n",
" # Store accuracy rate and other information\n", " # Store accuracy rate and other information\n",
" summary_iter.append(itr + ep * N_train)\n", " summary_iter.append(itr + ep * N_train)\n",
...@@ -861,7 +861,7 @@ ...@@ -861,7 +861,7 @@
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "iVBORw0KGgoAAAANSUhEUgAAATsAAAD5CAYAAABYi5LMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAg6klEQVR4nO3de5BkZ3nf8e/TPd1z2dnZXe0FARISBJEgAhGxYlyhKlBWIhb+QGA5sUQlEQmxcgE7sYOrrIoruEQRhEMZkypiI2M5wlU2UHIVJSokimyhsstczGKwiOQAkrCxFqHV3rU7l749+aPPLK3Zfp9z+jLbp6d/n6qunZm3z2W6zzx7znmffh5zd0REdrrKpHdARORSULATkZmgYCciM0HBTkRmgoKdiMwEBTsRmQlzgy5gZoeBjwJV4BPufteW8auAe4CDwEngn7r7U3nrrS6ueG33ob5jlYrF+xSMW7RoMBgu133GUMuGq83ZpkVPGHabOYZddpSEpnDZYDAvjSoajZaNVpu7zU6w3mCsE421m+E2O81G/5+vn8Gba6McDlRWrnBa64We62snHnD3w6Nsb5wGCnZmVgU+Bvwj4Cngq2Z2v7s/1vO0DwOfdPd7zezHgQ8C/yxv3bXdh3jJT32479jCUi1ctj6f/jXm6umT17laNTlWqcYnvdW59Hg4FkTCak5Qj8aHHcsz7LLt4I91lGWjsUarE6632U6Pd4JlW812epsbrXibG+llN9bSQWvtuY302Olnwm2eP/a9vj9f/bNPhssV0t6g9sq3F3pq488+cWD0DY7PoJexPwo87u5PunsD+BRw05bnXAs8lH39hT7jIjLFrFIt9CibQYPdi4G/7vn+qexnvf4c+Ins67cDu81s/3C7JyLlYjMT7Ip4L/AGM/s68AbgKND3XN7MbjezI2Z2pL12dht2RUTGyqY32A06QXEUuLLn+yuyn13g7t8nO7Mzs2XgZnc/3W9l7n43cDfAwqGX60O6IiVnZlRr9UnvxlAGDXZfBa4xs5fSDXK3AO/ofYKZHQBOunsHuIPuzKyI7BBlPGsrYqBg5+4tM3sP8ADd1JN73P1RM7sTOOLu9wNvBD5oZg78EfDuIuuuzc/x4r9xWd+xlxzcFS57aGU+GFtIjq0spH/9pWCmFmA+mK2dD2ZjF4KxWiW+q1CrpmdGo2VzVhuKZo8j7RGq6TTb6WWbwWxsNNsKsBHMuK4GM67nGumx5xrxbOyxs+lZ1adPryXHvndiNTl2+thKuM3jK/0nQRuP3hcuV0h2GTuNBs6zc/fPA5/f8rP/3PP1fcAYXlURKRsDbJT/PSdo4GAnIrNshs7sRGSGzdJlrIjMMDMqMzIbKyIzrHvPTmd2IrLTTfFl7HROq4jIhBiVSrXQI3dNZofN7Ftm9riZ/WKf8ZeY2RfM7Otm9oiZvaVn7I5suW+Z2ZuK7HlpzuyW5qu85qq9fceufVGcV3T5cjrP7sBS+v7CniDPbjHIhwNYmEvnn9WDfLh6UEVkLq/qSTTcSed7WTBGJ85NG61YUyBIX/BKusqNV9LvWTPnV2kEeXgbQW7fWrDi1Vb8+jxzLp1n94Ng7Mkgz+6RxbgKUKpKy7Gc3NFCbDyXsQUrKP0S8Bl3/3Uzu5ZuytvV2de3AK8CXgT8gZm9wt3TCZGUKNiJSPkZRmVuLBMUFyooAZjZZgWl3mDnwOaZzh7g+9nXNwGfcvcN4Ltm9ni2vi9FG1SwE5HixnfPrl8Fpddtec4vA//HzH4G2AX8w55lv7xl2a3Vly6ie3YiMoCBqp4c2KxqlD1uH3BjtwL/w92vAN4C/I6ZDR2zdGYnIsUZWLXwmd1xd78+MZZbQQl4F3AYwN2/ZGYLwIGCy15EZ3YiUpiNr3jnhQpKZlanO+Fw/5bnfA+4AcDMXgksAM9mz7vFzOazCkzXAH+at0Gd2YlIcWO6Z1ewgtJ/BH7TzH6O7mTFO73b4ehRM/sM3cmMFvDuvJlYKFGwm5+rcM0Ldvcdu+ayuMTTC3enU0/2zKdPXpfr6Tet7v07NG2qbJxPjtlGOm3AGumyPtaOt0kj3dXJW8GyrXRjF+/kHCO5qSkJOZUxwj+YuXRqRWV+MTlWn0sfBwCLtfSyPr+cHOss9T8uATaI00BWguPvsiCFJCohthaUnAI4drL/8VfNaSJVVHVuPGGjQAWlx4DXJ5b9APCBQbZXmmAnIuVnZmHr0jJTsBORgdiQBV0nTcFORAaS17S+rBTsRKQ4Q5exIrLzdUs8KdiJyE5nNrZZ3UutNMGuVq1weSKFJEotATi4lE5jWK6kK35Uzh9Pj62dCbdpq+nxzrnTybH2+XQzcF9Lp7MAdNbTKS0epaU002kpntORy4dMPclrylKpBykbQeqJ1dPd4iq74uo4lSCFpLJnf3psuX/Xu+4694XbnF8+mByLOrc12+k0meOr6VQigEcSVYAqYdmc4nRmJyI7npkmKERkRgz/UfzJUrATkYEoz05Edjwzo5pTxbusFOxEZCCaoBCRnc+gosvY0cxVLNkcJ6ocAXF6SfXsM+mx1ZPJsdbxp8Ntdk4dS461o9STc+eSY42z6dQSgOb5dHpJaz3dvKXTTL8+nUbQjIftTD1JH3qVWnqstiuoerKyFG5zfm+QerKSTj2p7r88PXbwReE28fTrt2/5BcmxtVb6NTiwFFdauWy5/9/RXM57UoSSikVkRqjqiYjMginOs5vOaRURmQij+0mMIo/cdeU3yf6ImX0je3zbzE73jLV7xraWc+9LZ3YiUtyYzuyKNMl295/ref7PAK/tWcWau183yDZ1ZiciA7GKFXrkuNAk290bwGaT7JRbgd8bZb8V7ERkANYtzV7gkaNfk+y+ja7N7CrgpcBDPT9eyHrRftnM3lZkz3UZKyKFDVgI4ICZHen5/m53v3uIzd4C3Lelg9hV7n7UzF4GPGRm33T3J6KVlCbYzVUs2W1puZaTs7WWzpcLc+l+8L302Ik4z651Ml0eau1EuozTxunnkmN5eXatMM8uXfanuRbk2TVzO9ANxXJuUEd5eLXFKM8uXe6rvjsnz25fOs9u8WC6vNZ8UD6LnO5s1Wr/nDeAWj3dNW9X0AltX9CVDGBvIg+vOqZZ1AFST0Ztkr3pFuDdvT9w96PZv0+a2cN07+eFwU6XsSJSmBnU5yqFHjmKNMnGzP4WsA/4Us/P9pnZfPb1AbrtFh/buuxWpTmzE5HyM2wsZ4gFm2RDNwh+KmuOvemVwMfNrEP3hO2u3lncFAU7ESnOxnc5nNckO/v+l/ss90Xg1YNuT8FORAozxhfsLjUFOxEpzKw7mTiNFOxEpDAzKzL5UEqlCXYGzCfSFeYr3vfnm6JOYO2oFFMw1ng2PQawdux0euzZU8mxjdPpEk/rZ9JlmgA2zqbHW+vp9JJWkHrinfi17eR0H0up5LTbi9IX5oLUk/mVdOrJ/EqQIgK01qMua8Ol4ETdzgAqu9PdxyqLe5JjS7vSaSm7g/JYAMsL25d60r2MVbATkRmge3YisuPZGGdjLzUFOxEpbFx5dpOgYCciA6mqB4WI7HSbHxebRgp2IlKY8uzGwMyoJ1JPbCOdrgFQaaQrVjSfO50ca585kRxbDyqXQJxesnosnQqzdiqdHrEejAE0zqdTJxrn0lVPorSUTk7qSTseTsqryj1Xq6bHFtKHZfN88HsGKTYA7cZw6SWVWrrKSH0lfQwBdIJjrLLnUHJsYSX9Ai7V068dwGJifBxXn7pnJyIzQ8FORHY8pZ6IyExQIQARmQnT/NnY6dxrEZmYasUKPfKM2Df2NjP7Tva4rch+68xORAob1z27UfrGmtllwPuA6wEHvpYtm06RoETBrmKkU09acTWQzlo69aRzPmp+k05piRrj5C0bpZesHk831dk4m04t6Y6nX4fzzXR1krWgckkzJ7Wk7cPlnuRl2S8E+7u4kU4hWYrSaIas0AJ5TX7SlU02Ti+H663uTx9/1Vb6OLF2+ljIu4qcTzyhMobckzHes7vQNxbAzDb7xqbKq99KN8ABvAl40N1PZss+CBwmp69saYKdiEyB8c3G9usb+7q+m7y4b2zhnrO9FOxEpDDDqBWvZ7edfWMHpmAnIoUZ+Z+O6bFdfWOPAm/csuzDeTuj2VgRKc6gUrFCjxxD942l237xxqx/7D7gxuxnIZ3ZiUhh3TO7yfaNdfeTZvZ+ugET4M7NyYqIgp2IDGQcs7owfN/Y7Of3APcMsj0FOxEpbMB7dqVSqmCXqpMV5RwB+HqQZxeMNc+n85waZ9P5cBB3Aovy4aJcurXTcYmnM0Fu2npQqinKs2tMqMTTWnBPZ72TvpXc9nSenZ2NN1oNykrVl6MyTuljITqGIM4BZWMtOWStKM8u3WEN0sU1x1LiyYy5nM5xZVWqYCci5aczOxHZ8Yzx3bO71BTsRKQ41bMTkVmgMzsRmRm6ZyciO56ZUdNs7Gii/B1rpTtKAXQ20tP/ndUobSA99d9ajVMKoi5Xw46da8Ulis4HKSTRsmtB/kh+6sn2lHiqB/d9hk53WY2Pk6hrWdSdrb2eTgOJxgC8kT6OojFrp/enaumSUwD1RDAaxwlZ9zJ2DCuagNIEOxGZDuP4uNgkKNiJSGGaoBCR2WAwpbfsFOxEpLgBi3eWioKdiBSmy1gRmQ26jB0DC/7H6KQrXQB4UCGi3Qy6UQVj7UZc7r61HqSXrKXXuxGsN0oRyRuPxyZR9SRvvemzgyhpNRpbyMmJ2BV0JmsFY9H72VqPO995kBblUUqVp9+zvGCT+juyMXUXm9YzuymN0SIyKWbFHvnriZtkZ8/5J2b2mJk9ama/2/Pzdk8D7YvKufdTnjM7EZkKlTGkJxdpkm1m1wB3AK9391NmdqhnFWvuft0g21SwE5HCuk2yx7KqIk2yfxr4mLufAnD3Y6NsUJexIlJcwUvYApexRRpdvwJ4hZn9iZl92cwO94wtmNmR7OdvK7LrOrMTkcIMG+QydtQm2XPANXR7xF4B/JGZvdrdTwNXuftRM3sZ8JCZfdPdn8hbmYhIYQNMxo7aJPsp4Cvu3gS+a2bfphv8vuruRwHc/Ukzexh4LTAdwS7sWhRMw0M8hR+ll3Qaw6eetBvpfYqWjVI9mjkVRqJlt2MMtq/hTiRKo6lXRvhdgvdl2LHoGALwIO3Hm0HFlCDdqpLz4m53HtyYqp5caJJNN8jdArxjy3M+C9wK/LaZHaB7Wftk1hh71d03sp+/HviVvA2WJtiJSPld4ibZDwA3mtljQBv4BXc/YWZ/H/i4mXXozjvc1TuLm6JgJyIDGVdOcV6TbHd34OezR+9zvgi8etDtKdiJyECmNYVDwU5ECuumlUznx8UU7ERkICrLLiIzYUpP7BTsRKS4cc3GTsJUBDvLybOjE+fEpXgnvd5OToJZJ8qfCvK9om5deTlt8bLDrTdvmzmvfFru7xKNDfe75O1rJ3hfovcsOk6iPLq8ZaeS6TJWRGbElMY6BTsRKU59Y0VkZij1RER2PJ3ZiciMMM3GisgMKNhfooyG+phbXqMMM5s3s09n418xs6tH3tMhebuTfIjIYMy98KNsBg52PY0y3gxcC9xqZtduedq7gFPu/nLgI8CHRt1RESkJ7xR7lMwwZ3YXGmW4ewPYbJTR6ybg3uzr+4AbbFqncETkecw7hR5lM0ywK9Io48Jz3L0FnAH2D7ODIlIm3v3EUpFHjhH7xt5mZt/JHrcV2fOJTlCY2e3A7QBXXnllzrNFZOLcx3KJOkrfWDO7DHgfcD3dDyZ+LVv2VLTNYc7sijTKuPAcM5sD9gAntq7I3e929+vd/fr9Bw4MsSsicqmN6TK2yO2wVN/YNwEPuvvJbOxB4DA5hgl2FxplmFmdbqOM+7c8535g89TyJ4GHshLLIjLtxjNBMUrf2CLLXmTgy9iCjTJ+C/gdM3scOEk3IA7NLScmV6rJIQtaLVklPZbXwakSrje9bJSQmdeRK142Grv0/8/k/y7R2HCvUd7/3JXgfYnes+g4iY6vvGWn00CXsdvSN3aA5S9a2cAKNMpYB/7xsDslIiXlDBLstqtv7FG6AbB32Yfzdman/bcjItvKsXar0CNHkdthnyULar19Y/lhi8V9WQ/ZG7OfhfRxMREZzBhmY0fpGwtgZu+nGzAB7nT3k3nbVLATkeLcu4+xrGq4vrHZ2D3APYNsT8FORAZTwk9HFKFgJyIDKeNHwYpQsBORAYznExSTUJpg5wSdo3Ly7Gyulhyr1NK/YqWeHsvLn6rW0+PVejrvrx7kc9VyaiVEy0ZjbR++BkNe97GUvDy7YX+XYccgzo2M3rNoLDqGICfPs1ZPjkW5pZ2c1m3bWr3MHTq5M62lVJpgJyLlZ+gyVkRmxZT2wlWwE5EBjC/15FJTsBOR4gb7uFipKNiJyAAc0wSFiMwEndmNyKGTuhdQyZnen0tP4Vej1JNgrLYYb3NuIZ3uEi07fz6dxrCYkzPQDFJI4vSSIOUip/xTe8j7M3m9RaM0kcUgb2UxSOWIlgOYW0i/L3EqUTAWHEMANr+QHgtSpjw45vNSS1J/R2MpKeleqOR6GZUn2InIVHDNxorIzqczOxGZBY6CnYjsfO6ON5uT3o2hKNiJyACm9zJWZdlFpDh3vNMu9MiT1yTbzN5pZs+a2Teyx7/qGWv3/HxrOfe+SnNm50ArMcnjwRQ9xNP7laWl5Fht12JybG4pvc7ushvBWJCWspZOyFxuxgfI8BVI0gs2OpNJPRk2vWRXsNzSfHw4z6+kU5TmV+aTY7Vd6WNhLjiGAKwepJ4EY15NH0PtnAOhkchNGduHvMYwG1ukSXbm0+7+nj6rWHP36wbZZmmCnYhMAy901lbAhSbZAGa22SR7a7AbG13Gikhxm7OxRR6xoo2ubzazR8zsPjPrbb24YGZHsubZbyuy6zqzE5HiBpuNHbVJ9ueA33P3DTP718C9wI9nY1e5+1EzexnwkJl9092fiFamYCciAxhoNnakJtmbbRMznwB+pWfsaPbvk2b2MPBaIAx2uowVkeI2Pxs7+mVsbpNsM3thz7dvBf4i+/k+M5vPvj4AvJ4C9/p0ZiciAxnHZ2MLNsn+WTN7K9ACTgLvzBZ/JfBxM+vQPWG7q88s7kVKE+zcoZlIg/BqOmUAoLKwa6ix+ko6LSUaA1hYXU+OtdbT6SXtxvAzWZWz6XSXejOdkrFQSR+ceekswx7WeZcMw1Y9idJLFval00cgTi+Jxuq7g+MkGAOoLKaPP+bTaSteS6eltNbjd6WRyOEaT4Hh8SUVF2iSfQdwR5/lvgi8etDtlSbYiUj5uTve0sfFRGSnUyEAEZkN0/vZWAU7ESnOwdsKdiKy47n6xorIjNBlrIjseO50NBs7GgcaiaQvr+WU0VlaTo5Vdu9Njs3vPZ0ca5xdDbfZaaRz6TpB+6dKkENWrac7j0Hctax+Ln0A7g7y/lrbVlYqHp+rpX/XqAvYsGWaAJYOpI+jhf27g7E9ybH63pVwm5Xlvckxr6Vz9NqWfg02Wul8S4DVRC5nsnvfINzxvPZmJVWaYCci5eeOgp2IzAJXK0URmQE6sxORWeDutBuaoBCRGaDLWBHZ+TQbOzp3T6eeLKdTSwB8Pj39X9mzPz12/rnk2K7Lhz9Vt6A71tzCuWAsfjsa59P71Aq6lo1Scspzuo+lWFDCCeI0m+h1qC+nu27lpZ5E6SVLh/YFY3uTY9WVy8JtRsdfZz5d/mkt1WoPWM1JF1pLpEWNJfWE6b1np0rFIlKYe3c2tsgjz4h9Y28zs+9kj9uK7HtpzuxEZDpESfNFjdI31swuA94HXE/38whfy5Y9FW1TZ3YiUlzH6TRahR45LvSNdfcGsNk3tog3AQ+6+8kswD0IHM5bSMFORApzGNdl7Ch9Y4su+zwKdiJSXDYbW+RB1je253H7gFv7HHC1u7+G7tnbvaPsuu7ZichABpiN3a6+sUeBN25Z9uG8nSlNsOt4ekp9tRXv5vJiuipFde+h5NhcUKrGKvFJ7+56OgWitivdGaq+kk43mN97Ptxm83zQ0Szodhall+SlnnSGLHsSVXeBvNST9Gs7F762caev+b1B6snBveltHrg8OVY9dEW4TXYfSA55cNyuNtKv+5mN+H7YmdX+x3V7yDSi53HojCep+ELfWLrB6xbgHb1PMLMXuvvT2bcX+sbSbb/4X8xsM1/oRvp0IduqNMFORMrPGU9S8Sh9Y939pJm9n27ABLjT3U/mbVPBTkSKc6fTHM9nY4ftG5uN3QPcM8j2FOxEpDhVPRGR2aDPxorIDHAfzycoJkHBTkQGoErFI2t1OhxfbfQd278U7+biUrpiBZ30NH3V0uklVk+nOADYrnSllaXlE8mxhYPpSivN59IVUQBaUerJev/XDqDTTL8GeQ2Ph/1fvBJUfgGwajr1pLqQbqoTpfXUluL3rLqyNz0WVCep7k+nnrD3BeE2O8sHk2Orlq7Sci6YBDi1Fk8QnE6lngzbPalXBzo56UplVZpgJyLl57guY0VkBvjwNQ4nTcFORAYy7KdqJk3BTkQKU99YEZkN7rjO7ERkx/P84hFlpWAnIoU50NEExWiaHefY+f65Yod2xV2jakEnq7270nlOPpdeb6WeLsUEMLcnvV7W0rl0ndX0WG0tLvHkjXSenW+spceCUlbeyflfetgE0pwSWVZJ59nZXLrEky2m3xdbiN+zSpAbact7k2Od+XRpqM6udH4ewGp1MTl2YjWd//iD59J5k8+c2wi3efy5/uOtsZR40mWsiMwI5dmJyI7XnY3VmZ2I7HRTHOzUcEdEinOn3WwXeuTJa5Ld87ybzczN7Prs+6vNbK2nefZvFNl1ndmJSGHOeD5BUbRJtpntBv498JUtq3jC3a8bZJs6sxOR4gZrpRgp2iT7/cCHgHQqQkGlObNrtDt871T/9InlerybzU46hWStmV52ub6cHFtcSacbAMxX0v+7WWM1PdZKpw1YK34/K0EKSVTKyoIxfEIza0F5La+mSzx5kLLitbjEU7uWTgPxeroz2Yant3muGb9+Z4JyTFF6yROn0sfQk8fiUmCrZ/sfR+OaRR3TPbt+ja5f1/sEM/u7wJXu/j/N7Be2LP9SM/s6cBb4JXf/47wNlibYiUj5dSsVFw52B8zsSM/3d7v73UUWNLMK8KtkHcW2eBp4ibufMLMfAT5rZq9y97PROhXsRKS4bIKioFGaZO8G/jbwsJkBXA7cb2ZvdfcjwEZ3d/xrZvYE8AqgN7BeRMFORIobX+pJ2CTb3c8AFzqMm9nDwHvd/YiZHQROunvbzF4GXAM8mbdBBTsRKcwZT4mngk2yU/4BcKeZNYEO8G/UJFtExmuwe3bxqnKaZG/5+Rt7vv594PcH3Z6CnYgMQIUARrbWaPN/nzrTdyyvWsPx1XTKwYGldBrDnvkgLWU+nW4AsFRLj9er6VSYWiW9r3P1veE2g9VSDSq/BEMEQ9myec/or+PxexaNRm93dCw0c46TVjM9vr6evjRbHaHT1/FEpy+Iq5d85wfp6jj/72g46ciZ4/3TVtqtcVx+5r+3ZVWaYCci5edAQ/XsRGQWtHVmJyI7nQNTestOwU5EinPXmZ2IzAid2YnIjue4zuxGtdFo88Rfneo79syZuBrIvl1BeslSunnL3mBsMafSylI9nXqyGIzVq+lqH7VqnOYRpYFETYeitJQ825V60g5m9KLJvugPrZlzyrHeSn+mcy1oD/jcerpqzJnVdOUSgBPn0uOpxjiQrlwC6dSSTaefPtr3560ghaao7mzsyKuZiNIEOxEpP92zE5GZoXt2IrLjdVNPpjPaKdiJSGHKsxORmeCuj4uJyIyY1svYgbqLWdd/y/o8PpI1xOj3vJ/Kxh81sw+NZ1dFZNKcbrXMIo+yGfTM7s10SyBfQ7cT0K9zcUeg/cB/BX7E3Z81s3vN7AZ3/8NoxY21Df760cf7jtUW0l3AAKr1dNeo6lw6560yl471efllQXMsLCq3FIxFy+WxIfPhov3ZTp0hL4U8OKvwnHVG2+y00mPtoDJvqxF0bgPajf4d8wCa6+kuYc3z6TJOG8/FRXk3zh7vvy/r58PlihlfUrGZHQY+SrdS8Sfc/a7E824G7gP+XtZ/AjO7A3gX0AZ+1t0fyNveoH1jbwI+6V1fBvaa2Qu3POdlwHfc/dns+z8Abh5wOyJSQpsTFEUekZ4m2W8GrgVuNbNr+zzvoibZ2fNuAV4FHAb+e7a+0KDBrl+vxxdvec7jwN80s6vNbA54G8/vIiQiU2oz9aTII8coTbJvAj7l7hvu/l26MedH8zY4aLDL5e6ngH8LfBr4Y+Av6Z5qXsTMbjezI2Z2pLMRN/4VkcnbnI0t8iDrG9vzuL1nVbknTr1NsrfsRpGTrovk3rMzs3cDP519+1XiXo8AuPvngM9ly99OIthlDXPvBqhddtV0TvGIzJgB8uyivrGhnCbZQ8k9s3P3j7n7de5+HfBZ4J9ns7I/Bpxx96f77Oih7N99wL8DPjGuHRaRyRnjZewgTbL/Evgxuk2yry+wbF+DzsZ+HngL3WvkVeBfbA6Y2TeygAjwUTP7O9nXd7r7twfcjoiU0Bg/QTFKk+w14HfN7FeBF9HNDvnTvA1aNJV/KZnZs8BfZd8eAPrPn0tZ6T0rp9735Sp3PzjKyszsf9MThHIcd/fDwbreAvwaP2yS/YFUk+zeYJd9/5+Afwm0gP/g7v8rd9/LEux6mdmRYa/1ZTL0npWT3pcfGvtsrIhIGSnYichMKGuwu3vSOyAD03tWTnpfMqW8ZyciMm5lPbMTERmriQY7lYyaPmZ22My+lb1nv9hnfN7MPp2Nf8XMrp7Abs6UAu/JVWb2h9nf0MNmdsUk9nPSJn1m11sy6na6JaOep6dk1A3u/irgcjO74ZLupQCFK1W8Czjl7i8HPkL3Q9yyTQq+Jx+mW63oNcCdwAcv7V6Ww6SDnUpGTZcilSpuAu7Nvr4PuMGGLbYnRRR5T64FHsq+/kKf8Zkw6WCnklHTpcj7deE57t4CzgD7L8nezaYi78mfAz+Rff12YHd2xTRTJh3scg1SMkpE+nov8AYz+zrwBrqfRZ25v6FL3nBnO0tGybYrUm1i8zlPZWfie4ATl2b3ZlLue+Lu3yc7szOzZeBmdz99qXawLC75mZ1KRk21C5UqzKxOt1LF/Vuecz9wW/b1TwIPuZI5t1Pue2JmB7L6cAB3APdc4n0shUlfxn4eeJLufbnfpBvIgG7JqJ7nfdTMHgP+BLhLJaMmI7sH9x7gAeAvgM+4+6NmdqeZvTV72m8B+83sceDngYtSIWR8Cr4nbwS+ZWbfBl4AfGAiOzth+gSFiMyESZ/ZiYhcEgp2IjITFOxEZCYo2InITFCwE5GZoGAnIjNBwU5EZoKCnYjMhP8PWyDVapqkw5MAAAAASUVORK5CYII=\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 2 Axes>" "<Figure size 432x288 with 2 Axes>"
] ]
...@@ -875,7 +875,7 @@ ...@@ -875,7 +875,7 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"The main program finished running in 41.125189781188965 seconds.\n" "The main program finished running in 39.81194067001343 seconds.\n"
] ]
} }
], ],
...@@ -944,7 +944,7 @@ ...@@ -944,7 +944,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.10" "version": "3.7.0"
}, },
"toc": { "toc": {
"base_numbering": 1, "base_numbering": 1,
......
...@@ -405,17 +405,9 @@ ...@@ -405,17 +405,9 @@
} }
}, },
"outputs": [ "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/v_yusizhuo/opt/anaconda3/envs/pq2.0.1/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -429,6 +421,7 @@ ...@@ -429,6 +421,7 @@
"n = 4\n", "n = 4\n",
"G = nx.Graph()\n", "G = nx.Graph()\n",
"V = range(n)\n", "V = range(n)\n",
"G.add_nodes_from(V)\n",
"E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n", "E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n",
"G.add_edges_from(E)\n", "G.add_edges_from(E)\n",
"\n", "\n",
...@@ -766,7 +759,7 @@ ...@@ -766,7 +759,7 @@
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -808,12 +801,12 @@ ...@@ -808,12 +801,12 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"找到的割的比特串形式: 0101\n" "找到的割的比特串形式: 1010\n"
] ]
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -886,7 +879,7 @@ ...@@ -886,7 +879,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.0" "version": "3.7.10"
}, },
"toc": { "toc": {
"base_numbering": 1, "base_numbering": 1,
......
...@@ -392,17 +392,9 @@ ...@@ -392,17 +392,9 @@
} }
}, },
"outputs": [ "outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/v_yusizhuo/opt/anaconda3/envs/pq2.0.1/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
" and should_run_async(code)\n"
]
},
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -416,6 +408,7 @@ ...@@ -416,6 +408,7 @@
"n = 4\n", "n = 4\n",
"G = nx.Graph()\n", "G = nx.Graph()\n",
"V = range(n)\n", "V = range(n)\n",
"G.add_nodes_from(V)\n",
"E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n", "E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n",
"G.add_edges_from(E)\n", "G.add_edges_from(E)\n",
"\n", "\n",
...@@ -755,7 +748,7 @@ ...@@ -755,7 +748,7 @@
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -797,12 +790,12 @@ ...@@ -797,12 +790,12 @@
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"The bit string form of the cut found: 1010\n" "The bit string form of the cut found: 0101\n"
] ]
}, },
{ {
"data": { "data": {
"image/png": "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\n", "image/png": "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\n",
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
...@@ -875,7 +868,7 @@ ...@@ -875,7 +868,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.0" "version": "3.7.10"
}, },
"toc": { "toc": {
"base_numbering": 1, "base_numbering": 1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册