Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
01bc8eb
First pieces of using compiler infrastructure
benjimaclellan Feb 6, 2026
2f5aba9
Change Conditional structure to use compiler
benjimaclellan Feb 7, 2026
a9a1395
Add more base objects for Process, Measurement, and Instrument
benjimaclellan Feb 27, 2026
64f8b95
Test canonical tree flattening with jit
benjimaclellan Feb 27, 2026
f3f50b9
Move unwrap recursion out of object methods
benjimaclellan Mar 1, 2026
66f1ad2
Remove unwrap methods from typedefs, test canonical flattening
benjimaclellan Mar 1, 2026
47f5048
Lint
benjimaclellan Mar 1, 2026
6739944
Remove old circuit file
benjimaclellan Mar 1, 2026
c32471f
Test oqd compiler infrastructure for tensor network lowering passes
benjimaclellan Mar 2, 2026
4a1f9bb
Major refactor, new Simulator object using compiler tools
benjimaclellan Mar 2, 2026
2e342d1
First prototype of measurement objects
benjimaclellan Mar 2, 2026
fb04f9e
Test dispatch to different backends
benjimaclellan Mar 3, 2026
b8edc42
Add backend dispatch
benjimaclellan Mar 19, 2026
d38ac9a
Upgrade to lowering dispatch methods, add top level import
benjimaclellan Mar 19, 2026
cfae1e0
Fix typo in wip dynamiqs backend
benjimaclellan Mar 19, 2026
8219c68
TN compiler emits proper number arrays for Kraus operators
benjimaclellan Mar 19, 2026
0cab97a
Test tn compiler with canonical Kraus operator stacking axis
benjimaclellan Mar 19, 2026
046f37f
Update tests to new API
benjimaclellan Mar 19, 2026
add40f2
Update test suite, beartype deprecation warning
benjimaclellan Mar 19, 2026
c31199e
Use backend type instance in compiler for consistency
benjimaclellan Mar 20, 2026
2c89416
Remove dataclass decorator on simulator class
benjimaclellan Mar 23, 2026
78109a7
Remove DoF base classes
benjimaclellan Jul 6, 2026
f1446e3
Remove information type abstraction
benjimaclellan Jul 6, 2026
abb2ad9
Fix missing api change for fixed energy fock state
benjimaclellan Jul 6, 2026
a66239d
Add missing dependencies
benjimaclellan Jul 6, 2026
6d02220
Fix mkdocs build
benjimaclellan Jul 6, 2026
518d2b1
Merge branch 'dev' of https://github.com/benjimaclellan/qtelescope in…
benjimaclellan Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -188,4 +188,6 @@ site.zip

ROADMAP.md
CLAUDE.md
.docs/
.docs/

.claude/
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ source .venv/bin/activate

```python
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.ops.base import Wire
from squint.ops.dv import DiscreteVariableState, HGate, RZGate
from squint.backends.tensornetwork.simulator import Simulator
from squint.interface.base import Wire
from squint.interface.dv import DiscreteVariableState, HGate, RZGate
from squint.utils import print_nonzero_entries, partition_op

# let's implement a simple one-qubit circuit for phase estimation;
Expand All @@ -72,15 +72,15 @@ sim = Simulator.compile(static, params, optimize="greedy").jit()

# Calculate metrics important to quantum metrology & sensing protocols
# the quantum state and its gradient
psi = sim.amplitudes.forward(params) # |ψ(φ)⟩
dpsi = sim.amplitudes.grad(params) # ∂|ψ(φ)⟩/∂φ
psi = sim.amplitudes.forward(params) # |ψ(φ)⟩
dpsi = sim.amplitudes.grad(params) # ∂|ψ(φ)⟩/∂φ

# Probabilities and their gradients
p = sim.probabilities.forward(params) # p(s|φ)
dp = sim.probabilities.grad(params) # ∂p(s|φ)/∂φ
p = sim.probabilities.forward(params) # p(s|φ)
dp = sim.probabilities.grad(params) # ∂p(s|φ)/∂φ

qfi = sim.amplitudes.qfim(params) # Quantum Fisher Information
cfi = sim.probabilities.cfim(params) # Classical Fisher Information
qfi = sim.amplitudes.qfim(params) # Quantum Fisher Information
cfi = sim.probabilities.cfim(params) # Classical Fisher Information
```


Expand Down
41 changes: 2 additions & 39 deletions docs/api/base.md
Original file line number Diff line number Diff line change
@@ -1,45 +1,8 @@
# Base Module

The `squint.ops.base` module contains the core abstractions for building quantum circuits in Squint.

## Key Concepts

### Wires and Degrees of Freedom

A **Wire** represents a quantum subsystem with a specific Hilbert space dimension. Each wire can optionally specify a degree of freedom (DoF) type to distinguish between different physical encodings:

