Skip to main content

Implementation of Dijkstra's Shortest Path algorithm on 3D images.

Project description

Build Status PyPI version

dijkstra3d

Dijkstra's Shortest Path variants for 6, 18, and 26-connected 3D Image Volumes or 4 and 8-connected 2D images.

import dijkstra3d
import numpy as np

field = np.ones((512, 512, 512), dtype=np.int32)
source = (0,0,0)
target = (511, 511, 511)

# path is an [N,3] numpy array i.e. a list of x,y,z coordinates
# terminates early, default is 26 connected
path = dijkstra3d.dijkstra(field, source, target, connectivity=26) 
path = dijkstra3d.dijkstra(field, source, target, bidirectional=True) # 2x memory usage, faster

# Use distance from target as a heuristic (A* search)
# Does nothing if bidirectional=True (it's just not implemented)
path = dijkstra3d.dijkstra(field, source, target, compass=True) 

parents = dijkstra3d.parental_field(field, source=(0,0,0), connectivity=6) # default is 26 connected
path = dijkstra3d.path_from_parents(parents, target=(511, 511, 511))
print(path.shape)

dist_field = dijkstra3d.euclidean_distance_field(field, source=(0,0,0), anisotropy=(4,4,40))
dist_field = dijkstra3d.distance_field(field, source=(0,0,0))

Perform dijkstra's shortest path algorithm on a 3D image grid. Vertices are voxels and edges are the nearest neighbors. For 6 connected images, these are the faces of the voxel, 18 is faces and edges, 26 is faces, edges, and corners. For given input voxels A and B, the edge weight from A to B is B and from B to A is A. All weights must be non-negative (incl. negative zero).

What Problem does this Package Solve?

This package was developed in the course of exploring TEASAR skeletonization of 3D image volumes (now available in Kimimaro). Other commonly available packages implementing Dijkstra used matricies or object graphs as their underlying implementation. In either case, these generic graph packages necessitate explicitly creating the graph's edges and vertices, which turned out to be a significant computational cost compared with the search time. Additionally, some implementations required memory quadratic in the number of vertices (e.g. an NxN matrix for N nodes) which becomes prohibitive for large arrays. In some cases, a compressed sparse matrix representation was used to remain within memory limits.

Neither of graph construction nor quadratic memory pressure are necessary for an image analysis application. The edges between voxels (3D pixels) are regular and implicit in the rectangular structure of the image. Additionally, the cost of each edge can be stored a single time instead of 26 times in contiguous uncompressed memory regions for faster performance.

Available Dijkstra Variants

The following variants are available in 2D and 3D:

  • dijkstra - Shortest path between source and target. Early termination on finding the target. Bidirectional version available.
  • parental_field / query_shortest_path - Compute shortest path between source and all targets. Use query_shortest_path to make repeated queries against the result set.
  • euclidean_distance_field - Given a boolean label field and a source vertex, compute the anisotropic euclidean distance from the source to all labeled vertices.
  • distance_field - Given a numerical field, for each directed edge from adjacent voxels A and B, use B as the edge weight. In this fashion, compute the distance from a source point for all finite voxels.

C++ Use

#include <vector>
#include "dijkstra3d.hpp"

// 3d array represented as 1d array
float* labels = new float[512*512*512](); 

// x + sx * y + sx * sy * z
int source = 0 + 512 * 5 + 512 * 512 * 3; // coordinate <0, 5, 3>
int target = 128 + 512 * 128 + 512 * 512 * 128; // coordinate <128, 128, 128>

vector<unsigned int> path = dijkstra::dijkstra3d<float>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512,
  source, target, /*connectivity=*/26 // 26 is default
);

vector<unsigned int> path = dijkstra::bidirectional_dijkstra3d<float>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512,
  source, target, /*connectivity=*/26 // 26 is default
);

// A* search using a distance to target heuristic
vector<unsigned int> path = dijkstra::compass_guided_dijkstra3d<float>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512,
  source, target, /*connectivity=*/26 // 26 is default
);

uint32_t* parents = dijkstra::parental_field3d<float>(
  labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  source, /*connectivity=*/26 // 26 is default
);
vector<unsigned int> path = dijkstra::query_shortest_path(parents, target);


