Example #1
0
        internal static StringBuilder FSM2Dot(string name, string fsm)
        {
            FSM         fa = FSM.FromTerm(CompoundTerm.Parse(fsm));
            GraphParams gp = new GraphParams(name, fa);

            return(DotWriter.ToDot(gp));
        }
Example #2
0
 private static void AppendUnsafeStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = 1, fillcolor = ");
     sb.Append(gp.unsafeStateColor);
     sb.Append("]");
 }
Example #3
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 #4
0
 public void FSM2Dot1()
 {
     FSM fa=FSM.FromTerm(CompoundTerm.Parse(FSMTRIANGLE));
     GraphParams gp = new GraphParams("Test1",fa);
     StringBuilder sb = DotWriter.ToDot(gp);
     string s=sb.ToString();
     Regex r=new Regex("\\[ label = \"AssignColor\" \\];",RegexOptions.Multiline);
     int count=0;
     count = r.Matches(s).Count;
     Assert.AreEqual(42, count);
 }
Example #5
0
 private static void AppendInitialStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = ");
     if (gp.fa.AcceptingStates.Contains(gp.fa.InitialState))
     {
         sb.Append("2");
     }
     else
     {
         sb.Append("1");
     }
     sb.Append(", fillcolor = ");
     sb.Append(gp.initialStateColor);
     sb.Append("]");
 }
Example #6
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 #7
0
 private static void AppendNonAcceptingStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = 1, fillcolor = white]");
 }
Example #8
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 #9
0
 private static void AppendNonAcceptingStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = 1, fillcolor = white]");
 }
Example #10
0
 private static void AppendUnsafeStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = 1, fillcolor = ");
     sb.Append(gp.unsafeStateColor);
     sb.Append("]");
 }
Example #11
0
 private static void AppendInitialStateAttributes(GraphParams gp, StringBuilder sb)
 {
     sb.Append("[style = filled, shape = ");
     sb.Append(ToDotShape(gp.stateShape));
     sb.Append(", peripheries = ");
     if (gp.fa.AcceptingStates.Contains(gp.fa.InitialState))
         sb.Append("2");
     else
         sb.Append("1");
     sb.Append(", fillcolor = ");
     sb.Append(gp.initialStateColor);
     sb.Append("]");
 }
Example #12
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 #13
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 #14
0
 internal static StringBuilder FSM2Dot(string name, string fsm)
 {
     FSM fa = FSM.FromTerm(CompoundTerm.Parse(fsm));
     GraphParams gp = new GraphParams(name, fa);
     return DotWriter.ToDot(gp);
 }
Example #15
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;
        }