Skip to main content

Cython interface between the numpy arrays and the Matrix/Array classes of the Eigen C++ library

Project description

Eigency

PyPI version PEP 517 pip wheel setup.py pre-commit

Eigency is a Cython interface between Numpy arrays and Matrix/Array objects from the Eigen C++ library. It is intended to simplify the process of writing C++ extensions using the Eigen library. Eigency is designed to reuse the underlying storage of the arrays when passing data back and forth, and will thus avoid making unnecessary copies whenever possible. Only in cases where copies are explicitly requested by your C++ code will they be made.

Versioning

Eigency uses a 4-number version (N.N.N.N) where the first 3 parts correspond to the embedded Eigen library version. The last part is a revision number of Eigency itself.

Installing

Eigency is packaged as a source distribution (sdist) and available on PyPi. It can be easily installed using pip:

python -m pip install eigency

Requirement: pip >= 18.0

If your pip is too old, then upgrade it using:

python -m pip install --upgrade pip

Contributing

For instructions on building and/or packaging Eigency from source, see the contributing guide here.

Usage

Below is a description of a range of common usage scenarios. A full working example of both setup and these different use cases is available in the test directory distributed with the this package.

Setup

To import eigency functionality, add the following to your .pyx file:

from eigency.core cimport *

In addition, in the setup.py file, the include directories must be set up to include the eigency includes. This can be done by calling the get_includes function in the eigency module:

import eigency
...
extensions = [
    Extension("module-dir-name/module-name", ["module-dir-name/module-name.pyx"],
              include_dirs = [".", "module-dir-name"] + eigency.get_includes()
              ),
]

Eigency includes a version of the Eigen library, and the get_includes function will include the path to this directory. If you have your own version of Eigen, just set the include_eigen option to False, and add your own path instead:

    include_dirs = [".", "module-dir-name", 'path-to-own-eigen'] + eigency.get_includes(include_eigen=False)

From Numpy to Eigen

Assume we are writing a Cython interface to the following C++ function:

void function_w_mat_arg(const Eigen::Map<Eigen::MatrixXd> &mat) {
    std::cout << mat << "\n";
}

Note that we use Eigen::Map to ensure that we can reuse the storage of the numpy array, thus avoiding making a copy. Assuming the C++ code is in a file called functions.h, the corresponding .pyx entry could look like this:

cdef extern from "functions.h":
     cdef void _function_w_mat_arg "function_w_mat_arg"(Map[MatrixXd] &)

# This will be exposed to Python
def function_w_mat_arg(np.ndarray array):
    return _function_w_mat_arg(Map[MatrixXd](array))

The last line contains the actual conversion. Map is an Eigency type that derives from the real Eigen map, and will take care of the conversion from the numpy array to the corresponding Eigen type.

We can now call the C++ function directly from Python:

>>> import numpy as np
>>> import eigency_tests
>>> x = np.array([[1.1, 2.2], [3.3, 4.4]])
>>> eigency_tests.function_w_mat_arg(x)
1.1 3.3
2.2 4.4

(if you are wondering about why the matrix is transposed, please see the Storage layout section below).

Types matter

The basic idea behind eigency is to share the underlying representation of a numpy array between Python and C++. This means that somewhere in the process, we need to make explicit which numerical types we are dealing with. In the function above, we specify that we expect an Eigen MatrixXd, which means that the numpy array must also contain double (i.e. float64) values. If we instead provide a numpy array of ints, we will get strange results.

>>> import numpy as np
>>> import eigency_tests
>>> x = np.array([[1, 2], [3, 4]])
>>> eigency_tests.function_w_mat_arg(x)
4.94066e-324  1.4822e-323
9.88131e-324 1.97626e-323

This is because we are explicitly asking C++ to interpret out python integer values as floats.

To avoid this type of error, you can force your cython function to accept only numpy arrays of a specific type:

cdef extern from "functions.h":
     cdef void _function_w_mat_arg "function_w_mat_arg"(Map[MatrixXd] &)

# This will be exposed to Python
def function_w_mat_arg(np.ndarray[np.float64_t, ndim=2] array):
    return _function_w_mat_arg(Map[MatrixXd](array))

(Note that when using this technique to select the type, you also need to specify the dimensions of the array (this will default to 1)). Using this new definition, users will get an error when passing arrays of the wrong type:

