Skip to main content

A Python port of Martini for fast terrain mesh generation

Project description

pymartini

A Cython port of Martini for fast RTIN terrain mesh generation, 2-3x faster than Martini in Node. The only dependency is Numpy.

A wireframe rendering of the Grand Canyon. The mesh is created using pymartini, encoded using quantized-mesh-encoder, served on-demand using dem-tiler, and rendered with deck.gl.

Install

With pip:

pip install pymartini

or with Conda:

conda install -c conda-forge pymartini

Using

Example

The API is modeled after Martini.

from pymartini import Martini

# set up mesh generator for a certain 2^k+1 grid size
# Usually either 257 or 513
martini = Martini(257)

# generate RTIN hierarchy from terrain data (an array of size^2 length)
tile = martini.create_tile(terrain)

# get a mesh (vertices and triangles indices) for a 10m error
vertices, triangles = tile.get_mesh(10)

API

The Martini class and create_tile and get_mesh methods are a direct port from the JS Martini library.

Additionally I include two helper functions: decode_ele to decode a Mapbox Terrain RGB or Terrarium PNG array to elevations; and rescale_positions, which adds elevations to each vertex and optionally linearly rescales each vertex's XY coordinates to a new bounding box.

Martini

A class to instantiate constants needed for the create_tile and get_mesh steps. As noted in the benchmarks below, instantiating the Martini class is the slowest of the three functions. If you're planning to create many meshes of the same size, create one Martini class and create many tiles from it.

Arguments
  • grid_size (int, default 257): the grid size to use when generating the mesh. Must be 2^k+1. If your source heightmap is 256x256 pixels, use grid_size=257 and backfill the border pixels.
Returns

Returns a Martini instance on which you can call create_tile.

Martini.create_tile

Generate RTIN hierarchy from terrain data. This is faster than creating the Martini instance, but slower than creating a mesh for a given max error. If you need to create many meshes with different errors for the same tile, you should reuse a Tile instance.

Arguments
  • terrain (numpy ndarray): an array of dtype float32 representing the input heightmap. The array can either be flattened, of shape (2^k+1 * 2^k+1) or a two-dimensional array of shape (2^k+1, 2^k+1). Note that for a 2D array pymartini expects indices in (columns, rows) order, so you might need to transpose your array first. Currently an error will be produced if the dtype of your input array is not np.float32.
Returns

Returns a Tile instance on which you can call get_mesh.

Tile.get_mesh

Get a mesh for a given max error.

Arguments
  • max_error (float, default 0): the maximum vertical error for each triangle in the output mesh. For example if the units of the input heightmap is meters, using max_error=5 would mean that the mesh is continually refined until every triangle approximates the surface of the heightmap within 5 meters.
Returns

Returns a tuple of (vertices, triangles).

Each is a flat numpy array. Vertices represents the interleaved 2D coordinates of each vertex, e.g. [x0, y0, x1, y1, ...]. If you need 3D coordinates, you can use the rescale_positions helper function described below.

triangles represents indices within the vertices array. So [0, 1, 3, ...] would use the first, second, and fourth vertices within the vertices array as a single triangle.

decode_ele

A helper function to decode a PNG terrain tile into elevations.

Arguments
  • png (np.ndarray): Ndarray of elevations encoded in three channels, representing red, green, and blue. Must be of shape (tile_size, tile_size, >=3) or (>=3, tile_size, tile_size), where tile_size is usually 256 or 512
  • encoding (str): Either 'mapbox' or 'terrarium', the two main RGB encodings for elevation values
  • backfill (bool, default True): Whether to create an array of size (tile_size + 1, tile_size + 1), backfilling the bottom and right edges. This is used because Martini needs a grid of size 2^n + 1
Returns
  • (np.ndarray) Array with decoded elevation values. If backfill is True, returned shape is (tile_size + 1, tile_size + 1), otherwise returned shape is (tile_size, tile_size), where tile_size is the shape of the input array.
