diff --git a/python/spot/__init__.py b/python/spot/__init__.py index a78277c5b0c4e50d6bdec67a8cd29601da8517c7..ca68752845ca7deac3d0fd496fc10468bf8b48b9 100644 --- a/python/spot/__init__.py +++ b/python/spot/__init__.py @@ -122,13 +122,25 @@ class twa: return SVG(self._repr_svg_(opt)) def highlight_states(self, states, color): - for state in states: - self.highlight_state(state, color) + """Highlight a list of states. This can be a list of + state numbers, or a list of Booleans.""" + for idx, val in enumerate(states): + if type(val) is bool: + if val: + self.highlight_state(idx, color) + else: + self.highlight_state(val, color) return self def highlight_edges(self, edges, color): - for edge in edges: - self.highlight_edge(edge, color) + """Highlight a list of edges. This can be a list of + edge numbers, or a list of Booleans.""" + for idx, val in enumerate(edges): + if type(val) is bool: + if val: + self.highlight_edge(idx, color) + else: + self.highlight_edge(val, color) return self @_extend(twa) diff --git a/tests/python/highlighting.ipynb b/tests/python/highlighting.ipynb index cc4dcefbafeae3c4d63b029e4bc551ac0f46b0dd..1d89b59e755f10cd2e459a9b3ee84aeed9db685c 100644 --- a/tests/python/highlighting.ipynb +++ b/tests/python/highlighting.ipynb @@ -15,7 +15,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.3" + "version": "3.6.4" }, "name": "" }, @@ -254,7 +254,7 @@ "\n" ], "text": [ - " *' at 0x7efde042fbd0> >" + " *' at 0x7fe1205e8990> >" ] } ], @@ -356,12 +356,112 @@ "\n" ], "text": [ - " *' at 0x7efde03c0a50> >" + " *' at 0x7fe1205e8a80> >" ] } ], "prompt_number": 5 }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The plural version can take a list or tuple of state numbers (as above) or of Booleans (as below). In the latter case the indices of the True values give the states to highlight." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "a.highlight_states([False, True, True], 5)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 6, + "svg": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "\n", + "\n", + "2\n", + "\n", + "2\n", + "\n", + "\n", + "I->2\n", + "\n", + "\n", + "\n", + "\n", + "2->2\n", + "\n", + "\n", + "a & !c\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "0\n", + "\n", + "\n", + "2->0\n", + "\n", + "\n", + "c\n", + "\n", + "\n", + "1\n", + "\n", + "1\n", + "\n", + "\n", + "2->1\n", + "\n", + "\n", + "!a & b & !c\n", + "\n", + "\n", + "0->0\n", + "\n", + "\n", + "1\n", + "\n", + "\n", + "1->0\n", + "\n", + "\n", + "c\n", + "\n", + "\n", + "1->1\n", + "\n", + "\n", + "b & !c\n", + "\n", + "\n", + "\n" + ], + "text": [ + " *' at 0x7fe1205e8990> >" + ] + } + ], + "prompt_number": 6 + }, { "cell_type": "markdown", "metadata": {}, @@ -414,7 +514,7 @@ "Acceptance: 1 Inf(0)\n", "properties: trans-labels explicit-labels state-acc !complete\n", "properties: deterministic stutter-invariant terminal\n", - "spot.highlight.states: 0 0 1 0\n", + "spot.highlight.states: 0 0 1 5 2 5\n", "spot.highlight.edges: 2 1 4 1 5 1 6 2\n", "--BODY--\n", "State: 0 {0}\n", @@ -430,7 +530,7 @@ ] } ], - "prompt_number": 6 + "prompt_number": 7 }, { "cell_type": "markdown", @@ -455,7 +555,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 7, + "prompt_number": 8, "svg": [ "\n", "\n" ], "text": [ - " *' at 0x7efde03c0930> >" + " *' at 0x7fe12058d1b0> >" ] } ], - "prompt_number": 7 + "prompt_number": 8 }, { "cell_type": "code", @@ -589,7 +689,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 8, + "prompt_number": 9, "text": [ "Prefix:\n", " 0\n", @@ -602,7 +702,7 @@ ] } ], - "prompt_number": 8 + "prompt_number": 9 }, { "cell_type": "code", @@ -613,7 +713,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 9 + "prompt_number": 10 }, { "cell_type": "markdown", @@ -634,7 +734,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 10, + "prompt_number": 11, "svg": [ "\n", "\n" ], "text": [ - " *' at 0x7efde03c0930> >" + " *' at 0x7fe12058d1b0> >" ] } ], - "prompt_number": 10 + "prompt_number": 11 }, { "cell_type": "markdown", @@ -830,7 +930,7 @@ "\n" ], "text": [ - " *' at 0x7efde035c270> >" + " *' at 0x7fe12058d2d0> >" ] }, { @@ -876,11 +976,11 @@ "\n" ], "text": [ - " *' at 0x7efde035c2d0> >" + " *' at 0x7fe12058d150> >" ] } ], - "prompt_number": 11 + "prompt_number": 12 }, { "cell_type": "code", @@ -894,7 +994,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 12, + "prompt_number": 13, "svg": [ "\n", "\n" ], "text": [ - " *' at 0x7efde03c09c0> >" + " *' at 0x7fe12058d2a0> >" ] } ], - "prompt_number": 12 + "prompt_number": 13 }, { "cell_type": "code", @@ -980,7 +1080,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 13, + "prompt_number": 14, "text": [ "Prefix:\n", " 1,0\n", @@ -993,7 +1093,7 @@ ] } ], - "prompt_number": 13 + "prompt_number": 14 }, { "cell_type": "code", @@ -1008,7 +1108,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 14 + "prompt_number": 15 }, { "cell_type": "code", @@ -1089,7 +1189,7 @@ "\n" ], "text": [ - " *' at 0x7efde03c09c0> >" + " *' at 0x7fe12058d2a0> >" ] }, { @@ -1146,7 +1246,7 @@ "\n" ], "text": [ - " *' at 0x7efde035c270> >" + " *' at 0x7fe12058d2d0> >" ] }, { @@ -1192,11 +1292,11 @@ "\n" ], "text": [ - " *' at 0x7efde035c2d0> >" + " *' at 0x7fe12058d150> >" ] } ], - "prompt_number": 15 + "prompt_number": 16 }, { "cell_type": "markdown", @@ -1399,7 +1499,7 @@ "\n" ], "text": [ - " *' at 0x7efde042fc00> >" + " *' at 0x7fe12058d210> >" ] }, { @@ -1473,7 +1573,7 @@ "\n" ], "text": [ - " *' at 0x7efde035c180> >" + " *' at 0x7fe12058d1e0> >" ] }, { @@ -1557,11 +1657,11 @@ "\n" ], "text": [ - " *' at 0x7efde03c0990> >" + " *' at 0x7fe12058d270> >" ] } ], - "prompt_number": 16 + "prompt_number": 17 }, { "cell_type": "markdown", @@ -1587,7 +1687,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 17, + "prompt_number": 18, "svg": [ "\n", "\n" ], "text": [ - " *' at 0x7efde035c750> >" + " *' at 0x7fe12058d330> >" ] } ], - "prompt_number": 17 + "prompt_number": 18 }, { "cell_type": "markdown", @@ -1732,7 +1832,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 18, + "prompt_number": 19, "svg": [ "\n", "\n" ], "text": [ - " *' at 0x7efde035c750> >" + " *' at 0x7fe12058d330> >" ] } ], - "prompt_number": 18 + "prompt_number": 19 }, { "cell_type": "markdown", @@ -1991,7 +2091,7 @@ "\n" ], "text": [ - " *' at 0x7efde035c750> >" + " *' at 0x7fe12058d330> >" ] }, { @@ -2152,7 +2252,7 @@ ] } ], - "prompt_number": 19 + "prompt_number": 20 }, { "cell_type": "markdown", @@ -2177,7 +2277,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 20, + "prompt_number": 21, "svg": [ "\n", "\n", @@ -2382,7 +2482,7 @@ ] } ], - "prompt_number": 20 + "prompt_number": 21 } ], "metadata": {}