public void RemoveEdge(TwinVertex tvFrom, TwinVertex tvTo, bool inMatching) { if (inMatching) { if (!ArcHelper.DoesArcExist(tvFrom.A, tvTo.B, Arcs)) { throw new NoArcException(); } if (!ArcHelper.DoesArcExist(tvTo.A, tvFrom.B, Arcs)) { throw new NoArcException(); } } else { if (!ArcHelper.DoesArcExist(tvFrom.B, tvTo.A, Arcs)) { throw new NoArcException(); } if (!ArcHelper.DoesArcExist(tvTo.B, tvFrom.A, Arcs)) { throw new NoArcException(); } } Log.Info("Removing edge " + tvFrom + " <-> " + tvTo + " M?: " + inMatching + " from TwinGraph"); RemoveArc(tvFrom, tvTo, inMatching); RemoveArc(tvTo, tvFrom, inMatching); }
public void RemoveArc(TwinVertex tvFrom, TwinVertex tvTo, bool inMatching) { Log.Info("Removing arc " + tvFrom + " -> " + tvTo + " M?: " + inMatching + " from TwinGraph"); if (inMatching) { if (ArcHelper.DeleteArc(tvFrom.A, tvTo.B, Arcs)) { tvFrom.A.RemoveArc(tvTo.B); } else { throw new NoArcException(); } } else { if (ArcHelper.DeleteArc(tvFrom.B, tvTo.A, Arcs)) { tvFrom.B.RemoveArc(tvTo.A); } else { throw new NoArcException(); } } }
public void RemoveTwinVertex(TwinVertex tv) { if (!VertexHelper.DeleteTwinVertex(tv, Vertices)) { throw new NoVertexException(); } }
public Tuple <Arc, Arc> AddEdge(TwinVertex startVertex, TwinVertex endVertex, bool inMatching) { ABVertex start1; ABVertex start2; ABVertex end1; ABVertex end2; if (inMatching) { start1 = startVertex.A; end1 = endVertex.B; start2 = endVertex.A; end2 = startVertex.B; } else { start1 = startVertex.B; end1 = endVertex.A; start2 = endVertex.B; end2 = startVertex.A; } var a1 = AddArc(start1, end1, inMatching); var a2 = AddArc(start2, end2, inMatching); return(new Tuple <Arc, Arc>(a1, a2)); }
public Tuple <Arc, Arc> AddEdge(TwinVertex tv, bool inMatching) { ABVertex start1; ABVertex start2; ABVertex end1; ABVertex end2; if (inMatching) { start1 = A; start2 = tv.A; end1 = B; end2 = tv.B; InMatching = true; } else { start1 = B; start2 = tv.B; end1 = A; end2 = tv.A; } var a1 = start1.AddOutboundArc(end2, inMatching); var a2 = start2.AddOutboundArc(end1, inMatching); return(new Tuple <Arc, Arc>(a1, a2)); }
public void AddTwinVertex(TwinVertex tv) { Log.Info("Adding TwinVertex " + tv.Name + " with precursor " + (tv.Precursor != null ? tv.Precursor.Name : "NULL")); Vertices.AddLast(tv); if (!tv.B.IsInMatching && !tv.A.IsInMatching) { AddArc(StartVertex, tv.B, false); AddArc(tv.A, EndVertex, false); } }
public static bool DeleteTwinVertex(TwinVertex tv, LinkedList <TwinVertex> fromList) { var twinVertex = fromList.First; while (twinVertex != null) { var nextTwinVertex = twinVertex.Next; if (twinVertex.Value == tv) { fromList.Remove(twinVertex); return(true); } twinVertex = nextTwinVertex; } return(false); }
public TwinGraph(Graph graph) : this() { Log.Info("Generating TwinGraph from Graph"); Log.Info("Generating twin vertices from vertices"); foreach (var vertex in graph.Vertices) { AddTwinVertex(new TwinVertex(vertex, this)); } Log.Info("Generating arcs for twin vertices from arcs"); foreach (var arc in graph.Arcs) { TwinVertex tv1 = Vertices.FirstOrDefault(tv => tv.Precursor.Guid == arc.Start.Guid); TwinVertex tv2 = Vertices.FirstOrDefault(tv => tv.Precursor.Guid == arc.End.Guid); AddArc(tv1, tv2, arc.IsInMatching); } }
public Arc AddArc(TwinVertex startVertex, TwinVertex endVertex, bool inMatching) { ABVertex start; ABVertex end; if (inMatching) { start = startVertex.A; end = endVertex.B; bool arcExisted = ArcHelper.DeleteArc(StartVertex, startVertex.B, Arcs); if (arcExisted) { StartVertex.RemoveArc(startVertex.B); } arcExisted = ArcHelper.DeleteArc(StartVertex, endVertex.B, Arcs); if (arcExisted) { StartVertex.RemoveArc(endVertex.B); } arcExisted = ArcHelper.DeleteArc(startVertex.A, EndVertex, Arcs); if (arcExisted) { startVertex.A.RemoveArc(EndVertex); } arcExisted = ArcHelper.DeleteArc(endVertex.A, EndVertex, Arcs); if (arcExisted) { endVertex.A.RemoveArc(EndVertex); } } else { start = startVertex.B; end = endVertex.A; } return(AddArc(start, end, inMatching)); }