>>> import numpy as np
>>> import eigency_tests
>>> x = np.array([[1, 2], [3, 4]])
>>> eigency_tests.function_w_mat_arg(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "eigency_tests/eigency_tests.pyx", line 87, in eigency_tests.eigency_tests.function_w_mat_arg
ValueError: Buffer dtype mismatch, expected 'float64_t' but got 'long'

Since it avoids many surprises, it is strongly recommended to use this technique to specify the full types of numpy arrays in your cython code whenever possible.

Writing Eigen Map types in Cython

Since Cython does not support nested fused types, you cannot write types like Map[Matrix[double, 2, 2]]. In most cases, you won't need to, since you can just use Eigens convenience typedefs, such as Map[VectorXd]. If you need the additional flexibility of the full specification, you can use the FlattenedMap type, where all type arguments can be specified at top level, for instance FlattenedMap[Matrix, double, _2, _3] or FlattenedMap[Matrix, double, _2, Dynamic]. Note that dimensions must be prefixed with an underscore.

Using full specifications of the Eigen types, the previous example would look like this:

cdef extern from "functions.h":
     cdef void _function_w_mat_arg "function_w_mat_arg" (FlattenedMap[Matrix, double, Dynamic, Dynamic] &)

# This will be exposed to Python
def function_w_mat_arg(np.ndarray[np.float64_t, ndim=2] array):
    return _function_w_mat_arg(FlattenedMap[Matrix, double, Dynamic, Dynamic](array))

FlattenedType takes four template parameters: arraytype, scalartype, rows and cols. Eigen supports a few other template arguments for setting the storage layout and Map strides. Since cython does not support default template arguments for fused types, we have instead defined separate types for this purpose. These are called FlattenedMapWithOrder and FlattenedMapWithStride with five and eight template arguments, respectively. For details on their use, see the section about storage layout below.

From Numpy to Eigen (insisting on a copy)

Eigency will not complain if the C++ function you interface with does not take a Eigen Map object, but instead a regular Eigen Matrix or Array. However, in such cases, a copy will be made. Actually, the procedure is exactly the same as above. In the .pyx file, you still define everything exactly the same way as for the Map case described above.

For instance, given the following C++ function:

void function_w_vec_arg_no_map(const Eigen::VectorXd &vec);

The Cython definitions would still look like this:

cdef extern from "functions.h":
     cdef void _function_w_vec_arg_no_map "function_w_vec_arg_no_map"(Map[VectorXd] &)

# This will be exposed to Python
def function_w_vec_arg_no_map(np.ndarray[np.float64_t] array):
    return _function_w_vec_arg_no_map(Map[VectorXd](array))

Cython will not mind the fact that the argument type in the extern declaration (a Map type) differs from the actual one in the .h file, as long as one can be assigned to the other. Since Map objects can be assigned to their corresponding Matrix/Array types this works seemlessly. But keep in mind that this assignment will make a copy of the underlying data.

Eigen to Numpy

C++ functions returning a reference to an Eigen Matrix/Array can also be transferred to numpy arrays without copying their content. Assume we have a class with a single getter function that returns an Eigen matrix member:

class MyClass {
public:
    MyClass():
        matrix(Eigen::Matrix3d::Constant(3.)) {
    }
    Eigen::MatrixXd &get_matrix() {
        return this->matrix;
    }
private:
    Eigen::Matrix3d matrix;
};

The Cython C++ class interface is specified as usual:

     cdef cppclass _MyClass "MyClass":
         _MyClass "MyClass"() except +
         Matrix3d &get_matrix()

And the corresponding Python wrapper:

cdef class MyClass:
    cdef _MyClass *thisptr;

    def __cinit__(self):
        self.thisptr = new _MyClass()

    def __dealloc__(self):
        del self.thisptr

    def get_matrix(self):
        return ndarray(self.thisptr.get_matrix())

This last line contains the actual conversion. Again, eigency has its own version of ndarray, that will take care of the conversion for you.

Due to limitations in Cython, Eigency cannot deal with full Matrix/Array template specifications as return types (e.g. Matrix[double, 4, 2]). However, as a workaround, you can use PlainObjectBase as a return type in such cases (or in all cases if you prefer):

         PlainObjectBase &get_matrix()

Overriding default behavior

The ndarray conversion type specifier will attempt do guess whether you want a copy or a view, depending on the return type. Most of the time, this is probably what you want. However, there might be cases where you want to override this behavior. For instance, functions returning const references will result in a copy of the array, since the const-ness cannot be enforced in Python. However, you can always override the default behavior by using the ndarray_copy or ndarray_view functions.

Expanding the MyClass example from before:

class MyClass {
public:
    ...
    const Eigen::MatrixXd &get_const_matrix() {
        return this->matrix;
    }
    ...
};

With the corresponding cython interface specification The Cython C++ class interface is specified as usual:

     cdef cppclass _MyClass "MyClass":
         ...
         const Matrix3d &get_const_matrix()

The following would return a copy

cdef class MyClass:
    ...
    def get_const_matrix(self):
        return ndarray(self.thisptr.get_const_matrix())

while the following would force it to return a view

cdef class MyClass:
    ...
    def get_const_matrix(self):
        return ndarray_view(self.thisptr.get_const_matrix())

Eigen to Numpy (non-reference return values)

Functions returning an Eigen object (not a reference), are specified in a similar way. For instance, given the following C++ function:

Eigen::Matrix3d function_w_mat_retval();

The Cython code could be written as:

cdef extern from "functions.h":
     cdef Matrix3d _function_w_mat_retval "function_w_mat_retval" ()

# This will be exposed to Python
def function_w_mat_retval():
    return ndarray_copy(_function_w_mat_retval())

As mentioned above, you can replace Matrix3d (or any other Eigen return type) with PlainObjectBase, which is especially relevant when working with Eigen object that do not have an associated convenience typedef.

Note that we use ndarray_copy instead of ndarray to explicitly state that a copy should be made. In c++11 compliant compilers, it will detect the rvalue reference and automatically make a copy even if you just use ndarray (see next section), but to ensure that it works also with older compilers it is recommended to always use ndarray_copy when returning newly constructed eigen values.

Corrupt data when returning non-map types

The tendency of Eigency to avoid copies whenever possible can lead to corrupted data when returning non-map Eigen arrays. For instance, in the function_w_mat_retval from the previous section, a temporary value will be returned from C++, and we have to take care to make a copy of this data instead of letting the resulting numpy array refer directly to this memory. In C++11, this situation can be detected directly using rvalue references, and it will therefore automatically make a copy:

def function_w_mat_retval():
    # This works in C++11, because it detects the rvalue reference
    return ndarray(_function_w_mat_retval())

However, to make sure it works with older compilers, it is recommended to use the ndarray_copy conversion:

def function_w_mat_retval():
    # Explicit request for copy - this always works
    return ndarray_copy(_function_w_mat_retval())

Storage layout - why arrays are sometimes transposed

The default storage layout used in numpy and Eigen differ. Numpy uses a row-major layout (C-style) per default while Eigen uses a column-major layout (Fortran style) by default. In Eigency, we prioritize to avoid copying of data whenever possible, which can have unexpected consequences in some cases: There is no problem when passing values from C++ to Python - we just adjust the storage layout of the returned numpy array to match that of Eigen. However, since the storage layout is encoded into the type of the Eigen array (or the type of the Map), we cannot automatically change the layout in the Python to C++ direction. In Eigency, we have therefore opted to return the transposed array/matrix in such cases. This provides the user with the flexibility to deal with the problem either in Python (use order="F" when constructing your numpy array), or on the C++ side: (1) explicitly define your argument to have the row-major storage layout, 2) manually set the Map stride, or 3) just call .transpose() on the received array/matrix).

