package happy.research.cf;
import happy.coding.io.FileIO;
import happy.coding.io.Logs;
import happy.research.cf.ConfigParams.DatasetMode;
import happy.research.cf.ConfigParams.ValidateMethod;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public abstract class DefaultCF_mt extends DefaultCF {
protected static List<Rating>[] ratingArrays = null;
protected static Thread[] threads = null;
protected static Performance pf = null;
protected List<Rating> threadRatings = null;
protected List<String>[] users;
protected List<String> threadUsers;
protected int id = 0;
protected int currentProgress = 0;
protected int numRating = 0;
@Override
protected Performance runRecAlgorithm() throws Exception {
makeDirPaths();
int numThreads = params.RUNTIME_THREADS;
ratingArrays = DatasetUtils.splitCollection(testRatings, numThreads);
threads = new Thread[numThreads];
pf = new Performance(methodId);
return runMultiThreads();
}
protected abstract Performance runMultiThreads() throws Exception;
protected void makeDirPaths() throws Exception {
int horizon = params.TRUST_PROPERGATION_LENGTH;
String trustDir = (params.TIDALTRUST ? "TT" : "MT") + horizon;
String trustDir2 = params.TIDALTRUST ? "TidalTrust" : "MoleTrust";
String trustDir0 = null;
if (params.auto_trust_sets)
trustDir0 = current_trust_name;
String[] trustDirs = null;
if (params.auto_trust_sets) {
trustDirs = new String[] { Dataset.TEMP_DIRECTORY, trustDir, trustDir0, trustDir2 };
} else {
trustDirs = new String[] { Dataset.TEMP_DIRECTORY, trustDir, trustDir2 };
}
trustDirPath = FileIO.makeDirPath(trustDirs);
FileIO.makeDirectory(trustDirPath);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected void prepTestRatings() {
if (params.VALIDATE_METHOD == ValidateMethod.leave_one_out)
super.prepTestRatings();
else if (testRatings == null) {
String testSet = Dataset.DIRECTORY + params.TEST_SET;
Logs.debug("Loading test set {}", testSet);
testRatings = new ArrayList<>();
Map<String, Map<String, Rating>> userMap = null;
Map<String, Map<String, Rating>> itemMap = null;
try {
Map[] data = Dataset.loadTestSet(testSet);
userMap = data[0];
itemMap = data[1];
} catch (Exception e) {
e.printStackTrace();
}
if (params.DATASET_MODE == DatasetMode.nicheItems || params.DATASET_MODE == DatasetMode.contrItems) {
for (String item : itemMap.keySet()) {
Map<String, Rating> trainItemRatings = itemRatingsMap.get(item);
Map<String, Rating> testItemRatings = itemMap.get(item);
boolean emptyTrain = trainItemRatings == null;
switch (params.DATASET_MODE) {
case nicheItems:
if (emptyTrain || trainItemRatings.size() < 5) {
testRatings.addAll(testItemRatings.values());
}
break;
case contrItems:
if (!emptyTrain && RatingUtils.std(trainItemRatings.values()) > 1.5) {
testRatings.addAll(testItemRatings.values());
}
break;
default:
break;
}
}
} else {
int min = 0, max = 0, count = 0;
for (String user : userMap.keySet()) {
Map<String, Rating> trainUserRatings = userRatingsMap.get(user);
Map<String, Rating> testUserRatings = userMap.get(user);
boolean emptyTrain = trainUserRatings == null;
switch (params.DATASET_MODE) {
case all:
if (emptyTrain || trainUserRatings.size() > 0) {
testRatings.addAll(testUserRatings.values());
}
break;
case userDegree:
min = params.readInt("num.min.degree");
max = params.readInt("num.max.degree");
count = emptyTrain ? 0 : trainUserRatings.size();
if (min < 0)
min = 0;
if (max < 0)
max = Integer.MAX_VALUE;
if (max < min) {
Logs.debug("num.max.degree is smaller than num.min.degree!");
System.exit(-1);
}
if (count >= min && count <= max) {
testRatings.addAll(testUserRatings.values());
}
break;
case itemDegree:
min = params.readInt("num.min.degree");
max = params.readInt("num.max.degree");
if (min < 0)
min = 0;
if (max < 0)
max = Integer.MAX_VALUE;
if (max < min) {
Logs.debug("num.max.degree is smaller than num.min.degree!");
System.exit(-1);
}
for (Entry<String, Rating> enk : testUserRatings.entrySet()) {
String item = enk.getKey();
count = itemRatingsMap.containsKey(item) ? itemRatingsMap.get(item).size() : 0;
if (count >= min && count <= max)
testRatings.add(enk.getValue());
}
break;
case coldUsers:
if (emptyTrain || trainUserRatings.size() <= 4) {
testRatings.addAll(testUserRatings.values());
}
break;
case heavyUsers:
if (!emptyTrain && trainUserRatings.size() > 10) {
testRatings.addAll(testUserRatings.values());
}
break;
case opinUsers:
if (!emptyTrain && trainUserRatings.size() > 4
&& RatingUtils.std(trainUserRatings.values()) > 1.5) {
testRatings.addAll(testUserRatings.values());
}
break;
case blackSheep:
if (!emptyTrain && trainUserRatings.size() > 4
&& RatingUtils.meanDistance(trainUserRatings, itemMeanMap) > 1) {
testRatings.addAll(testUserRatings.values());
}
break;
default:
break;
}// end of switch
}// end of for
if (min > 0 || max > 0) {
methodSettings.add(min + "");
methodSettings.add(max + "");
}
}// end of else
}
}
}