We are happy to announce the release of Spot 2.6.2
This is a maintenance release containing minor bug fixes. This also
removes the source code for the online translator, that has been
replaced by a separate (and rewritten) web application.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.6.2.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
As always, please direct any feedback to <spot(a)lrde.epita.fr>.
New in spot 2.6.2 (2018-09-28)
Build:
- We no longer distribute the Python-based CGI script + javascript
code for the online translator. Its replacement has its own
repository: https://gitlab.lrde.epita.fr/spot/spot-web-app/
Library:
- When states are highlighted with more than 8 colors, print_dot()
will add some extra markers to help distinguishing the colors.
This helps with the fact that colors 8-15 are lighter versions of
colors 0-7, and that higher color numbers cycle into this 16-color
palette.
Bugs fixed:
- exclusive_ap::constrain() (called by autfilt --exclusive-ap=...)
would incorrectly copy the "universal" property of the input
automaton, causing print_hoa() to fail.
- configure --disable-doxygen would actually enable it.
- Fix several warnings emited by the development version of GCC.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.6.1
This is a maintenance release containing mostly bug fixes. The only
exception is the straightforward --suspendable option added to ltlfilt.
This release contains code contributed by Etienne Renault, Maximilien
Colange, Antoine Martin, and myself. Noteworthy changes are given at
the end of this email.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.6.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
As always, please direct any feedback to <spot(a)lrde.epita.fr>.
New in spot 2.6.1 (2018-08-04)
Command-line tools:
- "ltlfilt --suspendable" is now a synonym for
"ltlfilt --universal --eventual".
Bugs fixed:
- scc_info::split_on_sets() did not correctly register the
atomic propositions of the returned automata.
- The spot::tl_simplifier class could raise an exception while
attempting to reduce formulas containing unsimplified <->, -> or
xor, if options nenoform_stop_on_boolean and synt_impl are both
set. (This combination of options is not available from
command-line tools.)
- The spot::contains(a, b) function introduced in 2.6 was testing
a⊆b instead of a⊇b as one would expect. Infortunately the
documentation was also matching the code, so this is a backward
incompatible change, but a short-lived one.
- The Python binding of the getter of spot::parsed_formula::f was
returning a reference instead of a copy, causing issues if the
reference outlasted the parsed_formula struct.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.6.
Spot is a library of algorithms for manipulating LTL formulas and
omega-automata (objects as commonly used in model checking).
This release contains code contributed by Maximilien Colange, Antoine
Martin, and myself. A detailed list of new features in this new
release is given at the end of this email. You can find the new
release here:
http://www.lrde.epita.fr/dload/spot/spot-2.6.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions. Note that the unstable Debian packages and
stable RPM packages should be available within 24h.
As always, please direct any feedback to <spot(a)lrde.epita.fr>.
New in spot 2.6 (2018-07-04)
Command-line tools:
- autfilt learned --is-colored to filter automata that use
exactly one acceptance set per mark or transition.
- autfilt learned --has-univ-branching and --has-exist-branching
to keep automata that have universal branching, or that make
non-deterministic choices.
- autcross' tool specifications now have %M replaced by the name of
the input automaton.
- autcross now aborts if there is any parser diagnostic for the
input automata (previous versions would use the input automaton
whenever the parser would manage to read something).
- ltlcross, ltldo, and autcross learned shorthands to call
delag, ltl2dra, ltl2dgra, and nba2dpa.
- When autfilt is asked to build a Büchi automaton from
of a chain of many products, as in
"autfilt -B --product 1.hoa ... --product n.hoa in.hoa"
then it will automatically degeneralize the intermediate
products to avoid exceeding the number of supported
acceptance sets.
- genltl learned to generate six new families of LTL formulas:
--gf-equiv-xn=RANGE GF(a <-> X^n(a))
--gf-implies-xn=RANGE GF(a -> X^n(a))
--sejk-f=RANGE[,RANGE] f(0,j)=(GFa0 U X^j(b)), f(i,j)=(GFai U
G(f(i-1,j)))
--sejk-j=RANGE (GFa1&...&GFan) -> (GFb1&...&GFbn)
--sejk-k=RANGE (GFa1|FGb1)&...&(GFan|FGbn)
--sejk-patterns[=RANGE] φ₁,φ₂,φ₃ from Sikert et al's [CAV'16]
paper (range should be included in 1..3)
- genltl --ms-example can now take a two-range argument,
(as --sejk-f above).
Build:
- ./configure --enable-max-accsets=N let you specify a maximum
number of acceptance sets that Spot should support. The default
is still 32, but this limit is no longer hardcoded. Larger values
will cost additional memory and time.
- We know distribute RPM packages for Fedora 28. See
file:///home/adl/git/spot/doc/userdoc/install.html#Fedora
Library:
- The PSL/LTL simplification routine learned the following:
q R Xf = X(q R f) if q is suspendable
q U Xf = X(q U f) if q is suspendable
{SERE;1} = {1} if {SERE} accepts [*0]
{SERE;1} = {SERE} if {SERE} does not accept [*0]
- gf_guarantee_to_ba() is a specialized construction for translating
formulas of the form GF(guarantee) to BA or DBA, and
fg_safety_to_dca() is a specialized construction for translating
formulas of the form FG(safety) to DCA. These are generalizations
of some constructions proposed by J. Esparza, J. Křentínský, and
S. Sickert (LICS'18).
These are now used by the main translation routine, and can be
disabled by passing -x '!gf-guarantee' to ltl2tgba. For example,
here are the size of deterministic transition-based generalized
Büchi automata constructed from four GF(guarantee) formulas with
two versions of Spot, and converted to other types of
deterministic automata by other tools distributed with Owl 18.06.
"x(y)" means x states and y acceptance sets.
ltl2tgba -D delag ltl2dra
2.5 2.6 18.06 18.06
------------------------- ----------- -------------
GF(a <-> XXa) 9(1) 4(1) 4(2) 9(4)
GF(a <-> XXXa) 27(1) 8(1) 8(2) 25(4)
GF(((a & Xb) | XXc) & Xd) 6(1) 4(1) 16(1) 5(2)
GF((b | Fa) & (b R Xb)) 6(2) 2(1) 3(4) 3(4)
Note that in the above the automata produced by 'ltl2tgba -D' in
version 2.5 were not deterministic (because -D is only a
preference). They are deterministic in 2.6 and other tools.
- spot::product() and spot::product_or() learned to produce an
automaton with a simpler acceptance condition if one of the
argument is a weak automaton. In this case the resulting
acceptance condition is (usually) that of the other argument.
- spot::product_susp() and spot::product_or_susp() are new
functions for building products between an automaton A and
a "suspendable" automaton B. They are also optimized for
the case that A is weak.
- When 'generic' acceptance is enabled, the translation routine will
split the input formula on Boolean operators into components that
are syntactically 'obligation', 'suspendable', or 'something
else'. Those will be translated separately and combined with
product()/product_susp(). This is inspired by the ways things are
done in ltl2dstar or delag, and can be disabled by passing option
-xltl-split=0, as in ltl2tgba -G -D -xltl-split=0. Here are the
sizes of deterministic automata (except for ltl3tela which produces
non-deterministic automata) produced with generic acceptance
using two versions of ltl2tgba and other tools for reference.
ltl2tgba -DG delag ltl3tela
2.5 2.6 18.06 1.1.2
------------ ------- --------
FGa0&GFb0 2(2) 1(2) 1(2) 1(2)
(FGa1&GFb1)|FGa0|GFb0 16(6) 1(4) 1(4) 1(9)
(FGa2&GFb2)|((FGa1|GFb1)&FGa0&GFb0) 29(8) 1(6) 1(6) 3(11)
FGa0|GFb0 5(4) 1(2) 1(2) 1(5)
(FGa1|GFb1)&FGa0&GFb0 8(4) 1(4) 1(4) 1(7)
(FGa2|GFb2)&((FGa1&GFb1)|FGa0|GFb0) 497(14) 1(6) 1(6) 1(14)
GFa1 <-> GFz 4(6) 1(3) 1(4) 1(7)
(GFa1 & GFa2) <-> GFz 8(4) 1(3) 1(6) 3(10)
(GFa1 & GFa2 & GFa3) <-> GFz 21(4) 1(4) 1(8) 3(13)
GFa1 -> GFz 5(4) 1(2) 1(2) 1(5)
(GFa1 & GFa2) -> GFz 12(4) 1(3) 1(3) 1(6)
(GFa1 & GFa2 & GFa3) -> GFz 41(4) 1(4) 1(4) 1(7)
FG(a|b)|FG(!a|Xb) 4(2) 2(2) 2(2) 2(3)
FG(a|b)|FG(!a|Xb)|FG(a|XXb) 21(2) 4(3) 4(3) 4(4)
FG(a|b)|FG(!a|Xb)|FG(a|XXb)|FG(!a|XXXb) 170(2) 8(4) 8(4) 8(5)
- For 'parity' output, the 'ltl-split' optimization just separates
obligation subformulas from the rest, where a determinization is
still performed.
ltl2tgba -DP ltl3dra ltl2dpa
2.5 2.6 0.2.3 18.06
-------------- ------- -------
FGp0 & (Gp1 | XFp2) 6(2) 4(1) 4(1) 4(2)
G!p0 | F(p0 & (!p1 W p2)) 5(2) 4(2) n/a 5(2)
(p0 W XXGp0) & GFp1 & FGp2 6(2) 5(2) n/a 6(3)
(The above just show a few cases that were improved. There are
many cases where ltl2dpa still produces smaller automata.)
- The automaton postprocessor will now simplify acceptance
conditions more aggressively, calling spot::simplify_acceptance()
or spot::cleanup_acceptance() depending on the optimization level.
- print_dot(), used to print automata in GraphViz's format,
underwent several changes:
* option "a", for printing the acceptance condition, is now
enabled by default. Option "A", introduced in Spot 2.4, can be
used to hide the acceptance condition in case you do not want
it. This change of course affects the --dot option of all the
command-line tools, as well as the various way to display
automata using the Python bindings.
* when option "1" is used to hide state names and force the
display of state numbers, the actual state names is now moved to
the "tooltip" field of the state. The SVG files produced by
"dot -Tsvg" will show those as popups. This is also done for
state labels of Kripke structures.
* the output digraph is now named using the name of the automaton
if available, or the empty string otherwise. (Previous versions
used to call all digraphs "G".) This name appears as a tooltip
in SVG figures when the mouse is over the acceptance condition.
* a new option "u" hides "true states" behind "exiting
transitions". This can be used to display alternating automata
in a way many people expect.
* a new option "K" cancels the effect of "k" (which uses state
labels whenever possible). This is most useful when one want to
force transition-labeling of a Kripke structure, where "k" is
usually the default.
- spot::twa_graph::merge_states() is a new method that merges states
with the exact same outgoing edges. As it performs no reordering
of the edges, it is better to call it when you know that the edges
in the twa_graph are sorted (e.g. after a call to merge_edges()).
- spot::twa_graph::purge_unreachable_states() now takes a function
which is called with the new numbering of states. This is useful
to update an external structure that references states of the twa
that we want to purge.
- spot::scc_filter() now automatically turns automata marked as
inherently-weak into weak automata with state-based acceptance.
The acceptance condition is set to Büchi unless the input had
co-Büchi or t acceptance. spot::scc_filter_states() will pass
inherently-weak automata to spot::scc_filter().
- spot::cleanup_parity() and spot::cleanup_parity_here() are smarter
and now remove from the acceptance condition the parity colors
that are not used in the automaton.
- spot::contains() and spot::are_equivalent() can be used to
check language containement between two automata or formulas.
They are most welcome in Python, since we used to redefine
them every now and them. Some examples are shown in
https://spot.lrde.epita.fr/ipynb/contains.html
- aut1->exclusive_word(aut2) is a new method that returns a word
accepted by aut1 or aut2 but not both. The exclusive_run()
variant will return. This is useful when comparing automata and
looking for differences. See also
https://spot.lrde.epita.fr/ipynb/contains.html
- spot::complement_semidet(aut) is a new function that returns the
complement of aut, where aut is a semideterministic automaton. The
function uses the NCSB complementation algorithm proposed by
F. Blahoudek, M. Heizmann, S. Schewe, J. Strejček, and MH. Tsai
(TACAS'16).
- spot::remove_alternation() was slightly improved on very-weak
alternating automata: the labeling of the outgoing transitions in
the resulting TGBA makes it more likely that simulation-based
reductions will reduce it.
- When applied to automata that are not WDBA-realizable,
spot::minimize_wdba() was changed to produce an automaton
recognizing a language that includes the original one. As a
consequence spot::minimize_obligation() and
spot::is_wdba_realizable() now only need one containement check
instead of two.
- Slightly improved log output for the SAT-based minimization
functions. The CSV log files now include an additional column
with the size of the reference automaton, and they now have a
header line. These log files give more details and are more
accurate in the case of incremental SAT-solving.
Python:
- New spot.jupyter package. This currently contains a function for
displaying several arguments side by side in a Jupyter notebook.
See https://spot.lrde.epita.fr/ipynb/alternation.html for some
examples.
- Strings are now implicitely converted into formulas when passed
as arguments to functions that expect formulas. Previously this
was done only for a few functions.
- The Python bindings for sat_minimize() now have display_log and
return_log options; these are demonstrated on the new
https://spot.lrde.epita.fr/ipynb/satmin.html page.
Bugs fixed:
- Python *.py and *.so files are now always installed into the same
directory. This was an issue on systems like Fedora that separate
plateform-specific packages from non-plateform-specific ones.
- print_dot() will correctly escape strings containing \n in HTML
mode.
- The HOA parser will now accept Alias: declarations that occur
before AP:.
- The option --allow-dups of randltl now works properly.
- Converting generalized-co-Büchi to Streett using dnf_to_nca()
could produce bogus automata if the input had rejecting SCCs.
Deprecation notices:
- The type spot::acc_cond::mark_t has been overhauled and uses
a custom bit-vector to represent acceptance sets instead of
storing everything in a "unsigned int". This change is
to accomodate configure's --enable-max-accsets=N option and
has several effect:
* The following shortcuts are deprecated:
acc_cond::mark_t m1 = 0U;
acc_cond::mark_t m2 = -1U;
instead, use:
acc_cond::mark_t m1 = {};
acc_cond::mark_t m2 = acc_cond::mark_t::all();
* acc_cond::mark_t::value_t is deprecated. It is now only
defined when --enable-max-accsets=32 (the default) and
equal to "unsigned" for backward compatibility reasons.
Backward incompatibilities:
- Functions spot::parity_product() and spot::parity_product_or()
were removed. The code was unused, hard to maintain, and bogus.
- The output of print_dot() now include the acceptance condition.
Add option "A" (supported since version 2.4) to cancel that.
- Because genltl now supports LTL pattern with two argumens, using
--format=%L may output two comma-separated integer. This is an
issue if you used to produce CSV files using for instance:
genltl --format='%F,%L,%f' ...
Make sure to quote %L to protect the potential commas:
genltl --format='%F,"%L",%f' ...
- In Spot 2.5 and prior running "ltl2tgba --generic --det" on some
formula would attempt to translate it as deterministic TGBA or
determinize it into an automaton with parity acceptance. Version
2.5 introduced --parity to force parity acceptance on the output.
This version finally gives --generic some more natural semantics:
any acceptance condition can be used.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.5.3
This is a maintenance release containing only bug fixes.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.5.3.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions. As always, please direct any feedback to
<spot(a)lrde.epita.fr>
New in spot 2.5.3 (2018-04-20)
Bugs fixed:
- "autfilt --cobuchi --small/--det" would turn a transition-based
co-Büchi automaton into a state-based co-Büchi.
- Fix cryptic error message from Python's spot.translate() and
spot.postprocess() when supplying conflicting arguments.
- "autfilt -B --sat-minimize" was incorrectly producing
transition-based automata.
- Using spot.automata("cmd...|") to read just a few automata out of
an infinite stream would not properly terminate the command.
- The is_unambiguous() check (rewritten in Spot 2.2) could mark some
unambiguous automata as ambiguous.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.5.2
This is a maintenance release containing fixes for some
minor issues discovered since 2.5.1.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.5.2.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions. As always, please send any feedback to
<spot(a)lrde.epita.fr>.
New in spot 2.5.2 (2018-03-25)
Bugs fixed:
- acc_cond::is_generalized_rabin() and
acc_cond::is_generalized_streett() would segfault on weird
acceptance conditions such as "3 t" or "3 f".
- remove_fin() and streett_to_generalized_buchi() should never
return automata with "f" acceptance.
- "autfilt --acceptance-is=Fin-less" no longer accept automata
with "f" acceptance.
- twa_run methods will now diagnose cases where the cycle is
unexpectedly empty instead of segfaulting.
- spot::closure(), used by default for testing stutter-invariance,
was using an optimization incorrect if the acceptance condition
had some Fin(x). Consequently stutter-invariance tests for
automata, for instance with "autfilt --is-stutter-invariant",
could be to be wrong (even if the input does not use Fin(x), its
complement, used in the stutter-invariance test likely will).
Stutter-invariance checks of LTL formulas are not affected.
--
Alexandre Duret-Lutz
Spot 2.5.1 has been released. This maintenance release
fixes some serious bugs that have been found in Spot 2.5,
see below for a list. The fixes were contributed by
Maximilien Colange and myself.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.5.1.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
As always, please direct any feedback to <spot(a)lrde.epita.fr>.
You may also report bugs directly on
https://gitlab.lrde.epita.fr/spot/spot/issues
New in spot 2.5.1 (2018-02-20)
Library:
- iar() and iar_maybe() now also handle Streett-like conditions.
Bugs fixed:
- iar() and iar_maybe() properly handle Rabin-like conditions.
- streett_to_generalized_buchi() could produce incorrect result on
Streett-like input with acceptance like (Inf(0)|Fin(1))&Fin(1)
where some Fin(x) is used both with and without a paired Fin(y).
- is_generalized_rabin() had a typo that caused some non-simplified
acceptance conditions like Fin(0)|(Fin(0)&Inf(1)) to be
incorrectly detecteded as generalized-Rabin 2 0 1 and then output
as Fin(0)|(Fin(1)&Inf(2)) instead. Likewise for
is_generalized_streett
- the conversion from Rabin to Büchi was broken on Rabin-like
acceptance condition where one pair used Fin(x) and another pair
used Inf(x) with the same x. Unfortunately, this situation could
also occur as a side effect of simplifying the acceptance
condition (by merging identical set) of some automaton prior to
converting it to Büchi.
- dnf_to_dca() was mishandling some Rabin-like input.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.5.
Spot is a library of algorithms for manipulating LTL formulas and
omega-automata (objects as commonly used in model checking).
A detailed list of new features in this new release is given at the end
of this email. The main features of this release are algorithms for
working with parity acceptance, new functions to convert to co-Büchi
when possible, a new tool for LTL synthesis, and some speedup
of our determinization algorithm.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.5.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
(Note that due to some technical issues on our side, it might
be a few days before the packages for Debian *unstable*
are updated.)
This release contains code contributed by Alexandre Gbaguidi Aïsse,
Thibaud Michaud, Laurent Xu, Maximilien Colange, Etienne Renault,
and myself.
As always, please direct any feedback to <spot(a)lrde.epita.fr>.
New in spot 2.5 (2018-01-20)
Build:
- We no longer distribute the doxygen-generated documentation in
the tarball of Spot to save space. This documentation is still
available online at https://spot.lrde.epita.fr/doxygen/. If you
want to build a local copy you can configure Spot with
--enable-doxygen, or simply run "cd doc && make doc".
- All the images that illustrate the documentation have been
converted to SVG, to save space and improve quality.
Tools:
- ltlsynt is a new tool for synthesizing a controller from LTL/PSL
specifications.
- ltlcross learned --reference=COMMANDFMT to specify a translator
that should be trusted. Doing so makes it possible to reduce the
number of tests to be performed, as all other translators will be
compared to the reference's output when available. Multiple
reference can be given; in that case other tools are compared
against the smallest reference automaton.
- autcross, ltlcross, and ltldo learned --fail-on-timeout.
- ltl2tgba, autfilt, and dstar2tgba have some new '--parity' and
'--colored-parity' options to force parity acceptance on the
output. Different styles can be requested using for instance
--parity='min odd' or --parity='max even'.
- ltl2tgba, autfilt, and dstar2tgba have some new '--cobuchi' option
to force co-Büchi acceptance on the output. Beware: if the input
language is not co-Büchi realizable the output automaton will
recognize a superset of the input. Currently, the output is
always state-based.
- genltl learned to generate six new families of formulas, taken from
the SYNTCOMP competition on reactive synthesis, and from from
Müller & Sickert's GandALF'17 paper:
--gf-equiv=RANGE (GFa1 & GFa2 & ... & GFan) <-> GFz
--gf-implies=RANGE (GFa1 & GFa2 & ... & GFan) -> GFz
--ms-example=RANGE GF(a1&X(a2&X(a3&...)))&F(b1&F(b2&F(b3&...)))
--ms-phi-h=RANGE FG(a|b)|FG(!a|Xb)|FG(a|XXb)|FG(!a|XXXb)|...
--ms-phi-r=RANGE (FGa{n}&GFb{n})|((FGa{n-1}|GFb{n-1})&(...))
--ms-phi-s=RANGE (FGa{n}|GFb{n})&((FGa{n-1}&GFb{n-1})|(...))
- autfilt learned --streett-like to convert automata with DNF
acceptance into automata with Streett-like acceptance.
- autfilt learned --acceptance-is=ACC to filter automata by
acceptance condition. ACC can be the name of some acceptance
class (e.g. Büchi, Fin-less, Streett-like) or a precise acceptance
formula in the HOA syntax.
- ltldo learned to limit the number of automata it outputs using -n.
- ltlfilt learned to measure wall-time using --format=%r, and
cpu-time with --format=%R.
- The --format=%g option of tools that output automata used to
print the acceptance condition as a *formula* in the HOA format.
This %g may now take optional arguments to print the acceptance
*name* in different formats. For instance
... | autfilt -o '%[s]g.hoa'
will separate a stream of automata into different files named
by their acceptance name (Buchi, co-Buchi, Streett, etc.) or
"other" if no name is known for the acceptance condition.
- Tools that produce formulas now support --format=%[OP]n to
display the nesting depth of operator OP.
- The new -x tls-impl=N option allows to fine-tune the
implication-based simplification rules of ltl2tgba. See the
spot-x(7) man page for details.
- All tools learned to check the SPOT_OOM_ABORT environment
variable. This is only useful for debuging out-of-memory
conditions. See the spot-x(7) man page for details.
New functions in the library:
- spot::iar() and spot::iar_maybe() use index appearance records (IAR)
to translate Rabin-like automata into equivalent parity automaton.
This translation preserves determinism and is especially useful when
the input automaton is deterministic.
- spot::print_aiger() encodes an automaton as an AIGER circuit, as
required by the SYNTCOMP competition. It relies on a new named
property "synthesis outputs" that describes which atomic
propositions are to be encoded as outputs of the circuits.
- spot::dnf_to_streett() converts any automaton with a DNF
acceptance condition into a Streett-like automaton.
- spot::nsa_to_nca(), spot::dfn_to_nca(), spot::dfn_to_dca(), and
spot::nsa_to_dca(), convert automata with DNF or Streett-like
acceptance into deterministic or non-deterministic co-Büchi
automata. spot::to_dca() and spot::to_nca() dispatch between
these four functions. The language of produced automaton includes
the original language, but may be larger if the original automaton
is not co-Büchi realizable. Based on Boker & Kupferman FOSSACS'11
paper. Currently only supports state-based output.
- spot::scc_info::states_on_acc_cycle_of() returns all states
visited by any accepting cycle of the specified SCC. It only
works on automata with Streett-like acceptance.
- spot::is_recurrence(), spot::is_persistence(), and
spot::is_obligation() test if a formula is a recurrence,
persistance or obligation. The SPOT_PR_CHECK and SPOT_O_CHECK
environment variables can be used to select between multiple
implementations of these functions (see the spot-x(7) man page).
- spot::is_colored() checks if an automaton is colored
(i.e., every transition belongs to exactly one acceptance set).
- spot::change_parity() converts between different parity acceptance
conditions.
- spot::colorize_parity() transforms an automaton with parity
acceptance into a colored automaton (which is often what people
working with parity automata expect).
- spot::cleanup_parity_acceptance() simplifies a parity acceptance
condition.
- spot::parity_product() and spot::parity_product_or() are
specialized (but expensive) products that preserve parity
acceptance.
- spot::remove_univ_otf() removes universal transitions on the fly
from an alternating Büchi automaton using Miyano and Hayashi's
breakpoint algorithm.
- spot::stutter_invariant_states(),
spot::stutter_invariant_letters(),
spot::highlight_stutter_invariant_states(), ... These functions
help study a stutter-sensitive automaton and detect the subset of
states that are stutter-invariant. See
https://spot.lrde.epita.fr/ipynb/stutter-inv.html for examples.
- spot::acc_cond::name(fmt) is a new method that names well-known
acceptance conditions. The fmt parameter specifies the format to
use for that name (e.g. to the style used in HOA, or that used by
print_dot()).
- spot::formula::is_leaf() method can be used to detect formulas
without children (atomic propositions, or constants).
- spot::nesting_depth() computes the nesting depth of any LTL
operator.
- spot::check_determinism() sets both prop_semi_deterministic()
and prop_universal() appropriately.
Improvements to existing functions in the library:
- spot::tgba_determinize() has been heavily rewritten and
optimized. The algorithm has (almost) not changed, but it is
much faster now. It also features an optimization for
stutter-invariant automata that may produce slightly smaller
automata.
- spot::scc_info now takes an optional argument to disable some
features that are expensive and not always necessary. By
default scc_info tracks the list of all states that belong to an
SCC (you may now ask it not to), tracks the successor SCCs of
each SCC (that can but turned off), and explores all SCCs of the
automaton (you may request to stop on the first SCC that is
found accepting).
- In some cases, spot::degeneralize() would output Büchi automata
with more SCCs than its input. This was hard to notice, because
very often simulation-based simplifications remove those extra
SCCs. This situation is now detected by spot::degeneralized()
and fixed before returning the automaton. A new optional
argument can be passed to disable this behavior (or use -x
degen-remscc=0 from the command-line).
- The functions for detecting stutter-invariant formulas or
automata have been overhauled. Their interface changed
slightly. They are now fully documented.
- spot::postprocessor::set_type() can now request different forms
of parity acceptance as output. However currently the
conversions are not very smart: if the input does not already
have parity acceptance, it will simply be degeneralized or
determinized.
- spot::postprocessor::set_type() can now request co-Büchi
acceptance as output. This calls the aforementioned to_nca() or
to_dca() functions.
- spot::remove_fin() will now call simplify_acceptance(),
introduced in 2.4, before attempting its different Fin-removal
strategies.
- spot::simplify_acceptance() was already merging identical
acceptance sets, and detecting complementary sets i and j to
perform the following simplifications
Fin(i) & Inf(j) = Fin(i)
Fin(i) | Inf(j) = Inf(i)
It now additionally applies the following rules (again assuming i
and j are complementary):
Fin(i) & Fin(j) = f Inf(i) | Inf(j) = t
Fin(i) & Inf(i) = f Fin(i) | Inf(i) = t
- spot::formula::map(fun) and spot::formula::traverse(fun) will
accept additionnal arguments and pass them to fun(). See
https://spot.lrde.epita.fr/tut03.html for some examples.
Python-specific changes:
- The "product-states" property of automata is now accessible via
spot.twa.get_product_states() and spot.twa.set_product_states().
- twa_word instances can be displayed as SVG pictures, with one
signal per atomic proposition. For some examples, see the use of
the show() method in https://spot.lrde.epita.fr/ipynb/word.html
- The test suite is now using v4 of the Jupyter Notebook format.
- The function rabin_is_buchi_realizable() as its name suggests checks
if a rabin aut. is Büchi realizable. It is heavily based on
tra_to_tba() algorithm.
Deprecation notices:
(These functions still work but compilers emit warnings.)
- spot::scc_info::used_acc(), spot::scc_info::used_acc_of() and
spot::scc_info::acc() are deprecated. They have been renamed
spot::scc_info::marks(), spot::scc_info::marks_of() and
spot::scc_info::acc_sets_of() respectively for clarity.
Backward incompatible changes:
- The spot::closure(), spot::sl2(), spot::is_stutter_invariant()
functions no longer take && arguments. The former two have
spot::closure_inplace() and spot::sl2_inplace() variants. These
functions also do not take a list of atomic propositions as an
argument anymore.
- The spot::bmrand() and spot::prand() functions have been removed.
They were not used at all in Spot, and it is not Spot's objective
to provide such random functions.
- The spot::bdd_dict::register_all_propositions_of() function has
been removed. This low-level function was not used anywhere in
Spot anymore, since it's better to use spot::twa::copy_ap_of().
Bugs fixed:
- spot::simplify_acceptance() could produce incorrect output if the
first edge of the automaton was the only one with no acceptance
set. In spot 2.4.x this function was only used by autfilt
--simplify-acceptance; in 2.5 it is now used in remove_fin().
- spot::streett_to_generalized_buchi() could generate incorrect
automata with empty language if some Fin set did not intersect all
accepting SCCs (in other words, the fix from 2.4.1 was incorrect).
- ltlcross could crash when calling remove_fin() on an automaton
with 32 acceptance sets that would need an additional set.
- the down_cast() helper function used in severaly headers of Spot
was not in the spot namespace, and caused issues with some
configurations of GCC.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.4.4
This is a maintenance release containing fixes for two serious bugs
reported by František Blahoudek.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.4.4.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
New in spot 2.4.4 (2017-12-25)
Bugs fixed:
- The generic to_generalized_buchi() function would fail if the
Fin-less & CNF version of the acceptance condition had several
unit clauses.
- If the automaton passed to sbacc() was incomplete or
non-deterministic because of some unreachable states, then it was
possible that the output would marked similarly while it was in
fact complete or deterministic.
Merry Christmas,
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.4.3
This is a maintenance release containing only minor bug fixes and
documentation changes.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.4.3.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
New in spot 2.4.3 (2017-12-19)
Bugs fixed:
- couvreur99_new() leaked memory when processing TωA that allocate
states.
- Some mismatched placement-new/delete reported by ASAN were fixed.
- Static compilation was broken on MinGW.
- Execution of Jupyter notebooks from the testsuite failed with
recent versions of Python.
- Fix some warnings triggered by the development version of g++.
--
Alexandre Duret-Lutz
We are happy to announce the release of Spot 2.4.2
This is a maintenance release containing only minor bug fixes and
documentation changes.
You can find the new release here:
http://www.lrde.epita.fr/dload/spot/spot-2.4.2.tar.gz
See https://spot.lrde.epita.fr/ for documentation and installation
instructions.
New in spot 2.4.2 (2017-11-07)
Tools:
- ltlcross and ltldo support ltl3tela, the new name of ltl3hoa.
Bugs fixed:
- Automata produced by "genaut --ks-nca=N" were incorrectly marked
as not complete.
- Fix some cases for which the highest setting of formulas
simplification would produce worse results than lower settings.
--
Alexandre Duret-Lutz