Skip to main content

BlockSolver - Block Quasi-Minimal Residual (BLQMR) Sparse Linear Solver

BlockSolver is a Python package for solving large sparse linear systems using the Block Quasi-Minimal Residual (BLQMR) algorithm. It provides both a high-performance Fortran backend and a pure Python/NumPy implementation for maximum portability.

Features

  • Block QMR Algorithm: Efficiently solves multiple right-hand sides simultaneously
  • Complex Symmetric Support: Designed for complex symmetric matrices (A = Aᵀ, not A = A†)
  • Dual Backend: Fortran extension for speed, Python fallback for portability
  • Flexible Preconditioning: ILU, diagonal (Jacobi), and split preconditioners
  • SciPy Integration: Works seamlessly with SciPy sparse matrices
  • Optional Numba Acceleration: JIT-compiled kernels for the Python backend

Algorithm

Block Quasi-Minimal Residual (BLQMR)

The BLQMR algorithm is an iterative Krylov subspace method specifically designed for:

  1. Complex symmetric systems: Unlike standard methods that assume Hermitian (A = A†) or general matrices, BLQMR exploits complex symmetry (A = Aᵀ) which arises in electromagnetics, acoustics, and diffuse optical tomography.

  2. Multiple right-hand sides: Instead of solving each system independently, BLQMR processes all right-hand sides together in a block fashion, sharing Krylov subspace information and reducing total computation.

  3. Quasi-minimal residual: The algorithm minimizes a quasi-residual norm at each iteration, providing smooth convergence without the erratic behavior of some Krylov methods.

Key Components

  • Quasi-QR Decomposition: A modified Gram-Schmidt process using the quasi inner product ⟨x,y⟩ = Σ xₖyₖ (without conjugation) for complex symmetric systems.

  • Three-term Lanczos Recurrence: Builds an orthonormal basis for the Krylov subspace with short recurrences, minimizing memory usage.

  • Block Updates: Processes m right-hand sides simultaneously, with typical block sizes of 1-64.

When to Use BLQMR

Use Case Recommendation
Complex symmetric matrix (A = Aᵀ) ✅ Ideal
Multiple right-hand sides ✅ Ideal
Real symmetric positive definite Consider CG first
General non-symmetric Consider GMRES or BiCGSTAB
Very large systems (>10⁶ unknowns) ✅ Good with preconditioning

Installation

From PyPI

pip install blocksolver

From Source

Prerequisites:

  • Python ≥ 3.8
  • NumPy ≥ 1.20
  • SciPy ≥ 1.0
  • (Optional) Fortran compiler + UMFPACK for the accelerated backend
  • (Optional) Numba for accelerated Python backend
# Ubuntu/Debian
sudo apt install gfortran libsuitesparse-dev libblas-dev liblapack-dev

# macOS
brew install gcc suite-sparse openblas

# Install
cd python
pip install .

Quick Start

import numpy as np
from scipy.sparse import csc_matrix
from blocksolver import blqmr

# Create a sparse matrix
A = csc_matrix([
    [4, 1, 0, 0],
    [1, 4, 1, 0],
    [0, 1, 4, 1],
    [0, 0, 1, 4]
], dtype=float)

b = np.array([1., 2., 3., 4.])

# Solve Ax = b
result = blqmr(A, b, tol=1e-10)

print(f"Solution: {result.x}")
print(f"Converged: {result.converged}")
print(f"Iterations: {result.iter}")
print(f"Relative residual: {result.relres:.2e}")

Usage

Main Interface: blqmr()

The primary function blqmr() automatically selects the best available backend (Fortran if available, otherwise Python).

from blocksolver import blqmr, BLQMR_EXT

# Check which backend is active
print(f"Using Fortran backend: {BLQMR_EXT}")

# Basic usage
result = blqmr(A, b)

# With options
result = blqmr(A, b, 
    tol=1e-8,              # Convergence tolerance
    maxiter=1000,          # Maximum iterations
    precond_type='ilu',    # Preconditioner: 'ilu', 'diag', or None
)

Multiple Right-Hand Sides

BLQMR excels when solving the same system with multiple right-hand sides:

