blue-sampler
Generate large stealthy point patterns on the unit torus $[0, 1)^D$. 📐
Stealthy point patterns exhibit vanishing density fluctuations at low frequencies, making them particularly suited for Monte Carlo integration 🎯, image stippling, and any application requiring well-distributed, low-discrepancy points.
The main blue-noise samplers (RGBN and NUFFT) offer linear complexity in both the number of points and the dimension. ⚡
They can generate e.g. 1 million 2D points in under 15 minutes on a standard CPU, and up to 30× faster on GPU.
Note: Most implemented methods support adaptive sampling from a target distribution.
📦 Installation
pip install blue-sampler
Quick Start
import blue_sampler as blue
# Generate 10,000 2D blue-noise points
x = blue.sample_points(N=10_000, D=2)
blue.plot(x) 📈
# Structure factor
blue.plot_structure_factor(x) 📊
# Image stippling
x = blue.im2points("zebra.jpg") 🖼️ #return points
x = blue.im2quads("vangogh.jpg") #quadrilaterals
🖼️ Example
📋 Available Samplers
Main sampling methods
x = blue.sample_points(N, D, method="rgbn") #(N, D)
| Method | Description |
|---|---|
rgbn |
Recursive Gaussian-Blue Noise 🔄 |
nufft |
Non-Uniform Fast Fourier Transform 📈 |
bruteforce |
Base GBN sampler (best quality, slower) |
Alternative Samplers
Sobol sequence
x = blue.sobol(N, D) #(N, D)
Low-discrepancy quasi-random sequence. 📏
Clusters
# Raw clusters
cl = blue.sample_clusters(N, D) #(N, K, D)
blue.plot_clusters(cl) 🔗
# Convert to point set
x = blue.cluster2points(cl) #(N, m, D)
STIT Tessellations (2D only)
# Raw STIT tessellation (quadrilaterals)
ts = blue.sample_tessels(N) #(N, 4, D=2)
blue.plot_tessels(ts) 🧩
# Convert to point set
x = blue.tessel2points(ts) #(N, m, D=2)
Pinwheel Tilings (2D only)
# Base pinwheel triangle
pw0 = blue.pinwheel_base() 𖣘 #(3, D=2)
# Triangulation level 4
pw4 = blue.pinwheel_transform(pw0, depth=4) #(4*5**depth, 3, D=2)
blue.plot_polygons(pw4) 🔺
#===============================
# Convert Pinwheel to point set:
#===============================
#sample points from the BASE pinwheel
x0 = blue.tessel2points(pw0) #(m, D=2)
#then replicate the sample on the full triangulation,
#in a fractal way
x4 = blue.pinwheel_transform(x0, depth = 4) #(4*5**depth, m, D=2)
Note: The conversion from geometric objects (polygons or clusters) to point sets is performed using a standard moment matching technique. cluster2points(x, p = 3) and tessel2points(x, p = 3) will sample m points per batch that mimic the statistical {0, 1, ... p-1} moments of the batch.
Supported Dimensions
| Dimension | Status |
|---|---|
| 2–3D | Fast ⚡ |
| 4–5D | Supported |
| ≥6D | Experimental 🧪 |
Documentation & Links 🔗
- 📖 Documentation: https://blue-sampler.readthedocs.io
- 📦 PyPI: https://pypi.org/project/blue-sampler
- 🌐 Project website: https://for-a-few-dpps-more.github.io/rgbn/
- 💻 GitHub: https://github.com/For-a-few-DPPs-more/rgbn
📚 References
The algorithms and mathematical tools implemented in blue-sampler are based or inspired from the following works.
-
Gaussian Blue Noise (repulsive interaction kernel)
A. G. M. Ahmed, J. Ren, and P. Wonka.
Gaussian Blue Noise.
ACM Transactions on Graphics (SIGGRAPH Asia), 41(6), 2022.
DOI: 10.1145/3550454.3555519 -
FReSCo (Non uniform FFT)
A. Shih, M. Casiulis, and S. Martiniani.
Fast Generation of Spectrally-Shaped Disorder.
Physical Review E, 110(3):034122, 2024.
DOI: 10.1103/PhysRevE.110.034122 -
STIT tessellations and moment matching
L. Lotz and M. A. Klatt.
Persistence of asymptotic variance under transport: from hyperfluctuation to stealthy hyperuniformity.
arXiv:2605.22803, 2026. -
Aperiodic tiling for hyuperuniformity (here pinwheel)
A. Gabrielli, B. Jancovici, M. Joyce, J. L. Lebowitz, L. Pietronero, and F. Sylos Labini.
Generation of Primordial Cosmological Perturbations from Statistical Mechanical Models.
Physical Review D, 67(4):043506, 2003. -
SquareNet (v1.3.11). 2026.
Grid data structure for point clouds, codeveloped with RGBN
for efficient neighbor query and fourier trnasform in Python. -
Sobol sequences
Wrapped fromscipy.stats.qmc.Sobol(SciPy).
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blue_sampler-1.3.5.tar.gz.
File metadata
- Download URL: blue_sampler-1.3.5.tar.gz
- Upload date:
- Size: 40.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d434287f6cd8a6eb3d4023a63313625ec96db6aac5a0ce3b8743b8bbd92a7513
|
|
| MD5 |
10fcd6ffe891672448c2dae048884aad
|
|
| BLAKE2b-256 |
f1c59c7adaabf3cd4fdd6848ebedd14cbea0ef18da660396535e7b64db1928de
|
File details
Details for the file blue_sampler-1.3.5-py3-none-any.whl.
File metadata
- Download URL: blue_sampler-1.3.5-py3-none-any.whl
- Upload date:
- Size: 48.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
118cc96e75fdfd656cf316acb3a84dce24baeb0b79c40514005a8cb78b1081dd
|
|
| MD5 |
dbdc58440489ddb88b2c253dd4cf5603
|
|
| BLAKE2b-256 |
c0eb2ce5c306b5da999fbe040c7dbcf9c7a287d779313fd28ef4cdbd489b707a
|