Skip to main content

a KLU solver for JAX

Project description

KLUJAX

version: 0.5.0

A sparse linear solver for JAX based on the efficient KLU algorithm.

CPU & float64

This library is a wrapper around the SuiteSparse KLU algorithms. This means the algorithm is only implemented for C-arrays and hence is only available for CPU arrays with double precision, i.e. float64 or complex128.

Note that float32/complex64 arrays will be cast to float64/complex128!

Basic Usage

The klujax library provides a basic function solve(Ai, Aj, Ax, b), which solves for x in the sparse linear system Ax=b, where A is explicitly given in COO-format (Ai, Aj, Ax).

NOTE: the sparse matrix represented by (Ai, Aj, Ax) needs to be coalesced! KLUJAX provides a coalesce function (which unfortunately is not jax-jittable).

Supported shapes (? suffix means optional):

  • Ai: (n_nz,)
  • Aj: (n_nz,)
  • Ax: (n_lhs?, n_nz)
  • b: (n_lhs?, n_col, n_rhs?)
  • A (represented by (Ai, Aj, Ax)): (n_lhs?, n_col, n_col)

KLUJAX will automatically select a sensible way to act on underdefined dimensions of Ax and b:

dim(Ax) dim(b) assumed shape(Ax) assumed shape(b)
1D 1D n_nz n_col
1D 2D n_nz n_col x n_rhs
1D 3D n_nz n_lhs x n_col x n_rhs
2D 1D n_lhs x n_nz n_col
2D 2D n_lhs x n_nz n_lhs x n_col
2D 3D n_lhs x n_nz n_lhs x n_col x n_rhs

Where the A is always acting on the n_col dimension of b. The n_lhs dim is a shared batch dimension between A and b.

Additional dimensions can be added with jax.vmap (alternatively any higher dimensional problem can be reduced to the one above by properly transposing and reshaping Ax and b).

NOTE: JAX now has an experimental sparse library (jax.experimental.sparse). Using this natively in KLUJAX is not yet supported (but converting from BCOO or COO to Ai, Aj, Ax is trivial).

Basic Example

Script:

import klujax
import jax.numpy as jnp

b = jnp.array([8, 45, -3, 3, 19])
A_dense = jnp.array(
    [
        [2, 3, 0, 0, 0],
        [3, 0, 4, 0, 6],
        [0, -1, -3, 2, 0],
        [0, 0, 1, 0, 0],
        [0, 4, 2, 0, 1],
    ]
)
Ai, Aj = jnp.where(jnp.abs(A_dense) > 0)
Ax = A_dense[Ai, Aj]

result_ref = jnp.linalg.inv(A_dense) @ b
result = klujax.solve(Ai, Aj, Ax, b)

print(jnp.abs(result - result_ref) < 1e-12)
print(result)

Output:

[ True True True True True]
[1. 2. 3. 4. 5.]

Advanced Usage

For high-performance applications like transient simulations or iterative solvers, you should avoid using the high-level klujax.solve function. The klujax.solve is in fact a wrapper around three distinct parts of the KLU algorithm:

  1. Analyze (Symbolic): Inspects the sparsity pattern ($A_i, A_j$) to find optimal permutations and block triangular forms. This depends only on the structure of the matrix.
  2. Factorize (Numeric): Performs the actual LU decomposition. This depends on the values ($A_x$) and requires a symbolic handle.
  3. Solve (Numeric): Executes forward and backward substitution to find $x$. This depends on the right-hand side ($b$) and requires a numeric handle.

Significant performance gains are achieved by hoisting the "Analysis" or "Factorization" steps out of your inner loops.

1. High-Performance Transient Pattern (Reusing Symbolic)

In a simulation where the sparsity pattern is constant but the values ($A_x$) and right-hand side ($b$) change, you should perform the expensive analyze step exactly once outside your JIT loop.

import jax
import klujax

# 1. Analyze once in Python (CPU)
# Returns a KLUHandleManager that automatically cleans up C++ memory
symbolic = klujax.analyze(Ai, Aj, n_col)

@jax.jit
def simulation_step(Ax_t, b_t, sym):
    # 2. Use the symbolic handle inside JIT
    # The solver will perform numeric factorization and solve
    return klujax.solve_with_symbol(Ai, Aj, Ax_t, b_t, sym)

for t in range(steps):
    x_t = simulation_step(Ax[t], b[t], symbolic)

Fine-Grained Control (Numeric Factorization)

