Example #1
0
 private static void AddNodeLabel(GraphParams gp, StringBuilder sb, Term node)
 {
     sb.Append("\n  ");
     AppendLabel(sb, node);
     if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
     {
         sb.Append(" [label = ");
         AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(node)));
         sb.Append("]");
     }
 }
Example #2
0
 private static void AddNodeLabel(GraphParams gp, StringBuilder sb, Term node, bool accepting)
 {
     sb.Append("\n  ");
     AppendLabel(sb, node);
     if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
     {
         sb.Append(" [label = ");
         AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(node)));
         if (accepting)
         {
             sb.Append(", peripheries = 2");
         }
         sb.Append("]");
     }
     else if (accepting)
     {
         sb.Append(" [peripheries = 2]");
     }
 }
Example #3
0
        public static StringBuilder ToDot(GraphParams gp)
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("digraph ");
            //            AppendLabel(sb, finiteAutomatonContext.name);
            AppendLabel(sb, gp.name);
            sb.Append(" {\n\n  rankdir=");
            //            sb.Append(this.direction == GraphDirection.TopToBottom ? "TB" : "LR");
            sb.Append(gp.direction == GraphDirection.TopToBottom ? "TB" : "LR");

            sb.Append(";\n\n  //Initial state\n  node ");
            AppendInitialStateAttributes(gp, sb);
            sb.Append("\n  ");
            //            AppendLabel(sb, finiteAutomatonContext.fa.InitialState);
            AppendLabel(sb, gp.fa.InitialState);
            //            if (this.customStateLabelProvider != null && this.finiteAutomatonContext.stateProvider != null)
            if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
            {
                sb.Append(" [label = ");
                AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(gp.fa.InitialState)));
                sb.Append("]");
            }
            sb.Append("\n\n");

            sb.Append("  //Accepting states\n  node ");
            AppendAcceptingStateAttributes(gp, sb);
            //When we load an FSM from file, then how do we know this?
            foreach (Term node in gp.fa.States)
            {
                if (gp.fa.AcceptingStates.Contains(node) &&
                    !node.Equals(gp.fa.InitialState) &&
                    !(gp.safetyCheckIsOn && gp.unsafeNodes.Contains(node)))
                {
                    AddNodeLabel(gp, sb, node);
                }
            }
            sb.Append("\n\n");

            if (gp.livenessCheckIsOn)
            {
                sb.Append("  //Dead states\n  node ");
                AppendDeadStateAttributes(gp, sb);
                foreach (Term node in gp.fa.States)
                {
                    if (gp.deadNodes.Contains(node) && !node.Equals(gp.fa.InitialState))
                    {
                        AddNodeLabel(gp, sb, node);
                    }
                }
            }
            sb.Append("\n\n");

            if (gp.safetyCheckIsOn)
            {
                sb.Append("  //Unsafe states\n  node ");
                AppendUnsafeStateAttributes(gp, sb);
                foreach (Term node in gp.fa.States)
                {
                    if (gp.unsafeNodes.Contains(node) &&
                        !node.Equals(gp.fa.InitialState))
                    {
                        AddNodeLabel(gp, sb, node, gp.fa.AcceptingStates.Contains(node));
                    }
                }
            }
            sb.Append("\n\n");

            sb.Append("  //Safe live nonaccepting states\n  node ");
            AppendNonAcceptingStateAttributes(gp, sb);
            foreach (Term node in gp.fa.States)
            {
                if (!gp.fa.AcceptingStates.Contains(node) &&
                    !node.Equals(gp.fa.InitialState) &&
                    !(gp.livenessCheckIsOn && gp.deadNodes.Contains(node)) &&
                    !(gp.safetyCheckIsOn && gp.unsafeNodes.Contains(node)))
                {
                    AddNodeLabel(gp, sb, node);
                }
            }
            sb.Append("\n\n");

            sb.Append("  //Transitions");
            foreach (MultiLabeledTransition t in gp.transitionValues)
            {
                sb.Append("\n  ");
                AppendLabel(sb, t.startState);
                sb.Append(" -> ");
                AppendLabel(sb, t.endState);
                if (gp.transitionLabels != TransitionLabel.None)
                {
                    sb.Append(" [ label = ");
                    AppendLabel(sb, t.CombinedLabel(gp.transitionLabels == TransitionLabel.ActionSymbol));
                    sb.Append(" ];");
                }
            }
            sb.Append("\n}\n");
            return(sb);
        }
