From 25087232dd84fe7a26bfbdc91c0656c1e3935cc4 Mon Sep 17 00:00:00 2001 From: Thomas Hille Date: Wed, 15 Feb 2017 15:55:17 +0100 Subject: [PATCH] added relative knowledge loss function --- app/models/concerns/user.rb | 1 + app/models/proxy_exercise.rb | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/app/models/concerns/user.rb b/app/models/concerns/user.rb index 330ccacd..28601cdf 100644 --- a/app/models/concerns/user.rb +++ b/app/models/concerns/user.rb @@ -11,6 +11,7 @@ module User has_many :user_proxy_exercise_exercises, as: :user has_many :user_exercise_interventions, as: :user has_many :interventions, through: :user_exercise_interventions + accepts_nested_attributes_for :user_proxy_exercise_exercises scope :with_submissions, -> { where('id IN (SELECT user_id FROM submissions)') } diff --git a/app/models/proxy_exercise.rb b/app/models/proxy_exercise.rb index 1f6d47c1..2bf3658b 100644 --- a/app/models/proxy_exercise.rb +++ b/app/models/proxy_exercise.rb @@ -24,4 +24,47 @@ class ProxyExercise < ActiveRecord::Base title end + def selectMatchingExercise(user) + assigned_user_proxy_exercise = user_proxy_exercise_exercises.where(user: user).first + recommendedExercise = + if (assigned_user_proxy_exercise) + Rails.logger.info("retrieved assigned exercise for user #{user.id}: Exercise #{assigned_user_proxy_exercise.exercise}" ) + assigned_user_proxy_exercise.exercise + else + Rails.logger.info("find new matching exercise for user #{user.id}" ) + matchingExercise = findMatchingExercise(user) + user.user_proxy_exercise_exercises << UserProxyExerciseExercise.create(user: user, exercise: matchingExercise, proxy_exercise: self) + matchingExercise + end + recommendedExercise + end + + def findMatchingExercise(user) + exercises.shuffle.first + end + + def score(user, ex) + 1 + end + + def getRelativeKnowledgeLoss(user, execises) + # initialize knowledge for each tag with 0 + topic_knowledge_loss_user = Tag.all.map{|t| [t, 0]}.to_h + topic_knowledge_max = Tag.all.map{|t| [t, 0]}.to_h + execises.each do |ex| + score = score(user, ex) + ex.tags.each do |t| + tag_ratio = ex.exercise_tags.where(tag: t).factor / ex.exercise_tags.inject(0){|sum, et| sum += et.factor } + topic_knowledge = ex.expected_difficulty * tag_ratio + topic_knowledge_loss_user[t] += (1-score) * topic_knowledge + topic_knowledge_max[t] += topic_knowledge + end + end + relative_loss = {} + topic_knowledge_max.keys.each do |t| + relative_loss[t] = topic_knowledge_loss_user[t] / topic_knowledge_max[t] + end + relative_loss + end + end \ No newline at end of file