If you need to solve the same system with many different $b$ vectors while the matrix $A$ remains constant, you can further split the numeric factorization. This is often performed in a modified Newton-Raphson loop where the computationally expensive jacobian+factorization is only evaluated once and the solve stage is deemed "cheap" in comparison

# Factorize the matrix once
numeric = klujax.factor(Ai, Aj, Ax, symbolic)

@jax.jit
def fast_solve(b_t, num, sym):
    # This call is extremely fast as it skips factorization entirely
    return klujax.solve_with_numeric(num, b_t, sym)

for i in range(100):
    x_i = fast_solve(b_batch[i], numeric, symbolic)

Lifecycle & Pointer Pitfalls

Because klujax.analyze and klujax.factor generate KLUHandleManager objects which wrap low level C++ pointers, there are strict rules for avoiding memory leaks and segmentation faults.

The "Ghost Pointer" Problem inside JIT:

JAX's jit works by tracing your code. During tracing, Python objects like the KLUHandleManager are converted into symbolic Tracers.

  • Outside JIT: The KLUHandleManager uses RAII (Resource Acquisition Is Initialization). When the Python variable is deleted or goes out of scope, the C++ memory is freed automatically.

  • Inside JIT: If you create a handle (via analyze or factor) inside a JIT-compiled function, the Python manager is "lost" during the conversion to XLA. XLA will allocate the C++ memory at runtime, but it will never call the free function.

The Fix: Explicit Destruction with Dependencies

If you must create a handle inside JIT, you must manually call free_symbolic or free_numeric inside that same function. To prevent the compiler from freeing the pointer before the solve is finished, you must pass the solution as a dependency.

@jax.jit
def dynamic_solve(Ai, Aj, Ax, b):
    # 1. Born inside JIT (No automatic cleanup!)
    sym = klujax.analyze(Ai, Aj, 5)

    # 2. Compute solution
    x = klujax.solve_with_symbol(Ai, Aj, Ax, b, sym)

    # 3. CRITICAL: Force XLA to free 'sym' ONLY AFTER 'x' is ready
    klujax.free_symbolic(sym, dependency=x)

    return x

Summary of Best Practices

  1. Hoist Creations: Always try to call analyze or factor outside of JIT blocks.

  2. One Manager, One Free: Do not manually call free_symbolic(manager) and then let the manager go out of scope; it will attempt a double-free (though the library has safeguards to prevent a crash).

  3. Check for Warnings: If you see a UserWarning: Allocating KLU handle inside JIT, your code is currently leaking memory. Use the dependency pattern shown above to fix it.

Installation

The library is statically linked to the SuiteSparse C++ library. It can be installed on most platforms as follows:

pip install klujax

There exist pre-built wheels for Linux and Windows (python 3.8+). If no compatible wheel is found, however, pip will attempt to install the library from source... make sure you have the necessary build dependencies installed (see Installing from Source)

Installing from Source

NOTE: Installing from source should only be necessary when developing the library. If you as the user experience an install from source please create an issue.

Before installing, clone the build dependencies:

git clone --depth 1 --branch v7.2.0 https://github.com/DrTimothyAldenDavis/SuiteSparse suitesparse
git clone --depth 1 --branch main https://github.com/openxla/xla xla
git clone --depth 1 --branch stable https://github.com/pybind/pybind11 pybind11

Linux

On linux, you'll need gcc and g++, then inside the repo:

pip install .

MacOs

On MacOS, you'll need clang, then inside the repo:

pip install .

Windows

On Windows, installing from source is a bit more involved as typically the build dependencies are not installed. To install those, download Visual Studio Community 2017 from here. During installation, go to Workloads and select the following workloads:

  • Desktop development with C++
  • Python development

Then go to Individual Components and select the following additional items:

  • C++/CLI support
  • VC++ 2015.3 v14.00 (v140) toolset for desktop

Then, download and install Microsoft Visual C++ Redistributable from here.

After these installation steps, run the following commands inside a x64 Native Tools Command Prompt for VS 2017:

set DISTUTILS_USE_SDK=1
pip install .

License & Credits

© Floris Laporte 2022, LGPL-2.1

This library was partly based on:

This library vendors an unmodified version of the SuiteSparse libraries in its source (.tar.gz) distribution to allow for static linking. This is in accordance with their LGPL licence.

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.

klujax-0.5.0-cp314-cp314-win_arm64.whl (160.4 kB view details)

