another batch of fixes from fritz
[rrdtool.git] / doc / rpntutorial.pod
1 =head1 NAME
2
3 rpntutorial - Reading RRDtool RPN Expressions by Steve Rader
4
5 =for html <div align="right"><a href="rpntutorial.pdf">PDF</a> version.</div>
6
7 =head1 DESCRIPTION
8
9 This tutorial should help you get to grips with RRDtool RPN expressions
10 as seen in CDEF arguments of RRDtool graph.
11
12 =head1 Reading Comparison Operators
13
14 The LT, LE, GT, GE and EQ RPN logic operators are not as tricky as
15 they appear.  These operators act on the two values on the stack
16 preceding them (to the left).  Read these two values on the stack
17 from left to right inserting the operator in the middle.  If the
18 resulting statement is true, then replace the three values from the
19 stack with "1".  If the statement if false, replace the three values
20 with "0".
21
22 For example, think about "2,1,GT".  This RPN expression could be
23 read as "is two greater than one?"  The answer to that question is
24 "true".  So the three values should be replaced with "1".  Thus the
25 RPN expression 2,1,GT evaluates to 1.
26
27 Now consider "2,1,LE".  This RPN expression could be read as "is
28 two less than or equal to one?".   The natural response is "no"
29 and thus the RPN expression 2,1,LE evaluates to 0. 
30
31 =head1 Reading the IF Operator
32
33 The IF RPN logic operator can be straightforward also.  The key
34 to reading IF operators is to understand that the condition part
35 of the traditional "if X than Y else Z" notation has *already*
36 been evaluated.  So the IF operator acts on only one value on the
37 stack: the third value to the left of the IF value.  The second
38 value to the left of the IF corresponds to the true ("Y") branch.
39 And the first value to the left of the IF corresponds to the false
40 ("Z") branch.  Read the RPN expression "X,Y,Z,IF" from left to
41 right like so: "if X then Y else Z".
42
43 For example, consider "1,10,100,IF".  It looks bizarre to me.
44 But when I read "if 1 then 10 else 100" it's crystal clear: 1 is true
45 so the answer is 10.  Note that only zero is false; all other values
46 are true.  "2,20,200,IF" ("if 2 then 20 else 200") evaluates to 20.
47 And "0,1,2,IF" ("if 0 then 1 else 2) evaluates to 2.
48
49
50 Notice that none of the above examples really simulate the whole
51 "if X then Y else Z" statement.  This is because computer programmers
52 read this statement as "if Some Condition then Y else Z".  So it's
53 important to be able to read IF operators along with the LT, LE,
54 GT, GE and EQ operators.
55
56 =head1 Some Examples
57
58 While compound expressions can look overly complex, they can be
59 considered elegantly simple.  To quickly comprehend RPN expressions,
60 you must know the the algorithm for evaluating RPN expressions:
61 iterate searches from the left to the right looking for an operator.
62 When it's found, apply that operator by popping the operator and some
63 number of values (and by definition, not operators) off the stack.
64
65 For example, the stack "1,2,3,+,+" gets "2,3,+" evaluated (as "2+3")
66 during the first iteration and is replaced by 5.  This results in
67 the stack "1,5,+".  Finally, "1,5,+" is evaluated resulting in the
68 answer 6.  For convenience, it's useful to write this set of
69 operations as:
70
71  1) 1,2,3,+,+    eval is 2,3,+ = 5    result is 1,5,+
72  2) 1,5,+        eval is 1,5,+ = 6    result is 6
73  3) 6
74
75 Let's use that notation to conveniently solve some complex RPN expressions
76 with multiple logic operators:
77
78  1) 20,10,GT,10,20,IF  eval is 20,10,GT = 1     result is 1,10,20,IF
79
80 read the eval as pop "20 is greater than 10" so push 1
81  
82  2) 1,10,20,IF         eval is 1,10,20,IF = 10  result is 10
83
84 read pop "if 1 then 10 else 20" so push 10.  Only 10 is left so
85 10 is the answer.
86
87 Let's read a complex RPN expression that also has the traditional
88 multiplication operator:
89
90  1) 128,8,*,7000,GT,7000,128,8,*,IF  eval 128,8,*       result is 1024
91  2) 1024,7000,GT,7000,128,8,*,IF     eval 1024,7000,GT  result is 0
92  3) 0,128,8,*,IF                     eval 128,8,*       result is 1024
93  4) 0,7000,1024,IF                                      result is 1024
94
95
96 Now let's go back to the first example of multiple logic operators,
97 but replace the value 20 with the variable "input":
98
99 =for comment
100 XXX wo kommt das A ploetzlich her? Hier braucht es einen Satz, dass A als
101 XXX placeholder  zum Lesbarmachen verwendet wird (shortcut).
102
103  1) input,10,GT,10,input,IF  eval is input,10,GT  result is A
104
105 Read eval as "if input > 10 then true" and replace "input,10,GT"
106 with "A":
107   
108  2) A,10,input,IF            eval is A,10,input,IF
109
110 read "if A then 10 else input".  Now replace A with it's verbose
111 description againg and--voila!--you have a easily readable description
112 of the expression:
113
114  if input > 10 then 10 else input
115
116 Finally, let's go back to the first most complex example and replace
117 the value 128 with "input":
118
119  1) input,8,*,7000,GT,7000,input,8,*,IF  eval input,8,*     result is A
120
121 where A is "input * 8"
122
123  2) A,7000,GT,7000,input,8,*,IF          eval is A,7000,GT  result is B
124
125 where B is "if ((input * 8) > 7000) then true"
126
127  3) B,7000,input,8,*,IF                  eval is input,8,*  result is C
128
129 where C is "input * 8"
130
131  4) B,7000,C,IF
132
133 At last we have a readable decoding of the complex RPN expression with
134 a variable:
135
136  if ((input * 8) > 7000) then 7000 else (input * 8)
137
138 =head1 Exercises
139
140 Exercise 1:
141
142 Compute "3,2,*,1,+ and "3,2,1,+,*" by hand.  Rewrite them in
143 traditional notation.  Explain why they have different answers.
144
145 Answer 1:
146
147     3*2+1 = 7 and 3*(2+1) = 9.  These expressions have
148     different answers because the altering of the plus and 
149     times operators alter the order of their evaluation.
150
151
152 Exercise 2:
153
154 One may be tempted to shorten the expression
155
156  input,8,*,56000,GT,56000,input,*,8,IF
157
158 by removing the redundant use of "input,8,*" like so:
159
160  input,56000,GT,56000,input,IF,8,*
161
162 Use traditional notation to show these expressions are not the same.
163 Write an expression that's equivalent to the first expression, but
164 uses the LE and DIV operators.
165
166 Answer 2:
167
168     if (input <= 56000/8 ) { input*8 } else { 56000 }
169     input,56000,8,DIV,LT,input,8,*,56000,IF
170
171
172 Exercise 3:
173
174 Briefly explain why traditional mathematic notation requires the
175 use of parentheses.  Explain why RPN notation does not require
176 the use of parentheses.
177
178 Answer 3:
179
180     Traditional mathematic expressions are evaluated by
181     doing multiplication and division first, then addition and
182     subtraction.  Parentheses are used to force the evaluation of
183     addition before multiplication (etc).  RPN does not require
184     parentheses because the ordering of objects on the stack
185     can force the evaluation of addition before multiplication.
186
187
188 Exercise 4:
189
190 Explain why it was desirable for the RRDtool developers to implement
191 RPN notation instead of traditional mathematical notation.
192
193 Answer 4:
194
195     The algorithm that implements traditional mathematical
196     notation is more complex then algorithm used for RPN.
197     So implementing RPN allowed Tobias Oetiker to write less
198     code!  (The code is also less complex and therefore less
199     likely to have bugs.)
200
201
202 =head1 AUTHOR
203
204 Steve Rader E<lt>rader@wiscnet.netE<gt>