float* field = dijkstra::euclidean_distance_field3d<float>(
  labels, 
  /*sx=*/512, /*sy=*/512, /*sz=*/512, 
  /*wx=*/4, /*wy=*/4, /*wz=*/40, 
  source
);

float* field = dijkstra::distance_field3d<float>(labels, /*sx=*/512, /*sy=*/512, /*sz=*/512, source);

Python pip Binary Installation

pip install dijkstra3d

Python pip Source Installation

Requires a C++ compiler.

pip install numpy
pip install dijkstra3d

Python Direct Installation

Requires a C++ compiler.

git clone https://github.com/seung-lab/dijkstra3d.git
cd dijkstra3d
virtualenv -p python3 venv
source venv/bin/activate
pip install -r requirements.txt
python setup.py develop

Performance

I ran three algorithms on a field of ones from the bottom left corner to the top right corner of a 512x512x512 int8 image using a 3.7 GHz Intel i7-4920K CPU. Unidirectional search takes about 42 seconds (3.2 MVx/sec) with a maximum memory usage of about 1300 MB. In the unidirectional case, this test forces the algorithm to process nearly all of the volume (dijkstra aborts early when the target is found). In the bidirectional case, the volume is processed in about 11.8 seconds (11.3 MVx/sec) with a peak memory usage of about 2300 MB. The A* version processes the volume in 0.5 seconds (268.4 MVx/sec) with an identical memory profile to unidirectional search. A* works very well in this simple case, but may not be superior in all configurations.

Theoretical unidirectional memory allocation breakdown: 128 MB source image, 512 MB distance field, 512 MB parents field (1152 MB). Theoretical bidirectional memory allocation breakdown: 128 MB source image, 2x 512 distance field, 2x 512 MB parental field (2176 MB).

Fig. 1: A benchmark of dijkstra.dijkstra run on a 512<sup>3</sup> voxel field of ones from bottom left source to top right target. (black) unidirectional search (blue) bidirectional search (red) A* search aka compass=True.
Fig. 1: A benchmark of dijkstra.dijkstra run on a 5123 voxel field of ones from bottom left source to top right target. (black) unidirectional search (blue) bidirectional search (red) A* search aka compass=True.

import numpy as np
import time
import dijkstra3d

field = np.ones((512,512,512), order='F', dtype=np.int8)
source = (0,0,0)
target = (511,511,511)

path = dijkstra3d.dijkstra(field, source, target) # black line
path = dijkstra3d.dijkstra(field, source, target, bidirectional=True) # blue line
path = dijkstra3d.dijkstra(field, source, target, compass=True) # red line

Fig. 2: A benchmark of dijkstra.dijkstra run on a 50<sup>3</sup> voxel field of random integers of increasing variation from random source to random target. (blue/squares) unidirectional search (yellow/triangles) bidirectional search (red/diamonds) A* search aka .compass=True.
Fig. 2: A benchmark of dijkstra.dijkstra run on a 503 voxel field of random integers of increasing variation from random source to random target. (blue/squares) unidirectional search (yellow/triangles) bidirectional search (red/diamonds) A* search aka compass=True.

import numpy as np
import time
import dijkstra3d

N = 250
sx, sy, sz = 50, 50, 50

def trial(bi, compass):
  for n in range(0, 100, 1):
    accum = 0
    for i in range(N):
      if n > 0:
        values = np.random.randint(1,n+1, size=(sx,sy,sz))
      else:
        values = np.ones((sx,sy,sz))
      values = np.asfortranarray(values)
      start = np.random.randint(0,min(sx,sy,sz), size=(3,))
      target = np.random.randint(0,min(sx,sy,sz), size=(3,))  

      s = time.time()
      path_orig = dijkstra3d.dijkstra(values, start, target, bidirectional=bi, compass=compass)
      accum += (time.time() - s)

    MVx_per_sec = N * sx * sy * sz / accum / 1000000
    print(n, ',', '%.3f' % MVx_per_sec)

print("Unidirectional")
trial(False, False)
print("Bidirectional")
trial(True, False)
print("Compass")
trial(False, True)

What is that pairing_heap.hpp?

