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.8.5-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

blocksolver-0.8.5-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.8.5-cp314-cp314-win_amd64.whl (11.3 MB view details)

Uploaded CPython 3.14Windows x86-64

blocksolver-0.8.5-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.8.5-cp314-cp314-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.14macOS 15.0+ x86-64

blocksolver-0.8.5-cp314-cp314-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

blocksolver-0.8.5-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.8.5-cp313-cp313-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.13Windows x86-64

blocksolver-0.8.5-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.8.5-cp313-cp313-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

blocksolver-0.8.5-cp313-cp313-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

blocksolver-0.8.5-cp312-cp312-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.12Windows x86-64

blocksolver-0.8.5-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.8.5-cp312-cp312-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

blocksolver-0.8.5-cp312-cp312-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

blocksolver-0.8.5-cp311-cp311-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.11Windows x86-64

blocksolver-0.8.5-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.8.5-cp311-cp311-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.11macOS 15.0+ x86-64

blocksolver-0.8.5-cp311-cp311-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

blocksolver-0.8.5-cp311-cp311-macosx_10_9_universal2.whl (168.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

blocksolver-0.8.5-cp310-cp310-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.10Windows x86-64

blocksolver-0.8.5-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.8.5-cp310-cp310-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.10macOS 15.0+ x86-64

blocksolver-0.8.5-cp310-cp310-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

blocksolver-0.8.5-cp310-cp310-macosx_10_9_universal2.whl (162.0 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

blocksolver-0.8.5-cp39-cp39-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.9Windows x86-64

blocksolver-0.8.5-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.8.5-cp39-cp39-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.9macOS 15.0+ x86-64

blocksolver-0.8.5-cp39-cp39-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.9macOS 14.0+ ARM64

blocksolver-0.8.5-cp38-cp38-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.8Windows x86-64

blocksolver-0.8.5-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.8.5-cp38-cp38-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.8macOS 15.0+ x86-64

blocksolver-0.8.5-cp38-cp38-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.8macOS 14.0+ ARM64

File details

Details for the file blocksolver-0.8.5-py3-none-any.whl.

File metadata

  • Download URL: blocksolver-0.8.5-py3-none-any.whl
  • Upload date:
  • Size: 17.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blocksolver-0.8.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6423529a37e9c28238994dfe402df7744f54d87453b9af08a9e47f99f538cd95
MD5 e4145e5921402808238d875dfb6f91e1
BLAKE2b-256 872ffbf01b5aae4b0b66fe291dcbefdfe67300ad5c2435e863fa2e37f37303b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a8b5bf4b4fce2ba80e34e4980c436c009e063ac4f9c5def451bc73d8881108ff
MD5 7f766948b4fc5332d77bae531b0f5a89
BLAKE2b-256 171148728d10dcf638e33bb59581dd74488db7dd3f0b15bf7bac47b101f486ca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 2ceae83ddb944facbed7ac05df332ac99c459d68812cb358fb8773c4c100326b
MD5 1fc20424a17f22132c3494fe5447f6cf
BLAKE2b-256 4c9366f7ae2d1538129403f434c37f1c51d2cbc81d954de438a8ce292df64d26

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 95ace1b1999f01f88a1e2787f2722ead8bd7e296fcd668dc0d6588b9f7a3c7a1
MD5 384078158582a5ce3c177f2809cbb39f
BLAKE2b-256 83b4752c8c381f2756508445116d70ba1f47d55dbbee245ad6dc88faeef5f9a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 9a4dbe126a77819c7c334bddfbd839a8c504b3537e3fe1e9f6d5518b277c3961
MD5 7326378444930e2d88cab757f91df992
BLAKE2b-256 dc73eb1db9fc80dbe726b71fb21e0dbea6e118bd9ed9a7b05d52a023e6b4348c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9c3245615d4e954fabcba81b60e5dbcbcdcf3a9956c0b8a35d23d1912f5a1486
MD5 3ff2d0e9e40cc998c0a869785bbf9cd5
BLAKE2b-256 685470b71f234e0268cf7e8885bdbad55a12bdd43d6953367cceb91e7843e40e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 8e695352a3a1ee5d3e02300f49deed9e4f9ea52feeacb24e0e2712b87a337dd2
MD5 da0bae13423430bb5e115ec29ed00a4a
BLAKE2b-256 87d1b36f0ed1a8463451ddd5df7e79f332ab2e936b7db80444e898bf0edb48a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cc4566be2410c0c3b64062fe79f0cd510cd24c8758ec8e3824014c5af0984a17
MD5 ddf45ac9c022ea3031f6182f3fcb0b36
BLAKE2b-256 165888ae893011583c87aefb483bc84299a34aeb01e0758f2313c8c872dac1d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a07489d99ed54bf1155afbed1c76b45ebe9584578f8116391a23f1dabc8ef3a7
MD5 5984c636f986fd0527a27ee9dfe3b4a1
BLAKE2b-256 4de35843648fbe00f5e8bcd7315944f2e0f85b73ce1c6ba6a5e8ee1dd508dc3c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 309f92b91d1a544b58356e54e19ab29bdb47e0a333c7f553964f5fb4650b256a
MD5 1524f83b70eb68171c91ef4964912030
BLAKE2b-256 e0bafba1ee96dea1c4adb551f1549983229fd8b975931e9f0bba96e6cbc15032

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 43201ef1364f9231b81a2a6ba235dfa838f881a46e104e7d0041860eb5c50dc9
MD5 a470443c1d89799302abe6c8064c16b0
BLAKE2b-256 1a42fe2ea8d902fd3c66f9e439eb1c6f9c6128b34fb283d46eed738cc725fdff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1359c9200b7c8790696c2627655f89da8d389ae82f89e4196b1fced383d5979d
MD5 3f36818bb8b5ca8d7a0ea865d6a38b33
BLAKE2b-256 9a789dcdb29018bbeead9f8a23f35f5582c9a013960d7a6501894701d371e7e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 afda1658266bc6ed91faabc6edd54c9855c075415017adeb3609c961144e2756
MD5 fb44141b5558e34e869380f71d1dd76b
BLAKE2b-256 162cfafef0999cab1a2e17bf79173932d4b0f2a2f733b9fece69127fcd5d6dcf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 dd543d3473c08af949963f78d54691d081571d730589ab1bf5a738d5310cd55f
MD5 ce06a4eca3004e9b04ab77eb00f08228
BLAKE2b-256 7f614e227c50e380233f17f4d4c538533ba25857fb89b1a19140f655d81e38a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f0d11ba46d6ea05fac1e57c9d1b043fd4b070a083d03c1aa6c7cfb0cac0736c9
MD5 f69c4c2c275320fa1a031ab8cc64a41a
BLAKE2b-256 d2d13d494cdd33566580d25438e946664a81ea3dfd86e977b597b0443e41205a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d2133fe6195ba6cf3216b9fcaaba65a8ca82588e758408f65320acce999e6d9d
MD5 6f7a6298011678f079603c779fae29ed
BLAKE2b-256 eb934425509e7ce02ff581e19a721fe3ead86475f0f376817eaee37545fb5a8c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 7566ad503b9fc80f98627639a03717484584836b08b9a4464f1f7bbb70cbda51
MD5 8b9355c051e4412fd17a528c97ccaf9e
BLAKE2b-256 abe31992d960be18f425ad3f19f6bd347512d7e1d17dd65baf00bb9c08e298f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 044fada16b539f7ef2adad8fb4817c43c9e0599214471b78a129324e27d8f79e
MD5 bbbbd03c33fed8567c6e780bc015b707
BLAKE2b-256 1e359cb152ec21ba93db3f6b0e496ada8e1d8746731127e007224283a9c3612e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 05db8ee052c67b61038caf50b097182eac6565fa352c197d6e3ca0eee615f0bc
MD5 ca9718f05b03a69d117204f440301ec4
BLAKE2b-256 780eff3876de20e759b1778fbc0bfc6e4998a2ca6fb0a2dfd22ffa01ff5619d0

See more details on using hashes here.

File details

Details for the file blocksolver-0.8.5-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d8458b840e68e9f01972a5ecc92d0c28cea175fbb2656e79001897e2afb4623c
MD5 9158521d2067516cd07092ae04ceec02
BLAKE2b-256 32fe4eebea65c57c996ea4cf981e9efea9cdd44919546037f02da10c497cd6f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f2ca99df471e3a497b2d0d8900609a93adb3d7e4cca3d8beb5457a4be95e396d
MD5 2dff0c10de1ff489fc6e1e34e7de95f4
BLAKE2b-256 fda414012b85a7eba5d059a4d0160e42fb0ad5dd6bbceb759c5996a679b86454

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e47787db58899e04f938a05fa4d2fbe300c1eea5f908ca772c2e1516ba77913c
MD5 cc2763b8b63a8a5455522bab59abb508
BLAKE2b-256 120a2b35b78fbeda5c9b4dca1d1653cd05c87443b5e13835a01d45614f5694e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 0351e936b39b9f13c93499b3e643d79b014f970847dfb46c9983ff5b47153a07
MD5 4416b895744cbb642e000064913c0ddd
BLAKE2b-256 cd8584306d11b1c51a7d1fc6fd8ffacdc22e54d19a77017bfa2a0e9e434fce4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 fc678177b4283d0020b681bc6ed50e9f76f4a900b7f38fd7b7d899326d5d2a34
MD5 adca6750d845a29c6f57be2f5bf87b83
BLAKE2b-256 05e06949921b0ca278f8e89b641dd4510b8cd83939e9c920415553ecdd895a0b

See more details on using hashes here.

File details

Details for the file blocksolver-0.8.5-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 23e34e041fb1bb930af2e6acbeab83d76fc7497fd32ce8adacfc54629b1ce367
MD5 a50aa43a99b1f93c82f5bdbc7d91e1ee
BLAKE2b-256 6d7217a381a2fb38c1fb6c3c96fbda0443824313987b356c32b2cdfae62446ce

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 11.0 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.8.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8beae9ee6edbf3b68d470af787a471841e6e9d52252103e7929e4eea6de235f1
MD5 8dbb2a33cb657070a5dc2352027a4002
BLAKE2b-256 93cba22afd8c17ba7124cb7fce7fa2852658fe30d358f82b3a07000e4b846b83

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 cb28d825cccc286f508cfe04e24c0d4233683e56aa1d7e2eab288743ffd47706
MD5 7e2ccca2291fe60d6309c1a4505fd38a
BLAKE2b-256 8bd59ca84df8053ec972863436a903cce28ce463203cb840f707902dd0465aa7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp39-cp39-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 92b4fb63daf1f763e9b3bdd54f61fc2762a77336c6c1111ac2b3ea53863fb110
MD5 935dfd0e3524e6f1e77b1c8b04840513
BLAKE2b-256 fb777b41545ae06a1674a48bc13dbb73100e59e0f1f42fb5f0527be7a2b5c917

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b5498977dc8457adeefa54aa11c1dbc01544390bbc1d2e7fecf51ec3e1c33aa7
MD5 113b0fd4369abaef50e2d4eaae40be79
BLAKE2b-256 d9dd755b704a939113c62cddb02012b01abc789cff401d516adbd152f923153a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 11.0 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.8.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 80f10fe4ae0e77b3ab3ba116316240d3254d99db8413ac09806d0b56e6910c4d
MD5 5f7d613d35d0abbc2347a9426a97327b
BLAKE2b-256 f7341c4f634152f296d33c560c54b3333bd51dc075307cb54bf3664ced8a0316

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f9c06f3fe22639928718f8b2d6a151dacf268cd77c47858b69dfd9ec0657b930
MD5 84bcf67934ae6a0736514d6297f4887f
BLAKE2b-256 3a4cfdbb3d0bee11080630e9626aa47445f7db4e0da526f4e86cbf4634f4ff1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp38-cp38-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 fa7c921ffe640d7146c0d45cad7b7b027944c0b04a2d2cb6af7cdfc6cf89f4bd
MD5 94e26b489c46ea300521272f70f036e6
BLAKE2b-256 20fccae56b3ec149401c1a371447434f45d1552507945de089b72a6d8babc6c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.5-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 417e69e19d9e1dc1fd0d106ae1de565708cb4e5561765be59fb5dc4e7a06c1fe
MD5 5f2beca67e5762b2af58ebaea215761f
BLAKE2b-256 1ff13808640ee42ce7119e3a072ffc2d60cbe04405c463e59cf7b14beb2fdffb

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