Hi,

Thanks for the response. I decided to look into the isuse a little bit, and it seems like the problem is mainly in apply_rec() in bddop.c. I was able to rewrite it into a stack-based version, which seems to have fixed the crashing (though postprocessing still takes forever, which is the original result I was expecting, anyway). I also tried my new version on the command from that issue you linked (https://gitlab.lrde.epita.fr/spot/spot/-/issues/396), and that also works now, though it takes about 4-5 hours to finish.

It's probably not the ideal implementation, but I attached a patch file containing the fix, if you are interested. It seems to work (all the tests pass), and it's about the same speed in most cases.

Thanks,
Reed

Le lun. 30 mars 2020 à 08:56, Alexandre Duret-Lutz <adl@lrde.epita.fr> a écrit :
On Mon, Mar 30, 2020 at 2:15 PM Reed Oei <reedoei2@illinois.edu> wrote:
>
> Hello,
>
> I am encountering a bug where Spot segfaults when I try to postprocess a relatively large automaton. I have uploaded the file to http://reedoei.com/files/smaller-inner.aut.zip; it has 113930 states and 1537155 edges. I tried to come up with a smaller example but was having trouble doing so. Below is the sequence of commands, using the Python bindings, to reproduce this bug for me:
>
> import spot
> A = spot.automaton('smaller-inner.aut')
> B = A.postprocess('BA', 'Deterministic', 'Low') # Crashes here
> B.save('postprocessed.aut')
>
> I also tried using various other others for postprocess such as Small and Low, or Any and High (because Any and Low/Medium does nothing).


Hi Reed,

This is a HUGE automaton to pass to postprocess.

Running

% autfilt --det --low smaller-inner.aut

did not finish within 20 minutes, so I interrupted it and noticed the
code was busy in the simulation-based reduction code.
The simulation-based reduction is notoriously slow: it uses a
BDD-based representation that requires one variable per equivalence
classe (maybe the number of states), and when too many variables are
used, it's possible that the garbage collection for the BuDDy library
crashes with a stack overflow (see
https://gitlab.lrde.epita.fr/spot/spot/-/issues/396 )  Maybe that's
the crash you got.

You can disable simulation-based reductions with

% autfilt -x simul=0,ba-simul=0,det-simul=0 --det --low smaller-inner.aut

but this also did not finish withing 20 minutes.  When I interrupted
it it was stuck in the determinization code.
Running an exponential algorithm on an automaton with soo many states
is unlikely to finish quickly.

Running the same command without requiring a determinisation, and
without simulation-based
reductions worked and reduced the automaton to 107083 states:

% autfilt -x simul=0,ba-simul=0 --small --low smaller-inner.aut

--
Alexandre Duret-Lutz