From 2ffce7d8945b852d8a176977153e766b05fa045b Mon Sep 17 00:00:00 2001 From: NotXia <35894453+NotXia@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:56:41 +0200 Subject: [PATCH] Add CDMO2 theory solvers --- .../module2/img/_layered_solvers.pdf | Bin 0 -> 54371 bytes .../module2/sections/_smt.tex | 342 ++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 src/combinatorial-decision-making-and-optimization/module2/img/_layered_solvers.pdf diff --git a/src/combinatorial-decision-making-and-optimization/module2/img/_layered_solvers.pdf b/src/combinatorial-decision-making-and-optimization/module2/img/_layered_solvers.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a93ec5317a598624e508337432e01c7fc088d878 GIT binary patch literal 54371 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 literal 0 HcmV?d00001 diff --git a/src/combinatorial-decision-making-and-optimization/module2/sections/_smt.tex b/src/combinatorial-decision-making-and-optimization/module2/sections/_smt.tex index f8d8795..2d44faf 100644 --- a/src/combinatorial-decision-making-and-optimization/module2/sections/_smt.tex +++ b/src/combinatorial-decision-making-and-optimization/module2/sections/_smt.tex @@ -575,3 +575,345 @@ def cdclT($\varphi$, $\mu$): $\big( (h(a) = h(c)) \vee (c \neq b) \big)$ is added as a clause and the algorithm backjumps at the decision level 0. \end{example} + + +\section{Theory solvers} + +Decide satisfiability of theory-specific formulas. + +\subsection{EUF theory} + +\begin{description} + \item[Congruence closure] \marginnote{Congruence closure} + Given a conjunction of EUF literals $\Phi$, + its satisfiability can be decided in polynomial time as follows: + \begin{enumerate} + \item Add a new variable $c$ and replace each $p(t_1, \dots, t_k)$ + with $f_p(t_1, \dots, t_k) = c$. + \item Partition input literals into the sets of equalities $E$ and disequalities $D$. + \item Define $E^*$ as the congruence closure of $E$. + It is the smallest equivalence relation $\equiv_E$ over terms such that: + \begin{itemize} + \item $(t_1 = t_2) \in E \Rightarrow (t_1 \equiv_E t_2)$. + \item For each $f(s_1, \dots, s_k)$ and $f(t_1, \dots, t_k)$ occurring in $E$, + if $s_i \equiv_E t_i$ for each $i \in \{ 1, \dots, k \}$, then $f(s_1, \dots, s_k) \equiv_E f(t_1, \dots, t_k)$. + \end{itemize} + \item $\Phi$ is satisfiable iff $\forall (t_1 \neq t_2) \in D \Rightarrow (t_1 \,\cancel{\equiv}_E\, t_2)$. + \end{enumerate} + + \begin{remark} + In practice, congruence closure is usually implemented using a DAG to represent terms and union-find for the $E^*$ class. + \end{remark} +\end{description} + + +\subsection{Arithmetic theories} + +\begin{description} + \item[Linear real arithmetic] + LRA theory has signature $\Sigma_\text{LRA} = (\mathbb{Q}, +, -, *, \leq)$ + where the multiplication $*$ is only linear. + + \begin{description} + \item[Fourier-Motzkin elimination] \marginnote{Fourier-Motzkin elimination} + Given an LRA formula, its satisfiability can be decided as follows: + \begin{enumerate} + \item Replace: + \begin{itemize} + \item $(t_1 \neq t_2)$ with $(t_1 < t_2) \vee (t_2 < t_1)$. + \item $(t_1 \leq t_2)$ with $(t_1 < t_2) \vee (t_1 = t_2)$. + \end{itemize} + \item Eliminate equalities and apply the Fourier-Motzkin elimination\footnote{\url{https://en.wikipedia.org/wiki/Fourier\%E2\%80\%93Motzkin_elimination}} + method on all variables to determine satisfiability. + \end{enumerate} + + \begin{remark} + Not practical on a large number of constraints. + The simplex algorithm is more suited. + \end{remark} + \end{description} + + \item[Linear integer arithmetic] + LIA theory has signature $\Sigma_\text{LRA} = (\mathbb{Z}, +, -, *, \leq)$ + where the multiplication $*$ is only linear. + + Fourier-Motzkin can be applied to check satisfiability. + Simplex and branch \& bound is usually better. +\end{description} + + +\subsection{Difference logic theory} + +Difference logic (DL) atomic formulas have form $(x - y \leq k)$ +where $x$, $y$ are variables and $k$ is a constant. + +\begin{remark} + Constraints with form $(x - y \bowtie k)$ + where $\bowtie \,\in \{ =, \neq, <, \geq, > \}$ can be rewritten using $\leq$. +\end{remark} + +\begin{remark} + Unary constraints $x \leq k$ can be rewritten as $x - z_0 \leq k$ + with the assignment $z_0 = 0$. +\end{remark} + +\begin{theorem} + By allowing $\neq$ and with domain in $\mathbb{Z}$, + deciding satisfiability becomes NP-hard. + + \begin{proof} + Any graph $k$-coloring instance can be poly-reduced to a difference logic formula. + \end{proof} +\end{theorem} + +\begin{description} + \item[Graph consistency] \marginnote{Graph consistency} + Given DL literals $\Phi$, it is possible to build a weighted graph $\mathcal{G}_\Phi$ where: + \begin{descriptionlist} + \item[Nodes] Variables occurring in $\Phi$. + \item[Edges] $x \xrightarrow{k} y$ for each $(x - y \leq k) \in \Phi$. + \end{descriptionlist} + + \begin{theorem} + $\Phi$ is inconsistent $\iff$ $\mathcal{G}_\Phi$ has a negative cycle + (i.e. cycle whose cost is negative). + \end{theorem} + + \begin{remark} + A negative cycle acts as an inconsistency explanation (not necessarily minimal). + \end{remark} + + \begin{remark} + From the consistency graph, if there is a path from $x$ to $y$ with cost $k$, + then $(x - y \leq k)$ can be deduced. + \end{remark} +\end{description} + + + +\section{Combining theories} + +Given $\calT_i$-solvers for theories $\calT_1, \dots, \calT_n$, +a general approach to combine them into a $\bigcup_i^n \calT_i$-solver is the following: +\begin{enumerate} + \item Purify the formula so that each literal belongs to a single theory. New constants can be introduced. + + \begin{description} + \item[Interface equalities] Equalities involving shared constants across solvers should be the same for all solvers. + \end{description} + \item Iteratively run the following: + \begin{enumerate} + \item Each $\calT_i$-solver checks the satisfiability of $\calT_i$-formulas. If one detects unsatisfiability, the whole formula is unsatisfiable. + \item When a $\calT_i$-solver deduces a new literal, it sends it to the other solvers. + \end{enumerate} +\end{enumerate} + +\begin{example} + Consider the formula: + \[ \Big( f\big( f(x) - f(y) \big) = a \Big) \land \Big( f(a) = a+2 \Big) \land \Big( x = y \Big) \] + where the theories of EUF and linear arithmetic (LA) are involved. + + To determine satisfiability, the following steps are taken: + \begin{enumerate} + \item The formula is purified to obtain the literals: + \begin{center} + \small + \begin{tabular}{c|c} + \toprule + \textbf{LA} & \textbf{EUF} \\ + \midrule + \makecell{ + $e_1 = e_2 - e_3$ \\ + $e_4 = 0$ \\ + $e_5 = a+2$ + } & + \makecell{ + $f(e_1) = a$ \\ + $e_2 = f(x)$ \\ + $e_3 = f(y)$ \\ + $f(e_4) = e_5$ \\ + $x = y$ + } \\ + \bottomrule + \end{tabular} + \end{center} + where $e_1, \dots, e_5$ are new constants. + + \item Both EUF-solver and LA-solver determine \texttt{SAT}. + Moreover, the EUF-solver deduces that $\{ x=y, f(x)=e_2, f(y)=e_3 \} \models_{EUF} (e_2 = e_3)$ and sends it to the LA-solver. + \begin{center} + \small + \begin{tabular}{c|c} + \toprule + \textbf{LA} & \textbf{EUF} \\ + \midrule + \makecell{ + $e_1 = e_2 - e_3$ \\ + $e_4 = 0$ \\ + $e_5 = a+2$ \\ + $\underline{e_2 = e_3}$ + } & + \makecell{ + $f(e_1) = a$ \\ + $e_2 = f(x)$ \\ + $e_3 = f(y)$ \\ + $f(e_4) = e_5$ \\ + $x = y$ + } \\ + \bottomrule + \end{tabular} + \end{center} + + \item Both EUF-solver and LA-solver determine \texttt{SAT}. + Moreover, the LA-solver deduces that $\{ e_2-e_3=e_1, e_4=0, e_2=e_3 \} \models_{LA} (e_1 = e_4)$ and sends it to the EUF-solver. + \begin{center} + \small + \begin{tabular}{c|c} + \toprule + \textbf{LA} & \textbf{EUF} \\ + \midrule + \makecell{ + $e_1 = e_2 - e_3$ \\ + $e_4 = 0$ \\ + $e_5 = a+2$ \\ + $e_2 = e_3$ + } & + \makecell{ + $f(e_1) = a$ \\ + $e_2 = f(x)$ \\ + $e_3 = f(y)$ \\ + $f(e_4) = e_5$ \\ + $x = y$ \\ + $\underline{e_1 = e_4}$ + } \\ + \bottomrule + \end{tabular} + \end{center} + + \begin{center} + $\vdots$ + \end{center} + + \item The EUF-solver determines \texttt{SAT} but the LA-solver determines \texttt{UNSAT}. + Therefore, the formula is unsatisfiable. + \end{enumerate} +\end{example} + + +\subsection{Deterministic Nelson-Oppen} +\marginnote{Deterministic Nelson-Oppen} + +Let $\calT_1$ be a $\Sigma_1$-theory and $\calT_2$ be a $\Sigma_2$-theory. +$(\calT_1 \cup \calT_2)$-satisfiability can be checked with the deterministic Nelson-Oppen if $\calT_1$ and $\calT_2$ are: +\begin{descriptionlist} + \item[Signature-disjoint] $\Sigma_1 \cap \Sigma_2 = \varnothing$. + \item[Stably-infinite] $\calT_i$ is stably-infinite iff every $\calT_i$-satisfiable formula $\varphi$ has a corresponding + $\calT_i$-model with a universe of infinite cardinality that satisfies it. + \item[Convex] For each set of $\calT_i$-literals $S$, it holds that: + \[ \big( S \models_{\calT_i} (a_1 = b_1) \vee \dots \vee (a_n = b_n) \big) \Rightarrow \big( S \models_{\calT_i} (a_k = b_k) \big) \text{ for some $k \in \{ 1, \dots, n \}$ } \] + \begin{example} + $\calT_\mathbb{Z}$ is not convex. Consider the following formula $\varphi$: + \[ (1 \leq z) \land (z \leq 2) \land (u = 1) \land (v = 2) \] + We have that: + \[ \varphi \models_{\calT_\mathbb{Z}} (z = u) \vee (z = v) \] + But it is not true that: + \[ \varphi \cancel{\models}_{\calT_\mathbb{Z}} z = u \hspace{3em} \varphi \cancel{\models}_{\calT_\mathbb{Z}} z = v \] + \end{example} +\end{descriptionlist} + +\begin{description} + \item[Algorithm] + Given a $(\calT_1 \cup \calT_2)$-formula $S$, + the deterministic Nelson-Oppen algorithm works as follows: + \begin{enumerate} + \item Purify $S$ into $S_1$ and $S_2$. + Let $E$ be the set of interface equalities between $S_1$ and $S_2$ (i.e. it contains all the equalities that involve shared constants). + \item If $S_1 \models_{\calT_1} \bot$ or $S_2 \models_{\calT_2} \bot$, then $S$ is unsatisfiable. + \item If $S_1 \models_{\calT_1} (x = y)$ with $(x = y) \in (E \smallsetminus S_2)$, then $S_2 \leftarrow S_2 \cup \{ x = y \}$. Go to Point 2. + \item If $S_2 \models_{\calT_2} (x = y)$ with $(x = y) \in (E \smallsetminus S_1)$, then $S_1 \leftarrow S_1 \cup \{ x = y \}$. Go to Point 2. + \item $S$ is satisfiable. + \end{enumerate} +\end{description} + + +\subsection{Non-deterministic Nelson-Oppen} +\marginnote{Non-deterministic Nelson-Oppen} + +Extension of the deterministic Nelson-Oppen algorithm to non-convex theories. + +Works by doing case splitting on pairs of shared variables and has exponential time complexity. + + + +\section{SMT extensions} + + +\subsection{Layered solvers} +\marginnote{Layered solvers} + +Stratify the problem into layers of increasing complexity. +The satisfiability of each layer is determined by a different solver of increasing expressivity and complexity. + +\begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{./img/_layered_solvers.pdf} + \caption{Example of layered solvers} +\end{figure} + + +\subsection{Case splitting} +\marginnote{Case splitting} + +Case reasoning on free variables. +\begin{example} + Given the formula: + \[ y = \texttt{read}\big( \texttt{write}(A, i, x), j \big) \] + A solver can explore the case when $i = j$ and $i \neq j$. +\end{example} + +\begin{description} + \item[$\calT$-solver case reasoning] + The $\calT$solver internally detects inconsistencies through case reasoning. + + \item[SAT solver case reasoning] + The $\calT$-solver encodes the case reasoning and sends it to the SAT solver. + \begin{example} + Given the formula: + \[ y = \texttt{read}\big( \texttt{write}(A, i, x), j \big) \] + The $\calT$-solver sends to the SAT solver the following: + \[ + \begin{split} + y = \texttt{read}\big( \texttt{write}(A, i, x), j \big) \land (i = j) &\Rightarrow y = x \\ + y = \texttt{read}\big( \texttt{write}(A, i, x), j \big) \land (i \neq j) &\Rightarrow y = \texttt{read}(A, j) + \end{split} + \] + \end{example} +\end{description} + + + +\subsection{Optimization modulo theory} +\marginnote{Optimization modulo theory} + +Extension of SMT so that it finds a model that simultaneously satisfies the input formula $\varphi$ and optimizes an objective function $f_\text{obj}$. + +$\varphi$ belongs to a theory $\calT = \calT_{\preceq} \cup \calT_1 \cup \dots \cup \calT_n$ +where $\calT_{\preceq}$ contains a predicate $\preceq$ (e.g. $\leq$) representing a total order. + +\begin{description} + \item[Offline OTM($\mathcal{LRA}$)] + Approach that does not require to modify the SMT solver. + + \begin{description} + \item[Linear search] + Repeatedly solve the problem and, at each iteration, add the constraint $\texttt{cost} < c_i$ where $c_i$ is the cost found at the $i$-th iteration. + + \item[Binary search] + Given the cost domain $[l_i, u_i]$, + repeatedly pick a pivot $p_i \in [l_i, u_i]$ and add the constraint $\texttt{cost} < p_i$. + If a model is found, recurse in the domain $[l_i, p_i]$, otherwise recurse in $[p_i, u_i]$. + \end{description} + + \item[Inline OTM($\mathcal{LRA}$)] + SMT solver that integrates an optimization procedure. +\end{description} \ No newline at end of file