Source code for qkdsec.proofs.channels.decoy
from dataclasses import dataclass, field
from ..decoy_state import DecoyBounds, two_decoy_bounds
from .base import Channel
[docs]
@dataclass
class DecoyChannel(Channel):
mu_signal: float
mu_decoy: float
gain_signal: float
gain_decoy: float
gain_vacuum: float
qber_signal: float
qber_decoy: float
e_0: float = 0.5
bounds: DecoyBounds = field(init=False)
def __post_init__(self) -> None:
self.bounds = two_decoy_bounds(
mu_signal=self.mu_signal,
mu_decoy=self.mu_decoy,
gain_signal=self.gain_signal,
gain_decoy=self.gain_decoy,
gain_vacuum=self.gain_vacuum,
qber_decoy=self.qber_decoy,
e_0=self.e_0,
)
[docs]
def expectations(self) -> dict[str, float]:
c = 1.0 - 2.0 * self.bounds.e_1_upper
return {"ZZ": c, "XX": c}
[docs]
def single_photon_yield(self) -> float:
return self.bounds.Q_1_lower
[docs]
def total_yield(self) -> float:
return self.gain_signal
[docs]
def total_qber(self) -> float:
return self.qber_signal