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)

# Given a boolean label "field" and a source vertex, compute 
# the anisotropic euclidean distance from the source to all labeled vertices.
dist_field = dijkstra3d.euclidean_distance_field(field, source=(0,0,0), anisotropy=(4,4,40))

# 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.
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 (L1: manhattan distance), 18 is faces and edges, 26 is faces, edges, and corners (L: chebyshev distance). 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 finite and 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.

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.4.1.tar.gz (299.1 kB view details)

Uploaded Source

Built Distributions

dijkstra3d-1.4.1-cp38-cp38-win_amd64.whl (179.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

dijkstra3d-1.4.1-cp38-cp38-manylinux1_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.8

dijkstra3d-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl (263.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

dijkstra3d-1.4.1-cp37-cp37m-win_amd64.whl (185.8 kB view details)

Uploaded CPython 3.7m Windows x86-64

dijkstra3d-1.4.1-cp37-cp37m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.7m

dijkstra3d-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl (262.4 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

dijkstra3d-1.4.1-cp36-cp36m-win_amd64.whl (185.8 kB view details)

Uploaded CPython 3.6m Windows x86-64

dijkstra3d-1.4.1-cp36-cp36m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.6m

dijkstra3d-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl (262.2 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

dijkstra3d-1.4.1-cp35-cp35m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.5m

dijkstra3d-1.4.1-cp35-cp35m-macosx_10_6_intel.whl (484.4 kB view details)

Uploaded CPython 3.5m macOS 10.6+ intel

dijkstra3d-1.4.1-cp27-cp27m-manylinux1_x86_64.whl (1.0 MB view details)

Uploaded CPython 2.7m

dijkstra3d-1.4.1-cp27-cp27m-macosx_10_14_intel.whl (260.6 kB view details)

Uploaded CPython 2.7m macOS 10.14+ intel

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1.tar.gz
  • Upload date:
  • Size: 299.1 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.4.1.tar.gz
Algorithm Hash digest
SHA256 9d2c7c6df9e52e4c971a3dcfcd2c84148648826f563f56c044ee1972185fc27f
MD5 2be0bd676d1c7e4ce4fc0d5d034c25a0
BLAKE2b-256 dcbe2912a4b29de705e49bbd68c6e3eac0a37376bbec61c6c1a7a7bf06f6f9dc

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 179.9 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.4.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6e329aa0d35299f94b436ccbac56241d3ea50ec024be009eb89c93c2b6d60ab0
MD5 b03274f4eb7cfa08cf44b33dd496986a
BLAKE2b-256 95f6321682d2a5d2ac448876d6ce5949226e4934499fdb27ab16dbcabfc14195

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.2 MB
  • 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.4.1-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7e213bd2d5436c0f7304c7c7d088bf9b44697866d8ddd8076668f772f7844b22
MD5 e8129fd92c356d273471d8cac0e06279
BLAKE2b-256 df34a47d50b2c861d795a4f2920790e4277ec77284c33686a8c99117a2ca8e20

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 263.1 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.4.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1e5984794a57938602739075b3fa6b18afccd0f313052127bb9c7a99f5e2d228
MD5 dd5331442859da70318a2903a8569fe9
BLAKE2b-256 52b45a351a1a8c2643ffbf425d1808f74e965e95eb2241033ef7577fbc1201af

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 185.8 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.4.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 494308250614159f881a8afeb51391922c4e70dd1e7567e7aa394af532947950
MD5 1a8775fa1e441ed63a23a6cd60c6bb6d
BLAKE2b-256 a34f629fff3d7601265ff996360b3559780c9dc7c910e090d2304359f44763a8

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.4.1-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 8cd03d85f7d3aa81d0cb0451cd4087ebc1fccb6ca21ccaacb17bd0f31542b4cf
MD5 d113b40f39a4e2b9651c8e787a07c2ed
BLAKE2b-256 e8142ccc279a771355fdc18533455324754d00b009c1faed5a1deba94a9bc721

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 262.4 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.4.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7809d227bec07da7def22a826e3b9efe522ed21f317701db95fecd59b02d5180
MD5 3ec53bb239f69baa09f495ac4fad7ccf
BLAKE2b-256 de9f489fa83d9757e73b677e58faca82fa555105d4611efe2ca1207c4541a9bf

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 185.8 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.4.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 26d6fd42e4519666213a570623d6917459cf48d46b1b0f67ddb2ab7e5bb7af71
MD5 7a9bf342150ee3d7a115faaf3fdee153
BLAKE2b-256 33f583885ecf33e1225a99fc5d68f267455b5243a7d63d072e84b04c41e6f2d7

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.4.1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 3f93738dc2f90fc3ef8c1351655f021aa4d5329a330355e78aee8cc28cf2d5bd
MD5 796de045fe95d385e2ac4507a70888ea
BLAKE2b-256 3a016f58dc22d2b3182614d535115b4b6c30cf6a8079e77b21ea474e96dc9fb4

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 262.2 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.4.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d35f7cb8b9d157b231aebc9c59069630bbca7d561798db8308a7746460322196
MD5 d3cbb8309332cdfcf69c97f87abcb63a
BLAKE2b-256 cb5e9ddc063e42e7083588e9eabc26668459541db5375a19084969fdd81a21b3

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.1 MB
  • 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.4.1-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 9ef57ceb5db0f00ee86953c6f571ebfd6cd61768231ad539716e4f3ce19ad1fa
MD5 37939242d3ca9bc01eeac06e6efd8fcd
BLAKE2b-256 9eb250870a37dbaf635de764ca605f817bbae152931c22b1377e15a815c89703

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp35-cp35m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 484.4 kB
  • Tags: CPython 3.5m, macOS 10.6+ intel
  • 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.4.1-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 d25eebbe5091da1cae407e46b12e82aa8d2248e8e32647424f91d85df2b351e5
MD5 6ea344d789d498bfcdcae6e538559594
BLAKE2b-256 84c9341737e99ad72ee296d44e683fee89a916145ee946f964b1f64091c05cd7

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp27-cp27m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 1.0 MB
  • 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.4.1-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e401c71ff5fe15ea653bf23b54db9f134944bc306ef8fc5eb4e41e3e39d9b6ed
MD5 d976a40ab106366d90d4d8224c13513f
BLAKE2b-256 3f175ba5ead2c9b95d085d1e209253c72795c32189a0ac694819f9ebe66a21c8

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: dijkstra3d-1.4.1-cp27-cp27m-macosx_10_14_intel.whl
  • Upload date:
  • Size: 260.6 kB
  • Tags: CPython 2.7m, macOS 10.14+ intel
  • 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.4.1-cp27-cp27m-macosx_10_14_intel.whl
Algorithm Hash digest
SHA256 202d5b7e57c95d0b5ae1090ec7672c875981d13be5c06a6cb4d7102a307a1df0
MD5 4c52bbd6a8d4f0b671281f5081c0c209
BLAKE2b-256 606d57ae918cbafce85fd056138d9b24df11554211d16ace49ba480ee4fa97b7

See more details on using hashes here.

Provenance

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