- **DV** - Discrete variable systems (qubits, qudits)
- **CV** - Continuous variable systems (optical modes in Fock space)
- **TimeBin**, **FreqBin**, **Spatial** - Photonic encoding schemes

### Operation Hierarchy

All quantum operations inherit from `AbstractOp`:

- **States**: `AbstractPureState`, `AbstractMixedState` - Initial quantum states
- **Gates**: `AbstractGate` - Unitary transformations
- **Channels**: `AbstractKrausChannel`, `AbstractErasureChannel` - Non-unitary operations
- **SharedGate** - Parameter sharing across multiple wires (e.g., for phase estimation)
- **Block** - Grouping multiple operations

### Typical Usage

```python
from squint.ops.base import Wire, DV, SharedGate

# Create qubit wires
q0 = Wire(dim=2, dof=DV, idx=0)
q1 = Wire(dim=2, dof=DV, idx=1)

# Use in operations
from squint.ops.dv import DiscreteVariableState, RZGate
state = DiscreteVariableState(wires=(q0,), n=(0,))
phase = RZGate(wires=(q0,), phi=0.0)
```
# Base classes

---

<!-- prettier-ignore -->
::: squint.ops.base
::: squint.interface.base
options:
heading_level: 3
6 changes: 0 additions & 6 deletions docs/api/circuit.md

This file was deleted.

6 changes: 0 additions & 6 deletions docs/api/distributed.md

This file was deleted.

2 changes: 1 addition & 1 deletion docs/api/dv.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Discrete Variable

<!-- prettier-ignore -->
::: squint.ops.dv
::: squint.interface.dv
options:
heading_level: 3
2 changes: 1 addition & 1 deletion docs/api/fock.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Fock

<!-- prettier-ignore -->
::: squint.ops.fock
::: squint.interface.fock
options:
heading_level: 3
8 changes: 1 addition & 7 deletions docs/api/math.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
# Math

<!-- prettier-ignore -->
::: squint.ops.math
options:
heading_level: 3


<!-- prettier-ignore -->
::: squint.ops.gellmann
::: squint.math
options:
heading_level: 3
2 changes: 1 addition & 1 deletion docs/api/noise.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Noise

<!-- prettier-ignore -->
::: squint.ops.noise
::: squint.interface.noise
options:
heading_level: 3
8 changes: 4 additions & 4 deletions docs/api/ops.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Quantum Operations

This page documents all quantum operations available in Squint, organized by category.
This page documents all quantum operations available in `squint`, organized by category.

---

