Skip to main content

Implementation of Optimal Sparse Regression Trees

Project description

OSRT Documentation

Implementation of Optimal Sparse Regression Tree (OSRT). This is implemented based on Generalized Optimal Sparse Decision Tree framework (GOSDT). If you need classification trees, please use GOSDT.

image

Table of Content


Installation

You may use the following commands to install OSRT along with its dependencies on macOS, Ubuntu and Windows.
You need Python 3.9 or later to use the module osrt in your project.

pip3 install attrs packaging editables pandas sklearn sortedcontainers gmpy2 matplotlib
pip3 install osrt

You need to install gmpy2==2.0.a1 if You are using Python 3.12

Compilation

Please refer to the manual to build the C++ command line interface and the Python extension module and run the experiment with example datasets on your machine.


Configuration

The configuration is a JSON object and has the following structure and default values:

{ 
  "regularization": 0.05,
  "depth_budget": 0,
  "k_cluster": true,

  "metric": "L2",
  "weights": [],

  "time_limit": 0,
  "uncertainty_tolerance": 0.0,
  "upperbound": 0.0,
  "worker_limit": 1,
  "stack_limit": 0,
  "precision_limit": 0,
  "model_limit": 1,

  "verbose": false,
  "diagnostics": false,
  "balance": false,
  "look_ahead": true,

  "model": "",
  "timing": "",
  "trace": "",
  "tree": "",
  "profile": ""
}

Key parameters

regularization

  • Values: Decimal within range [0,1]
  • Description: Used to penalize complexity. A complexity penalty is added to the risk in the following way.
    ComplexityPenalty = # Leaves x regularization
    
  • Default: 0.05
  • Note: We highly recommend setting the regularization to a value larger than 1/num_samples. A small regularization could lead to a longer training time and possible overfitting.

depth_budget

  • Values: Integers >= 1
  • Description: Used to set the maximum tree depth for solutions, counting a tree with just the root node as depth 1. 0 means unlimited.
  • Default: 0

k_cluster

  • Values: true or false
  • Description: Enables the kmeans lower bound
  • Default: true

metric

  • Values: L1 or L2
  • Description: The metric used in loss function. Mean squared error if L2, mean absolute error if L1.
  • Default: L2

weights

  • Values: Vector of real numbers
  • Description: Weights assigned to each sample in training dataset. Empty vector means samples are unweighted.
  • Default: []

More parameters

Flag

look_ahead

  • Values: true or false
  • Description: Enables the one-step look-ahead bound implemented via scopes
  • Default: true

diagnostics

  • Values: true or false
  • Description: Enables printing of diagnostic trace when an error is encountered to standard output
  • Default: false

verbose

  • Values: true or false
  • Description: Enables printing of configuration, progress, and results to standard output
  • Default: false

Tuners

uncertainty_tolerance

  • Values: Decimal within range [0,1]
  • Description: Used to allow early termination of the algorithm. Any models produced as a result are guaranteed to score within the lowerbound and upperbound at the time of termination. However, the algorithm does not guarantee that the optimal model is within the produced model unless the uncertainty value has reached 0.
  • Default: 0.0

upperbound

  • Values: Decimal within range [0,1]
  • Description: Used to limit the risk of model search space. This can be used to ensure that no models are produced if even the optimal model exceeds a desired maximum risk. This also accelerates learning if the upperbound is taken from the risk of a nearly optimal model.
  • Special Cases: When set to 0, the bound is not activated.
  • Default: 0.0

Limits

time_limit

  • Values: Decimal greater than or equal to 0
  • Description: A time limit upon which the algorithm will terminate. If the time limit is reached, the algorithm will terminate with an error.
  • Special Cases: When set to 0, no time limit is imposed.
  • Default: 0

model_limit

  • Values: Decimal greater than or equal to 0
  • Description: The maximum number of models that will be extracted into the output.
  • Special Cases: When set to 0, no output is produced.
  • Default: 1

precision_limit

  • Values: Decimal greater than or equal to 0
  • Description: The maximum number of significant figures considered when converting ordinal features into binary features.
  • Special Cases: When set to 0, no limit is imposed.
  • Default: 0

