Work on HR

This commit is contained in:
Jip J. Dekker 2021-05-20 16:50:54 +10:00
parent 2941ab6a32
commit 0c5ede4581
No known key found for this signature in database
GPG Key ID: 517DF4A00618C9C3
4 changed files with 149 additions and 78 deletions

View File

@ -169,6 +169,11 @@
description={}, description={},
} }
\newglossaryentry{half-reif}{
name={half reification},
description={},
}
\newglossaryentry{indicator-var}{ \newglossaryentry{indicator-var}{
name={indicator variable}, name={indicator variable},
description={}, description={},

View File

@ -18,7 +18,7 @@
\newcommand{\variable}{\gls{variable}\xspace{}} \newcommand{\variable}{\gls{variable}\xspace{}}
\newcommand{\zinc}{\gls{zinc}\xspace{}} \newcommand{\zinc}{\gls{zinc}\xspace{}}
% Semantic shorthands (rewriting)
\renewcommand{\phi}{\varphi} \renewcommand{\phi}{\varphi}
\newcommand{\tuple}[1]{\ensuremath{\langle #1 \rangle}} \newcommand{\tuple}[1]{\ensuremath{\langle #1 \rangle}}
\newcommand{\Prog}{\ensuremath{\mathcal{P}}} \newcommand{\Prog}{\ensuremath{\mathcal{P}}}
@ -27,54 +27,12 @@
\newcommand{\Sem}[2]{\ptinline{[\!\![#1]\!\!]\tuple{#2}}} \newcommand{\Sem}[2]{\ptinline{[\!\![#1]\!\!]\tuple{#2}}}
\newcommand{\Cbind}{\ensuremath{\wedge}} \newcommand{\Cbind}{\ensuremath{\wedge}}
% Context shorthands (half-reification)
\newcommand{\rootc}{\textit{root}}
\newcommand{\posc}{\textit{pos}}
\newcommand{\negc}{\textit{neg}}
\newcommand{\mixc}{\textit{mix}}
\newcommand{\changepos}{\ensuremath{+}}
\newcommand{\changeneg}{\ensuremath{-}}
\newcommand{\undefined}{\ensuremath{\bot}} \newcommand{\undefined}{\ensuremath{\bot}}
% Half-reification math things
\newcommand{\VV}{{\cal\ V}}
\newcommand{\PP}{{\cal\ P}}
\newcommand{\range}[2]{\left[\,#1\,..\,#2\,\right]}
\newcommand{\gfp}{\textup{gfp}}
\newcommand{\lfp}{\textup{lfp}}
\newcommand{\iter}{\mathit{iter}}
\newcommand{\half}{\Rightarrow}
\newcommand{\full}{\Leftrightarrow}
\renewcommand{\half}{\rightarrow}
\renewcommand{\full}{\leftrightarrow}
\newcommand{\entails}{\models}
\newcommand{\bigsqcap}{\mathop{\lower.1ex\hbox{\Large$\sqcap$}}}
\DeclareMathOperator{\rules}{\mathit{rules}}
\DeclareMathOperator{\lazy}{\mathit{lazy}}
\DeclareMathOperator{\events}{\mathit{events}}
\DeclareMathOperator{\domain}{\mathit{domain}}
\DeclareMathOperator{\bc}{\mathit{bc}}
\DeclareMathOperator{\lbc}{\mathit{lbc}}
\DeclareMathOperator{\ubc}{\mathit{ubc}}
\DeclareMathOperator{\dmc}{\mathit{dmc}}
\DeclareMathOperator{\fix}{\mathit{fix}}
\DeclareMathOperator{\event}{\mathit{event}}
\DeclareMathOperator{\minassign}{\mathit{minassign}}
\DeclareMathOperator{\assign}{\mathit{assign}}
\DeclareMathOperator{\cl}{\mathit{cl}}
\DeclareMathOperator{\UP}{\mathit{UP}}
\DeclareMathOperator{\up}{\mathit{up}}
\DeclareMathOperator{\DOM}{\mathit{DOM}}
\DeclareMathOperator{\setb}{\mathit{sb}}
\DeclareMathOperator{\bnd}{\mathit{bnd}}
\DeclareMathOperator{\dsb}{\mathit{dsb}}
\DeclareMathOperator{\vars}{\mathit{vars}}
\DeclareMathOperator{\ivars}{\mathit{input}}
\DeclareMathOperator{\ovars}{\mathit{output}}
\DeclareMathOperator{\solns}{\mathit{solns}}
\DeclareMathOperator{\solv}{\mathit{solv}}
\DeclareMathOperator{\isolv}{\mathit{isolv}}
\DeclareMathOperator{\conv}{\mathit{conv}}
\DeclareMathOperator{\ran}{\mathit{ran}}
\DeclareMathOperator{\ite}{\mathit{ite}}
\DeclareMathOperator{\VAR}{\mathit{VAR}}
\DeclareMathOperator{\dom}{\mathit{idx}}

View File

@ -2,14 +2,23 @@
\chapter{Context Analysis and Half Reification}\label{ch:half-reif} \chapter{Context Analysis and Half Reification}\label{ch:half-reif}
%************************************************ %************************************************
\section{Context Analysis}% In this chapter we study the usage of \gls{half-reif}. When a constraint \mzninline{pred(...)} is reified a
\label{sec:half-context}
\begin{itemize} \begin{itemize}
\item What (again) are the contexts? \item Flattening with half reification can naturally produce the relational
\item Why are they important semantics when flattening partial functions in positive contexts.
\item When can we use half-reification \item Half reified constraints add no burden to the solver writer; if they
\item How does the analysis work? have a propagator for constraint \mzninline{pred(....)} then they can
straightforwardly construct a half reified propagator for \mzninline{b
-> pred(...)}.
\item Half reified constraints \mzninline{b -> pred(...)} can implement fully
reified constraints without any loss of propagation strength (assuming
reified constraints are negatable).
\item Flattening with half reification can produce more efficient propagation
when flattening complex constraints.
\item Flattening with half reification can produce smaller linear models when
used with a mixed integer programming solver.
\end{itemize} \end{itemize}
\section{Propagation and Half Reification}% \section{Propagation and Half Reification}%
@ -22,9 +31,58 @@
\item experimental results \item experimental results
\end{itemize} \end{itemize}
A propagation engine gains certain advantages from half-reification, but also
may suffer certain penalties. Half reification can cause propagators to wake up
less frequently, since variables that are fixed to true by full reification will
never be fixed by half reification. This is advantageous, but a corresponding
disadvantage is that variables that are fixed can allow the simplification of
the propagator, and hence make its propagation faster.
When full reification is applicable (where we are not using half reified
predicates) an alternative to half reification is to implement full reification
\mzninline{x <-> pred(...)} by two half reified propagators \mzinline{x ->
pred(...)}, \mzninline{y \half \neg pred(...)}, \mzninline{x <-> not y}. This
does not lose propagation strength. For Booleans appearing in a positive context
we can make the the propagator \mzninline{y -> not pred(...)} run at the lowest
priority, since it will never cause failure. Similarly in negative contexts we
can make the propagator \mzninline{b -> pred(...)} run at the lowest priority.
This means that Boolean variables are still fixed at the same time, but there is
less overhead.
\section{Decomposition and Half Reification}% \section{Decomposition and Half Reification}%
\label{sec:half-decomposition} \label{sec:half-decomposition}
\section{Context Analysis}%
\label{sec:half-context}
\begin{tabular}{ccc}
\(
\begin{array}{lcl}
\changepos \rootc & = &\posc \\
\changepos \posc & =& \posc \\
\changepos \negc & =& \negc \\
\changepos \mixc & =& \mixc
\end{array}
\)
&~&
\(
\begin{array}{lcl}
\negop \rootc & = &\negc \\
\negop \posc & = & \negc \\
\negop \negc & = & \posc \\
\negop \mixc & = & \mixc
\end{array}
\)
\end{tabular}
\begin{itemize}
\item What (again) are the contexts?
\item Why are they important
\item When can we use half-reification
\item How does the analysis work?
\end{itemize}
\section{Flattening and Half Reification}% \section{Flattening and Half Reification}%
\label{sec:half-flattening} \label{sec:half-flattening}

View File

@ -2,6 +2,56 @@
\chapter{TEMP: Half Reification Journal Paper}\label{ch:half-reif-journal} \chapter{TEMP: Half Reification Journal Paper}\label{ch:half-reif-journal}
%************************************************ %************************************************
% %
% Half-reification math things
\newcommand{\VV}{{\cal\ V}}
\newcommand{\PP}{{\cal\ P}}
\newcommand{\range}[2]{\left[\,#1\,..\,#2\,\right]}
\newcommand{\gfp}{\textup{gfp}}
\newcommand{\lfp}{\textup{lfp}}
\newcommand{\iter}{\mathit{iter}}
\newcommand{\half}{\Rightarrow}
\newcommand{\full}{\Leftrightarrow}
\renewcommand{\half}{\rightarrow}
\renewcommand{\full}{\leftrightarrow}
\newcommand{\entails}{\models}
% \newcommand{\bigsqcap}{\mathop{\lower.1ex\hbox{\Large$\sqcap$}}}
% \DeclareMathOperator{\rules}{\mathit{rules}}
% \DeclareMathOperator{\lazy}{\mathit{lazy}}
% \DeclareMathOperator{\events}{\mathit{events}}
% \DeclareMathOperator{\domain}{\mathit{domain}}
% \DeclareMathOperator{\bc}{\mathit{bc}}
% \DeclareMathOperator{\lbc}{\mathit{lbc}}
% \DeclareMathOperator{\ubc}{\mathit{ubc}}
% \DeclareMathOperator{\dmc}{\mathit{dmc}}
% \DeclareMathOperator{\fix}{\mathit{fix}}
% \DeclareMathOperator{\event}{\mathit{event}}
% \DeclareMathOperator{\minassign}{\mathit{minassign}}
% \DeclareMathOperator{\assign}{\mathit{assign}}
% \DeclareMathOperator{\cl}{\mathit{cl}}
% \DeclareMathOperator{\UP}{\mathit{UP}}
% \DeclareMathOperator{\up}{\mathit{up}}
% \DeclareMathOperator{\DOM}{\mathit{DOM}}
% \DeclareMathOperator{\setb}{\mathit{sb}}
% \DeclareMathOperator{\bnd}{\mathit{bnd}}
% \DeclareMathOperator{\dsb}{\mathit{dsb}}
% \DeclareMathOperator{\vars}{\mathit{vars}}
% \DeclareMathOperator{\ivars}{\mathit{input}}
% \DeclareMathOperator{\ovars}{\mathit{output}}
% \DeclareMathOperator{\solns}{\mathit{solns}}
% \DeclareMathOperator{\solv}{\mathit{solv}}
% \DeclareMathOperator{\isolv}{\mathit{isolv}}
% \DeclareMathOperator{\conv}{\mathit{conv}}
% \DeclareMathOperator{\ran}{\mathit{ran}}
% \DeclareMathOperator{\ite}{\mathit{ite}}
% \DeclareMathOperator{\VAR}{\mathit{VAR}}
% \DeclareMathOperator{dom}{\mathit{idx}}
%
Discrete optimisation solvers solve constraint optimisation problems of the form Discrete optimisation solvers solve constraint optimisation problems of the form
\(\min o \text{~subject to~} \wedge_{c \in C} c\), that is minimising an \(\min o \text{~subject to~} \wedge_{c \in C} c\), that is minimising an
objective \(o\) subject to an (existentially quantified) conjunction of objective \(o\) subject to an (existentially quantified) conjunction of
@ -244,12 +294,12 @@ correspondingly typed values, written
% PJS (not true unless \theta is in D) % PJS (not true unless \theta is in D)
% where \(d_i \in D(x_i)\) and \(A_j \in D(S_j)\). % where \(d_i \in D(x_i)\) and \(A_j \in D(S_j)\).
We extend the valuation \(\theta\) to map expressions or constraints involving the We extend the valuation \(\theta\) to map expressions or constraints involving the
variables in the natural way. Let \(\vars\) be the function that returns the set variables in the natural way. Let vars be the function that returns the set
of variables appearing in an expression, constraint or valuation. of variables appearing in an expression, constraint or valuation.
In an abuse of notation, we define a valuation \(\theta\) to be an element of a In an abuse of notation, we define a valuation \(\theta\) to be an element of a
domain \(D\), written \(\theta \in D\), if \(\theta(v) \in D(v)\) for all domain \(D\), written \(\theta \in D\), if \(\theta(v) \in D(v)\) for all
\(v \in \vars(\theta)\). \(v \in vars(\theta)\).
%\paragraph{Constraints, Propagators and Propagation Solvers} %\paragraph{Constraints, Propagators and Propagation Solvers}
@ -261,7 +311,7 @@ variables.
%% over integer and set variables. %% over integer and set variables.
We define the \emph{solutions} of a constraint \(c\) to be the set of valuations We define the \emph{solutions} of a constraint \(c\) to be the set of valuations
\(\theta\) that make that constraint true, i.e. \(\theta\) that make that constraint true, i.e.
\(\solns(c) = \{ \theta \ |\ (\vars(\theta) = \vars(c))\ \wedge\ (\entails \theta(c))\}\) \(solns(c) = \{ \theta \ |\ (vars(\theta) = vars(c))\ \wedge\ (\entails \theta(c))\}\)
%%MC check this para that my changes are ok %%MC check this para that my changes are ok
We associate with every constraint \(c\) a \emph{propagator} \(f_c\). A propagator We associate with every constraint \(c\) a \emph{propagator} \(f_c\). A propagator
@ -269,7 +319,7 @@ We associate with every constraint \(c\) a \emph{propagator} \(f_c\). A propagat
of the constraint. That is, for all domains \(D \sqsubseteq D_{init}\): of the constraint. That is, for all domains \(D \sqsubseteq D_{init}\):
\(f_c(D) \sqsubseteq D\) (decreasing), and \(f_c(D) \sqsubseteq D\) (decreasing), and
\(\{\theta\in D \,|\ \theta \in \solns(c)\} = \{\theta \in f_c(D)\,|\ \theta \in \solns(c)\}\) \(\{\theta\in D \,|\ \theta \in solns(c)\} = \{\theta \in f_c(D)\,|\ \theta \in solns(c)\}\)
(preserves solutions), and for domains (preserves solutions), and for domains
\(D_1 \sqsubseteq D_2 \sqsubseteq D_{init}\): \(f(D_1) \sqsubseteq f(D_2)\) \(D_1 \sqsubseteq D_2 \sqsubseteq D_{init}\): \(f(D_1) \sqsubseteq f(D_2)\)
(monotonic). This is a weak restriction since, for example, the identity mapping (monotonic). This is a weak restriction since, for example, the identity mapping
@ -316,11 +366,11 @@ A propagator \(f_c\) is \(X\)-consistent if \(f(D)\) is always \(X\) consistent
where \(X\) could be domain, bounds(Z) or bounds(R). where \(X\) could be domain, bounds(Z) or bounds(R).
A \emph{propagation solver} for a set of propagators \(F\) and current domain \(D\), A \emph{propagation solver} for a set of propagators \(F\) and current domain \(D\),
\(\solv(F,D)\), repeatedly applies all the propagators in \(F\) starting from domain \(solv(F,D)\), repeatedly applies all the propagators in \(F\) starting from domain
\(D\) until there is no further change in the resulting domain. \(\solv(F,D)\) is \(D\) until there is no further change in the resulting domain. \(solv(F,D)\) is
the weakest domain \(D' \sqsubseteq D\) which is a fixpoint (i.e.~\(f(D') = D'\)) the weakest domain \(D' \sqsubseteq D\) which is a fixpoint (i.e.~\(f(D') = D'\))
for all \(f \in F\). In other words, \(\solv(F,D)\) returns a new domain defined by for all \(f \in F\). In other words, \(solv(F,D)\) returns a new domain defined by
\( \solv(F,D) = \gfp(\lambda d.\iter(F,d))(D)\) where \( solv(F,D) = \gfp(\lambda d.\iter(F,d))(D)\) where
\(\iter(F,D) = \bigsqcap_{f \in F} f(D)\), where \(\gfp\) denotes the greatest \(\iter(F,D) = \bigsqcap_{f \in F} f(D)\), where \(\gfp\) denotes the greatest
fixpoint w.r.t \(\sqsubseteq\) lifted to functions. fixpoint w.r.t \(\sqsubseteq\) lifted to functions.
% (We use the greatest fixpoint because we are coming down from a full domain, % (We use the greatest fixpoint because we are coming down from a full domain,
@ -447,8 +497,8 @@ negative context, \mzninline{x + bool2int(b) = 5} is in a positive context, and
We assume each integer variable \(x\) is separately declared with a finite initial We assume each integer variable \(x\) is separately declared with a finite initial
set of possible values \(D_{init}(x)\). We assume each array constant is set of possible values \(D_{init}(x)\). We assume each array constant is
separately declared as a mapping \(\{ i \mapsto d~|~i \in \dom(a) \}\) where its separately declared as a mapping \(\{ i \mapsto d~|~i \in dom(a) \}\) where its
index set \(\dom(a)\) is a finite integer range. Given these initial declarations, index set \(dom(a)\) is a finite integer range. Given these initial declarations,
we can determine the set of possible values \(poss(t)\) of any term \(t\) in the we can determine the set of possible values \(poss(t)\) of any term \(t\) in the
language as \(poss(t) = \{ \theta(t)~|~\theta \in D_{init} \}\). Note also while language as \(poss(t) = \{ \theta(t)~|~\theta \in D_{init} \}\). Note also while
it may be prohibitive to determine the set of possible values for any term \(t\), it may be prohibitive to determine the set of possible values for any term \(t\),
@ -1215,8 +1265,8 @@ variable \(y'\) which cannot be 0, and equates it to \(y\) if \(y \neq 0\). The
constraint \(div(x,y',z)\) never reflects a partial function application. The constraint \(div(x,y',z)\) never reflects a partial function application. The
new variable \(b'\) captures whether the partial function application returns a new variable \(b'\) captures whether the partial function application returns a
non \undefined{} value. For \mzninline{element(v, a, x)}, it introduces a new non \undefined{} value. For \mzninline{element(v, a, x)}, it introduces a new
variable \(v'\) which only takes values in \(\dom(a)\) and forces it to equal variable \(v'\) which only takes values in \(dom(a)\) and forces it to equal
\(v\) if \(v \in \dom(a)\). A partial function application forces \(v\) if \(v \in dom(a)\). A partial function application forces
\(b = \mzninline{false}\) since it is the conjunction of the new variables \(b = \mzninline{false}\) since it is the conjunction of the new variables
\(b'\). The \%HALF\% comments will be explained later. \(b'\). The \%HALF\% comments will be explained later.
@ -1235,10 +1285,10 @@ xx\=xx\=xx\=xx\=xx\=xx\=xx\= \kill
div(x,y,z)\}\) \\ div(x,y,z)\}\) \\
\> \> \textbf{else if} \(c \equiv \mzninline{element(v, a, x)}\) and \(v\) can take a value outside the domain of \(a\)) \\ \> \> \textbf{else if} \(c \equiv \mzninline{element(v, a, x)}\) and \(v\) can take a value outside the domain of \(a\)) \\
\> \> \> \(B\) := \(B \cup \{ \new b' \}\) \\ \> \> \> \(B\) := \(B \cup \{ \new b' \}\) \\
\> \> \> \(S\) := \(S \cup \{ \new v' \in \dom(a), \> \> \> \(S\) := \(S \cup \{ \new v' \in dom(a),
b' \full v \in \dom(a), b' \full v = v', b' \full v \in dom(a), b' \full v = v',
\mzninline{element(v', a, x)}\}\) \\ \mzninline{element(v', a, x)}\}\) \\
\> \> \> \%HALF\% \(S\) := \(S \cup \{ b' \full v \in \dom(a), b' \half \> \> \> \%HALF\% \(S\) := \(S \cup \{ b' \full v \in dom(a), b' \half
\mzninline{element(v, a, x)}\}\) \\ \mzninline{element(v, a, x)}\}\) \\
\> \> \textbf{else} \(S\) := \(S \cup \{c\}\) \\ \> \> \textbf{else} \(S\) := \(S \cup \{c\}\) \\
\> \> \textbf{return} \(S \cup \{b \full \wedge_{b' \in B} b' \> \> \textbf{return} \(S \cup \{b \full \wedge_{b' \in B} b'
@ -2054,27 +2104,27 @@ For the sake of simplicity of proving the following theorem we also assume
trivial propagator. trivial propagator.
% Define % Define
% \(f_{b \half c}(D) =_{vars(b \full c)} \solv(\{f_{b'' \full c}, f_{b \half b''} \}, D)\), % \(f_{b \half c}(D) =_{vars(b \full c)} solv(\{f_{b'' \full c}, f_{b \half b''} \}, D)\),
% that is the half-reified version propagates on all variables only in the % that is the half-reified version propagates on all variables only in the
% forward direction of the implication, by introducing the hidden variable % forward direction of the implication, by introducing the hidden variable
% \(b''\) which prevents propagation in the other direction. We assume a domain % \(b''\) which prevents propagation in the other direction. We assume a domain
% 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)\)
\jip{There is a proof here, but I don't have a proof environment yet} \jip{There is a proof here, but I don't have a proof environment yet}
% \begin{theorem} % \begin{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)\). % \(\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)\).
% \end{theorem} % \end{theorem}
% \begin{proof} % \begin{proof}
% Let \(V = vars(c)\). First w.l.o.g. we only consider domains \(D\) at a fixpoint % Let \(V = vars(c)\). First w.l.o.g. we only consider domains \(D\) at a fixpoint
% of the propagators \(f_{b' \full \neg b}\), i.e. % of the propagators \(f_{b' \full \neg b}\), i.e.
% \(D(b') = \{ \neg d ~|~ d \in D(b)\}\), since both \(\solv\) expressions include % \(D(b') = \{ \neg d ~|~ d \in D(b)\}\), since both \(solv\) expressions include
% \(f_{b' \full \neg b}\). Let % \(f_{b' \full \neg b}\). Let
% \(D' = \solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D)\), now since % \(D' = solv(\{ f_{b \full c}, f_{b' \full \neg b}\})(D)\), now since
% \(f_{b \full c}\) and \(f_{b' \full \neg b}\) are idempotent and \(D\) is a fixpoint % \(f_{b \full c}\) and \(f_{b' \full \neg b}\) are idempotent and \(D\) is a fixpoint
% of \(f_{b' \full \neg b}\), then \(D' = f_{b' \full \neg b}(f_{b \full c}(D))\). % of \(f_{b' \full \neg b}\), then \(D' = f_{b' \full \neg b}(f_{b \full c}(D))\).
% Let % Let
% \(D'' = \solv(\{ f_{b \half c}, f_{b' \half \neg c}, f_{b' \full \neg b}\}, 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\). % The proof is by cases of \(D\).
% \textbf{(a)} Suppose \(D(b) = \{\mzninline{true},\mzninline{false}\}\). \textbf{(a-i)} Suppose % \textbf{(a)} Suppose \(D(b) = \{\mzninline{true},\mzninline{false}\}\). \textbf{(a-i)} Suppose