Skip to main content

Efficient repeated evaluation of splines at fixed points.

Project description

Python Unit Testing using Conda codecov

cached_interpolate

Efficient evaluation of interpolants at fixed points.

When performing a Bayesian analysis with a stochastic sampler however, one sometimes has to evaluate many interpolants (representing the parameterized model) at the same set of points (the data) with the same knot points.

Evaluating interpolants typically requires two stages:

  1. finding the closest knot of the interpolant to the new point and the distance from that knot.
  2. evaluating the interpolant at that point.

When we have identical knots and evaluation points but different functions being approximated the first of these stages is done many times unnecessarily. This can be made more efficient by caching the locations of the evaluation points leaving just the evaluation of the interpolation coefficients to be done at each iteration.

A further advantage of this, is that it allows trivially parallelising the interpolation using JAX, cupy, or torch.

This package implements this caching for nearest neighbour, linear, and cubic interpolation.

Installation

$ pip install cached_interpolate

Or to install from source:

$ git clone git@github.com:ColmTalbot/cached_interpolation.git
$ cd cached_interpolation
$ pip install .

Demonstration

We can compare the interpolation to the scipy.interpolate.CubicSpline implementation.

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.sort(np.random.uniform(0, 1, 10000))

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic")
sp_interpolant = CubicSpline(x=x_nodes, y=y_nodes, bc_type="natural")

figure, axes = plt.subplots(nrows=2, gridspec_kw={'height_ratios': [3, 1]}, sharex=True)
axes[0].plot(evaluation_points, interpolant(evaluation_points))
axes[0].plot(evaluation_points, sp_interpolant(evaluation_points))
axes[0].scatter(x_nodes, y_nodes, color="k")
axes[1].plot(evaluation_points, interpolant(evaluation_points) - sp_interpolant(evaluation_points))
axes[0].set_ylabel("$y$")
axes[1].set_xlabel("$x$")
axes[1].set_ylabel("$\\Delta y$")
axes[1].set_xlim(0, 1)
plt.tight_layout()
plt.show()
plt.close(figure)

comparison

I note here that we use the "natural" boundary condition. This means that first and second derivatives of the spline vanish at the endpoints. This is different from the default "not-a-knot" boundary condition used in scipy.

We can now evaluate this interpolant in a loop to demonstrate the performance of the caching. At every iteration we change the function being interpolated by randomly setting the y argument. Before the loop, we add an initial call to set up the cache as this will be much slower than the following iterations.

import time

import numpy as np
from scipy.interpolate import CubicSpline

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.random.uniform(0, 1, 10000)

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic")
sp_interpolant = CubicSpline(x=x_nodes, y=y_nodes, bc_type="natural")

interpolant(x=evaluation_points, y=y_nodes)

n_iterations = 1000

start = time.time()
for _ in range(n_iterations):
    y_nodes = np.random.uniform(-1, 1, 10)
    interpolant(x=evaluation_points, y=y_nodes)
stop = time.time()
print(f"Cached time = {(stop - start):.3f}s for {n_iterations} iterations.")

start = time.time()
for _ in range(n_iterations):
    y_nodes = np.random.uniform(-1, 1, 10)
    CubicSpline(x=x_nodes, y=y_nodes, bc_type="natural")(evaluation_points)
stop = time.time()
print(f"Scipy time = {(stop - start):.3f}s for {n_iterations} iterations.")
Cached time = 0.187s for 1000 iterations.
Scipy time = 0.450s for 1000 iterations.

We've gained a factor of ~2.5 over the scipy version without caching. If this is the dominant cost in a simulation that takes a week to run, this is a big improvement.

If we need to evaluate for a new set of points, we have to tell the interpolant to reset the cache. There are two ways to do this:

  • create a new interpolant, this will require reevaluating the interpolation coefficients.
  • disable the evaluation point caching.
import numpy as np
from scipy.interpolate import CubicSpline

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.random.uniform(0, 1, 10000)

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic")
interpolated_values = interpolant(evaluation_points)

new_evaluation_points = np.random.uniform(0, 1, 1000)
interpolant(x=new_evaluation_points, use_cache=False)

Using the code in this way is much slower than scipy and so not practically very useful.