Early on, I anticipated using decrease key in my heap and implemented a pairing heap, which is supposed to be an improvement on the Fibbonacci heap. However, I ended up not using decrease key, and the STL priority queue ended up being faster. If you need a pairing heap outside of boost, check it out.

References

  1. E. W. Dijkstra. "A Note on Two Problems in Connexion with Graphs" Numerische Mathematik 1. pp. 269-271. (1959)
  2. E. W. Dijkstra. "Go To Statement Considered Harmful". Communications of the ACM. Vol. 11, No. 3, pp. 147-148. (1968)
  3. Pohl, Ira. "Bi-directional Search", in Meltzer, Bernard; Michie, Donald (eds.), Machine Intelligence, 6, Edinburgh University Press, pp. 127–140. (1971)

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

dijkstra3d-1.3.1.tar.gz (293.7 kB view details)

Uploaded Source

Built Distributions

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

dijkstra3d-1.3.1-cp38-cp38-win_amd64.whl (164.2 kB view details)

Uploaded CPython 3.8Windows x86-64

dijkstra3d-1.3.1-cp38-cp38-manylinux1_x86_64.whl (960.7 kB view details)

Uploaded CPython 3.8

dijkstra3d-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl (229.6 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

dijkstra3d-1.3.1-cp37-cp37m-win_amd64.whl (171.2 kB view details)

Uploaded CPython 3.7mWindows x86-64

dijkstra3d-1.3.1-cp37-cp37m-manylinux1_x86_64.whl (863.1 kB view details)

Uploaded CPython 3.7m

dijkstra3d-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl (229.8 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

dijkstra3d-1.3.1-cp36-cp36m-win_amd64.whl (171.1 kB view details)

Uploaded CPython 3.6mWindows x86-64

dijkstra3d-1.3.1-cp36-cp36m-manylinux1_x86_64.whl (864.7 kB view details)

Uploaded CPython 3.6m

dijkstra3d-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl (229.3 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

dijkstra3d-1.3.1-cp35-cp35m-manylinux1_x86_64.whl (848.7 kB view details)

Uploaded CPython 3.5m

dijkstra3d-1.3.1-cp35-cp35m-macosx_10_6_intel.whl (403.7 kB view details)

Uploaded CPython 3.5mmacOS 10.6+ Intel (x86-64, i386)

dijkstra3d-1.3.1-cp27-cp27m-manylinux1_x86_64.whl (816.4 kB view details)

Uploaded CPython 2.7m

dijkstra3d-1.3.1-cp27-cp27m-macosx_10_14_intel.whl (222.2 kB view details)

Uploaded CPython 2.7mmacOS 10.14+ Intel (x86-64, i386)

File details

Details for the file dijkstra3d-1.3.1.tar.gz.

File metadata

  • Download URL: dijkstra3d-1.3.1.tar.gz
  • Upload date:
  • Size: 293.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1.tar.gz
Algorithm Hash digest
SHA256 848961794111b3e539f90a94df26a8e4323a0e6c336a98dee54c229218d22ff1
MD5 bb61d03f2f5e6de96994b063b8b4c2ee
BLAKE2b-256 6400869535b8d3e9969aecfdef66720d006f804e637e96e8eefc5298dacce79a

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 164.2 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for dijkstra3d-1.3.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 70ce7e1188f8c0ea7cbbb3973579f7739e654311306ebdd203d1e4b3aed2959f
MD5 d56dbada012bc53309eff0538d18369d
BLAKE2b-256 bd98eab1aa9b1aa3e68f61edf29be67d4e2390e638175456f12dba11be391772

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 960.7 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 90c968d2c370bf5785d3a4c86a66cbe8b9ec065aef9dee26be347e45232239ae
MD5 b38459d88012dafd3ccd85c465e91a09
BLAKE2b-256 445b534fd127751c7dca49654e24207f7cb6685b67efa485cb8a94aaa7ce9dac

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 229.6 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for dijkstra3d-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9bec25c570488b4ae5f78f8331c9d8b8a44ad42a495c4b34efacc27da773d58e
MD5 8667c2f5decf8fc14448e72081ae12e1
BLAKE2b-256 78f95343887dcdf8235d584fa3634ee531bdaf204e19277b8b573f259774836f

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 171.2 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for dijkstra3d-1.3.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 2d4fffc8a2e2d1522ead829e62f895897fd6fa1de5bdd85eebac0b8d618bc1be
MD5 b1d1846c16ce0ad2544c6f4bfa0d12a9
BLAKE2b-256 17e244bde109d84fd2d11267c8fcf5a598940ab88d769f367a90ccac4d2de555

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 863.1 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f69e1c09719a301b808d6f7f0979c0abff7604aa76016ab9a341fafbdc05f108
MD5 350e90cef4853b1448a86dcac0ff215e
BLAKE2b-256 79cb36e950940eddcb2cb49dac63a37d7387317d0d43949903df870343d1df57

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 229.8 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for dijkstra3d-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 69b651e9db1d8503e0a8c8684c149f3757ab206a7bd61ab169acb6a1dc4919ce
MD5 b7e2cce966d06bb1a03f2a8d4700efb4
BLAKE2b-256 5f10f450a2095f7d2e20f24d59066432a101b72a25dea50716710809126a657e

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 171.1 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/28.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.4

File hashes

Hashes for dijkstra3d-1.3.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 fff9ff72052b8b2ff2a4731f25dc5f3be7af3db3b4ad7e263de3bbc36f1b9b7b
MD5 40b52a85aade4c595a8c3d525b8fc714
BLAKE2b-256 eef3cf9087dae7f5168d0c76c1ba83fd2903099cf4d5f0636e1d7dae35779ddb

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 864.7 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 fa745e2407cdeeef5ef7966b7687a7d166880a41f5e1138ab82770f9e088bb1d
MD5 2234187d7d16c44ecfa154f6aac6aeb3
BLAKE2b-256 eefe836e3421556bf2f90ed29483799bec18dc7b3dbd7b2b1897f181662a1d49

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 229.3 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for dijkstra3d-1.3.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e95d86a3ad6cf13f3b7c004987c466aca9144971079e972a5a33800d9c526ed0
MD5 74af4c36987aa6293fc828656d09117a
BLAKE2b-256 173b4dc04c26ba3836ce20aac60ba592da728d7fb00ef811e6e3f2d4a77814b8

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 848.7 kB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9e7c2fdfdb73965985ff52a34b3e43db7e1f233b9f44ddfb8fd2728cbd7da284
MD5 87af4740fb26c542e09a5be611c5812d
BLAKE2b-256 88f829ce15d73a13a3bb86592c5b29ad5e866566f4e64a361356a31210a18aa5

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp35-cp35m-macosx_10_6_intel.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp35-cp35m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 403.7 kB
  • Tags: CPython 3.5m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for dijkstra3d-1.3.1-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 920a78d3d2808a81c00898c85cb6f22dfbebbe2b1ca98aee1c96275edd64a8ab
MD5 806154f5c74c604056e7caa210a6eb65
BLAKE2b-256 9a432f5835698cc0d19f30f7b94d19022f05947e0cccdb0d32c876cdac7b8455

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp27-cp27m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 816.4 kB
  • Tags: CPython 2.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.6

File hashes

Hashes for dijkstra3d-1.3.1-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3437b1958b0a5f4ab55b769a2ec7af65168d8120d5058d40c312ebfcf4dbb580
MD5 41bdf5e0f5ec81282d7dc1c58da18510
BLAKE2b-256 c38a434cd8fedeba2fa181c0214a03ddd5bd3b05f1d3bec361a4257ae0be5a3f

See more details on using hashes here.

File details

Details for the file dijkstra3d-1.3.1-cp27-cp27m-macosx_10_14_intel.whl.

File metadata

  • Download URL: dijkstra3d-1.3.1-cp27-cp27m-macosx_10_14_intel.whl
  • Upload date:
  • Size: 222.2 kB
  • Tags: CPython 2.7m, macOS 10.14+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.6.2 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.2

File hashes

Hashes for dijkstra3d-1.3.1-cp27-cp27m-macosx_10_14_intel.whl
Algorithm Hash digest
SHA256 ba9267f5af38eabac2539ca864688dd4715cb02ff6a50a6b5e800a41cfc06523
MD5 cf55a42c681105249b37daa0a599c0d5
BLAKE2b-256 28ca292e8b9122c8b877fef929b3ac157a72a490fbe05edac74a502b0fba1262

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