import numpy as np
from blocksolver import blqmr

# 100 different right-hand sides
B = np.random.randn(n, 100)

# Solve all systems at once (much faster than solving individually)
result = blqmr(A, B, tol=1e-8)

# result.x has shape (n, 100)

Complex Symmetric Systems

BLQMR is specifically designed for complex symmetric matrices (common in frequency-domain wave problems):

import numpy as np
from blocksolver import blqmr

# Complex symmetric matrix (A = A.T, NOT A.conj().T)
A = create_helmholtz_matrix(frequency=1000)  # Your application
b = np.complex128(source_term)

result = blqmr(A, b, tol=1e-8, precond_type='diag')

Preconditioning

BlockSolver supports multiple preconditioner types for both backends:

from blocksolver import blqmr, make_preconditioner

# Using precond_type parameter (works with both backends)
result = blqmr(A, b, precond_type='ilu')    # Incomplete LU
result = blqmr(A, b, precond_type='diag')   # Diagonal (Jacobi)
result = blqmr(A, b, precond_type=None)     # No preconditioning

# Custom preconditioner (Python backend only)
M1 = make_preconditioner(A, 'ilu', drop_tol=1e-4, fill_factor=10)
result = blqmr(A, b, M1=M1, precond_type=None)

# Split preconditioning for symmetric systems (Python backend)
# Preserves symmetry: M1^{-1} A M2^{-1}
M = make_preconditioner(A, 'diag', split=True)  # Returns sqrt(D)
result = blqmr(A, b, M1=M, M2=M, precond_type=None)

SciPy-Compatible Interface

For drop-in replacement in existing code:

from blocksolver import blqmr_scipy

# Returns (x, flag) like scipy.sparse.linalg solvers
x, flag = blqmr_scipy(A, b, tol=1e-10)

Low-Level CSC Interface

For maximum control, use the CSC component interface:

from blocksolver import blqmr_solve

# CSC format components (0-based indexing)
Ap = np.array([0, 2, 5, 9, 10, 12], dtype=np.int32)  # Column pointers
Ai = np.array([0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4], dtype=np.int32)  # Row indices
Ax = np.array([2., 3., 3., -1., 4., 4., -3., 1., 2., 2., 6., 1.])  # Values
b = np.array([8., 45., -3., 3., 19.])

result = blqmr_solve(Ap, Ai, Ax, b, 
    tol=1e-8,
    droptol=0.001,         # ILU drop tolerance (Fortran backend only)
    precond_type='ilu',    # Preconditioner type
    zero_based=True,       # 0-based indexing (default)
)

API Reference

blqmr(A, B, **kwargs) -> BLQMRResult

Main solver interface.

Parameters:

Parameter Type Default Description
A sparse matrix or ndarray required System matrix (n × n)
B ndarray required Right-hand side (n,) or (n × m)
tol float 1e-6 Convergence tolerance
maxiter int n Maximum iterations
M1, M2 preconditioner None Custom preconditioners (Python backend)
x0 ndarray None Initial guess
precond_type str or None 'ilu' Preconditioner: 'ilu', 'diag', or None
droptol float 0.001 ILU drop tolerance (Fortran backend)
residual bool False Use true residual for convergence (Python)
workspace BLQMRWorkspace None Pre-allocated workspace (Python)

Returns: BLQMRResult object with:

Attribute Type Description
x ndarray Solution vector(s)
flag int 0=converged, 1=maxiter, 2=precond fail, 3=stagnation
iter int Iterations performed
relres float Final relative residual
converged bool True if flag == 0
resv ndarray Residual history (Python backend only)

blqmr_solve(Ap, Ai, Ax, b, **kwargs) -> BLQMRResult

Low-level CSC interface for single RHS.

blqmr_solve_multi(Ap, Ai, Ax, B, **kwargs) -> BLQMRResult

Low-level CSC interface for multiple right-hand sides.

blqmr_scipy(A, b, **kwargs) -> Tuple[ndarray, int]

SciPy-compatible interface returning (x, flag).

make_preconditioner(A, precond_type, **kwargs) -> Preconditioner

Create a preconditioner for the Python backend.

