Beispiel #1
0
 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);
 }
Beispiel #2
0
 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();
         }
     }
 }
Beispiel #3
0
 public void RemoveTwinVertex(TwinVertex tv)
 {
     if (!VertexHelper.DeleteTwinVertex(tv, Vertices))
     {
         throw new NoVertexException();
     }
 }
Beispiel #4
0
        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));
        }
Beispiel #6
0
 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);
     }
 }
Beispiel #7
0
        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);
        }
Beispiel #8
0
 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);
     }
 }
Beispiel #9
0
        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));
        }