Skip to main content

Sparse hypergraph structure and markov-propagation for node embeddings embeddings exposed via Python bindings.

Project description

Cleora logo

Achievements

:one:st place at SIGIR eCom Challenge 2020

:two:nd place and Best Paper Award at WSDM Booking.com Challenge 2021

:two:nd place at Twitter Recsys Challenge 2021

:three:rd place at KDD Cup 2021

Cleora

Cleora is a genus of moths in the family Geometridae. Their scientific name derives from the Ancient Greek geo γῆ or γαῖα "the earth", and metron μέτρον "measure" in reference to the way their larvae, or "inchworms", appear to "measure the earth" as they move along in a looping fashion.

Cleora is a general-purpose model for efficient, scalable learning of stable and inductive entity embeddings for heterogeneous relational data.

Introducing Cleora 2.0.0 - Python native

Installation

pip install pycleora

Build instructions

# prepare python env
pip install maturin

# Install pycleora in current env (meant for development)
maturin develop

# Usage example below. More examples in examples/ folder.

Changelog

Cleora is now available as a Python package pycleora. Key improvements compared to the previous version:

  • performance optimizations: ~10x faster embedding times
  • performance optimizations: significantly reduced memory usage
  • latest research: improved embedding quality
  • new feature: can create graphs from a Python iterator in addition to tsv files
  • new feature: seamless integration with NumPy
  • new feature: item attributes support via custom embeddings initialization
  • new feature: adjustable vector projection / normalization after each propagation step

Breaking changes:

  • transient modifier not supported any more - creating complex::reflexive columns for hypergraph embeddings, grouped by the transient entity gives better results.

Usage example:

from pycleora import SparseMatrix
import numpy as np
import pandas as pd
import random

# Generate example data
customers = [f"Customer_{i}" for i in range(1, 20)]
products = [f"Product_{j}" for j in range(1, 20)]

data = {
    "customer": random.choices(customers, k=100),
    "product": random.choices(products, k=100),
}

# Create DataFrame
df = pd.DataFrame(data)

# Create hyperedges
customer_products = df.groupby('customer')['product'].apply(list).values

# Convert to Cleora input format
cleora_input = map(lambda x: ' '.join(x), customer_products)

# Create Markov transition matrix for the hypergraph
mat = SparseMatrix.from_iterator(cleora_input, columns='complex::reflexive::product')

# Look at entity ids in the matrix, corresponding to embedding vectors
print(mat.entity_ids)
# ['Product_5', 'Product_3', 'Product_2', 'Product_4', 'Product_1']

# Initialize embedding vectors externally, using text, image, random vectors
# embeddings = ...

# Or use built-in random deterministic initialization
embeddings = mat.initialize_deterministically(1024)

# Perform Markov random walk, then normalize however many times we want

NUM_WALKS = 3   # The optimal number depends on the graph, typically between 3 and 7 yields good results
                # lower values tend to capture co-occurrence, higher iterations capture substitutability in a context

for i in range(NUM_WALKS):
    # Can propagate with a symmetric matrix as well, but left Markov is a great default
    embeddings = mat.left_markov_propagate(embeddings)
    # Normalize with L2 norm by default, for the embeddings to reside on a hypersphere. Can use standardization instead.
    embeddings /= np.linalg.norm(embeddings, ord=2, axis=-1, keepdims=True)

# We're done, here are our embeddings

for entity, embedding in zip(mat.entity_ids, embeddings):
    print(entity, embedding)

# We can now compare our embeddings with dot product (since they are L2 normalized)

print(np.dot(embeddings[0], embeddings[1]))
print(np.dot(embeddings[0], embeddings[2]))
print(np.dot(embeddings[0], embeddings[3]))

FAQ

Q: What should I embed?

A: Typically products, stores, urls, locations, or any entity that people interact with.

Q: How should I construct the input?

A: What works best is grouping entities co-occurring in a similar context, and feeding them in whitespace-separated lines using complex::reflexive modifier is a good idea. E.g. if you have product data, you can group the products by shopping baskets or by users. If you have urls, you can group them by browser sessions, of by (user, time window) pairs. Check out the usage example above. Grouping products by customers is just one possibility.

