Skip to content

Commit db479cd

Browse files
authored
Merge pull request #7 from Intelligent-Adaptive-Interventions-Lab/initcontext
add context init imputer api
2 parents a131035 + c203992 commit db479cd

3 files changed

Lines changed: 100 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 2.2.6 on 2022-04-25 19:40
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('engine', '0024_auto_20191011_1713'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='variable',
15+
name='max_value',
16+
field=models.FloatField(default=1.0),
17+
),
18+
migrations.AddField(
19+
model_name='variable',
20+
name='min_value',
21+
field=models.FloatField(default=0.0),
22+
),
23+
migrations.AddField(
24+
model_name='variable',
25+
name='sample_thres',
26+
field=models.PositiveIntegerField(default=15),
27+
),
28+
migrations.AddField(
29+
model_name='variable',
30+
name='value_type',
31+
field=models.CharField(choices=[('BIN', 'binary'), ('ORD', 'ordinary'), ('CONT', 'continuous')], default='BIN', max_length=100),
32+
),
33+
]

mooclet_engine/engine/models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,21 @@ class Learner(models.Model):
8181

8282

8383
class Variable(models.Model):
84+
BINARY = 'BIN'
85+
ORDINARY = 'ORD'
86+
CONTINUOUS = 'CONT'
87+
VARIABLE_TYPE = (
88+
(BINARY, 'binary'),
89+
(ORDINARY, 'ordinary'),
90+
(CONTINUOUS, 'continuous')
91+
)
8492
name = models.CharField(max_length=100, unique=True)
8593
environment = models.ForeignKey(Environment,blank=True,null=True, default=None, on_delete=models.SET_NULL)
8694
variable_id = models.PositiveIntegerField(blank=True,null=True)
95+
min_value = models.FloatField(default=0.0)
96+
max_value = models.FloatField(default=1.0)
97+
value_type = models.CharField(max_length=100, choices=VARIABLE_TYPE, default=BINARY)
98+
sample_thres = models.PositiveIntegerField(default=15)
8799

88100
def __str__(self):
89101
return self.name

mooclet_engine/engine/views.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,3 +211,58 @@ def get(self, request):
211211
imputer['imputer'] = np.random.choice([0, 1], 1, p=[1-binary_t_prop, binary_t_prop])
212212

213213
return Response(imputer)
214+
215+
216+
class getContextualImputer(APIView):
217+
def get(self, request):
218+
req = json.loads(request.body)
219+
has_learner = request.args.get("learner")
220+
has_mooclet = request.args.get("mooclet")
221+
has_policy = request.args.get("policy")
222+
has_contexts = request.args.get("contexts")
223+
224+
if has_learner is None or has_mooclet is None or has_policy is None:
225+
return Response({"error": "invalid"}, status=500)
226+
227+
mooclet = Mooclet.objects.get(pk=req["mooclet"])
228+
learner = Learner.objects.get(name=req["learner"])
229+
policy = Policy.objects.get(pk=req["policy"])
230+
231+
if has_contexts is None:
232+
contextual_vars = req["contexts"]
233+
else:
234+
mooclet_params = PolicyParameters.objects.get(mooclet=mooclet, policy=policy)
235+
parameters = mooclet_params.parameters
236+
contextual_vars = list(filter(lambda context: context != "version", parameters["contextual_variables"]))
237+
238+
imputer = {}
239+
for context_var in contextual_vars:
240+
variable = Variable.objects.filter(name=context_var)
241+
val_type = variable.value_type
242+
val_min = variable.min_value
243+
val_max = variable.max_value
244+
sample_thres = variable.sample_thres
245+
values = Value.objects.filter(variable__name=context_var, mooclet=mooclet)
246+
num_values = values.count()
247+
248+
if num_values == 0 or num_values < sample_thres:
249+
if val_type != "continuous":
250+
sample = np.random.choice(np.arange(val_min, val_max + 1))
251+
else:
252+
sample = np.random.uniform(val_min, val_max)
253+
sample = (sample - val_min) / (val_max - val_min)
254+
else:
255+
val_lst = list(values.value_list("value"))
256+
sample = np.random.choice(val_lst)
257+
258+
Value.objects.create(
259+
variable=variable,
260+
value=sample,
261+
text="Init Context",
262+
learner=learner,
263+
mooclet=mooclet
264+
)
265+
266+
imputer["imputer"] = sample
267+
268+
return Response(imputer)

0 commit comments

Comments
 (0)