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, and evaluate_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:

BackgroundSuggested 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 BasicsMPS and MPO BasicsLiouville-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.InstallationITensor BasicsMPS and MPO BasicsLiouville-Space BasicsUnitary DynamicsDissipative DynamicsSingle-Mode Process Tensor. Read theory when a concept or notation is unclear.
Tutorials are cumulative

Later tutorials assume syntax and conventions from earlier ones, especially ITensor index identity, shared sites_L, and density-matrix vectorisation.

Theory pages

Use the theory section as a convention dictionary, not as a prerequisite course for every tutorial.

Performance and feedback (Advanced Usage)

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

GoalPage
Open-system / Lindblad evolutionDissipative Dynamics
Bulk-dissipative spin chainDissipative spin chain
Boundary-driven transportBoundary-driven spin chain
Driven dissipative bosonsDriven-dissipative Bose–Hubbard
Process tensors, baths, and instrumentsSingle-Mode Process Tensor
Package setupInstallation
Physics conventions and notationTheory: Hilbert and Liouville Space
ITensor index and contraction syntaxTutorial: ITensor Basics
Hilbert-space MPS/MPOTutorial: MPS and MPO Basics
Vectorized density matricesTutorial: Liouville Basics
Closed-system TEBD/TDVPTutorial: Unitary Dynamics
Time-dependent HamiltoniansLaser-driven TDVP dynamics
Multimode baths and multi-time correlationsSpin-bath process tensor
End-to-end scriptsExamples
Progress, verbose output, and threadingAdvanced Usage
Function referenceAPI Reference
Examples

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.