Metadata-Version: 2.4
Name: groundhog-hpc
Version: 0.8.0
Summary: Iterative HPC function development. As many 'first tries' as you need.
Author-email: Owen Price Skelly <OwenPriceSkelly@uchicago.edu>
License: MIT
License-File: LICENSE
Keywords: FaaS,Function Serving,Globus Compute,HPC
Classifier: Intended Audience :: Science/Research
Classifier: Topic :: Scientific/Engineering
Requires-Python: <3.14,>=3.10
Requires-Dist: globus-compute-sdk>=3.12.0
Requires-Dist: jinja2>=3.0.0
Requires-Dist: packaging>=24.0
Requires-Dist: proxystore>=0.8.3
Requires-Dist: pydantic>=2.0.0
Requires-Dist: rich>=13.0.0
Requires-Dist: tomli>=1.1.0; python_full_version < '3.11'
Requires-Dist: tomlkit>=0.12.0
Requires-Dist: typer>=0.16.1
Requires-Dist: uv>=0.9.5
Description-Content-Type: text/markdown

Home of `hog` ☀️🦫🕳️

<p align="center">
  <img src="./docs/groundhog_logo.png" alt="Groundhog Logo" width="300">
</p>

## Quickstart

Groundhog makes it easy to run, tweak, and re-run python functions on HPC clusters via [Globus Compute](https://www.globus.org/compute) using simple decorators.

Groundhog automatically manages remote environments (powered by [uv](https://docs.astral.sh/uv/))—just update Python versions or dependencies in your script, no SSH needed.

**Key concepts:**
- `@hog.function()` - Configures a function to run on a Globus Compute endpoint. Decorator kwargs (like `endpoint`, `account`) become the default `user_endpoint_config`.
- `@hog.harness()` - Marks a local entry point that orchestrates remote calls via `.remote()` or `.submit()`. Can also parse CLI arguments ([example](https://groundhog-hpc.readthedocs.io/en/latest/examples/parameterized-harness/)).
- The desired remote Python environment (version and dependencies) is specified alongside your code via [PEP 723](https://peps.python.org/pep-0723/) metadata. **You don't manage any remote state.**

```python
# /// script
# requires-python = ">=3.12,<3.13"
# dependencies = [
#     numpy,
# ]
#
# [tool.hog.tutorial]  # Globus Compute Tutorial Endpoint
# endpoint = "4b116d3c-1703-4f8f-9f6f-39921e5864df"
#
# ///

import groundhog_hpc as hog

@hog.function(endpoint='tutorial') # points to [tool.hog.tutorial] config
def compute(x: int) -> int:
    import numpy as np
    return int(np.sum(range(x)))

@hog.harness()
def main():
    result = compute.remote(100)
    print(result)
```

Run with: `hog run myscript.py main`

---

see also: [examples](https://groundhog-hpc.readthedocs.io/en/latest/examples/)
