At InvariantPerformance a benchmark is proposed for testing and comparing invariant calculation by a number of tools, including GreatSPN (gspn), ItsTools, PetriSpot and TINA.struct (with and without the 4ti2 option);
As often in such studies, the choices made among the many available options may be non optimal for some tools, understandably. The study is nethertheless useful as a starting point; many thanks to the authors. We present in this page a revised set of comparisons after fixing some minor issues with the test scripts, tuning parameter choices for TINA.struct, and finally taking advantage of recent improvements of tool struct, prompted by this benchmark.
More precisely:
A bad interpretation of some struct results ("no flows" wrongly interpreted as a failure instead of "0 flows") is fixed;
The default TINA.struct options are suitable for teaching purposes but are suboptimal for the large models found in the benchmark; we use instead more suitable options;
The benchmark has a bias towards large models: The set of petri net models used, taken from those of the MCC includes a proportionally large number of large models (with up to 153 000 nodes) while struct was primarilly intended for more commonly sized models (say with no more than 1000 nodes). Also, neither TINA.struct nor the external 4ti2 tool it may use are optimized for sparse incidence matrices, contrarilly to gspn, Its and PetriSpot tools. A "per model size"; presentation of the results shows results for more typical use case sizes as well;
While gspn computes the same invariants as TINA.struct, neither PetriSpot nor Its do. The latter two preprocess the incidence matrix of the net to remove most redundant rows or columns (depending if computing place or transition invariants), with the effects of producing invariants of smaller dimensions than |P| or |T|; This obviously prevents fair comparisons with the other tools;
Finally, we took this opportunity to refresh the code of the struct tool, written about twenty years ago. Without significantly changing the algorithms used, memory usage was optimized at a number of places, resulting in better performances on large models.
To reproduce the results below, proceed as explained in InvariantPerformance but use the scripts run.sh and logs2csv.pl below instead of those provided there:
Then, to compute the table below, call script reports.sh in folder logs; this produces several markdown files, including file report-c.md, from which the table below is extracted.
Notes: in the tables below:
the size of a net is the max integer among its |T| and |P|.
failures are dispatched into:
sizes in ]0,1000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 13 | 0 | 12 | 0 | 1 | 828 | 841 |
PetriSpot32 | 7 | 0 | 7 | 0 | 0 | 834 | 841 |
PetriSpot64 | 2 | 0 | 2 | 0 | 0 | 839 | 841 |
PetriSpot128 | 2 | 0 | 2 | 0 | 0 | 839 | 841 |
tina | 5 | 5 | 0 | 0 | 0 | 836 | 841 |
tina4ti2 | 0 | 0 | 0 | 0 | 0 | 841 | 841 |
sizes in ]0,2000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 14 | 0 | 13 | 0 | 1 | 942 | 956 |
PetriSpot32 | 9 | 0 | 9 | 0 | 0 | 947 | 956 |
PetriSpot64 | 2 | 0 | 2 | 0 | 0 | 954 | 956 |
PetriSpot128 | 2 | 0 | 2 | 0 | 0 | 954 | 956 |
tina | 10 | 10 | 0 | 0 | 0 | 946 | 956 |
tina4ti2 | 0 | 0 | 0 | 0 | 0 | 956 | 956 |
sizes in ]0,5000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 15 | 0 | 14 | 0 | 1 | 1110 | 1125 |
PetriSpot32 | 10 | 0 | 10 | 0 | 0 | 1115 | 1125 |
PetriSpot64 | 2 | 0 | 2 | 0 | 0 | 1123 | 1125 |
PetriSpot128 | 2 | 0 | 2 | 0 | 0 | 1123 | 1125 |
tina | 21 | 21 | 0 | 0 | 0 | 1104 | 1125 |
tina4ti2 | 0 | 0 | 0 | 0 | 0 | 1125 | 1125 |
sizes in ]0,10000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 16 | 0 | 15 | 0 | 1 | 1204 | 1220 |
PetriSpot32 | 13 | 0 | 13 | 0 | 0 | 1207 | 1220 |
PetriSpot64 | 5 | 0 | 5 | 0 | 0 | 1215 | 1220 |
PetriSpot128 | 5 | 0 | 5 | 0 | 0 | 1215 | 1220 |
tina | 29 | 29 | 0 | 0 | 0 | 1191 | 1220 |
tina4ti2 | 0 | 0 | 0 | 0 | 0 | 1220 | 1220 |
sizes in ]0,20000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 18 | 0 | 17 | 0 | 1 | 1262 | 1280 |
PetriSpot32 | 16 | 0 | 16 | 0 | 0 | 1264 | 1280 |
PetriSpot64 | 6 | 0 | 6 | 0 | 0 | 1274 | 1280 |
PetriSpot128 | 6 | 0 | 6 | 0 | 0 | 1274 | 1280 |
tina | 63 | 63 | 0 | 0 | 0 | 1217 | 1280 |
tina4ti2 | 1 | 1 | 0 | 0 | 0 | 1279 | 1280 |
sizes in ]0,50000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 27 | 9 | 17 | 0 | 1 | 1335 | 1362 |
PetriSpot32 | 18 | 0 | 18 | 0 | 0 | 1344 | 1362 |
PetriSpot64 | 6 | 0 | 6 | 0 | 0 | 1356 | 1362 |
PetriSpot128 | 6 | 0 | 6 | 0 | 0 | 1356 | 1362 |
tina | 105 | 100 | 0 | 5 | 0 | 1257 | 1362 |
tina4ti2 | 47 | 20 | 0 | 27 | 0 | 1315 | 1362 |
sizes in ]0,max]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 69 | 51 | 17 | 0 | 1 | 1355 | 1424 |
PetriSpot32 | 30 | 9 | 21 | 0 | 0 | 1394 | 1424 |
PetriSpot64 | 17 | 9 | 8 | 0 | 0 | 1407 | 1424 |
PetriSpot128 | 17 | 9 | 8 | 0 | 0 | 1407 | 1424 |
tina | 155 | 132 | 0 | 23 | 0 | 1269 | 1424 |
tina4ti2 | 109 | 30 | 0 | 79 | 0 | 1315 | 1424 |
For benchmarkings semiflow computations instead of flows, use instead scripts (in progress):
Computing semiflows is more expensive than computing flows; the current results are:
sizes in ]0,1000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 274 | 262 | 11 | 0 | 1 | 567 | 841 |
PetriSpot64 | 126 | 2 | 2 | 0 | 122 | 715 | 841 |
tina | 273 | 112 | 0 | 161 | 0 | 568 | 841 |
tina4ti2 | 201 | 153 | 0 | 48 | 0 | 640 | 841 |
sizes in ]0,2000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 370 | 358 | 11 | 0 | 1 | 586 | 956 |
PetriSpot64 | 163 | 2 | 2 | 0 | 159 | 793 | 956 |
tina | 366 | 152 | 0 | 214 | 0 | 590 | 956 |
tina4ti2 | 297 | 218 | 0 | 79 | 0 | 659 | 956 |
sizes in ]0,5000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 481 | 469 | 11 | 0 | 1 | 644 | 1125 |
PetriSpot64 | 233 | 2 | 2 | 0 | 229 | 892 | 1125 |
tina | 494 | 243 | 0 | 251 | 0 | 631 | 1125 |
tina4ti2 | 452 | 332 | 0 | 120 | 0 | 673 | 1125 |
sizes in ]0,10000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 551 | 539 | 11 | 0 | 1 | 669 | 1220 |
PetriSpot64 | 272 | 2 | 5 | 0 | 265 | 948 | 1220 |
tina | 577 | 306 | 0 | 271 | 0 | 643 | 1220 |
tina4ti2 | 547 | 397 | 0 | 150 | 0 | 673 | 1220 |
sizes in ]0,20000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 600 | 588 | 11 | 0 | 1 | 680 | 1280 |
PetriSpot64 | 293 | 8 | 6 | 0 | 279 | 987 | 1280 |
tina | 634 | 363 | 0 | 271 | 0 | 646 | 1280 |
tina4ti2 | 606 | 452 | 0 | 154 | 0 | 674 | 1280 |
sizes in ]0,50000]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 673 | 661 | 11 | 0 | 1 | 689 | 1362 |
PetriSpot64 | 322 | 26 | 6 | 0 | 290 | 1040 | 1362 |
tina | 711 | 405 | 0 | 306 | 0 | 651 | 1362 |
tina4ti2 | 688 | 523 | 0 | 165 | 0 | 674 | 1362 |
sizes in ]0,max]
Tool | Failure | time | ovf | mem | unk | Success | Total |
---|---|---|---|---|---|---|---|
GreatSPN | 734 | 722 | 11 | 0 | 1 | 690 | 1424 |
PetriSpot64 | 345 | 42 | 8 | 0 | 295 | 1079 | 1424 |
tina | 773 | 444 | 0 | 329 | 0 | 651 | 1424 |
tina4ti2 | 750 | 563 | 0 | 187 | 0 | 674 | 1424 |
As for flows, GreatSPN and TINA.struct compute the same semiflows ("by the book"), while PetriSpot computes semiflows after a reduction pass removing most redundant places or transitions.