13个不稳定版本 (5个重大变更)

使用旧的Rust 2015

0.6.1 2020年1月19日
0.6.0 2020年1月19日
0.5.0 2020年1月15日
0.4.0 2019年3月24日
0.1.1 2018年9月1日

#352 in 模拟

MIT许可协议

83KB
1.5K SLoC

CQC

Latest version Documentation License

一个无I/O的Rust实现,用于CQC接口。

经典-量子组合器(CQC)接口用于编程量子网络节点以创建、传输和处理量子比特。

CQC接口将用于与荷兰演示网络交互,目前由荷兰QuTech开发中。目前,CQC接口仅由量子网络模拟器Simulaqron支持。

工作原理

此库提供两个函数

  1. 构建有效的CQC数据包。

  2. 编码/解码二进制格式。用户需要自行决定如何将其框架中的I/O最佳化。

构建数据包

此crate提供两种构建数据包的方式

  1. 手动 - 可以使用在hdr模块中提供的头定义和文档手动构建数据包。

  2. 使用builder模块 - builder模块提供了一个简单的API来生成CQC数据包。它应与hdr模块中的CQC接口文档一起使用。

编码/解码数据包

hdr模块中的所有头都实现了serdeSerializeDeserialize特质,这意味着它们可以直接作为bincode的输入使用。EncoderDecoder实现提供了一个示例。

builder模块返回一个Request结构体,该结构体实现了Serialize,可以与bincode一起使用。

库提供了一个Response结构体,该结构体实现了Deserialize,可以用于反序列化SimulaQron服务器返回的任何响应。

CQC应用示例

以下示例将在一个节点上创建一个量子比特并将其发送到另一个节点。在运行以下示例之前,请使用以下命令启动SimulaQron节点:$NETSIM/run/startAll.sh --nrnodes 2

extern crate bincode;
extern crate cqc;

use cqc::builder;
use cqc::hdr;
use std::net;

fn main() {
    // Initialise local node `localhost:8803`.
    let hostname = String::from("localhost");
    let local_port: u16 = 8803;

    // Set up remote node `127.0.0.1:8804`.
    let remote_host: u32 = u32::from(net::Ipv4Addr::new(127, 0, 0, 1));
    let remote_port: u16 = 8804;

    // Initialise application state with ID 10.
    let app_id: u16 = 10;
    let builder = builder::Builder::new(app_id);
    let mut coder = bincode::config();
    coder.big_endian();

    // Create, and send a qubit from `localhost:8803` to `localhost:8804`.
    {
        // Open connection to local node.
        let stream = net::TcpStream::connect((hostname.as_str(), local_port))
            .expect("Connect failed");

        // Create the qubit.
        let request = builder.cmd_new(0, hdr::CmdOpt::empty());
        coder.serialize_into(&stream, &request).expect(
            "Sending failed",
        );

        // Wait for confirmation of creation.
        let response: cqc::Response = coder.deserialize_from(&stream).expect("Receive failed");

        // Read the created qubit ID.
        let note = response.notify.get_notify_hdr();
        let qubit_id = note.qubit_id;

        // Send the qubit to the remote node.
        let request = builder.cmd_send(
            qubit_id,
            *hdr::CmdOpt::empty().set_notify(),
            builder::RemoteId {
                remote_app_id: app_id,
                remote_node: remote_host,
                remote_port: remote_port,
            },
        );
        coder.serialize_into(&stream, &request).expect(
            "Sending failed",
        );

        // Wait for confirmation.
        let response: cqc::Response = coder.deserialize_from(&stream).expect("Receive failed");
        assert!(response.cqc_hdr.msg_type.is_done(), "Unexpected response");
    }

    // Receive the qubit on the remote node, `localhost:8804`.
    {
        // Open connection to local node.
        let stream = net::TcpStream::connect((hostname.as_str(), remote_port))
            .expect("Connect failed");

        // Send a request to receive a qubit.
        let request = builder.cmd_recv(0, hdr::CmdOpt::empty());
        coder.serialize_into(&stream, &request).expect(
            "Sending failed",
        );

        // Receive a response.
        let response: cqc::Response = coder.deserialize_from(&stream).expect("Receive failed");
        assert!(response.cqc_hdr.msg_type.is_recv(), "Unexpected response");
        let note = response.notify.get_notify_hdr();
        let qubit_id = note.qubit_id;

        println!("Received qubit ID: {}", qubit_id);
    }
}

设计目标

以下目标驱动了cqc crate的设计

  • 用户应该能够创建任何有效的数据包

    通过为不同的CQC头定义正确的结构体,实现了这一目标。

  • 创建无效数据包应该困难,最好是无法实现

    第二个目标是通过尽可能多地使用Rust的类型系统来实现,特别是对于只有一小组可能值的字段使用枚举。此外,还提供了一个builder模块,该模块保证了正确的CQC数据包。

  • 如果检测到未识别的值,解码应引发错误

    这是通过类型定义和反序列化实现相结合来实现的。

  • 不应对用户的运行时做出任何假设

    该库不包含I/O,只提供非常简单的编码器和解码器作为示例。意图是用户使用cqc库构建数据包,但I/O由用户负责。实现了SerializeDeserialize特性,以便用户可以使用bincode进行编码/解码。

局限性

  • 目前不完全支持Factory、Mix、If、InfTime头。

依赖关系

~0.7–1.4MB
~32K SLoC