Metadata-Version: 2.4
Name: evalmc
Version: 0.0.4
Summary: MyoChallenge CLI — submit ONNX and Docker policies trained with MyoSuite 3
Author-email: MyoChallenge Team <caggiano@gmail.com>
License-Expression: Apache-2.0
Project-URL: Homepage, https://mc26.myosuite.org
Project-URL: MyoSuite, https://www.myosuite.org
Project-URL: API, https://api.mc.myosuite.org
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: click>=8.0.0
Requires-Dist: docker>=6.0.0
Requires-Dist: requests>=2.25.0
Requires-Dist: boto3>=1.26.0
Dynamic: license-file

# evalmc

Submission CLI for [MyoChallenge](https://mc26.myosuite.org). Train with
[MyoSuite 3](https://pypi.org/project/myosuite/) (`pip install -U myosuite`),
then upload an ONNX graph or a Docker agent image.

[![PyPI](https://img.shields.io/pypi/v/evalmc.svg)](https://pypi.org/project/evalmc/)
[![Python](https://img.shields.io/pypi/pyversions/evalmc.svg)](https://pypi.org/project/evalmc/)
[![License](https://img.shields.io/pypi/l/evalmc.svg)](https://pypi.org/project/evalmc/)

Python **3.10–3.14**, same range as MyoSuite 3. Default API:
`https://api.mc.myosuite.org`.

```bash
pip install -U evalmc myosuite
```

---

## Train locally (MyoSuite 3)

2026 ChaseTag uses the steered full-body 1v1 env on the Gymnasium API:

```python
from myosuite import make_env

env = make_env("myoChallengeChaseTagFBVs-v0")
obs, info = env.reset(seed=0)
```

| | |
|---|---|
| **Env** | `myoChallengeChaseTagFBVs-v0` |
| **Task / phase** | `chasetag` / `1` |
| **Observation** | `(546,)` — you are `agent_0`; last 2 dims are role one-hot |
| **Action** | `(354,)` — muscle activations in `[0, 1]` |
| **Scoring** | Title cycle: mid-cycle vs a fixed champion, then single-elim finals |

CPU training (Stable-Baselines3) or GPU (`make_env(..., backend="mjlab")`) both
export to the same ONNX contract. See [MyoSuite 3](https://www.myosuite.org).

---

## Quick start

```bash
evalmc host --set-host https://api.mc.myosuite.org
evalmc login                          # email + token from the dashboard
evalmc status
evalmc submit-onnx model.onnx -t chasetag -p 1
```

Credentials are stored in `~/.myochallenge/`.

---

## Commands

| Command | Purpose |
|---|---|
| `evalmc host` | Show or set the API host |
| `evalmc login` | Save email + auth token |
| `evalmc set_token` | Set the token non-interactively |
| `evalmc status` | Confirm host and team |
| `evalmc submit-onnx` | Upload a standalone ONNX policy |
| `evalmc nominate` | Pick a scored artifact for title-cycle finals |
| `evalmc push` | Submit a Docker / ECR agent image |

### ONNX (recommended)

Graph is `obs → action`. No `policy.py` required.

```bash
evalmc submit-onnx model.onnx -t chasetag -p 1
```

ChaseTag tensors: input `obs` `[batch, 546]`, output `action` `[batch, 354]`.

### Title-cycle nomination

Before freeze, choose which scored in-window submission plays in finals.
Without a nomination the platform uses your best score.

```bash
evalmc nominate -t chasetag -p 1 --submission-id 123
```

### Docker

For custom Python around the policy. Ship `policy.py` and/or `model.onnx`
under `/policy` (or `/app`):

```python
class Policy:
    def reset(self):
        ...
    def get_action(self, obs):
        ...  # 1-D float array, length 354 for ChaseTag
```

```bash
evalmc push my-agent:tag -t chasetag -p 1
```

---

ChaseTag 2026 is invitation-only. Registration and submission are rejected until
the team is on the whitelist. Leaderboards stay public.
