[Avida-cvs] [avida-svn] r741 - branches/developers/avida-edward/source/python/AvidaGui2

avidaedward@myxo.css.msu.edu avidaedward at myxo.css.msu.edu
Fri Jun 9 07:08:02 PDT 2006


Author: avidaedward
Date: 2006-06-09 10:08:02 -0400 (Fri, 09 Jun 2006)
New Revision: 741

Added:
   branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py
Modified:
   branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeCtrl.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py
Log:

Added new style of organism scope.



Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2006-06-08 21:09:26 UTC (rev 740)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2006-06-09 14:08:02 UTC (rev 741)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyOrganismScopeView import pyOrganismScopeView, pyOrganismAnimator
+from pyOrganismScopeView2 import pyOrganismScopeView2, pyOrganismAnimator
 from AvidaCore import cAnalyzeGenotype, cGenome, cInstruction, cInstUtil, cString
 from pyHardwareTracer import pyHardwareTracer
 
@@ -11,10 +11,10 @@
 
 
 
-class pyOrganismScopeCtrl(pyOrganismScopeView):
+class pyOrganismScopeCtrl(pyOrganismScopeView2):
 
   def __init__(self,parent = None,name = None,fl = 0):
-    pyOrganismScopeView.__init__(self,parent,name,fl)
+    pyOrganismScopeView2.__init__(self,parent,name,fl)
     QToolTip.add(self,"Watch an organism run")
 
     if not name: self.setName("pyOrganismScopeCtrl")

