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 (22 years, 3 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_6_msu,
version_2_11_6,
version_2_11_5_msu,
version_2_11_5,
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>