Any array-API-compatible module can be used as the backend parameter, enabling evaluation on GPUs or via JIT compilation. For example, to use cupy on an Nvidia GPU or torch:

import cupy as cp
import numpy as np

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.random.uniform(0, 1, 10000)
evaluation_points = cp.asarray(evaluation_points)

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, backend=cp)
interpolated_values = interpolant(evaluation_points)
import torch
import numpy as np

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = torch.tensor(np.random.uniform(0, 1, 10000))

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, backend=torch)
interpolated_values = interpolant(evaluation_points)

We can now repeat our timing test. To make the use of a GPU more realistic we'll increase the number of evaluation points.

import time

import cupy as cp
import numpy as np
from scipy.interpolate import CubicSpline

from cached_interpolate import CachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.random.uniform(0, 1, 100000)
cp_evaluation_points = cp.asarray(evaluation_points)

interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic")
cp_interpolant = CachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic", backend=cp)
sp_interpolant = CubicSpline(x=x_nodes, y=y_nodes, bc_type="natural")

interpolant(x=evaluation_points)
cp_interpolant(x=cp_evaluation_points)

n_iterations = 1000

start = time.time()
for _ in range(n_iterations):
    y_nodes = np.random.uniform(-1, 1, 10)
    interpolant(x=evaluation_points, y=np.random.uniform(-1, 1, 10))
stop = time.time()
print(f"CPU cached time = {(stop - start):.3f}s for {n_iterations} iterations.")

start = time.time()
for _ in range(n_iterations):
    y_nodes = np.random.uniform(-1, 1, 10)
    CubicSpline(x=x_nodes, y=y_nodes, bc_type="natural")(evaluation_points)
stop = time.time()
print(f"Scipy time = {(stop - start):.3f}s for {n_iterations} iterations.")

start = time.time()
for _ in range(n_iterations):
    y_nodes = np.random.uniform(-1, 1, 10)
    cp_interpolant(x=cp_evaluation_points, y=np.random.uniform(-1, 1, 10))
stop = time.time()
print(f"GPU cached time = {(stop - start):.3f}s for {n_iterations} iterations.")
CPU cached time = 3.367s for 1000 iterations.
Scipy time = 4.213s for 1000 iterations.
GPU cached time = 0.212s for 1000 iterations.

While there are likely more optimizations that can be made and improved flexibility in the implementation, we can see that the GPU version is well over an order of magnitude faster than either of the CPU versions.

RegularCachingInterpolant

For the common case where the knot points are regularly spaced, the RegularCachingInterpolant class is available. It uses an analytical formula to find the nearest knot rather than a binary search, making it faster and fully differentiable through JIT-compiled backends such as jax or torch. It also supports a wider set of boundary conditions for cubic splines: "clamped", "natural", "not-a-knot" (default), and "periodic".

import numpy as np

from cached_interpolate import RegularCachingInterpolant

x_nodes = np.linspace(0, 1, 10)
y_nodes = np.random.uniform(-1, 1, 10)
evaluation_points = np.random.uniform(0, 1, 10000)

interpolant = RegularCachingInterpolant(x=x_nodes, y=y_nodes, kind="cubic")
interpolated_values = interpolant(evaluation_points)

The same backend parameter and loop-with-caching pattern described above apply equally to RegularCachingInterpolant.

If you have any comments/questions feel free to contact me through the issue tracker or a pull request.

Project details


Download files

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

Source Distribution

cached_interpolate-0.4.0.tar.gz (231.0 kB view details)

Uploaded Source

Built Distributions

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

cached_interpolate-0.4.0-cp314-cp314t-win_amd64.whl (278.6 kB view details)

Uploaded CPython 3.14tWindows x86-64

