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.3-py3-none-any.whl (15.4 kB view details)

Uploaded Python 3

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 15.0+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 15.0+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

blocksolver-0.8.3-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.3-cp311-cp311-macosx_10_9_universal2.whl (149.9 kB view details)

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

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

Uploaded CPython 3.10Windows x86-64

blocksolver-0.8.3-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.3-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.3-cp39-cp39-win_amd64.whl (11.0 MB view details)

Uploaded CPython 3.9Windows x86-64

blocksolver-0.8.3-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.3-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.3-py3-none-any.whl.

File metadata

  • Download URL: blocksolver-0.8.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 24aa20d8f0924f3548778172b15380aaa61c51085ee772d56a1d6d757bf3a30a
MD5 7ff3c7bf40bbc6626ff041888a144cfa
BLAKE2b-256 bb4057a3ea4572ea3f14022dcf2acf0ef7c8bae8e66da891c74b3f685df10abb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 a38067a2b6ef2553e5d9227b89cd9575bf7ec838610f88f635fd026b439e49af
MD5 5d1d7a5c8cf224d6b9ce9abc9bb80de6
BLAKE2b-256 40435aa7b1ac8c69f6dde504cab1079ea11b2378212be697e25224105ff07082

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 beda50abe9e3ac02231bbdc9bd43674bbfa9ceecb33c1a875ed4ed9a200659cb
MD5 d9252f12b8decf8f3fdc8bbb85463dd2
BLAKE2b-256 b27002de04721bd35a884be6ae0d71c3df857ce23f0a6b1133ddf3fcd77a97ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 4dd8aedb937bb3ce68a41e591b1812f7440888b4078323af166a552ee59fe41c
MD5 5909b0e5e640e973a52f84bfc7863078
BLAKE2b-256 bfa1cc870757a30f8629371987cd0d1012469cabf7fb180702820a751d41c6a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 8a5de82d202808219f2bd64f238ee724a1a47c32f981001aa7123dbabf1a75f1
MD5 16d2f1a68795207b744670c33d54333d
BLAKE2b-256 08998fdd9e52b3c707dfbde67d29b6df83e28a1f2cb04b8c034dee68c0e0f6d6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 3976508fddbce4748cef2b965372ed9b1e8cdf444a55801e6368543db3ed503a
MD5 53acf52e8efc7b01e98c16a438425fd7
BLAKE2b-256 dfc073d7caeabd43a9577f07141ce7cfd2198fb093fbc2466feb483adabb0728

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f6fcfcd9ed1d77b58dc0ed92990ce80d7416589bcc09d428dff869584b929cc2
MD5 061c712d43b9350ff8fe17f213c7afc5
BLAKE2b-256 c6626369710fb8121d4814570366d50b6112492216970192d9e6fd2f28bffc3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 52e338eadf87fd31e62148cbfa43dfe75c0f8936201ce0d10413eff1a3fbe6f0
MD5 5956f723de64bf23df07aac6d12808ff
BLAKE2b-256 5c22c366b9964ba9d6c1231377caa238eb5b18365ec1177002f907e8ba5b92cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 9a0c0dda593a303a15d79e2589e2ee7151fb460705ff0959708dff710033f747
MD5 66243a6f671f62ed2ff0880b06a42709
BLAKE2b-256 464174496bf13487fe8c47ea28f4d6d3d0abef5441fe42485379a36b7b9d7265

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b17daee1fc8a15e751511d4de12299d6e728976955a160eaca3bdf864780d9ca
MD5 5e74d597859036376358f444c4b918dd
BLAKE2b-256 9ae28876858c523438355af45b87ecd72a0fec5fa29581652d91788d8ab6ef02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3885c41290e494b16d2a8c3f62ae336930f8e6f535285debe6d84db8eb74cadc
MD5 3c7098762bfa2ace4cde106271e03960
BLAKE2b-256 51b35946045a2e3ec42389556ab6b1ec3f19a72c97f328cddb2997daf9347a07

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 5434834db0efc3a26cc3db59cd2af2e2dbcdc053e0d446650268e9887d21d9b4
MD5 57fa28bcece8217a79144cae555bbdd4
BLAKE2b-256 73271f17e8ce3858dd3b30cee5f549610105a6a75261e9f3218aef297fb93549

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6784007e8965f82aceaec5736fd366cd981895f3dbdfc144f3ba5b488a486239
MD5 e52d9d72e39850b02f9292930a59dbd1
BLAKE2b-256 62e7ecf979d68552ae7ef6ed2b18006282a61d1e353ca1352dc6b684d752abee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 251aecc45d7c6bcdff2c36d3367a0097ec6c689445b99025732f9c824ec33373
MD5 ac7c0dde3658401df507331197815b9c
BLAKE2b-256 0eed9c68512a9bb27392531612bd0b5767333d04d3ec979bff58f73e958e7c61

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 0e293a6e009b73fcd72d0bbbf6630e4186534801ba528973bdb529d1f07ea3cd
MD5 c40af68c1ab11e0871d74bbfad43f6ca
BLAKE2b-256 56f0162ac29de1cefdf2d133ca079bef563bd00ac41bd233f4ce8af3e5222763

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 b0a60e8ae206419ffc2f49f29e4ef6d8a50c08f6a776a112f602b2b282fb6b19
MD5 8d749e3a407c303a10ed3ec7c8a516c6
BLAKE2b-256 d0111bfe4affde26d22b0692624c05e381407d5bee10d3a0f17bea8d42653926

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.3-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.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 224801452a3b759d9f41c221b7672248f0bd8ee6a8c87a846fcdfe1e9207b637
MD5 2a3c548eace470e9ddb6aa0c82710565
BLAKE2b-256 9fef826b1fcf97d86c798ba353a5deafffc2f1740112b63c9d8f17a636a91f33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 4fbb97dc3e61856dfe823fc0ff24d23aff6efa0f8d32815a74ef54a4a3666cb2
MD5 64cae13448058b58b2c9b628bd85d976
BLAKE2b-256 fc05d6317fa1fe84738eec7c7346dd92ce9078bed57c683cca6fa1dcd0985b8e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blocksolver-0.8.3-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.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 ca29cd4e5f8e453f4f3b9aed947c3c3d6d2f1e8f94f40c5048b40fd7b9170cca
MD5 65375fe7115b99e96a4d29c320081e30
BLAKE2b-256 8684417d1ccdcf8d622c292e5384d3563582790fbfe7115d36b4a5f6e29c0a28

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