stack_limit

  • Values: Decimal greater than or equal to 0
  • Description: The maximum number of bytes considered for use when allocating local buffers for worker threads.
  • Special Cases: When set to 0, all local buffers will be allocated from the heap.
  • Default: 0

worker_limit

  • Values: Decimal greater than or equal to 1
  • Description: The maximum number of threads allocated to executing th algorithm.
  • Special Cases: When set to 0, a single thread is created for each core detected on the machine.
  • Default: 1

Files

model

  • Values: string representing a path to a file.
  • Description: The output models will be written to this file.
  • Special Case: When set to empty string, no model will be stored.
  • Default: Empty string

profile

  • Values: string representing a path to a file.
  • Description: Various analytics will be logged to this file.
  • Special Case: When set to empty string, no analytics will be stored.
  • Default: Empty string

timing

  • Values: string representing a path to a file.
  • Description: The training time will be appended to this file.
  • Special Case: When set to empty string, no training time will be stored.
  • Default: Empty string

trace

  • Values: string representing a path to a directory.
  • Description: snapshots used for trace visualization will be stored in this directory
  • Special Case: When set to empty string, no snapshots are stored.
  • Default: Empty string

tree

  • Values: string representing a path to a directory.
  • Description: snapshots used for trace-tree visualization will be stored in this directory
  • Special Case: When set to empty string, no snapshots are stored.
  • Default: Empty string

Example

Example code to run GOSDT with threshold guessing, lower bound guessing, and depth limit. The example python file is available in gosdt/example.py. A tutorial ipython notebook is available in gosdt/tutorial.ipynb.

import pandas as pd
import numpy as np
import time
from model.osrt import OSRT

# read the dataset
# preprocess your data otherwise OSRT will binarize continuous feature using all threshold values.
df = pd.read_csv("experiments/datasets/airfoil/airfoil.csv")
X, y = df.iloc[:,:-1].values, df.iloc[:,-1].values
h = df.columns[:-1]
X = pd.DataFrame(X, columns=h)
X_train = X
y_train = pd.DataFrame(y)
print("X:", X.shape)
print("y:",y.shape)

# train OSRT model
config = {
    "regularization": 0.007,
    "depth_budget": 6,
    "model_limit": 100,

    "metric": "L2",
    "weights": [],

    "verbose": False,
    "diagnostics": True,
    }

model = OSRT(config)

model.fit(X_train, y_train)

print("evaluate the model, extracting tree and scores", flush=True)

# get the results
train_acc = model.score(X_train, y_train)
n_leaves = model.leaves()
n_nodes = model.nodes()
time = model.time

print("Model training time: {}".format(time))
print("Training score: {}".format(train_acc))
print("# of leaves: {}".format(n_leaves))
print(model.tree)

Output

X: (1503, 17)
y: (1503,)
osrt reported successful execution
training completed. 4.664 seconds.
bounds: [0.743839..0.743839] (0.000000) normalized loss=0.631839, iterations=46272
evaluate the model, extracting tree and scores
Model training time: 4.664000034332275
Training score: 30.060801844008466
# of leaves: 16
if feature_1_1 = 1 and feature_2_2 = 1 then:
    predicted class: 112.945831
    normalized loss penalty: 0.01
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_2_2 = 1 and feature_5_3 = 1 then:
    predicted class: 116.111771
    normalized loss penalty: 0.028
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_2_2 = 1 and feature_4_71.3 = 1 and feature_5_3 != 1 then:
    predicted class: 128.063248
    normalized loss penalty: 0.034
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_2_2 = 1 and feature_3_0.1016 = 1 and feature_4_71.3 != 1 and feature_5_3 != 1 then:
    predicted class: 120.686447
    normalized loss penalty: 0.037
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_2_2 = 1 and feature_3_0.1016 != 1 and feature_4_71.3 != 1 and feature_5_3 != 1 then:
    predicted class: 125.050087
    normalized loss penalty: 0.021
    complexity penalty: 0.007

else if feature_1_2 = 1 and feature_2_2 != 1 and feature_3_0.3048 = 1 then:
    predicted class: 109.278999
    normalized loss penalty: 0.0
    complexity penalty: 0.007