Parameters:

Parameter Type Default Description
A sparse matrix required System matrix
precond_type str required 'diag', 'jacobi', 'ilu', 'ilu0', 'ilut', 'lu', 'ssor'
split bool False Return sqrt(D) for split preconditioning
drop_tol float 1e-4 Drop tolerance for ILUT
fill_factor float 10 Fill factor for ILUT
omega float 1.0 Relaxation parameter for SSOR

Utility Functions

from blocksolver import (
    BLQMR_EXT,        # True if Fortran backend available
    HAS_NUMBA,        # True if Numba acceleration available
    get_backend_info, # Returns dict with backend details
    test,             # Run built-in tests
)

Benchmarks

BLQMR vs Direct Solver (mldivide)

Complex symmetric FEM matrices, 4 right-hand sides, tolerance 10⁻⁸, split Jacobi preconditioner:

Grid Nodes NNZ mldivide BLQMR Speedup
20³ 8,000 110K 135ms 115ms 1.2×
30³ 27,000 384K 1.36s 373ms 3.6×
40³ 64,000 922K 6.40s 947ms 6.8×
50³ 125,000 1.8M 25.9s 1.76s 14.7×

Block Size Efficiency

With 64 RHS on a 8,000-node complex symmetric system:

Block Size Iterations Speedup vs Single
1 (point) 10,154 1.0×
4 2,220 1.8×
8 956 2.0×
16 361 2.1×
32 178 2.2×

Optimal block size: 8-16 for most problems. Larger blocks have diminishing returns due to increased per-iteration cost.

Iteration Efficiency

With 4 RHS, BLQMR uses only ~24% of total iterations compared to 4 separate single-RHS solves — achieving super-linear block acceleration.

Performance Tips

  1. Use the Fortran backend when available (faster for large systems)

  2. Enable preconditioning for ill-conditioned systems:

    result = blqmr(A, b, precond_type='ilu')
    
  3. Batch multiple right-hand sides instead of solving one at a time:

    # Fast: single call with all RHS
    result = blqmr(A, B_matrix)
    
    # Slow: multiple calls
    for b in B_columns:
        result = blqmr(A, b)
    
  4. Install Numba for faster Python backend:

    pip install numba
    
  5. Reuse workspace for repeated solves with the same dimensions:

    from blocksolver import BLQMRWorkspace
    ws = BLQMRWorkspace(n, m, dtype=np.complex128)
    for b in many_rhs:
        result = blqmr(A, b, workspace=ws)
    
  6. Use split Jacobi for complex symmetric systems:

    # Preserves symmetry of preconditioned system
    M = make_preconditioner(A, 'diag', split=True)
    result = blqmr(A, b, M1=M, M2=M, precond_type=None)
    

Examples

Diffuse Optical Tomography

import numpy as np
from scipy.sparse import diags, kron, eye
from blocksolver import blqmr

def create_diffusion_matrix(nx, ny, D=1.0, mu_a=0.01, omega=1e9):
    """Create 2D diffusion matrix for DOT."""
    n = nx * ny
    h = 1.0 / nx
    
    # Laplacian
    Lx = diags([-1, 2, -1], [-1, 0, 1], shape=(nx, nx)) / h**2
    Ly = diags([-1, 2, -1], [-1, 0, 1], shape=(ny, ny)) / h**2
    L = kron(eye(ny), Lx) + kron(Ly, eye(nx))
    
    # Diffusion equation: (-D∇² + μ_a + iω/c) φ = q
    c = 3e10  # speed of light in tissue (cm/s)
    A = -D * L + mu_a * eye(n) + 1j * omega / c * eye(n)
    
    return A.tocsc()

# Setup problem
A = create_diffusion_matrix(100, 100, omega=2*np.pi*100e6)
sources = np.random.randn(10000, 16) + 0j  # 16 source positions

# Solve for all sources at once
result = blqmr(A, sources, tol=1e-8, precond_type='diag')
print(f"Solved {sources.shape[1]} systems in {result.iter} iterations")

Frequency-Domain Acoustics

import numpy as np
from blocksolver import blqmr

