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
- ILU Preconditioning: Built-in incomplete LU preconditioner for faster convergence
- 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-16.
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
use_precond=True, # Use ILU preconditioning
)
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)
Custom Preconditioning
For the Python backend, you can provide custom preconditioners:
from blocksolver import blqmr, make_preconditioner
# Create ILU preconditioner
M1 = make_preconditioner(A, 'ilu')
# Or diagonal (Jacobi) preconditioner
M1 = make_preconditioner(A, 'diag')
# Solve with custom preconditioner
result = blqmr(A, b, M1=M1, use_precond=False)
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 only)
use_precond=True,
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 |
use_precond |
bool | True | Use ILU preconditioning |
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.
blqmr_solve_multi(Ap, Ai, Ax, B, **kwargs) -> BLQMRResult
Multiple right-hand sides with CSC input.
blqmr_scipy(A, b, **kwargs) -> Tuple[ndarray, int]
SciPy-compatible interface returning (x, flag).
make_preconditioner(A, type) -> Preconditioner
Create a preconditioner for the Python backend.
Types: 'diag'/'jacobi', 'ilu'/'ilu0', '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
)
Performance Tips
-
Use the Fortran backend when available (10-100× faster than Python)
-
Enable preconditioning for ill-conditioned systems:
result = blqmr(A, b, use_precond=True)
-
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) for b in many_rhs: result = blqmr(A, b, workspace=ws)
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) # 16 source positions
# Solve for all sources at once
result = blqmr(A, sources, tol=1e-8)
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)
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
Slow convergence
- Enable preconditioning:
use_precond=True - Reduce ILU drop tolerance:
droptol=1e-4(Fortran backend) - Check matrix conditioning with
np.linalg.cond(A.toarray())
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 / LGPL-3.0+ / GPL-3.0+ (tri-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.8.4-py3-none-any.whl.
File metadata
- Download URL: blocksolver-0.8.4-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83267535b3497aa1bb6c341df13d47bf335fba1ccc1022e053871cf83226436a
|
|
| MD5 |
a7886727c830ffedb40c119975b7466c
|
|
| BLAKE2b-256 |
12e7b42b4482263417479fc24ef5109f1e1bfdf3ab89b446ba438421c9e239c6
|
File details
Details for the file blocksolver-0.8.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
c3ceb94837384a757349308b6bd1119936dba826dac5dce49b68dcb968594165
|
|
| MD5 |
799d93d7c9fe8395a121aaac78dfcecb
|
|
| BLAKE2b-256 |
f4b9b221a5e3eaf04783bbd83ef25ff4290006dc29740a8c8468b9cb32ebffb9
|
File details
Details for the file blocksolver-0.8.4-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 11.0 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 |
ffab7bc300088b5af1357e3a712d2aca9a6ae329b99be29e7c8ffdf0878f2a08
|
|
| MD5 |
db6d10230e2876dd2861ac54d6041858
|
|
| BLAKE2b-256 |
0ec138f6631cb58622cbfd0ce58f892ec8b8171455edae92a518463839c757ab
|
File details
Details for the file blocksolver-0.8.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
8f956dabff46c76517842f371901b5c25af56122fdeaf3246ca973df094312f6
|
|
| MD5 |
e3be97a685f0a59fce26e07784844af6
|
|
| BLAKE2b-256 |
fb4935702085b93e4499791a025b0041b3534a379b52750c1558e431f7b9e741
|
File details
Details for the file blocksolver-0.8.4-cp313-cp313-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp313-cp313-macosx_15_0_x86_64.whl
- Upload date:
- Size: 6.9 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 |
50978e3adebb9fad2377e3dea751d9e648c86133e50c135ea537de0fe8022145
|
|
| MD5 |
9501a83c5ef6aef58be365fd643553c8
|
|
| BLAKE2b-256 |
9c370f98b54dc7f7f58f1f0f95f9cdec84a81ac1b85473d6189dfeacb11ba674
|
File details
Details for the file blocksolver-0.8.4-cp313-cp313-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp313-cp313-macosx_14_0_arm64.whl
- Upload date:
- Size: 3.3 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 |
6ffb5eb6c39e40eb57f79c655d3328cc1a9f6e50f61e8654aaeeac126ad0544f
|
|
| MD5 |
58cd414827fa652f224ed41d8b9ce022
|
|
| BLAKE2b-256 |
36956a96f9ae5e4f282a6272438da04972770a80bd13e9ae04aadbd6ad42c892
|
File details
Details for the file blocksolver-0.8.4-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 11.0 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 |
8d0d1bff7df8e08b6adb2b2e925df1a9bd3e19599e1a8ea7b8b9c87dc82b2633
|
|
| MD5 |
741768e5d91ed2716d38dc079d146848
|
|
| BLAKE2b-256 |
530d2886c05e0ea48552b4d6b3a806159ec303db06ead029bbae9d42d33c991a
|
File details
Details for the file blocksolver-0.8.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
926e6854d98d8de1c4d4a844898aa2721008b1d80573eb2fd7569c54fc6b5145
|
|
| MD5 |
765a00dd3d31324fb132fcb481ee6119
|
|
| BLAKE2b-256 |
dbc0184d86fdab2ac35bd6b8f5fb02b165f29108f1259b44caaffbf4bf2a92ce
|
File details
Details for the file blocksolver-0.8.4-cp312-cp312-macosx_15_0_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp312-cp312-macosx_15_0_x86_64.whl
- Upload date:
- Size: 6.9 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 |
56084d76a511757725a4f1ca9f44c8df521806156667951826e18618fe98d833
|
|
| MD5 |
d4501d8c325631150fa2e7b941133933
|
|
| BLAKE2b-256 |
bc205e24c782ee34ced0196c656dbfd2b8d8f0f6f1a5416dcfcaf3792ceae371
|
File details
Details for the file blocksolver-0.8.4-cp312-cp312-macosx_14_0_arm64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp312-cp312-macosx_14_0_arm64.whl
- Upload date:
- Size: 3.3 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 |
63c479820e75316fa9e3d4fd4999c08a75d92e32daaf9917c0922a667e5ddf32
|
|
| MD5 |
b0d12dd10e30302dc4d3394160491f9b
|
|
| BLAKE2b-256 |
683a451a1cd8ac1f7d9c7380d60bc0be2c42fa77b565908dd852563a166b3e14
|
File details
Details for the file blocksolver-0.8.4-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 11.0 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 |
ff86434cbea0d7f8975c9c98c44c7e68cefb5f6d32c0c2fe706300e828247b5f
|
|
| MD5 |
5c91980ecce7284caaa77a581abcaab1
|
|
| BLAKE2b-256 |
13fa99ae945bb6f5beac8694cdd09a94468c171eaa89872ade5a173939348f1a
|
File details
Details for the file blocksolver-0.8.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
c02fc21f08ad32448c785016744f76820d28c0dafc9ad1dd0d45abe1bb6a7ae5
|
|
| MD5 |
5e22034947458a3fd09b367c38fc30ce
|
|
| BLAKE2b-256 |
2cab2e9a43c8c55540511b51f364c9fc0fb3d35d92cee73c8e807c9d0504e96a
|
File details
Details for the file blocksolver-0.8.4-cp311-cp311-macosx_10_9_universal2.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp311-cp311-macosx_10_9_universal2.whl
- Upload date:
- Size: 172.3 kB
- Tags: CPython 3.11, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d131f74e287f6591a7f34a7b55bf7a19e4a62c75a277680f839460c18cb2efc
|
|
| MD5 |
d37c4f3f3b76727b4392f3abf7105df7
|
|
| BLAKE2b-256 |
fd51ad2e0ea70b9506b6bf538387cb71f9af05b68f35ec4cfea1a321d3e2e1c4
|
File details
Details for the file blocksolver-0.8.4-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 11.0 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 |
8f06aa746173f6b8abf60102ba3cce6e3377603139ec999960c712c43ed6fb36
|
|
| MD5 |
cc5279b3491526ca9dfa97b4281f57aa
|
|
| BLAKE2b-256 |
6a7ce69fd5e47c294e929eb5277354dd83692034f70b523628a749d85e6fe183
|
File details
Details for the file blocksolver-0.8.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
e3f1adc7108d96411adc6ce599d6d293419cb8a025c7da6749b157818e424c50
|
|
| MD5 |
c6cd8a4196176829fbdfc0f5e79f0d5f
|
|
| BLAKE2b-256 |
242fd6cd6e11141d06fa4a7faaee75ef0021c01a4ad586781271eeabeafc98dd
|
File details
Details for the file blocksolver-0.8.4-cp310-cp310-macosx_10_9_universal2.whl.
File metadata
- Download URL: blocksolver-0.8.4-cp310-cp310-macosx_10_9_universal2.whl
- Upload date:
- Size: 170.6 kB
- Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a100dadab68e121e4d1b96b41df062534bf7c9a0d26f86bebc4432f8c03e75fe
|
|
| MD5 |
bba272373ae539948e69257aca1e5f36
|
|
| BLAKE2b-256 |
3dc81fc0ba3134dbbbae9ce969f174a4978a39c22ab409404bdc851efe5101c5
|
File details
Details for the file blocksolver-0.8.4-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a3a361098f20a57d02cfe784fd27f5c65df0b365425c6f9852742cbe7e4b69c
|
|
| MD5 |
d3e7611fe2a65e90559c44fff02eddd4
|
|
| BLAKE2b-256 |
1767a708d556539b2d6c471cc953b0a88ef1a087a782c19e95f399b91a39cf4a
|
File details
Details for the file blocksolver-0.8.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: blocksolver-0.8.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 |
d0641d7714c67a48ae0408ea7446ba320d53d7a9164306f3e3024bfbf11dcc77
|
|
| MD5 |
0a810c4ecab2566e89a0dd5127f98912
|
|
| BLAKE2b-256 |
02864438e4d35a459d76859fe27ff76188d240f2bc55ec612ecadefc22ce7dda
|
File details
Details for the file blocksolver-0.8.4-cp38-cp38-win_amd64.whl.
File metadata
- Download URL: blocksolver-0.8.4-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87b094fee3da2ecea845319dbee9ab6e7ab7647f736f0016ba88c40d95bd5433
|
|
| MD5 |
6519d5a49d8eabb868bd4ffad7ed95e9
|
|
| BLAKE2b-256 |
34c037cbb743f46995390646923905a76c553ce2cca84eadc68dd7e211d16290
|