Q: Can I embed users and products simultaneously, to compare them with cosine similarity?

A: No, this is a methodologically wrong approach, stemming from outdated matrix factorization approaches. What you should do is come up with good product embeddings first, then create user embeddings from them. Feeding two columns e.g. user product into cleora will result in a bipartite graph. Similar products will be close to each other, similar users will be close to each other, but users and products will not necessarily be similar to each other.

Q: What embedding dimensionality to use?

A: The more, the better, but we typically work from 1024 to 4096. Memory is cheap and machines are powerful, so don't skimp on embedding size.

Q: How many iterations of Markov propagation should I use?

A: Depends on what you want to achieve. Low iterations (3) tend to approximate the co-occurrence matrix, while high iterations (7+) tend to give contextual similarity (think skip-gram but much more accurate and faster).

Q: How do I incorporate external information, e.g. entity metadata, images, texts into the embeddings?

A: Just initialize the embedding matrix with your own vectors coming from a VIT, setence-transformers, of a random projection of your numeric features. In that scenario low numbers of Markov iterations (1 to 3) tend to work best.

Q: My embeddings don't fit in memory, what do I do?

A: Cleora operates on dimensions independently. Initialize your embeddings with a smaller number of dimensions, run Cleora, persist to disk, then repeat. You can concatenate your resulting embedding vectors afterwards, but remember to normalize them afterwards!

Q: Is there a minimum number of entity occurrences?

A: No, an entity A co-occuring just 1 time with some other entity B will get a proper embedding, i.e. B will be the most similar to A. The other way around, A will be highly ranked among nearest neighbors of B, which may or may not be desirable, depending on your use case. Feel free to prune your input to Cleora to eliminate low-frequency items.

Q: Are there any edge cases where Cleora can fail?

A: Cleora works best for relatively sparse hypergraphs. If all your hyperedges contain some very common entity X, e.g. a shopping bag, then it will degrade the quality of embeddings by degenerating shortest paths in the random walk. It is a good practice to remove such entities from the hypergraph.

Q: How can Cleora be so fast and accurate at the same time?

A: Not using negative sampling is a great boon. By constructing the (sparse) Markov transition matrix, Cleora explicitly performs all possible random walks in a hypergraph in one big step (a single matrix multiplication). That's what we call a single iteration. We perform 3+ such iterations. Thanks to a highly efficient implementation in Rust, with special care for concurrency, memory layout and cache coherence, it is blazingly fast. Negative sampling or randomly selecting random walks tend to introduce a lot of noise - Cleora is free of those burdens.

Science

Read the whitepaper "Cleora: A Simple, Strong and Scalable Graph Embedding Scheme"

Cleora embeds entities in n-dimensional spherical spaces utilizing extremely fast stable, iterative random projections, which allows for unparalleled performance and scalability.

Types of data which can be embedded include for example:

  • heterogeneous undirected graphs
  • heterogeneous undirected hypergraphs
  • text and other categorical array data
  • any combination of the above

!!! Disclaimer: the numbers below are for Cleora 1.x, new version is significantly faster, but yet have to re-run the benchmarks

Key competitive advantages of Cleora:

  • more than 197x faster than DeepWalk
  • ~4x-8x faster than PyTorch-BigGraph (depends on use case)
  • star expansion, clique expansion, and no expansion support for hypergraphs
  • quality of results outperforming or competitive with other embedding frameworks like PyTorch-BigGraph, GOSH, DeepWalk, LINE
  • can embed extremely large graphs & hypergraphs on a single machine

Embedding times - example:

Algorithm FB dataset RoadNet dataset LiveJournal dataset
Cleora 00:00:43 h 00:21:59 h 01:31:42 h
PyTorch-BigGraph 00:04.33 h 00:31:11 h 07:10:00 h

Link Prediction results - example:

FB dataset RoadNet dataset LiveJournal dataset
Algorithm MRR HitRate@10 MRR HitRate@10 MRR HitRate@10
Cleora 0.072 0.172 0.929 0.942 0.586 0.627
PyTorch-BigGraph 0.035 0.072 0.850 0.866 0.565 0.672

