From e207a8fec1bae01068bdb3a27a2090a4af5f8cb2 Mon Sep 17 00:00:00 2001
From: Carlo Zancanaro <carlo@carlo-laptop>
Date: Wed, 31 Oct 2012 00:50:29 +1100
Subject: Remove _var_influence and do some writeup

_var_influence was really just duplicating data that was available
elsewhere, so I got rid of it.

I also did some writing about the algorithm and stuff for the thesis.
---
 tex/thesis/contribution/contribution.tex | 221 +++++++++++++++++++++----------
 1 file changed, 154 insertions(+), 67 deletions(-)

(limited to 'tex/thesis/contribution/contribution.tex')

diff --git a/tex/thesis/contribution/contribution.tex b/tex/thesis/contribution/contribution.tex
index 7d12299..66d5b4a 100644
--- a/tex/thesis/contribution/contribution.tex
+++ b/tex/thesis/contribution/contribution.tex
@@ -134,7 +134,7 @@ $O(n^3)$ right-hand-sides, and thus an approach which can evaluate
 smaller portions of the system in each iteration would be a
 significant improvement.
 
-\subsection{W-DFS algorithm}
+\subsection{W-DFS algorithm} \ref{sec:wdfs}
 
 The W-DFS algorithm presented by Seidl, et al. takes into account some
 form of data-dependencies as it solves the system. This gives it the
@@ -255,7 +255,7 @@ problem it is possible
 \end{algorithm}
 
 
-\subsection{Adapted W-DFS algorithm}
+\subsection{Adapted W-DFS algorithm} \ref{sec:adapted-wdfs}
 
 This, then, allows us to use the W-DFS algorithm to re-evaluate only
 those parts of the strategy which have changed. Listing
@@ -327,17 +327,26 @@ be evaluated.
 The new \emph{Local Demand-driven Strategy Improvement} algorithm,
 \emph{LDSI}, seeks to do this. By adding an ``invalidate''
 function to both W-DFS instances we provide an interface for the two
-sides of the algorithm to indicate which values have changed. The
-fixpoint-iteration operation can then be provided with a ``stabilise''
-function to solve a partially-unstable system.
+sides of the algorithm to indicate which values have changed and
+``destabilise'' that portion of the system.
 
 This essentially results in a $\max$-strategy iteration which, at each
 strategy-improvement step, invalidates a portion of the current
-fixpoint iteration. The fixpoint iteration then re-stabilises itself
-by evaluating what values have been changed before returning control
-to the $\max$-strategy iteration to change the system again. The back
-and forth continues in this way until the $\max$-strategy can not
-improve the strategy any further.
+fixpoint iteration which may depend on the changed strategy. The
+fixpoint iteration then re-stabilises itself by evaluating what values
+have been changed, but only when such values are requested by the
+$\max$-strategy iteration. The $\max$-strategy can continue as normal,
+invalidating the fixpoint-iteration as required, and simply assume
+that the fixpoint-iteration will provide it with the correct values
+from the greatest fixpoint.
+
+
+This entire approach is demand driven, and so any necessary evaluation
+is delayed until the point when it is actually required. Additionally,
+if it is not necessary to evaluate a particular right hand side in
+order to make a decision then the algorithm will attempt to avoid
+evaluating it.
+
 
 
 
@@ -356,23 +365,23 @@ correctness of this new algorithm is argued in
   \begin{algorithmic}
     \Globals
     \begin{tabularx}{0.9\textwidth}{rX}
-      $V$ & $\{X \to \D\}$ - a mapping from variables to values,
+      $D$ & $X \to \D$ - a mapping from variables to values,
       starting at $\{ x \mapsto \infty \}$ \\
 
-      $I_{X,X}$ & $\{X \to X\}$ - a mapping from a variable to the
+      $\sigma$ & $E_{\max} \to E$ - a mapping from $\max$-expressions
+      to their sub-expressions (a $\max$-strategy) \\
+
+      $I_{X,X}$ & $X \to X$ - a mapping from a variable to the
       variables it influences \\
 
