Skip to main content

Block Quasi-Minimal-Residual sparse linear solver

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

blocksolver-0.9.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp314-cp314-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.14Windows x86-64

blocksolver-0.9.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp314-cp314-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

blocksolver-0.9.2-cp314-cp314-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

blocksolver-0.9.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp313-cp313-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.13Windows x86-64

blocksolver-0.9.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp313-cp313-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

blocksolver-0.9.2-cp313-cp313-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

blocksolver-0.9.2-cp312-cp312-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.12Windows x86-64

blocksolver-0.9.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp312-cp312-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

blocksolver-0.9.2-cp312-cp312-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

blocksolver-0.9.2-cp311-cp311-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.11Windows x86-64

blocksolver-0.9.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp311-cp311-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

blocksolver-0.9.2-cp311-cp311-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

blocksolver-0.9.2-cp310-cp310-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.10Windows x86-64

blocksolver-0.9.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp310-cp310-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

blocksolver-0.9.2-cp310-cp310-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

blocksolver-0.9.2-cp39-cp39-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.9Windows x86-64

blocksolver-0.9.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp39-cp39-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.9macOS 15.0+ x86-64

blocksolver-0.9.2-cp39-cp39-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.9macOS 14.0+ ARM64

blocksolver-0.9.2-cp38-cp38-win_amd64.whl (11.2 MB view details)

Uploaded CPython 3.8Windows x86-64

blocksolver-0.9.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

blocksolver-0.9.2-cp38-cp38-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.8macOS 15.0+ x86-64

blocksolver-0.9.2-cp38-cp38-macosx_14_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.8macOS 14.0+ ARM64

File details

