/[ascend]/trunk/pygtk/interface/diagnose.py
ViewVC logotype

Diff of /trunk/pygtk/interface/diagnose.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 284 by johnpye, Thu Feb 9 03:02:44 2006 UTC revision 291 by johnpye, Fri Feb 10 03:32:21 2006 UTC
# Line 9  import re Line 9  import re
9  ZOOM_RE = re.compile(r"([0-9]+)\s*%?")  ZOOM_RE = re.compile(r"([0-9]+)\s*%?")
10  MAX_ZOOM_SIZE = 2000  MAX_ZOOM_SIZE = 2000
11  MAX_ZOOM_RATIO = 16  MAX_ZOOM_RATIO = 16
12    AT_BOUND_TOL = 0.0001;
13    
14  class DiagnoseWindow:  class DiagnoseWindow:
15      def __init__(self,GLADE_FILE,browser):      def __init__(self,GLADE_FILE,browser,block=0):
16          self.browser=browser          self.browser=browser
17          _xml = gtk.glade.XML(GLADE_FILE,"diagnosewin")          _xml = gtk.glade.XML(GLADE_FILE,"diagnosewin")
18          _xml.signal_autoconnect(self)            _xml.signal_autoconnect(self)  
# Line 22  class DiagnoseWindow: Line 23  class DiagnoseWindow:
23          self.blockentry = _xml.get_widget("blockentry")          self.blockentry = _xml.get_widget("blockentry")
24          self.zoomentry = _xml.get_widget("zoomentry")          self.zoomentry = _xml.get_widget("zoomentry")
25    
26            self.varname = _xml.get_widget("varname");
27            self.varval = _xml.get_widget("varval");
28            self.relname = _xml.get_widget("relname");
29            self.relresid = _xml.get_widget("relresid");
30    
31          self.varview = _xml.get_widget("varview")          self.varview = _xml.get_widget("varview")
32          self.varbuf = gtk.TextBuffer()          self.varbuf = gtk.TextBuffer()
33          self.varview.set_buffer(self.varbuf)          self.varview.set_buffer(self.varbuf)
# Line 35  class DiagnoseWindow: Line 41  class DiagnoseWindow:
41          self.relbuf = gtk.TextBuffer()          self.relbuf = gtk.TextBuffer()
42          self.relview.set_buffer(self.relbuf)          self.relview.set_buffer(self.relbuf)
43    
44            self.block = 0
45          self.prepare_data()          self.prepare_data()
46          self.fill_values(0) # block zero          self.fill_values(block) # block zero
47    
48      def run(self):      def run(self):
49          self.window.run()          self.window.run()
# Line 52  class DiagnoseWindow: Line 59  class DiagnoseWindow:
59          self.zoom=1;          self.zoom=1;
60            
61      def fill_values(self, block):      def fill_values(self, block):
         print "FILL VALUES for block %d" % block  
