Reverse Search Shellability checker ver 0.52

rsshell-0.52a.tar.gz (Jan 18, 2003.)
( -> 0.52a is a small fix from 0.52, just for letting new versions of gcc work.)

This version implemented M-sequence check in each step.
In most case in dimensions larger than 4 this makes the running time tremendously shorter, but in dimension 3 or smaller cases Ver.0.43 works faster than this version.

Here is an old version:

[Brief description]

The program rsshell is a program (written in C) to check shellability of a given (pure) simplicial complex.
The method is to search a ``shellable h-assignment'' (discussed by Sonoko Moriyama) by using a kind of reverse search. (This idea is essentially suggested by Jörg Rambau in a short conversation during ICM2002. I thank him very much.)

Primitive simple-minded implementation of ``finding shellable h-assignments'' method is done by Moriyama-Nagai-Imai (presented at ICMS2002), which in a search tree trys to keep all intermediate steps in a hash table in order to avoid re-searching. (Of course it is impossible to keep all intermediate steps because the size of the memory is finite. To keep the table small enough, they used some heuristical methods to discard some information of already-checked nodes, that is, their atempt of avoiding re-searching is imperfect. By this they dared claim their implementation is ``space-efficient'' although it involves a quite large (c.a.64M) hash table!)

Moreover, their implementation uses a random-number table for the coding of the entries of the hash-table. In short, in their implementation each h-assignment is encoded into a constant-bit number so that, they expect, different ones are encoded into different numbers. Of course this makes their implementation to be just a probabilistic checker: If it answers nonshellable, it means that it is nonshellable in high probability.
(I don't know for what reason they gave up to be exact. Maybe in order to reduce the size of the hash table, or to make the computation faster and easier. This is not a good idea at all if one really wants to know the shellability of the examples he constructed, even if the probability of error is very small. The probability of error is not estimated in their paper (even no mentioning that it is probabilistic). If the size of the complex is small, it is very small. If the size gets larger, it tends to 1.)

On the other hand, our method uses no such tables during the searching. Instead it just uses a reverse search. It uses very small memory. Of course it computes exact answer for our question of asking the shellability of simplicial complexes.

The search method used in M-N-I implementation is a depth-first-search as follows. (Although their description has a little bit different look.)

(That is, we search a shelling in a backward manner: successively remove a candidate facet for the last one in a shelling.)
In this depth-first searching, the M-N-I implementation tries to keep all inappropriate assignments in a hash table to avoid re-checking of already-checked nodes during the search.

What we propose is that there is no need of using such a heuristical way at all if we use the reverse search for this depth-first search. For this we assume some fixed ordering of facets and for each assignment we define its real parent to be the lexicographically smallest assignment. (Here lexicographic ordering is based on an order relation `assigned'<`not assigned'.)
In precise, what we need to do is the following.

In this searching method, what we need to keep is only the current assignment, thus we need no hash table nor search path to the current status. That is, this method is really ``space-efficient''.

In the implementation of rsshell, we keep a list of cancellable facets and the maximum one among them in each step in order to make the computation efficient.

Currently rsshell borrows some functions from simplicial complex calculator (ssc) for the pre-computation. This causes a problem that the maximum dimension for the input complex is fixed. (In fact, ssc is very far from sophisticated.) The default of the maximum dimension is 10, but this number can be changed suitablly by editing the parameter in s_complex.h.
This restriction will be fixed in some later version.
Masahiro Hachimori