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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

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

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

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

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 macOS 11.0+ ARM64

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

Uploaded CPython 3.7m Windows x86-64

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

Uploaded CPython 3.6m Windows x86-64

pymartini-0.4.2-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.2-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.2.tar.gz.

File metadata

  • Download URL: pymartini-0.4.2.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.2.tar.gz
Algorithm Hash digest
SHA256 9e08b895660603d25308de4308ae697d611dc33a79467fb5a45f75687730970e
MD5 679500f44fa2d2c179e044bad79d1903
BLAKE2b-256 ad29d6fe874778cb7711077f3fb4c23192289c94414ebb9e62979bdb79b0969d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 138403b5b58254438c91540b3f5c545104c45daa55b1ab5ef841039a2c37a887
MD5 bef603b5ad9da31cad4c0125ee7a5d24
BLAKE2b-256 2e0597d5af52191e9e8ba996f37b4039b11ec6271dbd71876f7c95b5c28e472c

See more details on using hashes here.

File details

Details for the file pymartini-0.4.2-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.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e4c42ebb30e21747a2c52fdbdd26cbe7258c0e81ec23a40447caea02343a720b
MD5 1c92412ef5a61f23d94664e44340a78c
BLAKE2b-256 910e7e90a3d848c46fcf14964ac810a5b962d8d4a1f3d559e1a3ef3989866a9b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7bfdb76d266f28253cc2eb4767dae5d228d2f017b965e1020dba8052b6c7e8b
MD5 9cb1c73eeea27d4a58e4408c5f61f061
BLAKE2b-256 2d58ef345cf472f63d4340f02354836c6e3ae98f5ca22b82944127d149c8ccb0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b701cfa114402c98a3495a3ac6f264ba6bd43e9a132cf07cf18290722f60745d
MD5 ef432ff019c637dd05bb3755fe223477
BLAKE2b-256 19b14b0f96b4eab05b05dd83a2b5c07f9be1f636f06d95c7a6db3556beb0ff66

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 48645e18aeed0c9c13bc765e83b97d6daf23753850cb86e836bfbea63b4bfa8e
MD5 48fcb3b944bba931d82aa945dc608d60
BLAKE2b-256 835faad9eb8f735b01bc47417e21223c82594ef7175731d3ef9436a20fae9c06

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 7b97214f56beef9776f395b1ec2030e7e9dc67ab28906b2f82c20ae90f632825
MD5 b4b63e8ca014596a1e37d961f1be3c9e
BLAKE2b-256 dd5a1e2acda1569210b4b3fbc72dd5399c90068e3ac15c1d5a344d46c63654f9

See more details on using hashes here.

File details

Details for the file pymartini-0.4.2-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.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e425d8091524282c950639865a6eb5e115aa069c32bbab6de5cb8b1c6b5e41e4
MD5 baa689d2cf311bc609dadf6c160907e9
BLAKE2b-256 738d6d0c98f042d29198116151d64f47b4354d59fe80f3d232aa3acb00b27250

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a8ff79f86501857ecfa11a6930c66dffbfca4a8a41de82f3f26077bff9d90f41
MD5 96b45190b8aacf5e61667b204f36f16a
BLAKE2b-256 cd1ce01e183f9976fd08a57c1fe7708788d20ace388fce1aac40e786bf0c86af

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 699bf8f60c3089e39cc186b0391f9d1f81bad3be63f775c7c8f2c102b4bcb3cb
MD5 66fec6bc0a75f9110956835f5b03727f
BLAKE2b-256 ea4e0dcbaa3bf9667b422a0d9a4c1cea9bcc6032b1e2a8a4fa18a6c5420c3bc7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9b5802f6b0f9dd15288d0825c9fd5e86fb244d12d35b7b0186a1c6ae785bf1db
MD5 cc928f0104d47fefdae770c5ce09d720
BLAKE2b-256 d8429869cadcf577eefc73fc8217babd5fe98375b7d85ec84a9499588a750838

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 f4bc6a16eea93a29eecb8f6bbe0a833e0f25a34abbeac62b7fc31eca2d43b432
MD5 4478f58411bbad3aee4a73f8d85ad248
BLAKE2b-256 da7d49a1bd7763e500aae79491ff333c17d3bf4b1d3fd38d1ea869fe4139a65b

See more details on using hashes here.

File details

Details for the file pymartini-0.4.2-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.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 40f5899a44201718e53def453b37c0a9b60dcb5119ec910f3ac5285f3d395c7b
MD5 8fd432bcef09a8b2451cb98571d02f7d
BLAKE2b-256 5b410e6da60486d1cd047d3505b6a0a82b6964a8c332044e421151a989c5395a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9ca885a4359099c44f13fdcb47f787b4c6cebd69e9c6cfe62cb488bacb590bbb
MD5 6401d6e1d56286b1e5a806cba1de11d2
BLAKE2b-256 a248cc805b9946c08b2ca7c9b8aeb33ff4ebef0e1a207a3bc8401c8e7500ffb5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e3bfaeeb42d02553c88af764e98eea9959ebd6cf3cc778d8d0c3d667ff86c91a
MD5 305cf5b7d309edf0c875feb395bd4cbf
BLAKE2b-256 6457161eddf547a63b0c404a749b1665d122895b3d106b5702d34067146f3710

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7779df12df7c5f6ecb864f5f49c3137325f8afb1f2fe14543f2ec36351bf89bf
MD5 3ce4fc0ba9b906dc865fdb75a02a508c
BLAKE2b-256 cbeee0bed8c42b101595412a8b83cd1d843d4fdb2b3af6e0c30e3559cb892145

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 bf6860461cb07db32e1be6995047b73705d478a86e33bec10b20480c382531b8
MD5 5656dfeec0f4a750914d1ade51c4eff8
BLAKE2b-256 91d2f89668769750d497af1002d194816f2cfae5ea387761f1f8a3db666e8896

See more details on using hashes here.

File details

Details for the file pymartini-0.4.2-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.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0223ea7928aeff57332f750b6159b1622195b8f6a292d0954176975c0ffa9930
MD5 4abad93a06aa856d66f744a492e03387
BLAKE2b-256 8cdca532584d5021fa395ef81f9b0dfb06b78f50fba4db1c9bd900cc9c60097c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4b294f66d024de7d41763b1050aaa0465b209034e2ceb396fb3ae91c55eded4a
MD5 6bde5755ff9e2da5d380edb3f0e247a5
BLAKE2b-256 606991dc258e20d4df1e592460d853bebad63c9bc1102b3312ee21fa62ce07dc

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 00316ccc639031fcbfc183e23c9b824c36a4398a3d3a3db0bc62fff2c8d52230
MD5 b7793b87e0b975793ccf7ac067648887
BLAKE2b-256 31279fa08e29a8386152e4cc18f51186de5cd46ae3e5844058589c4c5b217dfd

See more details on using hashes here.

File details

Details for the file pymartini-0.4.2-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.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 8ad1cffc4132637bc49c35009204e1db22b8e8dae086762132023b979cca1e6a
MD5 9fda26e4b71ee6742b519c794fb60d4b
BLAKE2b-256 fdf0a5820e09392cbb302d2914d1e9acc549ade019941247d6e9d7c12d34fc3f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.4.2-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.2-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 48246edd0e640d3200182ead0e6e828d289f70dae504ee1b5ef96727480e4c9c
MD5 922657f96b34f80ab5d100579737b9b7
BLAKE2b-256 70fe5548a1e6e80512f0098d32f2285f451245ece763a39109c19eec962b5ce0

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