62          try:          try:
63              rl,cl,rh,ch = self.im.getBlockLocation(block)              rl,cl,rh,ch = self.im.getBlockLocation(block)
64          except IndexError:          except IndexError:
65              print "invalid block"              self.blockentry.set_text(str(self.block))
66                return
67            except RuntimeError:
68                self.blockentry.set_text(str(self.block))
69              return              return
70    
71          self.block = block          self.block = block
72          self.blockentry.set_text(str(block))          self.blockentry.set_text(str(block))
73    
74            self.rl = rl
75            self.cl = cl
76            self.rh = rh
77            self.ch = ch
78    
79          nr = int(rh-rl+1);          nr = int(rh-rl+1);
80          nc = int(ch-cl+1);          nc = int(ch-cl+1);
81    
# Line 75  class DiagnoseWindow: Line 90  class DiagnoseWindow:
90          pinkdot = [chr(255), chr(127), chr(127)]          pinkdot = [chr(255), chr(127), chr(127)]
91          skydot = [chr(127), chr(127), chr(255)]          skydot = [chr(127), chr(127), chr(255)]
92          bluedot = [chr(0), chr(0), chr(255)]          bluedot = [chr(0), chr(0), chr(255)]
93                    hotpinkdot = [chr(255), chr(47), chr(179)] # very big (+/-)
94            brightbluedot = [chr(71), chr(157), chr(255)] # very small (+/-)
95            greendot = [chr(87), chr(193), chr(70)] # close to 1
96            orangedot = [chr(255), chr(207), chr(61)] # 10-1000
97            bluegreendot = [chr(70), chr(221), chr(181)] # 0.001 - 0.1
98          for i in self.data:          for i in self.data:
99              if i.row < rl or i.row > rh or i.col < cl or i.col > ch:              if i.row < rl or i.row > rh or i.col < cl or i.col > ch:
100                  continue                  continue
# Line 84  class DiagnoseWindow: Line 103  class DiagnoseWindow:
103              pos = rowstride*r + 3*c              pos = rowstride*r + 3*c
104              dot = blackdot;              dot = blackdot;
105              var = self.im.getVariable(i.col);              var = self.im.getVariable(i.col);
106              rat = var.getValue() / var.getNominal()              if abs( (var.getValue()-var.getUpperBound())/ var.getNominal() )  < AT_BOUND_TOL:
107              if rat!=0:                  dot = reddot
108                  try:              elif abs( var.getValue() - var.getLowerBound() ) / var.getNominal() < AT_BOUND_TOL:
109                      #print "SCALE i.col =",rat                  dot = reddot
110                      val = math.log(abs(rat));              else:
111                      #print "LOG i.col =",val                  rat = var.getValue() / var.getNominal()
112                      if val > 1:                  if rat!=0:
113                          dot = reddot;                      try:
114                      elif var < -1:                          val = abs(rat)
115                          dot = bluedot;                          if abs(rat) > 1000:
116                      elif var > 0:                              dot = hotpinkdot
117                          dot = pinkdot;                          elif abs(rat) > 10:
118                      elif var < 0:                              dot = orangedot
119                          dot = skydot;                          elif abs(rat) < 0.001:
120                  except ValueError, e:                              dot = brightbluedot
121                      pass                          elif abs(rat) < 10 and abs(rat) > 0.1:
122                                dot = greendot
123                            elif abs(rat) > 0.001 and abs(rat) < 0.1:
124                                dot = bluegreendot
125                            else:
126                                dot = blackdot
127                        except ValueError, e:
128                            pass
129              #print "DOT: ",dot              #print "DOT: ",dot
130              b[pos], b[pos+1], b[pos+2] = dot              b[pos], b[pos+1], b[pos+2] = dot
131    
# Line 119  class DiagnoseWindow: Line 145  class DiagnoseWindow:
145    
146          self.fill_var_names()          self.fill_var_names()
147          self.fill_rel_names()          self.fill_rel_names()
148        
149            self.varname.set_text("");
150            self.varval.set_text("");
151            self.relname.set_text("");
152            self.relresid.set_text("");
153    
154    
155      def do_zoom(self):      def do_zoom(self):
156          if self.zoom == -1:          if self.zoom == -1:
# Line 151  class DiagnoseWindow: Line 183  class DiagnoseWindow:
183      def fill_var_names(self):      def fill_var_names(self):
184          names = [str(i) for i in self.im.getBlockVars(self.block)]          names = [str(i) for i in self.im.getBlockVars(self.block)]
185          if self.varcollapsed.get_active():          if self.varcollapsed.get_active():
186              res = collapse(names)              res = reduce(names)
187              rows = []              rows = []
188              for k in res:              for k in res:
189                  if k=="":                  if k=="":
# Line 167  class DiagnoseWindow: Line 199  class DiagnoseWindow:
199      def fill_rel_names(self):      def fill_rel_names(self):
200          names = [str(i) for i in self.im.getBlockRels(self.block)]          names = [str(i) for i in self.im.getBlockRels(self.block)]
201          if self.relcollapsed.get_active():          if self.relcollapsed.get_active():
202              text = "\n".join(collapse(names))              res = reduce(names)
203                rows = []
204                for k in res:
205                    if k=="":
206                        for r in res[k]:
207                            rows.append(r)
208                    else:
209                        rows.append( '%s:\n\t%s' % (k, "\n\t".join(res[k])) )
210                text = "\n".join(rows)
211          else:          else:
212              text = "\n".join(names)              text = "\n".join(names)
213          self.relbuf.set_text(text)          self.relbuf.set_text(text)
214    
215      def set_block(self, block):      def set_block(self, block):
         self.block = block;  
