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.4-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.4-cp314-cp314-win_amd64.whl (11.6 MB view details)

Uploaded CPython 3.14Windows x86-64

blocksolver-0.9.4-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.4-cp314-cp314-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

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

Uploaded CPython 3.14macOS 14.0+ ARM64

blocksolver-0.9.4-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.4-cp313-cp313-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.13Windows x86-64

blocksolver-0.9.4-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.4-cp313-cp313-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

blocksolver-0.9.4-cp312-cp312-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.12Windows x86-64

blocksolver-0.9.4-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.4-cp312-cp312-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

blocksolver-0.9.4-cp311-cp311-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.11Windows x86-64

blocksolver-0.9.4-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.4-cp311-cp311-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

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

Uploaded CPython 3.11macOS 14.0+ ARM64

blocksolver-0.9.4-cp310-cp310-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.10Windows x86-64

blocksolver-0.9.4-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.4-cp310-cp310-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

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

Uploaded CPython 3.10macOS 14.0+ ARM64

blocksolver-0.9.4-cp39-cp39-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.9Windows x86-64

blocksolver-0.9.4-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.4-cp39-cp39-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.9macOS 15.0+ x86-64

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

Uploaded CPython 3.9macOS 14.0+ ARM64

blocksolver-0.9.4-cp38-cp38-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.8Windows x86-64

blocksolver-0.9.4-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.4-cp38-cp38-macosx_15_0_x86_64.whl (5.6 MB view details)

Uploaded CPython 3.8macOS 15.0+ x86-64

