public async Task <bool> UpdateSimilarityScores(Guid userId) { var oldScores = await _context.SimilarityScores.Where(x => x.FromUserId == userId).ToListAsync(); var features = (await _featureApplication.GetFeatures()).Where(x => x.IsCalculated).ToList(); var columns = features.Count; var users = await GetUsersToCalculate(userId); int rows = users.Count; double[,] usersMatrix = new double[rows, columns]; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { var vm = users[i].FeatureViewModels .Where(x => x.FeatureId == features[j].Id) .FirstOrDefault(); if (vm == null) { usersMatrix[i, j] = -1; } else { if (!vm.IsCalculated) { usersMatrix[i, j] = 0; continue; } usersMatrix[i, j] = vm.Rate * vm.weight; } } } SimilarityMatrix m = new SimilarityMatrix { Row = rows, Column = columns, Matrix = usersMatrix }; List <double> kq = new List <double>(); kq = m.SimilarityCalculate(); users.RemoveAt(0); var similarityScores = new List <SimilarityScore>(); for (int i = 1; i < kq.Count; i++) { users[i - 1].Point = kq[i]; var score = new SimilarityScore() { FromUserId = userId, ToUserId = users[i - 1].UserId, Score = kq[i] }; similarityScores.Add(score); } try { _context.SimilarityScores.AddRange(similarityScores); _context.SimilarityScores.RemoveRange(oldScores); await _context.SaveChangesAsync(); return(true); } catch { return(false); } }
public async Task <bool> UpdateSimilarityScores(Guid userId) { var user = await GetById(userId); var oldScores = await _context.SimilarityScores.Where(x => x.FromUserId == userId).ToListAsync(); var tempUsers = new List <AppUser>(); var users = await GetActiveUsers(userId, true); users.Remove(users.Where(x => x.Id == userId).FirstOrDefault()); //var users = await _context.Users.Where(x => x.Status == EUserStatus.Active && x.IsInfoUpdated && x.Id != userId).ToListAsync(); // tempUsers = users .Where(x => x.Id != userId && x.Gender == user.FindPeople) .ToList(); users = new List <AppUser>(); var userAgeGroup = GetAgeGroup(user.Dob); int userAgeValue = Convert.ToInt32(userAgeGroup); foreach (var item in tempUsers) { var ageGroup = GetAgeGroup(item.Dob); int ageValue = Convert.ToInt32(ageGroup); if (Math.Abs(userAgeValue - ageValue) <= 1) { users.Add(item); } } // users.Insert(0, user); int sl = users.Count; double[,] usersMatrix = new double[sl, 19]; for (int i = 0; i < sl; i++) { usersMatrix[i, 0] = (double)users[i].Marriage; usersMatrix[i, 1] = (double)users[i].Target; usersMatrix[i, 2] = (double)users[i].Education; usersMatrix[i, 3] = (double)users[i].Body; usersMatrix[i, 4] = (double)users[i].Religion; usersMatrix[i, 5] = (double)users[i].Smoking; usersMatrix[i, 6] = (double)users[i].DrinkBeer; usersMatrix[i, 7] = (double)users[i].Cook; usersMatrix[i, 8] = (double)users[i].Game; usersMatrix[i, 9] = (double)users[i].Travel; usersMatrix[i, 10] = (double)users[i].LikePet; usersMatrix[i, 11] = (double)users[i].LikeTechnology; usersMatrix[i, 12] = (double)users[i].Shopping; usersMatrix[i, 13] = (double)users[i].PlaySport; usersMatrix[i, 14] = (double)users[i].FavoriteMovie; usersMatrix[i, 15] = (double)users[i].AtmosphereLike; usersMatrix[i, 16] = (double)users[i].Character; usersMatrix[i, 17] = (double)users[i].LifeStyle; usersMatrix[i, 18] = (double)users[i].MostValuable; } SimilarityMatrix m = new SimilarityMatrix(); m.Row = sl; m.Column = 19; m.Matrix = usersMatrix; List <double> kq = new List <double>(); kq = m.SimilarityCalculate(); users.RemoveAt(0); var similarityScores = new List <SimilarityScore>(); for (int i = 1; i < kq.Count; i++) { users[i - 1].Point = kq[i]; var score = new SimilarityScore() { FromUserId = userId, ToUserId = users[i - 1].Id, Score = kq[i] }; similarityScores.Add(score); } try { _context.SimilarityScores.AddRange(similarityScores); _context.SimilarityScores.RemoveRange(oldScores); await _context.SaveChangesAsync(); return(true); } catch { return(false); } }