Mahakii commited on
Commit
802da30
·
1 Parent(s): 2101a85

Finalize strict grader discovery and stabilize RL checkpoint loading

Browse files
.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) CI Readiness Workflow
59
- A baseline CI workflow exists at:
60
- - `.github/workflows/deploy-readiness.yml`
61
-
62
- It runs tests and Docker build on push/PR.
 
 
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/task1_grader.py
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/task2_grader.py
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/task3_grader.py
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 = tuple(json.loads(state_str))
147
  self.q_table[state] = {}
148
  for action_str, value in actions.items():
149
- action = tuple(json.loads(action_str))
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/task1_grader.py
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/task2_grader.py
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/task3_grader.py
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