As an example, consider the case of a C++ function that both receives and returns a Eigen Map type, thus acting as a filter:

Eigen::Map<Eigen::ArrayXXd> function_filter(Eigen::Map<Eigen::ArrayXXd> &mat) {
    return mat;
}

The Cython code could be:

cdef extern from "functions.h":
    ...
    cdef Map[ArrayXXd] &_function_filter1 "function_filter1" (Map[ArrayXXd] &)

def function_filter1(np.ndarray[np.float64_t, ndim=2] array):
    return ndarray(_function_filter1(Map[ArrayXXd](array)))

If we call this function from Python in the standard way, we will see that the array is transposed on the way from Python to C++, and remains that way when it is again returned to Python:

>>> x = np.array([[1., 2., 3., 4.], [5., 6., 7., 8.]])
>>> y = function_filter1(x)
>>> print x
[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]
>>> print y
[[ 1.  5.]
 [ 2.  6.]
 [ 3.  7.]
 [ 4.  8.]]

The simplest way to avoid this is to tell numpy to use a column-major array layout instead of the default row-major layout. This can be done using the order='F' option:

>>> x = np.array([[1., 2., 3., 4.], [5., 6., 7., 8.]], order='F')
>>> y = function_filter1(x)
>>> print x
[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]
>>> print y
[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]]

