public static RecommenderResult RecommendUser(
            this IMatrixFactorizationRecommender recommender,
            UserFeatures user)
        {
            if (recommender == null)
            {
                throw new ArgumentNullException(nameof(recommender));
            }

            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            return(recommender.RecommendUser(user, RecommenderResultBuilderFactory.Instance));
        }
        public UserFeatures?GetUserFeatures(string userId)
        {
            if (userId == null)
            {
                throw new ArgumentNullException(nameof(userId));
            }

            if (!this.userMap.ContainsKey(userId))
            {
                return(null);
            }

            var xu   = this.userFactors.Row(this.userMap[userId]);
            var user = new UserFeatures(xu);

            return(user);
        }
        public TResult RecommendUser <TResult>(string userId, IResultBuilderFactory <TResult> resultBuilderFactory)
        {
            if (userId == null)
            {
                throw new ArgumentNullException(nameof(userId));
            }

            if (!this.userMap.ContainsKey(userId))
            {
                return(resultBuilderFactory.CreateEmpty());
            }

            var xu   = this.userFactors.Row(this.userMap[userId]);
            var user = new UserFeatures(xu);

            return(this.RecommendUser(user, resultBuilderFactory));
        }
        public TResult RecommendUser <TResult>(UserFeatures user, IResultBuilderFactory <TResult> resultBuilderFactory)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            var xu = user.Vector;
            var yi = Vector <double> .Build.Dense(this.factors);

            var resultBuilder = resultBuilderFactory.CreateBuilder(maximumCapacity: this.itemMap.Count);

            foreach (var item in this.itemMap)
            {
                this.itemFactors.Row(item.Value, yi);

                resultBuilder.Append(item.Key, xu.DotProduct(yi));
            }

            return(resultBuilder.ToResult());
        }
        public static RecommenderResult RankUsers(
            this IMatrixFactorizationRecommender recommender,
            UserFeatures user,
            List <KeyValuePair <string, UserFeatures> > users)
        {
            if (recommender == null)
            {
                throw new ArgumentNullException(nameof(recommender));
            }

            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            if (users == null)
            {
                throw new ArgumentNullException(nameof(users));
            }

            return(recommender.RankUsers(user, users, RecommenderResultBuilderFactory.Instance));
        }
        public TResult RankUsers <TResult>(string userId, List <KeyValuePair <string, UserFeatures> > users, IResultBuilderFactory <TResult> resultBuilderFactory)
        {
            if (userId == null)
            {
                throw new ArgumentNullException(nameof(userId));
            }

            if (users == null)
            {
                throw new ArgumentNullException(nameof(users));
            }

            if (!this.userMap.ContainsKey(userId))
            {
                return(resultBuilderFactory.CreateEmpty());
            }

            var xu   = this.userFactors.Row(this.userMap[userId]);
            var user = new UserFeatures(xu);

            return(this.RankUsers(user, users, resultBuilderFactory));
        }