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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 15.0+ x86-64

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

Uploaded CPython 3.14macOS 14.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 15.0+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 15.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 15.0+ x86-64

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

Uploaded CPython 3.11macOS 14.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 15.0+ x86-64

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

Uploaded CPython 3.10macOS 14.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 15.0+ x86-64

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

Uploaded CPython 3.9macOS 14.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8macOS 15.0+ x86-64

blocksolver-0.9.3-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.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a63ce17cf66d58ece468f9f32bf17e4367fd10a30a6d284ba375359c6a23c161
MD5 2df4c505e8bba647e5b1f3e8ed0f1499
BLAKE2b-256 18addce1b2cfe65d7b22f8a6e98a7d6dd1fb93479313e515bd7a59f3c8299ce2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 ee44e58177862e70d4952a46b5a049df2ee64cf14e7e3f7eb0a4ee704a4d7e9d
MD5 5edd001db125d8fa2bf8a429db483847
BLAKE2b-256 0bba4d1693cb1853e2b4e3dab42a6a7da4dacb1966e43e864409735aeded8bfc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e9b2e055f87e4a17076baef1b02794c95f32d5564e1d985f9811120e3b28008e
MD5 be659494d892100d037443adc7b77b3c
BLAKE2b-256 08b55502fe65a83e769c4efd7745fbe6c54e0d3febbc803aafeb3aab5ca5ce22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 1ccedf43e27767af8f840a85e2e8f893ed994b94722f9838b6cdac7431b9aa34
MD5 c3c768ac675ca832fd45b18a2d2cac0a
BLAKE2b-256 8cc21753fdaed17e6720cd177c1b4ead980a430758be00767d241441a02cf6b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 042f370da9378e6f8abce14c08ee457e2f8640dff1cdd577ca8715103ea5754a
MD5 b109a37bdc6e4b8e7fac878e83bd053a
BLAKE2b-256 aac336be4ca407220f8a6cbe686d9b533cdf53bb1233de0688c5b663b068adb0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 21744f95ce1edf96d9628faef037db1af56adcf70473b1ee4b24a022b02c1ad4
MD5 36c93940e0f60f40becd09843f99749b
BLAKE2b-256 bdda5f99384707dcde526cb763dc4a48afce19910d47b6e8dc308bffee49eaa7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 289e11bf3d78234a8e2c7f6a227efd92d7142c71599a8e7642de9af577562409
MD5 7a69122ff7f7b1f53c23d9ad5c1daa02
BLAKE2b-256 513194c5a4b8f5c55c9094f8f8aa5db49f26a076edcdc71421ee5cdca52f2304

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 3df7e1722faba6c8b2ad3b12aef0194dc042f116db341ad86c69bb208c6fdebb
MD5 eb63b88e954eb68f92fd89da1ca36456
BLAKE2b-256 cea58014f95927e44b20d1f52a9facec34600ff4b05761e4a1c539cb6d155d26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 1b0b82c23909ec4e631cc15d9e754d557f1757565bc568e971d4bc53f1e122b1
MD5 4e5cd17f985c902858ce71fbb398f86c
BLAKE2b-256 b9529f0d0216be1b33cd7b4a16b2b0c1b8455b686202f4ecfe9823b32937ee2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a5d6a709e2cb14ae810c52b1a317c339883be3aa971442695564edfaaff0e23c
MD5 a98eec918d7e420976271d904513677f
BLAKE2b-256 cf496e452c3ad2cfe359c13e927bc8a709274c203dd8a52e9a4299168a650e64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1e12b29620203ef8494a5cb9df361235e32a2316b201f0ba342263020f1cb6a9
MD5 0750f6a1c3c3f943a76e73c907606ec5
BLAKE2b-256 733dde607de4c4b0116d11925fb433fb8fbc29478d66490f827b0bdecc2c8cec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c34d11e29bfbc2d8758dd2a91a2b37c04b70189fd6df41cd8cc5916b3f723fd0
MD5 9a901eaa0c761c04d8d8a636476e8c58
BLAKE2b-256 d59c2a725e12ab5b10a3b82eadf268014175a77c33bed5e2c4e96913d6bef187

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 31c48a6f639b05e566d116e41ad080bef1600fa1ba10031fc965668f31d32b7f
MD5 ecfc22158cad6de3403f2eb755b744da
BLAKE2b-256 4253640e8bbfa72d7514b4792fb65931517d1cf72b40e8ab85903eb734f6e287

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 27410c294296599f6a059252fe0cea8e628136a1e7e648a4db0378daccae7025
MD5 a76ed15c59263093bf6f4e410d5d6dcc
BLAKE2b-256 6f2f70cb9e0bd3bb00dcf54d082350779c23218397db29740ddc48a594e46eac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f962ba0a3433cbc1ad3f4761219f572af1aeb3115659b8b60fef39b121f92cf0
MD5 c4c47cfb1e7dd510c000a42dc4378ae0
BLAKE2b-256 4750767daa01faadd3d7bd5241ffa91598185c9b5ac6dd894c7de0358be2c40b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 6c140a80ce6321aa4948b0c680c21aa48553ba04a8d6124dd4b3029cab53c8ce
MD5 ab055870dd614f7680edb2c165d9316d
BLAKE2b-256 f8cce08abd48c273ae07c91a4e4f2c63901013608a0d48bf50c28bfc95878e87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 093f79f44c7be3e96b3e36c4e69292215575ba96680360a92f11446d54cb98e1
MD5 f7fb02d35adeb6450172de4ec9c7cea9
BLAKE2b-256 67bdba481af754e8f8d3756c91f5a852b55d13f3ca131258ffdc166ceb244d9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 426e336953098e0913fa17316a4e4842701dbf9af007efda4787f0dc5c0bc375
MD5 30e498719b4fb78abd951a9ad6372fe2
BLAKE2b-256 5928c2a9157b9a147c2e66ef6af72dc3650ceacb610b17a6b99a5c1d39e20322

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 27bcad29b005066d6e5dd78821ade54cc4d56261ef8eb1944485c28f82b51dce
MD5 412dc8ace1195170edec6e25c6ed99df
BLAKE2b-256 837616a881b4c531d9b9ca894d2bc4cbf8ed2923fbd01a37b2d219294b1d9d0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d05a7c24d3d4a96b8ad5f35927afee10a66a611497fa73170be96cc38006d9d7
MD5 1af4598fec46f0b1181dff1b305fe232
BLAKE2b-256 134cc2f257bab5c5729fc559796068009be1304424a3f58a5c7e84304994c999

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 8d1282ebdc3e237340e26b7a79cdc3af6eb041908ac59d25ea702586eaac8c44
MD5 70973a8ee27c67326c243d31cdea1bff
BLAKE2b-256 a2361b45ef90bd30fe3e8e7ddff7a67f0a7b988e0d8a9099b26790e0b4b4ead4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e7d4ea56b5a43d2d008c24a9be006d1b43253848d4da493124b331a6ef5d2e83
MD5 ef85929ee385b19f0a31f011148b32b6
BLAKE2b-256 14fc7c961258f1af2ab04381a7bce3cd7e60001f06791259e803c04e8d95ccbe

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.3-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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 40534a17fc79c817b27e505b4694acb990290f32cb5c9902c6defdd3a538132a
MD5 045cd26c0773250bd549cd14e30575e5
BLAKE2b-256 3f49f993d6116cd5267498835c7b3be833eb6ee1edc47a60950abe4124ca240c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 dc0d278d080d5aa610153fe896a932e44b7d402d072ed3cf6f2770f7b62886c4
MD5 7423b74457fbcc950d6d276fe9210885
BLAKE2b-256 68eabc1e979c63160e852a77a8ba0d5855591e5ea66499e08e3dee7edc342765

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp39-cp39-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 cd29f7349cb9bba64bb5a5b98a456c04376ba65a5379de549b57a414aa0bb6ca
MD5 2d135a44f50f6697e5da5d50b23c0b80
BLAKE2b-256 509adddda693128d51d7ee398c7d1a78d524b0fe04e0102fca22e38704deb7e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 ac7c99c02750c3b86b63d4ad57f4bee71e6f0f85d5b1ad53cf20aa34954e2d04
MD5 6b5ab16f58d73c1c627b3179e59044c5
BLAKE2b-256 c9746e454e53f2ddb6c197415f0cbcba47ed5cf346df8f21da2a691c30c5a630

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.3-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.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 76e240b8818ab54c6a9e1a87c16b9ebadb151d9a69c0b4a8574b0650dfc27f9e
MD5 9db3954f3ac2ebeccd06d42ed9791fe4
BLAKE2b-256 53b5b4fd0dded24d2171d945155fc6b59c8c7366c9708f31a5b587d7d92f7588

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 992968440bd7edeae7fe57e3bde24f7ff1e4368796a8aceee7b4a0f33581c3fc
MD5 3c7f6d316b636a698271b921d7d7a52c
BLAKE2b-256 e529ca61de75e24ed1a4ff796ea9b3e1719f631c9416ca58694a577e49a3ab3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp38-cp38-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 0dd5650dbaaaa1679fb136d18984a0fb66b70c1f73526e811ed0b7ff440ada20
MD5 5f2c10da73707feb8151720f7f49d10d
BLAKE2b-256 2ce888495acc54d822eeb1f820186aebd6720f21141fdc766cf5157a09472d16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.3-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 48bb165d87faa3872f2bf423700c729c2d192bfcc3ff83dca43dd8910a99b034
MD5 f9e6aef49eb0b65ae641e93cb41e706e
BLAKE2b-256 769251f4e8274a45fd9b75451d8918accc03626d21e4f49844be5607596cc764

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