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.1.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.1.0-cp314-cp314-win_amd64.whl (1.6 MB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14Windows x86

eigency-5.0.1.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.1.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.1.0-cp314-cp314-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

eigency-5.0.1.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.1.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.1.0-cp313-cp313-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

eigency-5.0.1.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.1.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.1.0-cp312-cp312-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

eigency-5.0.1.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.1.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.1.0-cp311-cp311-macosx_11_0_arm64.whl (1.6 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

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

Uploaded CPython 3.10Windows x86

eigency-5.0.1.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.1.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.1.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.1.0.tar.gz.

File metadata

  • Download URL: eigency-5.0.1.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.1.0.tar.gz
Algorithm Hash digest
SHA256 aba3a16eb2bb1a42be2983abb95c11e58f92e277645a77dd35db1cfcec333f88
MD5 b24060b80e914855911adbea8df28b19
BLAKE2b-256 24dbad7e9c8fdd43040ce4ebe23761a9810e38c26e422b117188bffe880eef22

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 630d5068767fa41b34dc3f80b34d40db4b06525a2b6e5f0817f6348a979494eb
MD5 83faf914f37e301f8a3eb86a22e16992
BLAKE2b-256 b6130abb56e94d64f5d15407c81147e266bdc47671bafc52f9a98a290d4d48ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp314-cp314-win32.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 27a1eb15020495c88771e90be3f0d9d4b3c73c962d65f8e461c8ea7239d6f1c7
MD5 205c851f75f6c1215b0f097fc1235fd3
BLAKE2b-256 cb8cb84debd8067d4be50cfa52434eefd1b300d79affa3a1c407455be0f23390

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 68c35c3390622c5bb8870bec515f0c8d40c6228ff0ae21533f31d5357e1b6440
MD5 f0c5975b7713b55e71044c24388e6f71
BLAKE2b-256 d2a47bc6db2e27d036dfd13d4a24ceb57623c7022f5755c1279cc9c038700f67

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.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.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a4bc0d8b07120c38c1de553c19c544fc1248bf253860e70f3ff02d5b5894a848
MD5 6bc505a380641e3f01adc975507dba01
BLAKE2b-256 c9812b957c279fcd7b4357b93b02659074b2c89fc38ce45593246882f1b10543

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1f2ef9c5dd40c272fddc9c59d10fa79e49cc270033603eee41f84edbd89059eb
MD5 3e2cdd72c547bbaebc625747d51ac7c0
BLAKE2b-256 40300df7289ea725c023f6ec989cb783fc1b535d5cd0021ca60c97e6fca96728

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 be05dd2c0ad9e1ab534e25e03d7fb8b53c75e38aaa743f986dff4872312d04ff
MD5 e9890be7e0c1f4ac56f84045ac6086fd
BLAKE2b-256 3e3d80aa31bd9f1e1f50562893af3880643b975d8c97b125909b2218a4f70dac

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 4301ca88a7426a4a65ff827ad9c00e20808115ec9f18497f76cbb5662df246b7
MD5 5533844c73b69aabdd5e5aaf1de3457a
BLAKE2b-256 de18a0e25637ece20c123f438c5180523b5b29bb8ef63518b39bf0b4cf2fc1f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 546a98be48e616ee59cf5b9a9716cb5001c2425f9606794eaa16c7b09667a301
MD5 4173206aec1f4bf20a15170bf6b332da
BLAKE2b-256 40f94e585a05ff6c81ef23cd64d34f2431dfe6fb29890f7f2f68233cf2001ea9

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.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.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d75639d68cf8fb64b3cf6e59d7892ae1d4164286b58bfb6a0db41219b654dc6a
MD5 1e3c4697bd5b55d64fecf952f0dace08
BLAKE2b-256 999de31f035e4b5357c48ac2e31730373db3e48b606413c8de1a3c8daf3b5bf4

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7ca712b400b0e5c8a1b99918c322a7d62686660ffa664deb9c2b557edc363edf
MD5 2fe0881aab9b3aa68e223bb48afcc297
BLAKE2b-256 df70e42b7121aab50369ba8e999512340a1e2ccc63bb8c7c958fbef42aee3fa6

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0578dbef42bc09fdbe99048038b13775f9d67b3ae04888dcb853d2105d215282
MD5 73c5076afaa430338ee8b747cd1207ed
BLAKE2b-256 69ccc0c910a3f31c124ed1cd14f08c3c829b154b59edce2280d4d90640bce3bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 a2d615b7862865702a86c46f212e2e39def3b02d1aa464318297ed3de27a9373
MD5 f7998f2dfe3bb8f8f736a36590641b1b
BLAKE2b-256 dd59f2f79fd0896ebc2a3abcba4e3a1b16ee6a0fb4b7d103f32be0aff6b990af

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f9a32c5925cdb013d343a15fb6d869d9b8b2670f21a60223511cb730de1e5951
MD5 05cef8198c8cb5db237d55fdb10358b6
BLAKE2b-256 3dc4ba5239b435c21296451c5b4fef8147141c1cd93ed9072b787da3cd946fa8

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.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.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 29f1dc3f4466c512b4e435fc70154a948a53d62588460fc38cb7adba4e0ee1cf
MD5 0fc44d90509fe76ff83d37c6a20cb10c
BLAKE2b-256 c9dbabef8c2b294c0894ec6f3d957e07d475f75b462b9b262357f1d18e3b66a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b3fa67fa3c8aae8144c8956909a70a12ebd883d28120d01ccac10218edf6fd2
MD5 fffe32d67bd760723f886cbfc39c9151
BLAKE2b-256 b8b4966679cebb2bd8efb1477c47f4889b8d2936661ef252decf73034fe78a79

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 710b858d0a308400b0dce1b96d78fb6b41efe8d49ba669446a615333040543dc
MD5 c39adefc9b4ab51635b263cdac01ae4a
BLAKE2b-256 c8381580086322333cd4079e1dda6fc4156c4df9b1d39fea2d61e5d1361f200b

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 77eca0e133d968dc8db1e2b12163bfcb70a2041ecfb3e249cc249299c158c57a
MD5 c0a5d2e66de25a751d987f2e9b58f8ec
BLAKE2b-256 b5f3064e52a16821f54524c161035cbbec3eb537abe6071b3ac8d5cb5ef6f64c

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ba43680b154351e599f06e3dcd43f8c0187109f90fda11f0365047fa07d9b240
MD5 4110671ce2066db182d05a8da9472d9a
BLAKE2b-256 a22c57a89d1dbf1c2b6fae491c50f74397808d71f2fa2a9ed9594fc3553a7d04

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.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.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c0b6c3e77ec5cacbe66cc6fb4b858f54f6829594e024d351cddb94ff0fb73331
MD5 4c8873de429dfe0986a885d6eaddf053
BLAKE2b-256 d9898aa501a8939b8df36ac918e62e3ba11b471cda8d88744656aa01caa5cbc4

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 27795b5dc4564cf00d42bb3e1d777df0e76b01a65a248e786dceb9bd297aa3cb
MD5 221f7016a9776148c191fb7191c7f1d6
BLAKE2b-256 f4babd4f30f825e8a9bfb4950a0682e8e6f7b258615beaa65b712c6b767481cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 770ac28c726b7ba8565f43a7c7feb5874e0a46d4705e1e664c05bbeba2943cab
MD5 82410c1b688e25dbf18eca64e75defd4
BLAKE2b-256 b73a383dc4f7c39fccdc025a2ad886be70b55da9c4c3d1a5e71586b049efbbe1

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: eigency-5.0.1.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.1.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 90213ef8c891006d0125e9421d309e26797f2b0f4f303f6c8e98c4bdbec5b64a
MD5 3d907f82d97d8241d2e234d5bebcd24a
BLAKE2b-256 c7cb287418ee1077a792af0ec35dc799f48564833311b418cd40e10666b7c3a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1089c17ca3e497cd4767dc04123b6b42f7663f82066245165c642653b77a09ca
MD5 d8f5b5851a61500b2af65f4541decf44
BLAKE2b-256 92093f17152982716a272f3431ea26f2d693eac44a1ba3fc97f95b5c77b4832b

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.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.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b537bfe3fe44c0cc564026f13d0aea7bab921d44ca79f2b7e2ea54651e65568
MD5 1403d73724afd13565fcf32d6ec7c118
BLAKE2b-256 3ab06beaf82349972b93784aa194e58054de277ef842aae24953939765c20f5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for eigency-5.0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2d55bf211bb8e95b6b69ae3873d0178b92267574038948fe42a94fd27d79dbb6
MD5 52375b17fe12e989bb22ca2a2a84f824
BLAKE2b-256 90cb34e1cb257a3f6715b113945fecdf12a13a629a18b66a3b1182f64791a6cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for eigency-5.0.1.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