Skip to content

Instantly share code, notes, and snippets.

@johannah
Last active June 5, 2019 20:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save johannah/40f994f03eea53f155a0537df4d4d293 to your computer and use it in GitHub Desktop.
Save johannah/40f994f03eea53f155a0537df4d4d293 to your computer and use it in GitHub Desktop.
ai4good pain model example
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