Last active
June 5, 2019 20:38
-
-
Save johannah/40f994f03eea53f155a0537df4d4d293 to your computer and use it in GitHub Desktop.
ai4good pain model example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
import os | |
import sys | |
# hours_per_time_step should be greater than 1 | |
hours_per_step = 2 | |
class PainModel(): | |
def __init__(self, seed): | |
# pain -1 is bad | |
# pain 1 is good | |
self.pain = 0 | |
# initial start point for date - | |
# TODO - make this random according to what weather data that you have | |
self.datetime = 0 | |
# use random state so that it is repeatable | |
self.random_state = np.random.RandomState(seed) | |
self.precipitation_options = ['rain', 'sunny', 'snow', 'fog'] | |
self.activity_options = ['sleep', 'exercise', 'work', 'stressful', 'leisure'] | |
self.last_activities = [] | |
def step(activity): | |
# activity is string matching one of 'activity_options' | |
assert activity in self.activity_options | |
recent_activities = self.activity_options[:max(self.hist_len, 24/hours_per_step)] | |
hist_len = len(self.last_activities) | |
if activity == 'sleep': | |
self.pain-=.01 | |
if activity == 'exercise': | |
self.pain-=.1 | |
# if you exercise too often, you may get hurt | |
if 'exercise' in recent_activities: | |
self.pain+=0.5 | |
if activity == 'work': | |
self.pain+=.01 | |
if activity == 'stressful': | |
self.pain+=0.5 | |
if activity == 'leisure': | |
self.pain-=.01 | |
sleep_instances = [x if x=='sleep' for x in recent_activities] | |
# reward getting 8 hours of sleep per night | |
if 7/float(hours_per_step) < len(sleep_instances) < 12/float(hours_per_step): | |
self.pain+=0.1 | |
# determine what the state was when this was experienced | |
self.pain = np.clip(self.pain, -1, 1) | |
self.state = [self.pain, self.datetime, self.get_precipitation()] | |
# todo - turn datetime into day of week, workdayornot | |
# state = [self.datetim, self.get_precipitation(), self.get_temperature(), day_of_week, day_of_year, workday_or_holiday] | |
# update datetime to prepare for next step | |
self.datetime += hours_per_step | |
self.last_activities.append(activity) | |
# prevent pain from going outside bounds | |
return self.state | |
def get_day_of_week(self): | |
# todo - find according to datetime in python | |
return 0 | |
def get_precipitation(self): | |
# todo - find according to datetime | |
return self.random_state.randint(0,len(self.precipitation_options)) | |
def generate_perfect_person(): | |
pain_model = PainModel(seed=103) | |
stressful_random_state = np.random.RandomState(3949) | |
sleep_random_state = np.random.RandomState(949) | |
states = [] | |
for workday in [0, 1, 1, 1, 1, 1, 0]: | |
if workday: | |
# is time step is 2 and day restarts at midnight | |
# 0-2 | |
if sleep_random_state.rand() < 0.95: | |
states.append(pain_model('sleep')) | |
else: | |
states.append(pain_model('leisure')) | |
# 2-4 | |
if sleep_random_state.rand() < 0.98: | |
states.append(pain_model('sleep')) | |
else: | |
states.append(pain_model('stressful')) | |
# 4-6 | |
if sleep_random_state.rand() < 0.98: | |
states.append(pain_model('sleep')) | |
else: | |
states.append(pain_model('stressful')) | |
# 6-8 | |
if sleep_random_state.rand() < 0.85: | |
states.append(pain_model('sleep')) | |
else: | |
states.append(pain_model('exercise')) | |
# 8-4 | |
for i in range(4): | |
if stressful_random_state.rand()<0.95: | |
states.append(pain_model('work')) | |
else: | |
states.append(pain_model('stressful')) | |
# 4-12 | |
for i in range(4): | |
afw = stressful_random_state.rand() | |
if afw < 0.1: | |
states.append(pain_model('stressful')) | |
if afw < 0.2: | |
states.append(pain_model('exercise')) | |
elif < 0.95: | |
states.append(pain_model('leisure')) | |
else: | |
states.append(pain_model('sleep')) | |
else: | |
# yay it is the weekend | |
# is time step is 2 and day restarts at midnight | |
for i in range(4): | |
# sleep in on the weekend | |
states.append(pain_model('sleep')) | |
for i in range(7): | |
states.append(pain_model('leisure')) | |
states.append(pain_model('sleep')) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment