量子计算学习路径规划
In [4]:
Copied!
import deepquantum as dq
import deepquantum.photonic as dqp
import torch
import torch.nn as nn
import deepquantum as dq
import deepquantum.photonic as dqp
import torch
import torch.nn as nn
In [1]:
Copied!
import deepquantum as dq
cir = dq.QubitCircuit(2)
cir.h(0)
cir.cnot(0, 1)
cir.rx(1, 0.2)
cir.observable(0)
print(cir())
print(cir.expectation())
import deepquantum as dq
cir = dq.QubitCircuit(2)
cir.h(0)
cir.cnot(0, 1)
cir.rx(1, 0.2)
cir.observable(0)
print(cir())
print(cir.expectation())
tensor([[0.7036+0.0000j],
[0.0000-0.0706j],
[0.0000-0.0706j],
[0.7036+0.0000j]])
tensor([0.])
In [2]:
Copied!
cir = dq.QubitCircuit(2, mps=True, chi=4)
cir.h(0)
cir.cnot(0, 1)
cir.rx(1, 0.2)
cir.observable(0)
print(cir())
print(cir.expectation())
cir = dq.QubitCircuit(2, mps=True, chi=4)
cir.h(0)
cir.cnot(0, 1)
cir.rx(1, 0.2)
cir.observable(0)
print(cir())
print(cir.expectation())
[tensor([[[1.+0.j, 0.+0.j],
[0.-0.j, 1.+0.j]]]), tensor([[[0.7036+0.0000j],
[0.0000-0.0706j]],
[[0.0000-0.0706j],
[0.7036+0.0000j]]])]
tensor([2.6822e-07])
In [3]:
Copied!
cir = dq.QumodeCircuit(2, [1,1])
cir.dc([0,1])
cir.ps(0, 0.1)
cir.bs([0,1], [0.2,0.3])
print(cir())
print(cir.measure())
cir = dq.QumodeCircuit(2, [1,1])
cir.dc([0,1])
cir.ps(0, 0.1)
cir.bs([0,1], [0.2,0.3])
print(cir())
print(cir.measure())
tensor([[ 0.6480-0.0650j, -0.2034+0.7311j],
[ 0.1294+0.7477j, 0.6383+0.1294j]])
{|20>: 487, |02>: 516, |11>: 21}
In [5]:
Copied!
class Hybrid(nn.Module):
def __init__(self, dim_in, nqubit):
super().__init__()
self.fc1 = nn.Linear(dim_in, nqubit)
# 构建好的线路本身就是nn.Module
self.cir = self.circuit(nqubit)
self.fc2 = nn.Linear(nqubit, 1)
def circuit(self, nqubit):
cir = dq.QubitCircuit(nqubit)
cir.hlayer()
# 准备将经典数据编码到量子线路中
cir.rylayer(encode=True)
cir.rxlayer()
cir.cnot_ring()
for i in range(nqubit):
cir.observable(i)
return cir
def forward(self, x):
x = torch.arctan(self.fc1(x))
# 前向计算的第一个参数对应于要编码的数据
self.cir(x)
exp = self.cir.expectation()
out = self.fc2(exp)
return out
nqubit = 4
batch = 2
nfeat = 8
x = torch.sin(torch.tensor(list(range(batch * nfeat)))).reshape(batch, nfeat)
net = Hybrid(nfeat, nqubit)
y = net(x)
print(y)
for i in net.named_parameters():
print(i)
class Hybrid(nn.Module):
def __init__(self, dim_in, nqubit):
super().__init__()
self.fc1 = nn.Linear(dim_in, nqubit)
# 构建好的线路本身就是nn.Module
self.cir = self.circuit(nqubit)
self.fc2 = nn.Linear(nqubit, 1)
def circuit(self, nqubit):
cir = dq.QubitCircuit(nqubit)
cir.hlayer()
# 准备将经典数据编码到量子线路中
cir.rylayer(encode=True)
cir.rxlayer()
cir.cnot_ring()
for i in range(nqubit):
cir.observable(i)
return cir
def forward(self, x):
x = torch.arctan(self.fc1(x))
# 前向计算的第一个参数对应于要编码的数据
self.cir(x)
exp = self.cir.expectation()
out = self.fc2(exp)
return out
nqubit = 4
batch = 2
nfeat = 8
x = torch.sin(torch.tensor(list(range(batch * nfeat)))).reshape(batch, nfeat)
net = Hybrid(nfeat, nqubit)
y = net(x)
print(y)
for i in net.named_parameters():
print(i)
tensor([[-0.4744],
[-0.4817]], grad_fn=<AddmmBackward0>)
('fc1.weight', Parameter containing:
tensor([[-0.0689, 0.2601, 0.3227, 0.3401, 0.0606, 0.2179, 0.3464, 0.2867],
[ 0.2584, -0.0296, 0.0859, -0.1323, -0.3210, 0.1817, 0.3025, -0.2655],
[-0.0068, -0.1469, -0.0710, -0.1834, 0.2303, 0.2150, 0.0892, -0.1840],
[ 0.3451, 0.3216, -0.1844, -0.2062, -0.0359, -0.2329, 0.3050, 0.0050]],
requires_grad=True))
('fc1.bias', Parameter containing:
tensor([-0.2667, 0.1115, -0.1669, -0.2236], requires_grad=True))
('cir.operators.8.theta', Parameter containing:
tensor(2.5965, requires_grad=True))
('cir.operators.9.theta', Parameter containing:
tensor(2.3473, requires_grad=True))
('cir.operators.10.theta', Parameter containing:
tensor(10.3887, requires_grad=True))
('cir.operators.11.theta', Parameter containing:
tensor(5.4013, requires_grad=True))
('fc2.weight', Parameter containing:
tensor([[0.2741, 0.1773, 0.2788, 0.1564]], requires_grad=True))
('fc2.bias', Parameter containing:
tensor([-0.4741], requires_grad=True))
In [ ]:
Copied!