The other alternative is to tell Eigen to use RowMajor layout. This requires changing the C++ function definition:

typedef Eigen::Map<Eigen::Array<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> > RowMajorArrayMap;

RowMajorArrayMap &function_filter2(RowMajorArrayMap &mat) {
    return mat;
}

To write the corresponding Cython definition, we need the expanded version of FlattenedMap called FlattenedMapWithOrder, which allows us to specify the storage order:

cdef extern from "functions.h":
    ...
    cdef PlainObjectBase _function_filter2 "function_filter2" (FlattenedMapWithOrder[Array, double, Dynamic, Dynamic, RowMajor])

def function_filter2(np.ndarray[np.float64_t, ndim=2] array):
    return ndarray(_function_filter2(FlattenedMapWithOrder[Array, double, Dynamic, Dynamic, RowMajor](array)))

Another alternative is to keep the array itself in RowMajor format, but use different stride values for the Map type:

typedef Eigen::Map<Eigen::ArrayXXd, Eigen::Unaligned, Eigen::Stride<1, Eigen::Dynamic> > CustomStrideMap;

CustomStrideMap &function_filter3(CustomStrideMap &);

In this case, in Cython, we need to use the even more extended FlattenedMap type called FlattenedMapWithStride, taking eight arguments:

cdef extern from "functions.h":
    ...
    cdef PlainObjectBase _function_filter3 "function_filter3" (FlattenedMapWithStride[Array, double, Dynamic, Dynamic, ColMajor, Unaligned, _1, Dynamic])

def function_filter3(np.ndarray[np.float64_t, ndim=2] array):
    return ndarray(_function_filter3(FlattenedMapWithStride[Array, double, Dynamic, Dynamic, ColMajor, Unaligned, _1, Dynamic](array)))

In all three cases, the returned array will now be of the same shape as the original.

Long double support

Eigency provides new shorthands for Eigen long double and complex long double Matrix and Array types. Examples:

Vector4ld
Matrix3ld
Vector2cld
Matrix4cld
Array3Xld
ArrayXXcld

These typedefs are available in the eigency namespace when including the eigency header:

#include "eigency.h"

void receive_long_double_matrix(Eigen::Map<eigency::MatrixXld> &mat) {
    // use long double eigen matrix
}

Use Cython (.pyx) to create Python binding to your C++ function:

cdef extern from "functions.h":
     cdef void _receive_long_double_matrix "receive_long_double_matrix"(Map[MatrixXld] &)

def send_long_double_ndarray(np.ndarray[np.longdouble_t, ndim=2] array):
    return _receive_long_double_matrix(Map[MatrixXld](array))

Invoke in Python:

import numpy as np
import my_module

x = np.array([[1.1, 2.2], [3.3, 4.4]], dtype=np.longdouble)
my_module.send_long_double_ndarray(x)

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

eigency-5.0.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

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

eigency-5.0.0-cp314-cp314-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.14Windows x86-64

eigency-5.0.0-cp314-cp314-win32.whl (1.6 MB view details)

Uploaded CPython 3.14Windows x86

eigency-5.0.0-cp314-cp314-musllinux_1_2_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

eigency-5.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

eigency-5.0.0-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

eigency-5.0.0-cp313-cp313-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86-64

eigency-5.0.0-cp313-cp313-win32.whl (1.6 MB view details)

Uploaded CPython 3.13Windows x86

eigency-5.0.0-cp313-cp313-musllinux_1_2_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

eigency-5.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

eigency-5.0.0-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

eigency-5.0.0-cp312-cp312-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.12Windows x86-64

eigency-5.0.0-cp312-cp312-win32.whl (1.6 MB view details)

Uploaded CPython 3.12Windows x86

eigency-5.0.0-cp312-cp312-musllinux_1_2_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

eigency-5.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.6 MB view details)

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

eigency-5.0.0-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

eigency-5.0.0-cp311-cp311-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86-64

eigency-5.0.0-cp311-cp311-win32.whl (1.6 MB view details)

Uploaded CPython 3.11Windows x86

eigency-5.0.0-cp311-cp311-musllinux_1_2_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

eigency-5.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.6 MB view details)

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

eigency-5.0.0-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

eigency-5.0.0-cp310-cp310-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.10Windows x86-64

eigency-5.0.0-cp310-cp310-win32.whl (1.6 MB view details)

Uploaded CPython 3.10Windows x86

eigency-5.0.0-cp310-cp310-musllinux_1_2_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

eigency-5.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (2.5 MB view details)

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

