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
Release files for blocksolver 0.9.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size:278.7 MB
Release files / blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
7ac9a25a43ecbb77b6a85629db7d6eddcc5b19ed232d9c7001ddfbb21cdd4cda
|
|
BLAKE2b-256 checksum How to use checksums |
ad0aee6de2e58f2914702a073e2186597ab9e23167928e195a71f06752df8e5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp314-cp314-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 11.6 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
c05c87d46172f3c6a2b248d49e7aa477aba14ddd9774be104d8dceb7c39f4ee2
|
|
BLAKE2b-256 checksum How to use checksums |
d45b11008a0a5c311e2af40328fa2c16414c011c0d48a586b9c72e1f7706180d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
e7393a80a304bf5f548c938c8e72855a5230214c8062cd0ed36731de88ecac9e
|
|
BLAKE2b-256 checksum How to use checksums |
fefe5db7140b8f342bff378cd1bfd0c4602716493eeefd8e55de9817e72b6e49
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp314-cp314-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.14 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
6833b3b5e864c326fa8d7019bb6cc5a4290fd65410c9e7b9d29f71662e9c52a0
|
|
BLAKE2b-256 checksum How to use checksums |
b001112886b7df473043420640fbfa09c6650dc15749b9062cbd8480bba97be9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp314-cp314-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.14 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a201d78780c617fcf3a5b6ec13331c7f5717d64c601ca7ea8387edbab9b38198
|
|
BLAKE2b-256 checksum How to use checksums |
81a0505d7447d9e8cee9d895de3bfeffc7abd6ec9e015d93c13f91a5dcb3c1e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.13 CPython 3.13 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
8a23659b87da43ef948d2e84f25b523125297baf6ed33fab5f4cfd5fc40304ca
|
|
BLAKE2b-256 checksum How to use checksums |
9eac3b2c0e40df9469236499f09fcf3057b1a9125eb32513523baf9f109b2df6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp313-cp313-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d4b4578a60067b47f72e7eec954a16bb3364d0430cb10b42aa2460ef59592e1d
|
|
BLAKE2b-256 checksum How to use checksums |
d7c0ac732a6bac549ccba37edfc7da4dfe883a488d7670f660b6f0905a1926aa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
567e98ed4fb319935eb97125d8d50decac1cfe7bb29db20e0fd0c10fe79dc76d
|
|
BLAKE2b-256 checksum How to use checksums |
7375b8a297b93a08475d0571796e714441fe05349de1cfc367f0e8670d1bcb0a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp313-cp313-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.13 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
65b98144026ce7530325e3ee9cb473c2f24675a00371f8e4d4392d959a2d3cd9
|
|
BLAKE2b-256 checksum How to use checksums |
3c725ce144aae299634ed3ff4e382373c2abd6539180577e3adcc4e2b1a52c9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp313-cp313-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.13 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1447eaab33e5bf683c30f7e0fcaceb37fd7a546fea5436e64b5e3ba7e43a41b9
|
|
BLAKE2b-256 checksum How to use checksums |
da47b8a3f018897a2a7c1e52084c4ef83471d3f74a2a2b892ccc4e55b51e091e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp312-cp312-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
5a2a2d8820df9c2e0fcf2f9734b4fcc33fcb664da01b65beb3173e39edaffac9
|
|
BLAKE2b-256 checksum How to use checksums |
da580d736a426fef16deb614bc7be064651ff5550fe4167ce415aaae305b8697
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
66d26ad60584ae841595491190a953336d33bebc3d4f8850b3acf7224540a1f9
|
|
BLAKE2b-256 checksum How to use checksums |
e6d86dccf85f24b80bc1ae4e605b0a52b9d85b7023a80246441d9a8945bfa151
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp312-cp312-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.12 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
11d1eddb25d2178319274b5abc337e91b2712a2381302cc8d9a9d7bf6a89d8a9
|
|
BLAKE2b-256 checksum How to use checksums |
f28323290fc95bf9c3c67327879028037258c1c4bb1118d0152d676cb1bb69ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp312-cp312-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.12 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
48e37b5620048722804c77f8957f74691682fe72d9800e79d8a14a376099b3c8
|
|
BLAKE2b-256 checksum How to use checksums |
d4f36830f8bff65e6f812ed80bce98f6d747ca00ebcb0bf1eec8194349972707
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp311-cp311-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d219954731c7a3d86098abbfa6119bae51e7c3d3da3ed4da8f5557ec34555128
|
|
BLAKE2b-256 checksum How to use checksums |
22dd288aa39be7ddd3c535bf2d6b8c5ff69ef54d146391c46404aecf0324f898
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
f3437faf98a95db42dbb35a374dd4a0bf7f7fba9032439a1e49a5f742c8d5baa
|
|
BLAKE2b-256 checksum How to use checksums |
3b645054b0022f3b2e9ace1822b3bead1dc5e06a1c2005fb8515f3732ef167f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp311-cp311-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.11 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
4b6d13e27486c42234d5749fdf4852500b91ed271508adf46f837475f55429e7
|
|
BLAKE2b-256 checksum How to use checksums |
55792727a2bf1e57f5015028f7805c7f3d0866f2b148869801687e065285302e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp311-cp311-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.11 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a684eb249e3d0c03e5ea65cf292cfcf467fd2d7cc5b53739a3c5a2bef38aa81f
|
|
BLAKE2b-256 checksum How to use checksums |
89fe73fe3d9f892cd3234776730ec37a02e1597c10b2fb7d5b2947faa7a77557
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp310-cp310-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
700c8dd9d703a5ed3f6d4658be7d93fefdae835b37ff34795b06bbb060db9208
|
|
BLAKE2b-256 checksum How to use checksums |
95ecd4acb98f2db59bcd24d6fe5a1fea687522dd8aaef9fec8bcff2c5ac25279
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
e28402bf1d02b0c6ad7679ade666c26e9a4e053023bbc94441bc51e08fac595c
|
|
BLAKE2b-256 checksum How to use checksums |
76f0fbcf1191670c087ad37e6cf9bfcdbedb344f5195624952bb6108ebc65be0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp310-cp310-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.10 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
fbb95c00ce161cc3c36517cdc4e0f52a67cf93bdd06125e533552cf603ea06ea
|
|
BLAKE2b-256 checksum How to use checksums |
5d050dee934b92bc4f0a83d8e093c2d3a04ffe9a298d1611379f428402180c0e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp310-cp310-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.10 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a5ec5cdd63dfb1265a5446aa58ca81555cf29a24082499fc3abc2ce27fffd792
|
|
BLAKE2b-256 checksum How to use checksums |
90ceb450c254d3a85bc160fc4689c4aa598850a37b2a54bbabadbded19084090
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp39-cp39-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
6794164b55e898774f385ed16d2adc9670f23b0b918fad44abfff99e2d4a3261
|
|
BLAKE2b-256 checksum How to use checksums |
383e0594e262746d667a4e2b44c07251c0ecba0d92263d2ab13bc213241c96ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
9a898b36e51d028f6a9774575033429d0b28f558311abc6c8d97b57ffe4f8407
|
|
BLAKE2b-256 checksum How to use checksums |
4318667bec063efdde982718d5000126c45c7849e4059d019b8474d48be3ffd3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp39-cp39-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.9 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
2d3548c6151ce52d696e656c02e39e145ee0a6993941971f95f1bc0047e813a7
|
|
BLAKE2b-256 checksum How to use checksums |
ac6be88bd25d5a8d61200621ccc7b1858e1d38ea5cede780ff92e613fe02fc39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp39-cp39-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.9 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6d61926f8bb96d29e66442438db9896c4468224c43c5fe101902716297654437
|
|
BLAKE2b-256 checksum How to use checksums |
45ebb4e05a84525af3f519396a84ca119d34aa23cf2a0ddd12dec46d6f086fa2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp38-cp38-win_amd64.whl
| Download URL | blocksolver-0.9.4-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 11.3 MB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4d6b5d0bd4711b672ffad1175293e2a61c2dce93394f958076b40b482ba51256
|
|
BLAKE2b-256 checksum How to use checksums |
32c6f9f1fe5e44a6c776c8fdea8a795581d03423256004e38b10d1986f1e7413
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
| Download URL | blocksolver-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl |
|---|---|
| Size | 15.6 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
72b7c08ce26dd85932721e1afb2d1e4f513ca532ac1c1b79145bec31c53075cf
|
|
BLAKE2b-256 checksum How to use checksums |
3f0421b59adf60eb68afa225c72064dbdb4d70e6e2d4f4001a59e4ebfb7cec61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl
| Download URL | blocksolver-0.9.4-cp38-cp38-macosx_15_0_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | CPython 3.8 macOS 15.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
91778f72de60c40fd6ac9bac634443dbeaec2bc91b6b5547f1df880a98e9a435
|
|
BLAKE2b-256 checksum How to use checksums |
7c155fa2b19b071365cb401f6b810539ec944b33d9d6c6114fd60ddb9d08fa11
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl
| Download URL | blocksolver-0.9.4-cp38-cp38-macosx_14_0_arm64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.8 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
169a0d29a450e54f99828fbb65a69348c6e9e119723a637e7fa9de394c714014
|
|
BLAKE2b-256 checksum How to use checksums |
6617400ba51b88b8175899dba1177ef2f1f75948fef044c2fea4345d2ca56a3b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|