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

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pymartini-0.5.1-cp313-cp313-win_amd64.whl (281.8 kB view details)

Uploaded CPython 3.13Windows x86-64

pymartini-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl (829.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

pymartini-0.5.1-cp313-cp313-musllinux_1_2_aarch64.whl (803.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

pymartini-0.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (834.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pymartini-0.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (817.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pymartini-0.5.1-cp313-cp313-macosx_11_0_arm64.whl (283.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pymartini-0.5.1-cp313-cp313-macosx_10_13_x86_64.whl (291.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

pymartini-0.5.1-cp312-cp312-win_amd64.whl (282.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pymartini-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl (833.3 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

pymartini-0.5.1-cp312-cp312-musllinux_1_2_aarch64.whl (807.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

pymartini-0.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (839.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pymartini-0.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (821.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pymartini-0.5.1-cp312-cp312-macosx_11_0_arm64.whl (284.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pymartini-0.5.1-cp312-cp312-macosx_10_13_x86_64.whl (292.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

pymartini-0.5.1-cp311-cp311-win_amd64.whl (282.0 kB view details)

Uploaded CPython 3.11Windows x86-64

pymartini-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl (852.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

pymartini-0.5.1-cp311-cp311-musllinux_1_2_aarch64.whl (830.4 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

pymartini-0.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (849.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pymartini-0.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (838.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pymartini-0.5.1-cp311-cp311-macosx_11_0_arm64.whl (285.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

pymartini-0.5.1-cp311-cp311-macosx_10_9_x86_64.whl (293.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

pymartini-0.5.1-cp310-cp310-win_amd64.whl (282.3 kB view details)

Uploaded CPython 3.10Windows x86-64

pymartini-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl (815.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

pymartini-0.5.1-cp310-cp310-musllinux_1_2_aarch64.whl (794.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

pymartini-0.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (813.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pymartini-0.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (803.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pymartini-0.5.1-cp310-cp310-macosx_11_0_arm64.whl (285.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

pymartini-0.5.1-cp310-cp310-macosx_10_9_x86_64.whl (292.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

pymartini-0.5.1-cp39-cp39-win_amd64.whl (283.0 kB view details)

Uploaded CPython 3.9Windows x86-64

pymartini-0.5.1-cp39-cp39-musllinux_1_2_x86_64.whl (817.4 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

pymartini-0.5.1-cp39-cp39-musllinux_1_2_aarch64.whl (795.7 kB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ ARM64

pymartini-0.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (815.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

pymartini-0.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (805.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

pymartini-0.5.1-cp39-cp39-macosx_11_0_arm64.whl (285.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

pymartini-0.5.1-cp39-cp39-macosx_10_9_x86_64.whl (293.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: pymartini-0.5.1.tar.gz
  • Upload date:
  • Size: 198.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1.tar.gz
Algorithm Hash digest
SHA256 6f6f99a60b1811bf63962fdd69a78446e02a4304ca1085ae3792fa59a13a0c28
MD5 56bd676bbdba553853fe7b8a3b45fc55
BLAKE2b-256 2b902a07cd8925f65f2b084e0c216846c5b7802444ea9e42e3d01d610afabec6

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.5.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 281.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b30db879d94a7159b5a954301ef39ed3af397306d2eb1d893278c13a6f4dd1c3
MD5 484c79cb622f72d5ce287e8273af37cd
BLAKE2b-256 4aa208b3ee24dcdbc1c2092a61cb141f5c6a2cddb81d768d19f8d89891ca68a3

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e47430510e8a3a97e5de3d5e59f7c9440bb65d53d3bf9a5d99bfcfd805724d7c
MD5 5a5f2ab0eb934ef3f8299481b7ee365f
BLAKE2b-256 76923039b0776b62bad1ccc42dc17d67b6da8e090394c778ca5d3e73bd0dd4a6

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b08e30d92195caacb10a75d3f3998859a88da3aa16017f036cbd1d98e0ba4a7d
MD5 62ff6f211c8cf806ed0f3311b274f60d
BLAKE2b-256 cec9500b535cbe8ad68829a45c8cd996e6ce52a4027d2f9eab4a6806ff859b19

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f7a52c5c39d65e3b07aa0e0e67f74ca18d878e64fe7a3d0de93894ab763fe97b
MD5 fe34df062183c16b9e0664ba02a224ce
BLAKE2b-256 e9c9a0686350923052070349152a2a0d4b75a904239d4b7cd98e7db6046521ec

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a533f475ca5c1ed5f5a142d8136a5cf57b76ccda087954917bd5c5488e4167f1
MD5 a2f3d4786bcaacfde72c6729847a46c5
BLAKE2b-256 482bde320abdc778d1b8974021d4eb5408744f4742ff71a46b156e9c62719774

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d07bf3fc1e108e0eb2482188cbd8750b93205c79e27c334494aa9edf6693fc5
MD5 26b38cd3e6b645c3073d3a854e9019ad
BLAKE2b-256 220c4a0fbe6168b6ac0f0cc1465abb853dfac420eb3ec76e7b647724024454ef

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 29217b1c0e1ec23ca47a4f1219175c009126a746355bd4817bd9a96a60a9e141
MD5 98000531c169c0908224d38e4880ffbb
BLAKE2b-256 1b475e5a0b717f499e38ec5a14d346ef0e414bb448c627c85063e81132be3e6c

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pymartini-0.5.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 282.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 88fdf12d0c65346d05de04787b4ba128dc77efe954e0741eb0badff159469188
MD5 9851c7bdc0346c178ee04ed0574dfe0c
BLAKE2b-256 bfe91426961e7b43b77aac354e420fa6130e6293a094369e64f783ba6c5d00b6

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 26f8f15133b72cb675b558bdfe5dbf7490bd19d497222cbbfa62abafbd124004
MD5 fb2caee4eb3645367e5402fa8f6756f5
BLAKE2b-256 bee7efd924e9263289a4b5e2f712ff0e9a298d00f686594542de654a82b8a2e0

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a4d770661389054ddf36b66d406ae7e0835325353d894cac416c5f97cbe1ea3d
MD5 3c0a03872d57be3b14964e3e368fd3ea
BLAKE2b-256 dfadc4c92530632f96a3839cbb54714a0b6e8320efd8b4f4231ec1783c376118

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b4a0b1f98ff4484050d467fad7078408b95d0c090545c762b56058da0cf3fc16
MD5 8e2fd5c295626df4ae969965bbb97603
BLAKE2b-256 81fc5a949091c372d3e79b70e9f41243009e5329284842ff56c33ab7d769e56e

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3bfb11bec61a213abbd88802b6af3abde9c0fc26a8181f054975b3fc812cfd95
MD5 53d1ede45aeca572a31cc4a04ceeba82
BLAKE2b-256 5fda24da49db5937660c94954d52677e26862c6e78133ccaefb5875992d8be19

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94b6d30f82fa8aabf69ae4905231a3fc7c86b53e5a9904c7f3648a6d3b2573c2
MD5 b91dbf9763cb5286e65266b3c2f9b914
BLAKE2b-256 aba0728883fb1cadb8c207b8074ddfb0aa6ffc721e09be553f374f71b76c6856

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c5921dca2ff4c9b0c327093884c5dacefc7b4f9f5ab9914b9ca11c54443c62e4
MD5 a9fe4ab1b9c186b40ee0ec09d859afba
BLAKE2b-256 669b89b60cf03087afa38c9e884fbed1a32c107b94bf2856a13061936a01f01d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.5.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 282.0 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 774f28ed8bc3ced1d8dc501c168a9db89a4ff0080f865127197049c7de222e7d
MD5 109ed7f2567302109a2b288d00e7c579
BLAKE2b-256 0f69d3200222d2f62dea9885e622a40b1fefc4507cd9a723ad9fef792c616bea

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3a8d07f7493ea0b5d672cc58c855133de9c0cc5829c82edc8fdb5c22b8f7b685
MD5 5c09be45f8dfc5f9a6aa345998458156
BLAKE2b-256 6d608bc4d5b8976be9c23024ace9c4fba16dd25f28aa921fc9f6d3f378e1aab3

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 f46a42523aa00da2b21b06127c502877fc1d5ab8b2fe5ca64cb412c8beb4e206
MD5 b3531c69cf6b7c32ddb9e88701dfdd47
BLAKE2b-256 b8b945d7b004259fad78ac421abc1276a2ca34d4501bbd9ddee359a2b0371408

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 309c42a6e89c95d410e980e43ac59d7f2407311fb4a1a163ad0647bf3e545a99
MD5 403f67342d9df450015bc9dd6d2ebf25
BLAKE2b-256 253c51f01e0f0e1794d5f15d4e04073554e2e0d05b0fe15b353cb0df77ca56e3

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d3dda0cb46cb7a59c6891a764656ede1656b90041383631fa7001dab8d8ad5e6
MD5 956b62d368864a60037bed55f92a18d2
BLAKE2b-256 6732f85c1837285d69807e965404883b1d89f28829dde3c7628b219d0436dd37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ca8b880b823d2d8a80fafa520380d64368c87193c16e6725614473278de7f0e
MD5 c5d4a005f4a4e115f73b560d1f1b4075
BLAKE2b-256 3517b39c6c208b7db56434b7c48d2fa493525f1dd6b7735b10ea8f9192717f09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f4f801f20417235549edba177776f2c9fcdda113dda85cc4bacbac00533e5b05
MD5 47d9ea4cbc2bf631adde1f3cff1b1f56
BLAKE2b-256 17f59efd1c3a4ea7581d390a217d431dc400243b490797709a6a531f6f4b053e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.5.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 282.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 c7b82218fc8c31cdd636489c6248a53ccfdf82063965fc0539e819990bd468f8
MD5 8269c8cebd237e1f90ab6e55859bcde6
BLAKE2b-256 f7fa682f297c280ab4b582961f89cdde4b0abb8869dfd0f9364417443497624b

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 925de0c1c6968aae086a0ebadfc835a56a1ef92602970be942418afe84a559f1
MD5 096656e46893aac2fb48be1e07b1399a
BLAKE2b-256 3d376e7a2db5d46afeac1434f5c92416d3ca86ded727e6cdfa06105484ec9609

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 fc209ecab885ff24b67d56871cd4e87d4b47b71eb38d63279082a4761999084e
MD5 9f3bf2488452e64419cd8e0893a37ff9
BLAKE2b-256 3755c274ca5be9f38a7224f61b8dbbbf45e10d850ec399de3e66f4ebb87be3e6

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 320d9d1bb84dd574359ba686d4272ca39ab568af5311ab19b611eb144cd9f492
MD5 8cf19faa3010e0ddda469917ddfe6cfb
BLAKE2b-256 5269e28edb672330d0e4b6e0cfa8ad4170d25102c4e7804b2713872626de854f

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0bf924d45fc1a17442dc846af59b75b07c604df2aeaf08c26645d49a7b9edadb
MD5 3037272d693f7aaa650437bbefc1da39
BLAKE2b-256 1336df1ec4917b59e67132fb0d19c4973d68e7b9019a9c342cd277d4b5fa0cef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 75651ed1952789b9677346043468b5556b8dd268d71387876de56e660d19cd7d
MD5 1a46f73deb0465929d7e0207115666b2
BLAKE2b-256 71c2e11864a79f7679abb0bff412f2f4f5bd6591bc1f68ab2b86ff14daa9f552

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a137bad3dcc5aed5af1d0fe56ae132891927b0e569567d93205f6c6c805a13a9
MD5 4cc1942bcfe2cc95a7da2980da6c0738
BLAKE2b-256 79b124b4cc56ac14e0eb215eb0027ed5102bb86fe61e292d41df9713ff68b2e8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pymartini-0.5.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 283.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.23

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 bbff476d7a8302e053a2d81a24f1798dc2c43290c7d1c1ac9a7670e440ad380f
MD5 43ca0b74fdc874f733afdec221a2fbb9
BLAKE2b-256 c687be0cb0cb338d3bc57e533d2337f4d70a575bcf6b4a906402af9a12af3001

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 537e75759f9da97d8664aec94a618f05ac59b3bb5fc1005399ea6545e0fce1ca
MD5 7f6544fe46857d8b28e51c353afde9bf
BLAKE2b-256 8a8ea90d7f6c5abdc445967206bada1c7d2c05899ef6e180b7c417eff1d04ac1

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp39-cp39-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3e19b90c44ec48a87d481384419769f9c212ddd53ff98ac94253fca99beb9b98
MD5 09d137890be23c95f3b23f4485655946
BLAKE2b-256 654e6dcf518dbc7b5c219c69260dc45a510ba9c9224af3ba53dfd724280f2b7f

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b1dd623de34d2c35010e89a8723b705771f73d6f9f09c2c8997dfcc5a49d04f3
MD5 c1c2339f8823e22d4c8c8b7c2ae474b9
BLAKE2b-256 7556934544f1bef3d9397f10520112176b4a0c1e96c14adc0149c006929842d2

See more details on using hashes here.

File details

Details for the file pymartini-0.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 810e66cf13bca3959eb6e9f7a265dee89d34330a8ca0492fd7612bba302d0cb0
MD5 bd5fd2983a5077c416f237fcc83f507f
BLAKE2b-256 ba2c66529841b513deff96557789e47dd3e9f955b6bc4c9dfa717b27d9cb6299

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e92e08c8ca058c95e04caa1f18a8c07f9a177d5a6f21ca96b73187ac7b20e575
MD5 f7049828af4a71cc3d12538a006968e3
BLAKE2b-256 3fe667b3b95e2bb0bae007c9052ba377efa5cf116bde783a3c10c8ceaa665a2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pymartini-0.5.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 694b898ed83bef0885798be5b9db64a2a29b349d8f325df4138ed3a654535471
MD5 ae6691be0e1cb9b80d1c3168604fb091
BLAKE2b-256 c82fd866054e66bb5266097422067fcab5c2ffa48f45d63c0f6cf1f6fd4a8f6b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page