public void Detect() { if (this.AllCommunities.Count > 0) { return; } if (this.graph.Nodes.Count() > 0) { Dictionary <int, int> partition = Community.BestPartition(this.graph); foreach (var kvp in partition) { int id = kvp.Value + 1; List <int> nodeset; if (!this.AllCommunities.TryGetValue(id, out nodeset)) { nodeset = new List <int>(); this.AllCommunities.Add(id, nodeset); } nodeset.Add(kvp.Key); } this.modularity = Community.Modularity(this.graph, partition); } else { this.modularity = 0; } }
static void Main(string[] args) { Graph g = new Graph(); //test network int edgecounter = 0; using (StreamReader sr = new StreamReader("testnetwork.csv")) { string line = null; while ((line = sr.ReadLine()) != null) { line = line.Trim(); if (line == "") { continue; } string[] d = line.Split(','); int agent = Int32.Parse(d[0]); for (int i = 1; i < d.Length; i++) { int friends = Int32.Parse(d[i]); g.AddEdge(agent, friends, 1); edgecounter++; } } } Console.WriteLine("{0} edges added", edgecounter); Stopwatch stopwatch = new Stopwatch(); stopwatch.Restart(); Dictionary <int, int> partition = Community.BestPartition(g); Console.WriteLine("BestPartition: {0}", stopwatch.Elapsed); var communities = new Dictionary <int, List <int> >(); foreach (var kvp in partition) { List <int> nodeset; if (!communities.TryGetValue(kvp.Value, out nodeset)) { nodeset = communities[kvp.Value] = new List <int>(); } nodeset.Add(kvp.Key); } Console.WriteLine("{0} communities found", communities.Count); int counter = 0; foreach (var kvp in communities) { Console.WriteLine("community {0}: {1} people", counter, kvp.Value.Count); counter++; } Console.ReadLine(); }
private static void GenerateKBObjectEdgesTxt(string name, string fileName) { IKBService kbserv = UIServices.KB; KBModel model = kbserv.CurrentModel; Graph g = new Graph(); Module rootModule = kbserv.CurrentModel.GetDesignModel().RootModule; IOutputService output = CommonServices.Output; StringCollection aristas = new StringCollection(); output.AddLine("Generating " + name); Dictionary <string, Tuple <int, string> > dictionary = new Dictionary <string, Tuple <int, string> >(); Dictionary <int, int> initialpartition = new Dictionary <int, int>(); // Dictionary<string, Tuple<int,string>> dictionary = new Dictionary<string, Tuple<int,string>>(); Dictionary <string, int> NameToId = new Dictionary <string, int>(); Dictionary <string, string> NameToModule = new Dictionary <string, string>(); Dictionary <int, string> IdToName = new Dictionary <int, string>(); Dictionary <int, string> IdToModule = new Dictionary <int, string>(); Dictionary <int, EntityKey> IdToKey = new Dictionary <int, EntityKey>(); int objId = 0; foreach (KBObject obj in model.Objects.GetAll()) { if (Functions.hasModule(obj) || (obj is Module)) { string objName = NombreNodo(obj); string modulename = ModulesHelper.ObjectModuleName(obj); try { objId += 1; NameToId.Add(objName, objId); NameToModule.Add(objName, modulename); IdToName.Add(objId, objName); IdToModule.Add(objId, modulename); IdToKey.Add(objId, obj.Key); } catch (Exception e) {// output.AddWarningLine("Can't add : " + objName + " Exception: " + e.Message + " " + e.InnerException); }; } } foreach (KBObject obj in model.Objects.GetAll()) { string objName = ""; if (Functions.hasModule(obj) || (obj is Module)) //((Functions.isRunable(obj) && ObjectsHelper.isGenerated(obj)) || (obj is Table)) { /* * objName = NombreNodo(obj); * string modulename = ModulesHelper.ObjectModuleName(obj); * * try * { * objId += 1; * NameToId.Add(objName, objId); * NameToModule.Add(objName, modulename); * IdToName.Add(objId, objName); * IdToModule.Add(objId, modulename); * IdToKey.Add(objId, obj.Key); * } * catch (Exception e) { //output.AddWarningLine("Can't add : " + objName); * }; */ //Tomo las referencias que no sean tablas. foreach (EntityReference r in obj.GetReferencesTo()) { KBObject objRef = KBObject.Get(obj.Model, r.From); if ((objRef != null) && (Functions.isRunable(objRef)) || (objRef is Table)) { string objRefName = NombreNodo(objRef); if (objName != objRefName) { int weight = ReferenceWeight(objRef, obj); String edge = objRefName + " " + objName; if (!aristas.Contains(edge)) { aristas.Add(edge); GraboArista(g, NameToId, objRefName, objName, weight); } } } } } } ; foreach (int node in g.Nodes) { string moduleName = IdToModule[node]; int moduleId = NameToId[moduleName]; initialpartition.Add(node, moduleId); } output.AddLine("Before automatic modularization. TurboMQ = " + TurboMQ(g, initialpartition).ToString()); //Empiezo modularizacion Stopwatch stopwatch = new Stopwatch(); // stopwatch.Restart(); Dictionary <int, int> partition = Community.BestPartition(g); output.AddLine("BestPartition: " + stopwatch.Elapsed); var communities = new Dictionary <int, List <int> >(); foreach (var kvp in partition) { List <int> nodeset; if (!communities.TryGetValue(kvp.Value, out nodeset)) { nodeset = communities[kvp.Value] = new List <int>(); } nodeset.Add(kvp.Key); // output.AddLine(kvp.Key.ToString() +" "+kvp.Value); } output.AddLine(communities.Count + " modules found"); Dictionary <string, int> modu = new Dictionary <string, int>(); int counter = 0; foreach (var kvp in communities) { output.AddLine(String.Format("module {0}: {1} objects", counter, kvp.Value.Count)); foreach (var objid in kvp.Value) { var objname = IdToName[objid]; int cantidad = 0; // output.AddLine("Module :" + counter.ToString() + " " + objname); string pareja = IdToModule[objid] + " " + counter.ToString(); if (modu.ContainsKey(pareja)) { modu[pareja] = modu[pareja] + 1; } else { modu.Add(pareja, 1); } } var sortedDict = from entry in modu orderby entry.Value descending select entry; //Cantidad de modulo nuevo y modulo viejo. foreach (KeyValuePair <string, int> entry in sortedDict) { // output.AddLine(entry.Key + " " + entry.Value.ToString()); Module m = new Module(model); m.Name = entry.Key.Replace(" ", "_") + string.Format("_{0:yyyy_MM_dd_hh_mm_ss}", DateTime.Now); output.AddLine(m.Name); m.Module = kbserv.CurrentModel.GetDesignModel().RootModule; m.Save(); foreach (var objid in kvp.Value) { KBObject objToChange = KBObject.Get(model, IdToKey[objid]); if (objToChange != null) { if (objToChange is Table) { try { KBObject trnBest = GenexusBLServices.Tables.GetBestAssociatedTransaction(model, objToChange.Key); trnBest.Module = m; trnBest.Save(); } catch (Exception e) { output.AddErrorLine(objToChange.Name + e.Message); } } else { try { objToChange.Module = m; objToChange.Save(); } catch (Exception e) { output.AddErrorLine(objToChange.Name + e.Message); } } } } break; } counter++; modu.Clear(); } }