Add section on constraint aggregation

This commit is contained in:
Jip J. Dekker 2021-04-09 16:48:14 +10:00
parent bbe7ecb848
commit 7d1fdfe6c0
No known key found for this signature in database
GPG Key ID: 517DF4A00618C9C3

View File

@ -1025,6 +1025,56 @@ addition recognises constraints in \emph{positive} contexts, also known as
\emph{half-reified} \autocite{feydy-2011-half-reif}. A full explanation and \emph{half-reified} \autocite{feydy-2011-half-reif}. A full explanation and
discussion of half-reification can be found in \cref{ch:half_reif}. discussion of half-reification can be found in \cref{ch:half_reif}.
\subsection{Constraint \titlecap{\glsentrytext{aggregation}}}%
\label{subsec:rew-aggregation}
Complex \minizinc\ expression can sometimes result in the creation of many new
variables that represent intermediate results. This is in particular true for
linear and boolean equations that are generally written using \minizinc\
operators. For example the evaluation of the linear constraint \mzninline{x +
2*y <= z} will result in the following \nanozinc:
\begin{nzn}
var int: x;
var int: y;
var int: z;
var int: i1;
└── constraint int_times(y, 2);
var int: i2;
└── constraint int_plus(x, i1);
constraint int_le(i2, z);
\end{nzn}
These \nanozinc\ definitions are correct, but, at least for \gls{mip} solvers,
the existence of the intermediate variables is likely to have a negative impact
on the solvers performance. These solves would likely performed better had they
received the linear constraint \mzninline{int_lin_le([1,2,-1], [x,y,z], 0)}
directly. Since many solvers support linear constraints, it is often an
additional burden to have intermediate values that have to be given a value in
the solution.
This can be resolved using the aggregation of constraints. When we aggregate
constraints we combine constraints connected through functional definitions into
one or multiple constraints eliminating the need for intermediate variables. For
example, the arithmetic definitions can be combined into linear constraints,
Boolean logic can be combined into clauses, and counting constraints can be
combined into global cardinality constraints.
In \nanozinc, we are able to aggregate constraints during partial evaluation. To
aggregate a certain kind of constraint, the solver must the constraint as a
solver-level primitive. These constraints will now be kept as temporary
functional definitions in the \nanozinc\ program. Once a top-level (relational)
constraint is posted that uses the temporary functional definitions as one of
its arguments, the interpreter will employ dedicated aggregation logic to visit
the functional definitions and combine their constraints. The top-level
constraint constraint is then replaced by the combined constraint. When the
intermediate variables become unused, they will be removed using the normal
mechanisms.
\jip{TODO: Add the example of aggregating the previous example from the
\nanozinc\ to the linear expression.}
\section{Experiments}\label{sec:4-experiments} \section{Experiments}\label{sec:4-experiments}
We have created a prototype implementation of the architecture presented in the We have created a prototype implementation of the architecture presented in the
@ -1064,7 +1114,7 @@ average, the new system achieves a speed-up of \(2.3\), with very few instances
not achieving any speedup. In terms of memory performance not achieving any speedup. In terms of memory performance
(\cref{sfig:4-comparemem}), version 2.4.3 can sometimes still outperform the new (\cref{sfig:4-comparemem}), version 2.4.3 can sometimes still outperform the new
prototype. We have identified that the main memory bottlenecks are our currently prototype. We have identified that the main memory bottlenecks are our currently
unoptimised implementations of CSE lookup tables and argument vectors. unoptimised implementations of \gls{cse} lookup tables and argument vectors.
These are very encouraging results, given that we are comparing a largely These are very encouraging results, given that we are comparing a largely
unoptimised prototype to a mature piece of software. unoptimised prototype to a mature piece of software.