# \[ANN\] SymBasis.jl: Symmetry-conserving bases for Julia

**URL:** https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653
**Category:** Package Announcements
**Created:** [February 14, 2026, 10:09pm UTC](https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653 "2026-02-14T22:09:16Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![cevenkadir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cevenkadir/32/220815_2.png) [@cevenkadir](https://discourse.julialang.org/u/cevenkadir)
#### Post date: [February 14, 2026, 10:09pm UTC](https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653/1 "2026-02-14T22:09:16Z")

</div>

**[SymBasis.jl](https://github.com/cevenkadir/SymBasis.jl)** is a Julia package for generating **bases that conserve symmetries** in systems with a **discrete number of degrees of freedom** , with a focus on **quantum many-body** applications.

**Key features**

- Simple API to generate bases with **one or multiple symmetries**
- **Custom symmetries** (and predefined ones)
- Supports **any discrete DoF** : spins, fermions, bosons, or custom objects
- **Custom base positional numbering** for basis states

**Predefined symmetries**

- Total magnetization (spins)
- Spatial reflection
- Translational symmetry  
(Planned: spin inversion, particle number conservation, etc.)

**Installation (Julia ≥ 1.11)**

```julia
pkg> add SymBasis

```

**Quick example (spin-1/2, N=4, Sz=0)**

```julia
using SymBasis.DoFObjects
using SymBasis.SymGroups
using SymBasis.Bases

N = 4
Sz = 0//1

dofo = dof_object(:Spin, 1 // 2)
sg = sym(:TotalMagnetization, dofo, Sz, N)

basis(dofo, N, sg)

```

Project status: active development; please benchmark for your use case. Issues/feedback:  
[https://github.com/cevenkadir/SymBasis.jl/issues/new](https://github.com/cevenkadir/SymBasis.jl/issues/new)

---

<div class="post-metadata">

### Author: ![abraemer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/abraemer/32/51403_2.png) [@abraemer](https://discourse.julialang.org/u/abraemer)
#### Post date: [February 15, 2026, 9:00pm UTC](https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653/2 "2026-02-15T21:00:29Z")

</div>

Interesting 🙂 I have written somethings in this direction (but focused on spin-half only) myself a couple of years ago. Maybe it useful for you as a reference. [GitHub - abraemer/SpinSymmetry.jl: One can never have enough symmetries in one's quantum spin chain.](https://github.com/abraemer/SpinSymmetry.jl)

As a general feedback: In Julia using symbols as arguments just to convert them to `Val` and then dispatch on is not very idiomatic. I think it would better to just use types for that. That’s more discoverable, documentable and less prone to runtime dispatch.  
So

```julia-auto
dof_object(:Spin, 1//2)
# could be
dof_object(Spin(), 1//2)
# or even simpler
Spin(1//2)

```

---

<div class="post-metadata">

### Author: ![cevenkadir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cevenkadir/32/220815_2.png) [@cevenkadir](https://discourse.julialang.org/u/cevenkadir)
#### Post date: [February 15, 2026, 9:22pm UTC](https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653/3 "2026-02-15T21:22:56Z")

</div>

I was not aware of this package, but I will definitely check it out.

As for your feedback: you are right. I will consider changing from `Symbol` to `Type` in upcoming versions. Thanks a lot.

---

<div class="post-metadata">

### Author: ![cevenkadir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cevenkadir/32/220815_2.png) [@cevenkadir](https://discourse.julialang.org/u/cevenkadir)
#### Post date: [February 18, 2026, 12:11pm UTC](https://discourse.julialang.org/t/ann-symbasis-jl-symmetry-conserving-bases-for-julia/135653/4 "2026-02-18T12:11:15Z")

</div>

With v0.1.2, you can now use types instead of symbols to call predefined symmetry groups and DoF objects:

```julia
julia> using SymBasis.DoFObjects
julia> using SymBasis.SymGroups
julia> using SymBasis.Bases

julia> N = 4; # number of sites
julia> Sz = 0; # total magnetization

# define an object for spin-1/2
julia> dofo = dof_object(Spin(1 // 2))
DoFObject: Spin (B=2)
  ldof: (-1//2, 1//2)
  index types: T=UInt64, Ti=Int64

# define the symmetry group for total magnetization
julia> sg = sym(TotalMagnetization(Sz, N), dofo)
SymGroup{2,Rational{Int64},UInt64,Int64,Float64} with 1 cycle(s)
  N: 4
  DoF-object: DoFObject(Spin, B=2)
  cycles: (N0 = 2, N1 = 2, N = 4)
  factors: 1 element(s), eltype=Float64
  check: check_Nₛ
  apply: apply_Nₛ

# generate the basis
julia> basis(dofo, N, sg)
Basis{SymBasis.DigitBase.BaseInt{UInt64, Int64, 2},Float64} with 6 states
  states: Vector{SymBasis.DigitBase.BaseInt{UInt64, Int64, 2}}
  norms : Vector{Float64}
  first 6 states/norms:
    (11)₂ (norm=1.0)
    (101)₂ (norm=1.0)
    (110)₂ (norm=1.0)
    (1001)₂ (norm=1.0)
    (1010)₂ (norm=1.0)
    (1100)₂ (norm=1.0)

```
