Block Quasi-Minimal-Residual sparse linear solver
Project description
BlockSolver - Block Quasi-Minimal Residual (BLQMR) Sparse Linear Solver
- Copyright: (C) Qianqian Fang (2005, 2011, 2026) <q.fang at neu.edu>
- License: BSD-3-Clause and GPL-v3 dual-licensed
- Version: 0.9.4
- Website: https://neurojson.org/Page/blocksolver
- Github: https://github.com/fangq/blit
- PyPi Page: https://pypi.org/project/blocksolver/
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:
-
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.
-
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.
-
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
-
Use the Fortran backend when available (faster for large systems)
-
Enable preconditioning for ill-conditioned systems:
result = blqmr(A, b, precond_type='ilu')
-
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)
-
Install Numba for faster Python backend:
pip install numba
-
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)
-
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
- Enable preconditioning:
precond_type='ilu'orprecond_type='diag' - Reduce ILU drop tolerance:
droptol=1e-4(Fortran backend) - 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
- Use the Fortran backend (more memory efficient)
- Reduce block size for multiple RHS
- 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
- BLIT - The underlying Fortran library
- SciPy sparse.linalg - Other iterative solvers
- PyAMG - Algebraic multigrid solvers
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ac9a25a43ecbb77b6a85629db7d6eddcc5b19ed232d9c7001ddfbb21cdd4cda
|
|
| MD5 |
9bbd50ed13b045adbf5a44424362acc1
|
|
| BLAKE2b-256 |
ad0aee6de2e58f2914702a073e2186597ab9e23167928e195a71f06752df8e5c
|
File details
Details for the file blocksolver-0.9.4-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 11.6 MB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c05c87d46172f3c6a2b248d49e7aa477aba14ddd9774be104d8dceb7c39f4ee2
|
|
| MD5 |
c0406bee6882cfd0d2fbd309705321e6
|
|
| BLAKE2b-256 |
d45b11008a0a5c311e2af40328fa2c16414c011c0d48a586b9c72e1f7706180d
|
File details
Details for the file blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7393a80a304bf5f548c938c8e72855a5230214c8062cd0ed36731de88ecac9e
|
|
| MD5 |
3a8c5676146b8e1c22cdd90697b56fef
|
|
| BLAKE2b-256 |
fefe5db7140b8f342bff378cd1bfd0c4602716493eeefd8e55de9817e72b6e49
|
File details
Details for the file blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.14, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6833b3b5e864c326fa8d7019bb6cc5a4290fd65410c9e7b9d29f71662e9c52a0
|
|
| MD5 |
d91aa742e33ade08c75140e411905e41
|
|
| BLAKE2b-256 |
b001112886b7df473043420640fbfa09c6650dc15749b9062cbd8480bba97be9
|
File details
Details for the file blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.14, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a201d78780c617fcf3a5b6ec13331c7f5717d64c601ca7ea8387edbab9b38198
|
|
| MD5 |
27b33a67e013b4e34e1a39b2f250cc98
|
|
| BLAKE2b-256 |
81a0505d7447d9e8cee9d895de3bfeffc7abd6ec9e015d93c13f91a5dcb3c1e3
|
File details
Details for the file blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.13t, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a23659b87da43ef948d2e84f25b523125297baf6ed33fab5f4cfd5fc40304ca
|
|
| MD5 |
015ab409192e14e62307748cd9f1e2d7
|
|
| BLAKE2b-256 |
9eac3b2c0e40df9469236499f09fcf3057b1a9125eb32513523baf9f109b2df6
|
File details
Details for the file blocksolver-0.9.4-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4b4578a60067b47f72e7eec954a16bb3364d0430cb10b42aa2460ef59592e1d
|
|
| MD5 |
3cfde1204d934b2b5fb5854937667bd2
|
|
| BLAKE2b-256 |
d7c0ac732a6bac549ccba37edfc7da4dfe883a488d7670f660b6f0905a1926aa
|
File details
Details for the file blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
567e98ed4fb319935eb97125d8d50decac1cfe7bb29db20e0fd0c10fe79dc76d
|
|
| MD5 |
268f51dab419b87f424519b25847f1df
|
|
| BLAKE2b-256 |
7375b8a297b93a08475d0571796e714441fe05349de1cfc367f0e8670d1bcb0a
|
File details
Details for the file blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.13, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65b98144026ce7530325e3ee9cb473c2f24675a00371f8e4d4392d959a2d3cd9
|
|
| MD5 |
fb8acd250023b7436ecfc08056fbe083
|
|
| BLAKE2b-256 |
3c725ce144aae299634ed3ff4e382373c2abd6539180577e3adcc4e2b1a52c9b
|
File details
Details for the file blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.13, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1447eaab33e5bf683c30f7e0fcaceb37fd7a546fea5436e64b5e3ba7e43a41b9
|
|
| MD5 |
d5697a02812e55f3e22bc29eb0189044
|
|
| BLAKE2b-256 |
da47b8a3f018897a2a7c1e52084c4ef83471d3f74a2a2b892ccc4e55b51e091e
|
File details
Details for the file blocksolver-0.9.4-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a2a2d8820df9c2e0fcf2f9734b4fcc33fcb664da01b65beb3173e39edaffac9
|
|
| MD5 |
a213c694d12fcec57a36d565adf683fc
|
|
| BLAKE2b-256 |
da580d736a426fef16deb614bc7be064651ff5550fe4167ce415aaae305b8697
|
File details
Details for the file blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66d26ad60584ae841595491190a953336d33bebc3d4f8850b3acf7224540a1f9
|
|
| MD5 |
3e8bed714b009fdee3c398faa6cdfb60
|
|
| BLAKE2b-256 |
e6d86dccf85f24b80bc1ae4e605b0a52b9d85b7023a80246441d9a8945bfa151
|
File details
Details for the file blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.12, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11d1eddb25d2178319274b5abc337e91b2712a2381302cc8d9a9d7bf6a89d8a9
|
|
| MD5 |
edd863655561f68dbffa67f2edde5c82
|
|
| BLAKE2b-256 |
f28323290fc95bf9c3c67327879028037258c1c4bb1118d0152d676cb1bb69ba
|
File details
Details for the file blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.12, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48e37b5620048722804c77f8957f74691682fe72d9800e79d8a14a376099b3c8
|
|
| MD5 |
a4e4ff5e0435b44becbe1adca08691e3
|
|
| BLAKE2b-256 |
d4f36830f8bff65e6f812ed80bce98f6d747ca00ebcb0bf1eec8194349972707
|
File details
Details for the file blocksolver-0.9.4-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d219954731c7a3d86098abbfa6119bae51e7c3d3da3ed4da8f5557ec34555128
|
|
| MD5 |
416081bc0929b13b7bda229137cf88c1
|
|
| BLAKE2b-256 |
22dd288aa39be7ddd3c535bf2d6b8c5ff69ef54d146391c46404aecf0324f898
|
File details
Details for the file blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3437faf98a95db42dbb35a374dd4a0bf7f7fba9032439a1e49a5f742c8d5baa
|
|
| MD5 |
4fd3d580d0d829d35426b52f9f5f3968
|
|
| BLAKE2b-256 |
3b645054b0022f3b2e9ace1822b3bead1dc5e06a1c2005fb8515f3732ef167f2
|
File details
Details for the file blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.11, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b6d13e27486c42234d5749fdf4852500b91ed271508adf46f837475f55429e7
|
|
| MD5 |
36354792800db141107b3cb2aac73e8b
|
|
| BLAKE2b-256 |
55792727a2bf1e57f5015028f7805c7f3d0866f2b148869801687e065285302e
|
File details
Details for the file blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.11, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a684eb249e3d0c03e5ea65cf292cfcf467fd2d7cc5b53739a3c5a2bef38aa81f
|
|
| MD5 |
daf26ef226d58bb38ae26feda77f0fb4
|
|
| BLAKE2b-256 |
89fe73fe3d9f892cd3234776730ec37a02e1597c10b2fb7d5b2947faa7a77557
|
File details
Details for the file blocksolver-0.9.4-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
700c8dd9d703a5ed3f6d4658be7d93fefdae835b37ff34795b06bbb060db9208
|
|
| MD5 |
053e6a03c17ee9ca19165b3bdda5e1b5
|
|
| BLAKE2b-256 |
95ecd4acb98f2db59bcd24d6fe5a1fea687522dd8aaef9fec8bcff2c5ac25279
|
File details
Details for the file blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e28402bf1d02b0c6ad7679ade666c26e9a4e053023bbc94441bc51e08fac595c
|
|
| MD5 |
28da63c9135548b2e9d0e3bfbb9e4122
|
|
| BLAKE2b-256 |
76f0fbcf1191670c087ad37e6cf9bfcdbedb344f5195624952bb6108ebc65be0
|
File details
Details for the file blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.10, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbb95c00ce161cc3c36517cdc4e0f52a67cf93bdd06125e533552cf603ea06ea
|
|
| MD5 |
c4b3b27e04b72730f13bebfc636ab8dd
|
|
| BLAKE2b-256 |
5d050dee934b92bc4f0a83d8e093c2d3a04ffe9a298d1611379f428402180c0e
|
File details
Details for the file blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.10, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5ec5cdd63dfb1265a5446aa58ca81555cf29a24082499fc3abc2ce27fffd792
|
|
| MD5 |
caa382590c73aa593f8b01e52a31a883
|
|
| BLAKE2b-256 |
90ceb450c254d3a85bc160fc4689c4aa598850a37b2a54bbabadbded19084090
|
File details
Details for the file blocksolver-0.9.4-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6794164b55e898774f385ed16d2adc9670f23b0b918fad44abfff99e2d4a3261
|
|
| MD5 |
eaef1b423600ff9068ac71e6292e44b4
|
|
| BLAKE2b-256 |
383e0594e262746d667a4e2b44c07251c0ecba0d92263d2ab13bc213241c96ba
|
File details
Details for the file blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a898b36e51d028f6a9774575033429d0b28f558311abc6c8d97b57ffe4f8407
|
|
| MD5 |
a48a4c468067465e78457d9a1e46a1c7
|
|
| BLAKE2b-256 |
4318667bec063efdde982718d5000126c45c7849e4059d019b8474d48be3ffd3
|
File details
Details for the file blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.9, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d3548c6151ce52d696e656c02e39e145ee0a6993941971f95f1bc0047e813a7
|
|
| MD5 |
c76e98884dd38f1dc1375d5759c08c03
|
|
| BLAKE2b-256 |
ac6be88bd25d5a8d61200621ccc7b1858e1d38ea5cede780ff92e613fe02fc39
|
File details
Details for the file blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.9, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d61926f8bb96d29e66442438db9896c4468224c43c5fe101902716297654437
|
|
| MD5 |
b1cb2ff4e80b9269dd22499b6698b313
|
|
| BLAKE2b-256 |
45ebb4e05a84525af3f519396a84ca119d34aa23cf2a0ddd12dec46d6f086fa2
|
File details
Details for the file blocksolver-0.9.4-cp38-cp38-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 11.3 MB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d6b5d0bd4711b672ffad1175293e2a61c2dce93394f958076b40b482ba51256
|
|
| MD5 |
d4c39b7817598a2770ba7bd6876d0772
|
|
| BLAKE2b-256 |
32c6f9f1fe5e44a6c776c8fdea8a795581d03423256004e38b10d1986f1e7413
|
File details
Details for the file blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 15.6 MB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72b7c08ce26dd85932721e1afb2d1e4f513ca532ac1c1b79145bec31c53075cf
|
|
| MD5 |
867ea610eec74fa48cfb08d81d9d1808
|
|
| BLAKE2b-256 |
3f0421b59adf60eb68afa225c72064dbdb4d70e6e2d4f4001a59e4ebfb7cec61
|
File details
Details for the file blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl
- Upload date:
- Size: 5.6 MB
- Tags: CPython 3.8, macOS 15.0+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91778f72de60c40fd6ac9bac634443dbeaec2bc91b6b5547f1df880a98e9a435
|
|
| MD5 |
50a56f573710994a8bf4294b71ae140a
|
|
| BLAKE2b-256 |
7c155fa2b19b071365cb401f6b810539ec944b33d9d6c6114fd60ddb9d08fa11
|
File details
Details for the file blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: CPython 3.8, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
169a0d29a450e54f99828fbb65a69348c6e9e119723a637e7fa9de394c714014
|
|
| MD5 |
22fb9d24b7f987e68350f5dfba960887
|
|
| BLAKE2b-256 |
6617400ba51b88b8175899dba1177ef2f1f75948fef044c2fea4345d2ca56a3b
|