Example #4
0
 private static void AddNodeLabel(GraphParams gp, StringBuilder sb, Term node, bool accepting)
 {
     sb.Append("\n  ");
     AppendLabel(sb, node);
     if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
     {
         sb.Append(" [label = ");
         AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(node)));
         if (accepting)
             sb.Append(", peripheries = 2");
         sb.Append("]");
     }
     else if (accepting)
         sb.Append(" [peripheries = 2]");
 }
Example #5
0
 private static void AddNodeLabel(GraphParams gp, StringBuilder sb, Term node)
 {
     sb.Append("\n  ");
     AppendLabel(sb, node);
     if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
     {
         sb.Append(" [label = ");
         AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(node)));
         sb.Append("]");
     }
 }
Example #6
0
        public static StringBuilder ToDot(GraphParams gp)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("digraph ");
            //            AppendLabel(sb, finiteAutomatonContext.name);
            AppendLabel(sb, gp.name);
            sb.Append(" {\n\n  rankdir=");
            //            sb.Append(this.direction == GraphDirection.TopToBottom ? "TB" : "LR");
            sb.Append(gp.direction == GraphDirection.TopToBottom ? "TB" : "LR");

            sb.Append(";\n\n  //Initial state\n  node ");
            AppendInitialStateAttributes(gp,sb);
            sb.Append("\n  ");
            //            AppendLabel(sb, finiteAutomatonContext.fa.InitialState);
            AppendLabel(sb, gp.fa.InitialState);
            //            if (this.customStateLabelProvider != null && this.finiteAutomatonContext.stateProvider != null)
            if (gp.customStateLabelProvider != null && gp.faStateProvider != null)
            {
                sb.Append(" [label = ");
                AppendLabel(sb, gp.customStateLabelProvider(gp.faStateProvider(gp.fa.InitialState)));
                sb.Append("]");
            }
            sb.Append("\n\n");

            sb.Append("  //Accepting states\n  node ");
            AppendAcceptingStateAttributes(gp,sb);
            //When we load an FSM from file, then how do we know this?
            foreach (Term node in gp.fa.States)
            {
                if (gp.fa.AcceptingStates.Contains(node) &&
                    !node.Equals(gp.fa.InitialState) &&
                    !(gp.safetyCheckIsOn && gp.unsafeNodes.Contains(node)))
                {
                    AddNodeLabel(gp, sb, node);
                }
            }
            sb.Append("\n\n");

            if (gp.livenessCheckIsOn)
            {
                sb.Append("  //Dead states\n  node ");
                AppendDeadStateAttributes(gp,sb);
                foreach (Term node in gp.fa.States)
                {
                    if (gp.deadNodes.Contains(node) && !node.Equals(gp.fa.InitialState))
                    {
                        AddNodeLabel(gp, sb, node);
                    }
                }
            }
            sb.Append("\n\n");

            if (gp.safetyCheckIsOn)
            {
                sb.Append("  //Unsafe states\n  node ");
                AppendUnsafeStateAttributes(gp,sb);
                foreach (Term node in gp.fa.States)
                {
                    if (gp.unsafeNodes.Contains(node)
                        && !node.Equals(gp.fa.InitialState))
                    {
                        AddNodeLabel(gp,sb, node, gp.fa.AcceptingStates.Contains(node));
                    }
                }
            }
            sb.Append("\n\n");

            sb.Append("  //Safe live nonaccepting states\n  node ");
            AppendNonAcceptingStateAttributes(gp,sb);
            foreach (Term node in gp.fa.States)
            {
                if (!gp.fa.AcceptingStates.Contains(node) &&
                    !node.Equals(gp.fa.InitialState) &&
                    !(gp.livenessCheckIsOn && gp.deadNodes.Contains(node)) &&
                    !(gp.safetyCheckIsOn && gp.unsafeNodes.Contains(node)))
                {
                    AddNodeLabel(gp, sb, node);
                }
            }
            sb.Append("\n\n");

            sb.Append("  //Transitions");
            foreach (MultiLabeledTransition t in gp.transitionValues)
            {
                sb.Append("\n  ");
                AppendLabel(sb, t.startState);
                sb.Append(" -> ");
                AppendLabel(sb, t.endState);
                if (gp.transitionLabels != TransitionLabel.None)
                {
                    sb.Append(" [ label = ");
                    AppendLabel(sb, t.CombinedLabel(gp.transitionLabels == TransitionLabel.ActionSymbol));
                    sb.Append(" ];");
                }
            }
            sb.Append("\n}\n");
            return sb;
        }