Skip to main content

ndpolator: fast, n-dimensional linear interpolation and extrapolation on sparse grids

Project description

GitHub commit activity GitHub last commit GitHub Issues or Pull Requests GitHub Pull Requests GitHub Actions Workflow Status Documentation Dependabot Dependabot PRs

Ndpolator

Fast, n-dimensional linear interpolation and extrapolation on sparse grids.

Ndpolator is a combined interpolator/extrapolator that operates on sparse (incompletely populated) $n$-dimensional grids. It estimates scalar or vector function values within and beyond the definition range of the grid while still avoiding the need to impute missing data or sacrifice the benefits of structured grids. Ndpolator is written in C for speed and portability; a python wrapper that uses numpy arrays is provided for convenience.

Recent changes

ndpolator 1.3.0

  • implements kd-tree lookup of nearest vertices and/or hypercubes. The search speed for kd-trees is O(logN), where N is the number of vertices; compared to the previous linear search that has O(N) dependence, this provides a significant speed increase in extrapolation. For example, for a 3D 50x50x50 grid, the speed-up is ~500.

  • adds NDP_METHOD_LINEAR and NDP_METHOD_KDTREE options to ndpolator() and ndp_find_nearest() methods.

ndpolator 1.2.3

  • extrapolating with extrapolation_mode='nearest' when two or more points were at the exact same distance (within machine precision) did not consistently select the same point on all architectures, causing potential inconsistencies across different machines.

ndpolator 1.2.2

  • docbuild moved from PR actions to release action.

  • an incorrect argument name in unit tests fixed.

ndpolator 1.2.1

  • the computation of distance between the query point and the grid was not done correctly in off-grid vertices; fixed.

  • the find_nearest() function now stores an array of nearest points sorted by distance.

ndpolator 1.2

  • distance between the query point and the grid for off-grid query points is now explicitly computed and returned.

  • github workflows substantially improved.

ndpolator 1.1

  • memory management improvements.

ndpolator 1.0

  • initial release.

Installation

Ndpolator sources are hosted on pypi; you can install the latest release by issuing:

pip install ndpolator

To install ndpolator from github, clone the repo and install it from the local directory with pip:

$> git clone https://github.com/aprsa/ndpolator ndpolator
$> cd ndpolator
$> pip install .

Once installed, you can test the installation by running a pytest:

$> cd tests
$> pytest

Documentation

API reference is available on gh-pages.

Usage example

To demonstrate the usage of ndpolator, let us consider a 3-dimensional space with three axes of vastly different vertex magnitudes. For comparison purposes, let the function that we want to interpolate and extrapolate be a linear scalar field:

\mathbf a_1 = \{1000, 2000, 3000, 4000, 5000\}, \quad \mathbf a_2 = \{1, 2, 3, 4, 5\}, \quad \mathbf a_3 = \{0.01, 0.02, 0.03, 0.04, 0.05\},
\mathbf F(x, y, z) = \frac{x}{1000} + y + 100 z.

A suitable ndpolator instance would be initiated and operated as follows:

import numpy as np
import ndpolator

# initialize the axes:
a1 = np.linspace(1, 5, 5)
a2 = np.linspace(10, 50, 5)
a3 = np.linspace(100, 500, 5)

# initialize interpolation space:
ndp = ndpolator.Ndpolator(basic_axes=(a1, a2, a3))

# define a scalar function field and evaluate it across the grid:
def fv(pt):
    return pt[0] + pt[1] + pt[2]

grid = np.empty((len(a1), len(a2), len(a3), 1))
for i, x in enumerate(a1):
    for j, y in enumerate(a2):
        for k, z in enumerate(a3):
            grid[i, j, k, 0] = fv((x, y, z))

# label the grid ('main') and register it with the ndpolator instance:
ndp.register(table='main', associated_axes=None, grid=grid)

# draw query points randomly within and beyond the definition ranges:
query_pts = np.ascontiguousarray(
    np.vstack((
        np.random.uniform(-5, 5, 10),
        np.random.uniform(-50, 50, 10),
        np.random.uniform(-500, 500, 10))
    ).T
)

