Three-level Lambda system (STIRAP)
Task id: transfer/LambdaSTIRAP-v0. Model: qenvs.models.lambda_system.LambdaSystem.
Environment: qenvs.envs.StateTransfer (shared with qubit/StateTransfer-v0), target
\(\lvert 3\rangle\). Reference pulses: qenvs.models.lambda_system.stirap_pulses.
Two ground states \(\lvert 1\rangle\) and \(\lvert 3\rangle\) are coupled to a common excited state \(\lvert 2\rangle\) by a pump and a Stokes field. The task is to move the population from \(\lvert 1\rangle\) to \(\lvert 3\rangle\) without populating \(\lvert 2\rangle\), which decays by spontaneous emission. The textbook solution is stimulated Raman adiabatic passage (STIRAP): apply the Stokes pulse before the pump pulse (counter-intuitive order) and change the fields slowly enough that the system follows the dark state (Bergmann, Theuer and Shore 1998; Vitanov et al. 2017).
Physics
Rotating-frame Hamiltonian under the rotating-wave approximation (\(\hbar = 1\)):
with \(\Delta\) the one-photon (pump) detuning, \(\delta\) the two-photon detuning and \(\Omega_p\), \(\Omega_s\) the real pump and Stokes Rabi frequencies (the two controls). In matrix form, in the basis \((\lvert 1\rangle, \lvert 2\rangle, \lvert 3\rangle)\),
Adiabatic states. For \(\delta = 0\) and any \(\Delta\), with the mixing angle \(\tan\theta = \Omega_p / \Omega_s\), the dark state
is an exact eigenstate of \(H\) with eigenvalue \(0\) and no component on \(\lvert 2\rangle\). The other two eigenvalues are \(\bigl(\Delta \pm \sqrt{\Delta^2 + \Omega_p^2 + \Omega_s^2}\bigr)/2\) (bright states, which do contain \(\lvert 2\rangle\)). STIRAP works because \(\theta\) rotates from \(0\) (Stokes only: \(\lvert D\rangle = \lvert 1\rangle\)) to \(\pi/2\) (pump only: \(\lvert D\rangle = -\lvert 3\rangle\)) when the Stokes pulse precedes the pump pulse; if the change is adiabatic, \(\lvert\dot\theta\rvert \ll \Omega_{\mathrm{rms}} / 2\) with \(\Omega_{\mathrm{rms}} = \sqrt{\Omega_p^2 + \Omega_s^2}\), the population is carried from \(\lvert 1\rangle\) to \(\lvert 3\rangle\) inside the dark state and the lossy state is never populated. For Gaussian pulses of peak \(\Omega_0\) and \(1/e\) half-width \(T_w\) delayed by \(2\tau\), \(\dot\theta\) peaks at \(2\tau / T_w^2\) in the pulse overlap, and the global adiabaticity criterion is \(\Omega_0 T_w \gtrsim 10\) (Vitanov et al. 2017).
Intuitive order (pump first) starts the system in an equal superposition of the two bright states instead of the dark state. The state then evolves as \(\cos\varphi(t)\,(\sin\theta\lvert 1\rangle + \cos\theta\lvert 3\rangle) - i\sin\varphi(t)\lvert 2\rangle\) with \(\varphi(t) = \tfrac12\int_0^t \Omega_{\mathrm{rms}}\,dt'\): the excited-state population \(P_2 = \sin^2\varphi\) reaches 1 and the final \(P_3 = \cos^2\varphi(T)\) depends on the pulse area, not on adiabaticity. Only the counter-intuitive order gives a robust, dissipation-insensitive transfer.
Dissipation. Spontaneous emission from \(\lvert 2\rangle\) at total rate \(\gamma\) enters the Lindblad master equation \(\dot\rho = -i[H(t), \rho] + \sum_k \bigl(L_k \rho L_k^\dagger - \tfrac12\{L_k^\dagger L_k, \rho\}\bigr)\) through two jump operators with equal branching into the two ground states,
Without drive, \(P_2(t) = e^{-\gamma t}\) and \(P_1(t) = P_3(t) = (1 - e^{-\gamma t})/2\) from \(\lvert 2\rangle\). In a real atom the branching ratio is set by the dipole matrix elements and part of the decay usually leaves the Lambda manifold; v0 models neither (a configurable branching ratio and a sink level are the natural v1 extension), so the trace stays inside the three levels and dissipation shows up as incoherent loss of the transfer rather than as population loss.
Two-level limit. With \(\Omega_s = 0\) and \(\Delta = 0\) the pair \(\lvert 1\rangle, \lvert 2\rangle\) is a resonantly driven qubit: \(P_2(t) = \sin^2(\Omega_p t / 2)\). This pins the factor \(1/2\) in the control operators.
Basis and index conventions
| Index | State | Role | Drift energy |
|---|---|---|---|
| 0 | \(\lvert 1\rangle\) | initial ground state | 0 |
| 1 | \(\lvert 2\rangle\) | excited, radiatively decaying | \(\Delta\) |
| 2 | \(\lvert 3\rangle\) | target ground state | \(\delta\) |
Controls, in action order: 0 pump \(\Omega_p\) with operator
\((\lvert 1\rangle\langle 2\rvert + \mathrm{h.c.})/2\) (indices 0, 1), 1 Stokes
\(\Omega_s\) with operator \((\lvert 3\rangle\langle 2\rvert + \mathrm{h.c.})/2\)
(indices 2, 1). All operators are built explicitly from dq.basis(3, i) outer products;
dynamiqs.sigmam() / sigmap() are never used (their spin convention, index 0 = up,
is the reverse of this library's).
Closed models (gamma = 0) carry kets and are integrated with sesolve; open models
carry density matrices and use mesolve. The observation is the flattened real and
imaginary parts of the state plus \(t / T\): 7 numbers closed, 19 open. info reports
p1, p2, p3 and fidelity (to \(\lvert 3\rangle\)) every step.
Assumptions and validity
- Rotating-wave approximation in the rotating frame of both fields: valid when \(\Omega_{p,s}, \Delta, \delta, \gamma \ll\) the optical transition frequencies, which is the regime of every STIRAP experiment. Counter-rotating terms are absent.
- Real Rabi frequencies: the actions set the amplitudes, the laser phases are fixed to zero. Negative actions flip the sign of the coupling (allowed, the environment clips to \([-\Omega_{\max}, \Omega_{\max}]\)).
- The dark state is exact only at two-photon resonance (\(\delta = 0\)); with \(\delta \neq 0\) there is no exact dark state and adiabatic transfer degrades (Vitanov et al. 2017, Sec. IV). \(\Delta \neq 0\) keeps the dark state and only shifts the bright states.
- Spontaneous emission with equal branching into \(\lvert 1\rangle\) and \(\lvert 3\rangle\), no decay out of the manifold, no dephasing of the ground-state coherence (laser linewidth, magnetic noise). Pure dephasing between \(\lvert 1\rangle\) and \(\lvert 3\rangle\) is the main omitted channel for Zeeman/hyperfine Lambda systems.
- Piecewise-constant control: each action holds \((\Omega_p, \Omega_s)\) for one period
dt; the adaptive integrator (Tsit5) takes as many internal steps as it needs inside each period. For the Gaussian reference pulses below the piecewise-constant trajectory reproduces the continuous-time solution to better than \(10^{-4}\) in \(P_3\) (checked withdq.modulatedwhile designing the checks). - No energy unit enters the model: all rates (\(\Omega\), \(\Delta\), \(\delta\), \(\gamma\))
are in units of the peak Rabi frequency that
action_boundfixes (1 by default), and time is in units of its inverse. There is no battery Hamiltonian.
Parameters
Model fields (LambdaSystem):
| Field | Default | Meaning |
|---|---|---|
delta_one_photon |
0.0 | \(\Delta\), one-photon (pump) detuning of \(\lvert 2\rangle\) |
delta_two_photon |
0.0 | \(\delta\), two-photon detuning of \(\lvert 3\rangle\) |
gamma |
0.0 | total spontaneous-emission rate of \(\lvert 2\rangle\); > 0 switches to Lindblad dynamics |
initial |
"1" |
initially populated bare state, "1", "2" or "3" |
Task kwargs (qenvs.make("transfer/LambdaSTIRAP-v0", ...)):
| Kwarg | Default | Meaning |
|---|---|---|
horizon |
100 | control steps per episode |
dt |
0.2 | control period, so \(T = 20\) |
action_bound |
1.0 | \(\lvert\Omega_p\rvert, \lvert\Omega_s\rvert \le\) action_bound (maximum Rabi frequency, the unit of all rates) |
delta_one_photon, delta_two_photon, gamma |
0.0 | forwarded to the model |
Control semantics and reference pulses
The action is \((\Omega_p, \Omega_s)\). stirap_pulses(horizon, dt, omega0, tau, width,
order) returns an array of shape (horizon, 2) with Gaussian pulses sampled at the
midpoint of each control interval,
for order="counterintuitive" (Stokes centred at \(T/2 - \tau\), pump at \(T/2 + \tau\));
order="intuitive" swaps the two. width is the \(1/e\) half-width \(T_w\), tau half
the delay between the pulse centres.
Measured final \(P_3\) for \(\Omega_0 = 1\), horizon 100 (closed, \(\Delta = \delta = 0\)):
| \(T_w\) (\(\Omega_0 T_w\)) | \(T\) | dt |
\(\tau / T_w = 0.4\) | \(0.5\) | \(0.6\) | \(0.7\) |
|---|---|---|---|---|---|---|
| 8 | 40 | 0.4 | 0.9996 | 0.9962 | 0.9592 | 0.8581 |
| 10 | 50 | 0.5 | 0.9629 | 0.9833 | 0.9727 | 0.9232 |
| 12 | 60 | 0.6 | 0.9941 | 0.9975 | 0.9927 | 0.9671 |
The efficiency at \(\Omega_0 T_w \approx 10\) is not monotonic in \(T_w\) or \(\tau\): the
residual non-adiabatic loss of Gaussian pulses oscillates with the pulse area, so the
threshold \(\Omega_0 T_w \ge 10\) guarantees "mostly adiabatic", not a particular
digit. In the default task (\(T = 20\), dt = 0.2, \(\Omega_{\max} = 1\)) the pulses are
necessarily shorter and truncated at the episode boundaries; the best Gaussian pairs
found by a coarse scan are \(T_w = 6, \tau = 3\) (\(P_3 = 0.9964\)) and
\(T_w = 5, \tau = 2\) (\(P_3 = 0.9924\)), while \(T_w = 4, \tau = 2\) gives \(0.80\) and
\(T_w = 3, \tau = 2\) gives \(0.22\). The default task is therefore moderately adiabatic
(\(\Omega_{\max} T = 20\)): textbook pulses reach \(\approx 0.99\) and leave room for
learned or optimised controls.
Reward
Per step: fidelity gain \(F_{k} - F_{k-1}\) with \(F = \lvert\langle 3 \vert \psi\rangle\rvert^2\)
(closed) or \(\langle 3 \vert \rho \vert 3\rangle\) (open, dq.fidelity with a pure
target). The undiscounted return is \(F(T) - F(0) = P_3(T)\) for the default initial
state \(\lvert 1\rangle\). Episodes end after horizon steps.
Validation
All checks live in qenvs.validation.lambda_system.CHECKS and run in
tests/test_lambda_system.py and qenvs validate. Reference STIRAP pulses for the
transfer checks: horizon 100, dt = 0.6 (\(T = 60\)), \(\Omega_0 = 1\), \(T_w = 12\)
(\(\Omega_0 T_w = 12\)), \(\tau = 6\). Measured errors below are from one run of this
module on CPU with dynamiqs 0.3.6, jax 0.7.2, QuTiP 5.3.1, once with x64 enabled and
once in float32 (every check passes in both).
| Check | Reference | Tolerance | Error (x64) | Error (float32) |
|---|---|---|---|---|
dark_state_zero_eigenvector |
\(\lVert H \lvert D\rangle \rVert\), \(\lvert D\rangle \propto \Omega_s\lvert 1\rangle - \Omega_p\lvert 3\rangle\), 6 random \((\Omega_p, \Omega_s, \Delta)\), \(\delta = 0\) | 1e-10 | 1.1e-16 | 1.1e-16 |
adiabatic_state_eigenvalues |
\(\mathrm{eig}(H) = \{0, (\Delta \pm \sqrt{\Delta^2 + \Omega_p^2 + \Omega_s^2})/2\}\), 6 random sets | 1e-9 | 4.4e-16 | 4.4e-16 |
two_level_limit_rabi |
\(\Omega_s = 0\), \(\Delta = 0\), \(\Omega_p = 1.3\): \(P_2(t) = \sin^2(\Omega_p t/2)\) over one period | 1e-6 | 2.8e-10 | 3.6e-7 |
spontaneous_emission_branching |
from \(\lvert 2\rangle\), \(\gamma = 0.4\), no drive: \(P_2 = e^{-\gamma t}\), \(P_1 = P_3 = (1 - e^{-\gamma t})/2\), \(t \le 6\) | 1e-6 | 1.1e-10 | 1.5e-7 |
stirap_transfer |
closed, counter-intuitive reference pulses via repeated env.step: \(1 - P_3(T)\) (\(P_3 = 0.9975\)) |
1e-2 | 2.5e-3 | 2.5e-3 |
stirap_intermediate_population |
same trajectory: \(\max_t P_2\) | 5e-2 | 4.3e-2 | 4.3e-2 |
stirap_intuitive_order |
intuitive order, same pulses: \(1 - \max_t P_2\) (passes iff \(\max_t P_2 > 0.3\); measured \(\max_t P_2 = 0.998\), \(P_3(T) = 0.017\)) | 0.7 | 1.6e-3 | 1.6e-3 |
stirap_emission_robustness |
\(\gamma = 0.5\,\Omega_0\): \(1 - P_3(T)\) for the counter-intuitive order (\(0.985\)), forced to 1 unless it beats the intuitive order (\(0.024\)) | 5e-2 | 1.5e-2 | 1.5e-2 |
stirap_adiabaticity_sensitivity |
\(\Omega_0 T_w = 1.5\) (\(T_w = 1.5\), \(\tau = 1\), \(T = 10\)): \(P_3(T)\) must stay below 0.9 (diabatic) | 0.9 | 2.2e-2 | 2.2e-2 |
qutip_cross_check |
\(\gamma = 0.3\), \(\Delta = 0.2\), \(\delta = 0.1\), 12 random piecewise-constant pump/Stokes steps in \([-1, 1]\), dt = 0.3: \(\max\lvert\rho_{\mathrm{qenvs}} - \rho_{\mathrm{qutip}}\rvert\) vs QuTiP 5 mesolve |
1e-5 | 3.1e-8 | 9.1e-8 |
density_matrix_constraints |
open random driving, 15 steps: hermiticity, \(\lvert\mathrm{tr}\rho - 1\rvert\), negativity | 1e-6 | 2.2e-16 | 1.2e-7 |
solver_convergence |
open random driving: adaptive Tsit5 vs exact Expm, \(\max\lvert\Delta\rho\rvert\) |
1e-6 | 2.5e-8 | 2.4e-7 |
env_stirap_return |
closed reference pulses: \(\lvert \sum_k r_k - (F(T) - F(0))\rvert\) | 1e-6 | 3.3e-16 | 1.1e-8 |
Why these checks discriminate: a sign error in either coupling or in \(\Delta\) breaks the
dark-state and eigenvalue checks; a factor-2 error in a control breaks the two-level
Rabi check; a jump operator pointing the wrong way or an unequal branching breaks the
emission check; swapping the control order would turn stirap_transfer into the
intuitive sequence and fail it; and the QuTiP comparison covers the full open
dynamics with detunings. stirap_intuitive_order uses the intermediate population rather than the
final \(P_3\) because, as derived above, the intuitive-order \(P_3(T) = \cos^2\varphi(T)\)
can take any value depending on the pulse area (it is 0.98 for \(T_w = 10\),
\(\tau = 7\)), whereas \(\max_t P_2 \approx 1\) always.
Usage
import qenvs
from qenvs.models.lambda_system import stirap_pulses
env = qenvs.make("transfer/LambdaSTIRAP-v0") # horizon 100, dt 0.2, |Omega| <= 1
actions = stirap_pulses(env.horizon, env.dt, omega0=1.0, tau=3.0, width=6.0)
state, rewards = env.rollout(actions)
print(float(rewards.sum())) # 0.996 = P3(T), closed system
noisy = qenvs.make("transfer/LambdaSTIRAP-v0", gamma=0.5)
state, rewards = noisy.rollout(actions) # density matrix, same pulses
qenvs info transfer/LambdaSTIRAP-v0 --json
qenvs run transfer/LambdaSTIRAP-v0 --policy random --set gamma=0.2 --json
The CLI pi-pulse policy drives both channels with the same constant amplitude; it is
not a STIRAP reference for this task, use stirap_pulses from Python instead.
References
- K. Bergmann, H. Theuer and B. W. Shore, "Coherent population transfer among quantum states of atoms and molecules", Rev. Mod. Phys. 70, 1003 (1998).
- N. V. Vitanov, A. A. Rangelov, B. W. Shore and K. Bergmann, "Stimulated Raman adiabatic passage in physics, chemistry, and beyond", Rev. Mod. Phys. 89, 015006 (2017).
- B. W. Shore, "Picturing stimulated Raman adiabatic passage: a STIRAP tutorial", Acta Physica Slovaca 58, 243 (2008).
- H.-P. Breuer and F. Petruccione, The Theory of Open Quantum Systems (Oxford, 2002), Sec. 3.4 (Lindblad form of spontaneous emission).
Known limitations
- Equal branching ratio and no decay out of the manifold (see Dissipation); no ground-state dephasing. Both change the open-system numbers quantitatively but not the STIRAP mechanism.
- Real amplitudes only: no laser-phase control, so chirped or phase-modulated variants of STIRAP cannot be expressed in v0.
StateTransfercasts actions to float32 before building \(H\); with x64 enabled the state is still propagated in float64, but the control amplitudes carry float32 rounding (the checks account for this by drawing float32 amplitudes).- The default horizon (\(T = 20\) at \(\Omega_{\max} = 1\)) is only moderately adiabatic;
the validation checks use longer episodes (
dt = 0.6, \(T = 60\)) to reach the \(\Omega_0 T_w \ge 10\) regime with Gaussian pulses that start and end near zero. - No solver-step convergence study beyond the
Tsit5vsExpmcomparison on random driving; the STIRAP checks rely on the defaultTsit5tolerances (rtol = atol = 1e-6), which is why their thresholds are percent-level, not \(10^{-6}\)-level.