Skip to main content

Toolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition.

Project description

EAIK: A Toolbox for Efficient Analytical Inverse Kinematics by Subproblem Decomposition

Authors: Daniel Ostermeier, Jonathan Külz and Matthias Althoff

This toolbox is based on the following scientific publication:
D. Ostermeier, J. Külz and M. Althoff, "Automatic Geometric Decomposition for Analytical Inverse Kinematics," in IEEE Robotics and Automation Letters, vol. 10, no. 10, pp. 9964-9971, Oct. 2025

@ARTICLE{EAIK,
  author={Ostermeier, Daniel and K{\"u}lz, Jonathan and Althoff, Matthias},
  journal={IEEE Robotics and Automation Letters}, 
  title={Automatic Geometric Decomposition for Analytical Inverse Kinematics}, 
  year={2025},
  volume={10},
  number={10},
  pages={9964-9971},
  doi={10.1109/LRA.2025.3597897}
}

You may find our open-access publication here:

ieeexplore.ieee.org

Please cite the above work when using this code within your own projects.

Also, please visit our website for additional informations.

Additional derivations that were used within this toolbox are contained in this PDF. Feel free to contact us if you have any questions or suggestions: Open up a GitHub issue.

Overview

With this toolbox, we propose a method for automatic inverse kinematic derivation. We exploit intersecting and parallel axes to remodel a manipulator's kinematic chain.

This allows for a hard-coded decomposition algorithm to solve its inverse kinematics by employing pre-solved subproblems. Our approach surpasses current analytical methods in terms of usability and derivation speed without compromising computation time or the completeness of the overall solution set.

The following figure illustrates a robot with a spherical wrist and the geometric representation of a subproblem we use to solve parts of its IK:

We adopt the solutions and overall canonical subproblem set from Elias et al.:
A. J. Elias and J. T. Wen, “IK-Geo: Unified robot inverse kinematics using subproblem decomposition,” Mechanism and Machine Theory, vol. 209, no. 105971, 2025.
Check out their publication and implementation.

Capabilities of this Toolbox

The current implementation supports automatic derivation of solutions for the following 6R and 5R manipulators, as well as their mirrored version (switched base and endeffector), and all non-redundant 1-4R manipulators. In addition, we allow the user to solve arbitrary nR manipulators that, by locking individual joints, corrspond to one of the below kinematic families.


Robot configurations (without their mirrored version) that can be solved by the current EAIK implementation. NR-Robots that contain these structures as kinematic subchains are solvable if the leftover redundant joints are locked in place. For the 5R manipulators, all (non-redundant) specializations of the shown classes (i.e., with additional intersecting/parallel axes) are solvable as well.

We implement an user friendly interface for parametrizing a robot by a URDF file, DH parameters, or simply the homogeneous transformations that correspond to the joint axes placements.

The following figure shows an overview of our interface and a superficial showcase of our method:

If you require a vast amount of IK problems to be computed at once, we also implement a multithreaded batched version that allows you to make full use of your processor.

Installation

Linux

For Linux machines, we suggest using our pip-installable PyPI package:

$ pip install EAIK

If you want to directly use the C++ functionality as a library and skip the Python wrapper, simply follow the next steps.

Make sure to clone this repository with all external dependencies using:

$ git clone --recurse-submodules git@github.com:OstermD/EAIK.git

Then build the EAIK C++ library by using:

$ mkdir EAIK/CPP/src/build && cd EAIK/CPP/src/build
$ cmake ..
$ make

Windows

Windows is currently only supported via manual installation. Make sure to clone this repository with all external dependencies using:

$ git clone --recurse-submodules git@github.com:OstermD/EAIK.git

Then build and install EAIK within the currently active Python environment (>=3.9):

$ cd EAIK && pip install .

Usage Example

We currently provide support parametrizing a robot via DH parameters, homogeneous transformations of each joint in zero-pose with respect to the basis, as well as ROS URDF files. Some quick examples that demonstrate the usability of our implementation are shown in the following code-snippets:

DH Parameters

import numpy as np
from eaik.IK_DH import DhRobot

"""
Example DH parametrization + forward kinematics for a random robot kinematic
"""

d = np.array([0.67183, 0.13970, 0, 0.43180, 0, 0.0565])
alpha = np.array([-np.pi/2, 0, np.pi/2, -np.pi/2, np.pi/2, 0])
a = np.array([0,0.43180, -0.02032, 0,0,0])
bot = Robot(alpha, a, d)

print(bot.hasKnownDecomposition())
print(bot.fwdKin(np.array([1,1,1,1,1,1])))

Robot from a URDF file and IK on random poses

import numpy as np
import random
from eaik.IK_URDF import UrdfRobot
import evaluate_ik as eval


def urdf_example(path, batch_size):
    """
    Loads spherical-wrist robot from urdf, calculates IK using subproblems and checks the solution for a certian batch size
    """

    bot = UrdfRobot(path)

    # Example desired pose
    test_angles = []
    for i in range(batch_size):
        rand_angles = np.array([random.random(), random.random(), random.random(), random.random(), random.random(),random.random()])
        rand_angles *= 2*np.pi
        test_angles.append(rand_angles)
    poses = []

    for angles in test_angles:
       poses.append(bot.fwdKin(angles))
        
    for pose in poses:
        ik_solutions = bot.IK(pose)

        # Print forward kinematics for all solutions
        for Q in ik_solutions.Q:
            pose_fwd = bot.fwdKin(Q)
            print(pose_fwd)

Even more examples for the python interface are available here.

Using the C++ Library

The example below is just a small code snipped. As the C++ code quickly becomes more evolved, we recommend to look into the Software Tests we wrote for the C++ side. The code there can also be used as an example on how you can use our library in a bigger project that, e.g., requires checks for least-square solutions etc.

#include <Eigen/Dense>
#include <vector>

#include "EAIK.h"

const Eigen::Vector3d zv(0, 0, 0);
const Eigen::Vector3d ex(1, 0, 0);
const Eigen::Vector3d ey(0, 1, 0);
const Eigen::Vector3d ez(0, 0, 1);

double rand_angle(); // Just some random angle in [0; 2pi)

void ik_7R_KUKA_R800()
{
  // Robot configuration for KUKA LBR iiwa 7 R800

  // Define axes unit vectors
  Eigen::Matrix<double, 3, 7> H;
  H << ez, ey, ez, -ey, ez, ey, ez;

  // Define offsets between reference points on joint axes
  Eigen::Matrix<double, 3, 8> P;
  P << (0.15 + 0.19) * ez, 
        zv, 0.21 * ez, 
        0.19 * ez, 
        (0.21 + 0.19) * ez, 
        zv, 
        zv, 
        (0.081 + 0.045) * ez;

  // Kuka R800 with q3 locked in random configuration
  double q3_angle = rand_angle();

  // Create Robot
  EAIK::Robot kukaR800(H, P, 
                        Eigen::Matrix<double, 3, 3>::Identity(), 
                        {std::pair<int, double>(2, q3_angle)});

  // Forward Kinematics
  IKS::Homogeneous_T ee_pose = kukaR800.fwdkin(std::vector{
      rand_angle(), 
      rand_angle(),
      q3_angle, 
      rand_angle(), 
      rand_angle(), 
      rand_angle(), 
      rand_angle()
      });
  
  // Inverse Kinematics
  IKS::IK_Solution solution = robot.calculate_IK(ee_pose);
}

void main()
{
  ik_7R_KUKA_R800();
}

Again, if you are stuck somewhere or have open questions feel free to reach out to us.

Solution-Consistency at Workspace Boundaries and Singularities

For the following experiments we use the Schunk Powerball LWA-4P manipulator—a modularizable 6R manipulator with a spherical wrist and two consecutive intersecting axes in its base.

Experiment 1

For the first experiment, we consider a linear end-effector trajectory reaching from a start position of (x, y, z) = (0m, 0m, 0.5m) to an end position (x, y, z) = (0m, 0m, 1.0m) and back. We align the orientation of the end effector with that of the base of the robot and keep it constant throughout the whole trajectory.

In this example, all points along the trajectory with a z-coordinate smaller than or equal to 0.8m are reachable by the manipulator (neglecting joint limits and self-collisions). However, the first and last axis of the LWA-4P are collinear at every point along this trajectory—the manipulator is always in a singular configuration. Hence, infinitely many IK solutions exist for each point along this trajectory with z ≤ 0.8m. On the other hand, all points with a z-coordinate larger than 0.8m are placed outside the workspace of the manipulator—no IK solution exists for any of these points. We sample 100 discrete points along this trajectory and try to compute the IK solution for each point. We obtain the following results:

We obtain at least one IK solution for any point along the trajectory. For points where z ≤ 0.8m, this solution is analytically correct with an error in the magnitude of double-precision accuracy. For points where z > 0.8m, this solution is a least-squares solution to the underlying subproblems as discussed in our manuscript under Section IV-B. We linearly interpolate between the discrete samples in joint space to obtain the joint trajectories in the following figure. While the solutions to the subproblems in Elias et al. are unable to represent the full infinite solution space that arises from singular configurations, they still yield at least one consistent and analytically accurate solution.
The following animation shows a simplified LWA-4P model that executes the IK solutions obtained via our method (EAIK). Blue arrows resemble the joint axes of the manipulator, while the pink bars resemble its links. Green points represent the commanded positions while exiting the workspace, while red points represent the commanded positions when re-entering the manipulator's workspace (100 points in total).

When using our method (EAIK), we obtain sensible joint angles even when commanding poses outside of the workspace of the manipulator or during singular configurations. When the manipulator reaches its workspace boundary, our method returns feasible least-squares solutions:

Experiment 2

For the second experiment, we induce a slight offset to the trajectory from Experiment 1 along the y-axis. The new trajectory starts with the end-effector position (x, y, z) = (0m, −0.001m, 0.5m), reaches to the position (x, y, z) = (0m, −0.001m, 1.0m) and goes back to (x, y, z) = (0m, −0.001m, 0.5m). Again, we sample 100 equidistant points from this trajectory and try to compute IK solutions.

Just like in the first experiment, every point on the trajectory with z ≤ 0.8m can be reached by the manipulator. This time, however, all these points are reachable in non-singular configurations. Therefore, there exists only a finite set of IK solutions to each such point. Our method yields solutions accurate up to the expected floating-point precision.

For all points where z > 0.8m, no IK solution exists. However, in real-world situations, values that lie exactly on the workspace boundary can not be perfectly separated from those that lie beyond it. E.g., due to floating-point inaccuracies, a desired set-point of 0.8m may be represented as 0.8m + ϵ where 1 >> ϵ > 0. Our method returns an IK solution that resembles the least-squares solution to the underlying subproblems. The error between the desired and actual error in the end-effector position is often negligible in such cases. These properties make the solutions returned by the subproblems in Elias et al., and thus the solutions provided by our method, consistent and stable even across workspace boundaries.

As the offset induced in the y-direction is quite small (1mm), the trajectory plot (and also the animation) of our method's performance in this experiment is indistinguishable by the human eye from the plot in the first experiment. We therefore refrain from plotting the same figures again and refer the reader to the visualizations in the prior experiment.

Performance

NOTE: All of the following experiments were conducted on a computer with an AMD Ryzen 7 8-core processor and 64GB of DDR4 memory within Ubuntu 22.04.

We compare our method, i.e., the EAIK toolbox, to different frameworks on common 6R manipulators: The UR5 robot (three parallel and two intersecting axes), the Puma (spherical wrist and two intersecting axes), and the ABB IRB 6640 (spherical wrist and two parallel axes). A Franka Emika Panda (spherical wrist) represents the category of redundant 7R robots, which we solve by joint-locking. We further use two conceptual manipulators from Elias et al.: The “Spherical” (spherical wrist) and “3-Parallel” (three parallel axes) robot. Besides IKFast, we also list the computation times on the numerical Gauss-Newton (GN) and Levenberg-Marquard (LM) solvers implemented in the Python Robotics Toolbox.

The following figure shows a comparison of the IK computation times of six representative manipulators on 5,000 randomly assigned end-effector poses (left) and the batch-times on 10,000 random (analytically solvable) 6R manipulators (right). The measured times in (left) correspond to a single solution for the numerical approaches—which we marked with an asterisk—and the set of all possible solutions for EAIK, IKFast, and the method by He et al. respectively. In (left), we additionally include derivation times and only show our method along the numerical ones, as the derivation times of IKFast are too long for this task to finish within a reasonable time. Our method shows the smallest overall variance and, except for the Puma and Panda robot, consistently surpasses all other methods.

Further, we randomly generate 20 different 6R manipulators with their last three joints resembling a spherical wrist. The chosen manipulators cover all decisive combinations of intersecting or parallel axes relevant to our current decomposition. For these manipulators, the input to our method is a series of six homogeneous transformations that describe the position and orientation of the respective joints. The time measurements were obtained by running a batch size of 100'000 derivations.

IK derivation (left) and computation times (right)

We further compare our method to one of the current state-of-the-art methods for general analytical IK computation: IKFAST. We use five typical industrial 6R manipulators that comply with the Pieper criteria. The UR5 robot (three parallel and two intersecting axes), the Puma (spherical wrist and two intersecting axes), and the IRB 6640 (spherical wrist and two parallel axes) resemble real-world manipulators. The Spherical (spherical wrist) and 3-Parallel (three parallel axes) robots, on the other hand, are made up by Elias et al. The input to our implementation is an URDF file that contains the manipulator's structure. The input to IKFast is an equivalent COLLADA XML file.

Table: IK-derivation times of IKFast and our method

We compare our approach to the learning-based approach IKFlow by the 7R Franka Panda robot. As this robot is inherently redundant, we need to set one joint angle in advance (i.e., use joint locking) to solve the Panda robot analytically, while IKFlow is able to make use of all seven joints. Our experiments show a mean computation time of 75.07 μs for IKFlow (7507 μs per batch - IKFlow performs batched computation for 100 poses simultaneously) and 3.67 μs for our method. However, by employing joint locking, we can not sample from the same infinite solution space that IKFlow makes use of, which leads to less diverse solutions.

The following figure shows the just mentioned values for the Panda robot, as well as the position and orientation errors that different methods resulted for non-redundant UR5 robot.

Computation times and position error for the Panda robot, as well as the UR5. The dashed red lines indicates the repeatability precision of the robot according to its datasheet.

Accuracy

To further evaluate our implementation's accuracy, we sample 100 random poses throughout the workspace of a representative subset of the above mentioned manipulators. We calculate the error metric of each solution by the Frobenius norm of the difference between the homogeneous transformation of our IK's result and the ground truth, i.e., the sum of the squared differences between the entries in the matrices.

Panda computation times and Error metric across 100 poses for three representative manipulators

We further create 10'000 resampled bootstrap distributions (each 100 samples) and calculate their respective means. The means of these resamplings, together with a bias corrected and accelerated (B. Efron) 95% confidence interval, are visualized in the following figures:

IKFAST - the analytical solver that we compare our implementation to - is part of the work of:
R. Diankov. “Kinematics and Control of Robot Manipulators”. PhD thesis. Carnegie Mellon University Pittsburgh, Pennsylvania, 2010

IKFlow - the learning-based solver that we compare our implementation to - is part of the work of: B. Ames, J. Morgan, and G. Konidaris, “IKFlow: Generating diverse inverse kinematics solutions,” IEEE Robotics and Automation Letters, vol. 7, no. 3, 2022.

Python Robotics Toolbox - the toolbox we use to compare our implementation to numerical solvers - is part of the work of: P. Corke and J. Haviland, “Not your grandmother’s toolbox–the robotics toolbox reinvented for Python,” in Proc. of the IEEE Int. Conf. on Robotics and Automation (ICRA), 2021, pp. 11 357–11 363

Y. He and S. Liu, “Analytical inverse kinematics for Franka Emika Panda – a geometrical solver for 7-DOF manipulators with un- conventional design,” in Proc. of the IEEE Int. Conf. on Control, Mechatronics and Automation (ICCMA), 2021, pp. 194–199

B. Efron. "Better Bootstrap Confidence Intervals". Journal of the American Statistical Association. Vol. 82, No. 397: 171–185, 1987

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

eaik-1.2.2.tar.gz (47.2 kB view details)

Uploaded Source

Built Distributions

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

eaik-1.2.2-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13Windows x86-64

eaik-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (357.6 kB view details)

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

eaik-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (325.2 kB view details)

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

eaik-1.2.2-cp313-cp313-macosx_10_13_universal2.whl (630.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

eaik-1.2.2-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12Windows x86-64

eaik-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (357.5 kB view details)

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

eaik-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (325.1 kB view details)

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

eaik-1.2.2-cp312-cp312-macosx_10_13_universal2.whl (630.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

eaik-1.2.2-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11Windows x86-64

eaik-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (357.2 kB view details)

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

eaik-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (324.7 kB view details)

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

eaik-1.2.2-cp311-cp311-macosx_10_9_universal2.whl (625.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)

eaik-1.2.2-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10Windows x86-64

eaik-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (379.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

eaik-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (356.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

eaik-1.2.2-cp310-cp310-macosx_10_9_universal2.whl (623.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)

eaik-1.2.2-cp39-cp39-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.9Windows x86-64

eaik-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (379.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

eaik-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (356.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

eaik-1.2.2-cp39-cp39-macosx_10_9_universal2.whl (623.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file eaik-1.2.2.tar.gz.

File metadata

  • Download URL: eaik-1.2.2.tar.gz
  • Upload date:
  • Size: 47.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eaik-1.2.2.tar.gz
Algorithm Hash digest
SHA256 1f70e77e49f22e148b21a973c0dc84c2f88c5bb7fd258c6daef00b9736697e68
MD5 c1981832e1cfab5761eeeeaedc3aa99d
BLAKE2b-256 edf6326b5bdc5c9d33c400d274d790e472170b82c3e0a307cbecc54b21897e93

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2.tar.gz:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: eaik-1.2.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.4 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 eaik-1.2.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b120e7f215125126c569682810b1c3d84c486c0fef23cbe65bdb2977a6f85f56
MD5 78556b40a495724bee14726862d84348
BLAKE2b-256 f084c9bcf9b4decb84c98db87630aed464211efaba7cac234be5ebd8028d6240

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp313-cp313-win_amd64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e41e42df026e8b70230cd37b9b09c32ec1e515eabfaffbced8e1a5701cb37368
MD5 a168a6615da40a795074e5ad0e74bf01
BLAKE2b-256 3fd602b40db580c3bc304bf0e84b94d2af0c79f6b7d0d328f2e14ca7f5cad1f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7ed64f7cad1c236c2c301cf28d26f1a208a5d25752cd82207ba4b98825914e11
MD5 bef10009edccaef47e48194d3a18d090
BLAKE2b-256 f6eaa33b423866873f3302853ab8be08a13375e9c0f2a764f017565e02081cdb

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 ab9b1012c0c3beaee9ae49beb8405ff31175b0289a88b18f514c4581e0941800
MD5 cac6d59109a1403d9cff82fd80ca201b
BLAKE2b-256 f003217875aad397c454fd87204eb55adcb799986b21d0b3c4f16b3b2516df72

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: eaik-1.2.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 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 eaik-1.2.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6e1e6dcb5dabf432c6133a2be27b4ad286170b5feb81b044ee7b115344311d90
MD5 970df0cb8c6bb6daa8969bfc70262433
BLAKE2b-256 23cb9db59383ff0098489d4d32527da92c8718fd236c8fe3d2c1e13bc3460eb1

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp312-cp312-win_amd64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30e9d6c1e476edfcb4df90fb400bcd29422a3b71249ef50a3e6960a170b10d32
MD5 5b7c76fc0d7740405e625517f7564f85
BLAKE2b-256 9d150ee33b4e3eba7f7955f88279f5417fc9637650f3b6bec193c401b31656be

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 74205aa5a5abbbb3bea70427de314eb2140046033bbcbd66043cd4f821da7fcb
MD5 bcc334166f979e78b9d3f2439607af93
BLAKE2b-256 4d8e5795c4d5ccde96835f6afb93096471541d8f22c8ab5f9253284fdd55e8ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 c3d951e938d25b0d9aaa2595542d70cba29eae518791244bfacb2a18024cb15c
MD5 5906a676aa7e2e6f3ca7e12789aa9104
BLAKE2b-256 a5070f1bc0237c2040fe0c03f2722042faf9d387a2470c5d81c1a34bc23762bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: eaik-1.2.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 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 eaik-1.2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ca77461e4caed4dbef283b552355eb12f11fc9aa26eb8d77d2477367771e4680
MD5 8af09539d82775e5e246fbd81b338660
BLAKE2b-256 2aa3ad21807184322172273a5c3bacc3b6fbbad3cc0d051a8f9687dba40b6bb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp311-cp311-win_amd64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f1674d998c764abb527acc7e9a32307b8c18ee50614046049baf46be3ce8ebf3
MD5 eba42b15657ffbfc9032e7d782032201
BLAKE2b-256 5d9a5f84bce76ea29f3a115c505208dc082e06669e91ec74f033a612ae2824f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7133388deb93fb7db355a8e6e7e32f6df40069ede98aeb6d799dca92ca5fcca1
MD5 d245b14eaf8ac728dd7cf07c0604f787
BLAKE2b-256 08d7fedc238eb2e5af397f6e4c9ba79dc880bd159bf33f7c72e342a8146aeea6

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

  • Download URL: eaik-1.2.2-cp311-cp311-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 625.5 kB
  • Tags: CPython 3.11, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eaik-1.2.2-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f17d1bcdf02d519d17e77bc90010c46781d0d3ff77faa6a726add487cba52bf3
MD5 8bbe691833b642981948e443ce0bf040
BLAKE2b-256 a9537ffb79ac7617a11432116e16c4166948710427ac252b091a6d848603e084

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp311-cp311-macosx_10_9_universal2.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: eaik-1.2.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 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 eaik-1.2.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7322ba8af1bf52d871ceac01b8c811a331fc9f4ad13bec84b153a0e3228a7f6f
MD5 f9c25757c67c210ad1273dee8cc09481
BLAKE2b-256 eac8842fccefe9b5e0e30048f30def303e677a25e996b37157f4a47275ff209e

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp310-cp310-win_amd64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2713ccc3669fd88adeb2ed4ea99ccada98cb10b8585e0162022e22f73e4f1fbf
MD5 92e712086ce85210c8f19eaf366a79c2
BLAKE2b-256 75c3a16a87936082b481ef8735163dd723163b7e64969d321c24c50a6537c6fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 82bdbbb8b9b8952325981528060b15cda757baf6c37ffb08b752a6084aa62161
MD5 a74761d11959d44ee607fd7a9f35e03e
BLAKE2b-256 358eff1fcc291da736152d89f90bbad500235002f66182e8d3f862b4beaa1511

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

  • Download URL: eaik-1.2.2-cp310-cp310-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 623.2 kB
  • Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eaik-1.2.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 eee91e64ea57ddc5c76c422e0af803d14aad4a6eae321a1892e2beded7667233
MD5 cc8e247f4271c40ee1f7272dc0ea0959
BLAKE2b-256 6c13aa6b54fe52b1fc448be9ce642806e6b8ae46792d4916575a1214217e0b47

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp310-cp310-macosx_10_9_universal2.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: eaik-1.2.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eaik-1.2.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 98ca7c3b763e2573ce09cce169edd87221c4b00e363031f288c5171302f50872
MD5 ac0b3efc4f5bc6aa5c9cbf7b2f0ebbe5
BLAKE2b-256 76c30a0857ac637b6395856f6abd48d22198db700b34208c686cb3a2caf7ae39

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp39-cp39-win_amd64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17f0cf32522cc0c4d8dd4d12d76ec513090a189988964acda9000bf83d2208bd
MD5 e187c5f64dc0f5ed34d479cf0f41eac6
BLAKE2b-256 82325b73a36347e3669fd70e29760da7692b8678e39e3a102481a65774c72718

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for eaik-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8dcbbc7654e0dd8673cfc789cc37d268eae97e949853b6c18e80a1c5ba241554
MD5 4fd6675c4cdacccf12d506d94db9e68d
BLAKE2b-256 0c936f30dda99fa0bcc24dd5604712ad1d6bcda38db28a7b25d54ade7d38768e

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yaml on OstermD/EAIK

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

File details

Details for the file eaik-1.2.2-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

  • Download URL: eaik-1.2.2-cp39-cp39-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 623.5 kB
  • Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for eaik-1.2.2-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6d660704c36df5868ed44753a620d5686a558ceded50f2e8a8c869fd1665bde9
MD5 11388a6898cba2838ef27eece558a026
BLAKE2b-256 b82b083460269df8e4c1a98682142c611c78d037766a085f196624f2f2cb1729

See more details on using hashes here.

Provenance

The following attestation bundles were made for eaik-1.2.2-cp39-cp39-macosx_10_9_universal2.whl:

Publisher: release.yaml on OstermD/EAIK

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