分布式量子网络模拟器
netQuil的Python项目详细描述
netquil:分布式量子计算模拟的量子乐园
netquil是一个开源的python框架,专门用于模拟量子网络和分布式量子协议。netquil建立在已经广泛使用的量子计算框架pyQuil的基础上,由Rigetti Computing开发,非常适合扩展您当前的量子计算实验,测试量子网络拓扑和分布式量子协议的思想。netquil提供了一个可扩展的设备模拟器、量子和经典噪声模块以及一个高性能的多线程模拟管理器。它还允许您在网络上运行多个测试,基于本地和主时钟同步代理,并使用网络监视器实时查看流量。netquil还针对分布式量子协议进行了优化,实现了Yimsiriwattana Lomonaco引入的原始猫纠缠器和猫解纠缠器。这种原始协议可以用于实现非本地cnot、非本地控制门和远程传输,并且应该是您创建的任何分布式量子协议的主干。
netquil是a t&t foundry的一个项目。netquil是一项正在进行中的工作,我们鼓励您做出贡献。
文档
探索netquil的documentation center了解有关框架及其用例的更多信息。如果你有兴趣了解分布式量子计算(dqc)的现状以及netquil作为该领域框架的作用,请阅读whitepaper,“netquil:分布式量子计算模拟的量子游乐场”。
安装
您可以使用pip
:
pip install netquil
Netquil设计
演示
在demos文件夹和documentation center:
量子隐形传态
作为netquil的一个简单演示,让我们想象一下这样一个场景:alice想向bob发送她拥有的任意qubit的量子态。 由于alice不知道量子位的状态,并且她不能测量它,因为测量它会导致状态崩溃,所以alice决定使用quantum teleportation。
- 查理创建了一个钟形状态对,并将一个量子位发送给爱丽丝,另一个发送给鲍勃。
- 爱丽丝收到查理的古比特。爱丽丝使用cnot和hadamard门将她任意的量子态投射到量子位a上。
- 爱丽丝测量她的量子位,然后古典地将结果发送给鲍勃。作为测量的结果,鲍勃的状态崩溃为四个贝尔状态之一。
- bob根据alice的测量值重新创建alice的任意状态,即如果alice的bell状态对为1,则应用pauli-x(x)门;如果任意状态的测量值为1,则应用pauli-z(z)门。
我们可以通过以下方式使用netquil实现量子隐形传态:
from pyquil import Program
from pyquil.api import WavefunctionSimulator, QVMConnection
from pyquil.gates import *
def printWF(p):
'''
Prints the wavefunction from simulating a program p
'''
wf_sim = WavefunctionSimulator()
waveFunction = wf_sim.wavefunction(p)
print(waveFunction)
class Charlie(Agent):
'''
Charlie sends Bell pairs to Alice and Bob
'''
def run(self):
# Create Bell State Pair
p = self.program
p += H(0)
p += CNOT(0,1)
self.qsend(alice.name, [0])
self.qsend(bob.name, [1])
class Alice(Agent):
'''
Alice projects her state on her Bell State Pair from Charlie
'''
def run(self):
p = self.program
# Define Alice's Qubits
phi = self.qubits[0]
qubitsCharlie = self.qrecv(charlie.name)
a = qubitsCharlie[0]
# Entangle Ancilla and Phi
p += CNOT(phi, a)
p += H(phi)
# Measure Ancilla and Phi
p += MEASURE(a, ro[0])
p += MEASURE(phi, ro[1])
class Bob(Agent):
'''
Bob recreates Alice's state based on her measurements
'''
def run(self):
p = self.program
# Define Bob's qubits
qubitsCharlie = self.qrecv(charlie.name)
b = qubitsCharlie[0]
# Prepare State Based on Measurements
p.if_then(ro[0], X(b))
p.if_then(ro[1], Z(b))
p = Program()
# Prepare psi
p += H(2)
p += Z(2)
p += RZ(1.2, 2)
print("Initial Alice State: ")
printWF(p)
# Create Classical Memory
ro = p.declare('ro', 'BIT', 3)
# Create Alice, Bob, and Charlie. Give Alice qubit 2 (phi). Give Charlie qubits [0,1] (Bell State Pairs).
alice = Alice(p, qubits=[2], name='alice')
bob = Bob(p, name='bob')
charlie = Charlie(p, qubits=[0,1], name='charlie')
# Connect agents to distribute qubits and report results
QConnect(alice, charlie, bob)
CConnect(alice, bob)
# Run simulation
Simulation(alice, bob, charlie).run(trials=1, agent_classes=[Alice, Bob, Charlie])
qvm = QVMConnection()
qvm.run(p)
print("Final Bob's State: ")
printWF(p)