File:  [LON-CAPA] / doc / lonnavdocs / navmapsdocs.tex
Revision 1.1: download - view: text, annotated - select for diffs
Fri Nov 15 17:29:04 2002 UTC (21 years, 6 months ago) by bowersj2
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, version_0_6_2, version_0_6, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, HEAD, GCI_3, GCI_2, GCI_1, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
Documentation on the algorithm used in lonnavmaps.

    1: %% LyX 1.2 created this file.  For more info, see http://www.lyx.org/.
    2: %% Do not edit unless you really know what you are doing.
    3: \documentclass[english]{article}
    4: \usepackage[T1]{fontenc}
    5: \usepackage[latin1]{inputenc}
    6: \usepackage{graphicx}
    7: 
    8: \makeatletter
    9: 
   10: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
   11: \providecommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\@}
   12: 
   13: \usepackage{babel}
   14: \makeatother
   15: \begin{document}
   16: 
   17: \title{Navigation Maps Iterator Algorithm}
   18: 
   19: 
   20: \title{Jeremy Bowers}
   21: 
   22: \maketitle
   23: As part of re-doing the Navigation Maps screen for LON-CAPA, I created an
   24: iterator for traversing the maps. Since I'm not going to be around forever,
   25: I wanted to document the most subtle part of the the algorithm I developed,
   26: so later people don't need to read my mind. Since I wanted to use pictures,
   27: that rules out trying to do it all in comments.
   28: 
   29: %
   30: \begin{figure}
   31: \begin{center}\includegraphics[  height=2in,
   32:   keepaspectratio]{simple.branch.eps}\end{center}
   33: 
   34: 
   35: \caption{\label{simple branches}Simple Branching Nav Map}
   36: \end{figure}
   37: In particular, the handling of branches is a challenge. So, suppose we have
   38: the simple navigation map shown in figure \ref{simple branches}. As human
   39: beings, we can look at that resource map and mentally represent that as the
   40: following: \emph{Everybody sees resource A, then you have a choice of resources
   41: B and C, or resources E and F, and everybody will do resource D}. We want
   42: to represent that like this:
   43: 
   44: \begin{itemize}
   45: \item A
   46: 
   47: \begin{itemize}
   48: \item B or C
   49: \item E or F
   50: \end{itemize}
   51: \item D
   52: \end{itemize}
   53: Or something like that. Actually, \LaTeX{} fails me here. At the very least,
   54: I don't want a bullet in front of D, since that follows A, and in the real
   55: nav maps, {}``B or C'' is represented in two rows, but you get the idea.
   56: 
   57: The problem is that the computer doesn't have the global, overall view we
   58: get, and getting the computer to match our intuition is surprisingly difficult. 
   59: 
   60: If we consider the \emph{desired indentation depth} (or just \emph{depth}
   61: for short) as what we are looking for, so we can display the navmaps correctly,
   62: then we are looking for two things:
   63: 
   64: \begin{enumerate}
   65: \item A mapping of the nodes to some depth.
   66: \item A way of traversing the graph once the depth has been assigned.
   67: \end{enumerate}
   68: 
   69: \section{Mapping The Nodes to Some Depth}
   70: 
   71: As I talk about the algorithm, markers like \textbf{{*}{*}1{*}{*}} will be
   72: used to track the places in the source code that are being discussed.
   73: 
   74: Mapping the nodes to a depth is done via a two-pass algorithm (\textbf{{*}{*}1{*}{*}}).
   75: The passes are virtually identical, but one starts from the top and one starts
   76: from the bottom. 
   77: 
   78: The order the nodes are traversed in is not terribly importent, as long as
   79: no node is encountered before one of its parent nodes have been encountered,
   80: which is known to be true with this traversal (and most others, as well). 
   81: 
   82: For the top-down pass, we start with the first resource, and give it a {}``top-down-value''
   83: (TDV for short) value of 0 (\textbf{{*}{*}2{*}{*}}). We then progress along
   84: the links in some order, visiting resources and assigning them a value as
   85: follows:
   86: 
   87: \begin{enumerate}
   88: \item If the node we came from has only one link leaving it (i.e., this is the
   89: only next node for that node), then this node is given the same TDV value
   90: as the parent. (\textbf{{*}{*}3{*}{*}})
   91: \item If the node we came from has more then one link leaving it, this node is
   92: given the TDV value of the parent, plus one. (\textbf{{*}{*}4{*}{*}})
   93: \item If we get to any given node through multiple paths, the minimal value is
   94: taken. (See all uses of the {}``min'' function.)
   95: \end{enumerate}
   96: %
   97: \begin{figure}
   98: \begin{center}\includegraphics[  height=2in,
   99:   keepaspectratio]{tdv.vals.eps}\end{center}
  100: 
  101: 
  102: \caption{\label{TDV values figure}TDV Values}
  103: \end{figure}
  104: Using that algorithm on the given example navmap, we get the result shown
  105: in figure \ref{TDV values figure}. \textbf{A} was given the value 0 to start
  106: with. Each of \textbf{B} and \textbf{E} was given 1, because there are two
  107: ways out of \textbf{A}. The rest of the resources were given the value 1
  108: as well, because there is only one way out of the resources from that point
  109: on.
  110: 
  111: %
  112: \begin{figure}
  113: \begin{center}\includegraphics[  height=2in,
  114:   keepaspectratio]{depth.eps}\end{center}
  115: 
  116: 
  117: \caption{\label{cap:Final-Depth-labels}Final Depth labels}
  118: \end{figure}
  119: Using the same algorithm on the link-reversed graph, starting at the finish
  120: resource, we can do the same thing to get the {}``Bottom-Up-Values'' (BUV).
  121: We can then take each node, and take the minimum of each value to get the
  122: final Depth (D) value.. This is shown in figure \ref{cap:Final-Depth-labels}. 
  123: 
  124: 
  125: \section{Traversing the graph}
  126: 
  127: Now that we've assigned desired depths, we need to figure out an order for
  128: traversing the graph. I create a list of arrays, of the size of the maximum
  129: depth, which I use to keep track of the links we need to keep track of. This
  130: is stored in the variable \{STACK\}, which holds an array reference of array
  131: references of that size. 
  132: 
  133: In the shown example, the maximum depth is two, so \$self->\{STACK\} will
  134: be {[}{[}{]}, {[}{]}{]}. \textbf{A} and \textbf{D} will eventually end up
  135: in the first array, \textbf{B}, \textbf{C}, \textbf{E}, and \textbf{F} will
  136: be in the second. 
  137: 
  138: Basically, the procedure is this:
  139: 
  140: \begin{itemize}
  141: \item Select the next resource to display.
  142: \item Explore where that resource can get us, and store it in the stack.
  143: \item Repeat until there are no more resources.
  144: \end{itemize}
  145: We start by priming the stack with the first resource to be examined, the
  146: firstResource (\textbf{{*}{*}5{*}{*}}).
  147: 
  148: In order to select the next resource to display, we walk backwards along
  149: the stack until we find the first non-empty list (\textbf{{*}{*}6{*}{*}}).
  150: We pop the resource off that list, and that is the next resource (\textbf{{*}{*}7{*}{*}}).
  151: This has the effect of following branches as quickly as possible, so that
  152: we can guarentee that \textbf{B}, \textbf{C}, and \textbf{E}, \textbf{F}
  153: will both be explored before \textbf{D}. \textbf{D} will not be selected
  154: until the higher levels have been exhausted. 
  155: 
  156: Of course this works recursively, so it will work no matter how high the
  157: level goes.
  158: 
  159: The only thing that needs a special case is when there are two branches,
  160: as in the sample figure, and we get to the end of the first branch (\textbf{{*}{*}8{*}{*}}).
  161: We can't detect the fact that the branch has ended just by looking at the
  162: stack afterwards. So to remember that a branch has ended, detected when all
  163: the potential next resources are of a lower level then the current resource,
  164: even if there are no possible next resources, we push a marker onto the corresponding
  165: stack that the branch has ended (\textbf{{*}{*}9{*}{*}}). We have to push
  166: a marker onto the stack, because we may still need to recursively explore
  167: the last resource if it's a map.
  168: 
  169: And that's pretty much it; there's a lot of bookkeeping and stuff, but that's
  170: the core.
  171: \end{document}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>