Skip to main content

Efficient Python library for EGT

Project description

EGTtools

Toolbox for Evolutionary Game Theory

PyPI version Documentation Status Build Join the chat at https://gitter.im/EGTTools/community Binder DOI

EGTtools provides a centralized repository with analytical and numerical methods to study/model game theoretical problems under the Evolutionary Game Theory (EGT) framework.

This library is composed of two parts:

  • a set of analytical methods implemented in Python 3
  • a set of computational methods implemented in C++ with (Python 3 bindings)

The second typed is used in cases where the state space is too big to solve analytically, and thus require estimating the model parameters through monte-carlo simulations. The C++ implementation provides optimized computational methods that can run in parallel in a reasonable time, while Python bindings make the methods easily accecible to a larger range of researchers.

Table of Contents

  1. Requirements
  2. Downloading sources
  3. Examples of usage
  4. Documentation
  5. Caveats
  6. Citing
  7. Licence
  8. Acknowledgements

Requirements

To be able to install EGTtools, you must have:

  • A recent version of Linux (only tested on Ubuntu), MacOSX (Mojave or above) or Windows
  • CMake version 3.17 or higher
  • C++ 17
  • Eigen 3.3.*
  • Boost 1.80.*
  • Python 3.7 or higher
  • If you want support for parallel operations you should install OpenMP
  • Ideally, you should also install OpenBLAS, which offers optimized implementations of linear algebra kernels for several processor architectures, and install numpy and scipy versions that use it.

Downloading sources

When cloning the repository you should also clone the submodules so that pybind11 is downloaded. You can do that by running:

git clone --recurse-submodules -j8 https://github.com/Socrats/EGTTools.git

Installation

With pip

You can install egttools directly from PyPi with:

pip install egttools

Currently, only the Linux build supports OpenMP parallelization for numerical simulations. This should normally be ok for most applications, since numerical simulations are heavy and should be run on High Power Computing (HPC) clusters which normally run Linux distributions.

We are investigating how to provide support for OpenMP in both Windows and Mac. In the meantime, if you really want to run numerical simulations on either of the two platforms, you should follow the compilation instructions below and try to link OpenMP for your platform yourself. Please, if you manage to do so, open an issue or a pull request with your solutions.

Note: For Apple M1 (arm64) you should install using pip install egttools --no-deps so that pip does not install the dependencies of the package. You should then install these dependencies through a virtual environment created with miniforge (see Caveats for more information on why this is necessary). Once you have miniforge installed you can do the following (assuming that you are in the base miniforge environment):

conda create -n egtenv python=3.9
conda activate egtenv
conda install numpy
conda install scipy
conda install matplotlib
conda install networkx
conda install seaborn

Build from source

To build egttools from source follow the following steps.

To install all required packages run:

python -m venv egttools-env
source egttools-env/bin/activate
pip install -r requirements.txt

Or with anaconda:

conda env create -f environment.yml
conda activate egttools-env

Also, to make your virtual environment visible to jupyter:

conda install ipykernel # or pip install ipykernel
python -m ipykernel install --user --name=egttools-env

You can build EGTtools in your virtual environment by running:

pip install build
cd <path>
python -m build

Where <path> represents the path to the EGTtools folder. If you are running this while inside the EGTtools folder, then <path> is simply ./.

Finally, you can install EGTtools in development mode, this will allow the installation to update with new modifications to the package:

python -m pip install -e <path>

If you don't want development mode, you can skip the option -e.

Examples of usage

The Analytical example is a jupyter notebook which analyses analytically the evolutionary dynamics in a (2-person, 2-actions, one-shot) Hawk-Dove game.

The Numerical example is a jupyter notebook which analyses through numerical simulations the evolutionary dynamics in a (2-person, 2-actions, one-shot) Hawk-Dove game.

The Invasion example is a jupyter notebook calculates the fixation probabilities and stationary distribution of a Normal Form Game with 5 strategies and then plots an invasion diagram.

