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
  • 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:

  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-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

  1. Use the Fortran backend when available (10-100× faster than Python)

  2. Enable preconditioning for ill-conditioned systems:

    result = blqmr(A, b, use_precond=True)
    
  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)
    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

  1. Enable preconditioning: use_precond=True
  2. Reduce ILU drop tolerance: droptol=1e-4 (Fortran backend)
  3. Check matrix conditioning with np.linalg.cond(A.toarray())

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 / 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

blocksolver-0.8.2-py3-none-any.whl (15.4 kB view details)

Uploaded Python 3

blocksolver-0.8.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

blocksolver-0.8.2-cp313-cp313-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.13Windows x86-64

blocksolver-0.8.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

blocksolver-0.8.2-cp313-cp313-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.13macOS 15.0+ x86-64

blocksolver-0.8.2-cp313-cp313-macosx_14_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

blocksolver-0.8.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

blocksolver-0.8.2-cp312-cp312-macosx_15_0_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.12macOS 15.0+ x86-64

blocksolver-0.8.2-cp312-cp312-macosx_14_0_arm64.whl (3.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

blocksolver-0.8.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

blocksolver-0.8.2-cp311-cp311-macosx_10_9_universal2.whl (149.2 kB view details)

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

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

Uploaded CPython 3.10Windows x86-64

blocksolver-0.8.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

blocksolver-0.8.2-cp310-cp310-macosx_10_9_universal2.whl (149.2 kB view details)

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

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

Uploaded CPython 3.9Windows x86-64

blocksolver-0.8.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (15.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.8Windows x86-64

File details

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

File metadata

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

File hashes

Hashes for blocksolver-0.8.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fd8bb827aac5cb1d9addf59e54300d4596029ff992b8082a582e50e033ba8169
MD5 e0dfebea3f36fac2c1698fb4d195e0e3
BLAKE2b-256 f4bff63ba8b8b8d18fad2f89e360f09f6f8bf232789f866cd1c6125f50ee3b6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 1d4afdaca3121010982845752c3bbf76f552cb924c8fbedabfef9a09f821476d
MD5 aa6bb5e21920ed6b9c787e806a52d404
BLAKE2b-256 dd75dacfd3717956f77dfc789a53c5355f8c8fc81f4a928b84aefc4023eeb652

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4ae8f9c65c969a3b9b3a04ad2ade32ff16cee4bea047050afd385556d0442300
MD5 875438a005241ce84f681b92a27909cf
BLAKE2b-256 8be5a2fd8ca391952a1c472779fb0ef35521687981e2cd9a048b05a5d40d8e2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f98bb356bcc5e9f9e883f76dc9eae3f2dbc7981a918cc40c1e4d6e3d896f982d
MD5 95a18602161765e6e2dc9fbfdb152676
BLAKE2b-256 eca0e66e92f8d390a86635668fe9ba620e74c481bfdb0d8b5d1ff0cf7f34d4e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 063c95afe4604cb361e4f96103bd34923a9de7263d78609c6507390ca364b60f
MD5 5c7787f25beb268d0692d1cc7894a57b
BLAKE2b-256 96562a40477f48963f994359245ca37447b8cd62c9387e423fd16548ba36b4fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 106c32dd737f750548858b7ea86cb0bbb04645f8dfb9290c66e7dec0f36aba57
MD5 83936e0d927edc5e54f0b0553f00b566
BLAKE2b-256 b346230e829ab62737a64baeadf4e9350d9bff5fc741c6b7c9a26bcaedbfecdf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f0440a04de4137614d9a22804b6c1dd852d1bb1cda86a7336f85e0d5ba1b703d
MD5 52efeaac1e51658aadbfb21497e47158
BLAKE2b-256 d771e0daa933c8f54c908b62ec8533986925ab78568c24be70cd62bd6fee54f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 067a347874c2fbd5bfd11b6afe541a998f456187669d5d09b906b89971c1d82b
MD5 130fd94ceca2f8e8b28c3e636fce156b
BLAKE2b-256 948d1c13c73cc46e272bbf3f8d13d8d55b6a3e056e96211c59afa571eff3eb81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 6d2dba371ade6e373d57088eb9afefc681866a5c5ee46698854184bbeed1001a
MD5 355ce59f92c10d8cc1dcbb782289dfb9
BLAKE2b-256 4b32b74651a1b95b447cf5367969bfa5f1c7554132c239255b8bcde9edc0f107

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1717052220f034325951baf9f40e882ff49a1e34774c1a42f54548a5032a1464
MD5 fb7de1784abcfd80c7c0dda703d0a7d2
BLAKE2b-256 68b8b2227c7e913645ca567456a1c34fbb72079f7afb51d1dc613d628a734f77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7a4da4926278d2f2321d1c5b8d95eaf39f19b48c5d165bdd04ab79748c1499f4
MD5 c741a82f67582b4cb3a8c36a8a2aad9e
BLAKE2b-256 ef44440c78edf7edadc4964e7f2e47bce5a9b6e801bdc0773e0447723441a9de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 0805d8dbabd8efaa8c27b14f811cb681dc9c8e3712e90d65686df95f572da0fd
MD5 a3bb4a2929de19faedf0c7bfdcf4711d
BLAKE2b-256 130856d46bacf461e4f4003f2f30d92fdfc764fcf3937416b8dc23ac18b9597b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 882602f6c2708bd90892aa41628f5db113a3a8c70d929bb07b1d25f8730102c7
MD5 bc582750517b39bb28ccaffb47daa81b
BLAKE2b-256 e0fe76b408f087cb276716029af678d4c27a45d875807e33a48fbdd88c590dbb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b603cd7e7983033398ab1bf23b561797707305b1c9be86846e22dd61d49a5776
MD5 e4c0a0addba161d35f3a6d876f066725
BLAKE2b-256 24a51a197226409a1e5239127acc52730c9c964eff503abe45bcde703119bd9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 f2a557e61fed344a0ed2128c72199e9be35f6a0cfe5d4418e8635dd958b9e827
MD5 eef45895efa31bc86e8e607becd7a4ac
BLAKE2b-256 be8656e44d2c993a9374c7bef040dc34cfec76e1e642baf188e4496fa031727a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d4c7204f44279ca0ab70b5f1f79015745fc82e6b0c5aca25aaadc20e27131b34
MD5 76951c66a840524eb7ca7eb6f787b325
BLAKE2b-256 3447c960b5edcde9d87148e8303873fe98590c2b0ca35e37f480db632c45f696

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 11.0 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blocksolver-0.8.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 436eeb78cfee711a14783c2c6147ea09a4b28cdcc7c82d91b750e92a7d9a409e
MD5 bdd789c4c24b3bf83e61cdf3cdd13efa
BLAKE2b-256 2eed06f511676106e68bb92ac22231e748994523915c4c67ef502034c6a9e890

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 09bc739fe03bc92ec11d2d17113e726df73052c4aeecb7e668d2d48549080c7d
MD5 c82e1cd4588268a4e9e7113f461802d8
BLAKE2b-256 0dc85ab3be0aa125d1651bf82e7cfb96837798248ea4014b68502df41cdfa6a8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 11.0 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for blocksolver-0.8.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 88188df0758a55a35b679c47c32387f827eb01d7f4f903a51ff64b7d20e31a64
MD5 246d4bfe4f5b8847cd488bb21570b52b
BLAKE2b-256 d40970181ffa27872dc1e6014fb72360b4c8a8d064c6a2247cd0eb190c31351d

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