Skip to content

Commit

Permalink
Merge pull request #18 from jxx123/random_init_bg
Browse files Browse the repository at this point in the history
Randomize init BG for the gym env
  • Loading branch information
jxx123 authored Dec 29, 2020
2 parents 129399c + 9ac9bea commit bdd7e1a
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
13 changes: 7 additions & 6 deletions simglucose/envs/simglucose_gym_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def __init__(self, patient_name=None, reward_fun=None, seed=None):
self.patient_name = patient_name
self.reward_fun = reward_fun
self.np_random, _ = seeding.np_random(seed=seed)
self.env, _, _ = self._create_env_from_random_state()
self.env, _, _, _ = self._create_env_from_random_state()

def _step(self, action):
# This gym only controls basal insulin
Expand All @@ -46,30 +46,31 @@ def _step(self, action):
return self.env.step(act, reward_fun=self.reward_fun)

def _reset(self):
self.env, _, _ = self._create_env_from_random_state()
self.env, _, _, _ = self._create_env_from_random_state()
obs, _, _, _ = self.env.reset()
return obs

def _seed(self, seed=None):
self.np_random, seed1 = seeding.np_random(seed=seed)
self.env, seed2, seed3 = self._create_env_from_random_state()
return [seed1, seed2, seed3]
self.env, seed2, seed3, seed4 = self._create_env_from_random_state()
return [seed1, seed2, seed3, seed4]

def _create_env_from_random_state(self):
# Derive a random seed. This gets passed as a uint, but gets
# checked as an int elsewhere, so we need to keep it below
# 2**31.
seed2 = seeding.hash_seed(self.np_random.randint(0, 1000)) % 2**31
seed3 = seeding.hash_seed(seed2 + 1) % 2**31
seed4 = seeding.hash_seed(seed3 + 1) % 2**31

hour = self.np_random.randint(low=0.0, high=24.0)
start_time = datetime(2018, 1, 1, hour, 0, 0)
patient = T1DPatient.withName(self.patient_name)
patient = T1DPatient.withName(self.patient_name, random_init_bg=True, seed=seed4)
sensor = CGMSensor.withName(self.SENSOR_HARDWARE, seed=seed2)
scenario = RandomScenario(start_time=start_time, seed=seed3)
pump = InsulinPump.withName(self.INSULIN_PUMP_HARDWARE)
env = _T1DSimEnv(patient, sensor, pump, scenario)
return env, seed2, seed3
return env, seed2, seed3, seed4

def _render(self, mode='human', close=False):
self.env.render(close=close)
Expand Down
36 changes: 32 additions & 4 deletions simglucose/patient/t1dpatient.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class T1DPatient(Patient):
SAMPLE_TIME = 1 # min
EAT_RATE = 5 # g/min CHO

def __init__(self, params, init_state=None, t0=0):
def __init__(self, params, init_state=None, random_init_bg=False, seed=None, t0=0):
'''
T1DPatient constructor.
Inputs:
Expand All @@ -30,9 +30,9 @@ def __init__(self, params, init_state=None, t0=0):
- t0: simulation start time, it is 0 by default
'''
self._params = params
if init_state is None:
init_state = self._params.iloc[2:15]
self.init_state = init_state
self._init_state = init_state
self.random_init_bg = random_init_bg
self._seed = seed
self.t0 = t0
self.reset()

Expand Down Expand Up @@ -229,10 +229,38 @@ def _announce_meal(self, meal):
to_eat = 0
return to_eat

@property
def seed(self):
return self._seed

@seed.setter
def seed(self, seed):
self._seed = seed
self.reset()

def reset(self):
'''
Reset the patient state to default intial state
'''
if self._init_state is None:
self.init_state = self._params.iloc[2:15]
else:
self.init_state = self._init_state

self.random_state = np.random.RandomState(self.seed)
if self.random_init_bg:
# Only randomize glucose related states, x4, x5, and x13
mean = [1.0 * self.init_state[3],
1.0 * self.init_state[4],
1.0 * self.init_state[12]]
cov = np.diag([0.1 * self.init_state[3],
0.1 * self.init_state[4],
0.1 * self.init_state[12]])
bg_init = self.random_state.multivariate_normal(mean, cov)
self.init_state[3] = 1.0 * bg_init[0]
self.init_state[4] = 1.0 * bg_init[1]
self.init_state[12] = 1.0 * bg_init[2]

self._last_Qsto = self.init_state[0] + self.init_state[1]
self._last_foodtaken = 0
self.name = self._params.Name
Expand Down

0 comments on commit bdd7e1a

Please sign in to comment.