The Plot 2 Simplex is a jupyter notebook that shows how to use EGTtools to plot the evolutionary dynamics in a 2 Simplex (a triangle), both for infinite and finite populations.

You can also check all these notebooks and a bit more on this tutorial repository

For example, assuming the following payoff matrix:

A=\begin{pmatrix} -0.5 & 2 \ 0 & 0 \end{pmatrix}

You can plot the gradient of selection in a finite population of (Z=100) individuals and assuming and intensity of selection \beta=1 in the following way:

import numpy as np
from egttools.analytical import PairwiseComparison
from egttools.games import Matrix2PlayerGameHolder

beta = 1;
Z = 100;
nb_strategies = 2;
A = np.array([[-0.5, 2.], [0., 0.]])
pop_states = np.arange(0, Z + 1, 1)

game = Matrix2PlayerGameHolder(nb_strategies, payoff_matrix=A)

# Instantiate evolver and calculate gradient
evolver = PairwiseComparison(population_size=Z, game=game)
gradients = np.array([evolver.calculate_gradient_of_selection(beta, np.array([x, Z - x])) for x in range(Z + 1)])

Afterwards, you can plot the results with:

from egttools.plotting import plot_gradients

plot_gradients(gradients, figsize=(4, 4), fig_title="Hawk-Dove game stochastic dynamics",
               marker_facecolor='white',
               xlabel="frequency of hawks (k/Z)", marker="o", marker_size=20, marker_plot_freq=2)

Gradient of selection

And you can plot the stationary distribution for a mutation rate \mu=1eˆ{-3} with:

import matplotlib.pyplot as plt
from egttools.utils import calculate_stationary_distribution

transitions = evolver.calculate_transition_matrix(beta, mu=1e-3)
stationary_with_mu = calculate_stationary_distribution(transitions.transpose())
fig, ax = plt.subplots(figsize=(5, 4))
fig.patch.set_facecolor('white')
lines = ax.plot(np.arange(0, Z + 1) / Z, stationary_with_mu)
plt.setp(lines, linewidth=2.0)
ax.set_ylabel('stationary distribution', size=16)
ax.set_xlabel('$k/Z$', size=16)
ax.set_xlim(0, 1)
plt.show()

Stationary distribution

We can obtain the same results through numerical simulations. The error will depend on how many independent simulations you perform and for how long you let the simulation run. While a future implementation will offer an adaptive method to vary these parameters depending on the variations between the estimated distributions, for the moment it is important that you let the simulation run for enough generations after it has achieved a steady state. Here is a comparison between analytical and numerical results:

from egttools.numerical import PairwiseComparisonNumerical
from egttools.games import NormalFormGame

# Instantiate the game
game = NormalFormGame(1, A)
numerical_evolver = PairwiseComparisonNumerical(Z, game, 1000000)

# We do this for different betas
betas = np.logspace(-4, 1, 50)
stationary_points = []
# numerical simulations
for i in range(len(betas)):
    stationary_points.append(numerical_evolver.stationary_distribution(30, int(1e6), int(1e3),
                                                                       betas[i], 1e-3))
stationary_points = np.asarray(stationary_points)
# Now we estimate the probability of Cooperation for each possible state
state_frequencies = np.arange(0, Z + 1) / Z
coop_level = np.dot(state_frequencies, stationary_points.T)

Lastly, we plot the results:

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(1 - coop_level_analytical, coop_level)

# Finally, we plot and compare visually (and check how much error we get)
fig, ax = plt.subplots(figsize=(7, 5))
# ax.scatter(betas, coop_level, label="simulation")
ax.scatter(betas, coop_level_analytical, marker='x', label="analytical")
ax.scatter(betas, coop_level, marker='o', label="simulation")
ax.text(0.01, 0.535, 'MSE = {0:.3e}'.format(mse), style='italic',
        bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})