eigency-5.0.0-cp310-cp310-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file eigency-5.0.0.tar.gz.

File metadata

  • Download URL: eigency-5.0.0.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0.tar.gz
Algorithm Hash digest
SHA256 fc525b1da9a8443be66e0ca7a72dd7da457fa6c34c8f8db754af5f0e3848583d
MD5 e4d4c2853ea250437328c65944a23d47
BLAKE2b-256 146bb863b281657c08dd72d7281f673394b02a7237a4ffed694d6b587ba1b743

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0.tar.gz:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e0e772b8fd0febafe54b73b1b2334e29015d3afd4039c939d5d93ee6bc3a64b8
MD5 8a87fef0e365a5ff19cd5003caeace6c
BLAKE2b-256 588c4d411b8c7b8f35b1d08dbbbc2297e1835fd996fce3194bb5c2a9466442ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp314-cp314-win_amd64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp314-cp314-win32.whl.

File metadata

  • Download URL: eigency-5.0.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 08dd9464dcb9d9657513023fe770f38658ac68054fac3c19b3449c43f6fcfdc4
MD5 49e36ac17a9de5f0158ce30578fd70bf
BLAKE2b-256 b94aebb4311028b080e47992420b094d419ecdbde7eb84bc2cac6d805962ad85

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp314-cp314-win32.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0b1ea897ab8fcc70def747a8bb0adca17954057331cfab0630bb5ef028f4e0b1
MD5 7a9a0533482f61c7b5f59b29f7e7d7c2
BLAKE2b-256 179a3be5dc7811136ddda8d41173c2d11923899441faec9e833a1d1f2c6878d8

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fbca6fb8e76739bea1ebb9512f29b500a8a58f27b7407719064583ba9ab6c030
MD5 b1e68845d1e99d2dd6147bd446c4497e
BLAKE2b-256 c492d5c48f7df3065a636fd91066a3446fd279830704eacc1ea53fd59fce4cb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd874576fa5f6dec4b0b945f3bc6a12bf6d9b192735b7230308e08df905488e7
MD5 98a60b898503d4492eb072ba33118f3d
BLAKE2b-256 eba43cd1104943992b561853bd5545c9f2b24e902470541f8a8a12d3dac00432

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 64dcb81c0367973eee4e912ee9df429ec9344f63a6ea5099436db408437b5fcd
MD5 f3a74c2ceb4762d83b11f4b39db31fdc
BLAKE2b-256 e0e02e35b54d434a311b8ac3fed02a0c9e7457e9bac72b24aacad50649f32c31

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp313-cp313-win_amd64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: eigency-5.0.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 18bd7927cba7ef3290d34fc94668a093d002aeb25a82e227bc3d46dc74eed516
MD5 6cfcf9365d52f4cc6788aabcfb6ee1dc
BLAKE2b-256 0d03d2e38e678b91632eb6fa7b4fae34b8eef3749a5627c9ad5032ff1f01d3f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp313-cp313-win32.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d09fbbe87f2e3fa0f60fbc0fab6bbb51fb45e36b97d50eec7f721e01b2f49d4b
MD5 b81841a163a65bcd20229cb12c9277f4
BLAKE2b-256 1927face58ea4fe1e512a7ffa7e7e6078aa6dc7cde19027362349f4deda0f893

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fb05f6915b86f256524e99587b0fbc19bbb39098ed0694a313f8c732a550bb3e
MD5 d06e7d0712feafb1686d2dffb7e476f2
BLAKE2b-256 3abcfc79267fe95a778a54b3c6c2cd2d56b6a4bc0b661c8c9472e99bea3c5b75

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 adc95d8d422102f9fa7943a29f047f2911b0562e14a3d3f668e543761bcd4954
MD5 3fcb488cdd347f95fdc224e635f27b99
BLAKE2b-256 d16d7b850a1a897acf1fd064c2faa08d18f7a69b839d110fd1353a5e4982ab61

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fece521d86f852bbc26b04cb2a7e109701259b00799a4e43ee04f80a99c1da4a
MD5 de5e175e7c3da7de064517bb3569c12c
BLAKE2b-256 653e09726f8cf375219a4b4e22d163cf71495916f8223444ef1c5db5a284d6ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp312-cp312-win_amd64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: eigency-5.0.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 4ef4c22aab34aa354e033897b427b310468768e57908aca401e4a77345ffecfd
MD5 2cab5ad3f7ce7eff5704621e4c657112
BLAKE2b-256 ccf81a0ba583cd1959bbc20be1bf696d9429be66a443463e69acf8234a0e6b1d

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp312-cp312-win32.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 947bdc6f9f85e0160a71695c9347ad969bfc8c4b5dbd3f0691a1e02d580c231f
MD5 1058ed843c7d4c9ac7f001b30bc22606
BLAKE2b-256 9e36eae1f383db0e575233b9a6c21b533d16b7ec86cf3e83a9b43dcd3b9bd0f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 43f89fc35e47f9afc0978121935af7f2aeeb4b87ce8d6ee708e57cc6036744c5
MD5 2f0eb094e1bfb19719d46e99529f0a28
BLAKE2b-256 e10f9b633376f0cc6c4e7829f64434dff5bfdba2610b476b19391087fcde0573

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 96a0b8166f5ee647369b4efad966829b3e86ac35c60208eb45c3ae98dbcd53c8
MD5 23b45f11d7e3c52adcbfcdb7993cf90f
BLAKE2b-256 f2b11c6516924ece4c2a5b344e57528ae0a408de85f8c85524009c2cde3aecbc

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d017379698266f1a197360cc62b7f9925aeb277fffef0e906a6215f5f0fd8788
MD5 eea23c7d17d371b55727db183f28327f
BLAKE2b-256 4980932100331a4e8dd14f7b3fe248b225ad8ce900bc18b5579d25cae7095bbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp311-cp311-win_amd64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: eigency-5.0.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 56d5265fa18af0c0e621efb4c8fbbc3a81bccb3ab73b0eda03a815c0525824cd
MD5 e42143ea4b08df0a88acf3938e696817
BLAKE2b-256 5e8339135d4a8fae2448d2ea927769767a681e1d6ee578485fe1249fc6ae7b02

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp311-cp311-win32.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e5934993a171e3e7e510d87097bd77c56888cfc4a4d97af471596cbfb4408e5b
MD5 839d99dea8ed9ae3e91d1fe0a2a5ff4f
BLAKE2b-256 acf2ef5a551959bf3bac91b9fca2ae83e8374c84cf675dc795d35a43a32687a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7bb2acbf076d4032c77f3c1689b01b8e9209c183652147bc8850d2655b49f441
MD5 19b9faac0cd36e7f687d5f04ebaa5e1d
BLAKE2b-256 5d2a14c6eabab0fce5888ab8114860a7f71c325ae6197388a1e01f176984ccfd

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8d834ac9c7e637cf02346e9f4f3796bbf7d753ad9328c5dc80f619bb76d79586
MD5 0f20202bdd79c6ce6729590641cce9ba
BLAKE2b-256 75df3687a3bd20024427bd132663709209ad002cbb23641eca502593c687751c

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 bdc14865cec41551e5a877a6235d8357e9e289c774b19ed6126eb671149d3e78
MD5 5a9810c4e3cde3e47fe90a0eb9b99712
BLAKE2b-256 6879ef7a938f24c93bc2ec4acd2e296005b5e495f7c45763fc38716acee52879

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp310-cp310-win_amd64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: eigency-5.0.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eigency-5.0.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 7da71e8e3625250db62cc4a4959766d3ef8262c1c63565d5308ac55819bf749f
MD5 046512f2190fef8ae1dd01628ee8883b
BLAKE2b-256 4e158ba0a49f5fdaf009e8e2d12c7b53600837ed302ca55ce7fb8731fa26ff50

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp310-cp310-win32.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a68c77d2563c3ce040b3555a93a08deaea0c7df8de7c36bf2e02bf34465b5001
MD5 c63a5fae44d04319613a18a62a803690
BLAKE2b-256 70682e206e4083e17d7d60c08c0a0795bc0eeaacfd157355f6a2ddbe5ce1f467

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2f0ad9bab802ae6feb29c99d4e52b0e85ccec711800eff3badff3bb209818075
MD5 0631e9ff125ede27239fbe915e5d80f6
BLAKE2b-256 cfbaacc4fc2f2f0eb597a5ed41b97356dc7487e4f33629dcdb8ee781b0f59765

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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

File details

Details for the file eigency-5.0.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 71219f17bcc8ac4e0aa5165ac42c64869b7201c38c5e3456c5e99984737c5f8d
MD5 552d6710cb1c00e30748db54455aa884
BLAKE2b-256 7330a21d72176fa319893c5c4d990ed4eb2af66d0e8ffdc2762416940b18df99

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: pypi-wheels.yml on fbordeu/eigency

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