diff options
author | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-11-02 11:04:15 +1100 |
---|---|---|
committer | Carlo Zancanaro <carlo@pc-4w14-0.cs.usyd.edu.au> | 2012-11-02 11:04:15 +1100 |
commit | a8472ef1867418b94116324531b3587e0e0e7363 (patch) | |
tree | 7e56c06efc30c0e4b606c7355925ba941b451c53 /tex | |
parent | 3d372ecf513c951675602286b296f7af520bb3cf (diff) |
Add remote target in Makefile, and contribution
Diffstat (limited to 'tex')
-rw-r--r-- | tex/thesis/Makefile | 5 | ||||
-rw-r--r-- | tex/thesis/contribution/contribution.tex | 221 |
2 files changed, 159 insertions, 67 deletions
diff --git a/tex/thesis/Makefile b/tex/thesis/Makefile index 5022129..ee64d9e 100644 --- a/tex/thesis/Makefile +++ b/tex/thesis/Makefile @@ -11,6 +11,11 @@ pdf: clean pdflatex $(PROJ) pdflatex $(PROJ) +remote: + rsync -r * honours:honours/tex/thesis/ + ssh honours "cd honours/tex/thesis; make" + rsync honours:honours/tex/thesis/thesis.pdf . + wc: wc `find . -name "*.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. |