216          self.fill_values(block)          self.fill_values(block)
217    
218      def set_zoom(self,zoom):      def set_zoom(self,zoom):
219          self.zoom = zoom          self.zoom = zoom
220          self.do_zoom()          self.do_zoom()
221    
222        def show_cursor(self,x,y):
223            c = self.cl + int(x/self.zoom)
224            r = self.rl + int(y / self.zoom)
225            if c > self.ch or r > self.rh:
226                #print "OUT OF RANGE"
227                return
228            var = self.im.getVariable(c)
229            self.varname.set_text(var.getName())
230            self.varval.set_text(str(var.getValue()))
231            rel = self.im.getRelation(r)
232            self.relname.set_text(rel.getName())
233            self.relresid.set_text(str(rel.getResidual()))
234    
235        # GUI EVENT HOOKS-----------------------------------------------------------
236    
237      def on_varcollapsed_toggled(self,*args):      def on_varcollapsed_toggled(self,*args):
238          print "COLLAPSED-TOGGLED"          print "COLLAPSED-TOGGLED"
239          self.fill_var_names()          self.fill_var_names()
# Line 192  class DiagnoseWindow: Line 246  class DiagnoseWindow:
246          self.set_block(self.block + 1)          self.set_block(self.block + 1)
247    
248      def on_prevbutton_clicked(self,*args):      def on_prevbutton_clicked(self,*args):
249          self.set_block(self.block - 1)                self.set_block(self.block - 1)  
250    
251        def on_prevbigbutton_clicked(self,*args):
252            b = self.block - 1
253            while b >= 0:
254                rl,cl,rh,ch = self.im.getBlockLocation(b)
255                if rh-rl > 0 or ch-cl>0:
256                    self.set_block(b)
257                b = b - 1
258            print "NO PRECEDING 'BIG' BLOCKS"
259            
260        def on_nextbigbutton_clicked(self,*args):
261            b = self.block + 1
262            n = self.im.getNumBlocks()
263            while b < n:
264                rl,cl,rh,ch = self.im.getBlockLocation(b)
265                if rh-rl > 0 or ch-cl>0:
266                    self.set_block(b)
267                b = b + 1
268            print "NO FOLLOWING 'BIG' BLOCKS"
269        
270      def on_blockentry_key_press_event(self,widget,event):      def on_blockentry_key_press_event(self,widget,event):
271          keyname = gtk.gdk.keyval_name(event.keyval)          keyname = gtk.gdk.keyval_name(event.keyval)
272          print "KEY ",keyname          print "KEY ",keyname
# Line 222  class DiagnoseWindow: Line 295  class DiagnoseWindow:
295                  print m                  print m
296              self.set_zoom( int(self.zoomentry.get_text()) )              self.set_zoom( int(self.zoomentry.get_text()) )
297    
298        def on_imageevent_motion_notify_event(self,widget,event):
299            self.show_cursor(event.x, event.y)
300    
301        def on_imageevent_button_press_event(self,widget,event):
302            self.show_cursor(event.x, event.y)
303    
304    
305  # The following is from  # The following is from
306  # http://www.experts-exchange.com/Programming/Programming_Languages/Python/Q_21719649.html  # http://www.experts-exchange.com/Programming/Programming_Languages/Python/Q_21719649.html
307  # it's still buggy.  # it's still buggy.
# Line 232  def fold(data): Line 312  def fold(data):
312      '[1,4-6,10,15-18,22,25-28]'      '[1,4-6,10,15-18,22,25-28]'
313      """      """
314      folded = []      folded = []
315      for k, g in groupby(enumerate(data), lambda (i,x):i-x):      for k, g in groupby(enumerate(sorted(data)), lambda (i,x):i-x):
316          seq = map(itemgetter(1), g)          seq = map(itemgetter(1), g)
317          if len(seq) > 1:          if len(seq) > 1:
318              x = '%s-%s' % (seq[0], seq[-1])              x = '%s-%s' % (seq[0], seq[-1])
# Line 241  def fold(data): Line 321  def fold(data):
321          folded.append(x)          folded.append(x)
322      return folded and '[%s]' % ','.join(folded) or ''      return folded and '[%s]' % ','.join(folded) or ''
323    
324  def collapse(names):  def reduce(names):
325      """reduce a list of items into something more readable:      """reduce a list of items nto something more readable:
326      >>> data = 'C.x C.p C.T C.delta[1] C.delta[2] C.delta[3] C.sat.x C.sat.p C.h C.delta[5]'.split()      >>> data = 'C.x C.p C.T C.delta[1] C.delta[2] C.delta[3] C.sat.x C.sat.p C.h C.delta[5]'.split()
327      >>> res = reduce(data)      >>> res = reduce(data)
328      >>> for k in sorted(res):      >>> for k in sorted(res):
# Line 250  def collapse(names): Line 330  def collapse(names):
330      C: T, delta[1-3,5], h, p, x      C: T, delta[1-3,5], h, p, x
331      C.sat: p, x      C.sat: p, x
332      """      """
333      data = sorted([n.split('.') for n in names], key=len)      data = sorted([n.split('.') for n in sorted(names)], key=len)
334      res = {}      res = {}
335      for k, g in groupby(data, lambda x: len(x)):      for k, g in groupby(data, lambda x: len(x)):
336          item = g.next()          if k == 1:
337          assert len(item) == k              indexed = {}
338          key = '.'.join(item[:-1])              seq = set(get(indexed, item) for item in g)
339          indexed = {}              res['[global]'] = [ i+fold(indexed.get(i, [])) for i in sorted(seq) ]
340          seq = set(get(indexed, item))          else:
341          for item in g:              for key, g1 in groupby(g, lambda x: '.'.join(x[:-1])):
342              seq.add(get(indexed, item))                  indexed = {}
343          res[key] = [i+fold(indexed.get(i, [])) for i in sorted(seq)]                  seq = set(get(indexed, item) for item in g1)
344                    res[key] = [ i+fold(indexed.get(i, [])) for i in sorted(seq) ]
345      return res      return res
346    
347  def get(indexed, item):  def get(indexed, item):

Legend:
Removed from v.284  
changed lines
  Added in v.291

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22