# interpolate and extrapolate linearly:
interps = ndp.ndpolate(table='main', query_pts=query_pts, extrapolation_method='nearest')

print(f'a1 = {a1}')
print(f'a2 = {a2}')
print(f'a3 = {a3}')
print(f'query_pts = {query_pts}')
print(f'interps = {interps}')

Purpose

Multi-variate ($n$-dimensional) interpolation and extrapolation are techniques used in mathematics, statistics and science to estimate unknown values between and beyond existing data points in a multi-dimensional space. Interpolation involves estimating the function value at points within the range determined by the existing data points, while extrapolation involves estimating the function value beyond that range. There are numerous robust implementations of multi-variate interpolation, including k nearest neighbors (Cover & Hart 1967), natural neighbor interpolation (Sibson 1981), radial basis functions (Hardy 1971), kriging (Cressie 1990), and many others. Scipy, for example, features an entire module for interpolation (scipy.interpolate) that implements several multi-variate interpolation classes, including piecewise-linear, nearest neighbor, and radial basis function interpolators. Unfortunately, none of the implemented scipy methods lend themselves readily to extrapolation: at most they can fill the values off the convex hull with nans or a value supplied by the user. In addition, interpolators that operate on a regular $n$-dimensional grid do not allow any missing data; those values either need to be imputed by using unstructured data interpolators, or structured data interpolators need to be abandoned altogether.

Ndpolator aims to fill this gap: it can both interpolate and extrapolate function values within and beyond the grid definition range, and it can operate on incomplete grids. As a side benefit, ndpolator can estimate both scalar and vector function values, and it can reduce grid dimensionality for points of interest that lie on grid axes. It is optimized for speed and portability (the backend is written in C), and it also features a python wrapper. Ndpolator was initially developed for the purposes of the eclipsing binary star modeling code PHOEBE (Prša et al. 2016), to allow the interpolation and extrapolation of specific intensities in stellar atmospheres. Yet given the gap in the multi-variate interpolation and extrapolation landscape, ndpolator development has been separated from PHOEBE and made available to the community as a standalone package.

Ndpolator's operation principles

Consider a scalar or a vector field $\mathbf{F}$ that is sampled in a set of $N$ $n$-dimensional points, $\{\mathbf F (x_1, \dots, x_n)_k\}$, $k = 1 \dots N$. Let these function values be sampled on a grid, where axes $\mathbf{a}_k$ span each grid dimension, so that $\mathsf{X}_{k=1}^{n} \mathbf a_k \equiv \mathbf{a}_1 \times \mathbf{a}_2 \times \dots \times \mathbf{a}_n$ is a cartesian product that spans the grid. Axis spacing need not be uniform: vertices can be separated by any amount that is required to make the grid sufficiently locally linear. If the grid is complete, i.e. if there is a function value $\mathbf F(x_1, \dots, x_n)$ associated with each grid point, we have $N_c = \prod_k l(\mathbf a_k)$ function value samples, where $l(\mathbf a)$ is the length of axis $\mathbf a$. If the grid is incomplete, i.e. if some function values are missing, then $N < N_c$. Ndpolator defines grid points with sampled values as nodes, and grid points with missing values as voids. The points in which we want to estimate the function value are called query points or points of interest. The smallest $n$-dimensional subgrid that encloses (or is adjacent to) the query point is called a hypercube.

Unit hypercube transformation

The first, most fundamental principle of ndpolator is that all interpolation and extrapolation is done on unit hypercubes. In real-world applications, it is seldomly true that all axes are defined on a unit interval. This can lead to vertices of significantly different orders of magnitude along individual axes. To that end, ndpolator first normalizes the hypercubes by transforming them to unit hypercubes: given the sets of two consecutive axis values that span a hypercube, $(\mathbf a_{1,p}, \mathbf a_{1,p+1}) \times (\mathbf a_{2,q}, \mathbf a_{2,q+1}) \times \dots \times (\mathbf a_{n,t}, \mathbf a_{n,t+1})$, the unit transformation maps it to the $[0, 1] \times [0, 1] \times \dots \times [0, 1] \equiv [0, 1]^n$ hypercube. All query points are subjected to the same transformation, creating unit-normalized query points. Therefore, interpolation (and extrapolation) always operates on unit hypercubes, which is computationally the least expensive and numerically the most stable process. An additional benefit of this transformation is that extrapolation inherits the nearest hypercube's grid spacing, thus naturally accounting for (potentially) variable spacing in different regions of the grid.