Cleora design principles

Cleora is built as a multi-purpose "just embed it" tool, suitable for many different data types and formats.

Cleora ingests a relational table of rows representing a typed and undirected heterogeneous hypergraph, which can contain multiple:

  • typed categorical columns
  • typed categorical array columns

For example a relational table representing shopping baskets may have the following columns:

user <\t> product <\t> store

With the input file containing values:

user_id <\t> product_id product_id product_id <\t> store_id

Every column has a type, which is used to determine whether spaces of identifiers between different columns are shared or distinct. It is possible for two columns to share a type, which is the case for homogeneous graphs:

user <\t> user

Based on the column format specification, Cleora performs:

  • Star decomposition of hyper-edges
  • Creation of pairwise graphs for all pairs of entity types
  • Embedding of each graph

The final output of Cleora consists of multiple files for each (undirected) pair of entity types in the table.

Those embeddings can then be utilized in a novel way thanks to their dim-wise independence property, which is described further below.

Key technical features of Cleora embeddings

The embeddings produced by Cleora are different from those produced by Node2vec, Word2vec, DeepWalk or other systems in this class by a number of key properties:

  • efficiency - Cleora is two orders of magnitude faster than Node2Vec or DeepWalk
  • inductivity - as Cleora embeddings of an entity are defined only by interactions with other entities, vectors for new entities can be computed on-the-fly
  • updatability - refreshing a Cleora embedding for an entity is a very fast operation allowing for real-time updates without retraining
  • stability - all starting vectors for entities are deterministic, which means that Cleora embeddings on similar datasets will end up being similar. Methods like Word2vec, Node2vec or DeepWalk return different results with every run.
  • cross-dataset compositionality - thanks to stability of Cleora embeddings, embeddings of the same entity on multiple datasets can be combined by averaging, yielding meaningful vectors
  • dim-wise independence - thanks to the process producing Cleora embeddings, every dimension is independent of others. This property allows for efficient and low-parameter method for combining multi-view embeddings with Conv1d layers.
  • extreme parallelism and performance - Cleora is written in Rust utilizing thread-level parallelism for all calculations except input file loading. In practice this means that the embedding process is often faster than loading the input data.

Key usability features of Cleora embeddings

The technical properties described above imply good production-readiness of Cleora, which from the end-user perspective can be summarized as follows:

  • heterogeneous relational tables can be embedded without any artificial data pre-processing
  • mixed interaction + text datasets can be embedded with ease
  • cold start problem for new entities is non-existent
  • real-time updates of the embeddings do not require any separate solutions
  • multi-view embeddings work out of the box
  • temporal, incremental embeddings are stable out of the box, with no need for re-alignment, rotations or other methods
  • extremely large datasets are supported and can be embedded within seconds / minutes

Documentation

!!! Disclaimer the documentation below is for Cleora 1.x, to be updated for 2.x

More information can be found in the full documentation.

For details contact us at cleora@synerise.com

Cite

Please cite our paper (and the respective papers of the methods used) if you use this code in your own work:

@article{DBLP:journals/corr/abs-2102-02302,
  author    = {Barbara Rychalska, Piotr Babel, Konrad Goluchowski, Andrzej Michalowski, Jacek Dabrowski},
  title     = {Cleora: {A} Simple, Strong and Scalable Graph Embedding Scheme},
  journal   = {CoRR},
  year      = {2021}
}

License

Synerise Cleora is MIT licensed, as found in the LICENSE file.

How to Contribute

Pull requests are welcome.

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

pycleora-2.0.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distributions

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

pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.7 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.4 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl (489.8 kB view details)

Uploaded PyPymanylinux: glibc 2.12+ i686

pycleora-2.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.4 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

pycleora-2.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.6 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

