public void MXGraphTest() { log.logStartPhase("MXGraph", "Texting Draw.io create/load/save"); folderNode rootNode = new folderNode(); rootNode.AttachSubfolders(); var dgml = new DirectedGraph(); dgml.Populate <folderNode>(rootNode, x => x, x => x.path, x => x.caption, true, false); mxGraph mxg = directedGraphToMXGraph.ConvertToMXGraph(dgml); String drawio_path = folderResults.pathFor("MXGraphTest.drawio", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object"); String drawio_jpg = folderResults.pathFor("MXGraphTest.jpg", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object"); Image img = mxCellRenderer.CreateImage(mxg, mxg.GetChildCells(mxg, false, false), 1.0, Color.LightGray, true, new mxRectangle(0, 0, 1000, 500)); img.Save(drawio_jpg, ImageFormat.Jpeg); var doc = new XmlDocument(); mxCodec codec = new mxCodec(); XmlNode node = codec.Encode(mxg.Model); doc.LoadXml(node.OuterXml); doc.Save(drawio_path); log.logEndPhase(); }
/// <summary> /// Directeds the graph test. /// </summary> public void DirectedGraphTest() { DirectedGraph dgml = new DirectedGraph(); log.logStartPhase("TEST01", "Creating DirectedGraph from string list of paths"); StringBuilder sb = new StringBuilder(); sb.AppendLine("/A/B/B/C"); sb.AppendLine("/A/B2/B/C"); sb.AppendLine("/A/B2/B1/C"); sb.AppendLine("/A/B2/B2/C"); sb.AppendLine("/A/B2/B3/C"); List <String> spl = sb.ToString().Split(new String[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList(); var g = graphTools.BuildGraphFromPaths <graphNode>(spl, "/"); dgml = g.ConvertToDGML(); var TP1 = folderResults.pathFor("test01_usingConvertor.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, ""); dgml.Save(TP1); dgml = new DirectedGraph(); dgml.Populate <IObjectWithPathAndChildren>(g, x => x, x => x.name, x => x.path, true, false); var TP2 = folderResults.pathFor("test01_usingPopulateExtension.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, ""); dgml.Save(TP2); log.logEndPhase(); log.logStartPhase("TEST02", "Creating DirectedGraph from application root folder"); folderNode rootNode = new folderNode(); rootNode.AttachSubfolders(); dgml = new DirectedGraph(); dgml.Populate <folderNode>(rootNode, x => x, x => x.path, x => x.caption, true, false); var TP3 = folderResults.pathFor("test02.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, ""); dgml.Save(TP3); log.logEndPhase(); log.logStartPhase("TEST03", "Creating DirectedGraph with reflection"); Type graphNodeBaseType = typeof(graphNodeBase); dgml = new DirectedGraph(); dgml.Populate <Type>(graphNodeBaseType.GetBaseTypeList(true), x => x.GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public).Select(y => y.PropertyType).ToList(), x => x.Name, x => x.Name, true, false); var TP4 = folderResults.pathFor("test03.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, ""); dgml.Save(TP4); log.logEndPhase(); log.logStartPhase("TEST04", "Testing Load and Save methods for DirectGraph"); DirectedGraph.Load <DirectedGraph>(TP1).Save(folderResults.pathFor("loadsave_test01.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object")); DirectedGraph.Load <DirectedGraph>(TP2).Save(folderResults.pathFor("loadsave_test02.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object")); DirectedGraph.Load <DirectedGraph>(TP3).Save(folderResults.pathFor("loadsave_test03.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object")); DirectedGraph.Load <DirectedGraph>(TP4).Save(folderResults.pathFor("loadsave_test04.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, "Resaving loaded DMGL object")); log.logEndPhase(); DotGraph dotGraph = new DotGraph("test", true); dotGraph.Nodes.AddRange(dgml.Nodes); dotGraph.Links.AddRange(dgml.Links); String dot_path = folderResults.pathFor("DOTTest.dot", imbSCI.Data.enums.getWritableFileMode.overwrite, "DGML to DOT"); dotGraph.Save(dot_path, imbSCI.Data.enums.getWritableFileMode.overwrite); //log.logStartPhase("TEST05","Exporting to draw.io"); }
/// <summary> /// Generates the report set directory readme file. /// </summary> /// <param name="filename">The filename.</param> public void GenerateParentReadmeFile(String filename = "experiments_readme.txt") { folderNode node = folder; //if (folder.parent != null) //{ // node = folder.parent as folderNode; //} //else //{ // DirectoryInfo di = folder; // DirectoryInfo dip = di.Parent; // node = dip; // node.caption = dip.Name; // node.description = "Report data set on group of experiments"; //} StringBuilder sb = new StringBuilder(); // <--------- ---- ---- -- ------ DESCRIPTION GENERATION String ln = "# Report package [" + node.caption + "]"; sb.AppendLine(ln); String line = "-".Repeat(ln.Length); sb.AppendLine(line); sb.AppendLine("This directory contains integral reports on performed experiments on web site classification, done with imbWBI library - part of imbVeles Framework."); sb.AppendLine("Each subdirectory contains reports on one particular configuration, tested on a range of semantic term expansion (Stx) values."); sb.AppendLine(line); sb.AppendLine(); sb.AppendLine("Main directory structure:"); sb.AppendLine("-- exp_[experient code name]"); sb.AppendLine("-- exp_[experient code name]"); sb.AppendLine("-- ... "); sb.AppendLine("-- Summary"); sb.AppendLine(); sb.AppendLine(line); sb.AppendLine(); sb.AppendLine("## Experiment subdirectories"); sb.AppendLine("In the subdirectories named exp_[experiment code name] you will find summary text, spreadsheet and XML data files - describing the experiment."); sb.AppendLine("Wherever an Excel spreadsheet file is generated (in XLSX format), you'll find a subfolder named [data] where the same data is exported in Comma Separated Values (CSV) format for easier consumption by 3rd party software."); sb.AppendLine("-- In Excel spreadsheet files you'll find second sheet called LEGEND, where each column in the report is explained. The same column descriptions are saved in plain text format within [data] subfolders."); sb.AppendLine("In each subdirectory of this data set, across the complete directory tree, you will find [directory_readme.txt] where content of the subdirectory is described."); sb.AppendLine("Exact content of the experiment report subdirectores varies depending on reporting options used and version of the software."); sb.AppendLine(); sb.AppendLine("However, there is general directory tree structure:"); sb.AppendLine("-- exp_[experient code name]"); sb.AppendLine("-- -- [name of FVE]_[sample randomization tag]_E[Stx] <- directory with report on experiment version, performed with Stx number of semantic term expansion steps"); sb.AppendLine("-- -- -- [name of FVE]_[sample randomization tag]_E[Stx]00[fold id] <- directory with report on [fold id] fold of k-fold schema used"); sb.AppendLine("-- -- -- -- cases <- XML serialized data on Category Knowledge, constructed in this fold (from the training sample subset)"); sb.AppendLine("-- -- General <- general report on the complete data set, different in scope depending on reporting options used"); sb.AppendLine("-- -- SharedKnowledge <- XML serialized data (Lemma Tables) on all Cases in the data set"); sb.AppendLine("-- -- errors <- Here you might find logs on exceptions, if an error during execution happen. "); sb.AppendLine(" | However, if the note.txt file is not empty - it should have earlier time/date creation stamp then the rest of the report."); sb.AppendLine(" | Only reports with error notes that should exist in this data set are the ones where Semantic Cloud"); sb.AppendLine(" | failed to be created because of small amount of training data in the fold."); sb.AppendLine(); sb.AppendLine("## Summary directory"); sb.AppendLine("In the [Summary] directory, you will find aggregated overview reports on all experiments in this group. The reports are created separately for each [k] number of k-fold schemas."); sb.AppendLine("These reports are given in spreadsheet format (Excel file, and CSV in [data] subfolder) and in form of native XML serialized objects."); sb.AppendLine("Additional remarks:"); sb.AppendLine("-- Reports may contain some additional metrics, subreports and other records, not mentioned nor explained in the research article. Like: ModelMetrics.xml. "); sb.AppendLine("-- These are some unfinished ideas, models for FVE evaluation that, at the end, were not used for research conclusions nor system validation."); sb.AppendLine(); Double f1 = Double.MinValue; secondaryReportOnFVE topFVE = null; sb.AppendLine(line); sb.AppendLine("## List of the experiments contained in this data set"); Int32 c = 1; foreach (var item in items) { ln = "[" + c.ToString("D2") + "] " + item.experiment.name + " (sub experiments: " + item.items.Count.ToString() + ")"; sb.AppendLine(ln); if (f1 < item.topPerformer.F1Score) { topFVE = item.topPerformer; f1 = item.topPerformer.F1Score; } c++; } sb.AppendLine(line); sb.AppendLine(); sb.AppendLine("imbVeles Framework | imbWBI | GNU GPL v3.0 | http://blog.veles.rs | Goran Grubić | [email protected]"); sb.AppendLine(line); sb.AppendLine("File generated: " + DateTime.Now.ToLongDateString() + ", " + DateTime.Now.ToLongTimeString()); // <--------- String p = node.pathFor(filename, imbSCI.Data.enums.getWritableFileMode.overwrite, "ReadMe file describing experiment reports contained in this report set."); File.WriteAllText(p, sb.ToString()); node.AttachSubfolders(); if (DoGenerateGraph) { var dgml = node.GetDirectedGraph(false, false, false, 3); dgml.Layout = imbSCI.Graph.DGML.enums.GraphLayoutEnum.DependencyMatrix; dgml.GraphDirection = imbSCI.Graph.DGML.enums.GraphDirectionEnum.LeftToRight; dgml.Save(node.pathFor("directoryGraph.dgml", imbSCI.Data.enums.getWritableFileMode.overwrite, "Directory structure Directed Graph in Microsoft DGML format - open in Visual Studio", true)); //var dot = dgml.ConvertToDOT(); //dot.Save(node.pathFor("directoryGraph.dot", imbSCI.Data.enums.getWritableFileMode.overwrite, "Directory structure Directed Graph in GraphVIZ DOT graph language format", true)); } node.generateReadmeFiles(appManager.AppInfo); }