Fix final references
This commit is contained in:
parent
5f8553d8cc
commit
645ae1fa3a
@ -132,6 +132,26 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@inproceedings{carlsson-1997-sicstus,
|
||||||
|
author = {Mats Carlsson and Greger Ottosson and Bj{\"{o}}rn Carlson},
|
||||||
|
editor = {Hugh Glaser and Pieter H. Hartel and Herbert Kuchen},
|
||||||
|
title = {An Open-Ended Finite Domain Constraint Solver},
|
||||||
|
booktitle = {Programming Languages: Implementations, Logics, and
|
||||||
|
Programs, 9th International Symposium, PLILP'97, Including a
|
||||||
|
Special Trach on Declarative Programming Languages in
|
||||||
|
Education, Southampton, UK, September 3-5, 1997, Proceedings},
|
||||||
|
series = {Lecture Notes in Computer Science},
|
||||||
|
volume = 1292,
|
||||||
|
pages = {191--206},
|
||||||
|
publisher = {Springer},
|
||||||
|
year = 1997,
|
||||||
|
url = {https://doi.org/10.1007/BFb0033845},
|
||||||
|
doi = {10.1007/BFb0033845},
|
||||||
|
timestamp = {Tue, 14 May 2019 10:00:36 +0200},
|
||||||
|
biburl = {https://dblp.org/rec/conf/plilp/CarlssonOC97.bib},
|
||||||
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
|
}
|
||||||
|
|
||||||
@article{chiarandini-2012-gbac,
|
@article{chiarandini-2012-gbac,
|
||||||
author = {Marco Chiarandini and Luca Di Gaspero and Stefano Gualandi
|
author = {Marco Chiarandini and Luca Di Gaspero and Stefano Gualandi
|
||||||
and Andrea Schaerf},
|
and Andrea Schaerf},
|
||||||
@ -369,6 +389,42 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@article{kolisch-1997-psplib,
|
||||||
|
title = {PSPLIB - A project scheduling problem library: OR Software
|
||||||
|
- ORSEP Operations Research Software Exchange Program},
|
||||||
|
journal = {European Journal of Operational Research},
|
||||||
|
volume = 96,
|
||||||
|
number = 1,
|
||||||
|
pages = {205-216},
|
||||||
|
year = 1997,
|
||||||
|
issn = {0377-2217},
|
||||||
|
doi = {https://doi.org/10.1016/S0377-2217(96)00170-1},
|
||||||
|
url =
|
||||||
|
{https://www.sciencedirect.com/science/article/pii/S0377221796001701},
|
||||||
|
author = {Rainer Kolisch and Arno Sprecher},
|
||||||
|
keywords = {Project scheduling, Resource constraints, Benchmark
|
||||||
|
instances},
|
||||||
|
}
|
||||||
|
|
||||||
|
@inproceedings{lagerkvist-2009-groups,
|
||||||
|
author = {Mikael Z. Lagerkvist and Christian Schulte},
|
||||||
|
editor = {Ian P. Gent},
|
||||||
|
title = {Propagator Groups},
|
||||||
|
booktitle = {Principles and Practice of Constraint Programming - {CP}
|
||||||
|
2009, 15th International Conference, {CP} 2009, Lisbon,
|
||||||
|
Portugal, September 20-24, 2009, Proceedings},
|
||||||
|
series = {Lecture Notes in Computer Science},
|
||||||
|
volume = 5732,
|
||||||
|
pages = {524--538},
|
||||||
|
publisher = {Springer},
|
||||||
|
year = 2009,
|
||||||
|
url = {https://doi.org/10.1007/978-3-642-04244-7\_42},
|
||||||
|
doi = {10.1007/978-3-642-04244-7\_42},
|
||||||
|
timestamp = {Tue, 14 May 2019 10:00:45 +0200},
|
||||||
|
biburl = {https://dblp.org/rec/conf/cp/LagerkvistS09.bib},
|
||||||
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
|
}
|
||||||
|
|
||||||
@inproceedings{leo-2015-multipass,
|
@inproceedings{leo-2015-multipass,
|
||||||
author = {Kevin Leo and Guido Tack},
|
author = {Kevin Leo and Guido Tack},
|
||||||
editor = {Qiang Yang and Michael J. Wooldridge},
|
editor = {Qiang Yang and Michael J. Wooldridge},
|
||||||
@ -528,6 +584,21 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@article{plaisted-1986-polarity,
|
||||||
|
author = {David A. Plaisted and Steven Greenbaum},
|
||||||
|
title = {A Structure-Preserving Clause Form Translation},
|
||||||
|
journal = {J. Symb. Comput.},
|
||||||
|
volume = 2,
|
||||||
|
number = 3,
|
||||||
|
pages = {293--304},
|
||||||
|
year = 1986,
|
||||||
|
url = {https://doi.org/10.1016/S0747-7171(86)80028-1},
|
||||||
|
doi = {10.1016/S0747-7171(86)80028-1},
|
||||||
|
timestamp = {Wed, 17 Feb 2021 08:57:26 +0100},
|
||||||
|
biburl = {https://dblp.org/rec/journals/jsc/PlaistedG86.bib},
|
||||||
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
|
}
|
||||||
|
|
||||||
@inproceedings{rendl-2009-enhanced-tailoring,
|
@inproceedings{rendl-2009-enhanced-tailoring,
|
||||||
author = {Andrea Rendl and Ian Miguel and Ian P. Gent and Christopher
|
author = {Andrea Rendl and Ian Miguel and Ian P. Gent and Christopher
|
||||||
Jefferson},
|
Jefferson},
|
||||||
@ -636,6 +707,17 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@phdthesis{rendl-2010-thesis,
|
||||||
|
author = {Andrea Rendl},
|
||||||
|
title = {Effective compilation of constraint models},
|
||||||
|
school = {University of St Andrews, {UK}},
|
||||||
|
year = {2010},
|
||||||
|
url = {http://hdl.handle.net/10023/973},
|
||||||
|
timestamp = {Thu, 25 Aug 2016 17:20:59 +0200},
|
||||||
|
biburl = {https://dblp.org/rec/phd/ethos/Rendl10.bib},
|
||||||
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
|
}
|
||||||
|
|
||||||
@inproceedings{schulte-2005-views,
|
@inproceedings{schulte-2005-views,
|
||||||
author = {Christian Schulte and Guido Tack},
|
author = {Christian Schulte and Guido Tack},
|
||||||
editor = {Peter van Beek},
|
editor = {Peter van Beek},
|
||||||
@ -710,17 +792,6 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
@phdthesis{rendl-2010-thesis,
|
|
||||||
author = {Andrea Rendl},
|
|
||||||
title = {Effective compilation of constraint models},
|
|
||||||
school = {University of St Andrews, {UK}},
|
|
||||||
year = {2010},
|
|
||||||
url = {http://hdl.handle.net/10023/973},
|
|
||||||
timestamp = {Thu, 25 Aug 2016 17:20:59 +0200},
|
|
||||||
biburl = {https://dblp.org/rec/phd/ethos/Rendl10.bib},
|
|
||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
|
||||||
}
|
|
||||||
|
|
||||||
@book{silvano-1990-knapsack,
|
@book{silvano-1990-knapsack,
|
||||||
author = {Martello, Silvano and Toth, Paolo},
|
author = {Martello, Silvano and Toth, Paolo},
|
||||||
title = {Knapsack Problems: Algorithms and Computer Implementations},
|
title = {Knapsack Problems: Algorithms and Computer Implementations},
|
||||||
@ -781,6 +852,24 @@
|
|||||||
bibsource = {dblp computer science bibliography, https://dblp.org}
|
bibsource = {dblp computer science bibliography, https://dblp.org}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@techreport{gamrath-2020-scip,
|
||||||
|
author = {Gerald Gamrath and Daniel Anderson and Ksenia Bestuzheva and Wei-Kun Chen and Leon Eifler and Maxime Gasse and Patrick Gemander and Ambros Gleixner and Leona Gottwald and Katrin Halbig and Gregor Hendel and Christopher Hojny and Thorsten Koch and Le Bodic, Pierre and Stephen J. Maher and Frederic Matter and Matthias Miltenberger and Erik M{\"u}hmer and Benjamin M{\"u}ller and Marc E. Pfetsch and Franziska Schl{\"o}sser and Felipe Serrano and Yuji Shinano and Christine Tawfik and Stefan Vigerske and Fabian Wegscheider and Dieter Weninger and Jakob Witzig},
|
||||||
|
title = {{The SCIP Optimization Suite 7.0}},
|
||||||
|
type = {ZIB-Report},
|
||||||
|
institution = {Zuse Institute Berlin},
|
||||||
|
number = {20-10},
|
||||||
|
month = {3},
|
||||||
|
year = {2020},
|
||||||
|
url = {http://nbn-resolving.de/urn:nbn:de:0297-zib-78023}
|
||||||
|
}
|
||||||
|
|
||||||
|
@unpublished{van-hentenryck-1992-indexicals,
|
||||||
|
title = {Constraint processing in cc(FD)},
|
||||||
|
author = {Van Hentenryck, P. and Saraswat, V. and Deville, Y.},
|
||||||
|
year = 1992,
|
||||||
|
note = {Manuscript},
|
||||||
|
}
|
||||||
|
|
||||||
@book{van-hentenryck-1999-opl,
|
@book{van-hentenryck-1999-opl,
|
||||||
title = {The OPL Optimization Programming Language},
|
title = {The OPL Optimization Programming Language},
|
||||||
author = {Van Hentenryck, P. and Lustig, I. and Puget, J.F. and
|
author = {Van Hentenryck, P. and Lustig, I. and Puget, J.F. and
|
||||||
@ -818,14 +907,3 @@
|
|||||||
year = 1988,
|
year = 1988,
|
||||||
publisher = {Wiley}
|
publisher = {Wiley}
|
||||||
}
|
}
|
||||||
|
|
||||||
@techreport{gamrath-2020-scip,
|
|
||||||
author = {Gerald Gamrath and Daniel Anderson and Ksenia Bestuzheva and Wei-Kun Chen and Leon Eifler and Maxime Gasse and Patrick Gemander and Ambros Gleixner and Leona Gottwald and Katrin Halbig and Gregor Hendel and Christopher Hojny and Thorsten Koch and Le Bodic, Pierre and Stephen J. Maher and Frederic Matter and Matthias Miltenberger and Erik M{\"u}hmer and Benjamin M{\"u}ller and Marc E. Pfetsch and Franziska Schl{\"o}sser and Felipe Serrano and Yuji Shinano and Christine Tawfik and Stefan Vigerske and Fabian Wegscheider and Dieter Weninger and Jakob Witzig},
|
|
||||||
title = {{The SCIP Optimization Suite 7.0}},
|
|
||||||
type = {ZIB-Report},
|
|
||||||
institution = {Zuse Institute Berlin},
|
|
||||||
number = {20-10},
|
|
||||||
month = {March},
|
|
||||||
year = {2020},
|
|
||||||
url = {http://nbn-resolving.de/urn:nbn:de:0297-zib-78023}
|
|
||||||
}
|
|
||||||
|
@ -37,7 +37,7 @@ which the user creates a problem description, in this thesis referred to as
|
|||||||
name={common subexpression elimination},
|
name={common subexpression elimination},
|
||||||
description={Common Subexpression Elimination (CSE) is a technique used in the
|
description={Common Subexpression Elimination (CSE) is a technique used in the
|
||||||
evaluation of programming languages to avoid redoing the same work. A
|
evaluation of programming languages to avoid redoing the same work. A
|
||||||
description of how CSE works in \cmls\ can be found in \cref{sec:3-cse}},
|
description of how CSE works in \cmls\ can be found in \cref{sec:4-cse}},
|
||||||
}
|
}
|
||||||
|
|
||||||
\newglossaryentry{gls-csp}{
|
\newglossaryentry{gls-csp}{
|
||||||
|
@ -8,5 +8,5 @@ predicate round_robin(array[int] of var bool: nbhs) =
|
|||||||
select = (last_val(select) + 1) mod N
|
select = (last_val(select) + 1) mod N
|
||||||
endif
|
endif
|
||||||
/\ forall(i in 1..N) (
|
/\ forall(i in 1..N) (
|
||||||
select = i-1 -> nbhs[i] @\Vlabel{line:6:roundrobin:post}@
|
select = i-1 -> nbhs[i] % <-- Post Neighbourhood@\Vlabel{line:6:roundrobin:post}@
|
||||||
);
|
);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
predicate status(var int: stat); @\Vlabel{line:6:status}@
|
predicate status(var int: stat); % <-- @\Vlabel{line:6:status}@
|
||||||
function var STATUS: status() =
|
function var STATUS: status() =
|
||||||
let {
|
let {
|
||||||
var STATUS: stat;
|
var STATUS: stat;
|
||||||
|
@ -98,3 +98,9 @@ outputdir=build,
|
|||||||
% Proof Tree
|
% Proof Tree
|
||||||
\usepackage[nounderscore]{syntax}
|
\usepackage[nounderscore]{syntax}
|
||||||
\usepackage{bussproofs}
|
\usepackage{bussproofs}
|
||||||
|
|
||||||
|
% Half Reif packages (maybe we should get rid of these)
|
||||||
|
\usepackage[all]{xy}
|
||||||
|
% Comments
|
||||||
|
\newcommand{\pjs}[1]{\textcolor{blue}{\Big[\textbf{Peter}: #1\Big]}}
|
||||||
|
\newcommand{\jip}[1]{\textcolor{red}{\Big[\textbf{Jip}: #1\Big]}}
|
||||||
|
@ -71,3 +71,5 @@
|
|||||||
\DeclareMathOperator{\ran}{\mathit{ran}}
|
\DeclareMathOperator{\ran}{\mathit{ran}}
|
||||||
\DeclareMathOperator{\ite}{\mathit{ite}}
|
\DeclareMathOperator{\ite}{\mathit{ite}}
|
||||||
\DeclareMathOperator{\VAR}{\mathit{VAR}}
|
\DeclareMathOperator{\VAR}{\mathit{VAR}}
|
||||||
|
|
||||||
|
\DeclareMathOperator{\dom}{\mathit{idx}}
|
||||||
|
@ -222,7 +222,7 @@ type.
|
|||||||
A \nanozinc\ program, defined in \cref{fig:4-nzn-syntax}, is simply a list
|
A \nanozinc\ program, defined in \cref{fig:4-nzn-syntax}, is simply a list
|
||||||
of calls, where the result of each call is bound to either an identifier or the
|
of calls, where the result of each call is bound to either an identifier or the
|
||||||
constant true. The \syntax{$\sep$ <ident>*} will be used to track dependent
|
constant true. The \syntax{$\sep$ <ident>*} will be used to track dependent
|
||||||
constraints (this will be explained in detail in \cref{sec:6-nanozinc}, for
|
constraints (this will be explained in detail in \cref{sec:4-nanozinc}, for
|
||||||
now you can assume it is empty).
|
now you can assume it is empty).
|
||||||
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
@ -407,15 +407,16 @@ rewritten into \mzninline{int_gt(t,y)} and bound to fresh identifier
|
|||||||
\subsection{Rewriting Rules}
|
\subsection{Rewriting Rules}
|
||||||
|
|
||||||
The core of the proposed \minizinc\ architecture is an abstract machine that
|
The core of the proposed \minizinc\ architecture is an abstract machine that
|
||||||
performs the rewriting of \nanozinc\ items using the corresponding \microzinc
|
performs the rewriting of \nanozinc\ items using the corresponding \microzinc\
|
||||||
function definitions. We can now formally define the rewriting rules for this
|
function definitions. We can now formally define the rewriting rules for this
|
||||||
abstract machine.
|
abstract machine.
|
||||||
|
|
||||||
The full set of rules appears in \cref{fig:4-rewrite-to-nzn}. To simplify
|
The full set of rules appears in
|
||||||
presentation, we assume that all rules that introduce new identifiers into the
|
\cref{fig:4-rewrite-to-nzn-calls,fig:4-rewrite-to-nzn-let,fig:4-rewrite-to-nzn-other}.
|
||||||
\nanozinc\ program do so in a way that ensures those identifiers are fresh
|
To simplify presentation, we assume that all rules that introduce new
|
||||||
(i.e., not used in the rest of the \nanozinc\ program), by suitable alpha
|
identifiers into the \nanozinc\ program do so in a way that ensures those
|
||||||
renaming.
|
identifiers are fresh (\ie\ not used in the rest of the \nanozinc\ program), by
|
||||||
|
suitable alpha renaming.
|
||||||
|
|
||||||
\begin{figure*}
|
\begin{figure*}
|
||||||
\centering
|
\centering
|
||||||
|
@ -8,10 +8,10 @@ $o$ subject to an (existentially quantified) conjunction of primitive
|
|||||||
constraints $c$. But modelling languages such as OPL
|
constraints $c$. But modelling languages such as OPL
|
||||||
\autocite{van-hentenryck-1999-opl}, Zinc/\minizinc\
|
\autocite{van-hentenryck-1999-opl}, Zinc/\minizinc\
|
||||||
\autocite{marriott-2008-zinc, nethercote-2007-minizinc} and Essence
|
\autocite{marriott-2008-zinc, nethercote-2007-minizinc} and Essence
|
||||||
\cite{frisch-2007-essence} allow much more expressive problems to be formulated.
|
\autocite{frisch-2007-essence} allow much more expressive problems to be
|
||||||
Modelling languages map the more expressive formulations to existentially
|
formulated. Modelling languages map the more expressive formulations to
|
||||||
quantified conjunction through a combination of loop unrolling, and flattening
|
existentially quantified conjunction through a combination of loop unrolling,
|
||||||
using reification.
|
and flattening using reification.
|
||||||
|
|
||||||
\begin{example}\label{ex:cons}
|
\begin{example}\label{ex:cons}
|
||||||
Consider the following ``complex constraint'' written in \minizinc\ syntax
|
Consider the following ``complex constraint'' written in \minizinc\ syntax
|
||||||
@ -708,7 +708,7 @@ The flattening proceeds by evaluating fixed Boolean expressions and returning
|
|||||||
the value. We assume $\fixed$ checks if an expression is fixed (determined
|
the value. We assume $\fixed$ checks if an expression is fixed (determined
|
||||||
during \minizinc's type analysis), and $\eval$ evaluates a fixed expression. For
|
during \minizinc's type analysis), and $\eval$ evaluates a fixed expression. For
|
||||||
simplicity of presentation, we assume that fixed expressions are never undefined
|
simplicity of presentation, we assume that fixed expressions are never undefined
|
||||||
(such as \lstinline|3 div 0|). We can extend the algorithms to handle this case,
|
(such as \mzninline{3 div 0}). We can extend the algorithms to handle this case,
|
||||||
but it complicates the presentation. Our implementation aborts in this
|
but it complicates the presentation. Our implementation aborts in this
|
||||||
case.\pjs{CHECK and FIX!} While this does not agree with the relational
|
case.\pjs{CHECK and FIX!} While this does not agree with the relational
|
||||||
semantics it likely indicates a modelling error since a fixed part of the model
|
semantics it likely indicates a modelling error since a fixed part of the model
|
||||||
@ -734,21 +734,21 @@ creates an $\mathit{element}$ constraint. If the context is root this is simple,
|
|||||||
otherwise it creates a new index varaible $v'$ guaranteed to only give correct
|
otherwise it creates a new index varaible $v'$ guaranteed to only give correct
|
||||||
answers, and uses this in the $\mathit{element}$ constraint to avoid
|
answers, and uses this in the $\mathit{element}$ constraint to avoid
|
||||||
undefinedness. Built-in predicates abort if not in the root
|
undefinedness. Built-in predicates abort if not in the root
|
||||||
context.\short{\footnote{Using half reification this can be relaxed to also
|
context.\footnote{Using half reification this can be relaxed to also allow
|
||||||
allow positive contexts.}} They flatten their arguments and add an
|
positive contexts.} They flatten their arguments and add an appropriate
|
||||||
appropriate built-in constraint. \callbyvalue{ User defined predicate
|
built-in constraint. \callbyvalue{ User defined predicate applications flatten
|
||||||
applications flatten their arguments and then flatten a renamed copy of the
|
their arguments and then flatten a renamed copy of the body.} \callbyunroll{
|
||||||
body.} \callbyunroll{ User defined predicate applications are replaced by a
|
User defined predicate applications are replaced by a renamed and flattened
|
||||||
renamed and flattened copy of the body.} \emph{if-then-else} evaluates the
|
copy of the body.} \emph{if-then-else} evaluates the condition (which must be
|
||||||
condition (which must be fixed) and flattens the \emph{then} or \emph{else}
|
fixed) and flattens the \emph{then} or \emph{else} branch appropriately.
|
||||||
branch appropriately. \pjs{USe the same resdtriction, but explain its not all
|
\pjs{USe the same resdtriction, but explain its not all required} The handling
|
||||||
required} The handling of \texttt{let} is the most complicated. The expression
|
of \texttt{let} is the most complicated. The expression is renamed with new
|
||||||
is renamed with new copies of the let variables. We extract the constraints from
|
copies of the let variables. We extract the constraints from the \texttt{let}
|
||||||
the \texttt{let} expression using function \textsf{flatlet} which returns the
|
expression using function \textsf{flatlet} which returns the extracted
|
||||||
extracted constraint and a rewritten term (not used in this case, but used in
|
constraint and a rewritten term (not used in this case, but used in \flatt{}).
|
||||||
\flatt{}). The constraints returned by function \textsf{flatlet} are then
|
The constraints returned by function \textsf{flatlet} are then flattened.
|
||||||
flattened. Finally if we are in the root context, we ensure that the Boolean $b$
|
Finally if we are in the root context, we ensure that the Boolean $b$ returned
|
||||||
returned must be $\true$ by adding $b$ to $S$.
|
must be $\true$ by adding $b$ to $S$.
|
||||||
|
|
||||||
{
|
{
|
||||||
\begin{tabbing}
|
\begin{tabbing}
|
||||||
@ -1229,10 +1229,10 @@ $S$ \cupp $\{ \new b \full (b_1 \wedge b_2)\}$
|
|||||||
% $b \not\in vars(c)$ is a Boolean variable naming the satisfied state of the
|
% $b \not\in vars(c)$ is a Boolean variable naming the satisfied state of the
|
||||||
% constraint $c$.
|
% constraint $c$.
|
||||||
|
|
||||||
% %\newcommand{\new}{\textbf{new}~}
|
%\newcommand{\new}{\textbf{new}~}
|
||||||
% %\newcommand{\flatc}{\textsf{flatc}}
|
%\newcommand{\flatc}{\textsf{flatc}}
|
||||||
% %\newcommand{\flatt}{\textsf{flatt}}
|
%\newcommand{\flatt}{\textsf{flatt}}
|
||||||
% \newcommand{\safen}{\textsf{safen}}
|
\newcommand{\safen}{\textsf{safen}}
|
||||||
|
|
||||||
% The pseudo-code for \flatc($b$,$c$) flattens a constraint expression $c$ to be
|
% The pseudo-code for \flatc($b$,$c$) flattens a constraint expression $c$ to be
|
||||||
% equal to $b$, returning a set of constraints implementing $b \full c$. We
|
% equal to $b$, returning a set of constraints implementing $b \full c$. We
|
||||||
@ -1377,13 +1377,12 @@ $$
|
|||||||
|
|
||||||
% \begin{example}
|
% \begin{example}
|
||||||
% Most propagators check consistency before propagating: e.g.
|
% Most propagators check consistency before propagating: e.g.
|
||||||
% $\sum_i a_i x_i \leq a_0$ determines $L = \sum_i min_D(a_i x_i) - a_0$
|
% $\sum_i a_i x_i \leq a_0$ determines $L = \sum_i min_D(a_i x_i) - a_0$ and
|
||||||
% and fails if $L > 0$ before propagating~\autocite{harveyschimpf};
|
% fails if $L > 0$ before propagating \autocite{harveyschimpf}; Regin's domain
|
||||||
% Regin's domain propagator~\autocite{reginalldifferent} for \alldiff$([x_1, \ldots, x_n])$
|
% propagator \autocite{reginalldifferent} for \alldiff$([x_1, \ldots, x_n])$
|
||||||
% determines a maximum matching between variables and values first,
|
% determines a maximum matching between variables and values first, if this is
|
||||||
% if this is not of size $n$ it fails before propagating;
|
% not of size $n$ it fails before propagating; and the timetable
|
||||||
% and the timetable \texttt{cumulative} constraint~\autocite{cumulative}
|
% \texttt{cumulative} constraint~\autocite{cumulative} determines a profile of
|
||||||
% determines a profile of
|
|
||||||
% necessary resource usage, and fails if this breaks the resource limit,
|
% necessary resource usage, and fails if this breaks the resource limit,
|
||||||
% before considering propagation. \qed
|
% before considering propagation. \qed
|
||||||
% \end{example}
|
% \end{example}
|
||||||
@ -1499,8 +1498,8 @@ not propagate unnecessarily.
|
|||||||
\end{mzn}
|
\end{mzn}
|
||||||
|
|
||||||
which may seem to be more expensive since there are additional variables (the
|
which may seem to be more expensive since there are additional variables (the
|
||||||
$b4[i]$), but since both $b4[i]$ and $a[i]$ are implemented by
|
$b4[i]$), but since both $b4[i]$ and $a[i]$ are implemented by views
|
||||||
views~\autocite{views}, there is no additional runtime overhead. This
|
\autocite{schulte-2005-views}, there is no additional runtime overhead. This
|
||||||
decomposition will only wake the linear constraint when some task $i$ is
|
decomposition will only wake the linear constraint when some task $i$ is
|
||||||
guaranteed to overlap time $s[j]$.
|
guaranteed to overlap time $s[j]$.
|
||||||
\end{example}
|
\end{example}
|
||||||
@ -2156,55 +2155,56 @@ the usual case for such a trivial propagator.
|
|||||||
% consistent propagator for $b \half b''$. Similarly define
|
% consistent propagator for $b \half b''$. Similarly define
|
||||||
% $f_{b' \half \neg c}(D) =_{vars(b' \full c)} \solv(\{f_{b''' \full c}, f_{b' \half \neg b'''} \}, D)$
|
% $f_{b' \half \neg c}(D) =_{vars(b' \full c)} \solv(\{f_{b''' \full c}, f_{b' \half \neg b'''} \}, D)$
|
||||||
|
|
||||||
\begin{theorem}
|
\jip{There is a proof here, but I don't have a proof environment yet}
|
||||||
$\forall D. \solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D) = \solv(\{ f_{b \half c}, f_{b' \half \neg c}, f_{b' \full \neg b}\}, D)$.
|
% \begin{theorem}
|
||||||
\end{theorem}
|
% $\forall D. \solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D) = \solv(\{ f_{b \half c}, f_{b' \half \neg c}, f_{b' \full \neg b}\}, D)$.
|
||||||
\begin{proof}
|
% \end{theorem}
|
||||||
Let $V = vars(c)$. First w.l.o.g. we only consider domains $D$ at a fixpoint
|
% \begin{proof}
|
||||||
of the propagators $f_{b' \full \neg b}$, i.e.
|
% Let $V = vars(c)$. First w.l.o.g. we only consider domains $D$ at a fixpoint
|
||||||
$D(b') = \{ \neg d ~|~ d \in D(b)\}$, since both $\solv$ expressions include
|
% of the propagators $f_{b' \full \neg b}$, i.e.
|
||||||
$f_{b' \full \neg b}$. Let
|
% $D(b') = \{ \neg d ~|~ d \in D(b)\}$, since both $\solv$ expressions include
|
||||||
$D' = \solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D)$, now since
|
% $f_{b' \full \neg b}$. Let
|
||||||
$f_{b \full c}$ and $f_{b' \full \neg b}$ are idempotent and $D$ is a fixpoint
|
% $D' = \solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D)$, now since
|
||||||
of $f_{b' \full \neg b}$, then $D' = f_{b' \full \neg b}(f_{b \full c}(D))$.
|
% $f_{b \full c}$ and $f_{b' \full \neg b}$ are idempotent and $D$ is a fixpoint
|
||||||
Let
|
% of $f_{b' \full \neg b}$, then $D' = f_{b' \full \neg b}(f_{b \full c}(D))$.
|
||||||
$D'' = \solv(\{ f_{b \half c}, f_{b' \half \neg c}, f_{b' \full \neg b}\}, D)$.
|
% Let
|
||||||
The proof is by cases of $D$.
|
% $D'' = \solv(\{ f_{b \half c}, f_{b' \half \neg c}, f_{b' \full \neg b}\}, D)$.
|
||||||
|
% The proof is by cases of $D$.
|
||||||
|
|
||||||
\textbf{(a)} Suppose $D(b) = \{\true,\false\}$. \textbf{(a-i)} Suppose
|
% \textbf{(a)} Suppose $D(b) = \{\true,\false\}$. \textbf{(a-i)} Suppose
|
||||||
$f_{b \full c}(D) = D$. Then clearly $f_{b \half c}(D) = D$ by definition, and
|
% $f_{b \full c}(D) = D$. Then clearly $f_{b \half c}(D) = D$ by definition, and
|
||||||
similarly $f_{b' \half \neg c}(D) = D$. Hence $D_1 = D_2 = D$. Note that since
|
% similarly $f_{b' \half \neg c}(D) = D$. Hence $D_1 = D_2 = D$. Note that since
|
||||||
$f_{b \full c}$ is reified consistent, then $f_{b \full c}(D) \neq D$ implies
|
% $f_{b \full c}$ is reified consistent, then $f_{b \full c}(D) \neq D$ implies
|
||||||
that $f_{b \full c}(D)(b) \neq \{ \false, \true \}$. \textbf{(a-ii)} Suppose
|
% that $f_{b \full c}(D)(b) \neq \{ \false, \true \}$. \textbf{(a-ii)} Suppose
|
||||||
$f_{b \full c}(D)(b) = \{ \true \}$. Let $D_1 = f_{b' \half \neg c}(D)$, then
|
% $f_{b \full c}(D)(b) = \{ \true \}$. Let $D_1 = f_{b' \half \neg c}(D)$, then
|
||||||
$D_1(b') = \{ \false \}$ by definition and $D_1(v) = D(v), v \not\equiv b'$.
|
% $D_1(b') = \{ \false \}$ by definition and $D_1(v) = D(v), v \not\equiv b'$.
|
||||||
Let $D_2 = f_{b' \full \neg b}(D_1)$ then $D_2(b)= \{ \true \}$ and
|
% Let $D_2 = f_{b' \full \neg b}(D_1)$ then $D_2(b)= \{ \true \}$ and
|
||||||
$D_2(v) = D(v), v \not\in \{b,b'\}$. Then
|
% $D_2(v) = D(v), v \not\in \{b,b'\}$. Then
|
||||||
$D_3 = f_{b \half c}(D_2) = f_{b \full c}(D_2)$ by definition, and by
|
% $D_3 = f_{b \half c}(D_2) = f_{b \full c}(D_2)$ by definition, and by
|
||||||
idempotence of $f_{b \full c}$ and since $D_2$ and $D$ differ only on $b$ and
|
% idempotence of $f_{b \full c}$ and since $D_2$ and $D$ differ only on $b$ and
|
||||||
$b'$ this is a fixpoint of $f_{b \full c}$ and
|
% $b'$ this is a fixpoint of $f_{b \full c}$ and
|
||||||
$D_3(v) = f_{b \full c}(D)(v), v \not \equiv b'$. $D_3$ is also a fixpoint of
|
% $D_3(v) = f_{b \full c}(D)(v), v \not \equiv b'$. $D_3$ is also a fixpoint of
|
||||||
$f_{b \half c}$, $f_{b' \full \neg b}$ and $f_{b' \half \neg c}$ and hence
|
% $f_{b \half c}$, $f_{b' \full \neg b}$ and $f_{b' \half \neg c}$ and hence
|
||||||
$D'' = D_3$. But also $D' = f_{b' \full \neg b}(f_{b \full c}(D)) = D_3$ since
|
% $D'' = D_3$. But also $D' = f_{b' \full \neg b}(f_{b \full c}(D)) = D_3$ since
|
||||||
$D_3$ and $f_{b \full c}(D)$ only differ on $b'$. \textbf{(a-iii)} Suppose
|
% $D_3$ and $f_{b \full c}(D)$ only differ on $b'$. \textbf{(a-iii)} Suppose
|
||||||
$f_{b \full c}(D)(b) = \{ \false \}$. Let $D_1 = f_{b \half c}(D)$, then
|
% $f_{b \full c}(D)(b) = \{ \false \}$. Let $D_1 = f_{b \half c}(D)$, then
|
||||||
$D_1(b) = \{ \false \}$ by definition and $D_1(v) = D(v), v \not\equiv b$. Let
|
% $D_1(b) = \{ \false \}$ by definition and $D_1(v) = D(v), v \not\equiv b$. Let
|
||||||
$D_2 = f_{b' \full \neg b}(D_1)$ then $D_2(b')= \{ \true \}$ and
|
% $D_2 = f_{b' \full \neg b}(D_1)$ then $D_2(b')= \{ \true \}$ and
|
||||||
$D_2(v) = D(v), v \not\in \{b,b'\}$. Then
|
% $D_2(v) = D(v), v \not\in \{b,b'\}$. Then
|
||||||
$D_3 = f_{b' \half \neg c}(D_2) = f_{b \full c}(D_2)$ by definition, and by
|
% $D_3 = f_{b' \half \neg c}(D_2) = f_{b \full c}(D_2)$ by definition, and by
|
||||||
idempotence of $f_{b \full c}$ and since $D_2$ and $D$ differ only on $b$ and
|
% idempotence of $f_{b \full c}$ and since $D_2$ and $D$ differ only on $b$ and
|
||||||
$b'$ this is a fixpoint for $f_{b \half c}$, $f_{b' \full \neg b}$ and
|
% $b'$ this is a fixpoint for $f_{b \half c}$, $f_{b' \full \neg b}$ and
|
||||||
$f_{b' \half \neg c}$ and hence $D'' = D_3$. But also
|
% $f_{b' \half \neg c}$ and hence $D'' = D_3$. But also
|
||||||
$D' = f_{b' \full \neg b}(f_{b \full c}(D)) = D_3$ since $D_3$ and
|
% $D' = f_{b' \full \neg b}(f_{b \full c}(D)) = D_3$ since $D_3$ and
|
||||||
$f_{b \full c}(D)$ only differ on $b'$.
|
% $f_{b \full c}(D)$ only differ on $b'$.
|
||||||
|
|
||||||
\textbf{(b)} If $D(b) = \{\true\}$ then clearly $f_{b \full c}$ and
|
% \textbf{(b)} If $D(b) = \{\true\}$ then clearly $f_{b \full c}$ and
|
||||||
$f_{b \half c}$ act identically on variables in $vars(c)$.
|
% $f_{b \half c}$ act identically on variables in $vars(c)$.
|
||||||
|
|
||||||
\textbf{(c)} If $D(b) = \{\false\}$ then $D(b') = \{\true\}$ and clearly
|
% \textbf{(c)} If $D(b) = \{\false\}$ then $D(b') = \{\true\}$ and clearly
|
||||||
$f_{b \full c}$ and $f_{b' \half \neg c}$ act identically on variables in
|
% $f_{b \full c}$ and $f_{b' \half \neg c}$ act identically on variables in
|
||||||
$vars(c)$. \qed
|
% $vars(c)$. \qed
|
||||||
\end{proof}
|
% \end{proof}
|
||||||
|
|
||||||
The reason for the generality of the above theorem which defines the
|
The reason for the generality of the above theorem which defines the
|
||||||
half-reified propagation strength in terms of the full reified propagator is
|
half-reified propagation strength in terms of the full reified propagator is
|
||||||
@ -2214,11 +2214,12 @@ fully reified propagator leads to the same propagation.
|
|||||||
Note that the additional variable $b'$ can be implemented as a view
|
Note that the additional variable $b'$ can be implemented as a view
|
||||||
\autocite{schulte-2005-views} in the solver and hence adds no overhead.
|
\autocite{schulte-2005-views} in the solver and hence adds no overhead.
|
||||||
|
|
||||||
\begin{corollary}
|
\jip{The corollary environment is also missing}
|
||||||
A domain (resp. bounds(Z), bounds(R)) consistent propagator for $b \full c$
|
% \begin{corollary}
|
||||||
propagates identically to domain (resp. bounds(Z), bounds(R)) consistent
|
% A domain (resp. bounds(Z), bounds(R)) consistent propagator for $b \full c$
|
||||||
propagators for $b \half c$, $b \full \neg b'$, $b' \half \neg c$. \qed
|
% propagates identically to domain (resp. bounds(Z), bounds(R)) consistent
|
||||||
\end{corollary}
|
% propagators for $b \half c$, $b \full \neg b'$, $b' \half \neg c$. \qed
|
||||||
|
% \end{corollary}
|
||||||
|
|
||||||
|
|
||||||
\section{Propagation and Half Reification}
|
\section{Propagation and Half Reification}
|
||||||
@ -2522,9 +2523,9 @@ Nodes &
|
|||||||
|
|
||||||
In the final experiment we compare resource constrained project scheduling
|
In the final experiment we compare resource constrained project scheduling
|
||||||
problems (RCPSP) where the \texttt{cumulative} constraint is defined by the task
|
problems (RCPSP) where the \texttt{cumulative} constraint is defined by the task
|
||||||
decomposition as in Example~\ref{ex:cumul} above, using both full reification
|
decomposition as in \cref{ex:cumul} above, using both full reification and
|
||||||
and half-reification. We use standard benchmark examples from
|
half-reification. We use standard benchmark examples from PSPlib
|
||||||
PSPlib~\autocite{psplib}. Table~\ref{tab:rcpsp} compares RCPSP instances using
|
\autocite{kolisch-1997-psplib}. \Cref{tab:rcpsp} compares RCPSP instances using
|
||||||
\textsf{full} reification and \textsf{half} reification. We compare using J30
|
\textsf{full} reification and \textsf{half} reification. We compare using J30
|
||||||
instances (\textsf{J30} ) and instances due to Baptiste and Le Pape
|
instances (\textsf{J30} ) and instances due to Baptiste and Le Pape
|
||||||
(\textsf{BL}). Each line in the table shows the average run time and number of
|
(\textsf{BL}). Each line in the table shows the average run time and number of
|
||||||
@ -2550,7 +2551,6 @@ J30 (x 480) & 116.1 & 300 & 114.3 & 304 & 16.9 & 463 & 12.9 & 468\\
|
|||||||
\hline
|
\hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{center}
|
\end{center}
|
||||||
\tableend
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
\subsection{MiniZinc Challenge}
|
\subsection{MiniZinc Challenge}
|
||||||
@ -2559,8 +2559,9 @@ To verify the effectiveness of the half reification implementation within the
|
|||||||
\minizinc{} distribution we compare the results of the current version of the
|
\minizinc{} distribution we compare the results of the current version of the
|
||||||
\minizinc{} translator (rev. \jip{add revision}) against the equivalent version
|
\minizinc{} translator (rev. \jip{add revision}) against the equivalent version
|
||||||
for which we have implemented half reification. We use the model instances used
|
for which we have implemented half reification. We use the model instances used
|
||||||
by the \minizinc{} challenges\autocite{challenge} from 2012 until 2017. Note
|
by the \minizinc{} challenges
|
||||||
that the instances that the instances without any reifications have been
|
\autocite{stuckey-2010-challenge,stuckey-2014-challenge} from 2012 until 2017.
|
||||||
|
Note that the instances that the instances without any reifications have been
|
||||||
excluded from the experiment as they would not experience any change. The
|
excluded from the experiment as they would not experience any change. The
|
||||||
performance of the generated \flatzinc{} models will be tested using Gecode,
|
performance of the generated \flatzinc{} models will be tested using Gecode,
|
||||||
flattened with its own library, and Gurobi and CBC, flattened with the linear
|
flattened with its own library, and Gurobi and CBC, flattened with the linear
|
||||||
@ -2581,7 +2582,6 @@ library.
|
|||||||
\hline
|
\hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{center}
|
\end{center}
|
||||||
\tableend
|
|
||||||
\end{table}
|
\end{table}
|
||||||
\jip{Better headers for table \ref{tab:flat_results} and update with current
|
\jip{Better headers for table \ref{tab:flat_results} and update with current
|
||||||
results}
|
results}
|
||||||
@ -2608,24 +2608,25 @@ of memory running the Ubuntu 16.04.3 LTS operating system.
|
|||||||
|
|
||||||
Half reification on purely Boolean constraints is well understood, this is the
|
Half reification on purely Boolean constraints is well understood, this is the
|
||||||
same as detecting the \emph{polarity} of a gate, and removing half of the
|
same as detecting the \emph{polarity} of a gate, and removing half of the
|
||||||
clausal representation of the circuit (see e.g.~\autocite{polarity}). The
|
clausal representation of the circuit (see \eg\
|
||||||
flattening of functions (partial or total) and the calculation of polarity for
|
\autocite{plaisted-1986-polarity}). The flattening of functions (partial or
|
||||||
Booleans terms inside \texttt{bool2int} do not arise in pure Boolean
|
total) and the calculation of polarity for Booleans terms inside
|
||||||
constraints.
|
\texttt{bool2int} do not arise in pure Boolean constraints.
|
||||||
|
|
||||||
Half reified constraints have been used in constraint modeling but are typically
|
Half reified constraints have been used in constraint modeling but are typically
|
||||||
not visible as primitive constraints to users, or produced through flattening.
|
not visible as primitive constraints to users, or produced through flattening.
|
||||||
Indexicals~\autocite{indexicals} can be used to implement reified constraints by
|
Indexicals \autocite{van-hentenryck-1992-indexicals} can be used to implement
|
||||||
specifying how to propagate a constraint $c$, %($prop(c)$),
|
reified constraints by specifying how to propagate a constraint
|
||||||
|
$c$, %($prop(c)$),
|
||||||
propagate its negation,
|
propagate its negation,
|
||||||
%$prop(\neg c)$,
|
%$prop(\neg c)$,
|
||||||
check disentailment, % $check(c)$,
|
check disentailment, % $check(c)$,
|
||||||
and check entailment, %$check(\neg c)$,
|
and check entailment, %$check(\neg c)$,
|
||||||
and this is implemented in SICstus Prolog~\autocite{sicstus}. A half reified
|
and this is implemented in SICstus Prolog \autocite{carlsson-1997-sicstus}. A
|
||||||
propagator simply omits entailment and propagating the negation.
|
half reified propagator simply omits entailment and propagating the negation.
|
||||||
%$prop(\neg c)$ and $check(\neg c)$.
|
% $prop(\neg c)$ and $check(\neg c)$. Half reification was briefly discussed in
|
||||||
%Half reification was briefly discussed in our earlier work~\autocite{cp2009d},
|
% our earlier work \autocite{cp2009d}, in terms of its ability to reduce
|
||||||
%in terms of its ability to reduce propagation.
|
% propagation.
|
||||||
Half reified constraints appear in some constraint systems, for example SCIP
|
Half reified constraints appear in some constraint systems, for example SCIP
|
||||||
\autocite{gamrath-2020-scip} supports half-reified real linear constraints of
|
\autocite{gamrath-2020-scip} supports half-reified real linear constraints of
|
||||||
the form $b \half \sum_i a_i x_i \leq a_0$ exactly because the negation of the
|
the form $b \half \sum_i a_i x_i \leq a_0$ exactly because the negation of the
|
||||||
@ -2639,11 +2640,11 @@ strongly. Schulte proposes a generic implementation of $b \full c$ propagating
|
|||||||
the original variables \autocite*{schulte-2000-deep}; entailment and
|
the original variables \autocite*{schulte-2000-deep}; entailment and
|
||||||
disentailment of $c$ fix the $b$ variable appropriately, although when $b$ is
|
disentailment of $c$ fix the $b$ variable appropriately, although when $b$ is
|
||||||
made $\false$ the implementation does not propagate $\neg c$. This can also be
|
made $\false$ the implementation does not propagate $\neg c$. This can also be
|
||||||
implemented using propagator groups~\autocite{groups}. Brand and Yap define an
|
implemented using propagator groups \autocite{lagerkvist-2009-groups}. Brand and
|
||||||
approach to propagating complex constraint formulae called controlled
|
Yap define an approach to propagating complex constraint formulae called
|
||||||
propagation which ensures that propagators that cannot affect the satisfiability
|
controlled propagation which ensures that propagators that cannot affect the
|
||||||
are not propagated \autocite*{brand-2006-propagation}. They note that for a
|
satisfiability are not propagated \autocite*{brand-2006-propagation}. They note
|
||||||
formula without negation, they could omit half their control rules,
|
that for a formula without negation, they could omit half their control rules,
|
||||||
corresponding to the case for half reification of a positive context. Jefferson
|
corresponding to the case for half reification of a positive context. Jefferson
|
||||||
et al. similarly define an approach to propagating positive constraint formulae
|
et al. similarly define an approach to propagating positive constraint formulae
|
||||||
by using watch literal technology to only wake propagators for reified
|
by using watch literal technology to only wake propagators for reified
|
||||||
|
@ -671,7 +671,7 @@ model was flattened, then this flattening can be performed without any
|
|||||||
trailing.
|
trailing.
|
||||||
|
|
||||||
\begin{example}\label{ex:6-trail}
|
\begin{example}\label{ex:6-trail}
|
||||||
Let us look again at the resulting \nanozinc\ code from \Cref{ex:absreif}:
|
Let us look again at the resulting \nanozinc\ code from \cref{ex:4-absreif}:
|
||||||
|
|
||||||
% \mznfile{assets/mzn/6_abs_reif_result.mzn}
|
% \mznfile{assets/mzn/6_abs_reif_result.mzn}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ following publication:
|
|||||||
\include{chapters/2_background}
|
\include{chapters/2_background}
|
||||||
\include{chapters/3_paradigms}
|
\include{chapters/3_paradigms}
|
||||||
\include{chapters/4_rewriting}
|
\include{chapters/4_rewriting}
|
||||||
% \include{chapters/5_half_reif}
|
\include{chapters/5_half_reif}
|
||||||
\include{chapters/6_incremental}
|
\include{chapters/6_incremental}
|
||||||
|
|
||||||
\backmatter{}
|
\backmatter{}
|
||||||
|
Reference in New Issue
Block a user