Details for the file blocksolver-0.9.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 4cff3ddefbc4eb6d942249a192a36a4a2213d366118c265e884156731cae857a
MD5 c97c2a1fb01364d3d5ba15586af6d401
BLAKE2b-256 ec11a58431ffd8a6c266f63f4d09cdc92ac04a85981667538d27724dcfa730e1

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a8294c49c6d47029b2056580f80fcbcb6041e370ede482f3cd37926affd7d367
MD5 8026084b7abdc14a601fac2a79929591
BLAKE2b-256 7650a6ed9411f621015cff34a8419631f521606b1f8f2ceb1eb5fecb0404548b

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 7d6d28aaaddbe720b57ca2ef714b1e192fde8ede8d713ff08ac1bf49cf010c9d
MD5 a14f11fde3eb7e0b22dc58c8223d131a
BLAKE2b-256 d7d02e73dd139fdff358289a9b6498c92c21417f7e25889c11c90b95109cd0dc

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp314-cp314-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 754c80b13407a58b678e75b72503835edb82638a570e3683017ce44ed375eab3
MD5 807ec17e209cf0a459e79a11adb2ea01
BLAKE2b-256 1dd1fb0f4901bd61c83fb4b22fc4b6646f0f67d9b482e68ede2b6ec75387db5d

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp314-cp314-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 4a6ffd1588b9118a985fe0d2cbb6de710d648841606d5811ae4f28f407761ab0
MD5 17021ea6fa7fb9a0e7f1d5117b8cc074
BLAKE2b-256 4ae65c712c6870dc8a19c067f971e1af4ece12c38552516a330204b529656950

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 69e23caf2f6791e7cb6e6b7686773f8bbe2f81182d505b27d81318aebeec420f
MD5 e7bddd968864876ce7333b14f5940bcf
BLAKE2b-256 a79f56782fe6f93a8c3ef302724aaf86e560d336bbcca9441f28f374ec3015aa

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 50a948da47e02e80dc733436cb59b2d866f9cdcb03481eb531ca6e49541474a9
MD5 cc33b4d49636fdbf6d6d3240709dead9
BLAKE2b-256 a0b90ba434037447163631eab6cde351a0f2a62dd26d1e1e0a3e4b9e2b975012

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 64527d16cd41c64703a779dc0da74ac7c741d0164bf7a74234ee90ed2387395a
MD5 c98e5e815b3b2cfe05083b2b6c4a4988
BLAKE2b-256 174e054e24d1288629f7d9555feae6557ce45adcd41e37be0120cc83e5bd8d6f

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp313-cp313-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 e203707acf661556f66e1360e01fc8cef05eda5b68f33f8ceeec94b86e5f8e7b
MD5 3cc85fbdb156ded66575b2aa1dea6d3f
BLAKE2b-256 9f297bcceafbea0a6e1517935cbab7b02c8e6d1c3dad80cc482e18b23fad05b6

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 dd7ddddc0bb4f86d77db64aaf9e04c6328f78a04887f5d152947462191cd5f89
MD5 69b3235eaf64f7d746c1d5bb6fb67abc
BLAKE2b-256 4df41aa0ecaa2fabbd28f9173d6b2ef7e33dcb45283904ea6c4915acf822c85e

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 7e8c610f493865a78876462d4f6bc52a33f2377d6c6682d63ca64b08d2df9142
MD5 0560e019bac6316e7669d0415f209215
BLAKE2b-256 93e9961bc8bdb14050535fefa63387c68da8cf2ea4cf12d6291a2cd0b639e267

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 98e663c66b5d4ae75b70f269ff13198adaa01f028b219debda97d38dfc096287
MD5 a92bf64cb326635802216674ed4a892b
BLAKE2b-256 1109f16395ecfee8b1dbd4708b6f940395dc3893c5dc7606caf8e9cf9829156a

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp312-cp312-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 d337ba05c29bdb3bc93727b559cc55f985c3b3a1b42f8e211279669b5fe1a84f
MD5 d6c9b4bc8ca1aa9ed4ae92b8d23b4e22
BLAKE2b-256 c0f1d370f97dab3f6c06819ed0cc29bb4dc1d54e895cd7caed7f4597df9a91ca

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f0b85c1b8855c027b68003b569112810134cdfbd4cdd717ae40cdd107845bf64
MD5 3df6c1247952138041dc58a2e0714e54
BLAKE2b-256 6e53f8006a93ab0594cb2c934e5e1a21e3da5156fd23d3508956b27a6f0a4cd2

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6061803215789535f8232737b3b7b2b47bbfeab5a44078a9f6e305e6d8d1b765
MD5 3074c0538f42a952027f156f805947fd
BLAKE2b-256 e63f7f9385d17219413dc8969c1143569c2a33fe0fb4d1fca05beeb95e6cae49

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a1efeb5eafcb251f05f5f2fd7c694bdb4b29a9364721b93aa5d82781eaa15531
MD5 029ed4ddb8e5ccd9da32ea9c963ab09c
BLAKE2b-256 1596adfccd6b2809f4f6731473612a3cabf94543e186acbeaa57dc6d42dea1aa

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp311-cp311-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 30b7b2c27bb563641587071de7cfb2eb941a77e5086f663bac928bb2a3731890
MD5 f28a0fc2e7102a60aa7dd35ce294e659
BLAKE2b-256 fa66470ad29d35c14ba50a26e53f94efa886cfe2a2907a4febcd0a9c3e62f3f1

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 56d70efff55fe577c6125917c55f2d5f20cc543f23741129dd5afaadbbf82df6
MD5 bc947510d837e7a7d98df7b4a361e762
BLAKE2b-256 3ccb50813609cae39cc17fb1608461414451052b7fff8ef1d2055402aea2bf78

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 520a19e8fd4de0c9c85d8b811139f83df30b91ad8c98ed6cb59a94364b9ba30d
MD5 e113efb47d20083e3506acb56e617fd3
BLAKE2b-256 e31497d46ec9be6c0d7ba367ff212c2241d2d06ef4f9f2ef4bf4932b572c455f

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 7ce01fdd0287588f6eb06393801b296d70413a5ed6be7ded9ade9147a9a140bf
MD5 d7010d7df405cbb7b672f797a9fcabfe
BLAKE2b-256 43e64a9bf975a504acad6defe9083c21dde6731cdb3aea58dc3141194aecf6a8

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp310-cp310-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 20c7812c9b292be72b26e453d30fdd469b9ca789a14eb44508cd149606bc8afd
MD5 81ff32337b798a760e3a71c14bccb8fd
BLAKE2b-256 8e48b1cfe985e5eebb98702626d455bd80d35fdff687f2ff6ef1111f7cd82bb4

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b2edcb149f8f0034e846223feacd5f7edc5b3cbd8fefa28acdbc574ef2b8e4d2
MD5 65f5a4f2301327cf589199691d6c2d39
BLAKE2b-256 d479eec0ac687b37b4aa46ed3db3651937060ce86fa7baa05416eef92d24eae5

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: blocksolver-0.9.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 11.2 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blocksolver-0.9.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9c926a61b44b4bb471a84d5d178cd136caa66fcdf620deb887d923b057b4d959
MD5 be56ca00ba804406353633b3248f5c33
BLAKE2b-256 74423b7d316cac4903a8199f991174d69171a8db6c67a36c3a839ee1b9666205

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 925b39b428bd24a6d6108af9c1e9c8cdc19131f792a3bfd482c002a0414477f1
MD5 863d5cbe5bef5cfec40e3406bea55ded
BLAKE2b-256 ef76346d5b568970cbc00f82e748d4474eca004ad328037f11c8b88b35cb6684

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp39-cp39-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp39-cp39-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 92461c3bd0ee28bc7a5b3fbf790492cc1ff26ec46078ccb5e8168f23ef654c1c
MD5 1fcd5f0fa6ea7e398a1629a285d74c05
BLAKE2b-256 7d7db0c82a78158574376eb6168de34e1d07efa33267c48fb107470dc94b686e

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp39-cp39-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7546c8c20bf4efb5e149931e695dd1a80c97f9f1a48de0afe99d26462e2207c0
MD5 52faacabff6857b0c14663db3763d60f
BLAKE2b-256 a8bfb6a14c29bd68c70a01c88c28036a282124dc6e12d1ade6a23ecd65cdc112

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: blocksolver-0.9.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 11.2 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blocksolver-0.9.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 1f8ae5a641630092be21c48d76c78d3d2371d70f59f40c40242478f2d451fd3c
MD5 c05efef542dc6ac77eb9a55038aa1770
BLAKE2b-256 2600c57d774f7141c39147645c7057e11f046b5fa6c20164850a0736b82224e9

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 36964b88f19a88717cd67c1059c77819158286ed90dc71e38d570712177eb4f3
MD5 0df62940aedea6633db000ca5d49e650
BLAKE2b-256 70275964186467dfa1eb917d559e484ff31d4f351d6d4c816991d4645dc476ff

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp38-cp38-macosx_15_0_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp38-cp38-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 2800c98b0901e3a4b37e510959329bf49b8d1372579fbcc27e815ae8e58c8a6b
MD5 755dfb39eb5f0317435dc4c936cbf4c7
BLAKE2b-256 03f1b8361a074cd843a919d3fc847b9020dba2800d472cec8bbe902e0956145b

See more details on using hashes here.

File details

Details for the file blocksolver-0.9.2-cp38-cp38-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.2-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 65d1f4080006a12209656bf26f0f2ba02a3571b908b307db90cd39bca688d0a6
MD5 eb93395675083fe3a41aaaa904a6bac0
BLAKE2b-256 ec2925aed1a7558fd0de842945054082c6b5228b13a01f90cd41924aa70be4d6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page