def test_custom_reward(self): from gym.envs.registration import register register(id='simglucose-adolescent3-v0', entry_point='simglucose.envs:T1DSimEnv', kwargs={ 'patient_name': 'adolescent#003', 'reward_fun': custom_reward }) env = gym.make('simglucose-adolescent3-v0') ctrller = BBController() reward = 1 done = False info = {'sample_time': 3, 'patient_name': 'adolescent#002', 'meal': 0} observation = env.reset() for t in range(200): env.render(mode='human') print(observation) # action = env.action_space.sample() ctrl_action = ctrller.policy(observation, reward, done, **info) action = ctrl_action.basal + ctrl_action.bolus observation, reward, done, info = env.step(action) print("Reward = {}".format(reward)) if observation.CGM > 180: self.assertEqual(reward, -1) elif observation.CGM < 70: self.assertEqual(reward, -2) else: self.assertEqual(reward, 1) if done: print("Episode finished after {} timesteps".format(t + 1)) break
def test_batch_sim(self): # specify start_time as the beginning of today now = datetime.now() start_time = datetime.combine(now.date(), datetime.min.time()) # --------- Create Random Scenario -------------- # Create a simulation environment patient = T1DPatient.withName('adolescent#001') sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') scenario = RandomScenario(start_time=start_time, seed=1) env = T1DSimEnv(patient, sensor, pump, scenario) # Create a controller controller = BBController() # Put them together to create a simulation object s1 = SimObj(env, controller, timedelta( days=2), animate=True, path=save_folder) results1 = sim(s1) # --------- Create Custom Scenario -------------- # Create a simulation environment patient = T1DPatient.withName('adolescent#001') sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') # custom scenario is a list of tuples (time, meal_size) scen = [(7, 45), (12, 70), (16, 15), (18, 80), (23, 10)] scenario = CustomScenario(start_time=start_time, scenario=scen) env = T1DSimEnv(patient, sensor, pump, scenario) # Create a controller controller = BBController() # Put them together to create a simulation object s2 = SimObj(env, controller, timedelta( days=2), animate=False, path=save_folder) results2 = sim(s2) # --------- batch simulation -------------- s1.reset() s2.reset() s1.animate = False s = [s1, s2] results_para = batch_sim(s, parallel=True) s1.reset() s2.reset() s = [s1, s2] results_serial = batch_sim(s, parallel=False) assert_frame_equal(results_para[0], results1) assert_frame_equal(results_para[1], results2) for r1, r2 in zip(results_para, results_serial): assert_frame_equal(r1, r2)
def test_results_consistency(self): # Test data results_exp = pd.read_csv(TESTDATA_FILENAME, index_col=0) results_exp.index = pd.to_datetime(results_exp.index) # specify start_time as the beginning of today start_time = datetime(2018, 1, 1, 0, 0, 0) # --------- Create Random Scenario -------------- # Create a simulation environment patient = T1DPatient.withName('adolescent#001') sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') scenario = RandomScenario(start_time=start_time, seed=1) env = T1DSimEnv(patient, sensor, pump, scenario) # Create a controller controller = BBController() # Put them together to create a simulation object s = SimObj(env, controller, timedelta(days=2), animate=False, path=save_folder) results = sim(s) assert_frame_equal(results, results_exp)
def test_gym_random_agent(self): from gym.envs.registration import register register(id='simglucose-adolescent2-v0', entry_point='simglucose.envs:T1DSimEnv', kwargs={'patient_name': 'adolescent#002'}) env = gym.make('simglucose-adolescent2-v0') ctrller = BBController() reward = 0 done = False info = {'sample_time': 5, 'patient_name': 'adolescent#002', 'meal': 0} observation = env.reset() for t in range(150): env.render(mode='human') print(observation) # action = env.action_space.sample() ctrl_action = ctrller.policy(observation, reward, done, **info) action = ctrl_action.basal + ctrl_action.bolus observation, reward, done, info = env.step(action) if done: print("Episode finished after {} timesteps".format(t + 1)) break
def pick_controller(): while True: print('Select controller:') print('[1] Basal-Bolus Controller') input_value = input('>>>') try: selection = int(input_value) except ValueError: print('Please input an integer!') continue if selection < 1 or selection > 1: print('Please input a number from the list!') else: break if selection == 1: controller = BBController() return controller
def bbsim(): for patient in patients: patient = T1DPatient.withName(patient) sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') for seed in range(10, 20): scenario = RandomScenario(start_time=start_time, seed=randint(10, 99999)) env = T1DSimEnv(patient, sensor, pump, scenario) # Create a controller controller = BBController() # Put them together to create a simulation object s1 = SimObj(env, controller, timedelta(days=10), animate=False, path=path + str(seed)) results1 = sim(s1) print('Complete:', patient.name, '-', seed) print('All done!')
now = datetime.now() start_time = datetime.combine(now.date(), datetime.min.time()) # --------- Create Random Scenario -------------- # Specify results saving path path = './results' # Create a simulation environment patient = T1DPatient.withName('adolescent#001') sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') scenario = RandomScenario(start_time=start_time, seed=1) env = T1DSimEnv(patient, sensor, pump, scenario) # Create a controller controller = BBController() # Put them together to create a simulation object s1 = SimObj(env, controller, timedelta(days=1), animate=False, path=path) results1 = sim(s1) print(results1) # --------- Create Custom Scenario -------------- # Create a simulation environment patient = T1DPatient.withName('adolescent#001') sensor = CGMSensor.withName('Dexcom', seed=1) pump = InsulinPump.withName('Insulet') # custom scenario is a list of tuples (time, meal_size) scen = [(7, 45), (12, 70), (16, 15), (18, 80), (23, 10)] scenario = CustomScenario(start_time=start_time, scenario=scen) env = T1DSimEnv(patient, sensor, pump, scenario)
def run(es=None,policy=None,patient_id=1,Initial_Bg=0): # es=self.es[0] print(es) env = gym.make('simglucose-adult{}-CHO{}-v0'.format(Initial_Bg,patient_id+1)) ctrller = BBController() # ctrller = PIDController(P=0.001, I=0.00001, D=0.001) # ctrller = PIDController(P=PID_parameters[patient_id][0], I=PID_parameters[patient_id][1], D=PID_parameters[patient_id][2]) reward = 0 done = False info = {'sample_time': 5, 'patient_name': 'adult#001', 'meal': 0} observation = env.reset() pre_glucose = 0 pre_rate = 0 ##########################mitigation################## Monitor = 2#2 #0:CAWT; 1:MPC 2:DT Mitigation_Enable = True threshold_col = threshold_col_list[patient_id]+'_CV0' if Mitigation_Enable: #====read threshold files############ thresholds=pd.read_csv("/home/uva-dsa/Research/Medical/test/openaps_monitor/Reseult/scripts-12rules_uvasimulator/thresholds.csv") threshold=thresholds[threshold_col] mitigate_H1_flag = False mitigate_H2_flag = False if Monitor == 2: import numpy as np from sklearn.externals import joblib model_name = '/home/uva-dsa/Research/Medical/test/openaps_monitor/Reseult/script_jupyternotebook/saved_model_Uva/DT/DT3_NoFIlabel_model_{}.sav'.format(threshold_col) print("Load model {} now!".format(model_name)) clf = joblib.load(model_name) delBg = 0 delIob = 0 delInsulinRate = 0 pre_insulinRate = 0 pre_iob =0 pre_bg =0 ###################################################### for t1 in range(150): t = t1 -30 #wait 30*5=150 minutes # env.render(mode='human') glucose = observation.CGM # print(observation) glucose_refresh = True rate_refresh = True # update the glucose reading and rate output command #Fault injection Hook################ #glucose:HOOK# #hold the glucose value when fresh signal is false if glucose_refresh != True: glucose = pre_glucose #update observation if observation.CGM != glucose: observation=Observation(CGM=glucose) print(observation) #get the action beased on policy and observation # (1) random action # action = env.action_space.sample() # (2) PID or BB control action ctrl_action = ctrller.policy(observation, reward, done, **info) action = ctrl_action.basal + ctrl_action.bolus # # (3) RL or DDPG action # action,_ = policy.get_action(observation)# action = es.get_action(t, observation, policy) #algo.policy.get_action(observation) # print(action) # print(es.get_action(t, observation, policy)) #Fault injection Hook################ #rate:HOOK# #hold the action value when fresh signal is false if rate_refresh != True: action = pre_rate #take the action observation, reward, done, info = env.step(action) #update previous glucose and rate value pre_glucose = glucose ############################################3# #==========mitigation code####++============== if Mitigation_Enable: bg=glucose insulinRate = action bgTarget = 140 iob =cal_single_iob(insulinRate) if t1 >1: delBg = bg-pre_bg #data["CGM_glucose"][i] - data["CGM_glucose"][i-1] delIob = iob - pre_iob #data["IOB"][i] - data["IOB"][i-1] delInsulinRate = insulinRate-pre_insulinRate #data["rate"][i] - data["rate"][i-1] if t1 >5: sub_alert_msg = "" if Monitor==0: #CAWT sub_alert_flag = False if bg > 180 and delBg > 5: #insufficient insulin if iob <threshold[6] and insulinRate<0.1 : sub_alert_flag = True sub_alert_msg = "row_7" # rule14->7 if bg > bgTarget+10: #+10? >150 #if delBg >= -3: # if bg>180 and iob < -0.120728641206 and insulinRate == 0: # row_37 # if bg>180 and if delBg > 0.3: # if bg>190: if delBg>2.5 and delIob <= 0 and iob <threshold[4]:#-0.3: #row_10 IOB is falling if delInsulinRate == 0 and insulinRate<0.1: #keep insulin sub_alert_flag = True sub_alert_msg = "row_5" # rule10 ->5 elif delIob < 0 and iob < 0:#threshold[0]:#0.145605040799: # row_1 if delInsulinRate < 0: #dec_insulin sub_alert_flag = True sub_alert_msg = "row_1" elif delIob == 0 and iob < threshold[1]: # row_2 if delInsulinRate < 0: #dec_insulin sub_alert_flag = True sub_alert_msg = "row_2" else: #BG<HBGT if bg < threshold[8]:#bgLowerTh: if insulinRate != 0 :#and iob>-0.5:#zero insulin sub_alert_flag = True sub_alert_msg = "row_9" elif bg < bgTarget+10: #110 if delBg < -0.3: if delIob >=0 and iob >threshold[5]:#0.3: # IOB is not falling if delInsulinRate == 0 and insulinRate>0.05 : sub_alert_flag = True sub_alert_msg = "row_6" # rule12->6 # checking if BG is falling more than the threshold #if delBg < thBgFall: # if bg<80: if delIob > 0 and iob > threshold[2]:#-0.199631233636: # row_7->3 if delInsulinRate > 0.05: sub_alert_flag = True sub_alert_msg = "row_3" elif delIob == 0 and iob > threshold[3]: # row_8->4 if delInsulinRate > 0.05: sub_alert_flag = True sub_alert_msg = "row_4" if sub_alert_flag: if sub_alert_msg in ["row_3","row_4","row_6","row_9","row_13"]:#H1hazard mitigate_H1_flag = True elif sub_alert_msg in ["row_1","row_2","row_5","row_7"]:#H2hazard mitigate_H2_flag = True #==========mitigation code####++============== elif Monitor ==1: #MPC if glucose <70 :#H1hazard # insulinRate = 0 # loaded_suggested_data["fault"] = "yes" # loaded_suggested_data["fault_reason"] = sub_alert_msg+"_Mitigation" # print("\n***************************************") # print("********** Unsafe Action !!!!! *************") sub_alert_msg = 'H1' mitigate_H1_flag = True elif glucose>180:#H2hazard # insulinRate = 2.1 # loaded_suggested_data["fault"] = "yes" # loaded_suggested_data["fault_reason"] = sub_alert_msg+"_Mitigation" # print("\n***************************************") # print("********** Unsafe Action !!!!! *************") sub_alert_msg = 'H2' mitigate_H2_flag = True elif Monitor == 2: #DT predict_proba=clf.predict_proba(np.array([glucose,iob,insulinRate]).reshape(1,-1)) if int(np.argmax(predict_proba,axis=1)): if glucose < bgTarget: sub_alert_msg = 'H1' mitigate_H1_flag = True else:#H2hazard sub_alert_msg = 'H2' mitigate_H2_flag = True #########start to mitigate######### if mitigate_H1_flag == True: if insulinRate < pre_insulinRate or glucose>bgTarget+10:#if fault is removed stop mitigation mitigate_H1_flag = False #reset hazard flag insulinRate = 0 print("\n***************************************") print(sub_alert_msg) print("********** Unsafe Action !!!!! *************") elif mitigate_H2_flag == True: if insulinRate > pre_insulinRate or glucose<bgTarget+40:#if fault is removed stop mitigation mitigate_H2_flag = False insulinRate = 0.1 #0.1 print("\n***************************************") print(sub_alert_msg) print("********** Unsafe Action !!!!! *************") pre_insulinRate = insulinRate pre_iob = iob pre_bg =bg #######################33End of mitigation###################################### pre_rate = action # if done: # print("Episode finished after {} timesteps".format(t + 1)) # break # print(env.show_history()) save_results('./simulation_data/',env.show_history(),Patient_list[patient_id]) env.close() # if __name__ == "__main__": # Run_simulation(argv[1],argv[2])