blocksolver-0.9.4-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.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 7ac9a25a43ecbb77b6a85629db7d6eddcc5b19ed232d9c7001ddfbb21cdd4cda
MD5 9bbd50ed13b045adbf5a44424362acc1
BLAKE2b-256 ad0aee6de2e58f2914702a073e2186597ab9e23167928e195a71f06752df8e5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 c05c87d46172f3c6a2b248d49e7aa477aba14ddd9774be104d8dceb7c39f4ee2
MD5 c0406bee6882cfd0d2fbd309705321e6
BLAKE2b-256 d45b11008a0a5c311e2af40328fa2c16414c011c0d48a586b9c72e1f7706180d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e7393a80a304bf5f548c938c8e72855a5230214c8062cd0ed36731de88ecac9e
MD5 3a8c5676146b8e1c22cdd90697b56fef
BLAKE2b-256 fefe5db7140b8f342bff378cd1bfd0c4602716493eeefd8e55de9817e72b6e49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 6833b3b5e864c326fa8d7019bb6cc5a4290fd65410c9e7b9d29f71662e9c52a0
MD5 d91aa742e33ade08c75140e411905e41
BLAKE2b-256 b001112886b7df473043420640fbfa09c6650dc15749b9062cbd8480bba97be9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a201d78780c617fcf3a5b6ec13331c7f5717d64c601ca7ea8387edbab9b38198
MD5 27b33a67e013b4e34e1a39b2f250cc98
BLAKE2b-256 81a0505d7447d9e8cee9d895de3bfeffc7abd6ec9e015d93c13f91a5dcb3c1e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 8a23659b87da43ef948d2e84f25b523125297baf6ed33fab5f4cfd5fc40304ca
MD5 015ab409192e14e62307748cd9f1e2d7
BLAKE2b-256 9eac3b2c0e40df9469236499f09fcf3057b1a9125eb32513523baf9f109b2df6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d4b4578a60067b47f72e7eec954a16bb3364d0430cb10b42aa2460ef59592e1d
MD5 3cfde1204d934b2b5fb5854937667bd2
BLAKE2b-256 d7c0ac732a6bac549ccba37edfc7da4dfe883a488d7670f660b6f0905a1926aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 567e98ed4fb319935eb97125d8d50decac1cfe7bb29db20e0fd0c10fe79dc76d
MD5 268f51dab419b87f424519b25847f1df
BLAKE2b-256 7375b8a297b93a08475d0571796e714441fe05349de1cfc367f0e8670d1bcb0a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 65b98144026ce7530325e3ee9cb473c2f24675a00371f8e4d4392d959a2d3cd9
MD5 fb8acd250023b7436ecfc08056fbe083
BLAKE2b-256 3c725ce144aae299634ed3ff4e382373c2abd6539180577e3adcc4e2b1a52c9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1447eaab33e5bf683c30f7e0fcaceb37fd7a546fea5436e64b5e3ba7e43a41b9
MD5 d5697a02812e55f3e22bc29eb0189044
BLAKE2b-256 da47b8a3f018897a2a7c1e52084c4ef83471d3f74a2a2b892ccc4e55b51e091e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 5a2a2d8820df9c2e0fcf2f9734b4fcc33fcb664da01b65beb3173e39edaffac9
MD5 a213c694d12fcec57a36d565adf683fc
BLAKE2b-256 da580d736a426fef16deb614bc7be064651ff5550fe4167ce415aaae305b8697

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 66d26ad60584ae841595491190a953336d33bebc3d4f8850b3acf7224540a1f9
MD5 3e8bed714b009fdee3c398faa6cdfb60
BLAKE2b-256 e6d86dccf85f24b80bc1ae4e605b0a52b9d85b7023a80246441d9a8945bfa151

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 11d1eddb25d2178319274b5abc337e91b2712a2381302cc8d9a9d7bf6a89d8a9
MD5 edd863655561f68dbffa67f2edde5c82
BLAKE2b-256 f28323290fc95bf9c3c67327879028037258c1c4bb1118d0152d676cb1bb69ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 48e37b5620048722804c77f8957f74691682fe72d9800e79d8a14a376099b3c8
MD5 a4e4ff5e0435b44becbe1adca08691e3
BLAKE2b-256 d4f36830f8bff65e6f812ed80bce98f6d747ca00ebcb0bf1eec8194349972707

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d219954731c7a3d86098abbfa6119bae51e7c3d3da3ed4da8f5557ec34555128
MD5 416081bc0929b13b7bda229137cf88c1
BLAKE2b-256 22dd288aa39be7ddd3c535bf2d6b8c5ff69ef54d146391c46404aecf0324f898

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f3437faf98a95db42dbb35a374dd4a0bf7f7fba9032439a1e49a5f742c8d5baa
MD5 4fd3d580d0d829d35426b52f9f5f3968
BLAKE2b-256 3b645054b0022f3b2e9ace1822b3bead1dc5e06a1c2005fb8515f3732ef167f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 4b6d13e27486c42234d5749fdf4852500b91ed271508adf46f837475f55429e7
MD5 36354792800db141107b3cb2aac73e8b
BLAKE2b-256 55792727a2bf1e57f5015028f7805c7f3d0866f2b148869801687e065285302e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a684eb249e3d0c03e5ea65cf292cfcf467fd2d7cc5b53739a3c5a2bef38aa81f
MD5 daf26ef226d58bb38ae26feda77f0fb4
BLAKE2b-256 89fe73fe3d9f892cd3234776730ec37a02e1597c10b2fb7d5b2947faa7a77557

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 700c8dd9d703a5ed3f6d4658be7d93fefdae835b37ff34795b06bbb060db9208
MD5 053e6a03c17ee9ca19165b3bdda5e1b5
BLAKE2b-256 95ecd4acb98f2db59bcd24d6fe5a1fea687522dd8aaef9fec8bcff2c5ac25279

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e28402bf1d02b0c6ad7679ade666c26e9a4e053023bbc94441bc51e08fac595c
MD5 28da63c9135548b2e9d0e3bfbb9e4122
BLAKE2b-256 76f0fbcf1191670c087ad37e6cf9bfcdbedb344f5195624952bb6108ebc65be0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 fbb95c00ce161cc3c36517cdc4e0f52a67cf93bdd06125e533552cf603ea06ea
MD5 c4b3b27e04b72730f13bebfc636ab8dd
BLAKE2b-256 5d050dee934b92bc4f0a83d8e093c2d3a04ffe9a298d1611379f428402180c0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a5ec5cdd63dfb1265a5446aa58ca81555cf29a24082499fc3abc2ce27fffd792
MD5 caa382590c73aa593f8b01e52a31a883
BLAKE2b-256 90ceb450c254d3a85bc160fc4689c4aa598850a37b2a54bbabadbded19084090

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 11.3 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.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6794164b55e898774f385ed16d2adc9670f23b0b918fad44abfff99e2d4a3261
MD5 eaef1b423600ff9068ac71e6292e44b4
BLAKE2b-256 383e0594e262746d667a4e2b44c07251c0ecba0d92263d2ab13bc213241c96ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 9a898b36e51d028f6a9774575033429d0b28f558311abc6c8d97b57ffe4f8407
MD5 a48a4c468067465e78457d9a1e46a1c7
BLAKE2b-256 4318667bec063efdde982718d5000126c45c7849e4059d019b8474d48be3ffd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 2d3548c6151ce52d696e656c02e39e145ee0a6993941971f95f1bc0047e813a7
MD5 c76e98884dd38f1dc1375d5759c08c03
BLAKE2b-256 ac6be88bd25d5a8d61200621ccc7b1858e1d38ea5cede780ff92e613fe02fc39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6d61926f8bb96d29e66442438db9896c4468224c43c5fe101902716297654437
MD5 b1cb2ff4e80b9269dd22499b6698b313
BLAKE2b-256 45ebb4e05a84525af3f519396a84ca119d34aa23cf2a0ddd12dec46d6f086fa2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 11.3 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.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 4d6b5d0bd4711b672ffad1175293e2a61c2dce93394f958076b40b482ba51256
MD5 d4c39b7817598a2770ba7bd6876d0772
BLAKE2b-256 32c6f9f1fe5e44a6c776c8fdea8a795581d03423256004e38b10d1986f1e7413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 72b7c08ce26dd85932721e1afb2d1e4f513ca532ac1c1b79145bec31c53075cf
MD5 867ea610eec74fa48cfb08d81d9d1808
BLAKE2b-256 3f0421b59adf60eb68afa225c72064dbdb4d70e6e2d4f4001a59e4ebfb7cec61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 91778f72de60c40fd6ac9bac634443dbeaec2bc91b6b5547f1df880a98e9a435
MD5 50a56f573710994a8bf4294b71ae140a
BLAKE2b-256 7c155fa2b19b071365cb401f6b810539ec944b33d9d6c6114fd60ddb9d08fa11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 169a0d29a450e54f99828fbb65a69348c6e9e119723a637e7fa9de394c714014
MD5 22fb9d24b7f987e68350f5dfba960887
BLAKE2b-256 6617400ba51b88b8175899dba1177ef2f1f75948fef044c2fea4345d2ca56a3b

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