public DcrGraph RemoveRedundancy(DcrGraph inputGraph, BackgroundWorker worker = null) { _worker = worker; #if DEBUG Console.WriteLine("Started redundancy removal:"); #endif //TODO: use an algorithm to check if the graph is connected and if not then recursively remove redundancy on the subgraphs. //temporarily remove flower activities. var copy = inputGraph.Copy(); var removedActivities = copy.GetActivities().Where(x => (x.Included && !copy.ActivityHasRelations(x))).ToList(); foreach (var a in removedActivities) { copy.RemoveActivity(a.Id); } var byteDcrGraph = new ByteDcrGraph(copy); _uniqueTraceFinder = new UniqueTraceFinder(byteDcrGraph); _originalInputDcrGraph = copy.Copy(); OutputDcrGraph = copy; // Remove relations and see if the unique traces acquired are the same as the original. If so, the relation is clearly redundant and is removed immediately // All the following calls potentially alter the OutputDcrGraph RemoveRedundantRelations(RelationType.Response); RemoveRedundantRelations(RelationType.Condition); RemoveRedundantRelations(RelationType.InclusionExclusion); RemoveRedundantRelations(RelationType.Milestone); foreach (var activity in OutputDcrGraph.GetActivities()) { var graphCopy = new ByteDcrGraph(byteDcrGraph); graphCopy.RemoveActivity(activity.Id); ReportProgress?.Invoke("Removing Activity " + activity.Id); // Compare unique traces - if equal activity is redundant if (_uniqueTraceFinder.CompareTraces(graphCopy)) { // The relation is redundant, replace copy with current copy (with the relation removed) OutputDcrGraph.RemoveActivity(activity.Id); } } foreach (var a in removedActivities) { OutputDcrGraph.AddActivity(a.Id, a.Name); OutputDcrGraph.SetIncluded(true, a.Id); OutputDcrGraph.SetPending(a.Pending, a.Id); } var nested = OutputDcrGraph.ExportToXml(); return OutputDcrGraph; }