Skip to main content

Progressive Convex Hull Simplification

Progressive convex hull simplification of the Actaeon mesh

Implementation of the algorithm from the paper

https://arxiv.org/abs/2604.14468

What it does

Given a 3D mesh, produces a sequence of progressively simpler convex hulls that are guaranteed to strictly contain the input at every step (conservative / exterior simplification).

The key idea is to work in the dual of the convex hull. Removing a vertex from the dual corresponds to removing a halfspace from the primal hull's H-representation — i.e., eliminating one face constraint and slightly enlarging the hull. Dual vertices are removed greedily in order of a per-vertex cost (primal volume added, surface area change, or mean width change), analogous to quadric-error simplification for triangle meshes.

Build

Requires CMake ≥ 3.24 (libigl's dependency recipes need it) and a C++17 compiler. Dependencies are fetched automatically via FetchContent. Builds on Linux and macOS. (On CMake 4.x the project sets a policy floor internally so the commands below work as-is; no extra flags needed.)

# Full build (includes interactive viewer; polyscope + embree fetched automatically)
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --target pchs

# Headless build (no polyscope or embree dependency)
cmake -B build-headless -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF
cmake --build build-headless --target pchs

# Python bindings (nanobind fetched automatically; pass your Python executable)
cmake -B build-py -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF -DPCHS_PYTHON_BINDINGS=ON \
      -DPython_EXECUTABLE=$(python3 -c "import sys; print(sys.executable)")
cmake --build build-py --target pchs_python_module

Mesh backend (CGAL or native)

The geometry/mesh backend is swappable at configure time via -DPCHS_BACKEND:

  • CGAL (default) — CGAL::Polyhedron_3 + CGAL predicates + CGAL::convex_hull_3.

  • NATIVE — a dependency-light backend using only the C++ standard library, a small half-edge mesh, qhull for the convex hull, and Shewchuk's robust predicates for orient3d. The native build fetches no CGAL and links no gmp/mpfr:

    cmake -B build-native -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF \
          -DPCHS_TESTS=OFF -DPCHS_BACKEND=NATIVE
    cmake --build build-native --target pchs
    

Both backends produce the same hulls; they differ only in floating-point tie-breaks that can change the greedy removal order late in a run. See docs/backend-abstraction-plan.md for the design and tests/native_regression.sh (also wired as an opt-in CTest via -DPCHS_NATIVE_REGRESSION=ON) for the A/B check.

Tests

The test suite (on by default; disable with -DPCHS_TESTS=OFF) is wired into CTest:

cmake -B build-headless -DCMAKE_BUILD_TYPE=Release -DPCHS_INTERACTIVE=OFF
cmake --build build-headless --target pchs pchs_tests
ctest --test-dir build-headless --output-on-failure

It covers global invariants (closed / genus-0 dual, conservative containment), byte-exact golden regression on the icosahedron, and per-component units (Chebyshev center, dual round-trip, cost vs finite-difference, mean width, the half-edge Euler ops, and the native geometry/mesh/hull vs CGAL). Add -DPCHS_NATIVE_REGRESSION=ON to also A/B-build the native backend and compare it against CGAL.

Usage

./build/pchs [options] [mesh.ply]

Defaults to an icosahedron if no mesh is given.

Option Description
--target N Simplify to N dual vertices / halfspaces (default: 18); if N < 0, subtracted from the initial count (e.g. -1 removes one face)
--cost-function F Cost metric: volume, area, or mean-width (default: volume)
--primal-output file.ply Write simplified hull as a polygon PLY (default: <stem>-primal.ply)
--dual-output file Write simplified dual as a triangle mesh in any format igl supports (default: <stem>-dual.ply)
--primal-initial file.ply Write the initial (unsimplified) primal hull
--dual-initial file Write the initial (unsimplified) dual hull
--costs [file.dmat] Write per-vertex removal costs; NaN for surviving vertices (default: <stem>-costs.dmat)
--popped-ids [file.dmat] Write vertex removal order (default: <stem>-popped-ids.dmat)
--stats Print per-phase timing after simplification
--interactive Open a viewer (see below; requires PCHS_INTERACTIVE=ON build)
--help, -h Print usage

Default output filenames are derived from the input stem, e.g. Actaeon.ply → Actaeon-primal.ply, Actaeon-dual.ply, Actaeon-costs.dmat, etc.

Interactive viewer

./build/pchs --interactive --target 18 Actaeon.ply

Opens a polyscope window showing the input mesh (ambient occlusion computed in the background) and the current simplified hull (transparent, colored by face normals or graph coloring). Controls are in the left panel under Hull Simplification:

  • Target / Animate to target / Step / Go to target — drive simplification one step at a time or animate to the target count.
  • Cost function — switch between Volume, Area, and Mean Width cost metrics; switching resets to the full hull and re-simplifies to the current vertex count.
  • Hull alpha — adjust hull transparency.
  • Coloring — graph coloring or normal pseudocolor.
  • Reset — rebuild from the full hull.

Algorithm sketch

  1. Compute the convex hull of the input primal mesh (CGAL).
  2. Find the Chebyshev center of the primal halfspaces via a small linear program (SDLP).
  3. Map each non-(nearly-)degenerate primal face to a dual vertex via the polarity transform about the Chebyshev center.
  4. Compute the convex hull of the dual points (CGAL).
  5. For each dual vertex, measure the cost of removing it and re-triangulating the hole convexly: the primal volume added, the change in primal surface area, or the change in mean width.
  6. Maintain a lazy-deletion min-heap. Repeatedly pop the cheapest vertex, erase it from the dual (retriangulating the resulting hole convexly), and update neighbors' costs.
  7. Convert the simplified dual back to a primal polygon mesh.

Library API

The core logic is in ConvexHullSimplification (convex_hull_simplification.h):

ConvexHullSimplification chs(V, F);   // build primal hull, dual, init queue
chs.simplify_to(18);                  // greedily simplify to 18 dual vertices
auto [pV, pPI, pPC] = chs.get_primal_mesh();  // get current hull as polygon mesh
auto [dV, dF]       = chs.get_dual_mesh();    // get current dual as triangle mesh

For step-by-step control:

while(chs.step()) { ... }             // one greedy removal per call
chs.num_dual_vertices();              // current vertex count
chs.popped_dual_vertex_costs();       // VectorXd, NaN for surviving vertices
chs.popped_dual_vertex_ids();         // removal order
chs.stats();                          // timing breakdown (t_primal_hull, t_dual_hull,
                                      //   t_queue_init, t_last_simplify)

The cost function defaults to CostFunction::PRIMAL_VOLUME; alternatives are CostFunction::PRIMAL_AREA and CostFunction::PRIMAL_MEAN_WIDTH:

ConvexHullSimplification chs(V, F, /*max_degree_for_flips=*/100, CostFunction::PRIMAL_AREA);

MAX_DEGREE_FOR_FLIPS (env var, default 100) controls the vertex-degree threshold above which the convex-hull-based one-ring triangulation is used instead of the flip-based method.

Python API

Install

pip install git+https://github.com/alecjacobson/progressive-convex-hull-simplification.git

This builds the pchs extension module via CMake/nanobind under the hood (using scikit-build-core); the default build links CGAL, so the compile can take a few minutes and the resulting module is GPL-encumbered (see License). To build the dependency-light native backend instead (no CGAL/GPL), pass it through CMAKE_ARGS:

CMAKE_ARGS="-DPCHS_BACKEND=NATIVE" \
  pip install git+https://github.com/alecjacobson/progressive-convex-hull-simplification.git

Alternatively, building manually (see Build above) with -DPCHS_PYTHON_BINDINGS=ON, adding the build directory to PYTHONPATH also works:

import pchs
import igl

V, F = igl.read_triangle_mesh("mesh.obj")

chs = pchs.ConvexHullSimplification(V, F,
    max_degree_for_flips=100,
    cost_function=pchs.CostFunction.volume)  # or pchs.CostFunction.area

chs.simplify_to(18)

pV, pPI, pPC = chs.get_primal_mesh()   # polygon mesh
dV, dF       = chs.get_dual_mesh()     # triangle mesh

costs = chs.popped_dual_vertex_costs() # VectorXd, NaN for surviving vertices
ids   = chs.popped_dual_vertex_ids()   # removal order

s = chs.stats()
print(s.t_primal_hull, s.t_dual_hull, s.t_queue_init, s.t_last_simplify)

# Or use the one-shot wrapper:
pV, pPI, pPC = pchs.simplify_convex_hull(V, F, 18)

Construct a convex polytope directly from a set of halfspaces (skipping the mesh → primal-hull → dual pipeline entirely, and with no simplification):

# Halfspaces as rows [nx, ny, nz, b], interior: n·x + b <= 0.
halfspaces = ...  # N x 4

x0 = pchs.chebyshev_center(halfspaces)  # optional; computed automatically if omitted
pV, pPI, pPC = pchs.primal_mesh_from_halfspaces(halfspaces, x0)

chebyshev_center raises if the underlying LP fails outright, but — like the igl::chebyshev_center it wraps — doesn't always detect a genuinely empty intersection (e.g. two disjoint opposing planes); sanity-check the result if the input isn't already known to bound a nonempty region.

License

The code in this repository is released under the MIT License (see LICENSE). Which license governs a compiled program, however, depends on the backend you build, because the dependencies differ.

Native backend (-DPCHS_BACKEND=NATIVE) — no copyleft

Links only permissive / weak-copyleft dependencies:

dependency license
qhull Qhull license (permissive, BSD-style: keep the notice, ship the license text, flag modifications)
Shewchuk robust predicates public domain
SDLP permissive ("modify and re-distribute … in any manner as long as this notice is preserved")
libigl (core) and Eigen MPL-2.0 (weak, file-level copyleft — obligations apply only to changes to those libraries' own files, not to your code)

None of these is GPL/LGPL, so a native build carries no viral copyleft: you may ship it under your own (e.g. MIT) terms while preserving the upstream notices. It fetches no CGAL and links no gmp/mpfr/boost.

CGAL backend (default) — GPL

The default build additionally links CGAL. The packages it uses, Convex_hull_3 and Polyhedron_3, are GPL-3.0-or-later (the kernel and HalfedgeDS are LGPL-3.0-or-later, and CGAL pulls in Boost). Because those two packages are GPL, a distributed CGAL-backend binary is effectively GPL-3.0-or-later — unless you obtain a commercial CGAL license. MIT is GPL-compatible, so combining is fine; it just means the program as a whole is copyleft.

In short: the library code is MIT. Build the native backend and the only obligations are the permissive / weak-copyleft notices above; build with CGAL and the distributed binary is GPL.

LLM use

I wrote the original prototype of this algorithm in matlab without much input from llms or coding agents (probably copilot tab-complete helped a little bit). Then I wrote most of first draft of the paper. My thought was that Claude Code etc. would have no trouble taking the paper source and the matlab prototype and spitting out a C++ implementation. A few failed attempts and a lot of spent tokens later, I gave up doing it completely automatically. The llms were simultaneously immensely helpful parsing through CGAL's otherwise forboding documentation and templating and also terribly confused by how to build anything more complicated than simple loops over elements using CGAL's half-edge datastructure. Using webchat llms effectively as a search engine on the CGAL documentation, I wrote the initial core of the vertex_erasure, primal_change, and convex_hull_simplification functions more or less manually (with tab-complete copilot stuff). When a very minimal version of this was working, I let Claude Code at it with CMake build junk, adding visualization, flags, python bindings, and most of this readme file. I did not use coding agents of llms to write any of the paper text (beyond looking for typos or double-checking derivations).

I added the mean-width cost metric after the first round of reviews. Again, I thought that because the area and volume metrics were already in place this would be an easy fully automatic task for Claude Code. It burnt an entire session quota and output nothing. So, I ended up writing that manually (with copilot tab-complete), and then Claude code cleaned up the flags and visualization code to expose the new cost metric.

Update: Since then, I've had Claude implement a non-CGAL (i.e., non-GPL) backend. I did this in --dangerously-skip-permissions mode which was fairly successful at not nagging me for instruction. I told it to use Qhull and to build its own half-edge data-structure using STL. It appears to have done that effectively.

Metadata

Release files for pchs 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pchs 0.1.0
File Size Uploaded Provenance
pchs-0.1.0.tar.gz 5.8 MB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for pchs 0.1.0
File
pchs-0.1.0-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
pchs-0.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
pchs-0.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.12 abi3 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details
pchs-0.1.0-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details
pchs-0.1.0-cp312-abi3-macosx_10_13_x86_64.whl CPython 3.12 abi3 macOS 10.13+ x86-64 Details
pchs-0.1.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
pchs-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
pchs-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
pchs-0.1.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
pchs-0.1.0-cp311-cp311-macosx_10_13_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.13+ x86-64 Details
pchs-0.1.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
pchs-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
pchs-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
pchs-0.1.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
pchs-0.1.0-cp310-cp310-macosx_10_13_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.13+ x86-64 Details
pchs-0.1.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
pchs-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
pchs-0.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.9 CPython 3.9 Linux glibc 2.28+ ARM64, Linux glibc 2.26+ ARM64 Details
pchs-0.1.0-cp39-cp39-macosx_11_0_arm64.whl CPython 3.9 CPython 3.9 macOS 11.0+ ARM64 Details
pchs-0.1.0-cp39-cp39-macosx_10_13_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.13+ x86-64 Details
pchs-0.1.0-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
pchs-0.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
pchs-0.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl CPython 3.8 CPython 3.8 Linux glibc 2.26+ ARM64, Linux glibc 2.28+ ARM64 Details
pchs-0.1.0-cp38-cp38-macosx_11_0_arm64.whl CPython 3.8 CPython 3.8 macOS 11.0+ ARM64 Details
pchs-0.1.0-cp38-cp38-macosx_10_13_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.13+ x86-64 Details

Total release size: 15.9 MB

Release files / pchs-0.1.0.tar.gz

Download URL pchs-0.1.0.tar.gz
Size 5.8 MB
Tags Source
SHA-256 checksum
How to use checksums
90b1027b8e770a1e9cca056d1169e06f82295325037bf2df0652144f06f44240
BLAKE2b-256 checksum
How to use checksums
30a959f5b596e9dbffc9e2663c3760cd7fa9f60bed50ebf52baae8c35637204a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp312-abi3-win_amd64.whl

Download URL pchs-0.1.0-cp312-abi3-win_amd64.whl
Size 359.0 kB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
637f5bf4ae1639980959965a2424f1ec99ca9a139121725057cf18c8acfd607a
BLAKE2b-256 checksum
How to use checksums
ea741cbabb9d9582d9be32ea2e63fa463b5c00af57bd271f7d71fee358d67f20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pchs-0.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 443.8 kB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
a5c472a26d78e8f84d20cbb924d3f4bb7648ee2dde7276845ed73b0ddb9e4eca
BLAKE2b-256 checksum
How to use checksums
834bcaa02c571d33bae0e4e4d7990ffe27681ce2b454c9819281a7cd65a2791a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pchs-0.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 417.3 kB
Tags CPython 3.12 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
df3f9770ad156eac9c8741ca7b9c6192c92d9cd87eea897c9b75761515b2109e
BLAKE2b-256 checksum
How to use checksums
b567812b3243925301fbb3116943e249c7aed89b777460389730cd4c67e7e64c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp312-abi3-macosx_11_0_arm64.whl

Download URL pchs-0.1.0-cp312-abi3-macosx_11_0_arm64.whl
Size 371.4 kB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
cb6a2808aebd77a0f42f6887f46251f7f29bb6587ba72fb65bc3952c161af245
BLAKE2b-256 checksum
How to use checksums
66295983bd6e018d6275ee244ddc0038f20b1d14e5a4e36f058489b594ba53fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp312-abi3-macosx_10_13_x86_64.whl

Download URL pchs-0.1.0-cp312-abi3-macosx_10_13_x86_64.whl
Size 400.8 kB
Tags CPython 3.12 abi3 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
af12b19948fe596a52e5bb8b3ce078b69331ebb847060bad4a6264b23535a531
BLAKE2b-256 checksum
How to use checksums
18fdcb4d3e8cee25ee19c6e99b83daf71ba0beadc39ec422b8e33be780b0ae7b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp311-cp311-win_amd64.whl

Download URL pchs-0.1.0-cp311-cp311-win_amd64.whl
Size 360.4 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
83e2da1fdf1b0c253ec95091ff905fb949f37941426516e2e41e700a32655a71
BLAKE2b-256 checksum
How to use checksums
118730db39a099ab7f0ea04ded14143244b2aee71dab3ba8f97f500fa401dbd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pchs-0.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 448.4 kB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
9907e6705ec71d08e9f53aff490052506d19e7e908e8a5ebd7136764df241acd
BLAKE2b-256 checksum
How to use checksums
571aa87bca67933840d937613e5ffa621f66d0dc2cfc96c93b40d9199d7795af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pchs-0.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 422.3 kB
Tags CPython 3.11 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
58f8f145713540e9b327144375d19a96a7b0c27960af3e2ada42a6142dce1039
BLAKE2b-256 checksum
How to use checksums
b5a2351657be335ef1bae2cde4e569ca6e1f1f672315ffe1fbd219bbea4b2319
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL pchs-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Size 375.7 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c8c7fd4d767d6d27d019ea19ccd6a5b398137cf2726a0a3caff0d2dc998d9b2c
BLAKE2b-256 checksum
How to use checksums
5d4d245525f222c056a183cafa1d6fec63379addaf8bd850bc6cf92a39e2d89b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp311-cp311-macosx_10_13_x86_64.whl

Download URL pchs-0.1.0-cp311-cp311-macosx_10_13_x86_64.whl
Size 404.4 kB
Tags CPython 3.11 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
ef026a0e1de519146bc4884084a164bf4c6f892ae555e86e89bc386e04789d61
BLAKE2b-256 checksum
How to use checksums
2f65b3e7d6cccb65b0c47cf4f73f9bde3045e4bb8961b38ed39d887887c0d8ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp310-cp310-win_amd64.whl

Download URL pchs-0.1.0-cp310-cp310-win_amd64.whl
Size 360.1 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
d033c1fd8b480d2090e2dc9a3d37649fb96eaaef15bccf42dd80ce6adcef4848
BLAKE2b-256 checksum
How to use checksums
d45753acb04ccc95b017b52cb18416d2da71c3294534ad7999e11bc25f9a8b06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pchs-0.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 447.9 kB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
16edc6a86403189438e05dcb13eac81f3f6580a8ebaaccc0e51b965b441c61e8
BLAKE2b-256 checksum
How to use checksums
aafdcde8c2aadc3792be2d9248f496015c87e3d941a80b6682d866e40c8f9c81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pchs-0.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 421.8 kB
Tags CPython 3.10 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
0110c4adac830b61fc5494d16eb67a1c32f069c1bda8a65dc302ce7a4e48e935
BLAKE2b-256 checksum
How to use checksums
9f95e8e8610e56fccc5ca3f02e54327d20c89e463c5a0c9468c22e540744b608
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL pchs-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Size 375.3 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
321feb4169acfe36c4509ba504787730494e5531b3d60019b37f59e416e72d97
BLAKE2b-256 checksum
How to use checksums
44afb99d33f599b4e07f8659780e22295b62567ad23dc8f85e2aa033bbc6d4af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp310-cp310-macosx_10_13_x86_64.whl

Download URL pchs-0.1.0-cp310-cp310-macosx_10_13_x86_64.whl
Size 404.0 kB
Tags CPython 3.10 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
9517e673fff56a9a13b03cc9e5f124cc8e5ae35fc341946f387983cd086ba7a5
BLAKE2b-256 checksum
How to use checksums
8fedaba1e0ef091511d5ef80182891105284f10631d2a3ce90e7b546ad475512
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp39-cp39-win_amd64.whl

Download URL pchs-0.1.0-cp39-cp39-win_amd64.whl
Size 360.6 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
8b2904d40da4d25bb7d414eb07c809c9219d7d18b6e7e51734cd167f0ce4ea32
BLAKE2b-256 checksum
How to use checksums
01449bd8b921fd64eb7ee7e49cc21308d79a6ce3a86ad0024735d566075bd974
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pchs-0.1.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 448.2 kB
Tags CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
f1fc2f15b33386954ea8c277ee817082089a68b5d1f37f9db37cc68ba005ce82
BLAKE2b-256 checksum
How to use checksums
e2222f5a9bf7ecc511fe609cd12d09ba730b7490f74e959d137e39be6ee67ea9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pchs-0.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 422.2 kB
Tags CPython 3.9 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
f4613d095390504b42653b03757bf9da1b76a2ae552cf5ab74d8738be0c475f5
BLAKE2b-256 checksum
How to use checksums
2433488818260471747e7bf716859717a1397daec752357955b67617965a5237
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp39-cp39-macosx_11_0_arm64.whl

Download URL pchs-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
Size 375.5 kB
Tags CPython 3.9 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a201618b38bc2d89113ac922ad7027ae05f8ac34e72753e18a273886f807e99d
BLAKE2b-256 checksum
How to use checksums
d058bae8d9f0ec8e618ccd2727fcb4001dc748667e991d01fec926a513177b4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp39-cp39-macosx_10_13_x86_64.whl

Download URL pchs-0.1.0-cp39-cp39-macosx_10_13_x86_64.whl
Size 404.3 kB
Tags CPython 3.9 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
4a79a03aaf46aab76472de6f6647234f25ae8323d8d2e2600fe1571049f0c521
BLAKE2b-256 checksum
How to use checksums
cb26d6e78f870c079c7d561da19adcbc9fa5c22fe0bdf0cacb14b9303f8ac77e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp38-cp38-win_amd64.whl

Download URL pchs-0.1.0-cp38-cp38-win_amd64.whl
Size 360.0 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
7af21281c7fda858b6aefae9cfbe1ee17db5f8a89d8e8ceedb422d0172458cc2
BLAKE2b-256 checksum
How to use checksums
0e51e4082ab580a3a956a2fbe7435d3832ea59a591cc345abd24a77aefe9afd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL pchs-0.1.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 447.4 kB
Tags CPython 3.8 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
aef95c5e031f36dffbb155a68f379c53f1471ce4a277d096e3de29325551261c
BLAKE2b-256 checksum
How to use checksums
840512e224430572ffb665b4b5cf70a6929ad7e28928116b9eb37bf908b221d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl

Download URL pchs-0.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl
Size 419.8 kB
Tags CPython 3.8 Linux glibc 2.26+ ARM64 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
ca71afa6b4fa7192fc54a1eb6f46c5bfcac6040dafa61533c286eede0d6a2f82
BLAKE2b-256 checksum
How to use checksums
da9b575b3a1d4e65d3de2bd149261f68e85b5e095735443cd40cf736c2d62d7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp38-cp38-macosx_11_0_arm64.whl

Download URL pchs-0.1.0-cp38-cp38-macosx_11_0_arm64.whl
Size 374.6 kB
Tags CPython 3.8 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fbf745cef1051786f7d562f82e843d799af244b6f6e7931134162e63d94631b1
BLAKE2b-256 checksum
How to use checksums
d022e8b330e59f2161ffc7ecf22df86935f76cf148b7edff6c6e7c1c62912d9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / pchs-0.1.0-cp38-cp38-macosx_10_13_x86_64.whl

Download URL pchs-0.1.0-cp38-cp38-macosx_10_13_x86_64.whl
Size 403.0 kB
Tags CPython 3.8 macOS 10.13+ x86-64
SHA-256 checksum
How to use checksums
f8c9f5f1fa99d6de8af4c20042398dd0ded623b9c6dda89736be647190c0d5ac
BLAKE2b-256 checksum
How to use checksums
8496ca4e5275692b8464d68327414943eb84539c393fab1a5567b7643b66e445
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Security for pchs 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 26 files in this release have been uploaded with provenance metadata.

Select from 26 files

Attestation for pchs-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

26 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page