ax.legend()
ax.set_xlabel(r'$\beta$', fontsize=15)
ax.set_ylabel('Cooperation level', fontsize=15)
ax.set_xscale('log')
plt.show()

Comparison numerical analytical

Finally, you may also visualize the result of independent simulations:

init_states = np.random.randint(0, Z + 1, size=10, dtype=np.uint64)
output = []
for i in range(10):
    output.append(evolver.run(int(1e6), 1, 1e-3,
                              [init_states[i], Z - init_states[i]]))
# Plot each year's time series in its own facet
fig, ax = plt.subplots(figsize=(5, 4))

for run in output:
    ax.plot(run[:, 0] / Z, color='gray', linewidth=.1, alpha=0.6)
ax.set_ylabel('k/Z')
ax.set_xlabel('generation')
ax.set_xscale('log')

Comparison numerical analytical

Plotting the dynamics in a 2 Simplex

EGTtools can also be used to visualize the evolutionary dynamics in a 2 Simplex. In the example bellow, we use the egttools.plotting.plot_replicator_dynamics_in_simplex which calculates the gradients on a simplex given an initial payoff matrix and returns a egttools.plotting.Simplex2D object which can be used to plot the 2 Simplex.

import numpy as np
import matplotlib.pyplot as plt
from egttools.plotting import plot_replicator_dynamics_in_simplex

payoffs = np.array([[1, 0, 0],
                    [0, 2, 0],
                    [0, 0, 3]])
type_labels = ['A', 'B', 'C']

fig, ax = plt.subplots(figsize=(10, 8))

simplex, gradient_function, roots, roots_xy, stability = plot_replicator_dynamics_in_simplex(payoffs, ax=ax)

plot = (simplex.add_axis(ax=ax)
        .draw_triangle()
        .draw_gradients(zorder=0)
        .add_colorbar()
        .add_vertex_labels(type_labels)
        .draw_stationary_points(roots_xy, stability)
        .draw_trajectory_from_roots(gradient_function,
                                    roots,
                                    stability,
                                    trajectory_length=15,
                                    linewidth=1,
                                    step=0.01,
                                    color='k', draw_arrow=True,
                                    arrowdirection='right',
                                    arrowsize=30, zorder=4, arrowstyle='fancy')
        .draw_scatter_shadow(gradient_function, 300, color='gray', marker='.', s=0.1, zorder=0)
        )

ax.axis('off')
ax.set_aspect('equal')

plt.xlim((-.05, 1.05))
plt.ylim((-.02, simplex.top_corner + 0.05))
plt.show()

2 Simplex dynamics in infinite populations

The same can be done for finite populations, with the added possibility to plot the stationary distribution inside the triangle (see simplex plotting and simplified simplex plotting for a more in depth examples).

Documentation

The analytical module contains classes and functions that you may use to investigate the evolutionary dynamics in N-player games. For now only the replicator dynamics (for infinite populations) and the Pairwise Comparison imitation process (for finite populations) are implemented.

When your state-space is too big (in finite populations), it might become computationally hard to solve the system analytically. Thus, we provide an efficient numerical module written in C++ and compiled to Python. You may use it to estimate the fixation probabilities and stationary distribution through Monte-Carlo simulations, or perform individual runs of the Moran process.

You can find more information in the ReadTheDocs documentation.

Caveats

  1. On Apple M1 (arm64) you should install (for the moment) miniforge, create a conda environment using it, and install EGTtools from the conda environment.

  2. In MacOSX it is assumed that you have Homebrew installed.

  3. You should install libomp with homebrew brew install libomp if you want to have support for parallel operations ( there is a big difference in computation time).

  4. You must have Eigen 3.3.* installed.

  5. You do not need any of the above if you install EGTtools through pip install egttools --no-deps. However, on Apple M1 (arm64) you still need to install the dependencies through miniforge, since only there you can find a scipy wheel that supports this architecture.

Citing

If you use EGTtools in your publications, please cite it in the following way with bibtex:

