package happy.research.cf;
import happy.coding.io.FileIO;
import happy.coding.io.Logs;
import happy.coding.io.Strings;
import happy.coding.system.Dates;
import happy.coding.system.Systems;
import happy.research.utils.SimUtils.SimMethod;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* Usage: ConfigParams.defaultInstance();
*
* @author guoguibing
*/
public class ConfigParams {
private static ConfigParams params;
private static Properties p;
public int kNN = 0;
public int TOP_N = 0;
public int numRunMethod = 0;
public int RUNTIME_THREADS = 1;
public int TCF_ITERATION = 1;
public int RUNTIME_PROGRESS_STEP = 100;
public int TRUST_PROPERGATION_LENGTH = 1;
public String RESULTS_DIRECTORY = null;
public boolean CLASSIC_CF, HYBRID_CT, TCF, VR_CF, MultAspect, auto_trust_sets;
public boolean MOLETRUST, TIDALTRUST, kNRTrust, COGTRUST;
public boolean TRUST_ALL, TRUST_ALL_PLUS, GLOBAL_AVERAGE, TRUST_WALKER;
public boolean MERGE_TCF, MERGE_TCF2, MERGE_DTN, TCF_MERGE, TCF2_MERGE, DT_IMPUTE;
public boolean RECONSTRUCTION, EMAIL_NOTIFICATION;
public boolean MF_CV;
public double SIMILARITY_THRESHOLD = 0.0;
public double SIGNIFICANCE_THRESHOLD = 0.0;
public boolean AUTO_SIMILARITY = false;
public boolean AUTO_CONFIDENCE = false;
public boolean AUTO_SIGNIFICANCE = false;
public boolean AUTO_TRUST = false;
public boolean AUTO_SIGMA = false;
public boolean AUTO_KNN = false;
public boolean AUTO_TOPN = false;
public boolean AUTO_VIEWS = false;
public boolean AUTO_CV = false;
public boolean BATCH_RUN = false;
public double CONFIDENCE_THRESHOLD = 0.0;
public double TRUST_THRESHOLD = 0.0;
public double COGTRUST_ALPHA = 0.0;
public double COGTRUST_BIAS = 0.0;
public double COGTRUST_EPSILON = 0.0;
public double X_SIGMA = 0;
public String TRAIN_SET = null;
public String TEST_SET = null;
public enum DatasetMode {
all("All"), coldUsers("Cold Users"), heavyUsers("Heavy Users"), opinUsers("Opin. Users"), blackSheep(
"Black Sheep"), nicheItems("Niche Items"), contrItems("Contr. Items"), batch("Batch"), userDegree(
"user-degree"), itemDegree("item-degree");
public String label = null;
DatasetMode(String _label) {
this.label = _label;
}
}
public enum ValidateMethod {
leave_one_out, cross_validation
}
public enum PredictMethod {
weighted_average, resnick_formula, remove_bias
}
public SimMethod SIMILARITY_METHOD = SimMethod.PCC;
public DatasetMode DATASET_MODE = DatasetMode.all;
public ValidateMethod VALIDATE_METHOD = ValidateMethod.leave_one_out;
public PredictMethod PREDICT_METHOD = PredictMethod.weighted_average;
private ConfigParams() {
}
public static ConfigParams defaultInstance() throws Exception {
return defaultInstance(FileIO.getResource("cf.conf"));
}
public static ConfigParams defaultInstance(String config) throws Exception {
if (params == null) {
params = new ConfigParams();
params.loadConfig(config);
}
return params;
}
public String readParam(String key) {
return p.getProperty(key);
}
public String readParam(String key, String val) {
return p.getProperty(key, val);
}
public double readDouble(String key) {
return Double.parseDouble(readParam(key));
}
public int readInt(String key) {
return Integer.parseInt(readParam(key));
}
public List<Double> readDoubleList(String key) {
List<Double> data = new ArrayList<>();
String val = readParam(key);
String[] values = val.split(",");
for (String value : values) {
double d = Double.parseDouble(value);
data.add(d);
}
return data;
}
private void loadConfig(String configFile) throws Exception {
p = new Properties();
p.load(new FileInputStream(configFile));
RUNTIME_THREADS = readInt("runtime.threads");
RUNTIME_PROGRESS_STEP = readInt("runtime.progress.step");
RESULTS_DIRECTORY = FileIO.makeDirPath(readParam("results.directory"));
TRUST_PROPERGATION_LENGTH = readInt("trust.propagation.length");
SIMILARITY_METHOD = simMethod(p, "similarity.method");
String similarity = readParam("similarity.threshold");
if (similarity != null && "batch".equalsIgnoreCase(similarity)) {
AUTO_SIMILARITY = true;
BATCH_RUN = true;
} else
SIMILARITY_THRESHOLD = Double.parseDouble(similarity);
String confidence = readParam("confidence.threshold");
if (confidence != null && "batch".equalsIgnoreCase(confidence)) {
AUTO_CONFIDENCE = true;
BATCH_RUN = true;
} else
CONFIDENCE_THRESHOLD = Double.parseDouble(confidence);
String significance = readParam("significance.threshold");
if (significance != null && "batch".equalsIgnoreCase(significance)) {
AUTO_SIGNIFICANCE = true;
BATCH_RUN = true;
} else
SIGNIFICANCE_THRESHOLD = Double.parseDouble(significance);
String trust = readParam("trust.threshold");
if (trust != null && "batch".equalsIgnoreCase(trust)) {
AUTO_TRUST = true;
BATCH_RUN = true;
} else
TRUST_THRESHOLD = Double.parseDouble(trust);
String sigmas = readParam("bs.x.sigma");
if (sigmas != null && "batch".equalsIgnoreCase(sigmas)) {
AUTO_SIGMA = true;
BATCH_RUN = true;
} else
X_SIGMA = Double.parseDouble(sigmas);
COGTRUST_ALPHA = Double.parseDouble(readParam("CogTrust.alpha"));
COGTRUST_BIAS = Double.parseDouble(readParam("CogTrust.bias"));
COGTRUST_EPSILON = Double.parseDouble(readParam("CogTrust.epsilon"));
// training and test sets
TRAIN_SET = readParam("train.sets", null);
TEST_SET = readParam("test.sets", null);
String knn = readParam("kNN");
if (knn != null && "batch".equalsIgnoreCase(knn)) {
AUTO_KNN = true;
BATCH_RUN = true;
} else
kNN = Integer.parseInt(knn);
String topN = readParam("top.n");
if (topN != null && "batch".equalsIgnoreCase(topN)) {
AUTO_TOPN = true;
BATCH_RUN = true;
} else
TOP_N = Integer.parseInt(topN);
DATASET_MODE = getDatasetMode(p, "dataset.mode");
if (DATASET_MODE == DatasetMode.batch) {
AUTO_VIEWS = true;
BATCH_RUN = true;
}
/*
* -------------------------- Assemble Dataset class
* ---------------------
*/
VALIDATE_METHOD = getValidateMethod(p, "validating.method");
PREDICT_METHOD = getPredictMethod(p, "predicting.method");
AUTO_CV = setFlag(p, "cross.validation.batch");
if (AUTO_CV)
BATCH_RUN = true;
Dataset.init(readParam("run.dataset").trim());
Dataset.DIRECTORY = readParam("dataset.directory");
Dataset.DIRECTORY = Dataset.DIRECTORY.replaceAll("[$]run.dataset[$]", Dataset.LABEL);
String dir = Dataset.DIRECTORY;
String subLabel = dir.substring(dir.indexOf(Dataset.LABEL) + Dataset.LABEL.length() + 1);
if (VALIDATE_METHOD == ValidateMethod.cross_validation)
Dataset.DIRECTORY += "5fold";
Dataset.DIRECTORY = FileIO.makeDirPath(Dataset.DIRECTORY);
switch (Systems.getOs()) {
case Windows:
Dataset.TEMP_DIRECTORY = "D:\\Data\\" + Dataset.LABEL + "\\" + subLabel;
break;
default:
String str = readParam("dataset.temp.directory");
Dataset.TEMP_DIRECTORY = str.replaceAll("[$]run.dataset[$]", Dataset.LABEL) + subLabel;
Dataset.TEMP_DIRECTORY = FileIO.makeDirPath(Dataset.TEMP_DIRECTORY);
break;
}
/*
* --------------------------- Run Methods
* ------------------------------
*/
MF_CV = setFlag(p, "MF.cv.run");
// leave one out
CLASSIC_CF = setFlag(p, "Classic.cf.run");
VR_CF = setFlag(p, "VR.cf.run");
HYBRID_CT = setFlag(p, "Hybrid.ct.run");
TCF = setFlag(p, "TCF.cf.run");
TCF_ITERATION = readInt("TCF.iteration");
TRUST_ALL = setFlag(p, "Trust.all.run");
TRUST_ALL_PLUS = setFlag(p, "Trust.all.plus.run");
GLOBAL_AVERAGE = setFlag(p, "Global.average.run");
MOLETRUST = setFlag(p, "MoleTrust.run");
TIDALTRUST = setFlag(p, "TidalTrust.run");
kNRTrust = setFlag(p, "kNRTrust.run");
MERGE_TCF = setFlag(p, "Merge.TCF.run");
MERGE_TCF2 = setFlag(p, "Merge.TCF2.run");
MERGE_DTN = setFlag(p, "Merge.DTN.run");
TCF_MERGE = setFlag(p, "TCF.Merge.run");
TCF2_MERGE = setFlag(p, "TCF2.Merge.run");
DT_IMPUTE = setFlag(p, "DT.Impute.run");
COGTRUST = setFlag(p, "CogTrust.run");
MultAspect = setFlag(p, "MultAspect.run");
auto_trust_sets = setFlag(p, "auto.trust.sets");
TRUST_WALKER = setFlag(p, "trust.walker.run");
RECONSTRUCTION = setFlag(p, "reconstruction.run");
EMAIL_NOTIFICATION = setFlag(p, "results.email.notification");
}
private DatasetMode getDatasetMode(Properties p, String label) {
String valueString = readParam(label, DatasetMode.all.name());
for (DatasetMode m : DatasetMode.values()) {
if (m.name().equalsIgnoreCase(valueString))
return m;
}
return DatasetMode.all;
}
private SimMethod simMethod(Properties p, String label) {
String value = readParam(label, DatasetMode.all.name());
for (SimMethod m : SimMethod.values()) {
if (m.name().equalsIgnoreCase(value))
return m;
}
return SimMethod.PCC;
}
private ValidateMethod getValidateMethod(Properties p, String label) {
String valueString = readParam(label, ValidateMethod.leave_one_out.name());
for (ValidateMethod m : ValidateMethod.values()) {
if (m.name().equalsIgnoreCase(valueString))
return m;
}
return ValidateMethod.leave_one_out;
}
private PredictMethod getPredictMethod(Properties p, String label) {
String valueString = readParam(label, PredictMethod.weighted_average.name());
for (PredictMethod m : PredictMethod.values()) {
if (m.name().equalsIgnoreCase(valueString))
return m;
}
return PredictMethod.weighted_average;
}
private boolean setFlag(Properties p, String str) {
String valueString = readParam(str, "off").trim();
if (valueString.equalsIgnoreCase("on")) {
if (str.endsWith(".run"))
numRunMethod++;
return true;
}
return false;
}
public void printSpecs() {
Logs.info("Starts at {}", Dates.now());
Logs.info(null);
String suffix = Strings.repeat('-', 22);
Logs.info(suffix + " Global Setting " + suffix);
Logs.info("Currently data set = {} ({})", Dataset.LABEL, Dataset.DIRECTORY);
Logs.info("Validation approach = {}", VALIDATE_METHOD.name());
Logs.info("Prediction method = {}", PREDICT_METHOD.name());
Logs.info("Calculate similarity = {}", params.SIMILARITY_METHOD);
Logs.info(null);
Logs.info(suffix + " Method Results " + suffix);
}
}