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("]"); } }
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]"); } }
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); }
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]"); }
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; }