private float doEstimatePreference(long userID, long itemID) {
   buildAveragesLock.readLock().lock();
   try {
     RunningAverage itemAverage = itemAverages.get(itemID);
     if (itemAverage == null) {
       return Float.NaN;
     }
     RunningAverage userAverage = userAverages.get(userID);
     if (userAverage == null) {
       return Float.NaN;
     }
     double userDiff = userAverage.getAverage() - overallAveragePrefValue.getAverage();
     return (float) (itemAverage.getAverage() + userDiff);
   } finally {
     buildAveragesLock.readLock().unlock();
   }
 }
  @Test
  public void testEvaluate() throws Exception {
    DataModel model = getDataModel();
    Recommender recommender1 = new SlopeOneRecommender(model);
    Recommender recommender2 = new ItemAverageRecommender(model);
    RecommenderEvaluator evaluator = new PreferenceBasedRecommenderEvaluator();

    RunningAverage tracker = new FullRunningAverage();
    evaluator.evaluate(recommender1, recommender2, 100, tracker, Formula.MEANRANK);
    double eval = tracker.getAverage();
    assertEquals(0.185294508934021, eval, EPSILON);
  }