24#include "ns3/core-module.h"
25#include "ns3/network-module.h"
27#include "ns3/q2ns-netcontroller.h"
28#include "ns3/q2ns-qmap.h"
29#include "ns3/q2ns-qnode.h"
30#include "ns3/q2ns-qstate.h"
31#include "ns3/q2ns-qubit.h"
32#include "ns3/simulator.h"
41int main(
int argc,
char* argv[]) {
43 RngSeedManager::SetSeed(std::random_device{}() | 1u);
45 std::string mode =
"loss+depol";
47 double depolRate = 1e8;
52 "Demo mode: loss+depol | randomgate | randomunitary | conditional | lambda | lambda-random",
54 cmd.AddValue(
"lossP",
"Loss probability used in loss+depol mode", lossP);
55 cmd.AddValue(
"depolRate",
"Depolarizing rate [1/s] used in loss+depol mode", depolRate);
56 cmd.Parse(argc, argv);
62 B->SetRecvCallback([&net](std::shared_ptr<Qubit> q) {
63 std::cout <<
"Qubit received at " << Simulator::Now() <<
"\n";
64 std::cout <<
"In state: " << net.
GetState(q) <<
"\n";
68 std::cout <<
"Running " << mode <<
"\n";
70 if (mode ==
"loss+depol") {
71 auto loss = CreateObject<LossQMap>();
72 loss->SetAttribute(
"Probability", DoubleValue(lossP));
74 auto depol = CreateObject<DepolarizingQMap>();
75 depol->SetAttribute(
"Rate", DoubleValue(depolRate));
78 }
else if (mode ==
"randomgate") {
79 auto rg = CreateObject<RandomGateQMap>();
82 rg->SetAttribute(
"Probability", DoubleValue(1.0));
84 }
else if (mode ==
"randomunitary") {
85 auto ru = CreateObject<RandomUnitaryQMap>();
86 ru->SetAttribute(
"Probability", DoubleValue(1.0));
88 }
else if (mode ==
"conditional") {
89 auto loss = CreateObject<LossQMap>();
90 loss->SetAttribute(
"Probability", DoubleValue(1.0));
92 auto cond = CreateObject<ConditionalQMap>();
94 cond->SetCondition([](
const std::shared_ptr<Qubit>&,
const QMapContext& ctx) {
98 }
else if (mode ==
"lambda") {
101 }
else if (mode ==
"lambda-random") {
102 const double rate = 5e6;
104 Ptr<UniformRandomVariable> u,
const QMapContext& ctx) {
106 if (p > 0.0 && u->GetValue(0.0, 1.0) < p) {
111 NS_ABORT_MSG(
"Unknown mode: " << mode);
115 ch->SetAttribute(
"Delay", TimeValue(NanoSeconds(10)));
116 ch->SetAttribute(
"QMap", PointerValue(map));
119 auto q = A->CreateQubit();
123 Simulator::Schedule(NanoSeconds(1), [A, B, q]() { A->Send(q, B->GetId()); });
125 Simulator::Stop(MilliSeconds(1));
128 const bool lost = (q->GetLocation().type == LocationType::Lost);
129 std::cout <<
"Qubit status: " << (lost ?
"LOST" :
"delivered") <<
"\n";
131 Simulator::Destroy();
Main user-facing facade for creating and configuring a quantum network.
std::shared_ptr< QState > GetState(const std::shared_ptr< Qubit > &q) const
Convenience helper to get a qubit's current backend state.
ns3::Ptr< QNode > CreateNode(const std::string &label="")
Create a QNode with an optional human-readable label.
ns3::Ptr< QChannel > InstallQuantumLink(ns3::Ptr< QNode > a, ns3::Ptr< QNode > b)
Install a duplex quantum link between two nodes.
static ns3::Ptr< QMap > Compose(const ns3::Ptr< QMap > &a, const ns3::Ptr< QMap > &b)
Compose two QMaps into one sequential composite QMap.
static double RateToProb(double rate_per_s, const ns3::Time &t)
Convert a Poisson rate and elapsed time into an event probability.
static ns3::Ptr< QMap > FromLambda(std::function< void(QNode &, std::shared_ptr< Qubit > &)> f)
Build a QMap from a simple lambda.
Main user-facing per-node API for quantum operations and transmission.
bool Apply(const QGate &gate, const std::vector< std::shared_ptr< Qubit > > &qs)
Apply a gate to one or more local qubits.
QGate X(ns3::Time d=ns3::Seconds(0))
Return the Pauli-X gate descriptor.
QGate H(ns3::Time d=ns3::Seconds(0))
Return the Hadamard gate descriptor.
QGate S(ns3::Time d=ns3::Seconds(0))
Return the phase gate descriptor.
QGate Z(ns3::Time d=ns3::Seconds(0))
Return the Pauli-Z gate descriptor.
Optional per-sample context passed to QMaps.
ns3::Time elapsedTime
Elapsed time that this map is applied over.