Sequential dimensionality reduction

The second operating principle of ndpolator is sequential dimensionality reduction. Consider a 3-dimensional hypercube in \autoref{fig:interpolation}; let us assume that function values in all 8 corners of the hypercube are sampled, i.e. we have 8 nodes. The point of interest is depicted with an open symbol in the left panel, along with projections onto the hypercube faces. Ndpolator starts with the last axis, in this case $\mathbf a_3$, and it interpolates function values along that axis to the projections of the point of interest (second panel). These are univariate interpolations. The process yields 4 vertices (depicted in open symbols), thereby reducing the initial dimension $N=3$ by 1, to $N-1=2$. The process is then repeated (third panel), this time along the second axis, $\mathbf a_2$, yielding 2 vertices, thereby reducing the dimension to 1. Finally, the last interpolation is done along axis $\mathbf a_1$ (right panel), yielding a single vertex, the point of interest itself. The dimension is thus reduced to 0, and the function value is determined. Thus, for an $n$-dimensional hypercube, ndpolator performs $\sum_{k=0}^{n-1} 2^k$ univariate interpolations to estimate $\mathbf F$ in the point of interest, which implies the $N \log N$ time dependence.

An example of sequential dimensionality reduction in 3 dimensions.\label{fig:interpolation}

Initial dimensionality reduction

The third operating principle of ndpolator is initial dimensionality reduction. In real-life applications it frequently happens that some of query point coordinates are aligned with the axes. For example, one of the axes might allow the variation of the second order variable, but its value usually defaults to the value that is sampled across the grid. When this happens, the initial hypercube dimension can be reduced by 1 for each aligned axis. The extreme case where the query point coincides with a node means that hypercube dimensionality is reduced to 0, and there is no need for interpolation. For that reason, ndpolator flags each coordinate of the query point as "on-grid", "on-vertex", or "out-of-bounds". When "on-vertex," hypercube dimension can be immediately reduced. When that happens, the time dependence is reduced to $(N-M) \log (N-M)$, where $M$ is the number of coordinates aligned with the axes.

Incomplete hypercubes

The fourth operating principle of ndpolator is dealing with incomplete hypercubes. If any of the hypercube corners are voids, we cannot interpolate. For that purpose, ndpolator keeps track of all fully defined $n$-dimensional hypercubes; when a query point lies within an incomplete hypercube, ndpolator finds the nearest fully defined hypercube and uses it to extrapolate the function value in the point of interest. While this is globally still considered interpolation as the query point is within the grid's definition range, the estimated function value is, strictly speaking, extrapolated from the nearest fully defined hypercube. Note that, when grids are particularly sparse and functios strongly non-linear, that can cause a substantial accumulation of error. In such cases, unstructured interpolation techniques might be a better fit.

Extrapolation modes

The fifth operating principle of ndpolator is extrapolation. Ndpolator has three extrapolation methods: none, nearest and linear. When extrapolation method is set to none, the function value that is outside the range of axes is set to nan. For extrapolation method nearest, ndpolator stores a list of all nodes and assigns a function value in the node that is nearest to the query point. Lastly, if extrapolation method is set to linear, ndpolator linearly extrapolates from the nearest fully defined hypercube in a manner equivalent to dealing with incomplete hypercubes. The choice for extrapolation method depends on the multi-variate function that we are estimating; if it is highly non-linear, extrapolation should be avoided, so none and nearest might be appropriate; if it is largely linear or varies slowly, then a linear extrapolation method might be warranted. Ndpolator is a linear extrapolator, so it cannot adequately estimate non-linear multi-variate functions.

Basic axes and associated axes

