// Command line argument: C:\Users\M-PEC\Desktop\TwitterDB RWR_MAP_Domain1_1.txt 1 5 15 public static void Main(string[] args) { Console.WriteLine("RWR-based Recommendation (" + DateTime.Now.ToString() + ")\n"); Stopwatch programStopwatch = Stopwatch.StartNew(); // Stopwatch: C# Standard Library Class // Program arguments dirData = @args[0] + Path.DirectorySeparatorChar; // Path of directory that containes SQLite DB files string outFilePath = args[0] + "\\" + args[1]; Console.WriteLine(outFilePath); string[] methodologyList = args[2].Split(','); // The list of experimental codes (csv format; for example: 0,1,8,9,10,11,12 ) int nFolds = int.Parse(args[3]); // Number of folds int nIterations = int.Parse(args[4]); // Number of iterations for RWR // Load existing experimental results: SKIP already performed experiments if (File.Exists(outFilePath)) { StreamReader reader = new StreamReader(outFilePath); string line; //reader.ReadLine(); // Discard First Line(Headline) while ((line = reader.ReadLine()) != null) { string[] tokens = line.Split('\t'); long egouser = long.Parse(tokens[0]); int experiment = int.Parse(tokens[1]); if (!existingResults.ContainsKey(egouser)) existingResults.Add(egouser, new List<int>()); existingResults[egouser].Add(experiment); } reader.Close(); } // Run experiments using multi-threading string[] sqliteDBs = Directory.GetFiles(dirData, "*.sqlite"); // Methodology list methodologies = new List<Methodology>(); foreach (string methodology in methodologyList) // 'methodologyList' == args[1] methodologies.Add((Methodology)int.Parse(methodology)); // Result File Format Program.logger = new StreamWriter(outFilePath, true); //Program.logger.WriteLine("{0}\t\t{1}\t{2}\t{3}\t{4}\t\t\t{5}\t\t\t{6}\t{7}\t{8}", "EGO", "Method", "Kfold", "Iter", "MAP", "RECALL", "LIKE", "HIT", "FRIEND"); // #Core Part: One .sqlite to One thread bool alreadyExperimented; int cntSemaphore = 1; semaphore = new Semaphore(cntSemaphore, cntSemaphore); Stopwatch dbStopwatch = null; // Stopwatch: C# Standard Library Class foreach (string dbFile in sqliteDBs) { Console.WriteLine("Start Ego: " + Path.GetFileNameWithoutExtension(dbFile)); dbStopwatch = Stopwatch.StartNew(); Experiment experiment = new Experiment(dbFile); alreadyExperimented = experiment.startPersonalizedPageRank(nFolds, nIterations); dbStopwatch.Stop(); if (alreadyExperimented == true) { Program.logger.WriteLine("\t" + Tools.getExecutionTime(dbStopwatch)); Program.logger.Flush(); } } // Close Output file Program.logger.Close(); // Execution Time programStopwatch.Stop(); Console.WriteLine("Execution Time: " + Tools.getExecutionTime(programStopwatch)); Console.WriteLine("Finished!"); }
// Command line argument: C:\Users\dilet\Desktop\TwitterDB 0 10 15 0.1 1 1 public static void Main(string[] args) { Console.WriteLine("RWR-based Recommendation (" + DateTime.Now.ToString() + ")\n"); Stopwatch programStopwatch = Stopwatch.StartNew(); // Program arguments string dirPath = args[0] + Path.DirectorySeparatorChar; // Path of directory that containes SQLite DB files string[] methodologyList = args[1].Split(','); // The list of experimental codes (csv format; for example: 0,1,8,9,10,11,12 ) int kFolds = int.Parse(args[2]); // Number of folds int nIterations = int.Parse(args[3]); // Number of iterations for RWR egoLikeThresholdRatioInTestSet = double.Parse(args[4]); isOnlyFriendInEgoNetwork = (int.Parse(args[5]) == 1) ? true : false; isGenericFriendship = (int.Parse(args[6]) == 1) ? true : false; // <Ego, dbPath(.sqlite)> Sorted by Ego ID(Ascending Order) string[] dbCollection = Directory.GetFiles(dirPath, "*.sqlite"); SortedDictionary<long, string> egoList = new SortedDictionary<long, string>(); foreach (string dbPath in dbCollection) { long egoID = long.Parse(Path.GetFileNameWithoutExtension(dbPath)); egoList.Add(egoID, dbPath); } // Methodology list(Experiment Codes) List<Methodology> methodologies = new List<Methodology>(); foreach (string methodology in methodologyList) methodologies.Add((Methodology) int.Parse(methodology)); // #Core Part: One .sqlite to One thread int cntSemaphore = 1; Program.dbSemaphore = new Semaphore(cntSemaphore, cntSemaphore); foreach (Methodology methodology in methodologies) { // Outfile Setting string outFilePath = args[0] + Path.DirectorySeparatorChar + "RWR_MAP_10Split_Friend_Domain1_" + (int)methodology + "_Friendship0.txt"; // Load existing experimental results: SKIP already performed experiments HashSet<long> alreadyPerformedEgoList = new HashSet<long>(); // (<ego ID>, <{Experiments Codes}>) if (File.Exists(outFilePath)) { using (StreamReader reader = new StreamReader(outFilePath)) { string line; while ((line = reader.ReadLine()) != null) { string[] tokens = line.Split('\t'); long egoUser = long.Parse(tokens[0]); alreadyPerformedEgoList.Add(egoUser); } } } Program.logger = new StreamWriter(outFilePath, true); // Personalized PageRank: Multi-threading Experiment experiment; personalizedPageRankThreadParamters pagaRankParameters; List<Thread> threadList = new List<Thread>(); foreach (KeyValuePair<long, string> egoDBpair in egoList) { long egoID = egoDBpair.Key; string dbPath = egoDBpair.Value; if (alreadyPerformedEgoList.Contains(egoID) == true) { Console.WriteLine("Ego {0} Already Performend", egoID); continue; } try { // one Thread to one DB Program.dbSemaphore.WaitOne(); Console.WriteLine("Ego {0} Start", egoID); experiment = new Experiment(dbPath); Thread thread = new Thread(experiment.startPersonalizedPageRank); pagaRankParameters = new personalizedPageRankThreadParamters(kFolds, nIterations, methodology); thread.Start(pagaRankParameters); threadList.Add(thread); } catch (Exception e) { Console.WriteLine(e.Message); } } foreach (Thread thread in threadList) thread.Join(); // Close Output file Program.logger.Close(); } // Execution Time programStopwatch.Stop(); Console.WriteLine("Execution Time: " + Tools.getExecutionTime(programStopwatch)); Console.WriteLine("Finished!"); }