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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

pymartini-0.4.1-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.1-cp310-cp310-macosx_11_0_arm64.whl (230.2 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pymartini-0.4.1-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.1-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.1-cp39-cp39-win_amd64.whl (236.4 kB view details)

Uploaded CPython 3.9 Windows x86-64

pymartini-0.4.1-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.1-cp39-cp39-macosx_11_0_arm64.whl (229.1 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

pymartini-0.4.1-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.1-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.1-cp38-cp38-win_amd64.whl (245.8 kB view details)

Uploaded CPython 3.8 Windows x86-64

pymartini-0.4.1-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.1-cp38-cp38-macosx_11_0_arm64.whl (236.8 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

pymartini-0.4.1-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.1-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.1-cp37-cp37m-win_amd64.whl (244.3 kB view details)

Uploaded CPython 3.7m Windows x86-64

pymartini-0.4.1-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.1-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.1-cp36-cp36m-win_amd64.whl (244.4 kB view details)

Uploaded CPython 3.6m Windows x86-64

pymartini-0.4.1-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.1-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.1.tar.gz.

File metadata

  • Download URL: pymartini-0.4.1.tar.gz
  • Upload date:
  • Size: 152.5 kB
  • Tags: Source
  • 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.1.tar.gz
Algorithm Hash digest
SHA256 36356393a3c658bfc523b69b8b7135c042d81190cfa1b79614e992af7de45405
MD5 640deaa6c067e3e488e802755a6f9d32
BLAKE2b-256 a42522a3a79a87b51285d41c63cc0bcacfbfadc8ea4ff39e1d9f47d2d9c05437

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 58df8053734c16c51a87ec09afe0a860bec5c1b99852f204ff840bd688ab5bf6
MD5 c3ca8efa693d4219106050ed7b14173c
BLAKE2b-256 7490e39e4b6e06646a47ea7a7130266bb4a871bbcb064254a2d15fee207af8a3

See more details on using hashes here.

File details

Details for the file pymartini-0.4.1-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.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e53448684c64022458f80ad5e639bb8e67fba3a50d9922f8b841684b0670e99f
MD5 7a7afb25cdd53dc88ecd47195d5bb290
BLAKE2b-256 0c76e436bd079fcaf96a8074dacd54498a9e9f537c13f773e56ee7ba149763fa

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acee5b9265b4d4de0a4d41ed67dcd9b38d7a63f9c92cbf8aea59e865eed0c1fb
MD5 1c525ab8746fe0495bdd98564e92ed19
BLAKE2b-256 485066e19ba1376d9cace1a44ed94f473d0f45fb0c15b4f96dca78180904f178

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 56b3cbac76690f92b6e69613952983e0e4fd8ce40bb2952c52d9dbc9197af28e
MD5 baf6fcca71cc8c9888332f7ac1053787
BLAKE2b-256 4ee3b971f839259d6fb3c60fb7438db78ffbeb63a91779c979df7eeecdf1a660

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.1-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 1e54ce94f79c542e23c44fa2e4bef147cb994d71f64f93f814d925dffdcc7ce8
MD5 ba3901e53c2d109849c1f55bae787f44
BLAKE2b-256 edcc8e9703ffcdbae18b6bcdf48d6105bb229b03968bf639d500e38e460f3511

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 099c843076d54288fd92461b615825ebe4dca237ffa1b7f9731a06f4526492b9
MD5 d5ccd8dcbd07470fa0f18d57017d01c3
BLAKE2b-256 491f8066abdf45e1b42b3b4ecd6607d118b7dfdb0a68ef17a89c6d99c12910db

See more details on using hashes here.

File details

Details for the file pymartini-0.4.1-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.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 acbdbddb5c61f052ecdefde8b07617be959aeb8a01e74fbdbaca91b1f54880a5
MD5 3d59673a86cae14986d4a1d377836a72
BLAKE2b-256 c30c582391d3d8d693125bf99aa5515324b84c3370670ffb26cf716200d988cc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c487bd5f82e8a1cd4fe61ad2a1b2e627efc93e619d8d95183c54c839dcd278c4
MD5 cd6961788c81a6d404f70044a58fd69c
BLAKE2b-256 cb24114c98cb9d6080b27ddd05819b7aa4ce12ad21b855b71098ec6893c9f315

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fe5d74d676519e0ac77cbb0e4a7f1b611974c411d54f439e8490985e0faa7895
MD5 d7ef6dbf0d291d85417fd401cec3fbcd
BLAKE2b-256 d9c91c6aecdef0e418710649f8f179787d5e7c57adb09a077a44cf17288e05ed

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6ffe65ea20dc6f32b45d4dbe09ee9d0c8b6c0242255348a70e512b42e9d9eb49
MD5 f4712bef56cc211be32ef4a68dbc8803
BLAKE2b-256 c78d02680dcabd076def0e8250dddd7918803a07a27bb0ff88e481164bf4b77c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 245.8 kB
  • Tags: CPython 3.8, 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.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 843047279b14079b213786fe56d9db90315213d224b88e77f4877a2079e50a17
MD5 faa16c0ac9a6eb50c1e75ab559f6c233
BLAKE2b-256 8fdcc204e89a768dfccee2fbf5084c0fd0399a98f2edd21dcbe85a51eb8511a1

See more details on using hashes here.

File details

Details for the file pymartini-0.4.1-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.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 eaaf9da727e5005c2e070c7e4678bc588b6fa8a56a933fa705ed2c2764ab48e7
MD5 4924171a88136b1aa4813d94033a31c2
BLAKE2b-256 d2f062622b3103367808f207b7ec438c3f68aaeba297e1f8ce72e92ef36ca2df

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dbad3c68fbd5123203ea309699c8329348fa868f09160eb23546e98ba482786c
MD5 18e9735a465f53e015983997507f6d02
BLAKE2b-256 eb50235f8ed0249b59ed513915c2de9b89ca1320b1d67389efcc755a11ebc097

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1d3ca06a4ad3bd77616836967fddc1645e88fd04aad00e085d25f5bb0bb2f57f
MD5 7f88b8f92b4e33c2f9b56e16667f1399
BLAKE2b-256 23bd37c39bc1d3c8ecdb71c85f7c2d8b6e75ac332a5bbc53c2583762fe6f39bf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ae5fbab20d04a834ad6515ef42cb8fbfc2a5eb2f5e70e31abc7f1516a1bb3725
MD5 13a960c594dba641d732b01b1ef9eb11
BLAKE2b-256 1b3e5769d0d6623c21655f44e6ad1b4cd73ff487beb1f8093ab8c4a51a7cac08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 244.3 kB
  • Tags: CPython 3.7m, 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.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 b9b682056f5aa96e0ca70a0c4fb23d624f27eca4b679a6b34dbe32e12e482eaa
MD5 2de3282403114c5c3c8ec9491b74d900
BLAKE2b-256 abe764471a12aca3c86af8379c5ca0d6426a1df0f7e3ade295bea29f00025621

See more details on using hashes here.

File details

Details for the file pymartini-0.4.1-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.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f822b7822c063ce298c5c7fdc393c4ffb42871bab39d341bd95473f1dc7abc5b
MD5 e5f615275b99ac456539836f05322513
BLAKE2b-256 b1851e2b8943dd91cda283e85440dfb1c2f5294eadde60cfd846d4f86bb79c39

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8f3691dda61f077ee374eca4db8ba27e795c66a6fd28b402bb324b0f52d8ea09
MD5 d625ad43115b7130d8e5dbda0876e264
BLAKE2b-256 8dfda37cda5067351e61eb56508b502f6d864a78bab5947a49481d1912e0f88d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 2d84473aff4c7db6a81bcea99882971b33c96787e8ad2d7a478f53b55582b931
MD5 9ef8c52a1b21b145c828ff37667bfdc9
BLAKE2b-256 87254016d4aa51ec65eb7b584e3aad607400e1ad17342f76a1f33e962dacb69c

See more details on using hashes here.

File details

Details for the file pymartini-0.4.1-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.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 de216a9a3122599b0a6d73979a042f4a87dbce6189e43d1efdfc3c019894440b
MD5 1ff0ed2963a0e198b28164c8084cb523
BLAKE2b-256 5ac42b4492378bd9bd81b543c5cd0fee75a6002a9cb6d6a226ff1513afbb4ceb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.1-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.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.1-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 121ee893a0aa1eadfe90ae5db9d675145555b4550fe00cc940a14ba46ff4af0f
MD5 30fa5d3d43508433674ee4387dcae51a
BLAKE2b-256 f762ba7e8df8fa7ae49547c54d279d1170fc97f38b878d6c4eaf6f6fe6a39993

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