source: proto/s2k/trunk/demo/inversion/inversion_demo.py @ 4292

Last change on this file since 4292 was 4292, checked in by ksherdy, 4 years ago

Document inversion demo.

File size: 8.0 KB
Line 
1#
2# document inversion - A very simple example to demonstrate document inversion with parallel bit stream techniques.
3#
4# Ken Herdy
5# Oct 31, 2014
6
7import sys
8from lib import pablo
9from lib import bitutil
10import optparse
11import inversion_demo_config
12
13class Basis(): 
14        bit_0 = 0
15        bit_1 = 0
16        bit_2 = 0
17        bit_3 = 0
18        bit_4 = 0
19        bit_5 = 0
20        bit_6 = 0
21        bit_7 = 0
22       
23class Lex():
24        WS = 0
25       
26class FollowsMask:     
27        R_1             = 0
28        R_2             = 0
29        R_3_4           = 0
30        R_5_8           = 0
31       
32class StartsMask:
33        N_1             = 0
34        N_2             = 0
35        N_3_4           = 0
36        N_5_8           = 0     
37       
38class Token():
39        S               = 0
40        S_1             = 0
41        S_2             = 0
42        S_3_4           = 0
43        S_5_8           = 0
44        S_gt_1          = 0
45        S_gt_2          = 0
46        S_gt_3_4        = 0     
47        S_gt_5_8        = 0             
48        F               = 0
49        F_1             = 0
50        F_2             = 0
51        F_3_4           = 0
52        F_5_8           = 0
53        F_gt_1          = 0
54        F_gt_2          = 0
55        F_gt_3_4        = 0     
56        F_gt_5_8        = 0     
57       
58def ClassifyBytes(basis_bits, lex):
59        temp1 = (basis_bits.bit_0 | basis_bits.bit_1)
60        temp2 = (basis_bits.bit_2 | basis_bits.bit_3)
61        temp3 = (temp1 | temp2)
62        temp4 = (basis_bits.bit_4 &~ basis_bits.bit_5)
63        temp5 = (temp4 &~ temp3)
64        temp6 = (~basis_bits.bit_7)
65        temp7 = ((basis_bits.bit_6 & temp6)|(~(basis_bits.bit_6) & basis_bits.bit_7))
66        temp8 = (temp5 & temp7)
67        temp9 = (basis_bits.bit_4 & basis_bits.bit_5)
68        temp10 = (basis_bits.bit_7 &~ basis_bits.bit_6)
69        temp11 = (temp9 & temp10)
70        temp12 = (temp11 &~ temp3)
71        temp13 = (temp8 | temp12)
72        temp14 = (basis_bits.bit_2 &~ basis_bits.bit_3)
73        temp15 = (temp14 &~ temp1)
74        temp16 = (basis_bits.bit_4 | basis_bits.bit_5)
75        temp17 = (basis_bits.bit_6 | basis_bits.bit_7)
76        temp18 = (temp16 | temp17)
77        temp19 = (temp15 &~ temp18)
78        lex.WS = (temp13 | temp19)
79       
80def     Tokenize(lex, token):
81        token.= pablo.ScanToFirst(~lex.WS) | pablo.Advance(lex.WS) & ~lex.WS
82        #token.F = pablo.ScanThru(token.S, ~lex.WS)
83        token.F = pablo.Advance(~lex.WS) & lex.WS
84       
85def     Mark_Length_1_Follows(token, starts_mask):
86        starts_mask.N_1         = pablo.AdvanceN(token.S, 1)
87        token.F_1               = starts_mask.N_1 & token.F
88        token.F_gt_1            = token.F &~ token.F_1
89       
90        print "N_{1}     = n(S,1)                        " + bitutil.bitstream2string(starts_mask.N_1,lgth , '.')
91        print "F_{1}     = N_{1} \land F                 " + bitutil.bitstream2string(token.F_1,lgth , '.')     
92        print "F_{>_1}   = F_{>1} \land \lnot F_{1}      " + bitutil.bitstream2string(token.F_gt_1,lgth , '.')
93       
94def     Mark_Length_1_Starts(token, follows_mask):
95        follows_mask.R_1        = pablo.LookAhead(token.F, 1)
96        token.S_1               = follows_mask.R_1 & token.S
97        token.S_gt_1            = token.S &~ token.S_1
98       
99        print "R_{1}     = r(S,1)                        " + bitutil.bitstream2string(follows_mask.R_1,lgth , '.')
100        print "S_{1}     = R_{1} \land S                 " + bitutil.bitstream2string(token.S_1,lgth , '.')     
101        print "S_{>_1}   = S_{>1} \land \lnot S_{1}      " + bitutil.bitstream2string(token.S_gt_1,lgth , '.') 
102       
103def     Mark_Length_2_Follows(token,starts_mask):
104        starts_mask.N_2         = pablo.AdvanceN(starts_mask.N_1, 1) | starts_mask.N_1
105        token.F_2               = starts_mask.N_2 & token.F_gt_1
106        token.F_gt_2            = token.F_gt_1 &~ token.F_2     
107       
108        print "N_{2}     = n(N_1,1) \lor N_1             " + bitutil.bitstream2string(starts_mask.N_2,lgth , '.')
109        print "F_{2}     = N_{2} \land F_{>1}            " + bitutil.bitstream2string(token.F_2,lgth , '.')     
110        print "F_{>2}    = F_{>1} \land \lnot F_{2}      " + bitutil.bitstream2string(token.F_gt_2,lgth , '.')
111       
112def     Mark_Length_2_Starts(token, follows_mask):     
113        follows_mask.R_2        = pablo.LookAhead(follows_mask.R_1, 1) | follows_mask.R_1
114        token.S_2               = follows_mask.R_2 & token.S_gt_1
115        token.S_gt_2            = token.S_gt_1 &~ token.S_2     
116       
117        print "R_{2}     = r(N_1,1) \lor N_1             " + bitutil.bitstream2string(follows_mask.R_2,lgth , '.')
118        print "S_{2}     = R_{2} \land S_{>1}            " + bitutil.bitstream2string(token.S_2,lgth , '.')     
119        print "S_{>2}    = S_{>1} \land \lnot S_{2}      " + bitutil.bitstream2string(token.S_gt_2,lgth , '.')         
120       
121def     Mark_Length_3_4_Follows(token,starts_mask):
122        starts_mask.N_3_4       = pablo.AdvanceN(starts_mask.N_2, 2) | starts_mask.N_2
123        token.F_3_4             = starts_mask.N_3_4 & token.F_gt_2
124        token.F_gt_3_4          = token.F_gt_2 &~ token.F_3_4   
125       
126        print "N_{3_4}   = n(N_2,2) \lor N_2             " + bitutil.bitstream2string(starts_mask.N_3_4,lgth , '.')
127        print "F_{3_4}   = N_{3_4} \land F_{>2}          " + bitutil.bitstream2string(token.F_3_4,lgth , '.')   
128        print "F_{>3_4}  = F_{>2} \land \lnot F_{3_4}    " + bitutil.bitstream2string(token.F_gt_3_4,lgth , '.')       
129       
130def     Mark_Length_3_4_Starts(token, follows_mask):   
131        follows_mask.R_3_4      = pablo.LookAhead(follows_mask.R_2, 2) | follows_mask.R_2
132        token.S_3_4             = follows_mask.R_3_4 & token.S_gt_2
133        token.S_gt_3_4          = token.S_gt_2 &~ token.S_3_4   
134       
135        print "R_{3_4}   = r(R_2,2) \lor R_2             " + bitutil.bitstream2string(follows_mask.R_3_4,lgth , '.')
136        print "S_{3_4}   = R_{3_4} \land S_{>2}          " + bitutil.bitstream2string(token.S_3_4,lgth , '.')   
137        print "S_{>3_4}  = S_{>2} \land \lnot S_{3_4}    " + bitutil.bitstream2string(token.S_gt_3_4,lgth , '.')               
138
139def     Mark_Length_5_8_Follows(token,starts_mask):
140        starts_mask.N_5_8       = pablo.AdvanceN(starts_mask.N_3_4, 4) | starts_mask.N_3_4
141        token.F_5_8             = starts_mask.N_5_8 & token.F_gt_3_4
142        token.F_gt_5_8          = token.F_gt_3_4 &~ token.F_5_8
143       
144        print "N_{5_8}   = n(N_3_4,4) \lor N_3_4         " + bitutil.bitstream2string(starts_mask.N_5_8,lgth , '.')
145        print "F_{5_8}   = N_{5_8} \land F_{>3_4}        " + bitutil.bitstream2string(token.F_5_8,lgth , '.')   
146        print "F_{>5_8}  = F_{>3_4} \land \lnot F_{5_8}  " + bitutil.bitstream2string(token.F_gt_5_8,lgth , '.')               
147
148def     Mark_Length_5_8_Starts(token, follows_mask):   
149        follows_mask.R_5_8      = pablo.LookAhead(follows_mask.R_3_4, 4) | follows_mask.R_3_4
150        token.S_5_8             = follows_mask.R_5_8 & token.S_gt_3_4
151        token.S_gt_5_8          = token.S_gt_3_4 &~ token.S_5_8
152       
153        print "R_{5_8}   = r(R_3_4,4) \lor R_3_4         " + bitutil.bitstream2string(follows_mask.R_5_8,lgth , '.')
154        print "S_{5_8}   = R_{5_8} \land S_{>3_4}        " + bitutil.bitstream2string(token.S_5_8,lgth , '.')   
155        print "S_{>5_8}  = S_{>5_8} \land \lnot S_{3_4}  " + bitutil.bitstream2string(token.S_gt_5_8,lgth , '.')                       
156       
157#def    Mark_Length_3_4_Follows(token,starts_mask):
158       
159#def    Mark_Length_5_8_Follows(token,starts_mask):
160       
161#def    Mark_Length_9_16_Follows(token,starts_mask): 
162
163#def    Mark_Length_gt_16_Follows(token,starts_mask): 
164
165       
166#def    Mark_Length_1_Starts(token,follows_mask):
167       
168#def    Mark_Length_2_Starts(token,follows_mask):
169       
170#def    Mark_Length_3_4_Starts(token,follows_mask):
171       
172#def    Mark_Length_5_8_Starts(token,follows_mask):
173       
174#def    Mark_Length_9_16_Starts(token,follows_mask): 
175
176#def    Mark_Length_gt_16_Starts(token,follows_mask): 
177
178                       
179basis_bits      = Basis()
180lex             = Lex()
181starts_mask     = StartsMask()
182follows_mask    = FollowsMask()
183token           = Token()       
184
185
186if __name__ == "__main__":
187
188        option_parser = inversion_demo_config.get_option_parser() 
189        options, args = option_parser.parse_args(sys.argv[1:])
190
191        if len(args) != 1:
192                option_parser.print_usage()
193                sys.exit()
194        else:
195                input_file = args[0]
196
197        # ReadStreamInput(data)
198        global data
199        data = bitutil.readfile(input_file)
200 
201        global lgth
202        lgth = len(data)
203
204        # Transpose(data, basis)
205        pablo.EOF_mask = pablo.transpose_streams(data, basis_bits)
206        ClassifyBytes(basis_bits, lex)
207        Tokenize(lex, token)
208
209        print "source data:                              " + data
210        print "                                          " + bitutil.bitstream2string(~lex.WS, lgth, '.')
211        print "WS                                        " + bitutil.bitstream2string(lex.WS, lgth, '.')       
212        print "S                                         " + bitutil.bitstream2string(token.S, lgth, '.')
213        print "F                                         " + bitutil.bitstream2string(token.F, lgth, '.')               
214       
215        Mark_Length_1_Follows(token, starts_mask)
216        Mark_Length_1_Starts(token, follows_mask)
217       
218        Mark_Length_2_Follows(token, starts_mask)
219        Mark_Length_2_Starts(token, follows_mask)       
220       
221        Mark_Length_3_4_Follows(token, starts_mask)
222        Mark_Length_3_4_Starts(token, follows_mask)
223       
224        Mark_Length_5_8_Follows(token, starts_mask)
225        Mark_Length_5_8_Starts(token, follows_mask)     
226        #Mark_Length_9_16_Follows(token, starts_mask) 
227        #Mark_Length_gt_16_Follows(token, starts_mask)
228               
229       
230
231
232
233        #Mark_Length_9_16_Starts(token, follows_mask) 
234        #Mark_Length_gt_16_Starts(token, follows_mask) 
235       
236        # Bind / LookUp
237
238       
Note: See TracBrowser for help on using the repository browser.