Example
from imageio import imread
from pymartini import decode_ele

path = './test/data/fuji.png'
fuji = imread(path)
terrain = decode_ele(fuji, 'mapbox')

rescale_positions

A helper function to rescale the vertices output and add elevations. The output is a numpy ndarray of the form [[x1, y1, z1], [x2, y2, z2], ...].

Arguments
  • vertices: (np.array) vertices output from Martini
  • terrain: (np.ndarray) 2d heightmap array of elevations as output by decode_ele. Expected to have shape (grid_size, grid_size). terrain is expected to be the exact same array passed to Martini.create_tile. If you use a different or transposed array, the mesh will look weird. See #15. If you need to transpose your array, do it before passing to Martini.create_tile.
  • bounds: (List[float], default None) linearly rescale position values to this extent, expected to be [minx, miny, maxx, maxy]. If not provided, no rescaling is done
  • flip_y: (bool, default False) Flip y coordinates. Can be useful when original data source is a PNG, since the origin of a PNG is the top left.
Example
from imageio import imread
from pymartini import decode_ele, Martini, rescale_positions

path = './test/data/terrarium.png'
png = imread(path)
terrain = decode_ele(png, 'mapbox')
martini = Martini(png.shape[0] + 1)
tile = martini.create_tile(terrain)
vertices, triangles = tile.get_mesh(10)

# Use mercantile to find the bounds in WGS84 of this tile
import mercantile
bounds = mercantile.bounds(mercantile.Tile(385, 803, 11))

# Rescale positions to WGS84
rescaled = rescale_positions(
    vertices,
    terrain,
    bounds=bounds,
    flip_y=True
    column_row=True
)

Martini or Delatin?

Two popular algorithms for terrain mesh generation are the "Martini" algorithm, found in the JavaScript martini library and this Python pymartini library, and the "Delatin" algorithm, found in the C++ hmm library, the Python pydelatin library, and the JavaScript delatin library.

Which to use?

For most purposes, use pydelatin over pymartini. A good breakdown from a Martini issue:

Martini:

  • Only works on square 2^n+1 x 2^n+1 grids.
  • Generates a hierarchy of meshes (pick arbitrary detail after a single run)
  • Optimized for meshing speed rather than quality.

Delatin:

  • Works on arbitrary raster grids.
  • Generates a single mesh for a particular detail.
  • Optimized for quality (as few triangles as possible for a given error).

Correctness

pymartini passes the (only) test case included in the original Martini JS library. I also wrote a few extra conformance tests to compare output by pymartini and Martini. I've found some small differences in float values at the end of the second step.

This second step, martini.create_tile(terrain), computes the maximum error of every possible triangle and accumulates them. Thus, small float errors appear to be magnified by the summation of errors into larger triangles. These errors appear to be within 1e-5 of the JS output. I'm guessing that this variance is greater than normal float rounding errors, due to this summation behavior.

These differences are larger when using 512px tiles compared to 256px tiles, which reinforces my hypothesis that the differences have something to do with small low-level float or bitwise operations differences between Python and JavaScript.

If you'd like to explore this in more detail, look at the Tile.update() in martini.pyx and the corresponding Martini code.

Type Checking

As of pymartini 0.4.0, types are provided, which can be used with a checker like mypy. If you wish to get the full benefit, make sure to enable Numpy's mypy plugin.

Benchmark

Preparation steps are about 3x faster in Python than in Node; generating the mesh is about 2x faster in Python than in Node.

Python