@article{Fernandez2023,
  author = {Fernández Domingos, Elias and Santos, Francisco C. and Lenaerts, Tom},
  title = {EGTtools: Evolutionary game dynamics in Python},
  journal = {iScience},
  volume = {26},
  number = {4},
  pages = {106419},
  year = {2023},
  issn = {2589-0042},
  doi = {https://doi.org/10.1016/j.isci.2023.106419}
}

Or in text format:

Fernández Domingos, E., Santos, F. C. & Lenaerts, T. EGTtools: Evolutionary game dynamics in Python. iScience 26, 106419 (2023).

And to cite the current version of EGTtools you can use:

@misc{Fernandez2020,
  author = {Fernández Domingos, Elias},
  title = {EGTTools: Toolbox for Evolutionary Game Theory (0.1.12)},
  year = {2022},
  month = {Dec},
  journal = {Zenodo},
  doi = {10.5281/zenodo.7458631}
}

Moreover, you may find our article at here.

Licence

Acknowledgements

  • Great parts of this project have been possible thanks to the help of Yannick Jadoul author of Parselmouth and Eugenio Bargiacchi author of AIToolBox. They are both great programmers and scientists, so it is always a good idea to check out their work.
  • EGTtools makes use of the amazing pybind11. library to provide a Python interface for optimized monte-carlo simulations written in C++.

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

egttools-0.1.13.5.tar.gz (3.2 MB view details)

Uploaded Source

Built Distributions

egttools-0.1.13.5-cp312-cp312-win_amd64.whl (493.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

egttools-0.1.13.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (633.9 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp312-cp312-macosx_11_0_arm64.whl (504.2 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

egttools-0.1.13.5-cp312-cp312-macosx_10_9_x86_64.whl (562.6 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

egttools-0.1.13.5-cp311-cp311-win_amd64.whl (492.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

egttools-0.1.13.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.7 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp311-cp311-macosx_11_0_arm64.whl (499.5 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

egttools-0.1.13.5-cp311-cp311-macosx_10_9_x86_64.whl (549.8 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

egttools-0.1.13.5-cp310-cp310-win_amd64.whl (490.8 kB view details)

Uploaded CPython 3.10 Windows x86-64

egttools-0.1.13.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp310-cp310-macosx_11_0_arm64.whl (498.6 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

egttools-0.1.13.5-cp310-cp310-macosx_10_9_x86_64.whl (548.3 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

egttools-0.1.13.5-cp39-cp39-win_amd64.whl (468.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

egttools-0.1.13.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp39-cp39-macosx_11_0_arm64.whl (498.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

egttools-0.1.13.5-cp39-cp39-macosx_10_9_x86_64.whl (548.4 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

egttools-0.1.13.5-cp38-cp38-win_amd64.whl (491.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

egttools-0.1.13.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (638.3 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp38-cp38-macosx_11_0_arm64.whl (498.4 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

egttools-0.1.13.5-cp38-cp38-macosx_10_9_x86_64.whl (548.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

egttools-0.1.13.5-cp37-cp37m-win_amd64.whl (494.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

egttools-0.1.13.5-cp37-cp37m-win32.whl (402.7 kB view details)

Uploaded CPython 3.7m Windows x86

egttools-0.1.13.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (657.6 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

egttools-0.1.13.5-cp37-cp37m-macosx_10_9_x86_64.whl (535.7 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file egttools-0.1.13.5.tar.gz.

File metadata

  • Download URL: egttools-0.1.13.5.tar.gz
  • Upload date:
  • Size: 3.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for egttools-0.1.13.5.tar.gz
Algorithm Hash digest
SHA256 0b4f6bcf68d7911454fce47fc5587685857369c2b5ffa73888edeb6ac9d6df73
MD5 340498aba6b68da81d217a5ab6cb59de
BLAKE2b-256 3bb55d1ae9185d1d1e8d8d68efcc09c0dea8ac157ac7cfd83ef2736d662520ae

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d57f621a18c73d13cf5be383e1ca117c3a5047297800b5bff91cbe7c5d725d5d
MD5 6d7938d48d0ecc79dd23cb44dc205894
BLAKE2b-256 ec3c879e8417a444d82eab9375f188fd72e7349397737019b06ba6b486ece143

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b5e72f58da6d79e85a54a6c200aecade8c1cfc8eb5b6b347154afbda0337776
MD5 ae99644a5c9b43429c9c3815a0a15d13
BLAKE2b-256 68f8dfedab1caf0f005dd406081afbce93c8321467083fe699ce86fbcad4d1df

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 19fc3f94e636a74147095f1fac70dd7bf6973b6b7dae578b39c2f35b2c62769b
MD5 f02ca50457663570a75417fa1dd29d44
BLAKE2b-256 7ac406e217373a231fe16e243f42b89eb1cfd6f6d8a921d9c033a2d2441d1bb2

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a102126f8fb3284ccca34d4e40409750aea7fb1611a2302e20af0ab7955bd5f9
MD5 45d81aee5720dc60ad34e071a6d712f5
BLAKE2b-256 809ec06ab2624ceafb8a91d8ce2c069455def0398c2630fc4074103ba0667c63

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d11045a4ef60d53da2b8e5a52fcf5867ffc6266f9a9a84b05d8521010b8d3d47
MD5 d25442a0359b7d2a540e8f20c5e84bab
BLAKE2b-256 9654b3029b1a92b85fb5b74895565b65bb91b712f0c0ee67df2441f9da814d5d

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0d4fa33ee071f3b4417002fe3d4da5c86b54cd40761d32d50e17c3889b40894b
MD5 d6ff5d883d71df6ecb1c238b46e9eac3
BLAKE2b-256 3c8db6836528aab156434d51e5ebbb7bb45f79f9ccd1ca307bb75be1f3c09f62

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8bde603b2df5bb60757c70d5091ce461deda42b1303e21d702b3d3508a7f9b85
MD5 f4905659fbb91d9fb7712658eedbee04
BLAKE2b-256 b085eb3a371877b663ce0575be02cc179afcb3ed3e403519e4b214353161d54b

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c79ae02876076a167905bdb8f14cff32e8fefb53b7ff604f8a07217f2ef01ee3
MD5 8c2aa2cfac68d47122d4c609297c0d70
BLAKE2b-256 ee6a86388353bdf2a18305000b2995530d2eaca3df85591303ac76af7b651998

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b9daa1d5e20f39f50f0ff8d15fb0810454221fe3ce8de76d027c7c1f619317ad
MD5 6085235b0982b9de548ca8b467daa4d4
BLAKE2b-256 85f4e02a3dec72e656aba329b21bfea4c0ab72b50cfd349a0931569be8d38c02

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6157db51fd46f1b847ec1d078acf7e211642ff13295d59cb2be78f59d4d59773
MD5 feb8288a9d8ed02fe3039eecb8d3c9cd
BLAKE2b-256 242d898a0ddc642e8a731e6d41e0c25dda82647f6f2f06e353017e3780a48693

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c6116eb64567995350436356fc927d763d5cfd373b1eb81a085112d9eb39bfe8
MD5 e2ab278f82633ced0bd643d1d62676d7
BLAKE2b-256 5c6313ab6c6c8fe0e6ac79eddf871b0a28c363de8d2e6dea60c179b0cffb17d4

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b6cacd9add7d2c40781f76d617c61957ac6455c69bf3b3641687c5036296e718
MD5 f80dcbb7ecd5960b49a89efd8a78f1f3
BLAKE2b-256 31b5033d8b04c6116fd97e243f6bafdea637dd2ea616e685d77477ef246d6d3a

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 77c278a28dcd129e2af1cadce2b5fd1afdf30c89b93b89a37626f57c1b8c6826
MD5 dabd3bbe1b3131d479272be6bcea1013
BLAKE2b-256 e2a03ff51eee613ce760f3bb4620add06b216499d8a98b2838aa8f6ff88d524e

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ec05611bb84506b0fb13da7d669a94373f6898bfda78c177778fcab315e3dcd0
MD5 304b62690a18329c59a2855d721101c9
BLAKE2b-256 5f1d1035540eadfa1b82bab4d32313c0091bc17842107370d65b484e03507390

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cefa1b77decac855972ab4803aa14ed613f3ceb81fa3d7cc4e71d7c94fd0a32e
MD5 1eef834ae47ec2c3a699e33f18b24c1b
BLAKE2b-256 70b4931282bdc8e216f3fbfc702cccc62860d8bc8a63c55cd564889b37d4e6fc

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fe97068d1e0e4eddb300a2a481f68c2217f4301a204d75ebbce6d246a16c6f95
MD5 149de02eed212b77a58e2bc4b8d79630
BLAKE2b-256 85311cfb3568d2f67b3a3215bedbdcdcc61a93e3eb34f4b30538f1caed0028d8

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 b938ba41fd583efa5c8959b2e141a24a83562bd3280a0b63b80b360c3067755b
MD5 185e81b0f59445221c8b3420205f48eb
BLAKE2b-256 aa9b987c73f2c7e085f8a5f05b502dc04e057f8415d3652af12228d05cb44b14

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 55a75ae3964e95dd73d2ad1ccd2274cb6d75d2e9de3db637d4d85771a5e69519
MD5 57f6db5a7589b5a7880c027cb4536576
BLAKE2b-256 1b45cba61743864bab1697cbe6e0164a703172f85d798ba7625e0d3fed15dbcc

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ff705d4d50d876216d3a09821ee0245776d28007c57e1ee885c2a07ea85d03aa
MD5 7ca0658bfd81bc583b20e7fa554f66b8
BLAKE2b-256 e2cbe979998e65a7bcc0bfa314bb05f23b87412735affb3d99857f30bd0e863e

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5bdbcfb7c46bc81967c65736962de99c2b215d11179d1cd0c2316a2ec5d47560
MD5 be34fe5b341f3bc4f42bc01e7d1f4752
BLAKE2b-256 d69f2d288491b9f32c7f3e484b6e54ad0a914ec403cd49be603b2edb6ceca2cc

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 88f1afbf62f93c7efa420d1b870af6b422679112b6d0e2b7204dcfc5cef7fca7
MD5 2513277c4bb3bff9c8475186c1dea42f
BLAKE2b-256 c5a84441797b98ca3365eeae6722af80a891d590fade9a82d6790c162b342d34

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp37-cp37m-win32.whl.

File metadata

  • Download URL: egttools-0.1.13.5-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 402.7 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for egttools-0.1.13.5-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 a6d29153682332253e1c3d36d0adcd7c305cb1c1a2de78a2b28354d2897be56e
MD5 d7a56dd49c0ceedf54e850bbf8025a59
BLAKE2b-256 24b15a073dfbb228f38858ff0c558ea45c59acab968f5e518dae5c2b7c1255e5

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 25305ed17da20469e762b676d1ffceac29655291861f3383cb45d8116aad5c33
MD5 2d86161ad7cc8d1aa1ebe9a6ecc466b4
BLAKE2b-256 3af0c4b2253bfe36bbf04187b8a528151fe4b140f89cb39f68db8df5bc4f4d88

See more details on using hashes here.

File details

Details for the file egttools-0.1.13.5-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for egttools-0.1.13.5-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 658131f289713aff0e516709c1ba71ab0d98c5a3747818cc100597c3b4aeb527
MD5 d63f244dea5a687fb01a7ab86b91536d
BLAKE2b-256 62b2a85655af68222e2caa7fd12c5dadfe9572a0917904ee10e26cf76ee25f55

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page