Add 2 benchmarks directories.
Add an algorithm to split an automaton in several automata. * bench/scc-stats: New directory. Contains input files and test program for computing statistics. * bench/split-product: New directory. Contains test program for synchronised product on splitted automata. * bench/split-product/models: New directory. Contains Promela files and LTL formulae that should be verified by the models. * src/tgba/tgbafromfile.cc, src/tgba/tgbafromfile.hh: New files. Small class to avoid long initializations with numerous constants when translating to TGBA many LTL formulae from a given file. * src/tgbaalgos/cutscc.cc, src/tgbaalgos/cutscc.hh: New file. From a single automaton, create, at most, X sub automata. * src/tgbaalgos/scc.cc, src/tgbaalgos/scc.hh: Adjust to compute self-loops count.
This commit is contained in:
parent
a160b3504b
commit
414956c51e
35 changed files with 2989 additions and 5 deletions
89
bench/split-product/models/leader.pml
Normal file
89
bench/split-product/models/leader.pml
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/* Dolev, Klawe & Rodeh for leader election in unidirectional ring
|
||||
* `An O(n log n) unidirectional distributed algorithm for extrema
|
||||
* finding in a circle,' J. of Algs, Vol 3. (1982), pp. 245-260
|
||||
*/
|
||||
|
||||
#define elected (nr_leaders > 0)
|
||||
#define noLeader (nr_leaders == 0)
|
||||
#define oneLeader (nr_leaders == 1)
|
||||
|
||||
#define N 5 /* nr of processes (use 5 for demos) */
|
||||
#define I 3 /* node given the smallest number */
|
||||
#define L 10 /* size of buffer (>= 2*N) */
|
||||
|
||||
mtype = { one, two, winner };
|
||||
chan q[N] = [L] of { mtype, byte};
|
||||
|
||||
byte nr_leaders = 0;
|
||||
|
||||
proctype node (chan in, out; byte mynumber)
|
||||
{ bit Active = 1, know_winner = 0;
|
||||
byte nr, maximum = mynumber, neighbourR;
|
||||
|
||||
xr in;
|
||||
xs out;
|
||||
|
||||
printf("MSC: %d\n", mynumber);
|
||||
out!one(mynumber);
|
||||
end: do
|
||||
:: in?one(nr) ->
|
||||
if
|
||||
:: Active ->
|
||||
if
|
||||
:: nr != maximum ->
|
||||
out!two(nr);
|
||||
neighbourR = nr
|
||||
:: else ->
|
||||
/* Raynal p.39: max is greatest number */
|
||||
assert(nr == N);
|
||||
know_winner = 1;
|
||||
out!winner,nr;
|
||||
fi
|
||||
:: else ->
|
||||
out!one(nr)
|
||||
fi
|
||||
|
||||
:: in?two(nr) ->
|
||||
if
|
||||
:: Active ->
|
||||
if
|
||||
:: neighbourR > nr && neighbourR > maximum ->
|
||||
maximum = neighbourR;
|
||||
out!one(neighbourR)
|
||||
:: else ->
|
||||
Active = 0
|
||||
fi
|
||||
:: else ->
|
||||
out!two(nr)
|
||||
fi
|
||||
:: in?winner,nr ->
|
||||
if
|
||||
:: nr != mynumber ->
|
||||
printf("MSC: LOST\n");
|
||||
:: else ->
|
||||
printf("MSC: LEADER\n");
|
||||
nr_leaders++;
|
||||
assert(nr_leaders == 1)
|
||||
fi;
|
||||
if
|
||||
:: know_winner
|
||||
:: else -> out!winner,nr
|
||||
fi;
|
||||
break
|
||||
od
|
||||
}
|
||||
|
||||
init {
|
||||
byte proc;
|
||||
atomic {
|
||||
proc = 1;
|
||||
do
|
||||
:: proc <= N ->
|
||||
run node (q[proc-1], q[proc%N], (N+I-proc)%N+1);
|
||||
proc++
|
||||
:: proc > N ->
|
||||
break
|
||||
od
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue