RCH Solver
RCH — a solver for the Heterogeneous Multi-Agent Travelling Salesman Problem (MTSP).
This package wraps the high-performance C++ solver core via pybind11 and makes it available as a regular Python library.
Installation
Prerequisites
- Python >= 3.8
- A C++17 compiler (
g++ >= 7,clang++ >= 5) - CMake >= 3.15
uv- matplotlib (only needed for visualization helpers)
Install from PyPI with uv
uv venv
. .venv/bin/activate
uv pip install PyRCH
If you also want plotting helpers:
uv venv
. .venv/bin/activate
uv pip install "PyRCH[viz]"
Install from source
cd MTSP-Solver
# Core package only
uv sync
# Core package + visualization helpers
uv sync --extra viz
# Development environment + visualization helpers
uv sync --group dev --extra viz
This project documents uv as the supported environment workflow for source
and development installs.
Quick Start
1. Solve a JSON problem file
Assume your JSON has been saved as problem.json in the current directory.
import pyrch
result = pyrch.solve("problem.json", time_limit=10)
print(result["status"]) # "success" or "failed"
print(result["timeout"]) # True if time-limit was reached
print(result["statistics"]) # {"max_cost": ..., "sum_cost": ..., "solve_time": ..., ...}
for route in result["routes"]:
print(f"Agent {route['agent_id']}: path={route['path']}, cost={route['cost']}")
# Anytime improvement history
for snapshot in result["anytime"]:
print(f" t={snapshot['time']:.3f}s max_cost={snapshot['max_cost']:.2f}")
2. Solve from a Python dict
import pyrch
problem_data = {
"nodes": [
{"id": 0, "x": 0.0, "y": 0.0, "type": "depot"},
{"id": 1, "x": 1.0, "y": 2.0, "type": "target"},
{"id": 2, "x": 3.0, "y": 1.0, "type": "target"},
],
"agents": [
{"id": 0, "type": "UAV", "start_node": 0, "end_node": 0},
{"id": 1, "type": "UAV", "start_node": 0, "end_node": 0},
],
"costs": {
"UAV": [
[0.0, 2.24, 3.16],
[2.24, 0.0, 2.24],
[3.16, 2.24, 0.0],
]
},
"options": {
"return_to_end": True,
"objective": "min_max"
}
}
result = pyrch.solve(problem_data, time_limit=5)
print(result)
3. Planner API (recommended)
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pyrch
planner = pyrch.Planner()
# Add nodes
planner.add_depot(0, x=0.0, y=0.0)
planner.add_target(1, x=1.0, y=2.0)
planner.add_target(2, x=3.0, y=1.0)
# Add agents
planner.add_agent(agent_id=0, agent_type="UAV", start_node=0, end_node=0, time_limit=6.0)
planner.add_agent(agent_id=1, agent_type="UGV", start_node=0, end_node=0, time_limit=9.0)
# Set cost matrices (one per agent type)
planner.set_cost_matrix("UAV", [
[0.0, 2.24, 3.16],
[2.24, 0.0, 2.24],
[3.16, 2.24, 0.0],
])
planner.set_cost_matrix("UGV", [
[0.0, 1.80, 4.20],
[1.80, 0.0, 2.90],
[4.20, 2.90, 0.0],
])
# Add constraints (optional)
planner.add_assignment(1, ["UAV"])
planner.add_assignment(2, ["UGV"])
planner.add_time_window(1, start=0.0, end=3.0)
planner.add_time_window(2, start=0.0, end=6.0)
# Set solver options
planner.set_options(return_to_end=True, objective="min_max", time_limit=5)
# Visualize the problem map
planner.show_map(show=False)
plt.close("all")
# Solve
result = planner.solve()
print(result["status"])
for route in result["routes"]:
print(f" Agent {route['agent_id']}: path={route['path']}, cost={route['cost']:.3f}")
# Visualize the result
planner.show_result(result, show=False)
plt.close("all")
4. Visualization
show_map — view the problem before solving
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pyrch
planner = pyrch.Planner()
planner.add_depot(0, x=0.0, y=0.0)
planner.add_target(1, x=1.0, y=2.0)
planner.add_agent(agent_id=0, agent_type="UAV", start_node=0, end_node=0)
planner.set_cost_matrix("UAV", [
[0.0, 2.24],
[2.24, 0.0],
])
planner.set_options(return_to_end=True, objective="min_max", time_limit=1.0)
# Via Planner method:
planner.show_map(show=False)
plt.close("all")
# Or via module-level function:
pyrch.show_map(planner, show=False)
plt.close("all")
# Draw on an existing axes (e.g. for subplots):
fig, ax = plt.subplots()
pyrch.show_map(planner, ax=ax, show=False)
plt.savefig("map.png")
plt.close(fig)
Depots are drawn as black stars (★), targets as grey dots, and each agent's start position as a coloured triangle.
show_result — view routes after solving
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pyrch
planner = pyrch.Planner()
planner.add_depot(0, x=0.0, y=0.0)
planner.add_target(1, x=1.0, y=2.0)
planner.add_agent(agent_id=0, agent_type="UAV", start_node=0, end_node=0)
planner.set_cost_matrix("UAV", [
[0.0, 2.24],
[2.24, 0.0],
])
planner.set_options(return_to_end=True, objective="min_max", time_limit=1.0)
result = planner.solve()
# Via Planner method:
planner.show_result(result, show=False)
plt.close("all")
# Or via module-level function:
pyrch.show_result(planner, result, show=False)
plt.close("all")
Each agent's route is drawn with a distinct colour and directional arrows.
return_to_end=False handling: when the solver option return_to_end is False, the solver internally appends the depot as the last node in each route. show_result automatically detects this and removes the trailing depot from the visualization — the route will end at the last target visited, without drawing an edge back to the depot.
5. Low-level programmatic API
from pyrch import Problem, Solver, Options, ObjectiveType, NodeType
from pyrch import Node, Agent, AssignmentConstraint, TimeWindowConstraint
# Build a problem instance in code
problem = Problem()
# Add nodes
for nid, (x, y), ntype in [(0, (0, 0), NodeType.DEPOT),
(1, (1, 2), NodeType.TARGET),
(2, (3, 1), NodeType.TARGET)]:
n = Node()
n.id = nid
n.position.x = x
n.position.y = y
n.position.z = 0.0
n.type = ntype
problem.add_node(n)
# Add agents
a = Agent()
a.id = 0
a.type = "UAV"
a.start_node = 0
a.end_node = 0
problem.add_agent(a, 0)
a2 = Agent()
a2.id = 1
a2.type = "UAV"
a2.start_node = 0
a2.end_node = 0
problem.add_agent(a2, 1)
# Set cost matrix (one per agent type)
import math
nodes_xy = [(0,0), (1,2), (3,1)]
n = len(nodes_xy)
cost = [[0.0]*n for _ in range(n)]
for i in range(n):
for j in range(n):
dx = nodes_xy[i][0] - nodes_xy[j][0]
dy = nodes_xy[i][1] - nodes_xy[j][1]
cost[i][j] = math.sqrt(dx*dx + dy*dy)
problem.set_cost_matrix("UAV", cost)
# Configure options
problem.options().objective = ObjectiveType.MinMax
problem.options().return_to_end = True
problem.options().time_limit = 5.0
# Solve
opts = problem.options()
solver = Solver(problem, opts)
ret = solver.solve()
result = solver.get_result()
# Note: this low-level API follows the original C++ convention:
# ret == 1 means success, ret == 0 means failure.
print(f"Return code: {ret}")
print(f"Paths: {result.paths}")
print(f"Costs: {result.times}")
JSON Input Format
{
"nodes": [
{"id": 0, "x": 0.0, "y": 0.0, "z": 0.0, "type": "depot"},
{"id": 1, "x": 1.5, "y": 2.3, "z": 0.0, "type": "target"}
],
"agents": [
{
"id": 0,
"type": "TypeA",
"start_node": 0,
"end_node": 0,
"max_length": 100.0,
"capacity": 10.0
}
],
"costs": {
"TypeA": [[0.0, 1.5], [1.5, 0.0]]
},
"constraints": [
{
"kind": "assignment",
"items": [
{"node": 1, "types": ["TypeA"]}
]
},
{
"kind": "timewindow",
"items": [
{"node": 1, "start": 0.0, "end": 50.0}
]
}
],
"options": {
"return_to_end": true,
"objective": "min_max",
"time_limit": 60
}
}
Fields:
| Field | Description |
|---|---|
nodes |
List of nodes. Each has id, x, y, optional z, type ("depot" or "target"). |
agents |
List of agents. Each has id, type, start_node, end_node, optional max_length, capacity. |
costs |
Dict mapping agent type name → cost matrix (2D array, row = from node id, col = to node id). |
constraints |
Optional. List of constraint blocks. kind = "assignment" or "timewindow". |
options |
Optional. return_to_end (bool), objective ("min_max" or "min_sum"), time_limit (seconds). |
Result Format
{
"status": "success", # "success" or "failed"
"timeout": False, # True if solver hit time limit
"routes": [
{
"agent_id": 0,
"path": [0, 2, 0], # ordered node IDs
"cost": 6.32 # route cost
},
...
],
"statistics": {
"solve_time": 0.123, # wall-clock time (s)
"max_cost": 6.32, # maximum route cost
"sum_cost": 10.56, # total cost of all routes
"n_generated": 1500, # labels generated
"n_expanded": 800, # labels expanded
"last_update_time": 0.08 # time of last solution improvement
},
"anytime": [
{"time": 0.01, "max_cost": 9.5, "sum_cost": 15.2},
{"time": 0.05, "max_cost": 7.1, "sum_cost": 12.0},
...
]
}
API Reference
pyrch.solve(source, *, time_limit=-1) → dict
Solve an MTSP instance.
source— file path (str/Path), raw JSON string, or Pythondict.time_limit— override the time limit in seconds (default: use the value in JSON).- If
sourcelooks like a file path but the file does not exist,solve()raisesFileNotFoundError.
pyrch.Planner (recommended)
High-level builder API. All mutating methods return self for chaining.
add_depot(node_id, *, x, y, z=0)— add a depot node.add_target(node_id, *, x, y, z=0, demand=0)— add a target node.add_agent(*, agent_id, agent_type, start_node, end_node, order=None, capacity_limit=-1, time_limit=-1)— add an agent.time_limitis the max travel distance/time (≤0 means no limit).set_cost_matrix(agent_type, matrix)— set cost matrix for an agent type.add_assignment(node_id, types)— assign a node to a list of allowed agent types.add_time_window(node_id, start, end)— add a time window constraint for a node.set_options(*, return_to_end=None, objective=None, time_limit=None)— set solver options.objectiveaccepts"min_max"or"min_sum".solve() → dict— run the solver and return a result dict.show_map(**kwargs) → Axes— visualize the problem map (depots, targets, agent starts).show_result(result, **kwargs) → Axes— visualize solved routes on the map.
pyrch.show_map(planner, *, ax=None, figsize=(8,6), show=True) → Axes
Plot the problem map: depots (★), targets (●), and agent start positions (▲).
pyrch.show_result(planner, result, *, ax=None, figsize=(8,6), show=True) → Axes
Plot solved routes on the map. Each agent's path is drawn with a distinct colour and directional arrows. When return_to_end=False, the trailing depot is automatically stripped from the visualization.
pyrch.Problem
Low-level programmatic problem builder. Methods:
add_node(node: Node)— add a node.add_agent(agent: Agent, id: int)— add an agent.set_cost_matrix(agent_type: str, matrix: List[List[float]])— set cost matrix.set_assignment_constraint(c: AssignmentConstraint)— set assignment constraint.set_timewindow_constraint(c: TimeWindowConstraint)— set time window constraint.options() → Options— access/modify solver options.
pyrch.Solver
Low-level solver. Construct with Solver(problem, options).
solve() → int— run the solver (1 = success, 0 = failure).get_result() → Result— get the final result.get_result_process() → List[Tuple[float, Result]]— get full anytime history.
pyrch.ObjectiveType
Enum: ObjectiveType.MinMax, ObjectiveType.MinSum.
pyrch.NodeType
Enum: NodeType.DEPOT, NodeType.TARGET.
License
MIT
Release files for PyRCH 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyrch-0.2.1.tar.gz | 487.8 kB | Details |
Built distributions (wheels)
Total release size: 7.3 MB
Release files / pyrch-0.2.1.tar.gz
| Download URL | pyrch-0.2.1.tar.gz |
|---|---|
| Size | 487.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e317dabedc9757da1f2cd7a502e673beae530c81f3579e837cbc789c7a2ddc72
|
|
BLAKE2b-256 checksum How to use checksums |
b0828f2be4e9fe776a423b0f497c646a5b7280a5fd53cd04a188ff94dc8b7e8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp312-cp312-win_amd64.whl
| Download URL | pyrch-0.2.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 300.2 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3c069ed9e9c349922ae5e48dbc60da8d61f84c9e083dc218c8a045fd49d07878
|
|
BLAKE2b-256 checksum How to use checksums |
d31270410d1b40ef73fc19d0d2c49ddd1c76215ca9e4d3ea30b5f9c29f18433e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrch-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 429.7 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
6c5f2b3ca1feb99a588fd292dbe031798f375b9e248f763be7470407e5008894
|
|
BLAKE2b-256 checksum How to use checksums |
b2e301561b86dd3929574027b4f612534141b41bed3be756637937305417b7a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrch-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 401.6 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
373b59d6ae2473724bc6ee6627ecf3f1a89bc869f46b4ff31e3b7968b0fccb80
|
|
BLAKE2b-256 checksum How to use checksums |
b250813b27ffa8f86db42d1b5051057caa84c7d0e792ee44e80fe9cedbf59804
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | pyrch-0.2.1-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 237.4 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2cdaace6d29372c5aa7c1609358cf6f0df6d7fdcd4a181b49a44ef8216aa9ad5
|
|
BLAKE2b-256 checksum How to use checksums |
0799723805c3b251bc76e459d3146691b10ad5afa56fd35d2b53d43a6ea16dae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp311-cp311-win_amd64.whl
| Download URL | pyrch-0.2.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 297.8 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
188414681aeaa3a4e38eb16abcb03728249824b501d2d3f3ea435ae6ac703519
|
|
BLAKE2b-256 checksum How to use checksums |
75a83f770cd2750df2b45a28557f03c70e2d3cc3f7c90f9a739d8b6028836505
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrch-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 431.4 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
bddd24624fbd6ee050b597ba6b398888e6af90a63a8f7ec5b09fd3eefe498fca
|
|
BLAKE2b-256 checksum How to use checksums |
79930419eee3f942803464693f6a0be277314f0676bed9a9757285458847b1df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrch-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 404.4 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
ed4170f6be4b095819bda38838040c1b3ecea0feeea757eba0d2cf52d80ef7fa
|
|
BLAKE2b-256 checksum How to use checksums |
527edb96f55fd3cf6097fa4c7c090540bf9ed745512615e8970232a2e093df53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pyrch-0.2.1-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 237.4 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e3ace7aae6b4db1e5758132ae6275cf4a9ee2c0b257474ebe00dd36a1c139995
|
|
BLAKE2b-256 checksum How to use checksums |
e8fe461cf73dd655b3cb1dcaa720288925c9172032937b31267026dc65836b28
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp310-cp310-win_amd64.whl
| Download URL | pyrch-0.2.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 296.5 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bb383290101e961b8a231faa716ff7dc240e06da8aba03fc93fa850d786ce7f1
|
|
BLAKE2b-256 checksum How to use checksums |
8ce22bfb5a0d8f1f5bacaba4b766ba5bf830e52a2d7d34152117921110bfc8de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrch-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 430.6 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
4a3ab1e2aa870f65390c7e8e575eabe2d0111211a353d2d029f88c3f09f453b6
|
|
BLAKE2b-256 checksum How to use checksums |
600b67d72210cde2219a4e76d2245ba853d7878a1882361b57965fcebf585098
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrch-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 403.7 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
f75abd10fd1c26d122051e7047d03a07566b0ec7ff09507e5a38b333b0a47701
|
|
BLAKE2b-256 checksum How to use checksums |
2cfe88d0eece7ee631ca43930f82822906ba33d542625cc0b7acced64e27f3c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | pyrch-0.2.1-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 236.2 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
f271cffa15a7e0b422a08a54f004c548944e173e4c46c8c7c5da72d41a84ffeb
|
|
BLAKE2b-256 checksum How to use checksums |
8946b7cb7c70c4c1a44c075dfc305925be935a0de7ff18dd98b520ada2ab315c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp39-cp39-win_amd64.whl
| Download URL | pyrch-0.2.1-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 296.9 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
285f06ae45ec97aa72b56f340e9aecdc8f4a686a75790fe67d4e845c41fb6730
|
|
BLAKE2b-256 checksum How to use checksums |
e7aa0d019584fa36860600fa29dc20b8182accc163cfe2a987135bf5f64d53e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrch-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 431.0 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
c3d5a628f978ae21a69a3413d6a03c35975414d4f726086a7a0a41e21d25da19
|
|
BLAKE2b-256 checksum How to use checksums |
ddb26735a5f1cf343c0e79b179d81a9b1c87f938b8a600225e573192e7bf3504
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrch-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 404.1 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
fdc39202a5752b5d9ad1accb3dfd866a397b1a370d33402d6d125be078c6a50d
|
|
BLAKE2b-256 checksum How to use checksums |
fb8ce9ee477be2120dc5e419adde84c3519eb8e65d551a247899d870f79979b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | pyrch-0.2.1-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 236.3 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d675546f5d2e980e4702b93add72c0f9209158855b2bfce7b7f8c14853317843
|
|
BLAKE2b-256 checksum How to use checksums |
5192af7679698fef4d63d21172f49d9de09c42b47d7f754b5bda23f9529c3d9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp38-cp38-win_amd64.whl
| Download URL | pyrch-0.2.1-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 296.7 kB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e98a127578ca4c228efd464da7354ced6274cedef671169a2c43de44ffe0bf54
|
|
BLAKE2b-256 checksum How to use checksums |
8c436abf683f2634e8790cc42344b95a73bcb42069411d27ced6798a0559786e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrch-0.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 427.6 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
273b7c85256a8b9d1f6932c7345d40f075ecc14bb565777a88f672c05bab8f15
|
|
BLAKE2b-256 checksum How to use checksums |
75a9b4ef0ea60d1028dedcb5df333c83c4edcd132f34ce3a191341475d32231e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrch-0.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 401.3 kB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
d1251d894e4e4f94b8c9c9081b9a85ea8624b3f257a92f2fe49707870b31b5cc
|
|
BLAKE2b-256 checksum How to use checksums |
9a9df364d5401081b04578d084e6cc34908882afc53c5f2d6570edea2524c7b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency logRelease files / pyrch-0.2.1-cp38-cp38-macosx_11_0_arm64.whl
| Download URL | pyrch-0.2.1-cp38-cp38-macosx_11_0_arm64.whl |
|---|---|
| Size | 236.0 kB |
| Tags | CPython 3.8 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5b3d6a5a6a5b6eb7ad1c27f1da135ed88b61a9d085c4c8f1cc221b67e34f624b
|
|
BLAKE2b-256 checksum How to use checksums |
958b2f7655433578e0e29d7a8443fa2299680132644519fcf5961c27db911675
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jun 29, 2026.
Transparency log