The question of grid completeness is quite impactful for performance; that is why the sixth operating principle of ndpolator is to distinguish between basic axes and associated axes. Axes that can have voids in their cartesian products are referred to as basic. For these axes, we need full ndpolator machinery to perform interpolation and extrapolation. On the other hand, a subset of axes may have all nodes in their cartesian products, i.e. they are guaranteed to be sampled in all vertices that basic axes are sampled in; these are referred to as associated axes. Given that their sampling is ascertained, interpolation and extrapolation can proceed without concerns for incomplete hypercubes -- that is, for as long as their basic hypercube counterparts (hypercubes spun by basic axes) are complete. Each associated axis reduces the dimensionality of the hypercubes that need to be stored for extrapolation lookup, thus optimizing performance further.

Function value dimensionality

The seventh and final operating principle concerns function value dimensionality. Most interpolators assume that the function value $\mathbf F$ is a scalar; ndpolator does not make that assumption. $\mathbf F_r(x_1, \dots, x_n)$ can be a scalar or a vector or arbitrary length $R$ (within reason, of course). It is then a requirement that all nodes are also $R$-dimensional. Ndpolator will then interpolate and extrapolate all function value components separately, and yield an $R$-dimensional estimate of the function value $\mathbf F$ in the point of interest.

Hypercube caching

While not explicitly a part of ndpolator's operating principles, ndpolator exposes two auxiliary functions, import_query_pts() and find_hypercubes(), that can be used to cache hypercubes. That way, a calling program can group query points that are enclosed by a single hypercube and perform bulk interpolation without the need to find the corresponding hypercube for each query point successively. While the indexing and the hypercube search are both binary, avoiding the lookup when possible further optimizes the runtime.

API documentation and tests

Ndpolator is released under the GNU General Public License. The Application Programming Interface (API) is available for the underlying C library on gh-pages. The test suite and automated API building are incorporated into github's Continuous Integration (CI) infrastructure. Any and all feedback, particularly issue reporting and pull requests, are most welcome.

Acknowledgements

Financial support for this project by the National Science Foundation, grant #2306996, is gratefully acknowledged.

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

ndpolator-1.3.0.tar.gz (107.3 kB view details)

Uploaded Source

Built Distributions

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

