分布式量子网络模拟器
项目描述
NetQuil:分布式量子计算模拟的量子游乐场
NetQuil 是一个开源 Python 框架,专为模拟量子网络和分布式量子协议而设计。建立在已经广泛的量子计算框架pyQuil 之上,由Rigetti Computing, netQuil 非常适合扩展您当前的量子计算实验和测试量子网络拓扑和分布式量子协议的想法。NetQuil 提供了一个可扩展的设备模拟器、量子和经典噪声模块,以及一个高性能的多线程模拟管理器。它还允许您跨网络运行多个试验,根据本地时钟和主时钟同步代理,并使用网络监视器实时查看流量。NetQuil 还针对分布式量子协议进行了优化,它实现了Yimsiriwattana Lomonaco引入的原始 cat-entangler 和 cat-disentangler. 这种原始协议可用于实现非本地 CNOT、非本地受控门和隐形传输,并且应该是您创建的任何分布式量子协议的主干。
NetQuil 是 AT&T Foundry 的一个项目。NetQuil 是一项正在进行中的工作,我们鼓励大家做出贡献。
文档
浏览 netQuil 的文档中心,了解有关该框架及其用例的更多信息。如果您有兴趣了解分布式量子计算 (DQC) 的状态以及 netQuil 作为该领域框架的作用,请阅读白皮书“netQuil:分布式量子计算模拟的量子游乐场”。
安装
您可以使用以下命令直接安装 netQuil pip:
pip install netquil
netQuil 设计
演示
在demos文件夹和文档中心查看 netQuil 的运行情况:
量子隐形传态
作为 netQuil 的一个简单演示,让我们想象一个场景,Alice 想要向 Bob 发送她拥有的任意量子比特的量子状态。由于爱丽丝不知道量子比特的状态,她无法测量它,因为测量它会导致状态崩溃,爱丽丝决定使用量子隐形传态。
- 查理创建了一个钟态对,并将一个量子位发送给爱丽丝,另一个发送给鲍勃。
- 爱丽丝收到查理的量子比特。Alice 使用 CNOT 和 Hadamard 门将她的任意量子态投射到量子比特 A 上。
- 爱丽丝测量她的量子比特并将结果经典地发送给鲍勃。作为测量的结果,鲍勃的状态崩溃为四个贝尔状态之一。
- Bob 根据 Alice 的测量值重新创建 Alice 的任意状态,即如果 Alice 的钟状态对为 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)
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。