Added: branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py	2006-06-08 21:09:26 UTC (rev 740)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py	2006-06-09 14:08:02 UTC (rev 741)
@@ -0,0 +1,445 @@
+# -*- coding: utf-8 -*-
+
+
+from AvidaCore import cHardwareDefs, cHardwareCPUDefs
+
+from qt import *
+from qtcanvas import *
+import math
+
+def checkDimensions(outer_diameter, n):
+  print "checkDimensions(outer_diameter: %d, n: %d)" % (outer_diameter, n)
+  sin_n = math.sin(math.pi/n)
+  sin_n_3 = 3 * sin_n
+  R = (outer_diameter/2.) / (1 + sin_n_3)
+  r = R * sin_n
+
+  return R, r
+
+class pyOrganismAnimator:
+  def __init__(self):
+    print "pyOrganismAnimator.__init__()..."
+    self.font = QFont(qApp.font())
+
+    self.label_font = QFont(self.font)
+    self.label_font_metrics = QFontMetrics(self.label_font)
+    self.label_text_height = 12
+    self.label_font_points_per_pixel = self.label_font.pointSizeFloat()/self.label_font_metrics.height()
+    self.label_point_size_float = self.label_text_height * self.label_font_points_per_pixel
+    self.label_font.setPointSizeFloat(self.label_point_size_float)
+
+    self.default_color_saturation = 100
+    self.default_color_value = 248
+
+    self.on_brush = QBrush(Qt.red)
+    self.off_brush = QBrush(Qt.black)
+    self.on_pen = QPen(Qt.red)
+    self.off_pen = QPen(Qt.black)
+
+  def setOps(self, ops = None):
+    print "pyOrganismAnimator.setOps()..."
+    self.ops_dict = ops
+
+  def setInstNames(self, inst_names = None):
+    print "pyOrganismAnimator.setInstNames()..."
+    self.inst_names_dict = inst_names
+
+  def setCanvas(self, canvas = None):
+    print "pyOrganismAnimator.setCanvas()..."
+    self.canvas = canvas
+  def setFrames(self, frames = None):
+    """
+    Preps pyOrganismAnimator for displaying organism movie frames.
+    
+    frames - sequence of hardware snapshots from organism analysis.
+    """
+    print "pyOrganismAnimator.setFrames()..."
+    self.frames = frames
+    if frames is None:
+      self.last_copied_instruction_cache = None
+    else:
+      self.last_copied_instruction_cache = []
+      last_copied_instruction = 0
+      for i in xrange(frames.getSnapshotCount()):
+        ms = frames.getMemorySnapshotAt(i)
+        last_copied_instruction = max(
+          [ms.GetFlagCopied(j) and j or last_copied_instruction for j in xrange(last_copied_instruction, ms.GetSize())]
+        )
+        self.last_copied_instruction_cache.append(last_copied_instruction)
+
+    #self.instructions_anim.setFrames(frames)
+    #self.heads_anim.setFrames(frames)
+    #self.hw_anim.setFrames(frames)
+  def setSize(self, width, height):
+    """
+    Called when canvas dimensions have changed.
+
+    XXX
+
+    This has become too hacky. It was supposed to manage required layout
+    changes, but the code that does this has been scattered all over the
+    place, and needs reconsolidation. @kgn
+    """
+    print "pyOrganismAnimator.setSize(width:%d, height:%d)" % (width, height)
+    self.canvas_width = width
+    self.canvas_height = height
+
+    #layout_dims = self.layout_manager.checkDimensions(width, height)
+    #for num in layout_dims:
+    #  if num <= 0:
+    #    return
+    #if layout_dims != self.layout_dims:
+    #  self.layout_dims = layout_dims
+    #  self.layout_manager.setDimensions(layout_dims)
+    #  self.c_x, self.c_y, self.R, self.r, self.rr = layout_dims
+    #  text_height = 3 * self.r
+    #  font_metrics = QFontMetrics(self.font)
+    #  font_points_per_pixel = self.font.pointSizeFloat()/font_metrics.height()
+    #  point_size_float = text_height * font_points_per_pixel
+    #  self.font.setPointSizeFloat(point_size_float)
+
+  def showFrame(self, frame_number):
+    """
+    Forwards call to .showFrame() of various subanimators, then updates
+    canvas.
+    """
+    print "pyOrganismAnimator.showFrame(%d)" % frame_number
+    #self.instructions_anim.showFrame(frame_number)
+    #self.heads_anim.showFrame(frame_number)
+    #self.hw_anim.showFrame(frame_number)
+    #self.canvas.update()
+
+class pyOrganismScopeView2(QCanvasView):
+  def __init__(self,parent = None,name = None,fl = 0):
+    print "pyOrganismScopeView2.__init__()..."
+    QCanvasView.__init__(self,parent,name,fl)
+    if not name: self.setName("pyOrganismScopeView2")
+
+    self.setVScrollBarMode(QScrollView.AlwaysOff)
+    self.setHScrollBarMode(QScrollView.AlwaysOff)
+    self.m_canvas = QCanvas()
+    self.setCanvas(self.m_canvas)
+
+    font = QFont(self.font())
+    font_metrics = QFontMetrics(font)
+    self.m_font_points_per_pixel = font.pointSizeFloat()/font_metrics.height()
+
+    self.m_organism_circle_margin = 10
+    self.m_font_oversize_factor = 1.2
+
+    self.m_visible_width = 1
+    self.m_visible_height = 1
+
+    self.reset()
+
+  def reset(self):
+    print "pyOrganismScopeView2.reset()..."
+
+    if hasattr(self, "m_instruction_items") and self.m_instruction_items is not None:
+      for item in self.m_instruction_items:
+        item.setCanvas(None)
+    if hasattr(self, "m_instruction_bg_items") and self.m_instruction_bg_items is not None:
+      for item in self.m_instruction_bg_items:
+        item.setCanvas(None)
+    if hasattr(self, "m_ihead_move_items") and self.m_ihead_move_items is not None:
+      for item in self.m_ihead_move_items:
+        item.setCanvas(None)
+    if hasattr(self, "m_ihead_item") and self.m_ihead_item is not None:
+      self.m_ihead_item.setCanvas(None)
+    if hasattr(self, "m_rhead_item") and self.m_rhead_item is not None:
+      self.m_rhead_item.setCanvas(None)
+    if hasattr(self, "m_whead_item") and self.m_whead_item is not None:
+      self.m_whead_item.setCanvas(None)
+    if hasattr(self, "m_fhead_item") and self.m_fhead_item is not None:
+      self.m_fhead_item.setCanvas(None)
+
+    self.m_instruction_items = None
+    self.m_instruction_bg_items = None
+    self.m_ihead_move_items = None
+    self.m_ihead_item = None
+    self.m_rhead_item = None
+    self.m_whead_item = None
+    self.m_fhead_item = None
+    self.m_task_items = None
+
+    self.m_task_names = None
+    self.m_inst_names = None
+
+    self.m_frames = None
+    self.m_max_genome_size = 0
+    self.m_current_frame_number = 0
+    self.m_current_radius = None
+    self.m_current_genome = None
+    self.m_current_tasks = None
+    self.m_current_ihead = None
+    self.m_current_rhead = None
+    self.m_current_whead = None
+    self.m_current_fhead = None
+    self.m_current_ihead_move = None
+
+    # Hmm; can't emit gestationTimeChangedSig(0) without causing absurd slider values. @kgn
+    self.emit(PYSIGNAL("gestationTimeChangedSig"),(1,))
+    self.emit(PYSIGNAL("executionStepResetSig"),(0,))
+
+  def setTaskNames(self, task_names = None):
+    print "pyOrganismScopeView2.setTaskNames()..."
+    self.m_task_names = task_names
+
+  def setInstNames(self, inst_names = None):
+    print "pyOrganismScopeView2.setInstNames()..."
+    self.m_inst_names = inst_names
+
+  def setOps(self, ops = None):
+    print "pyOrganismScopeView2.setOps()..."
+    self.m_ops_dict = ops
+
+  def setFrames(self, frames = None):
+    print "pyOrganismScopeView2.setFrames()..."
+    self.reset()
+    self.m_frames = frames
+    if self.m_frames is not None:
+      self.last_copied_instruction_cache = []
+      last_copied_instruction = 0
+      for i in xrange(self.m_frames.getSnapshotCount()):
+        ms = self.m_frames.getMemorySnapshotAt(i)
+        last_copied_instruction = max(
+          [ms.GetFlagCopied(j) and j or last_copied_instruction for j in xrange(last_copied_instruction, ms.GetSize())]
+        )
+        self.last_copied_instruction_cache.append(last_copied_instruction)
+
+      self.m_parent_size = len(self.m_frames.m_genome_info[0])
+      self.m_max_genome_size = max([len(genome) for genome in self.m_frames.m_genome_info])
+      self.m_child_size = max(0, last_copied_instruction - self.m_parent_size + 1)
+      print "parent_size %d, max_genome_size %d" % (self.m_parent_size, self.m_max_genome_size)
+
+      self.updateCircle()
+
+      text_height = 2. * self.m_spot_radius
+      font = QFont(self.font())
+      point_size_float = self.m_font_oversize_factor * text_height * self.m_font_points_per_pixel
+      font.setPointSizeFloat(point_size_float)
+
+      self.m_instruction_items = [QCanvasText(self.m_canvas) for i in xrange(self.m_max_genome_size)]
+      self.m_instruction_bg_items = [QCanvasEllipse(self.m_canvas) for i in xrange(self.m_max_genome_size)]
+      for item in self.m_instruction_items:
+        item.setTextFlags(Qt.AlignCenter)
+        item.setZ(1.)
+      for item in self.m_instruction_bg_items:
+        item.setSize(text_height, text_height)
+        item.setZ(0.)
+
+      if self.m_frames.m_ihead_info is not None:
+        self.m_ihead_item = QCanvasText(self.m_canvas)
+        self.m_ihead_item.setTextFlags(Qt.AlignCenter)
+        self.m_ihead_item.setZ(1.)
+        self.m_ihead_item.setFont(font)
+        self.m_ihead_item.setText('i')
+      if self.m_frames.m_rhead_info is not None:
+        self.m_rhead_item = QCanvasText(self.m_canvas)
+        self.m_rhead_item.setTextFlags(Qt.AlignCenter)
+        self.m_rhead_item.setZ(1.)
+        self.m_rhead_item.setFont(font)
+        self.m_rhead_item.setText('r')
+      if self.m_frames.m_whead_info is not None:
+        self.m_whead_item = QCanvasText(self.m_canvas)
+        self.m_whead_item.setTextFlags(Qt.AlignCenter)
+        self.m_whead_item.setZ(1.)
+        self.m_whead_item.setFont(font)
+        self.m_whead_item.setText('w')
+      if self.m_frames.m_fhead_info is not None:
+        self.m_fhead_item = QCanvasText(self.m_canvas)
+        self.m_fhead_item.setTextFlags(Qt.AlignCenter)
+        self.m_fhead_item.setZ(1.)
+        self.m_fhead_item.setFont(font)
+        self.m_fhead_item.setText('f')
+
+      # XXX
+      ###if self.m_frames.m_ihead_moves is not None:
+      ###  #self.m_ihead_move_items = [QCanvasSpline(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
+      ###  self.m_ihead_move_items = [pyHeadPath(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
+
+      if self.m_frames.m_is_viable:
+        self.emit(PYSIGNAL("gestationTimeChangedSig"),(self.m_frames.m_gestation_time,))
+      else:
+        self.emit(PYSIGNAL("gestationTimeChangedSig"),(len(self.m_frames.m_genome_info),))
+      self.showFrame(0)
+
+  def viewportResizeEvent(self, resize_event):
+    print "pyOrganismScopeView2.viewportResizeEvent()..."
+    QCanvasView.viewportResizeEvent(self, resize_event)
+    # XXX Fragility: If the top-level Avida-ED window is allowed to change height, this is going to cause a painful slow-down
+    # whenever the window height changes.  But having chosen a fixed window height, we're okay for now.
+    #
+    # @kgn
+    if self.m_visible_height != resize_event.size().height() or self.m_visible_width != resize_event.size().width():
+      self.m_canvas.resize(resize_event.size().width(), resize_event.size().height())
+      self.m_visible_width = resize_event.size().width()
+      self.m_visible_height = resize_event.size().height()
+      self.updateCircle()
+      self.showFrame(self.m_current_frame_number)
+
+  def updateCircle(self):
+    print "pyOrganismScopeView2.updateCircle()..."
+
+    if self.m_frames is not None:
+      extra_width_factor = float(self.m_parent_size + self.m_child_size)/self.m_parent_size
+      print "parent_size %d, child_size %d, factor %d" % (self.m_parent_size, self.m_child_size, extra_width_factor)
+      n = max(self.m_parent_size, self.m_child_size)
+      bounded_width = self.m_visible_width - 2.*self.m_organism_circle_margin
+      bounded_height = self.m_visible_height - 2.*self.m_organism_circle_margin
+      self.outer_diameter = min(bounded_width/extra_width_factor, bounded_height)
+      R, r = checkDimensions(self.outer_diameter, n)
+      c_x = self.outer_diameter/2.
+      c_y = self.m_visible_height/2.
+      print "R, r, c_x, c_y, extra_width_factor, outer_diameter:", R, r, c_x, c_y, extra_width_factor, self.outer_diameter
+
+      self.m_circle_center_x = self.outer_diameter/2.
+      self.m_circle_center_y = self.m_visible_height/2.
+      self.m_circle_radius = R
+      self.m_spot_radius = r
+      if self.m_instruction_items is not None:
+        text_height = 2. * self.m_spot_radius
+        font = QFont(self.font())
+        point_size_float = self.m_font_oversize_factor * text_height * self.m_font_points_per_pixel
+        font.setPointSizeFloat(point_size_float)
+        for item in self.m_instruction_items:
+          item.setFont(font)
+        for item in self.m_instruction_bg_items:
+          item.setSize(point_size_float, point_size_float)
+        #self.m_circles = []
+        #self.m_head_circles = []
+        #self.m_circle_radii = []
+        #for frame_no in xrange(self.m_frames.m_gestation_time):
+        #  organism_current_size = max(self.m_frames.m_last_copy_info[frame_no] + 1, self.m_frames.m_size)
+        #  circumference = text_height * organism_current_size
+        #  radius = circumference / (2 * 3.14159)
+        #  dt = 2 * 3.14159 / (organism_current_size + 1)
+        #  angle_offset = 3.14159 / 2
+        #  circle_pts = []
+        #  head_circle_pts = []
+        #  for i in xrange(organism_current_size + 1):
+        #    theta = i * dt + angle_offset
+        #    c = math.cos(theta)
+        #    s = -math.sin(theta)
+        #    x = radius * c + self.m_circle_center_x
+        #    y = radius * s + self.m_circle_center_y
+        #    h_x = (radius + 10) * c + self.m_circle_center_x
+        #    h_y = (radius + 10) * s + self.m_circle_center_y
+        #    circle_pts.append((x,y))
+        #    head_circle_pts.append((h_x,h_y))
+        #  self.m_circles.append(circle_pts)
+        #  self.m_head_circles.append(head_circle_pts)
+        #  self.m_circle_radii.append(radius)
+
+  def debug_displayHardwareCPUSnapshot(self, frame_number):
+    print "pyOrganismScopeView2.debug_displayHardwareCPUSnapshot(%d)..." % frame_number
+    hardware_snapshot = self.m_frames.getHardwareSnapshotAt(frame_number)
+    memory_snapshot = self.m_frames.getMemorySnapshotAt(frame_number)
+    threads_snapshot = self.m_frames.getThreadsSnapshotAt(frame_number)
+
+    print "hardware_snapshot", hardware_snapshot
+    print "memory_snapshot", memory_snapshot
+    print "threads_snapshot", threads_snapshot
+    memory_size = memory_snapshot.GetSize()
+    memory_string = str(memory_snapshot.AsString())
+    print "memory_snapshot.GetSize()", memory_size
+    print "memory:"
+    for i in xrange(memory_size):
+      print " ", memory_string[i], memory_snapshot.GetFlagCopied(i), memory_snapshot.GetFlagExecuted(i)
+    threads_count = len(threads_snapshot)
+    print "thread:"
+    for i in xrange(threads_count):
+      thread = threads_snapshot[i]
+      print " .cur_head", thread.cur_head
+      print " .cur_stack", thread.cur_stack
+      print " .next_label", thread.next_label
+      print " .read_label", thread.read_label
+      #print " .stack", thread.stack
+      for j in xrange(cHardwareDefs.s_STACK_SIZE):
+        print " .stack[%d]" % j, thread.stack.Get(j)
+      print " .reg[s_REG_AX]", thread.GetRegister(cHardwareCPUDefs.s_REG_AX)
+      print " .reg[s_REG_BX]", thread.GetRegister(cHardwareCPUDefs.s_REG_BX)
+      print " .reg[s_REG_CX]", thread.GetRegister(cHardwareCPUDefs.s_REG_CX)
+      #print " .reg[s_REG_DX]", thread.GetRegister(cHardwareCPUDefs.s_REG_DX)
+      print " .heads[s_HEAD_IP]", thread.GetHead(cHardwareDefs.s_HEAD_IP).GetPosition()
+      print " .heads[s_HEAD_READ]", thread.GetHead(cHardwareDefs.s_HEAD_READ).GetPosition()
+      print " .heads[s_HEAD_WRITE]", thread.GetHead(cHardwareDefs.s_HEAD_WRITE).GetPosition()
+      print " .heads[s_HEAD_FLOW]", thread.GetHead(cHardwareDefs.s_HEAD_FLOW).GetPosition()
+
+
+    #print "ss", hardware_snapshot
+    #print "ss.GetMemory()", hardware_snapshot.GetMemory()
+    #print "ss.GetMemory().AsString()", hardware_snapshot.GetMemory().AsString()
+
+    # cCPUMemory memory : cCPUMemory & GetMemory()
+    # cCPUStack global_stack : cCPUStack pyGetGlobalStack()
+    # int thread_time_used : int pyGetThreadTimeUsed()
+    ### assume a single thread
+    # cHardwareCPU_Thread thread : tArray<cHardwareCPU_Thread> pyGetThreads()
+    # bool mal_active : bool GetMalActive()
+    # bool advance_ip : bool pyGetAdvanceIP()
+
+  def showFrame(self, frame_number = 0):
+    print "pyOrganismScopeView2.showFrame(%d)" % frame_number
+    old_frame_number = self.m_current_frame_number
+    old_genome = self.m_current_genome
+
+    self.m_current_frame_number = 0
+    self.m_current_genome = None
+
+    if self.m_frames is not None and frame_number < self.m_frames.m_gestation_time:
+      #self.debug_displayHardwareCPUSnapshot(frame_number)
+      self.m_current_frame_number = frame_number
+      self.m_current_genome = self.m_frames.m_genome_info[self.m_current_frame_number]
+      displayed_genome_size = max(self.last_copied_instruction_cache[self.m_current_frame_number] + 1, self.m_parent_size)
+      theta = 2.*math.pi/self.m_parent_size
+      color = QColor()
+
+      for i in xrange(self.m_parent_size):
+        x = self.m_circle_radius*math.cos(i * theta) + self.m_circle_center_x
+        y = self.m_circle_radius*math.sin(i * theta) + self.m_circle_center_y
+
+        item = self.m_instruction_items[i]
+        item.setX(x)
+        item.setY(y)
+        item.setText(self.m_current_genome[i])
+        item.show()
+
+        bg_item = self.m_instruction_bg_items[i]
+        bg_item.setX(x)
+        bg_item.setY(y)
+        color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
+        bg_item.setBrush(QBrush(color))
+        bg_item.show()
+
+      current_child_size = displayed_genome_size - self.m_parent_size
+      if current_child_size > 0:
+        current_child_radius = self.m_circle_radius * current_child_size / self.m_parent_size
+        current_child_center_x = self.m_circle_center_x + self.m_circle_radius + 2*self.m_spot_radius + current_child_radius
+        current_child_center_y = self.m_circle_center_y
+        theta = 2.*math.pi/current_child_size
+        for i in xrange(current_child_size):
+          x = current_child_radius*math.cos(i * theta + math.pi) + current_child_center_x
+          y = current_child_radius*math.sin(i * theta + math.pi) + current_child_center_y
+
+          item = self.m_instruction_items[i + self.m_parent_size]
+          item.setX(x)
+          item.setY(y)
+          item.setText(self.m_current_genome[i + self.m_parent_size])
+          item.show()
+
+          bg_item = self.m_instruction_bg_items[i + self.m_parent_size]
+          bg_item.setX(x)
+          bg_item.setY(y)
+          color.setHsv((self.m_ops_dict[self.m_current_genome[i + self.m_parent_size]] * 360) / len(self.m_ops_dict), 85, 248)
+          bg_item.setBrush(QBrush(color))
+          bg_item.show()
+
+      for i in xrange(displayed_genome_size, self.m_max_genome_size):
+        item = self.m_instruction_items[i]
+        item.hide()
+        bg_item = self.m_instruction_bg_items[i]
+        bg_item.hide()
+
+    self.emit(PYSIGNAL("frameShownSig"),(self.m_frames, self.m_current_frame_number))
+    self.m_canvas.update()

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py	2006-06-08 21:09:26 UTC (rev 740)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py	2006-06-09 14:08:02 UTC (rev 741)
@@ -86,7 +86,7 @@
   "AvidaGui2.pyOrganismConfigureCtrl",
   "AvidaGui2.pyOrganismDataView",
   "AvidaGui2.pyOrganismDataCtrl",
-  "AvidaGui2.pyOrganismScopeView",
+  "AvidaGui2.pyOrganismScopeView2",
   "AvidaGui2.pyOrganismScopeCtrl",
   "AvidaGui2.pyPetriConfigureView",
   "AvidaGui2.pyPetriConfigureCtrl",




More information about the Avida-cvs mailing list