public function postPreference()
 {
     $preference = Input::get('preference');
     $user = Auth::user();
     foreach ($preference as $id => $score) {
         $userpreference = $user->visualizations()->where('id', $id)->first();
         if ($userpreference === null) {
             $visualization = \App\Visualization::find($id);
             $user->visualizations()->attach($visualization, ['knowledge' => $score]);
         } else {
             $userpreference->pivot->knowledge = $score;
             $userpreference->pivot->save();
             $userpreference->save();
         }
     }
     return redirect('home');
 }
 public function postRating()
 {
     // save rating
     $user = Auth::user();
     $visualization = \App\Visualization::where('name', Session::get('visdata')->visualization)->first();
     $relation = $user->visualizations()->where('visualization_id', $visualization->id)->first();
     if (Input::get('isPositive')) {
         // check if already has rating
         $relation->pivot->rating = 1;
         $relation->pivot->save();
         $relation->save();
     } else {
         $relation->pivot->rating = 0;
         $relation->pivot->save();
         $relation->save();
     }
 }
 public function generateUserRating($visualizationid, $neighbors, $minVisRating)
 {
     $visualizationVectors = $this->generateVectors();
     $vectors = [];
     $vector = $visualizationVectors[$visualizationid - 1];
     for ($i = 1; $i <= count($visualizationVectors); $i++) {
         if (count(Visualization::all()[$i - 1]->users) >= $minVisRating) {
             $similaritem = (object) [];
             if ($i == $visualizationid) {
             } else {
                 $similaritem->similarity = $this->vectorSimilarity($vector, $visualizationVectors[$i]);
                 $similaritem->visualization = $i;
                 $vectors[] = $similaritem;
             }
         } else {
             // skip if the visualization does not have enough rating by the users
         }
     }
     // sort mapping
     usort($vectors, array("App\\Http\\Controllers\\RatingController", "compareSimilarity"));
     $similaritems = [];
     for ($i = 0; $i < $neighbors && $i < count($vectors); $i++) {
         $similaritems[] = $vectors[$i];
     }
     if (count($similaritems) === 0) {
         return null;
     } else {
         return $this->generatePrediction($similaritems, $visualizationVectors);
     }
 }