ndpolator-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl (95.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

ndpolator-1.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (97.6 kB view details)

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

ndpolator-1.3.0-cp313-cp313-macosx_11_0_arm64.whl (45.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ndpolator-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl (95.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

ndpolator-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (97.6 kB view details)

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

ndpolator-1.3.0-cp312-cp312-macosx_11_0_arm64.whl (45.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ndpolator-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl (95.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

ndpolator-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (97.1 kB view details)

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

ndpolator-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (45.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

ndpolator-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl (94.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

ndpolator-1.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (96.8 kB view details)

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

ndpolator-1.3.0-cp310-cp310-macosx_11_0_arm64.whl (46.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

ndpolator-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl (94.8 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

ndpolator-1.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (96.7 kB view details)

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

ndpolator-1.3.0-cp39-cp39-macosx_11_0_arm64.whl (45.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file ndpolator-1.3.0.tar.gz.

File metadata

  • Download URL: ndpolator-1.3.0.tar.gz
  • Upload date:
  • Size: 107.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ndpolator-1.3.0.tar.gz
Algorithm Hash digest
SHA256 71e7db938fec69115caa1842c1b7509751113da77ccb2911f4ab6cdb0a4c97b9
MD5 f8986eaf06eb54ce0cf2acd8ce5202cb
BLAKE2b-256 bb4edce69cbdec5760e979adea776ffecbac257c092ef75cbf831cb7e2cec2b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0.tar.gz:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 52be4e8edffbf5c5a272cfd3566d95de4ec22be42a3f61e9a01b9f7dfc843a6f
MD5 2d6e0a636197496ec2ed7f9e2046f631
BLAKE2b-256 68f1915057170cc8873ffdd1fef1b8c8f1a035b8b0febcaa3195b0691d6e2b05

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c6252778878c088eb33cf75150089188d7eee0f77aaea800edfc20c284917e0c
MD5 b02bf824252b28dc2be7d89ab7b99d14
BLAKE2b-256 219214f18b943dd32b889b6303c73c170342d600a8208ab48160ad129f24b09b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 125567037d591dceda4d9b87d7a7568f2e580bde3fcc596ae978ac7e709c7386
MD5 f2c56a155cc77961ba86f4915b4bf137
BLAKE2b-256 9cccecdaf957e1d1a71511b8457f110e2fb2e2f497bea9c1feaea5d2b610856f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 741747a4285a9f620bfe53933f621236bac1f609261b73a77d1317fbe87786de
MD5 fa6cc04e31e845df87d2b1023d50ceab
BLAKE2b-256 9f32ae1a7f5798a7dd0dace006291d7f745f40c1373e14a4d3789ffbf70d4622

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e8944d2c9a156875f45b22f5f8bf436c01f9d07ed1df4b1cabc2d9c0f51ff541
MD5 2a4cd4f6a4bd55e548b236e312165c99
BLAKE2b-256 3ad71446219dc1f92780ee2f2b703104be274ef44e1e9ee3477d5a069a35ece9

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a66cb11e43231e28fb8189a39a767e9ebe91856fd8a32d937dcb07286280037
MD5 e0aefa5ffe50a439b70d508da6f6e056
BLAKE2b-256 677f9d659e536dfcacdf3201228235759eba5f8b3a44eed20b3bdfe07f744592

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8f73cb8377c265312894e31665dce26a94d51850fee92c0460741708f85a5142
MD5 2b28f544a0d53ffdde3f32c05706028c
BLAKE2b-256 81d75b4588ce595d3dfe22467f8df977a05705489ca429842d885b964224714e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 69c3aa6a997452bb08e5799f3298935ce1c4a20ba6429c6acf0542d32718f269
MD5 ab8a0065398b75575d7804ac557d39a1
BLAKE2b-256 f081142019c55ea734bec19c7159136b763e50b313c93fcfe1d4fae9d8500d74

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f23becd8e9001b9c7b55ae8b50b57008be3b2421044671973f3cb0a34815bdb
MD5 5466af1cb93fd22fa2d86a775da7268d
BLAKE2b-256 70bcfcbcea34e94af992e3f478244ff8542c1464c3e411e5556cab473c2fa5e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cf7b599a32a6ae854d3df5275402bfb9e62770c40d83831236db6caf5d617ca9
MD5 f50083a4067de460449cfe84c7f60c41
BLAKE2b-256 ca8acafcad5c10715346905da01231b5ad1a32bd00119f79147bc31ab4ff3e16

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7049a797f7bc3cefe7ae182d1e5dedd77c414d212a2bd6780d0c78ffbec9352e
MD5 d38031a5179cc7130f89b346b9706397
BLAKE2b-256 f1269e3f8f2159c7ea56ae95141a81d003e1ab29d9c2794fd896149dce96ee5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 09af3543e2b9c88e0720dbd7a10e01eefb1486a57df5f92d5e4b91162c238779
MD5 65c48319586cd7ad3a5dcd1723586bcf
BLAKE2b-256 1425349177a0150c0c68efa66bef63c9f311338792cd424c6d55b839e9d86d70

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2b6e94b7f8896fff49dff1288e03a057d88d763923ba9cf90257844da731233f
MD5 7df90023e6f2fe44b03c5eb98e908efd
BLAKE2b-256 59ba2d188f330b1bac6d9727a4b27e4196b395a8cc18ec2f85b771428dc48234

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3cc3750b9462a92424c99a103406706b05a617da84cfa9c61aa65fe412273c7f
MD5 af53e0de02f3ec369fa2174f530bda5e
BLAKE2b-256 7db329d25c00e32ac8a00afe2b4d3754f345e7caeb2d2f16335bbe98ae006c59

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ndpolator-1.3.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ndpolator-1.3.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 463aefd7ef15e757842fc620daa0f6352664dbf0ad0251341841cc8cba6799f6
MD5 2a46787deeafecad341ae20ba4250d13
BLAKE2b-256 b5abd6328f003b330782e4d0009966833e90964ebfa2b72c9cec572834139f3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ndpolator-1.3.0-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: on_release.yaml on aprsa/ndpolator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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