ProcessTensors.jl
ProcessTensors.jl is a Julia package for MPS-based open quantum dynamics, Liouville-space simulation, and process tensors.
Why this project exists
Most open-quantum-softwares that exist today handles Markovian dynamics well, but say little about what happens when the environment remembers. As quantum devices push into regimes of strong coupling and structured environments, memory effects become the rule rather than the exception, and process tensors have emerged as the natural language for describing them.
The tools for working with process tensors, however, remain sparse for a field this active. ProcessTensors.jl exists to close that gap. This package primarily uses MPS/MPO infrastructure to define and manipulate process tensors in a memory-efficient way. It's built natively on ITensorMPS.jl, deliberately separating low-level tensor-network machinery from high-level physics workflows, so that the codes appear as natural and close to the theory. Alongside the code, the documentation is written to teach the basics of Liouville-space and process-tensor formalism, paired with runnable examples that mirror the underlying equations closely.
Today, ProcessTensors.jl covers the essentials: single-mode and small multimode process tensors, spin and bosonic baths, reduced dynamics, and multi-time correlations. The next concrete milestone is extending this to large, realistic non-Markovian environments via the ACE algorithm — a near-term, committed goal rather than a distant aspiration.
Beyond that, the longer-term vision is for this package to grow from a clean, accessible implementation into a genuine research platform: a place where process-tensor and open-system tensor-network algorithms — TEMPO, PT-TEMPO, TEDOPA, and other influence-functional-based methods — can be implemented side by side, benchmarked against each other, taught to newcomers, and reused by researchers who'd rather build on solid infrastructure than rebuild it from scratch.
Where to start
Most of what makes this package distinctive appears in two tutorials:
- Dissipative Dynamics — open-system evolution in Liouville space: Lindblad generators,
liouvillian_mpo, TEBD/TDVP on density matrices. - Single-Mode Process Tensor — process-tensor construction, bath memory, instruments,
evolve, andevaluate_process.
Everything else in the documentation supports those two pages: ITensor syntax, MPS/MPO objects, Hilbert-versus-Liouville conventions, and closed-system dynamics as stepping stones.
Choose a path that suits you best:
| Background | Suggested route |
|---|---|
| You code and know the theory. | Start with Dissipative Dynamics, then Single-Mode Process Tensor. Skim Hilbert and Liouville Space and Process Tensors for conventions only. Use Examples for scripts and API Reference for the function list. |
| You know the theory but are new to ITensors. | ITensor Basics → MPS and MPO Basics → Liouville-Space Basics → the two core tutorials above. Use theory pages as a convention dictionary, not the main route. |
| You are new to open quantum systems or tensor networks in Julia. | Installation → ITensor Basics → MPS and MPO Basics → Liouville-Space Basics → Unitary Dynamics → Dissipative Dynamics → Single-Mode Process Tensor. Read theory when a concept or notation is unclear. |
Later tutorials assume syntax and conventions from earlier ones, especially ITensor index identity, shared sites_L, and density-matrix vectorisation.
Use the theory section as a convention dictionary, not as a prerequisite course for every tutorial.
Long runs such as build_process_tensor, evolve, evaluate_process, and tebd support progress and verbose keywords. To maximise performance in benchmarks, parameter sweeps, or HPC jobs, disable transient progress bars (progress=false) and choose whether you want durable milestone logs (verbose=true) or a silent run (verbose=false). See Advanced Usage for the recommended combinations, threading notes, and demo scripts under scripts/terminal/.
Quick start
If you already know where you are headed, the snippet below builds a one-spin system coupled to one spin bath mode and constructs a process tensor. For context and checks along the way, use Single-Mode Process Tensor.
using ITensors
using ProcessTensors
dt = 0.1
nsteps = 24
# Physical Hilbert-space sites
sys = siteinds("S=1/2", 1)
bath = siteinds("S=1/2", 1)
# Liouville-space sites
sysL = liouv_sites(sys)
bathL = liouv_sites(bath)
# System Hamiltonian
Hsys = OpSum()
Hsys += 1.0, "Sx", 1
system = spin_system(sys, Hsys)
# Bath initial state
ψmps = MPS(bath, ["Up"])
ρmpo = to_dm(ψmps)
ρbath0 = to_liouville(ρmpo; sites=bathL)
# Bath Hamiltonian
Hbath = OpSum()
Hbath += 1.0, "Sx", 1
# System-bath coupling
Hcoupling = OpSum()
Hcoupling += 1.0, "Sz", 1, "Sz", 2
mode = spin_mode(bathL, Hbath, ρbath0; coupling = Hcoupling)
environment = spin_bath([mode])
pt = build_process_tensor(system, system.sites[1]; environment, dt, nsteps)The process tensor can now be used to evolve a reduced system state.
ρsys0 = to_dm(MPS(sys, ["Up"]))
trajectory = evolve(pt, ρsys0)Or it can be contracted with an explicit sequence of instruments.
obs = OpSum()
obs += 1.0, "Sz", 1
seq = default_schedule(pt)
add!(seq, 0, state_preparation(ρsys0))
add!(seq, nsteps, observable_measurement(obs))
expectation = evaluate_process(pt, seq)Find a doc page by topic
| Goal | Page |
|---|---|
| Open-system / Lindblad evolution | Dissipative Dynamics |
| Bulk-dissipative spin chain | Dissipative spin chain |
| Boundary-driven transport | Boundary-driven spin chain |
| Driven dissipative bosons | Driven-dissipative Bose–Hubbard |
| Process tensors, baths, and instruments | Single-Mode Process Tensor |
| Package setup | Installation |
| Physics conventions and notation | Theory: Hilbert and Liouville Space |
| ITensor index and contraction syntax | Tutorial: ITensor Basics |
| Hilbert-space MPS/MPO | Tutorial: MPS and MPO Basics |
| Vectorized density matrices | Tutorial: Liouville Basics |
| Closed-system TEBD/TDVP | Tutorial: Unitary Dynamics |
| Time-dependent Hamiltonians | Laser-driven TDVP dynamics |
| Multimode baths and multi-time correlations | Spin-bath process tensor |
| End-to-end scripts | Examples |
| Progress, verbose output, and threading | Advanced Usage |
| Function reference | API Reference |
Example pages are model-oriented Literate walkthroughs with companion scripts under scripts/. Start from the tutorial that matches the physics, then open the corresponding example for a larger lattice or a driven variant.
Citing and contributing
ProcessTensors.jl is under active development. Contributions from expert developers, bug reports from users, new examples, and discussions about future directions are very welcome.
If you use the package in research, please cite the ProcessTensors.jl repository and any relevant process-tensor or tensor-network literature cited in the theory pages.