Как получить точное представление рациональных чисел с бесконечной точностью с помощью нестандартного расширения FlatZinc?

По умолчанию mzn2fzn автоматически вычисляет результат деления с плавающей запятой в модели MiniZinc и сохраняет его как постоянное значение float в результирующем FlatZinc. модель.

Пример:

Файл test.mzn

var float: x;
constraint      1.0 / 1000000000000000000000000000000000.0 <= x;
constraint x <= 2.0 / 1000000000000000000000000000000000.0;
solve satisfy;

переведено с

mzn2fzn test.mzn

становится равным

var 1e-33..2e-33: x;
solve satisfy;

Вместо этого мы хотели бы получить*** файл FlatZinc со следующими строками:

var float: x;
var float: lb;
var float: ub;
constraint float_div(1.0, 1000000000000000000000000000000000.0, lb);
constraint float_div(2.0, 1000000000000000000000000000000000.0, ub);
solve satisfy;

где float_div() – это недавно введенное нестандартное ограничение FlatZinc.

Можно ли сгенерировать такую ​​кодировку исходной задачи, используя вариант каталога ограничений std, или эта кодировка требует более существенного изменения исходного кода инструмента mzn2fzn? В последнем случае, можем ли мы получить какое-то руководство?


***: у нас есть некоторые формулы, для которых представление с плавающей запятой конечной точности не подходит, потому что оно изменяет результат SAT на UNSAT.


person Patrick Trentin    schedule 19.12.2018    source источник


Ответы (1)


В настоящее время нет способа генерировать FlatZinc с бесконечной точностью. Хотя эта идея обсуждалась несколько раз, для ее реализации потребуется переписать или добавить большую часть MiniZinc с использованием библиотеки, которая могла бы предоставить эти бесконечно точные типы. Подобные библиотеки, такие как библиотека Boost interval, похоже, лишены опций и в настоящее время не компилируются для всех целевых машин, на которых распространяется MiniZinc. Кажется, существуют различные интересные случаи для бесконечных точных типов, но в реализации компилятора MiniZinc мы все еще ищем достойный способ их реализации.

Хотя бесконечная точность не на столе. Компилятор MiniZinc намерен быть правильным в соответствии со стандартами с плавающей запятой. Не стесняйтесь сообщать о любых проблемах, которые могут возникнуть, в системе отслеживания проблем MiniZinc.

person Dekker1    schedule 19.12.2018
comment
Так что ответ - нет, даже если нам не нужна поддержка решения, а только поддержка перевода? Модель flatzinc с бесконечной точностью может быть легко обработана optimathsat, наша единственная проблема заключается в том, как сохранить эти значения посредством преобразования mzn2fzn. Я не думаю, что это баг миницинка, некоторые интервалы чисел просто не могут быть представлены числами с плавающей запятой и поэтому решение задачи меняется. - person Patrick Trentin; 20.12.2018
comment
В настоящее время действительно нет способа сделать это, поскольку все нецелые числа представлены внутри как числа с плавающей запятой. Таким образом, даже если ограничения не интегрированы в домен переменной, они все равно будут подлежать округлению с плавающей запятой. - person Dekker1; 20.12.2018
comment
Я понимаю. Я предполагаю, что такое же ограничение применялось бы, если бы аргументы были целыми числами в файле minizinc, мы все равно могли бы использовать только до 64 бит. Спасибо за ответ. - person Patrick Trentin; 20.12.2018