@@ -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