MiniZinc/FlatZinc support in SICStus Prolog version 4.0.5
The other day I downloaded a demo of SICStus Prolog version 4.0.5, with the sole intention of testing the new support for MiniZinc/FlatZinc. The version I downloaded was for Linux 32 bit glibc 2.7 (my machine use glibc 2.6 but it seems to work well anyway).
The support for MiniZinc/FlatZinc in SICStus Prolog is described more in 10.35 Zinc interface - library(zinc). Some restrictions are described in Notes:
I have now also added the SICStus Prolog solver on my MiniZinc page.
The support for MiniZinc/FlatZinc in SICStus Prolog is described more in 10.35 Zinc interface - library(zinc). Some restrictions are described in Notes:
- Domain variables
Only variables with finite integer domains are supported. This includes boolean variables which are considered finite integer domain variables with the domain 0..1.- Optimization problems
Only variables with finite integer domains can be optimized in minimize and maximize solve items. The int_float_lin/4 expression as described in the FlatZinc specification is thus not supported.- Solve annotations
- The solve annotations currently supported are int_search/4, bool_search/4, and labelling_ff/0.
- The FlatZinc specification describes several exploration strategies. Currently, the only supported exploration strategy is "complete".
- When no solve annotation is given, a most constrained heuristic is used on all problem variables (excluding those that have a var_is_introduced annotation, see below). This corresponds to labeling/2 of library(clpfd) with the option ffc.
- The choice method "indomain_random" as described in the FlatZinc specification uses random_member/2 of library(random). The random generator of SICStus is initialized using the same seed on each start up, meaning that the same sequence will be tried for "indomain_random" on each start up. This behavior can be changed by setting a different random seed using setrand/1 of library(random).
- Constraint annotations
Constraint annotations are currently ignored.- Variable annotations
Variable annotations are currently ignored, except var_is_introduced, which means that the corresponding variable is not considered in any default labeling (such as when no search annotation is given or when the labelling_ff search annotation is given).
Testing
For testing the MiniZinc solver I used exactly the same principle as I do for the ECLiPSe solver, so hooking it up into in my system was very easy. All this is done via a Perl script of my own. It consists of generating a Prolog file, here calledprolog_file.pl
with the content below . model.mzn
is the MiniZinc file to run, and number_of_solutions
is the number of solutions to generate (an integer, or all
for all solutions).
% % Generated by mzx.pl % :- use_module(library(zinc)). go :- mzn_run_file('model.mzn', [solutions(number_of_solutions)]), halt.And then running the following command (from the Perl program):
sicstus -l prolog_file.pl --goal go.
Findings
Most things works very well and with about the same performance as the ECLiPSe solver. I will investigate some more before (perhaps) buying a private license of SICStus Prolog (or upgrading from my old version 3.9.1 if that is possible). However, I did find some problems.- global_cardinality/2
The support for the builtinglobal_cardinality/2
is broken. The following error occurs:! Existence error ! `global_cardinality/2' is not defined
Example: sudoku_gcc.mzn.
There is an easy fix which works but is slower that using an builtin support: in the fileglobals.mzn
(in the SICStus Prolog distribution), just use the decomposition variant (the commented) instead. - cumulative
For the model furniture_moving.mzn the following error occurs:! Instantiation error in argument 2 of user:cumulative/2 ! goal: cumulative([task(_4769,30,_4771,3,1),task(_4777,10,_4779,1,2),task(_4785,15,_4787,3,3),task(_4793,15,_4795,2,4)],[limit(_4801)])
Note: the model cumulative_test_mats_carlsson.mzn works without problem (this is a simple example from one of Mats Carlsson's lecures). - integer overflow
For the Grocery example (grocery.mzn) an integer overflow error is thrown:! Item ending on line 3: ! Representation error in argument 1 of user:range_to_fdset/2 ! CLPFD integer overflow ! goal: range_to_fdset(1..359425431,_4771)
Notes: MiniZinc's solver also overflows, so this is probably not a big thing. The solvers for Gecode/FlatZinc and ECLiPSe ic handles this problems correctly, though. - Statistics
I have not seen any relevant statistics (e.g. number of failures, nodes, propagations etc) for the SICStus MiniZinc solver. The standard SISCtus Prolog predicatestatistics/0
is somewhat useful, but is not what is needed when writing MiniZinc models and comparing with other versions and/or solvers.
What I have in mind is something like the statistics from Gecode (and Gecode/FlatZinc):runtime: 50 solutions: 1 propagators: 8 propagations: 3995 nodes: 249 failures: 124 peak depth: 12 peak memory: 27 KB
Final note
I have contacted the developers of SICStus Prolog about these things. They responsed that the bugs are now fixed and will be included in the next version (4.0.6). They also indicated that more detailed statistics may make it in a later version. That is great!I have now also added the SICStus Prolog solver on my MiniZinc page.