я вижу, что в документации fix
говорится:
function array [$U] of $T: fix(array [$U] of var opt $T: x)
Check if the value of every element of the array x is fixedat this point in evaluation. If all are fixed, return an array of their values, otherwise abort.
Я думаю, что его можно использовать для принуждения var к номиналу. Вот код.
array [1..num] of var int: value ;
%% generate random numbers from 0..num-1, this should fix the value of the var "value" or so i think
constraint forall(i in index_set(value))(let {int:temp_value=discrete_distribution([1|i in index_set(value)]); } in value[i]=trace(show(temp_value)++"\n", temp_value));
%%% this i was expecting to work, as "value" elements are fixed above
array [1..num] of int:value__ =[ trace(show(fix(value[i])), fix(value[i])) | i in index_set(value)] ;
Но я получаю:
MiniZinc: evaluation error:
with i = 1
in call 'trace'
in call 'fix'
expression is not fixed
Мои вопросы:
1) Я думаю, мне следует ожидать эту ошибку, так как minizinc не является языком последовательного выполнения?
2) Примеры fix
в руководстве пользователя приведены только там, где используется оператор output
. Это единственное место, где можно использовать fix
?
3) Как бы я принудил var
к par
?
Кстати, я пытаюсь преобразовать эту переменную в номинал, потому что у меня проблема с выражением генератора массива. Вот код
int:num__=200;
int:seed=134;
int: two_m=2097184;
%% prepare weights for generating numbers form 1..(two_m div 64), basically same weight
array [1..(two_m div 64)] of int: value_6_wt= [seed+1 | i in 1..(two_m div 64)] ;
%% generate numbers. this dose not work gives out
%% in variable declaration for 'value6'
%% parameter value out of range
array [1..num__] of int : value6 = [ discrete_distribution(value_6_wt) | j in 1..num__];