-      $I_{\max,\max}$ & $\{E_{\max} \to E_{\max}\}$ - a mapping from a
+      $I_{\max,\max}$ & $E_{\max} \to E_{\max}$ - a mapping from a
       $\max$-expression to the $\max$-expressions it influences \\
 
-      $I_{X,\max}$ & $\{X \to E_{\max}\}$ - a mapping from a variable
-      to the $\max$-expressions it influences \\
-
       $U_{X}$ & The set of all variables whose values have not
       stabilised to a final fixpoint value (unstable variables) \\
 
-      $U_{\max}$ & The set of all $\max$ expressions whose strategies
-      have not yet stabilised to their final strategy (unstable
+      $S_{\max}$ & The set of all $\max$ expressions whose strategies
+      have stabilised to their final strategy (stable
       $\max$-expressions) \\
 
       $\varepsilon$ & The equation system, a mapping from a variable
@@ -384,12 +393,27 @@ correctness of this new algorithm is argued in
   \label{algo:ldsi:fixpoint:globals}
 \end{algorithm}
 
+A few things are of particular note for the global variables. In
+particular the difference between $U_X$ being an unstable set and
+$S_{\max}$ being a stable set. In reality these two are entirely
+equivalent, but because the fixpoint-iteration will be started as
+being entirely ``stable'' (with values of $-\infty$) it is of more
+practical benefit to avoid the extra work populating the ``stable''
+set by instead storing unstable values.
+
+The other variables are just the state from each of the previous
+algorithms for intelligently performing $\max$-strategy iteration and
+fixpoint iteration (as were presented in Sections \ref{sec:wdfs}
+and \ref{sec:adapted-wdfs}). $D$ and $I_{X,X}$ are taken from the
+W-DFS algorithm, while $\sigma$ and $I_{\max,\max}$ are taken from the
+Adapted W-DFS algorithm.
+
 
 
 
 \begin{algorithm}[H]
   \begin{algorithmic}
-    \Function {evalfixpoint} {$x$, $y$}
+    \Function {evalfixpoint} {$x \in X$, $y \in X$}
       \State $\solve \fixpoint(y)$
       \State $I_{X,X}[y] = I_{X,X}[y] \cup \{x\}$
       \State \Return $D[y]$
@@ -399,9 +423,17 @@ correctness of this new algorithm is argued in
   \label{algo:ldsi:fixpoint:eval}
 \end{algorithm}
 
+This procedure is exactly the same as the equivalent method in the
+W-DFS algorithm. It allows us to more easily track dependencies
+between fixpoint variables by injecting this function as our
+variable-lookup function. It then both calculates a new value for the
+variable (the $\solve \fixpoint$ call) and notes the dependency
+between $x$ and $y$.
+
 \begin{algorithm}[H]
   \begin{algorithmic}
-    \Function {invalidatefixpoint} {$x$}
+    \Function {invalidatefixpoint} {$x \in X$}
+    \Comment{Invalidate a fixpoint variable}
     \If {$x \not \in U_X$}
       \State $U_X = U_X \cup \{x\}$
       \State $D[x] = \infty$
@@ -418,6 +450,16 @@ correctness of this new algorithm is argued in
   \label{algo:ldsi:fixpoint:invalidate}
 \end{algorithm}
 
+This procedure is not called in the fixpoint iteration process, but is
+rather the method by which the $\max$-strategy iteration can
+communicate with the fixpoint-iteration. It allows the $\max$-strategy
+iteration to inform the fixpoint-iteration which values have changed
+and will require re-evaluation. This makes it possible to only
+re-evaluate a partial system (the solving of which is also be delayed
+until requested by the $\solve \fixpoint$ procedure).
+
+
+
 \begin{algorithm}[H]
   \begin{algorithmic}
     \Function {solvefixpoint} {$x$}
@@ -425,7 +467,7 @@ correctness of this new algorithm is argued in
     \If {$x \in U_X$}
       \State $f = \system[x]$
       \State $U_X = U_X \backslash \{x\}$
-      \State $v = f( \lambda y . \eval(x, y) )$
+      \State $v = \sigma(\system[x])( \lambda y . \eval \fixpoint(x, y) )$
       \If {$v \ne D[x]$}
         \State $D = \{ x \mapsto v \} \oplus D$
         \State $W = I_{X,X}[x]$
@@ -446,62 +488,110 @@ correctness of this new algorithm is argued in
 
 After an evaluation of the $\solve \fixpoint$ procedure, the variable
 supplied as its argument will have been stabilised within the current
-$\max$-strategy.
+$\max$-strategy. This means that it will have taken on the same value
+as it would take in the greatest fixpoint of this system. Because the
+$\solve \fixpoint$ calls need not be made immediately it's possible
+for a variable to be invalidated by several $\max$-strategy
+improvements without being re-evaluated.
+
 
-After an evaluation of the $\stabilise \fixpoint$ procedure all
-currently ``unstable'' variables in the current fixpoint will be
-solved. This correlates to performing an entire fixpoint-iteration for
-the greatest-fixpoint of the unstable portion of the equation
-system. This is meant to be used to perform a sufficient
-fixpoint-iteration to allow for the next $\max$-strategy improvement
-step, but this relies on the $\max$-strategy solver to correctly
-invalidate the fixpoint-iteration portion of the algorithm.
 
 
 \begin{algorithm}[H]
   \begin{algorithmic}
-    \Function {evalstrategy} {$x$, $y$}
-    \Comment{Evaluate $y$ for its value and note that when $y$
-      changes, $x$ must be re-evaluated}
-      \State $\solve(y)$
-      \State $I[y] = I[y] \cup \{x\}$
+    \Function {evalstrategy} {$x \in E_{\max}$, $y \in E_{\max}$}
+      \Comment{Evaluate $y$ for its value and note that when $y$
+        changes, $x$ must be re-evaluated}
+      \State $\solve \strategy(y)$
+      \State $I_{\max,\max}[y] = I_{\max,\max}[y] \cup \{x\}$
       \State \Return $\sigma[y]$
     \EndFunction
+    \Function {evalstrategyfixpoint} {$x \in E_{\max}$, $y \in X$}
+      \Comment{Evaluate $y$ for its value and note that when $y$
+        changes, $x$ must be re-evaluated}
+      \State $\solve \fixpoint(y)$
+      \State $I_{\max,\max}[y] = I_{\max,\max}[\system[y]] \cup \{x\}$
+      \State \Return $D[y]$
+    \EndFunction
+  \end{algorithmic}
+  \label{algo:ldsi:strategy:eval}
+  \caption{Evaluate a portion of the $\max$-strategy and note a
+    dependency}
+\end{algorithm}
+
+The $\eval \strategy$ function is essentially the same as the $\eval
+\fixpoint$ function, except that it notes the dependencies in a
+different variable, $I_{\max,\max}$. This is because the dependency
+information for the $\max$-strategy iteration is entirely separate to
+that of the fixpoint iteration.
+
+The $\solve \fixpoint$ calls in $\eval \strategy \fixpoint$ are
+top-level calls, meaning that upon their return we know that $D$
+contains the value it would take in the greatest fixpoint of the
+current strategy $\sigma$. This function, therefore, acts as a simple
+intermediate layer between the fixpoint-iteration and the
+$\max$-strategy iteration to allow for dependencies to be tracked.
 
+
+\begin{algorithm}[H]
+  \begin{algorithmic}
     \Function {invalidatestrategy} {$x \in X$} \Comment{$x$ is a
         \emph{variable}}
-      \If {$x \not \in U_X$}
-        \State $U_X = U_X \cup \{x\}$
-        \State $W = I[x]$
-        \State $I[x] = \emptyset$
-        \For {$v \in W$}
-          \State $\invalidate \fixpoint(v)$
+      \For {$v \in I_{\max,\max}(\system[x])$} \Comment{$v$ is
+        influenced by $x$}
+        \State $\invalidate \strategy (v)$
+      \EndFor
+    \EndFunction
+
+    \Function {invalidatestrategy} {$x \in E_{\max}$} \Comment{$x$ is
+      a \emph{$\max$-expression}}
+      \If {$x \in S_{\max}$}
+        \State $S_{\max} = S_{\max} \backslash \{x\}$
+        \For {$v \in I_{\max,\max}$} \Comment {$v$ is influenced by $x$}
+          \State $\invalidate \strategy (v)$
         \EndFor
       \EndIf
     \EndFunction
+  \end{algorithmic}    
+  \label{algo:ldsi:strategy:invalidate}
+  \caption{Evaluate a portion of the $\max$-strategy and note a
+    dependency}
+\end{algorithm}
+
+Invalidating the $\max$-strategy iteration is slightly more
+complicated than invalidating the fixpoint iteration stage. As the
+invalidation interface consists of variables, we must first translate
+a variable into a $\max$-expression (which is easily done by looking
+it up in the equation system). We must then invalidate the strategies
+for each variable which depends on this resultant
+$\max$-expression. The invalidation for $\max$-expressions consists of
+transitively invalidating everything which depends on the
+$\max$-expression, as well as itself.
+
+
 
-    \Function {solvestrategy} {$x$}
+\begin{algorithm}[H]
+  \begin{algorithmic}    
+    \Function {solvestrategy} {$x \in E_{\max}$}
     \Comment{Solve a specific variable and place its value in $\sigma$}
-    \If {$x \not \in \stable$}
-      \State $f = \system[x]$
-      \State $\stable = \stable \cup \{x\}$
-      \State $v = bestStrategy(f, \sigma(), \lambda y . \eval(x, y))$
-      \If {$v \ne \sigma[x]$}
-        \State $\sigma = \{ x \mapsto v \} \oplus \sigma$
-        \State $W = I[x]$
-        \State $I(x) = \emptyset$
-        \State $\invalidate \fixpoint(\mathsf{lookupVarFor}(x))$
-        \State $\stable = \stable \backslash W$
-        \For {$v \in W$}
+    \If {$x \not \in S_{\max}$}
+      \State $S_{\max} = S_{\max} \cup \{x\}$
+      \State $\sigma_{dynamic} = \lambda y . \eval \strategy(x,y)$
+      \State $e = P_{\max}(\sigma_{dynamic},
+                          \lambda y . \eval \strategy \fixpoint(x, y))(x)$
+      \If {$e \ne \sigma[x]$}
+        \State $\sigma = \{ x \mapsto e \} \oplus \sigma$
+        \State $\invalidate \fixpoint(\system^{-1}(x))$
+        \State $S_{\max} = S_{\max} \backslash I[x]$
+        \For {$v \in I[x]$}
           \State $\solve(v)$
         \EndFor
       \EndIf
     \EndIf
     \EndFunction
   \end{algorithmic}
-
   \caption{The $\max$-strategy portion of the Combined W-DFS.}
-  \label{algo:combined-max}
+  \label{algo:ldsi:solve}
 \end{algorithm}
 
 
@@ -516,15 +606,12 @@ combination algorithm is correct. For this it is sufficient to show
 that the invalidate calls in both directions preserve the correctness
 of the original algorithm.
 
-// TODO finish this.
-General idea:
-\begin{itemize}
-  \item
-    Invalidate calls from fixpoint $\to$ max strategy are correct if
-    the calls the other way are, because it completely re-solves the
-    equations
-  \item
-    Invalidate calls from max strategy $\to$ fixpoint are correct
-    because they effectively ``reset'' that part of the system,
-    creating it to be entirely re-calculated.
-\end{itemize}
+The fixpoint iteration step invalidates anything that \emph{might}
+depend on $x$ while it invalidates $x$, thereby ensuring that any
+further calls to $\solve \fixpoint$ will result in a correct value for
+the given strategy.
+
+The strategy-iteration step invalidates anything that \emph{might}
+depend on $\system[x]$ while it invalidates $x$, thereby ensuring that
+any further calls to $\solve \strategy$ will result in a correct value
+for the given strategy.
-- 
cgit v1.2.3