else if feature_1_2 != 1 and feature_1_3 = 1 and feature_2_2 != 1 and feature_3_0.3048 = 1 then:
    predicted class: 107.651497
    normalized loss penalty: 0.0
    complexity penalty: 0.007

else if feature_1_1 = 1 and feature_1_2 != 1 and feature_1_3 != 1 and feature_2_2 != 1 and feature_3_0.3048 = 1 then:
    predicted class: 113.869255
    normalized loss penalty: 0.003
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_1_2 != 1 and feature_1_3 != 1 and feature_2_2 != 1 and feature_3_0.3048 = 1 then:
    predicted class: 124.200935
    normalized loss penalty: 0.038
    complexity penalty: 0.007

else if feature_1_1 = 1 and feature_2_2 != 1 and feature_3_0.2286 = 1 and feature_3_0.3048 != 1 then:
    predicted class: 115.355225
    normalized loss penalty: 0.004
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_1_3 = 1 and feature_2_2 != 1 and feature_3_0.2286 = 1 and feature_3_0.3048 != 1 then:
    predicted class: 112.966003
    normalized loss penalty: 0.0
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_1_3 != 1 and feature_2_2 != 1 and feature_3_0.2286 = 1 and feature_3_0.3048 != 1 then:
    predicted class: 125.296906
    normalized loss penalty: 0.096
    complexity penalty: 0.007

else if feature_1_1 = 1 and feature_2_2 != 1 and feature_3_0.1524 = 1 and feature_3_0.2286 != 1 and feature_3_0.3048 != 1 then:
    predicted class: 116.648323
    normalized loss penalty: 0.009
    complexity penalty: 0.007

else if feature_1_1 != 1 and feature_2_2 != 1 and feature_3_0.1524 = 1 and feature_3_0.2286 != 1 and feature_3_0.3048 != 1 then:
    predicted class: 125.097855
    normalized loss penalty: 0.112
    complexity penalty: 0.007

else if feature_2_2 != 1 and feature_2_3 = 1 and feature_3_0.1524 != 1 and feature_3_0.2286 != 1 and feature_3_0.3048 != 1 then:
    predicted class: 122.649429
    normalized loss penalty: 0.067
    complexity penalty: 0.007

else if feature_2_2 != 1 and feature_2_3 != 1 and feature_3_0.1524 != 1 and feature_3_0.2286 != 1 and feature_3_0.3048 != 1 then:
    predicted class: 128.906433
    normalized loss penalty: 0.173
    complexity penalty: 0.007

Structure

This repository contains the following directories and files:

  • .github: Configurations for GitHub action runners.
  • doc: Documentation
  • experiments: Datasets and their configurations to run experiments
  • osrt: Python implementation and wrappers around C++ implementation
  • include: Required 3rd-party header-only libraries
  • log: Log files
  • src: Source files for C++ implementation and Python binding
  • test: Source files for unit tests
  • build.py: Python script that builds the project automatically
  • CMakeLists.txt: Configuration file for the CMake build system
  • pyproject.toml: Configuration file for the SciKit build system
  • setup.py: Python script that builds the wheel file

Structure

This repository contains the following directories and files:

  • .github: Configurations for GitHub action runners.
  • doc: Documentation
  • experiments: Datasets and their configurations to run experiments
  • osrt: Jupyter notebook, Python implementation and wrappers around C++ implementation
  • include: Required 3rd-party header-only libraries
  • log: Log files
  • src: Source files for C++ implementation and Python binding
  • test: Source files for unit tests
  • build.py: Python script that builds the project automatically
  • CMakeLists.txt: Configuration file for the CMake build system
  • pyproject.toml: Configuration file for the SciKit build system
  • setup.py: Python script that builds the wheel file

FAQs

If you run into any issues when running OSRT, consult the FAQs first.


License

This software is licensed under a 3-clause BSD license (see the LICENSE file for details).


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

osrt-0.1.4.tar.gz (5.0 MB view details)

Uploaded Source

Built Distributions

osrt-0.1.4-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (528.0 kB view details)

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