Uploaded CPython 3.14Windows ARM64

klujax-0.5.0-cp314-cp314-win_amd64.whl (188.7 kB view details)

Uploaded CPython 3.14Windows x86-64

klujax-0.5.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

klujax-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

klujax-0.5.0-cp314-cp314-macosx_11_0_arm64.whl (241.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

klujax-0.5.0-cp313-cp313-win_arm64.whl (155.1 kB view details)

Uploaded CPython 3.13Windows ARM64

klujax-0.5.0-cp313-cp313-win_amd64.whl (184.8 kB view details)

Uploaded CPython 3.13Windows x86-64

klujax-0.5.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

klujax-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

klujax-0.5.0-cp313-cp313-macosx_11_0_arm64.whl (241.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

klujax-0.5.0-cp312-cp312-win_arm64.whl (155.1 kB view details)

Uploaded CPython 3.12Windows ARM64

klujax-0.5.0-cp312-cp312-win_amd64.whl (184.8 kB view details)

Uploaded CPython 3.12Windows x86-64

klujax-0.5.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

klujax-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

klujax-0.5.0-cp312-cp312-macosx_11_0_arm64.whl (241.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

klujax-0.5.0-cp311-cp311-win_arm64.whl (155.6 kB view details)

Uploaded CPython 3.11Windows ARM64

klujax-0.5.0-cp311-cp311-win_amd64.whl (184.0 kB view details)

Uploaded CPython 3.11Windows x86-64

klujax-0.5.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ x86-64manylinux: glibc 2.28+ x86-64

klujax-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (2.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.26+ ARM64manylinux: glibc 2.28+ ARM64

klujax-0.5.0-cp311-cp311-macosx_11_0_arm64.whl (242.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file klujax-0.5.0-cp314-cp314-win_arm64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp314-cp314-win_arm64.whl
  • Upload date:
  • Size: 160.4 kB
  • Tags: CPython 3.14, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp314-cp314-win_arm64.whl
Algorithm Hash digest
SHA256 6ab458b4aef332b52b96fca5bb6eba10dfdbc217d31f53579c07ac4f11f8d280
MD5 325d86c1c3654e521bf9a0cf22d032af
BLAKE2b-256 7ae656d4fe469c512cfdd246981f8b0971bdc44cf575e85e12b53767c9027c66

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 188.7 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9f2b57aaf480b9d09297342f38ff2b1786b84195db2bf29af5cb9f1b24cfd084
MD5 1088a46ade94a28753788f79cb69ddea
BLAKE2b-256 eb6a74232bb22ce41a640941623c4baeea1a7243fc18834a6166c8c24d5c2510

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 78aabd28317dc0f3c7026e43101eb66fa3c3838dc5ca225c6187493de2542b6c
MD5 8ec1a121149e4ebc438044ff2ba4d723
BLAKE2b-256 3703c6feea229b9d5aab9523a56733a9e939ee7890dcddf95deea0b8dd9213f4

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5770e81afaa183688f0253264d85cd2f25881ac358dc62a88425213054a2db01
MD5 78ab748998e890cdcff155588b7e9b67
BLAKE2b-256 75c30fd07626e2bb8cf79fb9e886b1196926e761212bdfcdbd8af68ed1da3581

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b21164e6f1937068566402c51d8cafa5f77dd284358ff51183bd7cf5029033b8
MD5 86b99ad3c8336873d7a4ebc8730ab6f4
BLAKE2b-256 fd8b0522208c5dc76a9f9e49dde3666232d034b45d60c98744f1669a4b57cdbc

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp313-cp313-win_arm64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp313-cp313-win_arm64.whl
  • Upload date:
  • Size: 155.1 kB
  • Tags: CPython 3.13, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 d1e2abf2ffd1600b31b34ea64c27ccdc13403ae3fd2421ee4e13decc0ff50617
MD5 9299fca417a9389fa7b28bbb7c07c3fe
BLAKE2b-256 02c861c2192dd1ec7c42d3d00f89b4be479c4d83cde1d9324759095a09fcdc8c

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 184.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 33a4193cd2996143ed0d294bf71cc3a12d7992d9b23241c9152680b681807cf1
MD5 eda2ad891a6ac5a8a48154dcee0aea9e
BLAKE2b-256 c512df7c69f7850db9c8e808c81817ae9204cf060c995ce091e5b499f9b9330a

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 172a96f36143b469fdfcf0517867e5b49f3723dc70d75d244cf65ed0f424f3bf
MD5 d1de7932d0a07a573afa73538bfcd3fe
BLAKE2b-256 914ff04316561a244902afeca04bbf0ee6eafff470733030b13f886d589b0ee7

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b3bbe2f16864f473eb77445ef287ead80c9f47fc0849d05b041453ba62bed501
MD5 41899b1fd0d6e5ba30b20d9d5862b197
BLAKE2b-256 c19326a4ed1db29f1d3421ae4e2a5668be3230d8b15f03cce6117f8f67466fc6

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 39313aab26cd8e9ca3481e700d66d41068a625c106f4779c53caf5a680a1dbfc
MD5 1aca88cb4569e225f2e3856a677f19b8
BLAKE2b-256 611764196d979e7c73e3c58da9f891efa7ace6c5ec55240acf0563661234d2e8

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp312-cp312-win_arm64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp312-cp312-win_arm64.whl
  • Upload date:
  • Size: 155.1 kB
  • Tags: CPython 3.12, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 f4198d9973958246c9c8282004ee4053f36af3a000b9d7960b9aeb705362ee4a
MD5 e9b961a484b8517b574f02123ac7dceb
BLAKE2b-256 0702f232f8801c9aaa069c3ae5e56e66222561a6e9fd38a627fb0c5a792dc22b

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 184.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fd2b664224a9f5935a4961d978ec9b40fc92fb35e78113ec0e8026be95132efe
MD5 d0502c5cfa6483dd273a927375f30b2c
BLAKE2b-256 5f2648ed386475225905033f293ad67c48ccb83368b23192a0dc9f6272cdb59a

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ea9668b52e6791345796470fba4a903113d2eef19ca03b58aaa54e76444522c5
MD5 d48dda3a24ecbb976b7c9011a18d62df
BLAKE2b-256 aa4359c8680bce1005bb0247d4d4291d1862f62ac12e1bca984f22920b97996d

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2c986f7c0ececf3618241475a73f83975f883937f6e38ec078f3c2337575006b
MD5 423a3baebcbbf13399d6f407c9ee6774
BLAKE2b-256 be9b69ffcb2562b2ead851b17d4c4688586d538fe1469c48f29f0d3e3a3db8f1

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b18a26a5a0eebb35eb601af755c77830871b7336c782d6a50022e875d4f8d0ba
MD5 12ce7cb4208f6047a69ec2b5c427564b
BLAKE2b-256 c2a7d23e325e450be5dbf95a76638e2eb598eb8aff23cf934063eba3800a5be1

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp311-cp311-win_arm64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp311-cp311-win_arm64.whl
  • Upload date:
  • Size: 155.6 kB
  • Tags: CPython 3.11, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 43322fc8cd6aa44e2ad0026c9a49cd20bbd2734950f1fdd9eaba9e08d19beb52
MD5 293aacb75561d80d9b0b82aade48f060
BLAKE2b-256 df237311d38fafae0923d95ad3931305d80a69a2c5cd3d66e8089a47eebf5cf2

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: klujax-0.5.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 184.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for klujax-0.5.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c49b3620918c896b29b8e407e38e15fb2ded135672dab1b24a667e396254a7d9
MD5 49ac71873093f9eea162f307cc00a678
BLAKE2b-256 2590ee6a3b7ed345753b95c13d0e93fdc38fd193a6d3d0390699d7458bf27eec

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4d9bba3a9e017ed360919a9d8b09c6dc535d61f31e433ae1fea83736c914e877
MD5 248c5d157d9bb60345b2c9159ff73036
BLAKE2b-256 d9d5c365f2981784212fbd16c33b08019829f601da966f86ca6ff1d4baa731b5

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 edfa2c18c1fc34a4a87446acb1abc77372dd6e50689be65599b3fc866ea5e9fd
MD5 f9a5d0d9049f2828570ddad44950477b
BLAKE2b-256 6c092ba8315ad8143d6d091ae01241c5d7deb423ccf5a76d8fdb04bb460a85ee

See more details on using hashes here.

File details

Details for the file klujax-0.5.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for klujax-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd9f68ce243087ec277012f49781780fa8eb9fdba94ecbe8d12197649eec329c
MD5 98cc7d25e83d74d8132e8402880915a4
BLAKE2b-256 93b8e86ef0cc346463103a1f5fa003cedba9948db047db7cc82b0aa0cf1eb5aa

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