git clone https://github.com/kylebarron/pymartini
cd pymartini
pip install '.[test]'
python bench.py
init tileset: 14.860ms
create tile: 5.862ms
mesh (max_error=30): 1.010ms
vertices: 9700.0, triangles: 19078.0
mesh 0: 18.350ms
mesh 1: 17.581ms
mesh 2: 15.245ms
mesh 3: 13.853ms
mesh 4: 11.284ms
mesh 5: 12.360ms
mesh 6: 8.293ms
mesh 7: 8.342ms
mesh 8: 7.166ms
mesh 9: 5.678ms
mesh 10: 5.886ms
mesh 11: 5.092ms
mesh 12: 3.732ms
mesh 13: 3.420ms
mesh 14: 3.524ms
mesh 15: 3.101ms
mesh 16: 2.892ms
mesh 17: 2.358ms
mesh 18: 2.250ms
mesh 19: 2.293ms
mesh 20: 2.281ms
20 meshes total: 155.559ms

JS (Node)

git clone https://github.com/mapbox/martini
cd martini
npm install
node -r esm bench.js
init tileset: 54.293ms
create tile: 17.307ms
mesh: 6.230ms
vertices: 9704, triangles: 19086
mesh 0: 43.181ms
mesh 1: 33.102ms
mesh 2: 30.735ms
mesh 3: 25.935ms
mesh 4: 20.643ms
mesh 5: 17.511ms
mesh 6: 15.066ms
mesh 7: 13.334ms
mesh 8: 11.180ms
mesh 9: 9.651ms
mesh 10: 9.240ms
mesh 11: 10.996ms
mesh 12: 7.520ms
mesh 13: 6.617ms
mesh 14: 5.860ms
mesh 15: 5.693ms
mesh 16: 4.907ms
mesh 17: 4.469ms
mesh 18: 4.267ms
mesh 19: 4.267ms
mesh 20: 3.619ms
20 meshes total: 290.256ms

License

This library is ported from Mapbox's Martini, which is licensed under the ISC License. My additions are licensed under the MIT license.

ISC License

Copyright (c) 2019, Mapbox

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

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

pymartini-0.4.4.tar.gz (161.7 kB view details)

Uploaded Source

Built Distributions

