On 23/08/2012 18:10, Kostas Oikonomou wrote:
>
> I have one more question: I'm trying the example of using a
> MiniZinc/FlatZinc model in Eclipse, found on the lib(flatzinc)
> reference page. So far, I have the following code:
>
> my_fzn_run_file(ModelFile, Options) :-
> % initialize the solver state
> fzn_init(Options, State),
> % load the model and set up the constraints
> open(ModelFile, read, S), fzn_load_stream(S, FznState),
> % Get the objective
> fzn_obj_lookup(FznState, Obj),
> % Now suppose the mzn model has variables X, a 1-d
> array, and Y, a 2d-array.
> fzn_var_lookup(FznState, X, Xe),
> fzn_var_lookup(FznState, Y, Ye),
Here you have to single-quote 'X' and 'Y' (the FlatZinc variable names),
otherwise they will be taken as ECLiPSe variables.
You could also use mzn_load/5 for part of the code above.
http://www.eclipseclp.org/doc/bips/lib_public/minizinc/mzn_load-5.html
> % How do I use Xe, Ye, and Obj in bb_min()?
> % ????
The mapping of MiniZinc data structures to FlatZinc is explained in the
FlatZinc specification: basically, multi-dimensional arrays are flattened,
and the indices normalized to start at 1.
The mapping of FlatZinc data structures to ECLiPSe is described in the
table at http://www.eclipseclp.org/doc/bips/lib_public/minizinc/index.html
Together that means that MiniZinc arrays will all end up as one-dimensional
ECLiPSe arrays, i.e. structures with functor []/N.
A brute-force way of calling bb_min in this example would be
term_variables([Xe,Ye], Vars),
bb_min(labeling(Vars), Obj, bb_options{}),
> % output solution, if found
> fzn_output(State),
> % increments solutions count, and succeeds if last
> one reached
> fzn_last(State),
> !.
-- Joachim