# Helmholtz equation: (∇² + k²)p = f
# Results in complex symmetric matrix

def solve_helmholtz(K, M, f, frequencies):
    """Solve Helmholtz at multiple frequencies."""
    solutions = []
    for omega in frequencies:
        # A = K - ω²M (complex symmetric if K, M are symmetric)
        A = K - omega**2 * M
        result = blqmr(A, f, tol=1e-10, precond_type='diag')
        solutions.append(result.x)
    return np.array(solutions)

Troubleshooting

"No Fortran backend available"

Install the package with Fortran support:

# Install dependencies first
sudo apt install gfortran libsuitesparse-dev  # Linux
brew install gcc suite-sparse                  # macOS

# Reinstall blocksolver
pip install --no-cache-dir blocksolver

Check backend status

from blocksolver import get_backend_info
print(get_backend_info())
# {'backend': 'binary', 'has_fortran': True, 'has_numba': True}

Slow convergence

  1. Enable preconditioning: precond_type='ilu' or precond_type='diag'
  2. Reduce ILU drop tolerance: droptol=1e-4 (Fortran backend)
  3. Check matrix conditioning with np.linalg.cond(A.toarray())

ILU factorization fails

For indefinite or complex symmetric matrices, ILU may fail:

# Fall back to diagonal preconditioner
result = blqmr(A, b, precond_type='diag')

Memory issues with large systems

  1. Use the Fortran backend (more memory efficient)
  2. Reduce block size for multiple RHS
  3. Use iterative refinement instead of tighter tolerance

License

BSD-3-Clause or GPL-3.0+ (dual-licensed)

Citation

If you use BlockSolver in your research, please cite:

