public void Write(ActivityArrowGraph graph)
        {
            using (var streamWriter = new StreamWriter(outputFilename))
            {
                ArrowDiagramGraphmlXmlDocumentBuilder graphmlXmlDocumentBuilder = new ArrowDiagramGraphmlXmlDocumentBuilder();

                foreach (var vertex in graph.Vertices)
                {
                    switch (vertex.Type)
                    {
                        case EventVertexType.Normal:
                            graphmlXmlDocumentBuilder.AddNode(vertex.Id, GraphmlNodeType.Normal);
                            break;
                        case EventVertexType.Milestone:
                            graphmlXmlDocumentBuilder.AddNode(vertex.Id, GraphmlNodeType.Milestone, vertex.MilestoneActivity.Id.ToString());
                            break;
                        case EventVertexType.GraphStart:
                            graphmlXmlDocumentBuilder.AddNode(vertex.Id, GraphmlNodeType.GraphStart);
                            break;
                        case EventVertexType.GraphEnd:
                            graphmlXmlDocumentBuilder.AddNode(vertex.Id, GraphmlNodeType.GraphEnd);
                            break;
                        default: break;

                    }
                }

                foreach (var edge in graph.Edges)
                {
                    if (edge.Activity != null)
                    {
                        var edgeType = GraphmlEdgeType.Activity;
                        if (edge.IsCritical)
                        {
                            edgeType = GraphmlEdgeType.CriticalActivity;
                        }

                        graphmlXmlDocumentBuilder.AddEdge(edge.Id, edge.Source.Id, edge.Target.Id, edgeType, edge.Activity.Id.ToString());
                    }
                    else
                    {
                        var edgeType = GraphmlEdgeType.Dummy;
                        if (edge.IsCritical)
                        {
                            edgeType = GraphmlEdgeType.CriticalDummy;
                        }

                        graphmlXmlDocumentBuilder.AddEdge(edge.Id, edge.Source.Id, edge.Target.Id, edgeType);
                    }
                }

                xmlSerializer.Serialize(streamWriter, graphmlXmlDocumentBuilder.Build());
                streamWriter.Close();
            }
        }
        private ActivityArrowGraph CreateResultActivityArrowGraph()
        {
            var activityArrowGraph = new ActivityArrowGraph();

            foreach (var edge in arrowGraph.Edges)
            {
                var sourceVertex = CreateVertexEvent(edge.Source, arrowGraph.InDegree(edge.Source), arrowGraph.OutDegree(edge.Source));
                var targetVertex = CreateVertexEvent(edge.Target, arrowGraph.InDegree(edge.Target), arrowGraph.OutDegree(edge.Target));

                Activity edgeActivity;

                TryGetActivity(edge, out edgeActivity);

                activityArrowGraph.AddEdge(CreateActivityEdge(sourceVertex, targetVertex, edgeActivity, edge.IsCritical));
            }

            return activityArrowGraph;
        }
        public void Write(ActivityArrowGraph graph)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("digraph G {\n");
            foreach (var vertex in graph.Vertices)
            {
                if (vertex.Type == EventVertexType.GraphEnd || vertex.Type == EventVertexType.GraphStart)
                {
                    sb.AppendFormat("{0} [ label=\"\" style=filled fillcolor=black ];\n", vertex.Id);
                }
                else
                {
                    sb.AppendFormat("{0} [ label=\"\" ];\n", vertex.Id);
                }
            }

            foreach (var edge in graph.Edges)
            {
                var penWidth = "1";
                if (edge.IsCritical)
                {
                    penWidth = "3";
                }

                if (edge.Activity != null)
                {
                    sb.AppendFormat("{0} -> {1} [ id={2} label={2} penwidth=\"{3}\" ];\n", edge.Source.Id, edge.Target.Id, edge.Activity.Id, penWidth);

                }
                else
                {
                    sb.AppendFormat("{0} -> {1} [ style=dashed penwidth=\"{2}\" ];\n", edge.Source.Id, edge.Target.Id, penWidth);
                }
            }
            sb.Append("}");

            using (var fwriter = File.Create(filename))
            {
                Byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString());
                fwriter.Write(info, 0, info.Length);
            }
        }