pymartini-0.4.4-cp311-cp311-win_amd64.whl (228.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

pymartini-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl (717.2 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp311-cp311-musllinux_1_1_i686.whl (676.0 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

pymartini-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (708.8 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp311-cp311-macosx_11_0_arm64.whl (233.0 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pymartini-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl (242.1 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

pymartini-0.4.4-cp310-cp310-win_amd64.whl (229.3 kB view details)

Uploaded CPython 3.10 Windows x86-64

pymartini-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl (688.7 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp310-cp310-musllinux_1_1_i686.whl (650.7 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

pymartini-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (675.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp310-cp310-macosx_11_0_arm64.whl (234.7 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pymartini-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl (243.8 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

pymartini-0.4.4-cp39-cp39-win_amd64.whl (229.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

pymartini-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl (692.3 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp39-cp39-musllinux_1_1_i686.whl (652.5 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

pymartini-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (676.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp39-cp39-macosx_11_0_arm64.whl (233.1 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pymartini-0.4.4-cp39-cp39-macosx_10_9_x86_64.whl (242.0 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

pymartini-0.4.4-cp38-cp38-win_amd64.whl (238.8 kB view details)

Uploaded CPython 3.8 Windows x86-64

pymartini-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl (722.7 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp38-cp38-musllinux_1_1_i686.whl (686.3 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

pymartini-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (695.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp38-cp38-macosx_11_0_arm64.whl (241.0 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pymartini-0.4.4-cp38-cp38-macosx_10_9_x86_64.whl (249.9 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

pymartini-0.4.4-cp37-cp37m-win_amd64.whl (237.3 kB view details)

Uploaded CPython 3.7m Windows x86-64

pymartini-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl (661.3 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp37-cp37m-musllinux_1_1_i686.whl (626.4 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

pymartini-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (650.9 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp37-cp37m-macosx_10_9_x86_64.whl (250.1 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

pymartini-0.4.4-cp36-cp36m-win_amd64.whl (248.5 kB view details)

Uploaded CPython 3.6m Windows x86-64

pymartini-0.4.4-cp36-cp36m-musllinux_1_1_x86_64.whl (659.3 kB view details)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

pymartini-0.4.4-cp36-cp36m-musllinux_1_1_i686.whl (624.8 kB view details)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

pymartini-0.4.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (652.4 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

pymartini-0.4.4-cp36-cp36m-macosx_10_9_x86_64.whl (250.1 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file pymartini-0.4.4.tar.gz.

File metadata

  • Download URL: pymartini-0.4.4.tar.gz
  • Upload date:
  • Size: 161.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for pymartini-0.4.4.tar.gz
Algorithm Hash digest
SHA256 aa074e68b8ae463b73a741bfe9d299d16f4b6537779b26dda1e7575025ee981b
MD5 3f62730aafb0e01b75534841b650aaec
BLAKE2b-256 8d4d0b67081813ea0862663ebd9e34a3a9492291b787b0e4496944911f36b014

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 247cb7479f944935b33c94b7d0317c7c72c8848da68a5820f7c6dde056ed946d
MD5 88bc62ab2512c5619bd7c29426aaf485
BLAKE2b-256 62e3c246645b3ad21ad1af2a098a5e4608dfea1b85a43f2ff5e0e7045acddba8

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3a63f2b597b142b616b0819d67fecfcf5ca1fe6297cd40267031b75c711a4c29
MD5 303eba388e5778d6d05062a496eeea06
BLAKE2b-256 9ca900463e1b73673cfcd44efd805e3edcee62b02001ac5730680ab670db3895

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 07b0bef0eafcd64f9751d296d10cce4498144e493fdcce23312b57b3ae7675d0
MD5 7db052dbe7d6549a0f7e38222c7f4766
BLAKE2b-256 96953a6bd3cf590bd86d2e1b62107572c4ac6998e7b8c1a2378e03409fed75ac

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d8cd3e5f2fee3bc4bf7772c8e8bac2d9c4db86cdf4cc95b8438e611e9e11dc78
MD5 42a9acedf41400274f1faaaf84590a87
BLAKE2b-256 a1e3dcd1b0bc76682d23b2c82e99f7bcbe0b73939083146923b1adee02002063

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 57b32b257b83611ea45286783fe25a30b6bde6ce4ccab009d3599ed45b7456bc
MD5 54a1c2d61585b2b93035a9c15a340959
BLAKE2b-256 0b85e2c807f7fc089447b545cade1df5df81165cb241a39e189470b460c616ba

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 cf0d03fa90461ad09f0367edc1271c37c595fab48b5086ae3b0f3da38b043661
MD5 d698ebcdb1fe4cb3c71b38b7095d18a7
BLAKE2b-256 2384e229540d27fb04cbc8a35f2bc9aee107ad3eec05063ebc99ab253f3a83fb

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 be5970c8ae940afbf526a12e81a4e0b87c3475ea6db999df1495ac5d15717422
MD5 877ce75375d55f24ea9a3f172b60cca6
BLAKE2b-256 6d0edf271af3dd13d2307809616fa8e4f9b28a875abeb1d22dd576053ab0d429

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d90347ceef21d9e20e43ec48bf720ce0aab48be46ba26d5abaf4b5da9b2a30db
MD5 760c312434ca196afa7f39bfd050800a
BLAKE2b-256 9b152013e15a0eb3c3fc9ddbcb68e86597ccb236e767b15bdefc6b042cfbba72

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 22e31c205943e2e1accfcc4ac8e85f80762b0ee849f74fec9ed2d127169b6f22
MD5 7b0975be399c09ded2b39fab5f56bce0
BLAKE2b-256 690375125201f5d27819b79fe7e6bdfa3ed5d24668571c37445431da55fa238a

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 40e8c9b31c99609afa380d7856097db076d9cbfa099badfca17cb78ec9eb69ff
MD5 074ad9573f31e3d5f4d5a995f8e47617
BLAKE2b-256 edd76d143a99666954b104ebfc0538a6232212e9e3b375c1f43f56544f2a0352

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 631d13b4a84d90c343029a1e9146458cf222a7eecc99d355deade778d653cddc
MD5 7971a9e87a639f3ff9fc2063f77ae988
BLAKE2b-256 ea371133a522bd987aac0911a459cf808fa867bb998a245b41a2a363d154fbad

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8965d3a806bf90b97a338864f25db8ada27ef7e3b8d2490ea1c2f9dbcf3e0a28
MD5 5097932a17beb8a3574ea27fe12c1034
BLAKE2b-256 d25c3bb9b3627bce0134ae0536cfa6dfc4647dde8e3fe63512fc9722a6efbb10

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.4.4-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 229.3 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 667bbdda7775e5345fc07e96849874a7a3c969ca346cc71e49a2e67109a2fabc
MD5 0531cccdbe2268a04222b3f5e8469c16
BLAKE2b-256 04df7bce74019078b99d64a4c662960c5b0997496ed7c74d67b3a2e6b3e625dd

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6b3d5e15ca7478ed44281277dd9ee5da9e7f762da0c4f1991fdafaab44b453e1
MD5 32574d287d91d9565a8a59346d240567
BLAKE2b-256 536c8f0ce143fb49e25a0380c0ad20dee41f036cbdac806189adcb50ec0c75b9

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 eeea9f98c533509360a10cee21b1ec12c1b20334e5f0fbcd3087183e77937260
MD5 1367f3e9cc765655ff5445eb9113f9df
BLAKE2b-256 46020199e552f61aee8e4bd62e7e0272259c241494408b62edcc860a77db8336

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 895becb907412cbbef1e21372846350dfe376923bec992b79464bf31ec89735c
MD5 4317bd668adba72f16cf42bd06cb807e
BLAKE2b-256 ddcd878770aa8219645906711b0923d2c3752926cfbed8f9601b20df3edc39b8

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15b7720830b9c78378835b072e473b42cab45c0913fb8fbdd297820f2b85a3bf
MD5 9638ade51ce59d55e1f149b63d93c1d8
BLAKE2b-256 d828928ef2308973ce1e4b9ddf377379edf18aebbdd0864d753ad3511a440ef2

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8f5660d1c259e49e7bc26eb65d087f30c8b3d743620ea599ba9229189665f229
MD5 fb5a3d1dca6ab0f735f2cc3d96945e6f
BLAKE2b-256 1098b23d89db564081b25033516e667bf551d80185cd632440d46b4df7bb9001

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.4.4-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 238.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 37a4517be00148e0a62c32bc84802494b9ead15cbd9ed4bbdf62e8802aca354c
MD5 16b1ee9bc714619ab8afad5e503eebc5
BLAKE2b-256 63cc9bc1e1df77178142c271621d4b62e275d7f08fda50c032c29e9d0aebee0e

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 abedb8d6a82c383b7dac6e737f151e9c5b9eef16dcb6921ff615bc8375f53ffc
MD5 2366c535961af7c08803c701509aa5dc
BLAKE2b-256 7587c29ac7b405ecb6d6217f5323fe628a6c4de25dc9c8ea92c8398468afd7fb

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 b5f62cfc809e60fd508242f2865a83ba20d77c9958dd0987cfe71a84166108dd
MD5 07d1e095623cc90b3395624ee5214278
BLAKE2b-256 26f880ab6d93cd06a00388af27268b6b5e8e1b9092cf3c6d2f3097c9f6025a0b

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d658403f8b2eea379d91c2df2d89e25712361d2b5aa4138a0fb22efb4559ce38
MD5 a2f3245d63fed71d2f9564f824317ddd
BLAKE2b-256 91a216d1ad6c595765343a780b69c2aae4f4063cd32eb48a105f9ae0ef2ebbb7

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f3d161e892d4e3cdd569d79b77a2958856528dae39292aa02a799832ef8eaf25
MD5 fd61149846963ea147eb5a45bfd289b3
BLAKE2b-256 0d76851fd323420842db3e7e0a44bd2751fe035108f5b2645af9971207685a76

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 014b62ec5d66273a2c4e4be651f19d37742a7774c91caff76f8506f29762d022
MD5 b1f21636802b01ae82a9532229275bf5
BLAKE2b-256 6110f60606d3719ee2ddf8a5ff6541d23ae66248781fa894b2081ef6cc808c69

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.4.4-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 237.3 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for pymartini-0.4.4-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 90d1862ae59d1f5b82e3bcef53c129409982603377181af58d34b33aa96d3577
MD5 fe278a96fc4c6ab05e7e98c5a4a5bd12
BLAKE2b-256 3d9786bbcaee7ce0036c7ec42697b1c2c91e8ea912ef513c26c96ddf6eb31638

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 789c8aa13ec6e14db7666ca07b52e2b7160b1cd36daf0ad7cf97eae0317add64
MD5 e68e0299b64fd93e1fdc55abdfeeec5f
BLAKE2b-256 07faacbc2a93515ae3d5f4b1000a748d65a463c5ce429dbf45b1bfc52670210c

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 6b6ee47afaee7bd66697c2fef713ea17ccf5c6b6926813790154da63ba43982a
MD5 b7c12371c52307a99dd3347ceb61eecd
BLAKE2b-256 b02eb3c8cab8bfeaf5b3175549d87c88a363359ced7d61888ae4f4ec6b9fbffd

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 136a16c5c8cee826da77f44a06ff940d5fec2d6818de543dcd8c169c86a052d6
MD5 6b0d663b38d38fe6f130e08f6ab3fc7b
BLAKE2b-256 97876742666ac6c418c32bf97ddaf6e4bdeafb3c170cfae8e9f7dd59efa21980

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d35fa38bd0d89d9dbdaf6532300b11999134f756ad9393d7f2052fb8689126d2
MD5 52d1c6a9f09f9d67b8aa7e74e21aadab
BLAKE2b-256 6eec698336b0cd49005a20ce107a83fb6de83ace00dad7574dbe796e93f3bafb

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.4.4-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 248.5 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for pymartini-0.4.4-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 61386d0226f3e19abdec277ba701af986bfddacde8185e47cad367a9e37a2888
MD5 33eeb9bba661af17792cb737b35f46fd
BLAKE2b-256 d5bfbe485228090dcbf85e44594adacc1551f86426e7b495bd22089cf993ef3b

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp36-cp36m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3103892f54a1b456ae2fd48df06c2a1ffa45411f35b41f42b36a93c3db702386
MD5 2c780c4622c29ecce911a7cd978ba8aa
BLAKE2b-256 c1a0e9609c7b4121214c34c9c6eb96b8f0a165a3c607767a5ecf90f7b2915285

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp36-cp36m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 e22817f586dfa2420316b4f2d0f628fb764a283ca3c09107664e65891dd20baa
MD5 fb4f90f1b6cc8a80cd546c2c1b6666a8
BLAKE2b-256 3d04d97c55af596904307865cb2fabc593e2094b8a6ec7a7af7acd85bdf186b8

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bd8e8e1b1b86854cc1a031efb9277f3c9d57c5404a76a622e9ca0406d8a713c8
MD5 80e757b8d9dbfa5d4fa711ce038bbcc3
BLAKE2b-256 c19959e91c361de6cd68c945dfc260289e2e56d42b3e4a12eaccb16d424a1999

See more details on using hashes here.

File details

Details for the file pymartini-0.4.4-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.4-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d61991bcc2e55799ec41dce2adf56869b58fdaacf7c74876e0854e94e915f161
MD5 f5e7c49944416874d21e03ab7880d012
BLAKE2b-256 71633fe9f8714e8c0ba99986816913f8f8e351f0443ea81611dc8688b68a4ceb

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