QuTiP 5
Scope
Use QuTiP for finite-dimensional quantum mechanics, quantum optics, Lindblad
dynamics, trajectories, weak-coupling Bloch-Redfield models, and specialized
Floquet, HEOM, and permutational-invariance methods. It is not a hardware
execution SDK. Circuit and control functionality moved to separate QuTiP family
packages.
This skill targets QuTiP 5.3.0, released 2026-05-22. QuTiP 5.3 requires
Python 3.11 or newer. Its required distributions are NumPy (>=1.23.2), SciPy
(>=1.9.2, excluding 1.16.0 and 1.17.0), and packaging.
Reproducible uv snapshot
Create a dedicated environment and pin every direct distribution:
uv venv --python 3.11
uv pip install "qutip==5.3.0"
For plots:
uv pip install "qutip[graphics]==5.3.0"
Optional QuTiP family packages are independently versioned:
uv pip install "qutip-qip==0.4.2"
uv pip install "qutip-qtrl==0.2.0"
uv pip install "qutip-jax==0.1.1"
qutip-qip 0.4.2 (2026-06-23) is the production/stable circuit, gate, and
noisy-device simulation package. Import from qutip_qip, not qutip.qip.
qutip-qtrl 0.2.0 (2026-06-23) provides GRAPE and CRAB quantum optimal
control. It is not a trajectory viewer. Import from qutip_qtrl, not
qutip.control; PyPI still classifies it pre-alpha.
qutip-jax 0.1.1 (2025-05-29) is the official JAX data backend for GPU and
automatic-differentiation experiments. It is explicitly pre-alpha.
qutip-cupy is an official QuTiP-organization repository, but it has no PyPI
release and its own README says it is not officially released. Do not put an
unreleased Git install into a reproducible workflow.
Use a project lockfile or a hash-generating uv pip compile workflow when
transitive dependency identity must also be frozen.
Non-negotiable model contract
Before solving, record:
- Units and convention. QuTiP equations normally set (\hbar=1).
Hamiltonian entries are angular frequencies and rates have reciprocal-time
units. Convert cyclic frequency with (2\pi f); never mix Hz and rad/s.
- Subsystem order.
tensor(A, B, C) fixes subsystem indices 0, 1, 2.
Preserve that order in every state, operator, collapse channel, and partial
trace. obj.ptrace([0, 2]) keeps those subsystems; it does not trace them.
- State validity. Check ket norm or density-matrix Hermiticity, unit trace,
and eigenvalues above a stated negative tolerance. Tiny negative values may
be numerical; material negativity invalidates a claimed state.
- Generator meaning. A Lindblad channel with rate
gamma is represented
by sqrt(gamma) * A, not gamma * A. Define what each rate measures. For
example, sqrt(gamma_phi / 2) * sigmaz() gives coherence decay
exp(-gamma_phi * t).
- Approximations. State rotating-wave, Born-Markov, secular, weak-coupling,
bath-equilibrium, truncation, symmetry, and initial-factorization assumptions
wherever used.
- Numerics. Justify Hilbert truncation, output grid, integration method,
tolerances, trajectory count, and random seeds. Report
result.stats.
- Convergence. Sweep every artificial cutoff: Fock dimension, time/frequency
window and spacing, ODE tolerances, trajectories, Floquet harmonics, HEOM
depth and bath exponents, or PIQS representation as applicable.
Qobj, dimensions, and tensor order
Prefer explicit imports and inspect both shape and structured dimensions:
from qutip import basis, qeye, sigmaz, tensor
psi = tensor(basis(2, 0), basis(3, 1))
z_on_first = tensor(sigmaz(), qeye(3))
assert psi.shape == (6, 1)
assert psi.dims == [[2, 3], [1]]
assert z_on_first.dims == [[2, 3], [2, 3]]
rho_first = psi.proj().ptrace(0) # keep subsystem 0
Matrix shape alone is insufficient: two objects can both be 6-by-6 but encode
different tensor factorizations. Read references/core_concepts.md before
building composite, superoperator, or channel models.
Choose the solver by physics
| Model |
Current API |
Required justification |
| Closed, pure, unitary |
sesolve |
Hermitian Hamiltonian; no dissipation |
| Lindblad/open or mixed |
mesolve |
Markovian completely positive model and channel rates |
| Quantum jumps |
mcsolve |
Unravelling, trajectory convergence, seeds |
| Microscopic weak bath |
brmesolve |
Born-Markov/weak coupling, spectra, secular choice |
| Diffusive measurement |
ssesolve, smesolve |
monitored versus unmonitored channels |
| Periodic drive |
FloquetBasis, fsesolve, fmmesolve |
verified period and Floquet convergence |
| Structured non-Markovian bath |
qutip.solver.heom |
bath expansion and hierarchy convergence |
| Symmetric spin ensemble |
qutip.piqs |
permutation symmetry and basis choice |
Do not select a more specialized solver merely because it exists.
Deterministic open-system example
QuTiP 5.3 uses ordinary option dictionaries. Solver controls, e_ops, and
args are keyword-only; the old mutable options object is gone.
import numpy as np
from qutip import basis, mesolve, sigmam, sigmaz
omega = 2.0
gamma = 0.15
tlist = np.linspace(0.0, 20.0, 401)
excited = basis(2, 0)
result = mesolve(
0.5 * omega * sigmaz(),
excited,
tlist,
c_ops=[np.sqrt(gamma) * sigmam()],
e_ops={"sigma_z": sigmaz(), "excited": excited.proj()},
options={
"method": "adams",
"atol": 1e-10,
"rtol": 1e-8,
"store_final_state": True,
"progress_bar": "",
},
)
population = np.asarray(result.e_data["excited"])
assert np.max(np.abs(population - np.exp(-gamma * tlist))) < 2e-6
assert isinstance(result.stats, dict)
If the problem is stiff, compare bdf or lsoda; do not change an integrator
without rerunning tolerance and invariant checks. QuTiP 5.3 also supports
options={"matrix_form": True} in mesolve; benchmark and validate it before
using it as a default.
Time-dependent systems
Prefer trusted Pythonic callables or numeric coefficient arrays. Do not create
coefficient source strings from user input.
import numpy as np
from qutip import QobjEvo, sigmax, sigmaz
def envelope(t, amplitude, center, width):
return amplitude * np.exp(-0.5 * ((t - center) / width) ** 2)
H = QobjEvo(
[0.5 * sigmaz(), [sigmax(), envelope]],
args={"amplitude": 0.2, "center": 5.0, "width": 1.0},
)
instantaneous_H = H(5.0)
H.arguments(amplitude=0.1)
The older f(t, args) coefficient signature is deprecated in 5.3 and is
scheduled for removal in 5.5. See references/time_evolution.md.
Trajectories and stochastic solvers
import numpy as np
from qutip import basis, mcsolve, sigmam, sigmaz
tlist = np.linspace(0.0, 10.0, 201)
result = mcsolve(
0.5 * sigmaz(),
basis(2, 0),
tlist,
[np.sqrt(0.2) * sigmam()],
e_ops=[basis(2, 0).proj()],
ntraj=400,
seeds=20260723,
options={"keep_runs_results": False, "progress_bar": ""},
)
Report ntraj, result.seeds, uncertainty or repeated-seed sensitivity, and
whether individual runs were retained. Reuse seeds=previous_result.seeds only
when paired trajectories are intentional. ssesolve and smesolve use the
boolean heterodyne argument, not legacy integer noise codes.
Steady states, spectra, and phase space
import numpy as np
from qutip import QFunc, liouvillian, operator_to_vector, qfunc, steadystate
rho_ss = steadystate(H, c_ops, method="direct")
residual = (liouvillian(H, c_ops) * operator_to_vector(rho_ss)).norm()
assert residual < 1e-9
xvec = np.linspace(-5.0, 5.0, 151)
Q_once = qfunc(rho_ss, xvec, xvec)
q_many = QFunc(xvec, xvec)
Q_again = q_many(rho_ss)
assert Q_once.shape == (len(xvec), len(xvec))
For wigner, qfunc, and QFunc, array element [j, k] corresponds to
yvec[j], xvec[k]. In QuTiP 5.3, QFunc is initialized with fixed
coordinates and called with a state; it has no .eval method. This skill never
uses Python dynamic-code execution. Prefer plot_wigner, Result.plot_expect,
or explicit Matplotlib axes as documented in references/visualization.md.
Direct spectrum is a stationary steady-state spectrum. An FFT of a finite
correlation requires explicit checks for tail decay, timestep aliasing,
frequency resolution, window sensitivity, and transform convention. See
references/analysis.md.
Advanced boundaries
- Import HEOM from
qutip.solver.heom; the legacy QuTiP 4 nonmarkov HEOM
namespace is stale.
- Use
FloquetBasis for modes and quasi-energies. Verify
H(t + T) == H(t) numerically and sweep basis/truncation choices.
- Access PIQS with
from qutip import piqs. Dicke.pisolve is only the
optimized diagonal-state/diagonal-Hamiltonian route; general Dicke-basis
dynamics use the Liouvillian with mesolve.
brmesolve can violate positivity, especially without secularization. Check
density-matrix eigenvalues over time.
- QIP and optimal control are extension-package concerns. Never present local
simulation as quantum-hardware execution.
See references/advanced.md for HEOM, Floquet, PIQS, stochastic, and extension
boundaries.
Safe local CLIs
All bundled tools are local-only, emit strict JSON, reject non-finite JSON and
unknown keys, and never load pickle files or executable model code. Simulation
imports are lazy, so every --help works without QuTiP installed.
| Script |
Purpose |
scripts/qobj_model_validator.py |
Validate bounded Qobj model JSON, dimensions, states, rates, and role compatibility |
scripts/two_level_simulation.py |
Run a bounded two-level Lindblad or jump simulation |
scripts/solver_config_planner.py |
Select a current solver and option/checklist plan |
scripts/convergence_sweep.py |
Sweep tolerances/grid size or trajectory count on a synthetic model |
scripts/result_audit.py |
Audit JSON output without deserializing Python objects |
scripts/steady_state_spectrum_planner.py |
Plan bounded steady-state and direct/FFT spectral checks |
Example:
python skills/qutip/scripts/two_level_simulation.py --help
python skills/qutip/scripts/two_level_simulation.py \
--decay-rate 0.2 --t-final 10 --time-points 201 \
--output two-level.json
python skills/qutip/scripts/result_audit.py two-level.json
Completion checklist
- Record units, (\hbar), tensor order, initial state, channels, and model
assumptions.
- Validate Hermiticity, norm/trace, positivity, dimensions, and generator units.
- Pin QuTiP and direct extensions; record platform, Python, NumPy, and SciPy.
- Inspect result options and stats; do not assume states were stored.
- Perform cutoff, grid, tolerance/integrator, and stochastic convergence sweeps.
- Save portable numeric/configuration summaries as JSON or text. Do not load
untrusted QuTiP object/result files because object serialization can execute
code.
References
references/core_concepts.md — Qobj, dimensions, tensor products, states,
channels, and unit conventions
references/time_evolution.md — current solver signatures, options, results,
QobjEvo, trajectories, and numerical controls
references/analysis.md — physical-state audits, steady states,
correlations, spectra, and convergence
references/visualization.md — Wigner, Q functions, QFunc, Bloch, result,
and matrix plots
references/advanced.md — Bloch-Redfield, stochastic, Floquet, HEOM, PIQS,
and QuTiP family package boundaries
Dated official sources
Verified 2026-07-23:
Source: K-Dense-AI/scientific-agent-skills → skills/qutip/SKILL.md
1---2name: qutip3description: Simulate and audit closed and open quantum-system models with QuTiP 5, including deterministic, trajectory, steady-state, spectral, and phase-space workflows. Use for local quantum-dynamics work where physical assumptions, dimensions, and numerical convergence must be explicit.4---5
6
7# QuTiP 5
8
9## Scope
10
11Use QuTiP for finite-dimensional quantum mechanics, quantum optics, Lindblad
12dynamics, trajectories, weak-coupling Bloch-Redfield models, and specialized
13Floquet, HEOM, and permutational-invariance methods. It is not a hardware
14execution SDK. Circuit and control functionality moved to separate QuTiP family
15packages.
16
17This skill targets **QuTiP 5.3.0**, released 2026-05-22. QuTiP 5.3 requires
18Python 3.11 or newer. Its required distributions are NumPy (`>=1.23.2`), SciPy
19(`>=1.9.2`, excluding `1.16.0` and `1.17.0`), and `packaging`.
20
21## Reproducible uv snapshot
22
23Create a dedicated environment and pin every direct distribution:
24
25```bash
26uv venv --python 3.11
27uv pip install "qutip==5.3.0"
28```
29
30For plots:
31
32```bash
33uv pip install "qutip[graphics]==5.3.0"
34```
35
36Optional QuTiP family packages are independently versioned:
37
38```bash
39uv pip install "qutip-qip==0.4.2"
40uv pip install "qutip-qtrl==0.2.0"
41uv pip install "qutip-jax==0.1.1"
42```
43
44- `qutip-qip` 0.4.2 (2026-06-23) is the production/stable circuit, gate, and
45 noisy-device simulation package. Import from `qutip_qip`, not `qutip.qip`.
46- `qutip-qtrl` 0.2.0 (2026-06-23) provides GRAPE and CRAB **quantum optimal
47 control**. It is not a trajectory viewer. Import from `qutip_qtrl`, not
48 `qutip.control`; PyPI still classifies it pre-alpha.
49- `qutip-jax` 0.1.1 (2025-05-29) is the official JAX data backend for GPU and
50 automatic-differentiation experiments. It is explicitly pre-alpha.
51- `qutip-cupy` is an official QuTiP-organization repository, but it has no PyPI
52 release and its own README says it is not officially released. Do not put an
53 unreleased Git install into a reproducible workflow.
54
55Use a project lockfile or a hash-generating `uv pip compile` workflow when
56transitive dependency identity must also be frozen.
57
58## Non-negotiable model contract
59
60Before solving, record:
61
621. **Units and convention.** QuTiP equations normally set \(\hbar=1\).
63 Hamiltonian entries are angular frequencies and rates have reciprocal-time
64 units. Convert cyclic frequency with \(2\pi f\); never mix Hz and rad/s.
652. **Subsystem order.** `tensor(A, B, C)` fixes subsystem indices `0, 1, 2`.
66 Preserve that order in every state, operator, collapse channel, and partial
67 trace. `obj.ptrace([0, 2])` keeps those subsystems; it does not trace them.
683. **State validity.** Check ket norm or density-matrix Hermiticity, unit trace,
69 and eigenvalues above a stated negative tolerance. Tiny negative values may
70 be numerical; material negativity invalidates a claimed state.
714. **Generator meaning.** A Lindblad channel with rate `gamma` is represented
72 by `sqrt(gamma) * A`, not `gamma * A`. Define what each rate measures. For
73 example, `sqrt(gamma_phi / 2) * sigmaz()` gives coherence decay
74 `exp(-gamma_phi * t)`.
755. **Approximations.** State rotating-wave, Born-Markov, secular, weak-coupling,
76 bath-equilibrium, truncation, symmetry, and initial-factorization assumptions
77 wherever used.
786. **Numerics.** Justify Hilbert truncation, output grid, integration method,
79 tolerances, trajectory count, and random seeds. Report `result.stats`.
807. **Convergence.** Sweep every artificial cutoff: Fock dimension, time/frequency
81 window and spacing, ODE tolerances, trajectories, Floquet harmonics, HEOM
82 depth and bath exponents, or PIQS representation as applicable.
83
84## Qobj, dimensions, and tensor order
85
86Prefer explicit imports and inspect both shape and structured dimensions:
87
88```python
89from qutip import basis, qeye, sigmaz, tensor
90
91psi = tensor(basis(2, 0), basis(3, 1))
92z_on_first = tensor(sigmaz(), qeye(3))
93
94assert psi.shape == (6, 1)
95assert psi.dims == [[2, 3], [1]]
96assert z_on_first.dims == [[2, 3], [2, 3]]
97rho_first = psi.proj().ptrace(0) # keep subsystem 0
98```
99
100Matrix shape alone is insufficient: two objects can both be 6-by-6 but encode
101different tensor factorizations. Read `references/core_concepts.md` before
102building composite, superoperator, or channel models.
103
104## Choose the solver by physics
105
106| Model | Current API | Required justification |
107|---|---|---|
108| Closed, pure, unitary | `sesolve` | Hermitian Hamiltonian; no dissipation |
109| Lindblad/open or mixed | `mesolve` | Markovian completely positive model and channel rates |
110| Quantum jumps | `mcsolve` | Unravelling, trajectory convergence, seeds |
111| Microscopic weak bath | `brmesolve` | Born-Markov/weak coupling, spectra, secular choice |
112| Diffusive measurement | `ssesolve`, `smesolve` | monitored versus unmonitored channels |
113| Periodic drive | `FloquetBasis`, `fsesolve`, `fmmesolve` | verified period and Floquet convergence |
114| Structured non-Markovian bath | `qutip.solver.heom` | bath expansion and hierarchy convergence |
115| Symmetric spin ensemble | `qutip.piqs` | permutation symmetry and basis choice |
116
117Do not select a more specialized solver merely because it exists.
118
119## Deterministic open-system example
120
121QuTiP 5.3 uses ordinary option dictionaries. Solver controls, `e_ops`, and
122`args` are keyword-only; the old mutable options object is gone.
123
124```python
125import numpy as np
126from qutip import basis, mesolve, sigmam, sigmaz
127
128omega = 2.0
129gamma = 0.15
130tlist = np.linspace(0.0, 20.0, 401)
131excited = basis(2, 0)
132
133result = mesolve(
134 0.5 * omega * sigmaz(),
135 excited,
136 tlist,
137 c_ops=[np.sqrt(gamma) * sigmam()],
138 e_ops={"sigma_z": sigmaz(), "excited": excited.proj()},
139 options={
140 "method": "adams",
141 "atol": 1e-10,
142 "rtol": 1e-8,
143 "store_final_state": True,
144 "progress_bar": "",
145 },
146)
147
148population = np.asarray(result.e_data["excited"])
149assert np.max(np.abs(population - np.exp(-gamma * tlist))) < 2e-6
150assert isinstance(result.stats, dict)
151```
152
153If the problem is stiff, compare `bdf` or `lsoda`; do not change an integrator
154without rerunning tolerance and invariant checks. QuTiP 5.3 also supports
155`options={"matrix_form": True}` in `mesolve`; benchmark and validate it before
156using it as a default.
157
158## Time-dependent systems
159
160Prefer trusted Pythonic callables or numeric coefficient arrays. Do not create
161coefficient source strings from user input.
162
163```python
164import numpy as np
165from qutip import QobjEvo, sigmax, sigmaz
166
167def envelope(t, amplitude, center, width):
168 return amplitude * np.exp(-0.5 * ((t - center) / width) ** 2)
169
170H = QobjEvo(
171 [0.5 * sigmaz(), [sigmax(), envelope]],
172 args={"amplitude": 0.2, "center": 5.0, "width": 1.0},
173)
174instantaneous_H = H(5.0)
175H.arguments(amplitude=0.1)
176```
177
178The older `f(t, args)` coefficient signature is deprecated in 5.3 and is
179scheduled for removal in 5.5. See `references/time_evolution.md`.
180
181## Trajectories and stochastic solvers
182
183```python
184import numpy as np
185from qutip import basis, mcsolve, sigmam, sigmaz
186
187tlist = np.linspace(0.0, 10.0, 201)
188result = mcsolve(
189 0.5 * sigmaz(),
190 basis(2, 0),
191 tlist,
192 [np.sqrt(0.2) * sigmam()],
193 e_ops=[basis(2, 0).proj()],
194 ntraj=400,
195 seeds=20260723,
196 options={"keep_runs_results": False, "progress_bar": ""},
197)
198```
199
200Report `ntraj`, `result.seeds`, uncertainty or repeated-seed sensitivity, and
201whether individual runs were retained. Reuse `seeds=previous_result.seeds` only
202when paired trajectories are intentional. `ssesolve` and `smesolve` use the
203boolean `heterodyne` argument, not legacy integer noise codes.
204
205## Steady states, spectra, and phase space
206
207```python
208import numpy as np
209from qutip import QFunc, liouvillian, operator_to_vector, qfunc, steadystate
210
211rho_ss = steadystate(H, c_ops, method="direct")
212residual = (liouvillian(H, c_ops) * operator_to_vector(rho_ss)).norm()
213assert residual < 1e-9
214
215xvec = np.linspace(-5.0, 5.0, 151)
216Q_once = qfunc(rho_ss, xvec, xvec)
217q_many = QFunc(xvec, xvec)
218Q_again = q_many(rho_ss)
219assert Q_once.shape == (len(xvec), len(xvec))
220```
221
222For `wigner`, `qfunc`, and `QFunc`, array element `[j, k]` corresponds to
223`yvec[j]`, `xvec[k]`. In QuTiP 5.3, `QFunc` is initialized with fixed
224coordinates and called with a state; it has no `.eval` method. This skill never
225uses Python dynamic-code execution. Prefer `plot_wigner`, `Result.plot_expect`,
226or explicit Matplotlib axes as documented in `references/visualization.md`.
227
228Direct `spectrum` is a stationary steady-state spectrum. An FFT of a finite
229correlation requires explicit checks for tail decay, timestep aliasing,
230frequency resolution, window sensitivity, and transform convention. See
231`references/analysis.md`.
232
233## Advanced boundaries
234
235- Import HEOM from `qutip.solver.heom`; the legacy QuTiP 4 nonmarkov HEOM
236 namespace is stale.
237- Use `FloquetBasis` for modes and quasi-energies. Verify
238 `H(t + T) == H(t)` numerically and sweep basis/truncation choices.
239- Access PIQS with `from qutip import piqs`. `Dicke.pisolve` is only the
240 optimized diagonal-state/diagonal-Hamiltonian route; general Dicke-basis
241 dynamics use the Liouvillian with `mesolve`.
242- `brmesolve` can violate positivity, especially without secularization. Check
243 density-matrix eigenvalues over time.
244- QIP and optimal control are extension-package concerns. Never present local
245 simulation as quantum-hardware execution.
246
247See `references/advanced.md` for HEOM, Floquet, PIQS, stochastic, and extension
248boundaries.
249
250## Safe local CLIs
251
252All bundled tools are local-only, emit strict JSON, reject non-finite JSON and
253unknown keys, and never load pickle files or executable model code. Simulation
254imports are lazy, so every `--help` works without QuTiP installed.
255
256| Script | Purpose |
257|---|---|
258| `scripts/qobj_model_validator.py` | Validate bounded Qobj model JSON, dimensions, states, rates, and role compatibility |
259| `scripts/two_level_simulation.py` | Run a bounded two-level Lindblad or jump simulation |
260| `scripts/solver_config_planner.py` | Select a current solver and option/checklist plan |
261| `scripts/convergence_sweep.py` | Sweep tolerances/grid size or trajectory count on a synthetic model |
262| `scripts/result_audit.py` | Audit JSON output without deserializing Python objects |
263| `scripts/steady_state_spectrum_planner.py` | Plan bounded steady-state and direct/FFT spectral checks |
264
265Example:
266
267```bash
268python skills/qutip/scripts/two_level_simulation.py --help
269python skills/qutip/scripts/two_level_simulation.py \
270 --decay-rate 0.2 --t-final 10 --time-points 201 \
271 --output two-level.json
272python skills/qutip/scripts/result_audit.py two-level.json
273```
274
275## Completion checklist
276
277- Record units, \(\hbar\), tensor order, initial state, channels, and model
278 assumptions.
279- Validate Hermiticity, norm/trace, positivity, dimensions, and generator units.
280- Pin QuTiP and direct extensions; record platform, Python, NumPy, and SciPy.
281- Inspect result options and stats; do not assume states were stored.
282- Perform cutoff, grid, tolerance/integrator, and stochastic convergence sweeps.
283- Save portable numeric/configuration summaries as JSON or text. Do not load
284 untrusted QuTiP object/result files because object serialization can execute
285 code.
286
287## References
288
289- `references/core_concepts.md` — Qobj, dimensions, tensor products, states,
290 channels, and unit conventions
291- `references/time_evolution.md` — current solver signatures, options, results,
292 QobjEvo, trajectories, and numerical controls
293- `references/analysis.md` — physical-state audits, steady states,
294 correlations, spectra, and convergence
295- `references/visualization.md` — Wigner, Q functions, `QFunc`, Bloch, result,
296 and matrix plots
297- `references/advanced.md` — Bloch-Redfield, stochastic, Floquet, HEOM, PIQS,
298 and QuTiP family package boundaries
299
300## Dated official sources
301
302Verified **2026-07-23**:
303
304- [QuTiP 5.3.0 PyPI metadata](https://pypi.org/project/qutip/)
305- [QuTiP 5.3.0 release](https://github.com/qutip/qutip/releases/tag/v5.3.0)
306- [QuTiP 5.3 changelog](https://qutip.readthedocs.io/en/stable/changelog.html)
307- [QuTiP 5.3 API](https://qutip.readthedocs.io/en/stable/apidoc/apidoc.html)
308- [QuTiP version-5 tutorials](https://github.com/qutip/qutip-tutorials/tree/main/tutorials-v5)
309- [qutip-qip PyPI](https://pypi.org/project/qutip-qip/)
310- [qutip-qtrl PyPI](https://pypi.org/project/qutip-qtrl/)
311- [qutip-jax PyPI](https://pypi.org/project/qutip-jax/)
312- [official unreleased qutip-cupy repository](https://github.com/qutip/qutip-cupy)
313
314---
315
316**Source:** [`K-Dense-AI/scientific-agent-skills`](https://github.com/K-Dense-AI/scientific-agent-skills) → `skills/qutip/SKILL.md`