Spaces:
Sleeping
Sleeping
Finalize strict grader discovery and stabilize RL checkpoint loading
Browse files- .github/workflows/deploy-readiness.yml +0 -30
- .gitignore +1 -0
- DEPLOYMENT.md +6 -5
- openenv.yaml +3 -3
- triage_env/agents/rl_agents.py +9 -2
- triage_env/openenv.yaml +3 -3
.github/workflows/deploy-readiness.yml
DELETED
|
@@ -1,30 +0,0 @@
|
|
| 1 |
-
name: Deploy Readiness
|
| 2 |
-
|
| 3 |
-
on:
|
| 4 |
-
push:
|
| 5 |
-
branches: [ "main", "master" ]
|
| 6 |
-
pull_request:
|
| 7 |
-
|
| 8 |
-
jobs:
|
| 9 |
-
test-and-build:
|
| 10 |
-
runs-on: ubuntu-latest
|
| 11 |
-
steps:
|
| 12 |
-
- name: Checkout
|
| 13 |
-
uses: actions/checkout@v4
|
| 14 |
-
|
| 15 |
-
- name: Set up Python
|
| 16 |
-
uses: actions/setup-python@v5
|
| 17 |
-
with:
|
| 18 |
-
python-version: "3.11"
|
| 19 |
-
|
| 20 |
-
- name: Install dependencies
|
| 21 |
-
run: |
|
| 22 |
-
python -m pip install --upgrade pip
|
| 23 |
-
pip install -r requirements.txt
|
| 24 |
-
pip install -e ./triage_env
|
| 25 |
-
|
| 26 |
-
- name: Run tests
|
| 27 |
-
run: python -m pytest -q
|
| 28 |
-
|
| 29 |
-
- name: Build Docker image
|
| 30 |
-
run: docker build -t medicaltriage:ci .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.gitignore
CHANGED
|
@@ -41,6 +41,7 @@ dist/
|
|
| 41 |
#Environment variables
|
| 42 |
triage_env/training/*.pkl
|
| 43 |
triage_env/training/*.meta.json
|
|
|
|
| 44 |
!triage_env/training/q_agent.pkl
|
| 45 |
!triage_env/training/q_agent_task1.pkl
|
| 46 |
!triage_env/training/q_agent_task2.pkl
|
|
|
|
| 41 |
#Environment variables
|
| 42 |
triage_env/training/*.pkl
|
| 43 |
triage_env/training/*.meta.json
|
| 44 |
+
triage_env/training/triage_rl_qtable*.json
|
| 45 |
!triage_env/training/q_agent.pkl
|
| 46 |
!triage_env/training/q_agent_task1.pkl
|
| 47 |
!triage_env/training/q_agent_task2.pkl
|
DEPLOYMENT.md
CHANGED
|
@@ -55,8 +55,9 @@ Default manifests:
|
|
| 55 |
- `deployment/k8s/deployment.yaml`
|
| 56 |
- `deployment/k8s/service.yaml`
|
| 57 |
|
| 58 |
-
## 6)
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
|
|
|
|
|
| 55 |
- `deployment/k8s/deployment.yaml`
|
| 56 |
- `deployment/k8s/service.yaml`
|
| 57 |
|
| 58 |
+
## 6) Manual Readiness Check
|
| 59 |
+
Run local tests and image build before release:
|
| 60 |
+
```bash
|
| 61 |
+
python -m pytest -q
|
| 62 |
+
docker build -t medicaltriage:ci .
|
| 63 |
+
```
|
openenv.yaml
CHANGED
|
@@ -23,7 +23,7 @@ tasks:
|
|
| 23 |
grader_command: python graders/task1_grader.py
|
| 24 |
grader_path: graders/task1_grader.py
|
| 25 |
grader_file: graders/task1_grader.py
|
| 26 |
-
grader_legacy_path: graders/
|
| 27 |
graders:
|
| 28 |
- type: python
|
| 29 |
name: default
|
|
@@ -40,7 +40,7 @@ tasks:
|
|
| 40 |
grader_command: python graders/task2_grader.py
|
| 41 |
grader_path: graders/task2_grader.py
|
| 42 |
grader_file: graders/task2_grader.py
|
| 43 |
-
grader_legacy_path: graders/
|
| 44 |
graders:
|
| 45 |
- type: python
|
| 46 |
name: default
|
|
@@ -57,7 +57,7 @@ tasks:
|
|
| 57 |
grader_command: python graders/task3_grader.py
|
| 58 |
grader_path: graders/task3_grader.py
|
| 59 |
grader_file: graders/task3_grader.py
|
| 60 |
-
grader_legacy_path: graders/
|
| 61 |
graders:
|
| 62 |
- type: python
|
| 63 |
name: default
|
|
|
|
| 23 |
grader_command: python graders/task1_grader.py
|
| 24 |
grader_path: graders/task1_grader.py
|
| 25 |
grader_file: graders/task1_grader.py
|
| 26 |
+
grader_legacy_path: graders/task1.py
|
| 27 |
graders:
|
| 28 |
- type: python
|
| 29 |
name: default
|
|
|
|
| 40 |
grader_command: python graders/task2_grader.py
|
| 41 |
grader_path: graders/task2_grader.py
|
| 42 |
grader_file: graders/task2_grader.py
|
| 43 |
+
grader_legacy_path: graders/task2.py
|
| 44 |
graders:
|
| 45 |
- type: python
|
| 46 |
name: default
|
|
|
|
| 57 |
grader_command: python graders/task3_grader.py
|
| 58 |
grader_path: graders/task3_grader.py
|
| 59 |
grader_file: graders/task3_grader.py
|
| 60 |
+
grader_legacy_path: graders/task3.py
|
| 61 |
graders:
|
| 62 |
- type: python
|
| 63 |
name: default
|
triage_env/agents/rl_agents.py
CHANGED
|
@@ -34,6 +34,13 @@ class RLAgent(BaseAgent):
|
|
| 34 |
def _state_key(self, observation: TriageObservation):
|
| 35 |
return encode_observation(observation)
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
def _valid_actions(self, observation: TriageObservation):
|
| 38 |
alive = [p for p in observation.patients if p.alive]
|
| 39 |
actions = [("wait", -1)]
|
|
@@ -143,8 +150,8 @@ class RLAgent(BaseAgent):
|
|
| 143 |
|
| 144 |
self.q_table = {}
|
| 145 |
for state_str, actions in data["q_table"].items():
|
| 146 |
-
state =
|
| 147 |
self.q_table[state] = {}
|
| 148 |
for action_str, value in actions.items():
|
| 149 |
-
action =
|
| 150 |
self.q_table[state][action] = float(value)
|
|
|
|
| 34 |
def _state_key(self, observation: TriageObservation):
|
| 35 |
return encode_observation(observation)
|
| 36 |
|
| 37 |
+
def _freeze_json_value(self, value):
|
| 38 |
+
if isinstance(value, list):
|
| 39 |
+
return tuple(self._freeze_json_value(item) for item in value)
|
| 40 |
+
if isinstance(value, dict):
|
| 41 |
+
return tuple(sorted((k, self._freeze_json_value(v)) for k, v in value.items()))
|
| 42 |
+
return value
|
| 43 |
+
|
| 44 |
def _valid_actions(self, observation: TriageObservation):
|
| 45 |
alive = [p for p in observation.patients if p.alive]
|
| 46 |
actions = [("wait", -1)]
|
|
|
|
| 150 |
|
| 151 |
self.q_table = {}
|
| 152 |
for state_str, actions in data["q_table"].items():
|
| 153 |
+
state = self._freeze_json_value(json.loads(state_str))
|
| 154 |
self.q_table[state] = {}
|
| 155 |
for action_str, value in actions.items():
|
| 156 |
+
action = self._freeze_json_value(json.loads(action_str))
|
| 157 |
self.q_table[state][action] = float(value)
|
triage_env/openenv.yaml
CHANGED
|
@@ -23,7 +23,7 @@ tasks:
|
|
| 23 |
grader_command: python graders/task1_grader.py
|
| 24 |
grader_path: graders/task1_grader.py
|
| 25 |
grader_file: graders/task1_grader.py
|
| 26 |
-
grader_legacy_path: graders/
|
| 27 |
graders:
|
| 28 |
- type: python
|
| 29 |
name: default
|
|
@@ -40,7 +40,7 @@ tasks:
|
|
| 40 |
grader_command: python graders/task2_grader.py
|
| 41 |
grader_path: graders/task2_grader.py
|
| 42 |
grader_file: graders/task2_grader.py
|
| 43 |
-
grader_legacy_path: graders/
|
| 44 |
graders:
|
| 45 |
- type: python
|
| 46 |
name: default
|
|
@@ -57,7 +57,7 @@ tasks:
|
|
| 57 |
grader_command: python graders/task3_grader.py
|
| 58 |
grader_path: graders/task3_grader.py
|
| 59 |
grader_file: graders/task3_grader.py
|
| 60 |
-
grader_legacy_path: graders/
|
| 61 |
graders:
|
| 62 |
- type: python
|
| 63 |
name: default
|
|
|
|
| 23 |
grader_command: python graders/task1_grader.py
|
| 24 |
grader_path: graders/task1_grader.py
|
| 25 |
grader_file: graders/task1_grader.py
|
| 26 |
+
grader_legacy_path: graders/task1.py
|
| 27 |
graders:
|
| 28 |
- type: python
|
| 29 |
name: default
|
|
|
|
| 40 |
grader_command: python graders/task2_grader.py
|
| 41 |
grader_path: graders/task2_grader.py
|
| 42 |
grader_file: graders/task2_grader.py
|
| 43 |
+
grader_legacy_path: graders/task2.py
|
| 44 |
graders:
|
| 45 |
- type: python
|
| 46 |
name: default
|
|
|
|
| 57 |
grader_command: python graders/task3_grader.py
|
| 58 |
grader_path: graders/task3_grader.py
|
| 59 |
grader_file: graders/task3_grader.py
|
| 60 |
+
grader_legacy_path: graders/task3.py
|
| 61 |
graders:
|
| 62 |
- type: python
|
| 63 |
name: default
|