Skip to main content

Box intersection/overlap/density algorithms in Rust with python bindings.

Project description

Fast box intersection algorithm

Linux test badge Build publish badge

Computes box intersection/overlap/density algorithms using efficient algorithms and data structures. Aspires offer a easy-to-use interface that "just works" on both smaller and larger datasets. Written in Rust with Python bindings.

Algorithms

The primary data structure is for rectangle set intersection: a class which structures a static list of rectangles efficiently so that overlapping rectangles can be identified quickly. The interface is:

  • BoxIntersector
    • new(box_list): Creates the immutable box intersector with the following list of boxes.
    • find_intersections(x1, y1, width, height) -> List[int]: Finds all intersections with rectangle defined by (x1, y1, width, height). Returned list are the indexes in the input box list

The following algorithms are also avaliable:

  • find_intersecting_boxes(box_list)->list[list[int]]: Returns all-to-all adjacency list of intersecting boxes.
  • find_intersecting_boxes_asym(source_boxes, dest_boxes)->list[list[int]]: Returns source-to-dest adjacency list of intersecting boxes.
  • find_best_matches(box_list_1, box_list_2, iou_threshold: float)->tuple[list[tuple[int,int]],list[int],list[int]]: Returns best unique matches between two given lists of boxes. Matches are only returned if they intersect and meet the Intersection over Union threshold (iou_threshold) and no other match with any unmatched box in the oposing list is better. A tuple of matches, remaining_list_1, remaining_list_2 is returned.
  • efficient_coverage(box_list, cover_rect_width, cover_rect_height)->list[tuple[tuple[int, int],list[int]]]: A heuristic algorithm to try to quickly generate a small number of fixed-sized tiles to cover all the boxes in the box list. If any of the boxes are too large to fit in the tile, an error is raised.
  • find_non_max_suppressed(box_list, box_scores:list[float], iou_threshold:float,overlap_threshold:float)->list[bool]: Identifies similar boxes in set with more overlap than the two thresholds specify, and suppresses the lower confidence one. Standard algorithm to deduplicate boxes in object detection frameworks.

Python wrapper

Install with pip install box-intersect-lib-py

Build instructions

