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

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 15.0+ x86-64

blocksolver-0.9.0-cp314-cp314-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.14macOS 14.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 15.0+ x86-64

blocksolver-0.9.0-cp313-cp313-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 15.0+ x86-64

blocksolver-0.9.0-cp312-cp312-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11macOS 15.0+ x86-64

blocksolver-0.9.0-cp311-cp311-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10macOS 15.0+ x86-64

blocksolver-0.9.0-cp310-cp310-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

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

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9macOS 15.0+ x86-64

blocksolver-0.9.0-cp39-cp39-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.9macOS 14.0+ ARM64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8macOS 15.0+ x86-64

blocksolver-0.9.0-cp38-cp38-macosx_14_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.8macOS 14.0+ ARM64

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 37d6395494174ce6a6136276929938958530933b6991872980e506ef3baa11c0
MD5 9e46579ef462ebd057e52af05814d8d5
BLAKE2b-256 5cb487587647b998dd95f43e4c055d26c62f8a4eb3806c2ec972310f1aa4fbee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f2b6e08a457119937202d9bf493bb643fa90e59792c8e846342cb42b5a935d70
MD5 4157f4484d502d09f38eac8f3ca5f8df
BLAKE2b-256 d55c5fadd613cbf10b5e708e8da19a73887c7f4d61e8475ffb37efaf0b3ecc81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 5ec7dc4b63eb883a051e5d5a8862278c0baee886cdfa370b9fb67dbc5d6da97b
MD5 2abecf078e37f9433304ac3fe47f1fbb
BLAKE2b-256 316fc5b5bb838e8997ced5547a01ddb5876e20ec42db09c17d0d5844c17f21b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp314-cp314-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 790fb5fb2f88f7d3365ad79f500249b1585f5a9edf2cb75ceee7c75c34c1d4d8
MD5 042a4947a098327fd7a276d0ff108447
BLAKE2b-256 a95c6330f7540575ea78e4db4e5624227d4686e29e07ab755a9dbdeb1a02a34e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp314-cp314-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 01373bfbe2bdc66959891741de6e5cc0cd3a7fe9094289c0ceb2b9aae5099546
MD5 9810f81c5d7af8604108c28b11320402
BLAKE2b-256 5cda0b89888c1df8d57e1eea457eb46bbf9f75a97ca2b1db40862a009e6666b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d7581c58bde88d9df0a11b432799b9477405a452c6431bb9d52aabbec645d30d
MD5 e545236e7c30d5448f423d4d2e9607ba
BLAKE2b-256 111dd12a6c49dea9e5fc3c2d4e4a5b881164e2b59ae9ece8376ef75099b3ccad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bd63bb1bcf039738d307a431a1b2e051182099c2fda3d46621166723d84bdca6
MD5 43a2e835005ffc99f07613522def539a
BLAKE2b-256 bc426235f1b781fa23482ef1aee86f733ef6c57b69c84383353a40f3907ba4ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b9c525e35614ef7be1d40dfa546152008f1f7bcace362eb183f7932d14be4f4e
MD5 064fc07a529c9ecbe07f55cf37cf365e
BLAKE2b-256 500ddb8f348b6a006e163f1a2d4d702c46068af8c866d83798057a112f6cf53b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 5d77c40dbc183f9914996cecba522fd238cc6666a3a6dfc999b8b43e2f814e66
MD5 517e09fd2000a6c2b3531e95b7110eeb
BLAKE2b-256 b7567df294f5e78bef87d147a29b676a46ea2c964f7777c36847e27a463f1459

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 0f1d1c4030027c12dd5db74ee62681b71546c285cda07354b03ab5d6ad4a2fde
MD5 86136b39e95635905357edaf88ebf9eb
BLAKE2b-256 f4e4f9b848e3e0fe091f29b63a5e094c6f9b73cae1daec29e34db00c30242386

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a9f29a091a66dcddfef1f2e2a9b5fdadc455b3023123a270ad8403a02344e215
MD5 e02888ddb8aa7e305e38c9f1df446da6
BLAKE2b-256 87fa3acbadd6a11f25b1a881dad7cba77b4c8d104b65113534fc75abe7b9cd31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 3b19df425e610af4c5ddcbb066932956f551dde1abec2a9a86ba0d85e28ef0b5
MD5 21227e365e329279bead639a637f6088
BLAKE2b-256 7063de1d596eb42aa922732ba459bf7c539d4bc3b4372400c53b73c1f0e404c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 cf474af1162e7bb3339da2e4282e83bee2527702af19c6f08d7fd6267020f469
MD5 30c7574f1e440327502f420f40bd19a6
BLAKE2b-256 48356eb29a5c5224320dac88a6d88f21816b4f91305251945c090b49e9179c07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 be3e78a757c946f5ef1d466f526d4ffff00a15e988f69558f3163c2da096c281
MD5 dc6bd3e6aa1e80106d611ce39f59797d
BLAKE2b-256 0caafc76c339323b46e425cf8fc54df6b124ee8628856deaba5df6c63b0f8443

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7c24c888f5edcd88146bf56b3ae9d8ced63cbcd53729ca78d8bbaec7c35b5b91
MD5 fa4e669d424341433f1f5b5016ce4124
BLAKE2b-256 c633b4242cd260b982993870c76ab80c80dafa08ec40b287079b7a378689d462

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 196e1cbe8c44f4a7592447836bd712a70c9a3eb71ee780466e3b6845a8c6db19
MD5 b520dfeaaef15b53e997a8c89b634951
BLAKE2b-256 12c71e95c655ed92681aa62e5e4aa3f1b9bcb4a470c1a879afb10c015f678b11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp311-cp311-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 1468adb624fe2efa0464e8e43b4d6a39396fd7217b4100bff08bff88d5ee782c
MD5 bb434ff0e0217042d2f14223b2b4595e
BLAKE2b-256 cdabc28693173ff9e7cb519409cc7a05c018d919f7f474b827065dd863160050

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 310ceecbaed61768958335102a264065c2abbac8fcc9e2b96c19841adc51eab9
MD5 86c531bc6a0710035b60576a9355d102
BLAKE2b-256 bf9e2feb4ac1d4e9f581d5e74d4405d8905aa154099c6a77daf5db4b75a41b6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 af6e246067482ad30e822aef4d7cd503c826492ae497dca1270c3160cf7c5a13
MD5 7732f3ce0d9505fc94f033fcabd184ee
BLAKE2b-256 da5e5528717dae6d64175df91b8aec45c73a11be6273c41e4c93c5361a3f57a8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 52529b7165d8b0dd791157c437c8b518b0b1328bfbb5cccf2f481f0194f729a3
MD5 8927318ec32e599ba066ae58b8047f77
BLAKE2b-256 cd86ee05c58661f136a75248cb03f38d741c4c6a5cb488e40e2cdce4d9b73064

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp310-cp310-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 d20216c5dd709de104c04ca628dcc2d69d8f73e7e09286617e02a64cd6e87d8c
MD5 ed4ff55d27a785427edc25b8193fb245
BLAKE2b-256 bf00453aabde2310c0def59bdae3e04b3d61076105e81f272675606bebd178d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8892d405ff8b7fd9a7861c1fbf135e50531f1bd7624e781e38f875a0df55948e
MD5 c758ad4bfca81605672f755501a0a49d
BLAKE2b-256 6be4c1dd76ac22fb7dd4371eb0bb654507b9326eddcac4231e3d78b32f0de834

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.0-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.9.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 af387ffc77e045be1c52cfed06683bd40cd2cc46500c9e0b1801e3c632991990
MD5 c81909781aa957919c6de674188ddcd1
BLAKE2b-256 f1d1a4e227ae5c1b958289785f9593c1611069455188afea2d323973f3a5a3c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 64d3016e9096b6f9d6252a963540a5219025d05e2cabfdcfe79d72afbd8fa521
MD5 89672bfc979fbf9145c17427cf3db2cf
BLAKE2b-256 f68afee9a06612757f4978b7a82b4b1642701fd2a6cc44e3c21d37dd3b17b02f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp39-cp39-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 9efed67869987445ebe15b16dd558e3ac5d086e29f064af9ff532264c4cf571d
MD5 c89d328ea4656f45335939b56d232ac8
BLAKE2b-256 6c3cd50d7b5ee2e4539bc1d40d8d53fdba2455da33e29c1352e17c5164b6b060

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7e5c4b078110add100b6a093359285578cd1b2b3956366173db7e67d32fa84e4
MD5 93251d37992bb05c5a8d80d56288c037
BLAKE2b-256 d30c2f1d13e7e52a218430f543854e49e035362d8e5f30b12cde9257afe2f08b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.9.0-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.9.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 09814be6f593eb2dea98d704abfeff82543b4e85a1e200a86701548887c6848c
MD5 4edda18eb0fba600a4205e5a00a808b7
BLAKE2b-256 484695f4f3917469711fa7c4e14121a5dd68ece17483fbaa2a090a92bbc27329

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f23fe96af4ebdeb8b2140b82a7b26885eee5ac7de3336ae72003840ea8b269e7
MD5 a5d0a2287514211d241e306c9d2e8bdb
BLAKE2b-256 121ef323ca69ed5f7d876bccbc393ff46662ffa90b5506430dbde994448983b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp38-cp38-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 dfdb5cb4208e81fc6d10f64be7168a45f303d01f66780c49d72ce36594e30e5b
MD5 4482feb49ec71296a3e3bb9dd1bcf761
BLAKE2b-256 b1fad1452474393cd5cc322f64f254d30221599677c29bfd0044bcc924347e93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.9.0-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 a703ea0108a3df217fa181e0561a071d1c5fe64273a431add2ef10b52e310692
MD5 6ffbb6e1d843219fb2ed6de95fe904a5
BLAKE2b-256 52dc1d4cd1ae387be39f906c08fd5977b8d33d3c4537a3d1b4dc06c8068c4864

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