提交 af346570 编写于 作者: Q Quleaf

update to 2.0.1

上级 476abd12
......@@ -33,7 +33,7 @@ English | [简体中文](README_CN.md)
</a>
<!-- PyPI -->
<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>
<!-- Python -->
<a href="https://www.python.org/">
......@@ -55,12 +55,13 @@ Paddle Quantum aims at establishing a bridge between artificial intelligence (AI
## Features
- Easy-to-use
- Many online learning resources (16+ tutorials)
- Many online learning resources (17+ tutorials)
- High efficiency in building QNN with various QNN templates
- Automatic differentiation
- Versatile
- Multiple optimization tools and GPU mode
- Simulation with 25+ qubits
- Flexible noise models
- Featured Toolkits
- Toolboxes for Chemistry & Optimization
- LOCCNet for distributed quantum information processing
......@@ -143,8 +144,9 @@ We provide tutorials covering combinatorial optimization, quantum chemistry, qua
14. [Entanglement Distillation -- Protocol design with LOCCNet](./tutorial/LOCC)
15. [Quantum Teleportation](./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
......@@ -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)
[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
1. **Question:** What is quantum machine learning? What are the applications?
......
......@@ -34,7 +34,7 @@
</a>
<!-- PyPI -->
<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>
<!-- Python -->
<a href="https://www.python.org/">
......@@ -55,12 +55,13 @@
## 特色
- 轻松上手
- 丰富的在线学习资源(16+ 教程案例)
- 丰富的在线学习资源(17+ 教程案例)
- 通过模板高效搭建量子神经网络
- 自动微分框架
- 功能丰富
- 提供多种优化工具和 GPU 模式
- 高性能模拟器支持25+量子比特的模拟运算
- 支持多种噪声模型的模拟
- 特色工具集
- 提供组合优化和量子化学等前沿领域的计算工具箱
- 分布式量子信息处理模组 LOCCNet
......@@ -148,8 +149,9 @@ Paddle Quantum(量桨)建立起了人工智能与量子计算的桥梁,为
- [纠缠蒸馏 -- LOCCNet 设计协议](./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 文档
......@@ -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)
[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
......
......@@ -1551,7 +1551,6 @@
" 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",
" self.H = paddle.to_tensor(H)\n",
" \n",
" # 定义损失函数和前向传播机制\n",
" def forward(self):\n",
......@@ -1704,7 +1703,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
"version": "3.6.10"
},
"toc": {
"base_numbering": 1,
......
......@@ -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.
"""
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 matplotlib.pyplot as plt
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
SEED = 1024
__all__ = [
"circuit_QAOA",
"circuit_extend_QAOA",
"Net",
"Paddle_QAOA",
]
def circuit_QAOA(theta, adjacency_matrix, N, P):
def circuit_QAOA(E, V, n, p, gamma, beta):
"""
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,
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.
Args:
theta: parameters to be optimized in the QAOA circuit
adjacency_matrix: the adjacency matrix of the graph encoding the classical 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
E: edges of the graph
V: vertices of the graph
n: number of qubits in th 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:
the QAOA circuit
"""
cir = UAnsatz(N)
# prepare the input state in the uniform superposition of 2^N bit-strings in the computational basis
cir = UAnsatz(n)
cir.superposition_layer()
# This loop defines the QAOA circuit with P layers of two blocks
for layer in range(P):
# The second and third loops construct the first block which involves two-qubit operation
# e^{-i\gamma Z_iZ_j} acting on a pair of qubits or nodes i and j in the circuit in each layer.
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])
# 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)
for layer in range(p):
for (u, v) in E:
cir.cnot([u, v])
cir.rz(gamma[layer], v)
cir.cnot([u, v])
for v in V:
cir.rx(beta[layer], v)
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):
"""
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.
"""
def __init__(
self,
shape,
param_attr=paddle.nn.initializer.Uniform(low=0.0, high=np.pi),
dtype="float64",
self,
p,
dtype="float64",
):
super(Net, self).__init__()
self.theta = self.create_parameter(
shape=shape, attr=param_attr, dtype=dtype, is_bias=False
)
def forward(self, adjacency_matrix, N, P, METHOD):
"""
This function constructs the loss function for the QAOA circuit.
Args:
adjacency_matrix: the adjacency matrix generated from the graph encoding the classical problem
N: number of qubits
P: number of layers
METHOD: which version of QAOA is chosen to solve the problem, i.e., standard version labeled by 1 or
extended version by 2.
Returns:
the loss function for the parameterized QAOA circuit and the circuit itself
"""
# 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!")
self.p = p
self.gamma = self.create_parameter(shape = [self.p],
default_initializer = paddle.nn.initializer.Uniform(
low = 0.0,
high = 2 * np.pi
),
dtype = dtype,
is_bias = False)
self.beta = self.create_parameter(shape = [self.p],
default_initializer = paddle.nn.initializer.Uniform(
low = 0.0,
high = 2 * np.pi
),
dtype = dtype, is_bias = False)
def forward(self, n, E, V, H_D_list):
cir = circuit_QAOA(E, V, n, self.p, self.gamma, self.beta)
cir.run_state_vector()
loss = cir.expecval(H_problem)
loss = -cir.expecval(H_D_list)
return loss, cir
def Paddle_QAOA(classical_graph_adjacency, N, P, METHOD, ITR, LR):
def Paddle_QAOA(n, p, E, V, H_D_list, ITR, LR):
"""
This is the core function to run QAOA.
Args:
classical_graph_adjacency: adjacency matrix to describe the graph which encodes the classical problem
N: number of qubits (default value N=4)
P: number of layers of blocks in the QAOA circuit (default value P=4)
METHOD: which version of the QAOA circuit is used: 1, standard circuit (default); 2, extended circuit
n: number of qubits (default value N=4)
E: edges of the graph
V: vertices of the graph
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)
LR: learning rate for the gradient-based optimization method (default value LR=0.1)
Returns:
the optimized QAOA circuit
summary_iter
summary_loss
"""
# Construct the net or QAOA circuits based on the standard modules
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
net = Net(p)
opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())
# Gradient descent loop
summary_iter, summary_loss = [], []
for itr in range(1, ITR + 1):
loss, cir = net(
classical_graph_adjacency, N, P, METHOD
)
loss, cir = net(n, E, V, H_D_list)
loss.backward()
opt.minimize(loss)
opt.clear_grad()
if itr % 10 == 0:
print("iter:", itr, " loss:", "%.4f" % loss.numpy())
summary_loss.append(loss[0][0].numpy())
summary_iter.append(itr)
theta_opt = net.parameters()[0].numpy()
# print("Optimized parameters theta:\n", theta_opt)
gamma_opt = net.gamma.numpy()
print("优化后的参数 gamma:\n", gamma_opt)
beta_opt = net.beta.numpy()
print("优化后的参数 beta:\n", beta_opt)
os.makedirs("output", exist_ok=True)
np.savez("./output/summary_data", iter=summary_iter, energy=summary_loss)
return cir, summary_iter, summary_loss
return cir
def main(N=4):
def main(n = 4, E = None):
paddle.seed(SEED)
# 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 = [
"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()
p = 4 # number of layers in the circuit
ITR = 120 #number of iterations
LR = 0.1 #learning rate
if E is None:
G, V, E = Generate_default_graph(n)
else:
G = nx.Graph()
V = range(n)
G.add_nodes_from(V)
G.add_edges_from(E)
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)
H_min = -H_max
print(H_D_diag)
print('H_max:', H_max, ' H_min:', H_min)
cir, summary_iter, summary_loss = Paddle_QAOA(n, p, E, V, H_D_list, ITR, LR)
H_min = np.ones([len(summary_iter)]) * H_min
Draw_benchmark(summary_iter, summary_loss, H_min)
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__":
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 @@
"""
Aid func
"""
from matplotlib import pyplot
import matplotlib.pyplot as plt
import numpy as np
from numpy import abs, array, binary_repr, diag, kron, max, ones, real, where, zeros
import networkx
import networkx as nx
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
approximate solution obtained from QAOA
This is to draw the original graph
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:
measure_prob_distribution: the measurement probability distribution which is sampled from the output state
of optimized QAOA circuit.
graph: graph encoding the topology of the classical combinatorial problem, such as Max-Cut problem
N: number of qubits, or number of nodes in the graph
Return:
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
V: vertices in the graph
E: edges in the graph
cut_bitstring: bit string indicate whether vertices belongs to the first group or the second group
Returns:
Null
"""
# 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
]
node_cut = ["blue" if cut_bitstring[v] == "1" else "red" for v in V]
edge_cut = [
"solid"
if head_bitstring[node_row] == head_bitstring[node_col] else "dashed"
for node_row, node_col in graph.edges()
]
pos = networkx.circular_layout(graph)
pyplot.figure(0)
networkx.draw(graph, pos, width=4, with_labels=True, font_weight="bold")
# when N is large, it is not suggested to plot this figure
pyplot.figure(1)
name_list = [binary_repr(index, width=N) for index in range(0, 2**N)]
pyplot.bar(
range(len(real(measure_prob_distribution))),
real(measure_prob_distribution),
width=0.7,
tick_label=name_list, )
pyplot.xticks(rotation=90)
pyplot.figure(2)
networkx.draw(
graph,
pos,
node_color=node_cut,
style=edge_cut,
width=4,
with_labels=True,
font_weight="bold", )
pyplot.show()
def generate_graph(N, GRAPHMETHOD):
"solid" if cut_bitstring[u] == cut_bitstring[v] else "dashed"
for (u, v) in G.edges()
]
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(
G,
pos,
node_color = node_cut,
style = edge_cut,
**options
)
ax = plt.gca()
ax.margins(0.20)
plt.axis("off")
plt.show()
return
def Generate_default_graph(n):
"""
It plots an N-node graph which is specified by Method 1 or 2.
Args:
N: number of nodes (vertices) in the graph
METHOD: choose which method to generate a graph
Returns:
the specific graph and its adjacency matrix
This is to generate a default graph if no input
Args:
n: number of vertices
Returns:
G: the graph
E: edges list
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
if GRAPHMETHOD == 1:
print("Method 1 generates the graph from self-definition using EDGE description")
graph = networkx.Graph()
graph_nodelist = range(N)
graph.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0)])
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 is to construct Hamiltonia H_D
Args:
E: edges of the graph
Returns:
Hamiltonia list
Hamiltonia H_D
"""
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:
N: number of qubits, or number of nodes in the graph, or number of parameters in the classical problem
adjacency_matrix: the adjacency matrix generated from the graph encoding the classical problem
summary_iter: indicate which iteration
summary_loss: indicate the energy of that iteration
H_min: benchmark value H_min
Returns:
the problem-based Hmiltonian H's list form generated from the graph_adjacency matrix for the given graph
NULL
"""
H_list = []
# Generate the Hamiltonian H_c from the graph via its adjacency matrix
for row in range(N):
for col in range(N):
if adjacency_matrix[row, col] and row < col:
# Construct the Hamiltonian in the list form for the calculation of expectation value
H_list.append([1.0, 'z' + str(row) + ',z' + str(col)])
return H_list
plt.figure(1)
loss_QAOA, = plt.plot(
summary_iter,
summary_loss,
alpha=0.7,
marker='',
linestyle="--",
linewidth=2,
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():
# 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)
pos = networkx.circular_layout(classical_graph)
networkx.draw(classical_graph, pos, width=4, with_labels=True, font_weight='bold')
pyplot.show()
n = 4
G, V, E = Generate_default_graph(n)
Draw_original_graph(G)
if __name__ == "__main__":
......
......@@ -15,93 +15,41 @@
"""
main
"""
import numpy as np
import matplotlib.pyplot as plt
import networkx as nx
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.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 = [
"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()
SEED = 1024
def main(n = 4):
paddle.seed(SEED)
p = 4 # number of layers in the circuit
ITR = 120 #number of iterations
LR = 0.1 #learning rate
G, V, E = Generate_default_graph(n)
G.add_nodes_from(V)
G.add_edges_from(E)
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__":
......
......@@ -17,4 +17,4 @@ Paddle Quantum Library
"""
name = "paddle_quantum"
__version__ = "2.0.0"
__version__ = "2.0.1"
......@@ -14,22 +14,15 @@
import gc
import math
import warnings
from functools import reduce
from collections import defaultdict
import numpy as np
from numpy import binary_repr, eye, identity
import matplotlib.pyplot as plt
from paddle_quantum.simulator import StateTransfer, init_state_gen, measure_state
from paddle_quantum.simulator import transfer_state, init_state_gen, measure_state
import paddle
from paddle import kron as pp_kron
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 import matmul, trace, real, imag, reshape
from paddle_quantum.utils import dagger, pauli_str_to_matrix
from paddle_quantum.intrinsic import *
from paddle_quantum.state import density_op
......@@ -41,36 +34,40 @@ __all__ = [
class UAnsatz:
r"""基于 PaddlePaddle 的动态图机制实现量子线路的 ``class`` 。
r"""基于 PaddlePaddle 的动态图机制实现量子路的 ``class`` 。
用户可以通过实例化该 ``class`` 来搭建自己的量子线路。
用户可以通过实例化该 ``class`` 来搭建自己的量子路。
Attributes:
n (int): 该线路的量子比特数
n (int): 该路的量子比特数
"""
def __init__(self, n):
r"""UAnsatz 的构造函数,用于实例化一个 UAnsatz 对象
Args:
n (int): 该线路的量子比特数
n (int): 该路的量子比特数
"""
self.n = n
self.__has_channel = False
self.__state = None
self.__run_state = ''
# Record history of adding gates to the circuit
self.__history = []
def run_state_vector(self, input_state=None, store_state=True):
r"""运行当前的量子线路,输入输出的形式为态矢量。
r"""运行当前的量子电路,输入输出的形式为态矢量。
Warning:
该方法只能运行无噪声的电路。
Args:
input_state (Tensor, optional): 输入的态矢量,默认为 :math:`|00...0\rangle`
store_state (Bool, optional): 是否存储输出的态矢量,默认为 ``True`` ,即存储
Returns:
Tensor: 量子线路输出的态矢量
Tensor: 量子路输出的态矢量
代码示例:
......@@ -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]]
"""
# 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
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'
state = complex_reshape(state, (2 ** self.n,))
state = reshape(state, (2 ** self.n,))
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'
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])
state = transfer_by_history(state, self.__history)
if store_state:
self.__state = state
# Add info about which function user called
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):
r"""运行当前的量子线路,输入输出的形式为密度矩阵。
r"""运行当前的量子路,输入输出的形式为密度矩阵。
Args:
input_state (Tensor, optional): 输入的密度矩阵,默认为 :math:`|00...0\rangle \langle00...0|`
store_state (bool, optional): 是否存储输出的密度矩阵,默认为 ``True`` ,即存储
Returns:
Tensor: 量子线路输出的密度矩阵
Tensor: 量子路输出的密度矩阵
代码示例:
......@@ -159,9 +151,33 @@ class UAnsatz:
[0.47686058-0.03603751j 0.35403671+0.j ]]
"""
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"
state = matmul(self.U, matmul(state, dagger(self.U)))
if self.__has_channel == False:
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:
self.__state = state
......@@ -172,10 +188,13 @@ class UAnsatz:
@property
def U(self):
r"""量子线路的酉矩阵形式。
r"""量子电路的酉矩阵形式。
Warning:
该属性只限于无噪声的电路。
Returns:
Tensor: 当前线路的酉矩阵表示
Tensor: 当前路的酉矩阵表示
代码示例:
......@@ -198,24 +217,18 @@ class UAnsatz:
[ 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]]
"""
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 = reshape(state, [num_ele])
state = transfer_by_history(state, self.__history)
shape = (2 ** self.n, 2 ** self.n)
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)
return reshape(state, shape)
"""
Common Gates
......@@ -232,7 +245,7 @@ class UAnsatz:
Args:
theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -263,7 +276,7 @@ class UAnsatz:
Args:
theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -293,7 +306,7 @@ class UAnsatz:
Args:
theta (Tensor): 旋转角度
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -315,7 +328,7 @@ class UAnsatz:
def cnot(self, control):
r"""添加一个 CNOT 门。
对于 2 量子比特的量子线路,当 ``control`` 为 ``[0, 1]`` 时,其矩阵形式为:
对于 2 量子比特的量子路,当 ``control`` 为 ``[0, 1]`` 时,其矩阵形式为:
.. math::
......@@ -325,7 +338,7 @@ class UAnsatz:
\end{align}
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
......@@ -339,7 +352,7 @@ class UAnsatz:
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 control qubit is the same as the target qubit"
self.__history.append(['CNOT', control])
self.__history.append(['CNOT', control, None])
def swap(self, control):
r"""添加一个 SWAP 门。
......@@ -353,7 +366,7 @@ class UAnsatz:
\end{align}
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
......@@ -364,9 +377,10 @@ class UAnsatz:
cir = UAnsatz(num_qubits)
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"
self.__history.append(['SWAP', control])
self.__history.append(['SWAP', control, None])
def x(self, which_qubit):
r"""添加单量子比特 X 门。
......@@ -378,7 +392,7 @@ class UAnsatz:
\begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}
Args:
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -408,7 +422,7 @@ class UAnsatz:
\begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix}
Args:
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的 qubit 的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -438,7 +452,7 @@ class UAnsatz:
\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}
Args:
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子线路的量子比特数
which_qubit (int): 作用在的qubit的编号,其值应该在 :math:`[0, n)` 范围内, :math:`n` 为该量子路的量子比特数
.. code-block:: python
......@@ -468,7 +482,7 @@ class UAnsatz:
H = \frac{1}{\sqrt{2}}\begin{bmatrix} 1&1\\1&-1 \end{bmatrix}
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)"
self.__history.append(['h', [which_qubit], None])
......@@ -483,7 +497,7 @@ class UAnsatz:
S = \begin{bmatrix} 1&0\\0&i \end{bmatrix}
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)"
self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])),
......@@ -500,7 +514,7 @@ class UAnsatz:
T = \begin{bmatrix} 1&0\\0&e^\frac{i\pi}{4} \end{bmatrix}
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)"
self.__history.append(['u', [which_qubit], [paddle.to_tensor(np.array([0.0])),
......@@ -526,7 +540,7 @@ class UAnsatz:
theta (Tensor): 旋转角度 :math:`\theta` 。
phi (Tensor): 旋转角度 :math:`\phi` 。
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)"
self.__history.append(['u', [which_qubit], [theta, phi, lam]])
......@@ -643,8 +657,8 @@ class UAnsatz:
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"
psi = paddle.reshape(x=theta[: 60], shape=[4, 15])
phi = paddle.reshape(x=theta[60:], shape=[7, 3])
psi = reshape(x=theta[: 60], shape=[4, 15])
phi = reshape(x=theta[60:], shape=[7, 3])
self.universal_2_qubit_gate(psi[0], which_qubits[:2])
self.u3(phi[0][0], phi[0][1], phi[0][2], which_qubits[2])
......@@ -730,14 +744,14 @@ class UAnsatz:
# Which_qubits is list-like
def measure(self, which_qubits=None, shots=2 ** 10, plot=False):
r"""对量子线路输出的量子态进行测量。
r"""对量子路输出的量子态进行测量。
Warning:
当 ``plot`` 为 ``True`` 时,当前量子线路的量子比特数需要小于 6 ,否则无法绘制图片,会抛出异常。
当 ``plot`` 为 ``True`` 时,当前量子路的量子比特数需要小于 6 ,否则无法绘制图片,会抛出异常。
Args:
which_qubits (list, optional): 要测量的qubit的编号,默认全都测量
shots (int, optional): 该量子线路输出的量子态的测量次数,默认为 1024 次;若为 0,则返回测量结果的精确概率分布
shots (int, optional): 该量子路输出的量子态的测量次数,默认为 1024 次;若为 0,则返回测量结果的精确概率分布
plot (bool, optional): 是否绘制测量结果图,默认为 ``False`` ,即不绘制
Returns:
......@@ -809,25 +823,24 @@ class UAnsatz:
return result if not plot else self.__measure_hist(result, which_qubits, shots)
def expecval(self, H):
r"""量子线路输出的量子态关于可观测量 H 的期望值。
r"""量子路输出的量子态关于可观测量 H 的期望值。
Hint:
如果想输入的可观测量的矩阵为 :math:`0.7Z\otimes X\otimes I+0.2I\otimes Z\otimes I` 。则 ``H`` 应为 ``[[0.7, 'z0,x1'], [0.2, 'z1']]`` 。
Args:
H (list): 可观测量的相关信息
Returns:
Tensor: 量子线路输出的量子态关于 H 的期望值
Tensor: 量子路输出的量子态关于 H 的期望值
代码示例:
.. code-block:: python
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
n = 5
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.rx(theta[0], 0)
cir.rz(theta[1], 1)
......@@ -900,6 +913,54 @@ class UAnsatz:
for i in range(self.n):
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):
r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的强纠缠层。
......@@ -907,7 +968,7 @@ class UAnsatz:
这一层量子门的数学表示形式为实数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, n, 1)``
``theta`` 的维度为 ``(depth, n, 1)``
Args:
theta (Tensor): Ry 门的旋转角度
......@@ -918,13 +979,11 @@ class UAnsatz:
.. code-block:: python
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
n = 2
DEPTH = 3
theta = np.ones([DEPTH, n, 1])
theta = paddle.to_tensor(theta)
theta = paddle.ones([DEPTH, n, 1], dtype='float64')
cir = UAnsatz(n)
cir.real_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1])
cir.run_state_vector()
......@@ -945,7 +1004,7 @@ class UAnsatz:
for repeat in range(depth):
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):
self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([which_qubits[-1], which_qubits[0]])
......@@ -957,7 +1016,7 @@ class UAnsatz:
这一层量子门的数学表示形式为复数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, n, 3)`` ,最低维内容为对应的 ``u3`` 的参数 ``(theta, phi, lam)``
``theta`` 的维度为 ``(depth, n, 3)`` ,最低维内容为对应的 ``u3`` 的参数 ``(theta, phi, lam)``
Args:
theta (Tensor): U3 门的旋转角度
......@@ -968,13 +1027,11 @@ class UAnsatz:
.. code-block:: python
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
n = 2
DEPTH = 3
theta = np.ones([DEPTH, n, 3])
theta = paddle.to_tensor(theta)
theta = paddle.ones([DEPTH, n, 3], dtype='float64')
cir = UAnsatz(n)
cir.complex_entangled_layer(paddle.to_tensor(theta), DEPTH, [0, 1])
cir.run_state_vector()
......@@ -995,7 +1052,7 @@ class UAnsatz:
for repeat in range(depth):
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):
self.cnot([which_qubits[i], which_qubits[i + 1]])
self.cnot([which_qubits[-1], which_qubits[0]])
......@@ -1065,7 +1122,7 @@ class UAnsatz:
这一层量子门的数学表示形式为实数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, n-1, 4)``
``theta`` 的维度为 ``(depth, n-1, 4)``
Args:
theta(Tensor): Ry 门的旋转角度
......@@ -1075,13 +1132,11 @@ class UAnsatz:
.. code-block:: python
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
n = 4
DEPTH = 3
theta = np.ones([DEPTH, n-1, 4])
theta = paddle.to_tensor(theta)
theta = paddle.ones([DEPTH, n - 1, 4], dtype='float64')
cir = UAnsatz(n)
cir.real_block_layer(paddle.to_tensor(theta), DEPTH)
cir.run_density_matrix()
......@@ -1114,7 +1169,7 @@ class UAnsatz:
这一层量子门的数学表示形式为复数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, n-1, 12)``
``theta`` 的维度为 ``(depth, n-1, 12)``
Args:
theta (Tensor): U3 门的角度信息
......@@ -1124,13 +1179,11 @@ class UAnsatz:
.. code-block:: python
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
n = 4
DEPTH = 3
theta = np.ones([DEPTH, n-1, 12])
theta = paddle.to_tensor(theta)
theta = paddle.ones([DEPTH, n - 1, 12], dtype='float64')
cir = UAnsatz(n)
cir.complex_block_layer(paddle.to_tensor(theta), DEPTH)
cir.run_density_matrix()
......@@ -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):], [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):
r"""
......@@ -1166,7 +1627,7 @@ def __local_H_prob(cir, hamiltonian, shots=1024):
"""
# Add one ancilla, which we later measure and process the result
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
_theta = paddle.to_tensor(np.array([-np.pi / 2]))
......
......@@ -13,11 +13,13 @@
# limitations under the License.
import math
from functools import wraps
import numpy as np
from numpy import binary_repr
import paddle
from paddle import multiply, add, to_tensor
from paddle_quantum.simulator import StateTransfer
def dic_between2and10(n):
......@@ -115,3 +117,38 @@ def vec_expecval(H, vec):
vec_conj = paddle.conj(vec)
result = paddle.sum(multiply(vec_conj, H_vec(H, vec)))
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):
status (LoccStatus or list): 作为LOCC下的量子电路的输入的 LOCC 态节点,其类型应该为 ``LoccStatus`` 或由其组成的 ``list``
Returns:
LoccStatus or list: 量子线路运行后得到的 LOCC 态节点,类型为 ``LoccStatus`` 或由其组成的 ``list``
LoccStatus or list: 量子路运行后得到的 LOCC 态节点,类型为 ``LoccStatus`` 或由其组成的 ``list``
"""
if isinstance(status, LoccStatus):
assert int(log2(sqrt(status.state.numpy().size))) == self.n, "the length of qubits should be same"
......@@ -262,11 +262,34 @@ class LoccAnsatz(UAnsatz):
theta (Tensor): 旋转角度 :math:`\theta` 。
phi (Tensor): 旋转角度 :math:`\phi` 。
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]
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):
r"""添加一层 Hadamard 门。
"""
......@@ -280,7 +303,37 @@ class LoccAnsatz(UAnsatz):
for which_qubit in self.party.qubits:
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 门的强纠缠层。
Note:
......@@ -297,15 +350,18 @@ class LoccAnsatz(UAnsatz):
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] == 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'
if which_qubits is None:
which_qubits = list(range(self.m))
for repeat in range(depth):
for i in range(self.party.qubits):
self.ry(theta=theta[repeat][i][0], which_qubit=i)
for idx in range(0, self.m - 1):
self.cnot(control=[idx, idx + 1])
self.cnot([len(self.party) - 1, 0])
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]])
self.cnot([which_qubits[-1], which_qubits[0]])
def complex_entangled_layer(self, theta, depth, which_qubits=None):
r"""添加 ``depth`` 层包含 U3 门和 CNOT 门的强纠缠层。
......@@ -321,44 +377,35 @@ class LoccAnsatz(UAnsatz):
depth (int): 纠缠层的深度
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 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[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.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[-1], which_qubits[0]])
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
def real_block_layer(self, theta, depth):
r"""添加 ``depth`` 层包含 Ry 门和 CNOT 门的弱纠缠层。
Note:
这一层量子门的数学表示形式为实数酉矩阵。
Attention:
``theta`` 的维度为 ``(depth, m-1, 4)`` 。
Args:
theta (Tensor): 3-qubit 通用门的参数,其维度为 ``(81, )``
which_qubits(list): 作用的量子比特编号
theta(Tensor): Ry 门的旋转角度
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 len(theta.shape) == 3, 'The dimension of theta is not right'
_depth, _number, block = theta.shape
......@@ -376,6 +423,18 @@ class LoccAnsatz(UAnsatz):
self.__add_real_layer(theta[i][int((self.m - 1) / 2):], [1, self.m - 1])
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 len(theta.shape) == 3, 'The dimension of theta is not right'
assert depth > 0, 'depth must be greater than zero'
......@@ -450,6 +509,154 @@ class LoccAnsatz(UAnsatz):
for i in range(position[0], position[1], 2):
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):
r"""用于设计我们的 LOCC 下的 protocol,并进行验证或者训练。
......
......@@ -24,6 +24,7 @@ __all__ = [
"vec",
"vec_random",
"w_state",
"GHZ_state",
"density_op",
"density_op_random",
"completely_mixed_computational",
......@@ -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]]
"""
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")
......@@ -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'
# real
if real_or_complex == 1:
psi = np_random.randn(1, 2**n)
psi = np_random.randn(1, 2 ** n)
# complex
else:
psi = np_random.randn(1, 2**n) + 1j * np_random.randn(1, 2**n)
psi = psi/np.linalg.norm(psi)
psi = np_random.randn(1, 2 ** n) + 1j * np_random.randn(1, 2 ** n)
psi = psi / np.linalg.norm(psi)
return psi.astype("complex128")
......@@ -109,16 +110,46 @@ def w_state(n, coeff=None):
"""
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)
assert c.shape[0] == 1 and c.shape[1] == 2**n, 'The dimension of coeff is not right'
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'
state = np_zeros((1, 2**n))
state = np_zeros((1, 2 ** 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")
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):
r"""生成密度矩阵 :math:`|00..0\rangle \langle00..0|` 的 numpy 形式。
......@@ -145,7 +176,7 @@ def density_op(n):
"""
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
return rho.astype("complex128")
......@@ -163,17 +194,17 @@ def density_op_random(n, real_or_complex=2, rank=None):
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
"""
assert n > 0, 'qubit number must be positive'
rank = rank if rank is not None else 2**n
assert 0 < rank <= 2**n, 'rank is an invalid number'
rank = rank if rank is not None else 2 ** n
assert 0 < rank <= 2 ** n, 'rank is an invalid number'
if real_or_complex == 1:
psi = np_random.randn(2**n, rank)
psi = np_random.randn(2 ** n, rank)
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
rho = np_matmul(psi, psi_dagger)
rho = rho/np_trace(rho)
rho = rho / np_trace(rho)
return rho.astype('complex128')
......@@ -209,7 +240,7 @@ def completely_mixed_computational(n):
[0. +0.j 0. +0.j 0. +0.j 0.25+0.j]]
"""
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')
......@@ -225,7 +256,7 @@ def bell_state(n):
Args:
n (int): 量子比特数量必须为大于等于 2 的偶数
n (int): 量子比特数量必须为大于等于 2 的偶数
Returns:
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
......@@ -248,8 +279,8 @@ def bell_state(n):
assert n > 0, "Qubit number must be positive"
assert n % 2 == 0, "Qubit number must be even"
dim = 2**n
local_dim = 2**int(n/2)
dim = 2 ** n
local_dim = 2 ** int(n / 2)
coeff = 1 / local_dim
state = np.zeros((dim, dim))
for i in range(0, dim, local_dim + 1):
......@@ -309,7 +340,7 @@ def bell_diagonal_state(p1, p2, p3, p4):
psi_m_vec = np.array([[0, coeff, -coeff, 0]])
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")
......@@ -324,7 +355,7 @@ def R_state(p):
p|\Psi^{+}\rangle\langle\Psi^{+}| + (1 - p)|11\rangle\langle11|
Args:
p (float): 控制生成 R-state 的参数属于 :math:`[0, 1]` 区间内
p (float): 控制生成 R-state 的参数属于 :math:`[0, 1]` 区间内
Returns:
numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组
......@@ -352,7 +383,7 @@ def R_state(p):
state_11 = np.zeros((4, 4))
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")
......@@ -367,7 +398,7 @@ def S_state(p):
p|\Phi^{+}\rangle\langle\Phi^{+}| + (1 - p)|00\rangle\langle00|
Args:
p (float): 控制生成 S-state 的参数属于 :math:`[0, 1]` 区间内
p (float): 控制生成 S-state 的参数属于 :math:`[0, 1]` 区间内
Returns:
numpy.ndarray: 一个形状为 ``(4, 4)`` 的 numpy 数组
......@@ -393,7 +424,7 @@ def S_state(p):
psi0 = np.zeros_like(phi_p)
psi0[0, 0] = 1
state = p * phi_p + (1-p) * psi0
state = p * phi_p + (1 - p) * psi0
return state.astype("complex128")
......@@ -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}
Args:
n (int): 量子比特数量
p (float): 控制生成 isotropic state 的参数属于 :math:`[0, 1]` 区间内
n (int): 量子比特数量
p (float): 控制生成 isotropic state 的参数属于 :math:`[0, 1]` 区间内
Returns:
numpy.ndarray: 一个形状为 ``(2**n, 2**n)`` 的 numpy 数组
......@@ -430,7 +461,7 @@ def isotropic_state(n, p):
"""
assert 0 <= p <= 1, "Probability must be in [0, 1]"
dim = 2**n
state = p*bell_state(n) + (1-p)*np.eye(dim)/dim
dim = 2 ** n
state = p * bell_state(n) + (1 - p) * np.eye(dim) / dim
return state
......@@ -23,15 +23,17 @@ with open("README.md", "r", encoding="utf-8") as fh:
setuptools.setup(
name='paddle-quantum',
version='2.0.0',
version='2.0.1',
author='Institute for Quantum Computing, Baidu INC.',
author_email='quantum@baidu.com',
description='Paddle Quantum is a quantum machine learning (QML) toolkit developed based on Baidu PaddlePaddle.',
long_description=long_description,
long_description_content_type="text/markdown",
url='http://qml.baidu.com',
packages=['paddle_quantum', 'paddle_quantum.GIBBS', 'paddle_quantum.QAOA', 'paddle_quantum.SSVQE', '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'],
packages=['paddle_quantum', 'paddle_quantum.GIBBS', 'paddle_quantum.QAOA', 'paddle_quantum.SSVQE',
'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'],
python_requires='>=3.6, <4',
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 @@
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -234,7 +234,7 @@
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -417,16 +417,16 @@
" :param theta: 参数\n",
" :return: Y 旋转矩阵\n",
" \"\"\"\n",
" return np.array([[np.cos(theta/2), -np.sin(theta/2)],\n",
" [np.sin(theta/2), np.cos(theta/2)]])\n",
" return np.array([[np.cos(theta / 2), -np.sin(theta / 2)],\n",
" [np.sin(theta / 2), np.cos(theta / 2)]])\n",
"\n",
"def Rz(theta):\n",
" \"\"\"\n",
" :param theta: 参数\n",
" :return: Z 旋转矩阵\n",
" \"\"\"\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",
" 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",
"\n",
"# 经典 -> 量子数据编码器\n",
"def datapoints_transform_to_state(data, n_qubits):\n",
......@@ -842,7 +842,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2021-03-02T09:15:50.771171Z",
......@@ -877,7 +877,7 @@
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATsAAAD5CAYAAABYi5LMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAg5UlEQVR4nO3dfZBkZ3Xf8e/pnu552dnZXe0LAgQSGOEgAhGxYlyhKlBRAgt/IGw5sUQlEQmxKgnYiR1cZVVcwSWKIBzKmFRRDjKWA65ygJKrKFEhIcJCZZcxmCVgHMkBJGFjLYLVvmt3Xvrt5I++s7Rm+zn33u6endvTv09V187M0/dluu+cvbefc88xd0dEZLer7fQOiIhcCQp2IjITFOxEZCYo2InITFCwE5GZoGAnIjNhruwCZnYU+BBQBz7q7vdsGb8WuA84DJwG/om7P5m33vriijf2Hhk6VqtZvE/BuEWLBoPhcv1njLRsuNqcbVr0hFG3mWPUZcdJaAqXDQbz0qii0WjZaLW52+wF6w3GetFYtx1us9duDf/5+jm8vTbO4UBt5Rqns17oub526nPufnSc7U1SqWBnZnXgw8A/BJ4EvmJmD7j7owNP+wDwcXf/mJn9feB9wD/NW3dj7xFe+DMfGDq2sNQIl23Op3+NuWb65HWuUU+O1erxSW99Lj0ejgWRsJ4T1KPxUcfyjLpsN/hjHWfZaKzV6YXrbXfT471g2U67m97mRife5kZ62Y21dNBae2YjPXb2B+E2L5747tCfr/6fj4fLFdJZZ+5H31zoqe2v/86h8Tc4OWUvY38ceMzdn3D3FvAJ4JYtz7kBeCj7+gtDxkVkWplhtXqhR9WUDXbPB/564Psns58N+jPgp7KvfxLYa2YHR9s9EakWozbXLPSomu2YoHgX8Foz+xrwWuA4MPRc3szuNLNjZnasu3Z+G3ZFRCZqis/syk5QHAdeMPD9NdnPLnH375Gd2ZnZMnCru58dtjJ3vxe4F2DhyEt0k65IxRlg9eoFsiLKBruvANeb2YvoB7nbgLcOPsHMDgGn3b0H3EV/ZlZEdgMzahU8ayuiVLBz946ZvRP4HP3Uk/vc/REzuxs45u4PAK8D3mdmDvwh8I4i627Mz/H8H7lq6NgLD+8Jlz2yMh+MLSTHVhbSv/5SMFMLMB/M1s4Hs7ELwVijFn+q0KinZ0ajZXNWG4pmjyPdMarptLvpZdvBbGw02wqwEcy4rgYzrhda6bFnWvFs7Inz6VnVp86uJce+e2o1OXb2xEq4zZMrwydBW4/cHy5XVBUvUYsonWfn7p8FPrvlZ/9x4Ov7gcm8qiJSLdlndtOodLATkdllGLW5OO+1qhTsRKQ4ndmJyKxQsBOR3c9sZlJPRGSGGdN7ZqcSTyJSnNWozzULPXJXZXbUzL5pZo+Z2S8PGX+hmX3BzL5mZt8wszcNjN2VLfdNM3tDkV2vzJnd0nydV167f+jYDc+L84quXk7n2R1aSr/o+4I8u8UgHw5gYS6df9YM8uGaQRWRubyqJ9FwL53vZcEYvTg3bbxiTYEg+c9r6dk+r6Xfs3bOr9IK8vA2gty+tWDFq5349fnBhXSe3feDsSeCPLtvLMazoakqLSdyckcLscmc2RWsoPQrwKfc/TfN7Ab6KW/XZV/fBrwceB7weTN7qbunEyLRmZ2IlGBM7N7YIhWUHNg809kHfC/7+hbgE+6+4e7fAR7L1heqzJmdiEyHCX1mN6yC0qu3POdXgf9tZj8H7AH+wcCyX9qy7NbqS5fRmZ2IFFeu6smhzapG2ePOklu7Hfhv7n4N8Cbgd81s5JilMzsRKaFUUvFJd78pMZZbQQl4O3AUwN3/xMwWgEMFl72MzuxEpDAzo9ZoFnrkuFRBycya9CccHtjynO8CN2fbfRmwADydPe82M5vPKjBdD/xp3gZ1ZicixU3odrGCFZT+PfBbZvYL9Ccr3ub9DkePmNmngEeBDvCOvJlYqFCwm5+rcf1z9g4du/6quMTTc/emU0/2zadPXpeb6Tet6cM7NG2qbVxMjtlGOm3AWumyPtaNt0kr3dXJO8GynXRjF+/lHCO5qSkJOXWlwj+Y4Ebz2vxicqw5lz4OABYb6WV9fjk51lsaflwCbBCngawEx99VQQpJVEJsLSg5BXDi9PDjr57TRKqoSSUVF6ig9CjwmsSy7wXeW2Z7lQl2IjId8lqbVpWCnYgUZmZhn+YqU7ATkVImdTl8pSnYiUhxhs7sRGT361c9UbATkV3PqI3YhGmnVSbYNeo1rk6kkESpJQCHl9JT4cu1dMWP2sWT6bG1c+E2bTU93rtwNjnWvZhuBu5r6XQWgN56OqXFo7SUdjotxXM6cvmIqSeWk3pSawYpG0HqiTXT3eJqe+LqOLUghaS272B6bHl417v+Og+E25xfPpwcizq3tbvpNJmTq+lUIoBvJKoA1cKyOQXpMlZEZoWCnYjsemZQD2o5VpmCnYiUYvrMTkR2OzPTHRQiMhv0mZ2IzAQFuzHN1SzZHCeqHAFxekn9/A/SY6unk2Odk0+F2+ydOZEc60apJxcuJMda59OpJQDti+n0ks56unlLr51+fXqtoBkP25l6kj70ao30WGNPUPVkZSnc5vz+IPVkJZ16Uj94dXrs8PPCbeLp1+/A8nOSY2ud9GtwaCmutHLV8vC/o7mc96QQQ3l2IrL7GUYtp/NeVSnYiUhxNr0lnqYzRIvIjjGzQo8C68lrkv1BM/t69viWmZ0dGOsOjG0t5z6UzuxEpLB+IYAJrKdAk2x3/4WB5/8c8KqBVay5+41ltqkzOxEpLruMLfLIUaRJ9qDbgf8+zq4r2IlICUatXiv0yDGsSfbQRtdmdi3wIuChgR8vZL1ov2Rmbymy57qMFZHCrNwExSEzOzbw/b3ufu8Im70NuH9LB7Fr3f24mb0YeMjM/tzdH49WUplgN1ezZLel5UZOztZaOl8uzKX7/nfTY6fiPLvO6XR5qLVT6TJOG2efSY7l5dl1wjy7dNmf9lqQZ9fO7UA3EsspJxTl4TUWozy7dLmv5t6cPLsD6Ty7xcPp8lrzQfkscrqz1evp/qmNZrpr3p6gE9qBoCsZwP5EHl59QrOoJZKKx22Svek24B2DP3D349m/T5jZw/Q/zwuDnS5jRaQws37QLPLIUaRJNmb2N4ADwJ8M/OyAmc1nXx+i327x0a3LblWZMzsRmQ6TOEMs2CQb+kHwE1lz7E0vAz5iZj36J2z3DM7ipijYiUhhRqGztkLymmRn3//qkOW+CLyi7PYU7ESkMDNo6nYxEdntzPqTidNIwU5ECjMmN6t7pVUm2Bkwn0hXmK/50J9vijqBdaNSTMFY6+n0GMDaibPpsafPJMc2zqZLPK2fS5dpAtg4nx7vrKfTSzpB6on34te2l9N9LCUvqTRKX5gLUk/mV9KpJ/MrQYoI0FmPuqyNloITdTsDqO1Ndx+rLe5Lji3tSael7A3KYwEsL2xj6olN7jO7K60ywU5Eqq9/ZqfP7ERkBujMTkR2vZqZZmNFZDbUVZZdRHa7zdvFppGCnYiUomA3JjOjmUg9sY10ugZArZWuWNF+5mxyrHvuVHJsPahcAnF6yeqJdCrM2pl0esR6MAbQuphOnWhdSFc9idJSejmpJ914OCmn6AlzjXp6bCF9WLYvBr9nkGID0G2Nll5Sa6SrjDRX0scQQC84xmr7jiTHFlbSL+BSM/3aASwmxidx9amkYhGZCYYmKERkBugzOxGZCbpdTERmwxSf2U3nxbeI7IjNenYTqFQ8bt/YO8zs29njjiL7rjM7ESllEmd24/SNNbOrgHcDNwEOfDVbNp0iQYWCXc1Ip5504mogvbV06knvYtT8Jp3SEjXGyVs2Si9ZPZluqrNxPp1a0h9Pvw4X2+nqJGtB5ZJ2TmpJ10fLPcnLsl8I9ndxI51CshSl0YxYoQXymvykK5tsnF0O11s/mD7+6p30cWLd9LGQNxk6n3hCbQK5J7XJFe+81DcWwMw2+8amyqvfTj/AAbwBeNDdT2fLPggcJaevbGWCnYhMgcl9Zjesb+yrh27y8r6xhXvODlKwE5HCDCtzb+x29o0tTcFOREopcTm8XX1jjwOv27Lsw3k7o9lYESnM6N8KWOSRY+S+sfTbL74+6x97AHh99rOQzuxEpDiD2g73jXX302b2HvoBE+DuzcmKiIKdiBRmQGNCZdlH7Rub/fw+4L4y21OwE5HCNi9jp1Glgl2qdEyUcwTg60GeXTDWvpjOc2qdT+fDQdwJLMqHi3Lp1s7GJZ7OBblp60GppijPrrVDJZ7Wgkuh9V76zKHr6Tw7Ox9vtB6UlWouR2Wc0sdCdAxBnAPKxlpyyDpRnl26wxqk8+AmUmDYbCKXsTuhUsFORKrNmExy8k5QsBORUnQZKyK7nhk0chqgV5WCnYgUpstYEZkZuowVkV3PMJ3ZjSvK37FOuqMUQG8jPf3fW43SBtJT/53VOKUg6nI16tiFTlyi6GKQQhItuxbkj+SnnmxPiadmkL4wcrrLanycRF3Lou5s3fV0Gkg0BuCt9HEUjVk3vT91S5ecAmgmPlObSIia4krFlQl2IlJ9/c/sdnovRqNgJyKFTfJ2sStNwU5EijOY0swTBTsRKU6pJyIyI0pVKq4UBTsRKUxndpNgwYvYS1e6APCgQkS3HXSjCsa6rbjcfWc9SC9ZS693I1hvlCKSNx6P7UTVk7z1pv9goqTVaGwhZ5pwT9CZrBOMRe9nZz3ufOdBWpRHKVWefs/yPjNL/R3ZBIJU/3ax6Qx2U/pRo4jsFLNij/z1xE2ys+f8YzN71MweMbPfG/h5d6CB9mXl3IepzpmdiEyF2gTSk4s0yTaz64G7gNe4+xkzOzKwijV3v7HcfouIFGRM7MzuUpNsd28Bm02yB/0s8GF3PwPg7ifG2XcFOxEppWbFHjmKNLp+KfBSM/tjM/uSmR0dGFsws2PZz99SZL91GSsixRX8PC4zbpPsOeB6+j1irwH+0Mxe4e5ngWvd/biZvRh4yMz+3N0fz1uZiEghVi7Pbtwm2U8CX3b3NvAdM/sW/eD3FXc/DuDuT5jZw8CrgOkIdmHXomAaHuIp/Ci9pNcaPfWk20rvU7RslOrRzqkwEi27HWOwfQ13IlEaTbM2xu8SvC+jjkXHEIAHaT/eDiqmBOlWtZwXd7tv55pQIYBLTbLpB7nbgLduec6ngduB3zGzQ/Qva5/IGmOvuvtG9vPXAL+Wt8HKBDsRmQ6TiHUFm2R/Dni9mT0KdIFfcvdTZvZ3gY+YWY/+vMM9g7O4KQp2IlLYJO+gyGuS7e4O/GL2GHzOF4FXlN2egp2IlDKld4sp2IlIOdOar6ZgJyKFmcqyi8is0GWsiOx6hi5jt5Xl5NnRi3PiUryXXm8vJ8GsF+VPBfleUbeuvJy2eNnR1pu3zZxXPi33d4nGRvtd8va1F7wv0XsWHSdRHl3estNqEqWidsJUBDsRqYhi971WkoKdiBQW3ulUcQp2IlKKLmNFZNdTk2wRmRlTGusU7ESkDJva7mIjpczkNcows3kz+2Q2/mUzu27sPR2Rd3vJh4iUVLAkexXjYelgN9Ao443ADcDtZnbDlqe9HTjj7i8BPgi8f9wdFZGdZ+5Yr1voUTWjnNkVaZRxC/Cx7Ov7gZttWqdwRORZzHuFHlUzSrAr0ijj0nPcvQOcAw6OsoMiUiXerxxe5JFjzL6xd5jZt7PHHUX2fEcnKMzsTuBOgBe84AU5zxaRSshpH1DEOH1jzewq4N3ATfRvTPxqtuyZaJujnNkVaZRx6TlmNgfsA05tXZG73+vuN7n7TQcPHRphV0TkivKJndmN0zf2DcCD7n46G3sQOEqOUYLdpUYZZtak3yjjgS3PeQDYPLX8aeChrMSyiEy5CX1mN07f2CLLXqb0ZWzBRhm/DfyumT0GnKYfEEfmlhOTa/XkkAWtlqyWHsvr4FQL15teNmpDl3fPYbxsNHbl/5/J/12isdFeo7z/uWvB+xK9Z9FxEh1fectOJw87n22xLX1jSyx/2cpKK9AoYx34R6PulIhUlFNo8iGzXX1jj9MPgIPLPpy3M7vtvx0R2VYOvV6xR6zIx2GfJgtqg31j+WGLxQNZD9nXZz8L6XYxESllEjl04/SNBTCz99APmAB3u/vpvG0q2IlIORNKGB61b2w2dh9wX5ntKdiJSHHuI7dB2GkKdiJSShVvBStCwU5ESvCJXcZeaZUJdk7QOSonz87mGsmxWiP9K9aa6bG8/Kl6Mz1eb6bz/ppBPlcjp1ZCtGw01vXRazDkdR9LycuzG/V3GXUM4tzI6D2LxqJjCHLyPBvN5FiUW9rLad227dXLFOxEZNdzndmJyAww9JmdiMwEh65mY0Vktyt3u1ilKNiJSCm6jBWRGaAJivE59FIl72o50/tz6Sn8epR6Eow1FuNtzi2k012iZecvptMYFnNyBtpBCkmcXhKkXOSUf+qOWIYwKtMEcZrIYpC3shikckTLAcwtpN+XOJUoGAuOIQCbX0iPBSlTHhzzeaklqb+jiZWUVLATkV1Pt4uJyGxwvNPe6Z0YiYKdiBTn6MxORHY/x3Hl2YnIrucUqUJcSSrLLiIlZBMURR458ppkm9nbzOxpM/t69viXA2PdgZ9vLec+VGXO7BzoJP7D8GCKHuLp/drSUnKssWcxOTa3lF5nf9mNYCxIS1lLd2ZabscHyOgVSNILtno7k3oyanrJnmC5pfn4cJ5fSacoza/MJ8cae9LHwlxwDAFYM0g9Cca8nj6GujkHQiuRmzKRxBOfzARFkSbZmU+6+zuHrGLN3W8ss83KBDsRmQaOT2aC4lKTbAAz22ySvTXYTYwuY0WkuM3Z2PEvY4s2ur7VzL5hZveb2WDrxQUzO5Y1z35LkV1XsBOREkq1UjyUBaTNx50lN/YZ4Dp3fyXwIPCxgbFrs560bwV+w8x+JG9luowVkeKcMqknYzXJ3mybmPko8GsDY8ezf58ws4eBVwGPRzujMzsRKWFis7G5TbLN7LkD374Z+Ivs5wfMbD77+hDwGgp81qczOxEpbkKzsQWbZP+8mb0Z6ACngbdli78M+IiZ9eifsN0zZBb3MpUJdu7QTqRBeD2dMgBQW9gz0lhzJZ2WEo0BLKyuJ8c66+n0km5r9Jms2vl0ukuznU7JWKilk0Dz0llGTR/Nu2QYtepJlF6ycCCdPgJxekk01twbHCfBGEBtMX38MZ9OW/FGOi2lsx6/K61EDtdkip5MrhBAgSbZdwF3DVnui8Arym6vMsFORKaA7o0VkVngOD6lt4sp2IlIcTqzE5GZ4I63Wzu9FyNRsBOREnxqq54o2IlIObqMFZFdzydWCOCKq0ywc6CVSPryRk4ZnaXl5Fht7/7k2Pz+s8mx1vnVcJu9VjqXrhe0f6oFOWT1ZrrzGMRdy5oX0omee4O8v862lZWKx+ca6d816gI2apkmgKVD6eNo4eDeYGxfcqy5fyXcZm15f3LMG+kcva6lX4ONTjrfEmA1kcuZ7N5XkmZjRWT3c8fzejlWlIKdiBTm7vTa6SuFKlOwE5HiHJ3ZichsULATkV3P3emplaKIzALNxo7J3dOpJ8vp1BIAn09P/9f2HUyPXXwmObbn6tFrdlnQHWtu4UIwFr8drYvpfeoEXcvGKTnlOd3HUiwo4QRxmk30OjSX01238lJPovSSpSMHgrH9ybH6ylXhNqPjrzefLv+0lmq1B6zmpAutJdKiJpJ6MsWzsapULCKFbc7GFnnkGbNv7B1m9u3scUeRfa/MmZ2ITIcoab6ocfrGmtlVwLuBm+jfj/DVbNkz0TZ1ZicixWWpJ0UeOS71jXX3FrDZN7aINwAPuvvpLMA9CBzNW0jBTkSKyz6zm0CwG6dvbNFln0XBTkQKc/qzsUUebG/f2NL0mZ2IFOceFsHYYrv6xh4HXrdl2YfzdqYywa7n6Sn11U68m8uL6aoU9f1HkmNzQUs4q8UnvXub6RSIxp50Z6jmSjrdYH7/xXCb7YtBR7Og21mUXpKXetIbsexJVN0F8lJP0q/tXPjaxp2+5vcHqSeH96e3eejq5Fj9yDXhNtl7KDnkwXG72kq/7uc24mBzbnX4cd0dMY3oWRx6k8mzu9Q3ln7wug146+ATzOy57v5U9u2lvrH02y/+JzPbzBd6PUO6kG1VmWAnItXnTCbPbpy+se5+2szeQz9gAtzt7qfztqlgJyLFOfiEbhcbtW9sNnYfcF+Z7SnYiUgJaqUoIrNAJZ5EZBa4O93is7GVomAnIiXoMnZsnV6Pk6vDm+8eXIp3c3EpXbGCXvp/obql00usmU5xALA96UorS8unkmMLh9OVVtrPpCuiAHSi1JP1dOPi6KbsvA+bR70PshZUfgGwejr1pL6QbqoTpfU0luL3rL6yPz0WVCepH0ynnrD/OeE2e8uHk2Orlq7ScqGdTos6sxZX5DmbSj0ZtXvSIF3GishMcPBJBM0doGAnIoU5PpGqJztBwU5EivPRC7ruNAU7ESnMPf8Ww6pSsBOR4tz1mZ2IzIZRi0PsNAU7ESlOqSfja/ecExeH54od2RN3jWoEnaz270nnOflcer21ZroUE8DcvvR6WUvn0vVW02ONtbjEk7fSeXa+sZYeC0pZeS/n85dRE0hzSmRZLZ1nZ3PpEk+2mH5fbCF+z2pBbqQt70+O9ebTpaF6e9L5eQCr9cXk2KnVdP7j959J503+4MJGuM2Tzwwf70xgYsGBniYoRGTXc9cEhYjsfq6kYhGZCVMc7NRwR0RK6N9BUeSRJ69J9sDzbjUzN7Obsu+vM7O1gebZ/7XInuvMTkSKm9AdFEWbZJvZXuDfAl/esorH3f3GMtvUmZ2IFOb08+yKPHIUbZL9HuD9QDoVoaDKnNm1uj2+e2Z4+sRyM97Ndi+dQrLWTi+73FxOji2upNMNAOZr6TfTWqvpsU46bcA68ftZC1JIolJWFozhO5QzFZTX8nq6xJMHKSveiEs8dRvpNBBvpjuTbXh6mxfa8et3LijHFKWXPH4mfQw9cSIuBbZ6fvhxNJEb+N3pTWY2dlij61cPPsHM/jbwAnf/H2b2S1uWf5GZfQ04D/yKu/9R3gYrE+xEpPrcS91BccjMjg18f6+731tkQTOrAb9O1lFsi6eAF7r7KTP7MeDTZvZydz8frVPBTkRKKVGpeJwm2XuBvwk8bGYAVwMPmNmb3f0YsAHg7l81s8eBlwKDgfUyCnYiUpwX+jyuiLBJtrufAy51GDezh4F3ufsxMzsMnHb3rpm9GLgeeCJvgwp2IlLchPLsCjbJTvl7wN1m1gZ6wL9Sk2wRmShncoUA8ppkb/n56wa+/n3g98tuT8FORIpzp9tS1ZOxrLW6/N8nzw0dy6vWcHI1nXJwaCmdxrBvPkhLmU+nGwAsNdLjzXo6FaZRS+/rXHN/uM1gtdSDyi/BEMFQtmzeM4brefyeRaPR2x0dC+2c46TTTo+vr6f/gFfH6PR1MtHpC+LqJd/+fro6zv87Hk46cu7k8LSVbmf8IOWe/95WVWWCnYhMh66CnYjsdg5MaR0ABTsRKUdndiKy6/UcWqpULCKzQJexIrLrOa7L2HFttLo8/ldnho794FxcDeTAniC9ZCndvGV/MLaYU2llqZlOPVkMxpr1dLWPRj1O84jSQKKmQ1FaSp7tSj3pBpdC0VVS9IfWzjnlWO+kq3WsBZU8nllPV405t5quXAJw6kJ6PNUYB9KVSyCdWrLp7FPHh/68E6TQFKUJChGZGQp2IrLruWs2VkRmgKPZWBGZAfrMTkRmhi5jRWTX639mt9N7MZpS3cWs779kfR6/kTXEGPa8n8nGHzGz909mV0WkCrruhR5VU/bM7o30SyBfT78T0G9yeUegg8B/Bn7M3Z82s4+Z2c3u/gfRiltrG/z1I48NHWsspLuAAdSb6a5R9bl0zlttLh3r8/LLguZYWFRuKRiLlstjI+bDRfuznXojfsjtwR9RXj/TaJu9TnqsGxSr7LSCzm1AtzW8Yx5Aez3dJax9MV3GaeOZuCjvxvmTw/dl/WK4XBFOvzTwJJjZUeBD9CsVf9Td70k871bgfuDvZP0nMLO7gLcDXeDn3f1zedsrG+xuAT7u/SPuS2a238ye6+5PDTznxcC33f3p7PvPA7cCYbATkepzfCKzseM0yTazG+j3rHg58Dzg82b2UncPezyWbZI9rNfj87c85zHgR83sOjObA97Cs7sIiciU6s/GTuQydpwm2bcAn3D3DXf/Dv2Y8+N5Gywb7HK5+xngXwOfBP4I+Ev6p5qXMbM7zeyYmR3rbcSNf0WkArIJiiIPsr6xA487B9aUe+I02CR7y14UOem6TO5lrJm9A/jZ7NuvEPd6BMDdPwN8Jlv+ThLBLmuYey9A46prq/eJpog8y+aZXUFR39hQTpPskeSe2bn7h939Rne/Efg08M+yWdmfAM5t+bxuc0ePZP8eAP4N8NFJ7bCI7KwSZ3aRMk2y/xL4CfpNsm8qsOxQZScoPgu8if418irwzzcHzOzrWUAE+JCZ/a3s67vd/VsltyMiFdRjYreLjdMkew34PTP7dfoTFNcDf5q3QYum8q8kM3sa+Kvs20PA8PlzqSq9Z9U0+L5c6+6Hx1mZmf0vBoJQjpPufjRY15uA3+CHTbLfm2qSPRjssu//A/AvgA7w79z9f+bue1WC3SAzOzbqtb7sDL1n1aT35YcmPhsrIlJFCnYiMhOqGuzu3ekdkNL0nlWT3pdMJT+zExGZtKqe2YmITNSOBjuVjJo+ZnbUzL6ZvWe/PGR83sw+mY1/2cyu24HdnCkF3pNrzewPsr+hh83smp3Yz52202d2gyWj7qRfMupZBkpG3ezuLweuNrObr+heCvCsShVvBG4Abs8qUAx6O3DG3V8CfJD+TdyyTQq+Jx+gX63olcDdwPuu7F5Ww04Hu0slo9z9S8B+M3vuluekSkbJlVekUsUtwMeyr+8HbrZRi+1JEUXekxuAh7KvvzBkfCbsdLBTyajpUuT9uvQcd+8A54CDV2TvZlOR9+TPgJ/Kvv5JYG92xTRTdjrY5SpTMkpEhnoX8Foz+xrwWvr3os7c39AVb7iznSWjZNsVqTax+ZwnszPxfcCpK7N7Myn3PXH375Gd2ZnZMnCru5+9UjtYFVf8zE4lo6bapUoVZtakX6nigS3PeQC4I/v6p4GHXMmc2yn3PTGzQ1l9OIC7gPuu8D5Wwk5fxn4WeIL+53K/RT+QAf2SUQPP+5CZPQr8MXCPSkbtjOwzuHcCnwP+AviUuz9iZneb2Zuzp/02cNDMHgN+EbgsFUImp+B78jrgm2b2LeA5wHt3ZGd3mO6gEJGZsNNndiIiV4SCnYjMBAU7EZkJCnYiMhMU7ERkJijYichMULATkZmgYCciM+H/A8FcxMYui1epAAAAAElFTkSuQmCC\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
......@@ -891,7 +891,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"主程序段总共运行了 28.894441843032837 秒\n"
"主程序段总共运行了 30.048875331878662 秒\n"
]
}
],
......@@ -960,7 +960,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
"version": "3.7.0"
},
"toc": {
"base_numbering": 1,
......
......@@ -136,9 +136,9 @@
" \"\"\"\n",
" train_x, train_y = [], []\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",
" data_point = np.random.rand(2) * 2-1\n",
" data_point = np.random.rand(2) * 2 - 1\n",
"\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",
......@@ -202,7 +202,7 @@
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -221,7 +221,7 @@
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -242,10 +242,10 @@
],
"source": [
"# Set parameters\n",
"Ntrain=200 # Specify the training set size\n",
"Ntest=100 # Specify the test set size\n",
"boundary_gap=0.5 # Set the width of the decision boundary\n",
"seed_data=2 # Fixed random seed\n",
"Ntrain = 200 # Specify the training set size\n",
"Ntest = 100 # Specify the test set size\n",
"boundary_gap = 0.5 # Set the width of the decision boundary\n",
"seed_data = 2 # Fixed random seed\n",
"\n",
"# Generate data set\n",
"train_x, train_y, test_x, test_y = circle_data_point_generator(\n",
......@@ -405,16 +405,16 @@
" :param theta: parameter\n",
" :return: Y rotation matrix\n",
" \"\"\"\n",
" return np.array([[np.cos(theta/2), -np.sin(theta/2)],\n",
" [np.sin(theta/2), np.cos(theta/2)]])\n",
" return np.array([[np.cos(theta / 2), -np.sin(theta / 2)],\n",
" [np.sin(theta / 2), np.cos(theta / 2)]])\n",
"\n",
"def myRz(theta):\n",
" \"\"\"\n",
" :param theta: parameter\n",
" :return: Z rotation matrix\n",
" \"\"\"\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",
" 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",
"\n",
"# Classical -> Quantum Data Encoder\n",
"def datapoints_transform_to_state(data, n_qubits):\n",
......@@ -540,9 +540,9 @@
" # The default depth is depth = 1\n",
" # Build the entangleed layer and Ry rotation layer\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([n-1, 0])\n",
" cir.cnot([n - 1, 0])\n",
" for i in range(n):\n",
" cir.ry(theta[i][d], i)\n",
"\n",
......@@ -759,9 +759,9 @@
" ax = fig.add_subplot(111)\n",
" x_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_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",
" im = ax.imshow(heat_data, cmap=plt.cm.RdBu)\n",
" plt.colorbar(im)\n",
......@@ -799,15 +799,15 @@
" # Run forward propagation to calculate loss function\n",
" loss, train_acc, state_predict_useless \\\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",
" input_state_test = paddle.to_tensor(datapoints_transform_to_state(test_x, N))\n",
" loss_useless, test_acc, state_predict_useless \\\n",
" = net(state_in=input_state_test,label=test_y)\n",
" print(\"epoch:\", ep, \"iter:\", itr,\n",
" \"loss: %.4f\"% loss.numpy(),\n",
" \"train acc: %.4f\"% train_acc,\n",
" \"test acc: %.4f\"% test_acc)\n",
" \"loss: %.4f\" % loss.numpy(),\n",
" \"train acc: %.4f\" % train_acc,\n",
" \"test acc: %.4f\" % test_acc)\n",
"\n",
" # Store accuracy rate and other information\n",
" summary_iter.append(itr + ep * N_train)\n",
......@@ -861,7 +861,7 @@
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAATsAAAD5CAYAAABYi5LMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAg5UlEQVR4nO3dfZBkZ3Xf8e/pnu552dnZXe0LAgQSGOEgAhGxYlyhKlBRAgt/IGw5sUQlEQmxKgnYiR1cZVVcwSWKIBzKmFRRDjKWA65ygJKrKFEhIcJCZZcxmCVgHMkBJGFjLYLVvmt3Xvrt5I++s7Rm+zn33u6endvTv09V187M0/dluu+cvbefc88xd0dEZLer7fQOiIhcCQp2IjITFOxEZCYo2InITFCwE5GZoGAnIjNhruwCZnYU+BBQBz7q7vdsGb8WuA84DJwG/om7P5m33vriijf2Hhk6VqtZvE/BuEWLBoPhcv1njLRsuNqcbVr0hFG3mWPUZcdJaAqXDQbz0qii0WjZaLW52+wF6w3GetFYtx1us9duDf/5+jm8vTbO4UBt5Rqns17oub526nPufnSc7U1SqWBnZnXgw8A/BJ4EvmJmD7j7owNP+wDwcXf/mJn9feB9wD/NW3dj7xFe+DMfGDq2sNQIl23Op3+NuWb65HWuUU+O1erxSW99Lj0ejgWRsJ4T1KPxUcfyjLpsN/hjHWfZaKzV6YXrbXfT471g2U67m97mRife5kZ62Y21dNBae2YjPXb2B+E2L5747tCfr/6fj4fLFdJZZ+5H31zoqe2v/86h8Tc4OWUvY38ceMzdn3D3FvAJ4JYtz7kBeCj7+gtDxkVkWplhtXqhR9WUDXbPB/564Psns58N+jPgp7KvfxLYa2YHR9s9EakWozbXLPSomu2YoHgX8Foz+xrwWuA4MPRc3szuNLNjZnasu3Z+G3ZFRCZqis/syk5QHAdeMPD9NdnPLnH375Gd2ZnZMnCru58dtjJ3vxe4F2DhyEt0k65IxRlg9eoFsiLKBruvANeb2YvoB7nbgLcOPsHMDgGn3b0H3EV/ZlZEdgMzahU8ayuiVLBz946ZvRP4HP3Uk/vc/REzuxs45u4PAK8D3mdmDvwh8I4i627Mz/H8H7lq6NgLD+8Jlz2yMh+MLSTHVhbSv/5SMFMLMB/M1s4Hs7ELwVijFn+q0KinZ0ajZXNWG4pmjyPdMarptLvpZdvBbGw02wqwEcy4rgYzrhda6bFnWvFs7Inz6VnVp86uJce+e2o1OXb2xEq4zZMrwydBW4/cHy5XVBUvUYsonWfn7p8FPrvlZ/9x4Ov7gcm8qiJSLdlndtOodLATkdllGLW5OO+1qhTsRKQ4ndmJyKxQsBOR3c9sZlJPRGSGGdN7ZqcSTyJSnNWozzULPXJXZXbUzL5pZo+Z2S8PGX+hmX3BzL5mZt8wszcNjN2VLfdNM3tDkV2vzJnd0nydV167f+jYDc+L84quXk7n2R1aSr/o+4I8u8UgHw5gYS6df9YM8uGaQRWRubyqJ9FwL53vZcEYvTg3bbxiTYEg+c9r6dk+r6Xfs3bOr9IK8vA2gty+tWDFq5349fnBhXSe3feDsSeCPLtvLMazoakqLSdyckcLscmc2RWsoPQrwKfc/TfN7Ab6KW/XZV/fBrwceB7weTN7qbunEyLRmZ2IlGBM7N7YIhWUHNg809kHfC/7+hbgE+6+4e7fAR7L1heqzJmdiEyHCX1mN6yC0qu3POdXgf9tZj8H7AH+wcCyX9qy7NbqS5fRmZ2IFFeu6smhzapG2ePOklu7Hfhv7n4N8Cbgd81s5JilMzsRKaFUUvFJd78pMZZbQQl4O3AUwN3/xMwWgEMFl72MzuxEpDAzo9ZoFnrkuFRBycya9CccHtjynO8CN2fbfRmwADydPe82M5vPKjBdD/xp3gZ1ZicixU3odrGCFZT+PfBbZvYL9Ccr3ub9DkePmNmngEeBDvCOvJlYqFCwm5+rcf1z9g4du/6quMTTc/emU0/2zadPXpeb6Tet6cM7NG2qbVxMjtlGOm3AWumyPtaNt0kr3dXJO8GynXRjF+/lHCO5qSkJOXWlwj+Y4Ebz2vxicqw5lz4OABYb6WV9fjk51lsaflwCbBCngawEx99VQQpJVEJsLSg5BXDi9PDjr57TRKqoSSUVF6ig9CjwmsSy7wXeW2Z7lQl2IjId8lqbVpWCnYgUZmZhn+YqU7ATkVImdTl8pSnYiUhxhs7sRGT361c9UbATkV3PqI3YhGmnVSbYNeo1rk6kkESpJQCHl9JT4cu1dMWP2sWT6bG1c+E2bTU93rtwNjnWvZhuBu5r6XQWgN56OqXFo7SUdjotxXM6cvmIqSeWk3pSawYpG0HqiTXT3eJqe+LqOLUghaS272B6bHl417v+Og+E25xfPpwcizq3tbvpNJmTq+lUIoBvJKoA1cKyOQXpMlZEZoWCnYjsemZQD2o5VpmCnYiUYvrMTkR2OzPTHRQiMhv0mZ2IzAQFuzHN1SzZHCeqHAFxekn9/A/SY6unk2Odk0+F2+ydOZEc60apJxcuJMda59OpJQDti+n0ks56unlLr51+fXqtoBkP25l6kj70ao30WGNPUPVkZSnc5vz+IPVkJZ16Uj94dXrs8PPCbeLp1+/A8nOSY2ud9GtwaCmutHLV8vC/o7mc96QQQ3l2IrL7GUYtp/NeVSnYiUhxNr0lnqYzRIvIjjGzQo8C68lrkv1BM/t69viWmZ0dGOsOjG0t5z6UzuxEpLB+IYAJrKdAk2x3/4WB5/8c8KqBVay5+41ltqkzOxEpLruMLfLIUaRJ9qDbgf8+zq4r2IlICUatXiv0yDGsSfbQRtdmdi3wIuChgR8vZL1ov2Rmbymy57qMFZHCrNwExSEzOzbw/b3ufu8Im70NuH9LB7Fr3f24mb0YeMjM/tzdH49WUplgN1ezZLel5UZOztZaOl8uzKX7/nfTY6fiPLvO6XR5qLVT6TJOG2efSY7l5dl1wjy7dNmf9lqQZ9fO7UA3EsspJxTl4TUWozy7dLmv5t6cPLsD6Ty7xcPp8lrzQfkscrqz1evp/qmNZrpr3p6gE9qBoCsZwP5EHl59QrOoJZKKx22Svek24B2DP3D349m/T5jZw/Q/zwuDnS5jRaQws37QLPLIUaRJNmb2N4ADwJ8M/OyAmc1nXx+i327x0a3LblWZMzsRmQ6TOEMs2CQb+kHwE1lz7E0vAz5iZj36J2z3DM7ipijYiUhhRqGztkLymmRn3//qkOW+CLyi7PYU7ESkMDNo6nYxEdntzPqTidNIwU5ECjMmN6t7pVUm2Bkwn0hXmK/50J9vijqBdaNSTMFY6+n0GMDaibPpsafPJMc2zqZLPK2fS5dpAtg4nx7vrKfTSzpB6on34te2l9N9LCUvqTRKX5gLUk/mV9KpJ/MrQYoI0FmPuqyNloITdTsDqO1Ndx+rLe5Lji3tSael7A3KYwEsL2xj6olN7jO7K60ywU5Eqq9/ZqfP7ERkBujMTkR2vZqZZmNFZDbUVZZdRHa7zdvFppGCnYiUomA3JjOjmUg9sY10ugZArZWuWNF+5mxyrHvuVHJsPahcAnF6yeqJdCrM2pl0esR6MAbQuphOnWhdSFc9idJSejmpJ914OCmn6AlzjXp6bCF9WLYvBr9nkGID0G2Nll5Sa6SrjDRX0scQQC84xmr7jiTHFlbSL+BSM/3aASwmxidx9amkYhGZCYYmKERkBugzOxGZCbpdTERmwxSf2U3nxbeI7IjNenYTqFQ8bt/YO8zs29njjiL7rjM7ESllEmd24/SNNbOrgHcDNwEOfDVbNp0iQYWCXc1Ip5504mogvbV06knvYtT8Jp3SEjXGyVs2Si9ZPZluqrNxPp1a0h9Pvw4X2+nqJGtB5ZJ2TmpJ10fLPcnLsl8I9ndxI51CshSl0YxYoQXymvykK5tsnF0O11s/mD7+6p30cWLd9LGQNxk6n3hCbQK5J7XJFe+81DcWwMw2+8amyqvfTj/AAbwBeNDdT2fLPggcJaevbGWCnYhMgcl9Zjesb+yrh27y8r6xhXvODlKwE5HCDCtzb+x29o0tTcFOREopcTm8XX1jjwOv27Lsw3k7o9lYESnM6N8KWOSRY+S+sfTbL74+6x97AHh99rOQzuxEpDiD2g73jXX302b2HvoBE+DuzcmKiIKdiBRmQGNCZdlH7Rub/fw+4L4y21OwE5HCNi9jp1Glgl2qdEyUcwTg60GeXTDWvpjOc2qdT+fDQdwJLMqHi3Lp1s7GJZ7OBblp60GppijPrrVDJZ7Wgkuh9V76zKHr6Tw7Ox9vtB6UlWouR2Wc0sdCdAxBnAPKxlpyyDpRnl26wxqk8+AmUmDYbCKXsTuhUsFORKrNmExy8k5QsBORUnQZKyK7nhk0chqgV5WCnYgUpstYEZkZuowVkV3PMJ3ZjSvK37FOuqMUQG8jPf3fW43SBtJT/53VOKUg6nI16tiFTlyi6GKQQhItuxbkj+SnnmxPiadmkL4wcrrLanycRF3Lou5s3fV0Gkg0BuCt9HEUjVk3vT91S5ecAmgmPlObSIia4krFlQl2IlJ9/c/sdnovRqNgJyKFTfJ2sStNwU5EijOY0swTBTsRKU6pJyIyI0pVKq4UBTsRKUxndpNgwYvYS1e6APCgQkS3HXSjCsa6rbjcfWc9SC9ZS693I1hvlCKSNx6P7UTVk7z1pv9goqTVaGwhZ5pwT9CZrBOMRe9nZz3ufOdBWpRHKVWefs/yPjNL/R3ZBIJU/3ax6Qx2U/pRo4jsFLNij/z1xE2ys+f8YzN71MweMbPfG/h5d6CB9mXl3IepzpmdiEyF2gTSk4s0yTaz64G7gNe4+xkzOzKwijV3v7HcfouIFGRM7MzuUpNsd28Bm02yB/0s8GF3PwPg7ifG2XcFOxEppWbFHjmKNLp+KfBSM/tjM/uSmR0dGFsws2PZz99SZL91GSsixRX8PC4zbpPsOeB6+j1irwH+0Mxe4e5ngWvd/biZvRh4yMz+3N0fz1uZiEghVi7Pbtwm2U8CX3b3NvAdM/sW/eD3FXc/DuDuT5jZw8CrgOkIdmHXomAaHuIp/Ci9pNcaPfWk20rvU7RslOrRzqkwEi27HWOwfQ13IlEaTbM2xu8SvC+jjkXHEIAHaT/eDiqmBOlWtZwXd7tv55pQIYBLTbLpB7nbgLduec6ngduB3zGzQ/Qva5/IGmOvuvtG9vPXAL+Wt8HKBDsRmQ6TiHUFm2R/Dni9mT0KdIFfcvdTZvZ3gY+YWY/+vMM9g7O4KQp2IlLYJO+gyGuS7e4O/GL2GHzOF4FXlN2egp2IlDKld4sp2IlIOdOar6ZgJyKFmcqyi8is0GWsiOx6hi5jt5Xl5NnRi3PiUryXXm8vJ8GsF+VPBfleUbeuvJy2eNnR1pu3zZxXPi33d4nGRvtd8va1F7wv0XsWHSdRHl3estNqEqWidsJUBDsRqYhi971WkoKdiBQW3ulUcQp2IlKKLmNFZNdTk2wRmRlTGusU7ESkDJva7mIjpczkNcows3kz+2Q2/mUzu27sPR2Rd3vJh4iUVLAkexXjYelgN9Ao443ADcDtZnbDlqe9HTjj7i8BPgi8f9wdFZGdZ+5Yr1voUTWjnNkVaZRxC/Cx7Ov7gZttWqdwRORZzHuFHlUzSrAr0ijj0nPcvQOcAw6OsoMiUiXerxxe5JFjzL6xd5jZt7PHHUX2fEcnKMzsTuBOgBe84AU5zxaRSshpH1DEOH1jzewq4N3ATfRvTPxqtuyZaJujnNkVaZRx6TlmNgfsA05tXZG73+vuN7n7TQcPHRphV0TkivKJndmN0zf2DcCD7n46G3sQOEqOUYLdpUYZZtak3yjjgS3PeQDYPLX8aeChrMSyiEy5CX1mN07f2CLLXqb0ZWzBRhm/DfyumT0GnKYfEEfmlhOTa/XkkAWtlqyWHsvr4FQL15teNmpDl3fPYbxsNHbl/5/J/12isdFeo7z/uWvB+xK9Z9FxEh1fectOJw87n22xLX1jSyx/2cpKK9AoYx34R6PulIhUlFNo8iGzXX1jj9MPgIPLPpy3M7vtvx0R2VYOvV6xR6zIx2GfJgtqg31j+WGLxQNZD9nXZz8L6XYxESllEjl04/SNBTCz99APmAB3u/vpvG0q2IlIORNKGB61b2w2dh9wX5ntKdiJSHHuI7dB2GkKdiJSShVvBStCwU5ESvCJXcZeaZUJdk7QOSonz87mGsmxWiP9K9aa6bG8/Kl6Mz1eb6bz/ppBPlcjp1ZCtGw01vXRazDkdR9LycuzG/V3GXUM4tzI6D2LxqJjCHLyPBvN5FiUW9rLad227dXLFOxEZNdzndmJyAww9JmdiMwEh65mY0Vktyt3u1ilKNiJSCm6jBWRGaAJivE59FIl72o50/tz6Sn8epR6Eow1FuNtzi2k012iZecvptMYFnNyBtpBCkmcXhKkXOSUf+qOWIYwKtMEcZrIYpC3shikckTLAcwtpN+XOJUoGAuOIQCbX0iPBSlTHhzzeaklqb+jiZWUVLATkV1Pt4uJyGxwvNPe6Z0YiYKdiBTn6MxORHY/x3Hl2YnIrucUqUJcSSrLLiIlZBMURR458ppkm9nbzOxpM/t69viXA2PdgZ9vLec+VGXO7BzoJP7D8GCKHuLp/drSUnKssWcxOTa3lF5nf9mNYCxIS1lLd2ZabscHyOgVSNILtno7k3oyanrJnmC5pfn4cJ5fSacoza/MJ8cae9LHwlxwDAFYM0g9Cca8nj6GujkHQiuRmzKRxBOfzARFkSbZmU+6+zuHrGLN3W8ss83KBDsRmQaOT2aC4lKTbAAz22ySvTXYTYwuY0WkuM3Z2PEvY4s2ur7VzL5hZveb2WDrxQUzO5Y1z35LkV1XsBOREkq1UjyUBaTNx50lN/YZ4Dp3fyXwIPCxgbFrs560bwV+w8x+JG9luowVkeKcMqknYzXJ3mybmPko8GsDY8ezf58ws4eBVwGPRzujMzsRKWFis7G5TbLN7LkD374Z+Ivs5wfMbD77+hDwGgp81qczOxEpbkKzsQWbZP+8mb0Z6ACngbdli78M+IiZ9eifsN0zZBb3MpUJdu7QTqRBeD2dMgBQW9gz0lhzJZ2WEo0BLKyuJ8c66+n0km5r9Jms2vl0ukuznU7JWKilk0Dz0llGTR/Nu2QYtepJlF6ycCCdPgJxekk01twbHCfBGEBtMX38MZ9OW/FGOi2lsx6/K61EDtdkip5MrhBAgSbZdwF3DVnui8Arym6vMsFORKaA7o0VkVngOD6lt4sp2IlIcTqzE5GZ4I63Wzu9FyNRsBOREnxqq54o2IlIObqMFZFdzydWCOCKq0ywc6CVSPryRk4ZnaXl5Fht7/7k2Pz+s8mx1vnVcJu9VjqXrhe0f6oFOWT1ZrrzGMRdy5oX0omee4O8v862lZWKx+ca6d816gI2apkmgKVD6eNo4eDeYGxfcqy5fyXcZm15f3LMG+kcva6lX4ONTjrfEmA1kcuZ7N5XkmZjRWT3c8fzejlWlIKdiBTm7vTa6SuFKlOwE5HiHJ3ZichsULATkV3P3emplaKIzALNxo7J3dOpJ8vp1BIAn09P/9f2HUyPXXwmObbn6tFrdlnQHWtu4UIwFr8drYvpfeoEXcvGKTnlOd3HUiwo4QRxmk30OjSX01238lJPovSSpSMHgrH9ybH6ylXhNqPjrzefLv+0lmq1B6zmpAutJdKiJpJ6MsWzsapULCKFbc7GFnnkGbNv7B1m9u3scUeRfa/MmZ2ITIcoab6ocfrGmtlVwLuBm+jfj/DVbNkz0TZ1ZicixWWpJ0UeOS71jXX3FrDZN7aINwAPuvvpLMA9CBzNW0jBTkSKyz6zm0CwG6dvbNFln0XBTkQKc/qzsUUebG/f2NL0mZ2IFOceFsHYYrv6xh4HXrdl2YfzdqYywa7n6Sn11U68m8uL6aoU9f1HkmNzQUs4q8UnvXub6RSIxp50Z6jmSjrdYH7/xXCb7YtBR7Og21mUXpKXetIbsexJVN0F8lJP0q/tXPjaxp2+5vcHqSeH96e3eejq5Fj9yDXhNtl7KDnkwXG72kq/7uc24mBzbnX4cd0dMY3oWRx6k8mzu9Q3ln7wug146+ATzOy57v5U9u2lvrH02y/+JzPbzBd6PUO6kG1VmWAnItXnTCbPbpy+se5+2szeQz9gAtzt7qfztqlgJyLFOfiEbhcbtW9sNnYfcF+Z7SnYiUgJaqUoIrNAJZ5EZBa4O93is7GVomAnIiXoMnZsnV6Pk6vDm+8eXIp3c3EpXbGCXvp/obql00usmU5xALA96UorS8unkmMLh9OVVtrPpCuiAHSi1JP1dOPi6KbsvA+bR70PshZUfgGwejr1pL6QbqoTpfU0luL3rL6yPz0WVCepH0ynnrD/OeE2e8uHk2Orlq7ScqGdTos6sxZX5DmbSj0ZtXvSIF3GishMcPBJBM0doGAnIoU5PpGqJztBwU5EivPRC7ruNAU7ESnMPf8Ww6pSsBOR4tz1mZ2IzIZRi0PsNAU7ESlOqSfja/ecExeH54od2RN3jWoEnaz270nnOflcer21ZroUE8DcvvR6WUvn0vVW02ONtbjEk7fSeXa+sZYeC0pZeS/n85dRE0hzSmRZLZ1nZ3PpEk+2mH5fbCF+z2pBbqQt70+O9ebTpaF6e9L5eQCr9cXk2KnVdP7j959J503+4MJGuM2Tzwwf70xgYsGBniYoRGTXc9cEhYjsfq6kYhGZCVMc7NRwR0RK6N9BUeSRJ69J9sDzbjUzN7Obsu+vM7O1gebZ/7XInuvMTkSKm9AdFEWbZJvZXuDfAl/esorH3f3GMtvUmZ2IFOb08+yKPHIUbZL9HuD9QDoVoaDKnNm1uj2+e2Z4+sRyM97Ndi+dQrLWTi+73FxOji2upNMNAOZr6TfTWqvpsU46bcA68ftZC1JIolJWFozhO5QzFZTX8nq6xJMHKSveiEs8dRvpNBBvpjuTbXh6mxfa8et3LijHFKWXPH4mfQw9cSIuBbZ6fvhxNJEb+N3pTWY2dlij61cPPsHM/jbwAnf/H2b2S1uWf5GZfQ04D/yKu/9R3gYrE+xEpPrcS91BccjMjg18f6+731tkQTOrAb9O1lFsi6eAF7r7KTP7MeDTZvZydz8frVPBTkRKKVGpeJwm2XuBvwk8bGYAVwMPmNmb3f0YsAHg7l81s8eBlwKDgfUyCnYiUpwX+jyuiLBJtrufAy51GDezh4F3ufsxMzsMnHb3rpm9GLgeeCJvgwp2IlLchPLsCjbJTvl7wN1m1gZ6wL9Sk2wRmShncoUA8ppkb/n56wa+/n3g98tuT8FORIpzp9tS1ZOxrLW6/N8nzw0dy6vWcHI1nXJwaCmdxrBvPkhLmU+nGwAsNdLjzXo6FaZRS+/rXHN/uM1gtdSDyi/BEMFQtmzeM4brefyeRaPR2x0dC+2c46TTTo+vr6f/gFfH6PR1MtHpC+LqJd/+fro6zv87Hk46cu7k8LSVbmf8IOWe/95WVWWCnYhMh66CnYjsdg5MaR0ABTsRKUdndiKy6/UcWqpULCKzQJexIrLrOa7L2HFttLo8/ldnho794FxcDeTAniC9ZCndvGV/MLaYU2llqZlOPVkMxpr1dLWPRj1O84jSQKKmQ1FaSp7tSj3pBpdC0VVS9IfWzjnlWO+kq3WsBZU8nllPV405t5quXAJw6kJ6PNUYB9KVSyCdWrLp7FPHh/68E6TQFKUJChGZGQp2IrLruWs2VkRmgKPZWBGZAfrMTkRmhi5jRWTX639mt9N7MZpS3cWs779kfR6/kTXEGPa8n8nGHzGz909mV0WkCrruhR5VU/bM7o30SyBfT78T0G9yeUegg8B/Bn7M3Z82s4+Z2c3u/gfRiltrG/z1I48NHWsspLuAAdSb6a5R9bl0zlttLh3r8/LLguZYWFRuKRiLlstjI+bDRfuznXojfsjtwR9RXj/TaJu9TnqsGxSr7LSCzm1AtzW8Yx5Aez3dJax9MV3GaeOZuCjvxvmTw/dl/WK4XBFOvzTwJJjZUeBD9CsVf9Td70k871bgfuDvZP0nMLO7gLcDXeDn3f1zedsrG+xuAT7u/SPuS2a238ye6+5PDTznxcC33f3p7PvPA7cCYbATkepzfCKzseM0yTazG+j3rHg58Dzg82b2UncPezyWbZI9rNfj87c85zHgR83sOjObA97Cs7sIiciU6s/GTuQydpwm2bcAn3D3DXf/Dv2Y8+N5Gywb7HK5+xngXwOfBP4I+Ev6p5qXMbM7zeyYmR3rbcSNf0WkArIJiiIPsr6xA487B9aUe+I02CR7y14UOem6TO5lrJm9A/jZ7NuvEPd6BMDdPwN8Jlv+ThLBLmuYey9A46prq/eJpog8y+aZXUFR39hQTpPskeSe2bn7h939Rne/Efg08M+yWdmfAM5t+bxuc0ePZP8eAP4N8NFJ7bCI7KwSZ3aRMk2y/xL4CfpNsm8qsOxQZScoPgu8if418irwzzcHzOzrWUAE+JCZ/a3s67vd/VsltyMiFdRjYreLjdMkew34PTP7dfoTFNcDf5q3QYum8q8kM3sa+Kvs20PA8PlzqSq9Z9U0+L5c6+6Hx1mZmf0vBoJQjpPufjRY15uA3+CHTbLfm2qSPRjssu//A/AvgA7w79z9f+bue1WC3SAzOzbqtb7sDL1n1aT35YcmPhsrIlJFCnYiMhOqGuzu3ekdkNL0nlWT3pdMJT+zExGZtKqe2YmITNSOBjuVjJo+ZnbUzL6ZvWe/PGR83sw+mY1/2cyu24HdnCkF3pNrzewPsr+hh83smp3Yz52202d2gyWj7qRfMupZBkpG3ezuLweuNrObr+heCvCsShVvBG4Abs8qUAx6O3DG3V8CfJD+TdyyTQq+Jx+gX63olcDdwPuu7F5Ww04Hu0slo9z9S8B+M3vuluekSkbJlVekUsUtwMeyr+8HbrZRi+1JEUXekxuAh7KvvzBkfCbsdLBTyajpUuT9uvQcd+8A54CDV2TvZlOR9+TPgJ/Kvv5JYG92xTRTdjrY5SpTMkpEhnoX8Foz+xrwWvr3os7c39AVb7iznSWjZNsVqTax+ZwnszPxfcCpK7N7Myn3PXH375Gd2ZnZMnCru5+9UjtYFVf8zE4lo6bapUoVZtakX6nigS3PeQC4I/v6p4GHXMmc2yn3PTGzQ1l9OIC7gPuu8D5Wwk5fxn4WeIL+53K/RT+QAf2SUQPP+5CZPQr8MXCPSkbtjOwzuHcCnwP+AviUuz9iZneb2Zuzp/02cNDMHgN+EbgsFUImp+B78jrgm2b2LeA5wHt3ZGd3mO6gEJGZsNNndiIiV4SCnYjMBAU7EZkJCnYiMhMU7ERkJijYichMULATkZmgYCciM+H/A8FcxMYui1epAAAAAElFTkSuQmCC\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
......@@ -875,7 +875,7 @@
"name": "stdout",
"output_type": "stream",
"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 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.10"
"version": "3.7.0"
},
"toc": {
"base_numbering": 1,
......
......@@ -405,17 +405,9 @@
}
},
"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": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -429,6 +421,7 @@
"n = 4\n",
"G = nx.Graph()\n",
"V = range(n)\n",
"G.add_nodes_from(V)\n",
"E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n",
"G.add_edges_from(E)\n",
"\n",
......@@ -766,7 +759,7 @@
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -808,12 +801,12 @@
"name": "stdout",
"output_type": "stream",
"text": [
"找到的割的比特串形式: 0101\n"
"找到的割的比特串形式: 1010\n"
]
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -886,7 +879,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
"version": "3.7.10"
},
"toc": {
"base_numbering": 1,
......
......@@ -392,17 +392,9 @@
}
},
"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": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -416,6 +408,7 @@
"n = 4\n",
"G = nx.Graph()\n",
"V = range(n)\n",
"G.add_nodes_from(V)\n",
"E = [(0, 1), (1, 2), (2, 3), (3, 0)]\n",
"G.add_edges_from(E)\n",
"\n",
......@@ -755,7 +748,7 @@
"outputs": [
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -797,12 +790,12 @@
"name": "stdout",
"output_type": "stream",
"text": [
"The bit string form of the cut found: 1010\n"
"The bit string form of the cut found: 0101\n"
]
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
......@@ -875,7 +868,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
"version": "3.7.10"
},
"toc": {
"base_numbering": 1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册