osrt-0.1.4-cp312-abi3-macosx_14_0_arm64.whl (572.1 kB view details)

Uploaded CPython 3.12+ macOS 14.0+ ARM64

osrt-0.1.4-cp312-abi3-macosx_13_0_x86_64.whl (665.8 kB view details)

Uploaded CPython 3.12+ macOS 13.0+ x86-64

osrt-0.1.4-cp312-abi3-macosx_12_0_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.12+ macOS 12.0+ x86-64

osrt-0.1.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (528.0 kB view details)

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

osrt-0.1.4-cp311-abi3-macosx_14_0_arm64.whl (572.1 kB view details)

Uploaded CPython 3.11+ macOS 14.0+ ARM64

osrt-0.1.4-cp311-abi3-macosx_13_0_x86_64.whl (665.8 kB view details)

Uploaded CPython 3.11+ macOS 13.0+ x86-64

osrt-0.1.4-cp311-abi3-macosx_12_0_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.11+ macOS 12.0+ x86-64

osrt-0.1.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (528.0 kB view details)

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

osrt-0.1.4-cp310-abi3-macosx_14_0_arm64.whl (572.1 kB view details)

Uploaded CPython 3.10+ macOS 14.0+ ARM64

osrt-0.1.4-cp310-abi3-macosx_13_0_x86_64.whl (665.8 kB view details)

Uploaded CPython 3.10+ macOS 13.0+ x86-64

osrt-0.1.4-cp310-abi3-macosx_12_0_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.10+ macOS 12.0+ x86-64

osrt-0.1.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (528.0 kB view details)

Uploaded CPython 3.9+ manylinux: glibc 2.17+ x86-64

osrt-0.1.4-cp39-abi3-macosx_14_0_arm64.whl (572.2 kB view details)

Uploaded CPython 3.9+ macOS 14.0+ ARM64

osrt-0.1.4-cp39-abi3-macosx_13_0_x86_64.whl (665.8 kB view details)

Uploaded CPython 3.9+ macOS 13.0+ x86-64

osrt-0.1.4-cp39-abi3-macosx_12_0_x86_64.whl (655.1 kB view details)

Uploaded CPython 3.9+ macOS 12.0+ x86-64

File details

Details for the file osrt-0.1.4.tar.gz.

File metadata

  • Download URL: osrt-0.1.4.tar.gz
  • Upload date:
  • Size: 5.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.9.19

File hashes

