16#include "ns3/nstime.h"
17#include "ns3/object.h"
19#include "ns3/random-variable-stream.h"
21#include "ns3/q2ns-types.h"
65class QMap :
public ns3::Object {
104 static ns3::Ptr<QMap>
Compose(
const ns3::Ptr<QMap>& a,
const ns3::Ptr<QMap>& b);
116 static ns3::Ptr<QMap>
Compose(
const std::vector<ns3::Ptr<QMap>>& maps);
130 static ns3::Ptr<QMap>
FromLambda(std::function<
void(
QNode&, std::shared_ptr<Qubit>&)> f);
143 static ns3::Ptr<QMap>
145 ns3::Ptr<ns3::UniformRandomVariable>,
const QMapContext&)>
158 static inline double RateToProb(
double rate_per_s,
const ns3::Time& t) {
159 const double s = t.GetSeconds();
160 if (rate_per_s <= 0.0 || s <= 0.0) {
163 const double p = 1.0 - std::exp(-rate_per_s * s);
164 return (p < 0.0) ? 0.0 : (p > 1.0 ? 1.0 : p);
191 return u->GetValue(0.0, 1.0) < p;
228 ns3::Ptr<ns3::UniformRandomVariable>,
const QMapContext&)>;
304 void SetQMap(ns3::Ptr<QMap> qmap);
417 void SetDistribution(std::vector<QGate> gates, std::vector<double> weights);
446 std::size_t
PickIndex_(ns3::Ptr<ns3::UniformRandomVariable> u)
const;
QMap wrapper that conditionally applies another QMap.
void SetQMap(ns3::Ptr< QMap > qmap)
Set the wrapped QMap.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
Condition cond_
Application predicate.
std::function< bool(const std::shared_ptr< Qubit > &, const QMapContext &)> Condition
Predicate type controlling whether the wrapped map is applied.
void SetCondition(Condition pred)
Set the condition predicate.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
ns3::Ptr< QMap > qmap_
Wrapped QMap.
Dephasing noise model that applies Z with probability p.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
Trajectory-style depolarizing model that applies a random Pauli from {X, Y, Z} with probability p.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
QMap implementation that wraps a user-provided lambda.
AdvancedFn advanced_
Advanced callable, if configured.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
void Set(SimpleFn f)
Replace the stored callable with a simple callable.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
std::function< void(QNode &, std::shared_ptr< Qubit > &, ns3::Ptr< ns3::UniformRandomVariable >, const QMapContext &)> AdvancedFn
Advanced callable type.
LambdaQMap()=default
Default constructor.
std::function< void(QNode &, std::shared_ptr< Qubit > &)> SimpleFn
Simple callable type.
SimpleFn simple_
Simple callable, if configured.
Erasure model that marks the qubit lost with probability p.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
Lightweight gate descriptor used by QState backends.
Abstract base class for channel map models.
~QMap() override=default
Virtual destructor.
static ns3::Ptr< QMap > Compose(const ns3::Ptr< QMap > &a, const ns3::Ptr< QMap > &b)
Compose two QMaps into one sequential composite QMap.
double GetProb_(const QMapContext &ctx) const
Return the effective application probability for this transmission.
static double RateToProb(double rate_per_s, const ns3::Time &t)
Convert a Poisson rate and elapsed time into an event probability.
static void SetLost_(Qubit &q)
Mark a qubit lost through the standard registry-backed location path.
static ns3::Ptr< QMap > FromLambda(std::function< void(QNode &, std::shared_ptr< Qubit > &)> f)
Build a QMap from a simple lambda.
double p_
Direct per-transmission probability.
double rate_
Poisson event rate in 1/s. Overrides p_ when positive.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
bool Bernoulli_(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx) const
Perform one Bernoulli trial using the effective probability.
virtual QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const =0
Sample a per-transmission QMapInstance.
Main user-facing per-node API for quantum operations and transmission.
Lightweight handle for one qubit inside a registry-managed state.
QMap that samples one gate from a weighted distribution and applies it.
std::size_t PickIndex_(ns3::Ptr< ns3::UniformRandomVariable > u) const
Pick one gate index from the configured weighted distribution.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
void SetDistribution(std::vector< QGate > gates, std::vector< double > weights)
Replace the weighted gate distribution.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
void AddGate(const QGate &gate, double weight)
Append one weighted gate to the distribution.
double totalWeight_
Sum of all selection weights.
void Clear()
Clear the weighted gate distribution.
std::vector< QGate > gates_
Candidate gates.
std::vector< double > weights_
Selection weights.
QMap that applies one Haar-random single-qubit SU(2) unitary.
QMapInstance Sample(ns3::Ptr< ns3::UniformRandomVariable > u, const QMapContext &ctx=QMapContext{}) const override
Sample a per-transmission QMapInstance.
static Matrix SampleHaarSU2_(ns3::Ptr< ns3::UniformRandomVariable > u)
Sample a Haar-random SU(2) matrix.
static ns3::TypeId GetTypeId()
Get the ns-3 TypeId.
Eigen::MatrixXcd Matrix
Dynamic complex matrix type used for custom gates and matrix-based states.
std::function< void(QNode &, std::shared_ptr< Qubit > &)> QMapInstance
Per-transmission quantum map callable applied to a received qubit.
Optional per-sample context passed to QMaps.
ns3::Time elapsedTime
Elapsed time that this map is applied over.