package happy.research.cf;
import happy.research.utils.SimUtils.SimMethod;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* Classic Collaborative Filtering
*
* @author guoguibing
*/
public class ClassicCF_mt extends DefaultCF_mt
{
public ClassicCF_mt()
{
methodId = params.SIMILARITY_METHOD.name() + "-CF";
}
private Map<Double, Integer> probeDistanceNums()
{
List<String> users = new ArrayList<>(userRatingsMap.keySet());
Map<Double, Integer> distanceNumMap = new HashMap<>();
for (int i = 0; i < Dataset.scaleSize; i++)
distanceNumMap.put(i * Dataset.minScale, 0);
for (int i = 0; i < users.size(); i++)
{
String userA = users.get(i);
Map<String, Rating> asRatings = userRatingsMap.get(userA);
if (asRatings == null || asRatings.size() < 1) continue;
for (int j = i + 1; j < users.size(); j++)
{
String userB = users.get(j);
Map<String, Rating> bsRatings = userRatingsMap.get(userB);
if (bsRatings == null || bsRatings.size() < 1) continue;
for (Entry<String, Rating> en : asRatings.entrySet())
{
String ai = en.getKey();
Rating ar = en.getValue();
if (bsRatings.containsKey(ai))
{
double asRating = ar.getRating();
double bsRating = bsRatings.get(ai).getRating();
double distance = Math.abs(asRating - bsRating);
int num = distanceNumMap.get(distance);
distanceNumMap.put(distance, num + 1);
}
}
}
}
return distanceNumMap;
}
@Override
protected Performance runMultiThreads() throws Exception
{
if (params.SIMILARITY_METHOD == SimMethod.BS) distanceNum = probeDistanceNums();
for (int i = 0; i < ratingArrays.length; i++)
{
threads[i] = new Thread(new ClassicCF_t(i));
threads[i].start();
}
for (Thread tr : threads)
tr.join();
return pf;
}
}