public override double CalculateError(IRecommendation recommendation, IEnumerable <IRating> ratings, IEnumerable <IRater> raters, IEnumerable <ISubject> subjects)
        {
            var sum   = 0D;
            var count = 0;

            foreach (var rating in ratings)
            {
                var value = recommendation.RecommendSubject(rating.Rater, rating.Subject);

                if (value == null)
                {
                    continue;
                }

                var diff = value.Value - rating.Value;
                sum += Math.Abs(diff);
                ++count;
            }
            ;

            if (count == 0)
            {
                return(-1);
            }

            var error = sum / count;

            return(error);
        }
        public IRating RecommendSubject(IRater rater, ISubject subject)
        {
            var key         = CreateCacheKey(rater, subject);
            var cachedValue = 0D;

            if (_cache.TryGetValue(key, out cachedValue))
            {
                return(new SimpleRating(rater, subject, cachedValue));
            }

            var rating = _algorithm.RecommendSubject(rater, subject);

            if (rating != null)
            {
                _cache[key] = rating.Value;
            }

            return(rating);
        }