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

Uploaded Python 3

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 15.0+ x86-64

blocksolver-0.8.4-cp313-cp313-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 15.0+ x86-64

blocksolver-0.8.4-cp312-cp312-macosx_14_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

blocksolver-0.8.4-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.4-cp311-cp311-macosx_10_9_universal2.whl (172.3 kB view details)

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

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

Uploaded CPython 3.10Windows x86-64

blocksolver-0.8.4-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.4-cp310-cp310-macosx_10_9_universal2.whl (170.6 kB view details)

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

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

Uploaded CPython 3.9Windows x86-64

blocksolver-0.8.4-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.4-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.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

Hashes for blocksolver-0.8.4-py3-none-any.whl
Algorithm Hash digest
SHA256 83267535b3497aa1bb6c341df13d47bf335fba1ccc1022e053871cf83226436a
MD5 a7886727c830ffedb40c119975b7466c
BLAKE2b-256 12e7b42b4482263417479fc24ef5109f1e1bfdf3ab89b446ba438421c9e239c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c3ceb94837384a757349308b6bd1119936dba826dac5dce49b68dcb968594165
MD5 799d93d7c9fe8395a121aaac78dfcecb
BLAKE2b-256 f4b9b221a5e3eaf04783bbd83ef25ff4290006dc29740a8c8468b9cb32ebffb9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ffab7bc300088b5af1357e3a712d2aca9a6ae329b99be29e7c8ffdf0878f2a08
MD5 db6d10230e2876dd2861ac54d6041858
BLAKE2b-256 0ec138f6631cb58622cbfd0ce58f892ec8b8171455edae92a518463839c757ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 8f956dabff46c76517842f371901b5c25af56122fdeaf3246ca973df094312f6
MD5 e3be97a685f0a59fce26e07784844af6
BLAKE2b-256 fb4935702085b93e4499791a025b0041b3534a379b52750c1558e431f7b9e741

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp313-cp313-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 50978e3adebb9fad2377e3dea751d9e648c86133e50c135ea537de0fe8022145
MD5 9501a83c5ef6aef58be365fd643553c8
BLAKE2b-256 9c370f98b54dc7f7f58f1f0f95f9cdec84a81ac1b85473d6189dfeacb11ba674

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 6ffb5eb6c39e40eb57f79c655d3328cc1a9f6e50f61e8654aaeeac126ad0544f
MD5 58cd414827fa652f224ed41d8b9ce022
BLAKE2b-256 36956a96f9ae5e4f282a6272438da04972770a80bd13e9ae04aadbd6ad42c892

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8d0d1bff7df8e08b6adb2b2e925df1a9bd3e19599e1a8ea7b8b9c87dc82b2633
MD5 741768e5d91ed2716d38dc079d146848
BLAKE2b-256 530d2886c05e0ea48552b4d6b3a806159ec303db06ead029bbae9d42d33c991a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 926e6854d98d8de1c4d4a844898aa2721008b1d80573eb2fd7569c54fc6b5145
MD5 765a00dd3d31324fb132fcb481ee6119
BLAKE2b-256 dbc0184d86fdab2ac35bd6b8f5fb02b165f29108f1259b44caaffbf4bf2a92ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp312-cp312-macosx_15_0_x86_64.whl
Algorithm Hash digest
SHA256 56084d76a511757725a4f1ca9f44c8df521806156667951826e18618fe98d833
MD5 d4501d8c325631150fa2e7b941133933
BLAKE2b-256 bc205e24c782ee34ced0196c656dbfd2b8d8f0f6f1a5416dcfcaf3792ceae371

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 63c479820e75316fa9e3d4fd4999c08a75d92e32daaf9917c0922a667e5ddf32
MD5 b0d12dd10e30302dc4d3394160491f9b
BLAKE2b-256 683a451a1cd8ac1f7d9c7380d60bc0be2c42fa77b565908dd852563a166b3e14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ff86434cbea0d7f8975c9c98c44c7e68cefb5f6d32c0c2fe706300e828247b5f
MD5 5c91980ecce7284caaa77a581abcaab1
BLAKE2b-256 13fa99ae945bb6f5beac8694cdd09a94468c171eaa89872ade5a173939348f1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c02fc21f08ad32448c785016744f76820d28c0dafc9ad1dd0d45abe1bb6a7ae5
MD5 5e22034947458a3fd09b367c38fc30ce
BLAKE2b-256 2cab2e9a43c8c55540511b51f364c9fc0fb3d35d92cee73c8e807c9d0504e96a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 3d131f74e287f6591a7f34a7b55bf7a19e4a62c75a277680f839460c18cb2efc
MD5 d37c4f3f3b76727b4392f3abf7105df7
BLAKE2b-256 fd51ad2e0ea70b9506b6bf538387cb71f9af05b68f35ec4cfea1a321d3e2e1c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8f06aa746173f6b8abf60102ba3cce6e3377603139ec999960c712c43ed6fb36
MD5 cc5279b3491526ca9dfa97b4281f57aa
BLAKE2b-256 6a7ce69fd5e47c294e929eb5277354dd83692034f70b523628a749d85e6fe183

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e3f1adc7108d96411adc6ce599d6d293419cb8a025c7da6749b157818e424c50
MD5 c6cd8a4196176829fbdfc0f5e79f0d5f
BLAKE2b-256 242fd6cd6e11141d06fa4a7faaee75ef0021c01a4ad586781271eeabeafc98dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a100dadab68e121e4d1b96b41df062534bf7c9a0d26f86bebc4432f8c03e75fe
MD5 bba272373ae539948e69257aca1e5f36
BLAKE2b-256 3dc81fc0ba3134dbbbae9ce969f174a4978a39c22ab409404bdc851efe5101c5

See more details on using hashes here.

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

Hashes for blocksolver-0.8.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8a3a361098f20a57d02cfe784fd27f5c65df0b365425c6f9852742cbe7e4b69c
MD5 d3e7611fe2a65e90559c44fff02eddd4
BLAKE2b-256 1767a708d556539b2d6c471cc953b0a88ef1a087a782c19e95f399b91a39cf4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for blocksolver-0.8.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d0641d7714c67a48ae0408ea7446ba320d53d7a9164306f3e3024bfbf11dcc77
MD5 0a810c4ecab2566e89a0dd5127f98912
BLAKE2b-256 02864438e4d35a459d76859fe27ff76188d240f2bc55ec612ecadefc22ce7dda

See more details on using hashes here.

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

Hashes for blocksolver-0.8.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 87b094fee3da2ecea845319dbee9ab6e7ab7647f736f0016ba88c40d95bd5433
MD5 6519d5a49d8eabb868bd4ffad7ed95e9
BLAKE2b-256 34c037cbb743f46995390646923905a76c553ce2cca84eadc68dd7e211d16290

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