@software{blocksolver,
  author = {Qianqian Fang},
  title = {BlockSolver: Block Quasi-Minimal Residual Sparse Linear Solver},
  url = {https://github.com/fangq/blit},
  year = {2024}
}

See Also

Release files for blocksolver 0.9.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for blocksolver 0.9.4
File
blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl CPython 3.14 CPython 3.14 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl CPython 3.13 CPython 3.13 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl CPython 3.12 CPython 3.12 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl CPython 3.11 CPython 3.11 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl CPython 3.10 CPython 3.10 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl CPython 3.9 CPython 3.9 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl CPython 3.9 CPython 3.9 macOS 14.0+ ARM64 Details
blocksolver-0.9.4-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.17+ x86-64 Details
blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl CPython 3.8 CPython 3.8 macOS 15.0+ x86-64 Details
blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl CPython 3.8 CPython 3.8 macOS 14.0+ ARM64 Details

Total release size:278.7 MB

Release files / blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
7ac9a25a43ecbb77b6a85629db7d6eddcc5b19ed232d9c7001ddfbb21cdd4cda
BLAKE2b-256 checksum
How to use checksums
ad0aee6de2e58f2914702a073e2186597ab9e23167928e195a71f06752df8e5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp314-cp314-win_amd64.whl

Download URL blocksolver-0.9.4-cp314-cp314-win_amd64.whl
Size 11.6 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
c05c87d46172f3c6a2b248d49e7aa477aba14ddd9774be104d8dceb7c39f4ee2
BLAKE2b-256 checksum
How to use checksums
d45b11008a0a5c311e2af40328fa2c16414c011c0d48a586b9c72e1f7706180d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
e7393a80a304bf5f548c938c8e72855a5230214c8062cd0ed36731de88ecac9e
BLAKE2b-256 checksum
How to use checksums
fefe5db7140b8f342bff378cd1bfd0c4602716493eeefd8e55de9817e72b6e49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.14 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
6833b3b5e864c326fa8d7019bb6cc5a4290fd65410c9e7b9d29f71662e9c52a0
BLAKE2b-256 checksum
How to use checksums
b001112886b7df473043420640fbfa09c6650dc15749b9062cbd8480bba97be9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.14 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
a201d78780c617fcf3a5b6ec13331c7f5717d64c601ca7ea8387edbab9b38198
BLAKE2b-256 checksum
How to use checksums
81a0505d7447d9e8cee9d895de3bfeffc7abd6ec9e015d93c13f91a5dcb3c1e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
8a23659b87da43ef948d2e84f25b523125297baf6ed33fab5f4cfd5fc40304ca
BLAKE2b-256 checksum
How to use checksums
9eac3b2c0e40df9469236499f09fcf3057b1a9125eb32513523baf9f109b2df6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp313-cp313-win_amd64.whl

Download URL blocksolver-0.9.4-cp313-cp313-win_amd64.whl
Size 11.3 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
d4b4578a60067b47f72e7eec954a16bb3364d0430cb10b42aa2460ef59592e1d
BLAKE2b-256 checksum
How to use checksums
d7c0ac732a6bac549ccba37edfc7da4dfe883a488d7670f660b6f0905a1926aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
567e98ed4fb319935eb97125d8d50decac1cfe7bb29db20e0fd0c10fe79dc76d
BLAKE2b-256 checksum
How to use checksums
7375b8a297b93a08475d0571796e714441fe05349de1cfc367f0e8670d1bcb0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.13 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
65b98144026ce7530325e3ee9cb473c2f24675a00371f8e4d4392d959a2d3cd9
BLAKE2b-256 checksum
How to use checksums
3c725ce144aae299634ed3ff4e382373c2abd6539180577e3adcc4e2b1a52c9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.13 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
1447eaab33e5bf683c30f7e0fcaceb37fd7a546fea5436e64b5e3ba7e43a41b9
BLAKE2b-256 checksum
How to use checksums
da47b8a3f018897a2a7c1e52084c4ef83471d3f74a2a2b892ccc4e55b51e091e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp312-cp312-win_amd64.whl

Download URL blocksolver-0.9.4-cp312-cp312-win_amd64.whl
Size 11.3 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
5a2a2d8820df9c2e0fcf2f9734b4fcc33fcb664da01b65beb3173e39edaffac9
BLAKE2b-256 checksum
How to use checksums
da580d736a426fef16deb614bc7be064651ff5550fe4167ce415aaae305b8697
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
66d26ad60584ae841595491190a953336d33bebc3d4f8850b3acf7224540a1f9
BLAKE2b-256 checksum
How to use checksums
e6d86dccf85f24b80bc1ae4e605b0a52b9d85b7023a80246441d9a8945bfa151
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.12 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
11d1eddb25d2178319274b5abc337e91b2712a2381302cc8d9a9d7bf6a89d8a9
BLAKE2b-256 checksum
How to use checksums
f28323290fc95bf9c3c67327879028037258c1c4bb1118d0152d676cb1bb69ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.12 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
48e37b5620048722804c77f8957f74691682fe72d9800e79d8a14a376099b3c8
BLAKE2b-256 checksum
How to use checksums
d4f36830f8bff65e6f812ed80bce98f6d747ca00ebcb0bf1eec8194349972707
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp311-cp311-win_amd64.whl

Download URL blocksolver-0.9.4-cp311-cp311-win_amd64.whl
Size 11.3 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
d219954731c7a3d86098abbfa6119bae51e7c3d3da3ed4da8f5557ec34555128
BLAKE2b-256 checksum
How to use checksums
22dd288aa39be7ddd3c535bf2d6b8c5ff69ef54d146391c46404aecf0324f898
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
f3437faf98a95db42dbb35a374dd4a0bf7f7fba9032439a1e49a5f742c8d5baa
BLAKE2b-256 checksum
How to use checksums
3b645054b0022f3b2e9ace1822b3bead1dc5e06a1c2005fb8515f3732ef167f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.11 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
4b6d13e27486c42234d5749fdf4852500b91ed271508adf46f837475f55429e7
BLAKE2b-256 checksum
How to use checksums
55792727a2bf1e57f5015028f7805c7f3d0866f2b148869801687e065285302e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.11 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
a684eb249e3d0c03e5ea65cf292cfcf467fd2d7cc5b53739a3c5a2bef38aa81f
BLAKE2b-256 checksum
How to use checksums
89fe73fe3d9f892cd3234776730ec37a02e1597c10b2fb7d5b2947faa7a77557
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp310-cp310-win_amd64.whl

Download URL blocksolver-0.9.4-cp310-cp310-win_amd64.whl
Size 11.3 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
700c8dd9d703a5ed3f6d4658be7d93fefdae835b37ff34795b06bbb060db9208
BLAKE2b-256 checksum
How to use checksums
95ecd4acb98f2db59bcd24d6fe5a1fea687522dd8aaef9fec8bcff2c5ac25279
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
e28402bf1d02b0c6ad7679ade666c26e9a4e053023bbc94441bc51e08fac595c
BLAKE2b-256 checksum
How to use checksums
76f0fbcf1191670c087ad37e6cf9bfcdbedb344f5195624952bb6108ebc65be0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.10 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
fbb95c00ce161cc3c36517cdc4e0f52a67cf93bdd06125e533552cf603ea06ea
BLAKE2b-256 checksum
How to use checksums
5d050dee934b92bc4f0a83d8e093c2d3a04ffe9a298d1611379f428402180c0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.10 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
a5ec5cdd63dfb1265a5446aa58ca81555cf29a24082499fc3abc2ce27fffd792
BLAKE2b-256 checksum
How to use checksums
90ceb450c254d3a85bc160fc4689c4aa598850a37b2a54bbabadbded19084090
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp39-cp39-win_amd64.whl

Download URL blocksolver-0.9.4-cp39-cp39-win_amd64.whl
Size 11.3 MB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
6794164b55e898774f385ed16d2adc9670f23b0b918fad44abfff99e2d4a3261
BLAKE2b-256 checksum
How to use checksums
383e0594e262746d667a4e2b44c07251c0ecba0d92263d2ab13bc213241c96ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
9a898b36e51d028f6a9774575033429d0b28f558311abc6c8d97b57ffe4f8407
BLAKE2b-256 checksum
How to use checksums
4318667bec063efdde982718d5000126c45c7849e4059d019b8474d48be3ffd3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.9 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
2d3548c6151ce52d696e656c02e39e145ee0a6993941971f95f1bc0047e813a7
BLAKE2b-256 checksum
How to use checksums
ac6be88bd25d5a8d61200621ccc7b1858e1d38ea5cede780ff92e613fe02fc39
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.9 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
6d61926f8bb96d29e66442438db9896c4468224c43c5fe101902716297654437
BLAKE2b-256 checksum
How to use checksums
45ebb4e05a84525af3f519396a84ca119d34aa23cf2a0ddd12dec46d6f086fa2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp38-cp38-win_amd64.whl

Download URL blocksolver-0.9.4-cp38-cp38-win_amd64.whl
Size 11.3 MB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
4d6b5d0bd4711b672ffad1175293e2a61c2dce93394f958076b40b482ba51256
BLAKE2b-256 checksum
How to use checksums
32c6f9f1fe5e44a6c776c8fdea8a795581d03423256004e38b10d1986f1e7413
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 15.6 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
72b7c08ce26dd85932721e1afb2d1e4f513ca532ac1c1b79145bec31c53075cf
BLAKE2b-256 checksum
How to use checksums
3f0421b59adf60eb68afa225c72064dbdb4d70e6e2d4f4001a59e4ebfb7cec61
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl

Download URL blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl
Size 5.6 MB
Tags CPython 3.8 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
91778f72de60c40fd6ac9bac634443dbeaec2bc91b6b5547f1df880a98e9a435
BLAKE2b-256 checksum
How to use checksums
7c155fa2b19b071365cb401f6b810539ec944b33d9d6c6114fd60ddb9d08fa11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl

Download URL blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl
Size 2.7 MB
Tags CPython 3.8 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
169a0d29a450e54f99828fbb65a69348c6e9e119723a637e7fa9de394c714014
BLAKE2b-256 checksum
How to use checksums
6617400ba51b88b8175899dba1177ef2f1f75948fef044c2fea4345d2ca56a3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.9.4 This release

30 release files

0.9.3

30 release files

0.9.2

30 release files

0.9.1

21 release files

0.9.0

30 release files

0.8.5

33 release files

0.8.4

19 release files

0.8.3

19 release files

0.8.2

19 release files

0.8.1

19 release files

0.8.0

16 release files

0.6.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page