package happy.research.cf; import happy.coding.io.FileIO; import happy.coding.io.Logs; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * * @author guoguibing * */ public class DT_Impute_t1 extends DT_Impute_mt implements Runnable { public DT_Impute_t1(List<String> users, int id) throws Exception { this.threadUsers = users; this.id = id; } public void run() { Thread.currentThread().setName("[Build Middle Data] [Thread " + id + "]"); Logs.debug("Start running {} ...", Thread.currentThread().getName()); Set<String> items = itemRatingsMap.keySet(); for (String user : threadUsers) { Map<String, Double> tns = userTNsMap.get(user); if (tns == null) continue; for (String tn : tns.keySet()) { String ratingPath = trustDirPath + tn + ".txt"; File ratingFile = new File(ratingPath); if (ratingFile.exists()) continue; /* predict item's rating for trusted neighbors */ Map<String, Rating> ratings = userRatingsMap.get(tn); List<Rating> missingRatings = new ArrayList<>(); for (String item : items) { if (ratings != null && !ratings.containsKey(item)) { Map<String, Double> dns = userDNsMap.get(tn); if (dns == null) continue; double sum = 0.0; int count = 0; for (String dn : dns.keySet()) { Map<String, Rating> nrs = userRatingsMap.get(dn); if (nrs != null && nrs.containsKey(item)) { sum += nrs.get(item).getRating(); count++; } } if (count > 0) { Rating r = new Rating(); r.setUserId(tn); r.setItemId(item); r.setRating(Dataset.maxScale - sum / count + Dataset.minScale); missingRatings.add(r); } } } if (missingRatings.size() > 0) try { FileIO.writeListSyn(ratingPath, missingRatings); } catch (Exception e) { e.printStackTrace(); } } } Logs.debug("Finish running {}", Thread.currentThread().getName()); } }