cached_interpolate-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (789.7 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

cached_interpolate-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl (290.4 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

cached_interpolate-0.4.0-cp314-cp314-win_amd64.whl (271.8 kB view details)

Uploaded CPython 3.14Windows x86-64

cached_interpolate-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (760.7 kB view details)

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

cached_interpolate-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (283.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

cached_interpolate-0.4.0-cp313-cp313t-win_amd64.whl (274.7 kB view details)

Uploaded CPython 3.13tWindows x86-64

cached_interpolate-0.4.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (785.9 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

cached_interpolate-0.4.0-cp313-cp313t-macosx_11_0_arm64.whl (287.7 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

cached_interpolate-0.4.0-cp313-cp313-win_amd64.whl (268.2 kB view details)

Uploaded CPython 3.13Windows x86-64

cached_interpolate-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (763.2 kB view details)

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

cached_interpolate-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (280.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cached_interpolate-0.4.0-cp312-cp312-win_amd64.whl (268.4 kB view details)

Uploaded CPython 3.12Windows x86-64

cached_interpolate-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (778.3 kB view details)

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

cached_interpolate-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (281.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cached_interpolate-0.4.0-cp311-cp311-win_amd64.whl (268.9 kB view details)

Uploaded CPython 3.11Windows x86-64

cached_interpolate-0.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (777.9 kB view details)

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

cached_interpolate-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (280.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cached_interpolate-0.4.0-cp310-cp310-win_amd64.whl (268.8 kB view details)

Uploaded CPython 3.10Windows x86-64

cached_interpolate-0.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (747.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

cached_interpolate-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (280.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file cached_interpolate-0.4.0.tar.gz.

File metadata

  • Download URL: cached_interpolate-0.4.0.tar.gz
  • Upload date:
  • Size: 231.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for cached_interpolate-0.4.0.tar.gz
Algorithm Hash digest
SHA256 115c4d305120b98756a2bfc5d3cf532437cc874bec7a69c2ccf43bc0e0fc0cca
MD5 6f0d878eb66bd65e00d9729e1f4a00cc
BLAKE2b-256 be0539f0e344a27c15ad4fbe252e4884b8046ae86d3876d04ea32edf8902efa8

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314t-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 db4e8074a867776f83ef267a0ff257470783f210d1806c15f863227d46f72658
MD5 9282db7d5b7798c23d294d176bf37583
BLAKE2b-256 f9f6ba6402cbe6d2578e43cec3f18bffc4bcf35d45db073ebc7354bfa89c147a

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6979417f6597957e4e0c04b896e9921a4cdddf317d07c169d1fbbeb1507598c6
MD5 11ef250f9b9840936235136276d49f18
BLAKE2b-256 ca73808f01b0670b9dd9418346a236e8b038509a85bc047a08019264b5e2f93b

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82db80f285e8c88147b3e56decb49f66e2503f40eaa0aed5e5a5060fcf6e31b0
MD5 8aa43d98b23c8591ec197b5b6a891c6a
BLAKE2b-256 aa21e22b1e629add66a1a056a9fe2326e4a70a5662e3835a8f4d0034c29f8e6b

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 654e71a03905ca0dc6dc2996b8e172757c13307b3e01cf6d012d3961e48d7f04
MD5 672828bbb6536d39dc6f4f6a28ef2e2a
BLAKE2b-256 4757b56e2fdb0486fff2bff5f77cd1bff31586350efb8db9c26c94d40e67589a

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 379946f897129744f8bade9ec1f4ab34b1882cfc0b19d3062a01e54b8b985bb2
MD5 28efd0b44a897b89541f4dc22f48c13c
BLAKE2b-256 4eab28cd82a936c1950062a7d730c793bd57abb90ee97f3def2b062d651e4104

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8cfd18b90068fb477337563332a4fd7acf12115e1dda8bb67cb8bf221b512b68
MD5 eaf3625891343b273ae77fa4a2b73315
BLAKE2b-256 176923e28fc9e3fd7b0eae08f9beffa99b6e41907c7b8e6a7c3b3084e6e44491

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313t-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 f2516f33ec7b583ac42d4ac7fc769ab65aaaf0fb351f8d27f164507c4a6f6a5e
MD5 e3c36fdcc9937afaf805bb395a3e2ec8
BLAKE2b-256 e4dd5ff05a8c07b3b121094dd9ec423c0ef10b55ae38f63eff012c16ea8decbc

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 87bad926394d6d7f88d29d3995d89300c0cab204b0ad1ab73089a263595c637e
MD5 052ba3aaeced043e927b48783e6a8b1b
BLAKE2b-256 857782fa832c91df1a436c1d8753360f2000079d3a5bde1517bea0de12e4407e

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9774bbf2960c5114d6068f9815411421a571114a4fc70606c90d55c71ec9936c
MD5 db2a71e1411434adb8fad8555038f640
BLAKE2b-256 b8b9a2e6bc5534c4a46cf24a4fed4bf25827271e243380703bac64e1add35aef

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4eb484dc815d14ff017af5b0eb9c29c238210945935b04ad8174af95999f0950
MD5 187e42538a8a313bd9723768a018cd0b
BLAKE2b-256 85a425cef148876fa21c115982280153956925981dcf42db38436b5ed3b337c3

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 13583bb345563cd9aef0986cfa988466f7f8eeebe7ecf3ba07c5ab21b11ba144
MD5 5a80140a5d54893ca9271409b4b4d52d
BLAKE2b-256 8a83f3452be55a358e30fa620bf45b61bb929de8e701b0e82beb558ac9cf67fe

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33fba183c5780d92df9e1cab98945a2bec7f497025a7b61d8b5ee3c566f7998f
MD5 e9fc22008b1b8225e117cf21c1a4156d
BLAKE2b-256 9d6eb3fffbdaf66892cd1201f4ba805dcb63c4aef43f0433ce1751677bd477dd

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3e459b5b388a74001bbbdc78fe699d97cb0b295ffeec47377d297c654fb8fede
MD5 14ab890830c577293fc3b4c2f42f01fe
BLAKE2b-256 88be3c2eff1af0d43c28d79ad6013aafb02459e49efecc4a1f56064aa1555ac1

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 17ff4f9dc6eb3013b39a6e5c1ca41cf1bccf51224b853fdabd301f3c84996f9a
MD5 eda1e0a0b6bae170e9d3213f0fc9afaa
BLAKE2b-256 b83a367f829d33754252d319b5c97755433563b151b286a29cea296e4b3e335c

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c6b576f675848f114cfc3f722ca7de0400bf334999a725e0289dd54975db40f4
MD5 3dfa5b814aa72417f76575465b29d734
BLAKE2b-256 9a1851468874a3cd1fdabbdc2778f6c0555cd4344131ebb8d1fe08b581151679

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6d450056ecd77fd3c5a29aa04dfd82b919bdd17bf2a3d91724674f1c521c1a3e
MD5 e871945a4a33ee7bf2b5bbe90e90b547
BLAKE2b-256 1f40361201c816fb99811f8bfb1ea057f971efcc4b02b6bd02f023c264edc3e8

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aadd56c58e94abbd6ddfeec8dc25ad983035c359762849274a65bf2649d44acb
MD5 fa9c57b0717c837775a7e008ad37e795
BLAKE2b-256 d83947b2a112c076a825afbf965bc682e0ca773293e2468ea20a6d93f1a959b4

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd8f6493b54a4904655441fdd39be3f0e2168bb048b8c28b75c27adf10e3f753
MD5 a50b12b0a2942daf1ea861c49c67262f
BLAKE2b-256 af5dc5071cb9473e5d1761e35ad9b11eb4eddf04ddcc662b27b66189757d58f4

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 83a8eed12ff7794a56a4a954e28a9c5f5e680fbed349b549afc703594082f8aa
MD5 cee8884007d04bafd18d16257c62e54e
BLAKE2b-256 64c00b9d3bb869b88bd381ba68e036793a2f4ff7af7c7e50cf0e20c813b34568

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c46f3101742f9af8b6742c0ceec813f96bc574c5d072adc9d16940be4d73a0f5
MD5 b6db4af24f7af883c6aa888d8951fcf2
BLAKE2b-256 be7fe5984c51e0d41f6e84d639ff785c45cb283b256ece74a772f45c318c5aad

See more details on using hashes here.

File details

Details for the file cached_interpolate-0.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cached_interpolate-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 97f1b43d27ab9a43b8558450fba93b3ed92daf19aeb1e3b4e7b4b635c298ef94
MD5 b6e60ae1465325bbc06378023158e0e6
BLAKE2b-256 08131681935f5068b7c16495cf52e25ad1fedd0673fd2963d7127d186987c3b2

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