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

Uploaded Source

Built Distributions

pymartini-0.4.0-cp310-cp310-win_amd64.whl (237.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

pymartini-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (628.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

pymartini-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (230.2 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pymartini-0.4.0-cp310-cp310-macosx_10_9_x86_64.whl (239.9 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

pymartini-0.4.0-cp310-cp310-macosx_10_9_universal2.whl (321.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

pymartini-0.4.0-cp39-cp39-win_amd64.whl (236.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

pymartini-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (626.2 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

pymartini-0.4.0-cp39-cp39-macosx_11_0_arm64.whl (229.1 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pymartini-0.4.0-cp39-cp39-macosx_10_9_x86_64.whl (238.4 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

pymartini-0.4.0-cp39-cp39-macosx_10_9_universal2.whl (319.9 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

pymartini-0.4.0-cp38-cp38-win_amd64.whl (245.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

pymartini-0.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (657.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

pymartini-0.4.0-cp38-cp38-macosx_11_0_arm64.whl (236.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pymartini-0.4.0-cp38-cp38-macosx_10_9_x86_64.whl (245.9 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

pymartini-0.4.0-cp38-cp38-macosx_10_9_universal2.whl (325.7 kB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

pymartini-0.4.0-cp37-cp37m-win_amd64.whl (244.4 kB view details)

Uploaded CPython 3.7m Windows x86-64

pymartini-0.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (598.5 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

pymartini-0.4.0-cp37-cp37m-macosx_10_9_x86_64.whl (245.9 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

pymartini-0.4.0-cp36-cp36m-win_amd64.whl (244.4 kB view details)

Uploaded CPython 3.6m Windows x86-64

pymartini-0.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (599.2 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

pymartini-0.4.0-cp36-cp36m-macosx_10_9_x86_64.whl (245.8 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: pymartini-0.4.0.tar.gz
  • Upload date:
  • Size: 152.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0.tar.gz
Algorithm Hash digest
SHA256 9edf24d812fe79814a862dfec641d600f034da777fb06cf4234c8735a3d58624
MD5 f3d75ac9c0733b6499196a4f2168fc45
BLAKE2b-256 b9486c632f0fabb3f704f3593f9dc303e5e72dd7cb17da3cfb81f7157a1baad8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 237.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pymartini-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e67fb1caff76915a63fb061c667a5c8f81f41034a37ee9adcfdae1b9b1f86cc1
MD5 4086d9ae3fd717326b49506cbfef3a86
BLAKE2b-256 cadc8ef72e1349f3ea4e5c7ef2b3c3c4e85ee855748455e05f85186bd2a204ea

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 04caf70caeef09da7b5a2655212eac87c10c8f9cb639fd60d0e34663682f1ddc
MD5 d3c514b460f5abbceaea6ac36141f544
BLAKE2b-256 3561f438453cb4bc042cec23a725bb532a5ab5527601708de4f64f1a3dd7fced

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 230.2 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pymartini-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1252394c46d65f38a92ff511034c13f3f75814da3837b12309444933bdee1bb9
MD5 590b10af1c796dc5086639b770d62f8e
BLAKE2b-256 83bb1eea9975cb744bbaeb6ea647f7084e0e0ddd85d54ea4099bacae40a68d47

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 239.9 kB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pymartini-0.4.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f60161f042fedad68e9769cd5e3249101a9391b846b9269595cd9cbd56973360
MD5 f0f9f7d9127d28c63b3764d60f4519fa
BLAKE2b-256 2cb0f94573888bc0df00788f93773b05b8a5687596e5ca61ea6dabf565f7b113

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

  • Download URL: pymartini-0.4.0-cp310-cp310-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 321.7 kB
  • Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9

File hashes

Hashes for pymartini-0.4.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 f5509c51569bb13fe1879ae58b341aa21ac602dfc4f7e880a44fb659e76e5607
MD5 1bd00ca12869b32f19ec3dddadc623a8
BLAKE2b-256 c096be917038e3a4625b02776ccdc56c3d014e61ddabbc41cc8f1a345f4ae88c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 236.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b7dc6083602a0c06ed737d67a84b7b84e42fd8e4035dfe3f6fca7ab59525e08c
MD5 a46c6a9b02166471fb4603029af63d62
BLAKE2b-256 4a500d3376e57391878295513a79cdc75f928b23703951e80bc0c1808b4801cc

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5f4d8e4c6424b1cf650f9131ea01c3373dcadedac86437e74e11b2f9ed8c7f0b
MD5 00d3eccd64262692adeab5b4d4f44bd8
BLAKE2b-256 8bde9d7cc11d52142ba4e582ebd73780fe0cbd00f72b488c51bdfa753d1f01ac

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 229.1 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c936c07c69d49ab148707f707e3b72aa210bce598ac1a00964a2621e411102ac
MD5 2cfefbe5d6fa3c979934081c3b1704be
BLAKE2b-256 49da64a25ea0670a0263a55c3f170f1ec41f20f4f40a18eb075de5ae3e2bc9a4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 238.4 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 de15e348851716c026c42703866318864f91cc944b64065a67aede8943032ae9
MD5 79e44ac587060fcc6e62efecd0eb893b
BLAKE2b-256 166850ba25c9cf27e38e46686547be11fd88ad15c101e18903e342ed2128d6ae

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

  • Download URL: pymartini-0.4.0-cp39-cp39-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 319.9 kB
  • Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 349ae0fa7b825e661fea2e5c5211fc29a47cce67c0f09e8e85db5321f122c0c5
MD5 962c5e0f08e1226d6d8e718c1baddabb
BLAKE2b-256 2776e56a1031c13b3115f025a24fff5f035a2664b2362fadcbbbfb9c3b6787df

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 245.9 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c8d992412ec0cffd858c45df4ae1be2f5ce1aff83453ddcc466414faba80b130
MD5 f64f012d83e235f1bf178584b04355de
BLAKE2b-256 e63a13381c053b10f42bc539b0e4c4b47e4884f8a965fe2b8dd79382f9085bcc

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c076173132bab4e30e660e41c73fc50f5db2fbd820a1ba83a8fb152e9d6fc727
MD5 de7a2e8cab33f37fdd6ea6f1f3e95c62
BLAKE2b-256 cdaca107010e6c03112d75850881d3a8b9b1d1682d8b6e159308e71005bff982

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 236.8 kB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1c08dd4f21e643b95269f07545099f6dca89120424f22c4be3cded8e77cecc02
MD5 4ae0c5329a481c4d4735d5beeb6d5129
BLAKE2b-256 8cc686d28b7c40c1368bccd7df5bcb0745353254ae05e8ce8b5b695edf5b2de3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 245.9 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0a9e3589c28fbcfcc82b9eb0239de85dde358af5ed29cfc974f865025912d771
MD5 3398d661ffcb78c2f2cf71bc6e23f1de
BLAKE2b-256 cf8139c3b81311faf4c9d58d2aead329ae5d65a06296109a0d9259c7f1d1731d

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

  • Download URL: pymartini-0.4.0-cp38-cp38-macosx_10_9_universal2.whl
  • Upload date:
  • Size: 325.7 kB
  • Tags: CPython 3.8, macOS 10.9+ universal2 (ARM64, x86-64)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 a5d4c45d559cfb52b4d0dea1e13a2fe211ee06d25e1cabb7b1a86897a38bc9db
MD5 9e7729ca3f2d4a433b14c08a71f7d2cc
BLAKE2b-256 dc0e5ee9f9bf3c99c2b3f16a665de5c86e39ee3ac40e0eede7a3ce3b8e6fb058

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 244.4 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 9f747219d61d6c1dcf1dd170320c44091c65c2af1abd06342d33c49ad3c82aea
MD5 a3d18c9a6acc33ed2631d3b05e2196a1
BLAKE2b-256 1ba01dc31ab6e6bb0487c71821cdb45c19164d3fd63161b6d4319a1ddcb411fc

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ec1402877b9bc84fd0ab907d2a1a42d8009a4a705c4b67af39a016f594ea380e
MD5 5f3b18aa1005b8f8466e6b597d41c0e6
BLAKE2b-256 fb8a1904775008b2d09d610971d5d344d8cec190e15902aad43b27e796cc157f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 245.9 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a3bf43d2f3dd8222eca5242951289dba6e3bd613aee3b240771ddf1073fd57da
MD5 c78ee13ee50afa40040e510c30ab697e
BLAKE2b-256 3ee2143789ee40de77070c8fc4788487e5e093cdee1f3e1fc13115656b2410e3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 244.4 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 988f70d83dc2b09714e9b5de2034b9b596f632fa9d313e5fc8e6921e9fb3b6b5
MD5 2555ce19aa8a707759562079b6821e57
BLAKE2b-256 26dca8299bc67bd1b23d9fe9be0008bd31fb4b010e9fd8ad93fcc5c46c321a2a

See more details on using hashes here.

File details

Details for the file pymartini-0.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 df96b5a46a8e5fb78cd525ec18cc22c17b3ecdd13bdcabdfac22d547c0316bb2
MD5 4e5d21f7c11057dc8a6d407cc2adbc8c
BLAKE2b-256 54b0d3e901feed42745d4eed067bdb0613c9531b44297d004d6dc87f947ef0f3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.0-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 245.8 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6

File hashes

Hashes for pymartini-0.4.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6e0ac6cfbf5f77a9b12c3d3ef04ae1b2f648dca8e8ea158f350a6c69408d9d1c
MD5 3fcff8b896c1ab0098322ba0fe2bef53
BLAKE2b-256 553971ad63d3abb7e243dbf0c1dd6af06cea679c84ecf767c50d6d93b7c83eab

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