Expand All @@ -16,7 +16,7 @@ Operations for continuous variable (CV) quantum systems using the Fock (photon n
- `LinearOpticalUnitaryGate` - General passive linear optical transformation

<!-- prettier-ignore -->
::: squint.ops.fock
::: squint.interface.fock
options:
heading_level: 3

Expand All @@ -34,7 +34,7 @@ Operations for finite-dimensional quantum systems including qubits (dim=2) and q
- `CXGate`, `CZGate` - Controlled gates

<!-- prettier-ignore -->
::: squint.ops.dv
::: squint.interface.dv
options:
heading_level: 3

Expand All @@ -52,7 +52,7 @@ Quantum noise channels for modeling decoherence and errors. These require the "m
- `ErasureChannel` - Traces out (erases) specified wires

<!-- prettier-ignore -->
::: squint.ops.noise
::: squint.interface.noise
options:
heading_level: 3

Expand Down
4 changes: 2 additions & 2 deletions docs/api/simulator.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Simulator
# Backends and simulator

<!-- prettier-ignore -->
::: squint.simulator
::: squint.backends
options:
heading_level: 3
12 changes: 7 additions & 5 deletions docs/explanation/tricks_and_tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ The `Circuit` class is the main interface for building quantum sensing protocols

```python
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.backends.tensornetwork.simulator import Simulator

# Initialize circuit (backend auto-selected based on operations)
circuit = Circuit()
Expand All @@ -27,12 +27,13 @@ The key methods are,
### Operations

#### Discrete variable

```python
from squint.ops.dv import *
from squint.interface.dv import *

# Pauli gates
XGate(wires=(0,))
YGate(wires=(0,))
YGate(wires=(0,))
ZGate(wires=(0,))

# Rotation gates
Expand Down Expand Up @@ -60,13 +61,14 @@ CPhaseGate(wires=(control, target), phi=angle)
```

#### Fock/photon-number

```python
from squint.ops.fock import *
from squint.interface.fock import *

FockState(wires=(0,), n=(0,))

# Beam splitter
BeamSplitter(wires=(0, 1), r=jnp.pi/4)
BeamSplitter(wires=(0, 1), r=jnp.pi / 4)

# Phase shift
Phase(wires=(0,), phi=0.0)
Expand Down
26 changes: 13 additions & 13 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,35 +32,35 @@

```python
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.ops.base import Wire
from squint.ops.dv import DiscreteVariableState, HGate, RZGate
from squint.backends.tensornetwork.simulator import Simulator
from squint.interface.base import Wire
from squint.interface.dv import DiscreteVariableState, HGate, RZGate
from squint.utils import print_nonzero_entries, partition_op

# Create a simple one-qubit phase estimation circuit
# |0⟩ --- H --- Rz(φ) --- H --- |⟩
wire = Wire(dim=2, idx=0) # qubit with dim=2
circuit = Circuit()
circuit.add(DiscreteVariableState(wires=(wire,), n=(0,))) # |0⟩ state
circuit.add(HGate(wires=(wire,))) # Hadamard gate
circuit.add(RZGate(wires=(wire,), phi=0.0 * jnp.pi), "phase") # Phase rotation
circuit.add(HGate(wires=(wire,))) # Second Hadamard
circuit.add(DiscreteVariableState(wires=(wire,), n=(0,))) # |0⟩ state
circuit.add(HGate(wires=(wire,))) # Hadamard gate
circuit.add(RZGate(wires=(wire,), phi=0.0 * jnp.pi), "phase") # Phase rotation
circuit.add(HGate(wires=(wire,))) # Second Hadamard

# Compile the circuit for simulation
params, static = partition_op(circuit, "phase")
sim = Simulator.compile(static, params, optimize="greedy").jit()

# Calculate metrics important to quantum metrology & sensing protocols
# the quantum state and its gradient
psi = sim.amplitudes.forward(params) # |ψ(θ)⟩
dpsi = sim.amplitudes.grad(params) # ∂|ψ(θ)⟩/∂θ
psi = sim.amplitudes.forward(params) # |ψ(θ)⟩
dpsi = sim.amplitudes.grad(params) # ∂|ψ(θ)⟩/∂θ

# Probabilities and their gradients
p = sim.probabilities.forward(params) # p(s|θ)
dp = sim.probabilities.grad(params) # ∂p(s|θ)/∂θ
p = sim.probabilities.forward(params) # p(s|θ)
dp = sim.probabilities.grad(params) # ∂p(s|θ)/∂θ

qfi = sim.amplitudes.qfim(params) # Quantum Fisher Information
cfi = sim.probabilities.cfim(params) # Classical Fisher Information
qfi = sim.amplitudes.qfim(params) # Quantum Fisher Information
cfi = sim.probabilities.cfim(params) # Classical Fisher Information
```

## Installation
Expand Down
6 changes: 3 additions & 3 deletions docs/tutorials/multi_qubit.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ The phase accumulates as $N\varphi$, giving $N^2$ Fisher Information.
```python
import jax.numpy as jnp
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.ops.base import Wire, SharedGate
from squint.ops.dv import DiscreteVariableState, HGate, CXGate, RZGate
from squint.backends.tensornetwork.simulator import Simulator
from squint.interface.base import Wire, SharedGate
from squint.interface.dv import DiscreteVariableState, HGate, CXGate, RZGate
from squint.utils import partition_op

N = 4
Expand Down
10 changes: 5 additions & 5 deletions docs/tutorials/noise.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ $$\rho \to \mathcal{E}(\rho) = \sum_i K_i \rho K_i^\dagger$$
```python
import jax.numpy as jnp
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.ops.base import Wire, SharedGate
from squint.ops.dv import DiscreteVariableState, HGate, CXGate, RZGate
from squint.ops.noise import DepolarizingChannel
from squint.backends.tensornetwork.simulator import Simulator
from squint.interface.base import Wire, SharedGate
from squint.interface.dv import DiscreteVariableState, HGate, CXGate, RZGate
from squint.interface.noise import DepolarizingChannel
from squint.utils import partition_op

N = 4
Expand Down Expand Up @@ -126,7 +126,7 @@ For small $N$, GHZ beats the SQL. For large $N$, noise accumulates and GHZ perfo
## Other Noise Channels

```python
from squint.ops.noise import BitFlipChannel, PhaseFlipChannel, ErasureChannel
from squint.interface.noise import BitFlipChannel, PhaseFlipChannel, ErasureChannel

# Bit flip (random X errors)
circuit.add(BitFlipChannel(wires=(wire,), p=0.1))
Expand Down
6 changes: 3 additions & 3 deletions docs/tutorials/one_qubit.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ We implement Ramsey interferometry: $|0\rangle \xrightarrow{H} \xrightarrow{R_z(
```python
import jax.numpy as jnp
from squint.circuit import Circuit
from squint.simulator.tn import Simulator
from squint.ops.base import Wire
from squint.ops.dv import DiscreteVariableState, HGate, RZGate
from squint.backends.tensornetwork.simulator import Simulator
from squint.interface.base import Wire
from squint.interface.dv import DiscreteVariableState, HGate, RZGate
from squint.utils import partition_op
```

Expand Down
Loading
Loading