Hashes for osrt-0.1.4.tar.gz
Algorithm Hash digest
SHA256 896b8b14eae300a7178d0a359c1e39ccd3e8785b48b779e3a59a16eafe937f32
MD5 02e01a91366b37502e0bdfda540cebc1
BLAKE2b-256 099aa8c9ada61356787a2eac0e85c6ca1b9854192436e6f9726cf1596f857f3a

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a968eb974d488c2a0b75bb792876915c790aee0df634f6440b00ccb6311e6f01
MD5 8d57ba69ea659b3ffe959763b04e402e
BLAKE2b-256 726d2cef1548714071092dea2bfd95fc35475b1f0a941030465785ea633a73f4

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp312-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp312-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 c47ec730f9905868a8f0f246ea50684767a1cd7e1c7e8c6370d6324675c0e149
MD5 3534a1e3e36e9c4326c92a9df379f612
BLAKE2b-256 14885ddee4c18b7838adfbd1cd13cfad899592c2b1c9edaaed64fe566564c4e7

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp312-abi3-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp312-abi3-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 ff73546c175a2ad9582ec153df9e0b5212a9ab6499a239abadcb7ac4bb50e7fd
MD5 55d5014d5219e0017223250412278ca2
BLAKE2b-256 bde85ed538fa41a1492d4ab005ad85f510164aa183a016bd111a0c1bc5c09d3f

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp312-abi3-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp312-abi3-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 c038fe29f8c1fab2fcc4fc41a9d62d8542a068204f0a106c71fb2ff752f01a66
MD5 40e7665560afa07c2d48cb85a6bcb7dc
BLAKE2b-256 064ce09b14d4613a60fba92ab09ff9ccd786af910a474007cf366e2cd9169198

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a923f1614a551575745d4f5ba1d89f9c4313802cd23e8580aefb519c232ef8e7
MD5 2326012151cb6cdc66cb10dcb72b5514
BLAKE2b-256 fa5ad63931ffe66ade839ac361050fd37cfa234e1fc490f148661c609552daea

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp311-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp311-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 f2cc2e12e0bebc123e1ac463aa1dac82b87b170ced724b297c5b9b9b5d9b8130
MD5 c4ebf12107f9f7c4087995986b6ed76a
BLAKE2b-256 2ff4b644a6a44cf881c8055d33e125a043a7445725df2ba4dd094ac3f9d7f45d

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp311-abi3-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp311-abi3-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 c124bd577fe34956c657a447d4f522184ea4188ed357bde322cc0430ed114e9e
MD5 2a2d4b2c02d62df6114f9c954496354d
BLAKE2b-256 cd89c5502f92b6af7ed0158a8fdd791fd01043b109b975f43177c316386b357e

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp311-abi3-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp311-abi3-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 716e9c1ee133938bb2c8a595cd00690f999ee9614e2b370b120334b92e87da8b
MD5 02e1d45605271a0fa24a3edd41363250
BLAKE2b-256 a0d0ae217f9903fa4218615810cb98bc3556929d3b057539f7d0602757d6d34e

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b73f53e1355fd2770b411aa39639787a29d848c41cdc70fad1fa540d60170c56
MD5 837480b7e0ab47829a164ecb942bdc43
BLAKE2b-256 ce5ca0b7425874eae85a8f7395d4360a064e8a5581af98eb4e7cdb7978b5551a

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp310-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp310-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 8b00621aafcd06e48b8c682538d8de26b9f1c2316bedbb1031f3763605f8fbd6
MD5 02cf5b711666c416e8267a3b2142887a
BLAKE2b-256 cbc47a55518675872558f5873bd6f4e75e5e16f44ebcf0286d31ba705a56a5a9

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp310-abi3-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp310-abi3-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 bfc46286c0e856503c1e99669d5129189d43f3e4ea31b499bc7142c1584564bc
MD5 ddd2276e989d437ff8c05dc0a90bb1fa
BLAKE2b-256 879a10e2d69ddf2eb189efde6ad0a595094d8eec2a5e3762c6f6ed5f6aa65dcd

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp310-abi3-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp310-abi3-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 48dcbd59959f0bf9cb898529460ab363455df7492e29d8ae39b46e19513bc3c8
MD5 3492a336d2ad572b08e3d3bde1d2bcfa
BLAKE2b-256 f04daed02a1ffeb674daf94a460f7c2fb37331caeefef64f0beb41c8fc9a46cb

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a1669c555ee3794715c778184c2a44c7f19ae4b25750bdc3c775e37d57cba0d1
MD5 c9ac5e297cceb671577be87b708f352c
BLAKE2b-256 973fb4a2ef3cd02802f973314261cf0992d8ee23aa279ac214d88065bcdc9036

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp39-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp39-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 d038338ace4653161a48da3178a9e72e1b1c2d7f860ea76ab81b2762014e5a54
MD5 db881deef948303b835e68a57f18cb93
BLAKE2b-256 67c1604296b879f4e3f89b250d2e4fe035d501b367eb43b10afe2aa6a6294ccf

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp39-abi3-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp39-abi3-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 4f382ef9a46c05e005cd4da0e51c780baa5a7bdf3adfcaa76443360aff6565bf
MD5 eaf06b7d3a1b4f6f6562754b5ef3281a
BLAKE2b-256 a7f2a39df2b7d7560a822094373e1651424463c440aa2eca2676eb338b4770c4

See more details on using hashes here.

File details

Details for the file osrt-0.1.4-cp39-abi3-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for osrt-0.1.4-cp39-abi3-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 df59c51603b289be57e51f15a7eaaa8c82d8ce598593c29e381bc4f455db1586
MD5 1d98b16acce77bf364704a78c931f150
BLAKE2b-256 d9e7f49da1b924efbf0a8939968e16136542b439a85e74a23ca876e76511f4a3

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