If pip install fails, due to prebuilt binary wheels not being avaliable on your platform, try:

  1. If you don't have rust installed, install with curl https://sh.rustup.rs -sSf | sh official installation docs
  2. Install python dependencies: pip install maturin numpy
  3. Build wheel with (cp README.md LICENSE.txt box-intersect-lib-py && cd box-intersect-lib-py && maturin build --release --strip)
  4. Previous step will put wheel in a local directory. IT should be install able with pip install box-intersect-lib-py/target/wheels/*

A dockerfile with all of this set containerized is provided in Dockerfile.text

Usage:

import box_intersect_lib_py
import numpy as np

# input is numpy array of boxes.
# boxes are left-anchored (x,y,width,height)
boxes = np.array([
    [1,1,1,2],
    [0,0,5,5],
    [2,3,2,6],
],dtype="int32")

results = box_intersect_lib_py.find_intersecting_boxes(boxes)

# 2nd box intersects with other 2
assert (results[0] == np.array([1])).all()
assert (results[1] == np.array([0,2])).all()
assert (results[2] == np.array([1])).all()

print(results)  # [array([1], dtype=uint32), array([0, 2], dtype=uint32), array([1], dtype=uint32)]

# get area of the relevant intersections
intersection_areas = [box_intersect_lib_py.intersect_area(boxes[i], boxes[results[i]]) for i in range(len(boxes))]
print(intersection_areas)  # [array([2], dtype=uint64), array([2, 4], dtype=uint64), array([4], dtype=uint64)]


# we can also build a data structure of boxes for efficient querying with arbirary other boxes
detector = box_intersect_lib_py.BoxIntersector(boxes)
query_box = (0,0,2,2)
intersecting_idxs = detector.find_intersections(*query_box)
print(intersecting_idxs) # [0, 1]

Benchmark results

Running the following commands on my laptop (subject to signifiant noise):

python benchmark/run_benchmark.py --num-boxes 10000000 --region-size 100000 --max-box-size 100 --test-iterations 2
python benchmark/run_benchmark.py --num-boxes 1000000 --region-size 40000 --max-box-size 100 --test-iterations 5
python benchmark/run_benchmark.py --num-boxes 5000000 --region-size 40000 --max-box-size 100 --test-iterations 1
python benchmark/run_benchmark.py --num-boxes 10000 --region-size 4000 --max-box-size 100 --test-iterations 200
python benchmark/run_benchmark.py --num-boxes 50000 --region-size 4000 --max-box-size 100 --test-iterations 200
python benchmark/run_benchmark.py --num-boxes 100 --region-size 400 --max-box-size 100 --test-iterations 5000
python benchmark/run_benchmark.py --num-boxes 500 --region-size 400 --max-box-size 100 --test-iterations 5000
num boxes num intersections find_intersecting_boxes_t find_non_max_suppressed_t find_intersecting_boxes_linesearch_t find_intersecting_boxes_asym_t find_best_matches_t find_rect_cover_t BoxIntersector build BoxIntersector query sequentially
10000000 98078592 12.169555259500157 7.491135403000044 136.2819793919998 16.957570917499652 18.989964099499957 2.2033966144999795 2.07134081949971 78.30415772001288
1000000 6141632 0.9191611845999432 0.6003980014000263 3.5016677132000043 1.086823502000334 1.1519274157999462 0.14588280299976758 0.1738209677998384 3.4725145600168617
5000000 153686102 7.358366684999055 2.962747178000427 87.27572011099983 11.088836232000176 16.82190396599981 0.6261364540005161 0.9347212379998382 23.502293479996297
10000 64484 0.006635849274998691 0.0034072973049933354 0.007089999469999384 0.00699314222000794 0.007134397955005625 0.0005728775550051068 0.001043458304993692 0.024413333800112014
50000 1588676 0.06341231076999974 0.017638188490000175 0.11677449097000135 0.06591738333499961 0.10906894315499813 0.0029347618249994413 0.006063540664999891 0.16421707900008187
100 732 3.0048768800043034e-05 6.568112400054815e-06 2.921996660006698e-05 2.89388543998939e-05 1.8404549999831942e-05 2.4175683996872975e-06 2.605749600115814e-06 0.00013785439200000838
500 20710 0.0005309709685996495 8.529535939997003e-05 0.0004740007478001644 0.0005328194969999459 0.0008529525551999541 9.667402999912156e-06 2.0378057800189707e-05 0.001288445912010502

Algorithmic ideas

Recursive Tile Sort (RTS) RTree

The idea is to build an RTree, essentailly a recursive interval tree where the sort axis swaps with each recursion down. Each node in the tree is a bounding box around a set of subnodes. The subnodes may overlap with each-other, so you have to check each child when doing recursive searches, similar to a B-Tree. This implementation uses an interval tree to store the sub-nodes, allowing for large sets of children, allowing for much flatter trees.

Building an efficient R-tree requires the use of recursive tile sort, hard to describe, but easier to visualize. Note that any method to build a valid R-tree will result in correct output, this method is only used to build an efficiently spatially partitioned R-tree.

tile sort gif tile_sort_norm.gif

Reduction to a single dimension

This library used to do a simple reduction of 2d box overlap problems to a 1d interval overlap problem across the x axis, followed by brute force search across the y axis.

While asymtotically suboptimal, the resulting methods result in highly parallizable, cache-local, and predictable code flows, resulting in excelent performance on most datasets, and nearly optimal performance on small and sparse datasets.

Since only the x dimension is optimized, the time efficiency of this library does depend on the boxes being spread broadly across the x axis. However, rest assured that the accuracy and memory efficiency of this library remains regardless of the size and positions of the boxes.

The following details the main interval algorithms used in this library:

Left-Right line search (for 1-dimensional reduction)

To do full, dense pairwise interval overlap comparisons, this simple left-to-right search is used.

Consider the following intervals, sorted by their left coordinate (we can keep track of where the interval originally was):

1.   |--------|
2.     |------------------------|
3.          |--------|
4.            |----|
5.                  |--------|
6.                             |--------|

Each interval has index i in the sorted list.

Note that all the intervals to the right of interval i are placed immidiately after i in the sorted list----once you find one interval to the right of i that does not intersect with it, there will never be another one anywhere else in the sorted list that is to the right.

So you can use this fact to easily build a directed graph of intervals pointing to all intervals to the right of them (psedocode)

sorted_intervals   # list of (left, right) tuples
intervals_to_the_right(i) = [j for j in range(i+1,len(sorted_intervals)) while sorted_intervals[i].right > sorted_intervals[j].left]

Note that this step is linear in the number of interval overlaps m plus the number of nodes n---every overlap is counted once, no work is done for any intervals which are not there. So it is essentially optimal

Once you have that directed graph of left-to-right in an adjacency list, you can simply invert all the edges to get the right-to-left graph, and combine them to get the undirected overlap graph. This also takes linear time.

As for theoretical performance, the complete run-time of this algorithm is dominated by the original sort plus the number of actual interval intersections: n * log(n) + m.

One noteable implementation detail is that since we are actually concerend with boxes, not intervals, the y dimension check is within the intervals_to_the_right proceedure, so that the adjacency graph does not need to actually be built in memory for boxes that do not overlap. This means that on realistic workflows, this proceedure is actually the vast majority of the computational work, as it is scanning and filtering many possible boxes which do overlap in the x dimension, but not overlap in the y dimension.

Below is a visualization of this proceedure. The bolded box is the box currently searched. The yellow region is the brute force search space. The blue boxes are the boxes to the right that the search finds, the green boxes are the boxes found by inverting the graph (no search needed, it has already completed).

tile sort gif

For more details, see the implementation in code.

Interval tree (for 1-dimensional reduction)

An interval tree is a well known algorithm for online comparison of one interval against a static set of intervals. Since this algorithm is well known (its in the famous "Introduction to Algorithms" CLRS textbook), there is no need to rehash the basic ideas of how it works here, but I will note that the worst case efficiency for the search is k * log(n) where k is the number of resulting intervals from the query and n is the number of intervals in the tree.

Specific implementation details:

  1. Since the tree is not added to, then unlike the implementation in CLRS, a ballanced interval tree can be built in n time via a simple bottom-up construction.
  2. The base of the tree is sorted by left cooridnate before the tree is constructed. This means that nearby intervals are placed close together, reducing search cost from k* log(n) to k + log(n) assuming uniform interval length. However, the sorting step does increase one-time cost of building the tree from n to n*log(n).
  3. Instead of a binary tree, a b-tree of size 8 is constructed.

Note that the implementation is no longer part of the master branch, as it was superceeded by the recursive tile sort implementation. See the single_thread branch for the implementation.

Efficient coverage heuristic

The idea is to find a set of fixed-sized tiles, which each box in the set is completely covered by at least one tile. This can be used as a tool whenever there is a need to process all the boxes in batches of fixed sized tiles, including for neural network processing or some other sort of image or box processing that benefits somehow from evenly sized batches of work. It is an error if there is any box bigger than the tile size. There is no limit to how much the tiles can overlap.

Computing the globally minimal set of tiles is hard in general, so an approximation is used. The heuristic algorithm is similar in concept to the left-to-right search algorithm idea. A visualization of the algorithm in action is shown below.

algorithm-reveal-1

algorithm-reveal-2

This approximate algorithm has an informal beginnings of a worst case analysis that suggests it is a 2-approximation of the optimal solution:

  1. Consider all the locally left-most boxes. That is, every box that cannot be included in the left-inspection region of some other box.
  2. Now, consider that the optimal solution has at least one rectangle for each of these locally left-most boxes. Consider each of these boxes.
  3. Now, consider the left-preferring greedy solution applied to all these left-most boxes. After all the boxes in all those greedy tiles are removed, there will be a new set of left-most boxes that appeared from within the left-intersection region of the original set. Now apply the greedy solution to that 2nd set.
  4. I claim that step 3 has removed all of the boxes that the optimal set in step 2 removed. (Unfortunately, I don't have a great argument here, so you are free to try to come up with counter-examples)
  5. The resulting set of boxes from step 3 is strictly a subset of step 2. Since the optimal solution cannot increase by removing boxes, you can apply this analysis recursively on the remaining set of boxes.
  6. Since step 3 only required at worst twice as many tiles as step 2, this algorithm is a 2-approximation.

A lower bound of the 2 approximation is shown below:

left_to_left_greedy_worst_case

This particular case produces 6 tiles, where the optimal solution produces 4. However, in the infinite limit, extended downwards, this produces twice as many tiles as the best case. Suggesting that the 2-approximation is tight.

While the upper bound is not a rigourous proof by any means, this left-to-right heuristic also performed better on synthetic benchmarks than other greedy algorithms that were tried, such as the "set-cover" inspired method of choosing the maximally covering single tile iterativly, or a choosing the maximally covering left-most tile iteratively.

As for speed, the implementation of this algorithm is one of the fastest of all the algorithms in the repo, due to it not using the R-Tree structure at all. Since both phases of the algorithm are left-to-right sweeps, the implementation instead does a single left-to-right sweep over boxes, and builds up multiple tiles at once. As the global sweep encounters a new left-most box, it either adds a box to an existing tile window, or if that is not possible, creates a new tile window. These windows are added from left-to-right by construction, and so only the first windows need to be checked if they need to be popped off the stack or not when the global sweep passes their left-most edge. All in-progress windows are checked by brute force when a new box is encountered. This yields a O(num_boxes * num_windows) algorithm in the worst case where all boxes are vertically stacked on top of each other with lots of spacing in between them in the Y axis, but if boxes spacings are equally distributed between X and Y fields (no matter their density), then it goes to O(num_boxes * sqrt(num_boxes)) max runtime, as there will only be sqrt(num_boxes) number of windows open at any given point in time that need to be checked. This means that a simple optimization to reduce worst-case analysis could be swapping the X and Y if there is a lot of vertical stacking, which should reduce the worst case analysis to the square case of O(num_boxes * sqrt(num_boxes)).

More writeup on the intuition behind this algorithm here

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

box_intersect_lib_py-0.8.5.tar.gz (34.7 kB view details)

Uploaded Source

Built Distributions

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

box_intersect_lib_py-0.8.5-cp313-cp313-win_amd64.whl (195.2 kB view details)

Uploaded CPython 3.13Windows x86-64

box_intersect_lib_py-0.8.5-cp313-cp313-macosx_11_0_arm64.whl (255.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp313-cp313-macosx_10_12_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

box_intersect_lib_py-0.8.5-cp312-cp312-win_amd64.whl (194.8 kB view details)

Uploaded CPython 3.12Windows x86-64

box_intersect_lib_py-0.8.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (292.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

box_intersect_lib_py-0.8.5-cp312-cp312-macosx_11_0_arm64.whl (254.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp312-cp312-macosx_10_12_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

box_intersect_lib_py-0.8.5-cp311-cp311-win_amd64.whl (194.2 kB view details)

Uploaded CPython 3.11Windows x86-64

box_intersect_lib_py-0.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (292.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

box_intersect_lib_py-0.8.5-cp311-cp311-macosx_11_0_arm64.whl (258.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp311-cp311-macosx_10_12_x86_64.whl (274.6 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

box_intersect_lib_py-0.8.5-cp310-cp310-win_amd64.whl (194.4 kB view details)

Uploaded CPython 3.10Windows x86-64

box_intersect_lib_py-0.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (292.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

box_intersect_lib_py-0.8.5-cp310-cp310-macosx_11_0_arm64.whl (258.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp310-cp310-macosx_10_12_x86_64.whl (274.7 kB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

box_intersect_lib_py-0.8.5-cp39-cp39-win_amd64.whl (196.9 kB view details)

Uploaded CPython 3.9Windows x86-64

box_intersect_lib_py-0.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (295.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

box_intersect_lib_py-0.8.5-cp39-cp39-macosx_11_0_arm64.whl (260.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp39-cp39-macosx_10_12_x86_64.whl (277.3 kB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

box_intersect_lib_py-0.8.5-cp38-cp38-win_amd64.whl (196.6 kB view details)

Uploaded CPython 3.8Windows x86-64

box_intersect_lib_py-0.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (294.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

box_intersect_lib_py-0.8.5-cp38-cp38-macosx_11_0_arm64.whl (260.3 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

box_intersect_lib_py-0.8.5-cp38-cp38-macosx_10_12_x86_64.whl (276.6 kB view details)

Uploaded CPython 3.8macOS 10.12+ x86-64

File details

Details for the file box_intersect_lib_py-0.8.5.tar.gz.

File metadata

  • Download URL: box_intersect_lib_py-0.8.5.tar.gz
  • Upload date:
  • Size: 34.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for box_intersect_lib_py-0.8.5.tar.gz
Algorithm Hash digest
SHA256 d58ac045ec704c55e0702776121f860a8de0904bff3d710c0ab47dfdc17ab14e
MD5 18b22c0424a6ee8be35d8f6d56a154e0
BLAKE2b-256 bb71884d9ed5f676d068c0f17e2c084ec8336b0c05dc875deb3916e71f813523

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5.tar.gz:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e36d12485e9e0cd5a9ae6b72a8d405344558b15dbe3def3d4ff2bd2b55ff3cdf
MD5 7e117d56a113d10ae1dd1cbef2441819
BLAKE2b-256 65a0a055e048108abf604d78bb18bc9ac458d162798f70a1fa248418e68c4c8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 34bcdb3ca47cecac7dae049199c383bca7eeddaf2f9912bd414674349c409f52
MD5 50086b01ec242318279357ba1415ea7d
BLAKE2b-256 1a47531433a8ab7efa16b7ff61804e3469c34c25ec1bb023c427deb28d81add6

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 341fae30b0f73fd90f16c353e5c58854fa94d229e4c853706911430deb1e353e
MD5 8e05ff0dc196fa3b51a11d97cf31d9bd
BLAKE2b-256 264311170a7ff6e97fd865f3c63a6ac9a973a0abf36db70c482f3f9d259e9e4a

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a677c93f539f0eb7a87ffa5cab23bf847d5e7d70eb044027cde70af3c1984cd2
MD5 6e66640239ca01b4c4aa917992f95b5e
BLAKE2b-256 942985837eba451cb8ddaf0641bf5792a510663493ea09fa2573774925e4786e

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 86417e9cfc1c48797713d4e359b6a3c039c305aede8a62e5aa6442ed852ab60a
MD5 22732193dc79d6ed276cd0107add5f1d
BLAKE2b-256 c8f396a0f76f54229774b50ca3fd19f3976ab62d3fbb25fdf65e2ae33b8fe052

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c196ca12f00b87485fd8a8d13735555b41fc114891320f38a2800d7d8fa90733
MD5 3371630b9103ba4e20e8e0ee1bc22b10
BLAKE2b-256 1c2756a552ee515e0a3f9ac5e2be98723024f91fb13a23efc0f24b8424b98830

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 aa16415ca892fd683736f9054b13dc972c6947c12c4e0452adcbc679279e9eb0
MD5 ce0bbf9e52970c6932ae8006ed507ec1
BLAKE2b-256 4076882d599dbe460abe77d8459b777f85b8809c294fbfbbce11ffd8cbda057b

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 cd1b0a361f6631c87b7012e726bdf5145824346391ff538a3f39b13e7b96bc35
MD5 9036ca872a1564f08bce6e3dc9ce2f9a
BLAKE2b-256 31388f791d2d2c95c963fc8f2b255676a5452c9e4be924420cb9cffe7526a4f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 386e739dd0535f47681b7eb48e21a1f67747e10272375d547b2eb1220ea8dbed
MD5 47bd0358597a45b86f0022951524890d
BLAKE2b-256 6863453e198969bad0aac678bb3edd805c4e10fe21122f4a90e233cfb7e552d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e2a3898e8479915b66dc8921167e31e7b6d0ce29db5f73a9778acbbeb629bd8
MD5 3df7dc64c295a6f469d3d7eb659a8d86
BLAKE2b-256 428c8b212f9a2e5d30c34f69dc3fb50313da6ec96cb166e3026f4db65fe9c2c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a996c028766c24cc31914e463ebae892aa14764c4fa7bb1b628bc4b199e13e87
MD5 fac1e7fc1769204ec81d1a5884883afd
BLAKE2b-256 52671db7ee52127feeebe9d0887f03f6ed994d3b49fb296acce5f9883b1f7865

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8c9248255108f84f393c171f37220d686c8ef9f4023d38286027f10bab3a03db
MD5 60bbe1ffa45045abcf78884cd7831628
BLAKE2b-256 ecccc03a3aae69b260e0d2ab7cd1b65b3f0e666c1fe547dc3fe739e29bae1d10

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 887b7612d3d85d072504752d768269f203338bfee08d3281ac77a0fc39faff8f
MD5 fbd6b78f8441c6d38fc05fb7f06876eb
BLAKE2b-256 61c3d6002eca30219c9c052791eba94f64c144c2770ebffafcd892c616c9dec5

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9ac1cbb9df530ae168bf8094e8a5de9ffd189c450afc56abd08c239607b18cee
MD5 df7670924c56b698026165c7a7384915
BLAKE2b-256 abd9306f998b5fdc08b4daf2d92d96e536507391df975251315a4275b32a2f3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 af15dab347d0f67dad74a84bc5fb63f0ed4c28ef20c5e379a632997c3da7ed50
MD5 e1982c4bf7a68149ba90ff1a8f639757
BLAKE2b-256 0de7a696b8a675c5cae58611c29722cf53974afa5d318b9e06f0e2495a2401ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 0a2fd5e46a73860f97b0c977b8594049d9e5bcd2ace9057e7b74d9813ef95d48
MD5 41a23cef550d7dfe6f877a5ac22b16d8
BLAKE2b-256 66714e44c132ead3cc421bc555eb6e515ca0a8335e1aa2b67738d751a2e64cd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp39-cp39-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf0332726b9ad57249f16c01daee2426477d1a5007f86543c8b15516f3f2e8aa
MD5 5182f17531bbf72785f4c6133611ca6b
BLAKE2b-256 9f705980c5c2500e39c41862d4287872d26c391f8cc48c2cd4f43b58cf156ed3

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d36438a17694d95e979007e6cdb76ba5d7ec9f0076d7865a9da08f071584bb5b
MD5 74a88182063cedc3ef0567c39125e41c
BLAKE2b-256 b3c7934e1c37c2aca1b5ee72d8ae2e9454e3ecf736b6edf6dcc65890f5eb37e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ed2627360fb3a690c93f8d55e3ca957f7d49278d3018b86491ca79c5b6623510
MD5 0c522572b19363210d97dfd691c22370
BLAKE2b-256 1b4e50e8571e7729dcee743dfbc92a1fd5a714e165da714d3020a8d7bfa273dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp39-cp39-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 0b8abb3769d10554d86bbb8319ac75184cdf319d3d9e0e8ba26606b4d5f37e55
MD5 38f801d02f52596cb400ee1d1a81fe76
BLAKE2b-256 2c0c0caa4b7cccc4ce5a89d1d24e61c4dff8c1100c5614cb4c4387f4cde1416d

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp38-cp38-win_amd64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a75a63f5034978bdbfec190c6cdc407760e57544d2a8db1dd2dafada37959c5c
MD5 b6827efd18cbccc63df1ea6c928197a6
BLAKE2b-256 60b365094281d68396a88e28cf5c559e212998dddcec04a9d069bd8cf3a24498

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11b30db89d14d2d0a08524424746d867ae6c20fd10e9c41c5568f697a2791d92
MD5 3816e18d8d029afb77e42312270308bb
BLAKE2b-256 d539b0fb9ab120f69ab561d86a3994c63cd68b4115407bc0e0c4206e6e5ffe44

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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

File details

Details for the file box_intersect_lib_py-0.8.5-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for box_intersect_lib_py-0.8.5-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 686db40bcd3ff61f132ee2fe95bace357fc9529682131a01bf6d9e7939fd0380
MD5 b82585c6ce569a206c71b58c937e6864
BLAKE2b-256 4ad7361dc288ae4d5458aaabdec2a320ac3b8f322730e8d67e4adbe32e47c21c

See more details on using hashes here.

Provenance

The following attestation bundles were made for box_intersect_lib_py-0.8.5-cp38-cp38-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Techcyte/box-intersect-lib

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