pycleora-2.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (442.7 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp312-none-win_amd64.whl (316.6 kB view details)

Uploaded CPython 3.12Windows x86-64

pycleora-2.0.0-cp312-none-win32.whl (309.4 kB view details)

Uploaded CPython 3.12Windows x86

pycleora-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl (489.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.12+ i686

pycleora-2.0.0-cp312-cp312-macosx_11_0_arm64.whl (400.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pycleora-2.0.0-cp311-none-win_amd64.whl (316.6 kB view details)

Uploaded CPython 3.11Windows x86-64

pycleora-2.0.0-cp311-none-win32.whl (309.4 kB view details)

Uploaded CPython 3.11Windows x86

pycleora-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl (489.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.12+ i686

pycleora-2.0.0-cp311-cp311-macosx_11_0_arm64.whl (400.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pycleora-2.0.0-cp310-none-win_amd64.whl (316.6 kB view details)

Uploaded CPython 3.10Windows x86-64

pycleora-2.0.0-cp310-none-win32.whl (309.4 kB view details)

Uploaded CPython 3.10Windows x86

pycleora-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl (489.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.12+ i686

pycleora-2.0.0-cp310-cp310-macosx_11_0_arm64.whl (400.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pycleora-2.0.0-cp39-none-win_amd64.whl (316.6 kB view details)

Uploaded CPython 3.9Windows x86-64

pycleora-2.0.0-cp39-none-win32.whl (309.4 kB view details)

Uploaded CPython 3.9Windows x86

pycleora-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (489.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ i686

pycleora-2.0.0-cp39-cp39-macosx_11_0_arm64.whl (400.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

pycleora-2.0.0-cp38-none-win_amd64.whl (316.8 kB view details)

Uploaded CPython 3.8Windows x86-64

pycleora-2.0.0-cp38-none-win32.whl (309.5 kB view details)

Uploaded CPython 3.8Windows x86

pycleora-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.3 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (489.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ i686

pycleora-2.0.0-cp37-none-win_amd64.whl (316.8 kB view details)

Uploaded CPython 3.7Windows x86-64

pycleora-2.0.0-cp37-none-win32.whl (309.6 kB view details)

Uploaded CPython 3.7Windows x86

pycleora-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (452.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

pycleora-2.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (441.4 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

pycleora-2.0.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl (489.8 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ i686

File details

Details for the file pycleora-2.0.0.tar.gz.

File metadata

  • Download URL: pycleora-2.0.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0.tar.gz
Algorithm Hash digest
SHA256 58dacff82e839a8e2585fad658c9a690210380fbc84c042f868a4753c1c5a379
MD5 3efb75e0530eb0006baea64b753e0c98
BLAKE2b-256 285edca5d386a0fcc1a8ec6e97a98f00e9909a556cf990c6aed038f52193676e

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f16c7b6a18ad81aa30721572bc52693e4afb7632fafda1b7233401613297a334
MD5 39b871fff1ff7b15eebfebf306ad1c60
BLAKE2b-256 29c57b01349ae0c7352f3b9a77c03e79a7cfafee17e3ea1cbc050a6b9c9dbbb0

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7f2e9e0b6e6fdaa8926a7ddfa5f227212beca3639805b1a4c8cb42deee8bc719
MD5 d68754df218dfbe5eee3f20859378fc5
BLAKE2b-256 bb639edb08b5f3f7946ec08cdb046627982cd87536f2b595c34fad46883f4150

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 57975f0b5f71516bb014b1723587866f91c95921f10de82702c8ecded9ce30a4
MD5 9c916a417553ae0d4307f04ff2fa505c
BLAKE2b-256 4a96831b36a0fc8b973ce8283b8238e7730944b43eeae37f4c1259077678481d

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 334dc0ef9909c62662b2ff0f351c2321f3b5f06003e45c515d69a52fd3e06e59
MD5 5dd1d5e6b0c519bd2e726e4defff299a
BLAKE2b-256 ab771a57db0e47df5541a8ca0d3802f965727fc4300d5a62c5a6d00360808e3e

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7da14f9abf068f8bb2a702cdc83c0ca86ef908a11e586fa29d3984e9f4d1003a
MD5 928e9ee449bbe530a74171a914a5e0b1
BLAKE2b-256 9798fa57a259c2cf1d6fdec2d9d083196db8678892dfb6465fe05b7bc7168c7c

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 649e4de27d5da824ec08467f1812ec84abdfbe55c6d05522725beb64f450e37f
MD5 dfadfdcc9e2ee9e55ad76b001e41d00e
BLAKE2b-256 bf9c0e7bb5ee02a6029a7c566d52176b2f59a4f022e5231ef95feb6d0de8fc1e

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp312-none-win_amd64.whl
  • Upload date:
  • Size: 316.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 2870adbdf7e41ddcf34c8710fdbe9070fa395e74b8368bd3a62a39a98261a506
MD5 f3588a7c36416d85fdacdc9978026b43
BLAKE2b-256 c1bc0636f45c4e8e472ce41821baf16364ba4574651b2d40da07ab4b25d97dbc

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp312-none-win32.whl
  • Upload date:
  • Size: 309.4 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp312-none-win32.whl
Algorithm Hash digest
SHA256 0298282ff0e69e57df618a3f57cee1cb9071253ee6be2de2a03e4ff63a387e62
MD5 2b6c5d9f954f8445c0c9e7981a898acc
BLAKE2b-256 6363ccbeff2265ef5957f37f1d279c6dd78daeb4479aec1277f906385233d1f1

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3421b9ef8876ee1d6e48242c080c2053cf3458879da780c5c4def6809e98b707
MD5 a2058f4b0f646050172cdb5f2f1f8eb1
BLAKE2b-256 a4d441287c4dd69b8d2e0f1f3efb09d58118cd331e52d7b665aeef282e356b16

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f9ba29aead9a3cf3e50e840d85882b374166e1724a2ffe7c1bbb86ac14a86baf
MD5 b203be6fa53f19883e74a819fe5e8047
BLAKE2b-256 a2ab924792fc8568fe330e020652d45c3fe2dfd203b246a5e8b8fc7bcb540a6d

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 50af1712e8ec6abeae3341f7bec8837fd0a4f3632ff5c5de1c4a96de762c13ac
MD5 a7eaa54127f8b6bf1e4932e2b55ed446
BLAKE2b-256 e0a9f9c30a3a8d6512eabe1e805e8f0ea83997c62abc8606487c5115b885dc7a

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b44f82646fb68b2d2b9433ef2f012a6b8629e4fe20186fa450b8d25530076c6
MD5 22a9ac40e8a9d461f3a67379e5b87498
BLAKE2b-256 80db76b3af19a7efa50adf67c672ac477c61de43aad5ca352e9a70807aa9d1ab

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 316.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 b81044b1fcaea6a0a7f91497e226b8a1e0e70ad1d7c303955ea954c7a0c40169
MD5 d1ed1242bd108acf30061a245100069e
BLAKE2b-256 5f1970fa1799e65480c796191db42de8c767f89f26a5d63155dbe47ff8745988

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp311-none-win32.whl
  • Upload date:
  • Size: 309.4 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp311-none-win32.whl
Algorithm Hash digest
SHA256 1a5803ace45127642634ebc8fa36c71b93894db294f69512310f699d57cfcd3d
MD5 5ee81ce9350149d8591cf37a5f8f0cdb
BLAKE2b-256 ce1958edb3f3c0a1f279f44dd46affadd9fbadc9bcae7c7c8cf2db47278a96a3

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1aae30ec15781c148b7830a9cb85943e769dd499eec5bafc53679be5f029b9f2
MD5 bbce4abd799bf1fe67dbff5eac024d7b
BLAKE2b-256 24b964e94a55f5d289f789b5ce741b0682964fa9142613ab035f9abf83c2341f

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ca8d1d33919c31a8ad41d1b96ea49bd644e6cf43f2830b498c32059ecd723648
MD5 7227be78e09189f616d3945d31085f01
BLAKE2b-256 812648107776e3168ed3226aa7fd718b4f6a702c06218c1c7ee1e43cc3b43f40

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5cc541fa61c9de793c900a890d2b0b6b6a76f3bd470738c8011b8c9f04507ad4
MD5 da9a57ec0378702daee1b552896b99a1
BLAKE2b-256 cedea574eb5d8c4e6b8b4681953c1cdc3a11e02b19fc23de205ab07bcf745c08

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d69338930fbb26e2a547be395220f7f4a20f474980d5bb3acbccb09016d603c
MD5 94e83ebfb811dede6e18f1830f0eb762
BLAKE2b-256 88bdb95518911fb6a1e02e49943b0b54e246cb43f412464a2858d6c6718a99e6

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 316.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 758d739f4ddbfa7d299f19a87590f9fae23ba71002a4e8aadf82aa9750e6a9af
MD5 e544df6be2802872259f7bdc4c363992
BLAKE2b-256 ddda56db38a1c6304d78eb85a32e0e6969eca4bb04b207901fce6bede5c2e390

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp310-none-win32.whl
  • Upload date:
  • Size: 309.4 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp310-none-win32.whl
Algorithm Hash digest
SHA256 98d6decafd2014ab8ab7e38db696af81eb4f72105cf31e382459461f5dae71eb
MD5 9039988e98bd1a9e52bf0ad4027a2625
BLAKE2b-256 203ecb6217fdcdfd280a26cf641927c828134c4792b07ea4ebb5c722bfd50b3b

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ba3fcd0d1b91d2e4191147f739a4fb1b5a1d0bf874a3dcac20d20655f26b6c2b
MD5 78efbcdbe15477e4e51e83f8a61f40dd
BLAKE2b-256 88179cd440ad86f848c2f10ce0391405f2cee0fe3755bd2b448a6aaaf509b20e

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 607efb8f2cafd1f991cfe257cf2fa169c33d73af2ba7c0d0297c1470dbfe7290
MD5 dea5323377abcdf0f70f79b7e5197f98
BLAKE2b-256 0e0f4f4f50530548a8cb55f53ac55dab0382a6f90d8c67f31d505bb7a863d795

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 8ea03a40cf2210902a05cad99daf767aa70381cee3bde87090d48c48a128db8b
MD5 319ec34c676fe0f86753e38a98c7982b
BLAKE2b-256 8a287dede2a825ced4ec5e2c37a4744dede4fb3e5b7c7c87d751be81024104b3

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d79b86128c33e4d13a84f75398cde8581924980f0f9c5b7d906516d6cae4e5ac
MD5 a8641b02cbddc0cce4e3dc6aa60c8aca
BLAKE2b-256 56b2faabc60e2c8783bead9a598331f803347254abb4c3b20c3b9cc638b3f194

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 316.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 d4c218ab2c5e359296b64b5129e36eacff4f4466ad70623c5559ff60e4da62b9
MD5 a5b44a13bde8e49801162ddbc253a155
BLAKE2b-256 3e861ee9074d2bbec6f6a788f4cd1d71c236d8d0eb042f50a81f30dc77a42e7f

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp39-none-win32.whl
  • Upload date:
  • Size: 309.4 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp39-none-win32.whl
Algorithm Hash digest
SHA256 fbd268bb78e50eebac64443ff76b749c6ec474d05e235508ae70fe0b1c1a82b3
MD5 f5dad3725432e3dbc94c0b55d2a21573
BLAKE2b-256 cbc53f7fecb9126af3fbd10278cadcb8c1aeb6456fccfcda51201074f24e8e1e

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 99fd4ece6ee62cb6ba8ad7623c56f07e0b9204189d63551fde13806a9d94c779
MD5 b0685333ce789bab485ad49f7ff4aa4c
BLAKE2b-256 77e5960b1283f3aeac7eb036d99ddab485901db60179afcbdd7385f1b5fe35d8

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 181b9b652868319acb45bccd4508ba6299e57fb5fe97f4db17f1bdd32bcca039
MD5 42d44f97ff47ecac8b6417ca07c56495
BLAKE2b-256 0349f248dee3c9682b2459f3f7770da751b43b6c424153386cb3e32edebd9c0f

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 df8016b081ae771befdc1f29383cc49e8b0b2a7ddf67d51880db3dabe8da00bd
MD5 35070753ae35c0bbe1858ea94419073c
BLAKE2b-256 7a4b894a3e014c2abb415c7f3b4b9a56a60bf2662a6428b40e6518997959c646

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c4a2aeeb7fd6a491df8b96f4d03f7d1cd8dc44116384c1dfdfe8793d6e152306
MD5 8d9870689184dc43b771d7a568919e17
BLAKE2b-256 e9c55464d34029107488bfa711569443bb712076439054021a2f13ecefc74ecf

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp38-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 316.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 a3d237504574cc7ee856b465d608a0cd97b31d89ca66d3534f6a8013f7191d70
MD5 c799af23cb2eff4f05e1a177583d072c
BLAKE2b-256 a24298394005b2aba5b890a0cc3f8803cb00b839c7478a1a89dec5c321da88ae

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp38-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp38-none-win32.whl
  • Upload date:
  • Size: 309.5 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp38-none-win32.whl
Algorithm Hash digest
SHA256 5ad6032ed946819a1746b19c8f12147a14b6f5205208b6a426414e7119e088a3
MD5 57516c3a3130b9921efe93ca0eb88440
BLAKE2b-256 c36f8caccabf4aaa1af142a3a5c8ccb994beb9c2ecc924bc1ec47548cb9384e8

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8297a178bc948dab6072e78113f99b56e22cf53c4a5556f5ba57b009795f227d
MD5 b6dfbba9b8294de121360ac5943ba822
BLAKE2b-256 9b7c5c3b8ba5b854215373b1c69f7f751ff305133794a1c03f506db8d6c1c1ef

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eb0c1dc3ca45e6c0056bdc7de69a38c09dee95919a2847be949d8f6e5b9c7940
MD5 9f71fc4d2d579531c8c1f7697bab5822
BLAKE2b-256 01741e5d6cd9bb73efd0d63efa838c60e6f28a520f9781fa90c2555b260a9bd5

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 faaa51a56fa52e522ab20c88142f64a9c9ff73e73e5b6370f9fe8a925827ba27
MD5 37669d945604d8d7691dbb7c8d9a3ed2
BLAKE2b-256 aa0e099b7e2c90e5aa5e0f19deadc6e318a9061add0e32c78dcc30f8d2befcb0

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp37-none-win_amd64.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp37-none-win_amd64.whl
  • Upload date:
  • Size: 316.8 kB
  • Tags: CPython 3.7, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 6b9bfc2de2cc146775911a280fff960c6cc69aaccfb2dc9e4ced2498c8940b00
MD5 0a49a0d40da6c2d626972918489b5079
BLAKE2b-256 0c91a7bf92024b12596707305cebdea089b8581fbc83bcbad26d0ed2f1f032ff

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp37-none-win32.whl.

File metadata

  • Download URL: pycleora-2.0.0-cp37-none-win32.whl
  • Upload date:
  • Size: 309.6 kB
  • Tags: CPython 3.7, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.4

File hashes

Hashes for pycleora-2.0.0-cp37-none-win32.whl
Algorithm Hash digest
SHA256 568f9cfbd81b1749d3bcca1cecbd6bd0b2083a0c54daad26c082b09fc903e100
MD5 4bccabbf0b8972e2478b27fa086e12a5
BLAKE2b-256 8bded037d5f818838d7ba77107099602c2df26e9f4be42b4c7e3645f92378c3d

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9a57a9a6b82636b862f39ff22c81d86bbcf236e770461b1d20951a1070339adc
MD5 7b4796907ace213774c97154d54d1a3f
BLAKE2b-256 fc65552f83fb35a3589ec4ef6b48eef7c59a54cfdadcc26aef2f4a3f688ca401

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 751a2d81ad266698b856cf4dc57beb8f925c41f2e2420dde8a7012c64d9fb3ae
MD5 20b490a6de087c9108fa0f6b27c1aa9b
BLAKE2b-256 692e55359bbdd95cc88b450f21d084a952f733be774fe41132286fa3c2f9dba2

See more details on using hashes here.

File details

Details for the file pycleora-2.0.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for pycleora-2.0.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 b0f9f151bb6c4c404a92e3bdd918895f3bd844803d422e66aa37910f53b046f5
MD5 ecb2d48446199cde6855de0ed938b73d
BLAKE2b-256 3a1637bbac1390e7aaf7657540dc9cfc8d1693abc2be2392c47031902d30bfd0

See more details on using hashes here.

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