def onSubmit(self, e): ''' Take user selection and pass it to the GA for fitness evaluation. ''' feedback = None # get user input inject_genomes = self.cogaPanel.getPeerGenomes() if inject_genomes['best']: print 'inject_genomes ', inject_genomes feedback = None self.cogaPanel.clearFeedback() panels_to_display = gaParams.step(feedback, self.displayPanel, inject_genomes) self.display(panels_to_display) self.generation += gaParams.getVar('stepSize') self.genLabel.SetLabel('Generation %d' % self.generation) elif not inject_genomes['best']: feedback = self.displayPanel.getUserInput() if feedback: print 'inject_genomes ', inject_genomes self.cogaPanel.clearFeedback() panels_to_display = gaParams.step(feedback, self.displayPanel, inject_genomes) self.display(panels_to_display) self.generation += gaParams.getVar('stepSize') self.genLabel.SetLabel('Generation %d' % self.generation)
def addPanels(self, panels, expand = True): panel_num = len(panels) self.child_panels = panels rowSize = 3 if gaParams.getVar('gui'): space = (5, 5) else: space = (20, 20) if gaParams.params.has_key('rowSize'): rowSize = gaParams.params['rowSize'] if expand: def addtorow(row, panel): row.Add(panel, 0, wx.EXPAND) else: def addtorow(row, panel): row.Add(panel, 0) self.sizer.AddSpacer(space) self.SetFont(wx.Font(11, wx.SWISS, wx.NORMAL,wx.FONTWEIGHT_BOLD)) self.sizer.Add(wx.StaticText(self, -1, 'My Genomes'), 0, wx.ALIGN_CENTER|wx.EXPAND) self.SetFont(self.defFont) best_subset = gaParams.getVar('population')['subset']['size'] for i in xrange(0, best_subset, rowSize): row = wx.BoxSizer(wx.HORIZONTAL) row.AddSpacer(space) num_cols = min(rowSize, len(panels)-i) for j in xrange(num_cols): addtorow(row, panels[i+j]) row.AddSpacer(space) addtorow(self.sizer, row) self.sizer.AddSpacer((30,50)) self.SetFont(wx.Font(11, wx.SWISS, wx.NORMAL,wx.FONTWEIGHT_BOLD)) self.sizer.Add(wx.StaticText(self, -1, 'Rest of Population'), 0, wx.ALIGN_CENTER|wx.EXPAND) self.SetFont(self.defFont) # add rest of pop for i in xrange(best_subset, len(panels), rowSize): row = wx.BoxSizer(wx.HORIZONTAL) row.AddSpacer(space) num_cols = min(rowSize, len(panels)-i) for j in xrange(num_cols): addtorow(row, panels[i+j]) row.AddSpacer(space) addtorow(self.sizer, row) self.sizer.AddSpacer(space) self.Scroll(0, 0) self.Layout()
def __init__(self, parent = None, id = wx.NewId(), size = None): ''' GUI window for the GA. ''' wx.Panel.__init__(self, parent, wx.ID_ANY, size = size) import leftPanel if gaParams.getVar('gui'): import rightPanel as _rightPanel else: import newrightPanel as _rightPanel # window splitter self.split = wx.SplitterWindow(self, -1, style = wx.SP_3D) self.rightPanel = _rightPanel.RightPanel(self.split, size = (100, 100), style = wx.RAISED_BORDER | wx.DOUBLE_BORDER) self.leftPanel = leftPanel.LeftPanel(self.split, size = (100, 100), style = wx.RAISED_BORDER | wx.DOUBLE_BORDER) self.split.SplitVertically(self.leftPanel, self.rightPanel, sashPosition=150) self.rightPanel.left = self.leftPanel self.leftPanel.right = self.rightPanel self.leftPanel.onDisconnect(None) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.split, 1, wx.EXPAND) self.SetSizer(sizer) self.Layout() self.Show(True)
def __init__(self,parent,ID=-1,dimensions=[],description=[],pos=wx.DefaultPosition,size=(220,260)): feedbackpanel.FeedbackPanel.__init__(self,parent,ID,size) self.parent = parent self.SetBackgroundColour(wx.WHITE) self.dimensions=dimensions self.description=description self.SetMinSize(size) appVar = gaParams.getVar('application') self.width = appVar['plotSizeX'] self.height = appVar['plotSizeY'] rooms = {} rooms['bath'] = Image.open('app/floorplanner/bath.png') rooms['bedroom'] = Image.open('app/floorplanner/bedroom.png') rooms['kitchen'] = Image.open('app/floorplanner/kitchen.png') rooms['livingroom'] = Image.open('app/floorplanner/livingroom.png') self.rooms = rooms self.xoffset = 25.0 self.yoffset = 40.0 if appVar.has_key('texture') and appVar['texture']: self.floorplan = self.draw_pil_texture() else: self.floorplan = self.draw_pil() self.Bind(wx.EVT_PAINT, self.draw)
def userInput(self, user_selection = []): ''' Takes a list of the indices of the individuals selected by the user during evaluation, and we save the actual users on a list, to be used during fitness evaluation. It is the programmer's responsibility to decide on the meaning of the user feedback. ''' # if feedback provided, otherwise the user selection was made # on the injected individuals if user_selection: user_selected = [] ops = gaParams.getVar('operators') inc_prob = .05 dec_prob = .05 / len(ops)-1 for i in user_selection: ind = self.subset[i] user_selected.append(ind) ind_ops = ind.operators ind_ops.count(1) if ind_ops: for j in xrange(self.op_len): if ind_ops[j]: ops[j] = min(ops[j] + 0.05, 0.9) else: ops[j] = max(ops[j] - 0.05, 0.1) print 'ops ', ops self.user_selected = user_selected
def fillCoGAPanels(self): ''' Request genomes from peers to be displayed on collaboration panels. ''' if self.online: subset_size = gaParams.getVar('population')['subset']['size'] peer_list = gaParams.peer_list if peer_list: # for every peer, ping it, if alive then # get pickled genomes and draw them in the coga panels to_draw = [] must = [] status = {} for peer in peer_list: status[peer.getName()] = 'offline' if peer.online(): genome_objs = peer.getGenomes() if genome_objs: must.append(genome_objs[0]) to_draw.extend(genome_objs[1:]) status[peer.getName()] = 'online' self.parent.peerStatus(status) if to_draw: self.cogaPanel.drawGenomes(must+random.sample(to_draw, subset_size-(len(must))))
def __init__(self, root=None): """ Creates this organism """ num_eqs = randrange(1, len(self.eqs)+1) self.eq_picked = rnd.sample(self.eqs, num_eqs) user = gaParams.getVar('user') collab = gaParams.getVar('collaborate') if collab: t_id = int(user.split('_')[0][-1]) if t_id % 2: self.funcs.pop('sin', None) self.funcs.pop('cos', None) self.funcs.pop('tan', None) else: self.funcs.pop('*', None) self.funcs.pop('/', None) #if t_id % 2: # if 'time' in self.vars: # self.vars.remove('time') #else: # if 'p.x' in self.vars: # self.vars.remove('p.x') # if 'p.y' in self.vars: # self.vars.remove('p.y') # if 'p.z' in self.vars: # self.vars.remove('p.z') else: #if 'time' in self.vars: # self.vars.remove('time') self.funcs.pop('*', None) self.funcs.pop('/', None) #print self.funcs, self.vars #self.eq_picked = [choice(self.eqs)] if root == None: root = self.genNode() self.tree = root
def fillCoGAPanels(self): ''' Request genomes from peers to be displayed on collaboration panels. ''' peer_list = gaParams.peer_list peer_num = min(4, len(peer_list)) panel_counter = 0 row_size = gaParams.getVar('rowSize') peer_genome = [] # for every peer, ping it, if alive then # get pickled genomes and draw them in the coga panels status = [] for peer in peer_list: if peer.online(): genome = peer.proxy.getGenomes() genome_objs = loads(genome) peer_genome.append(genome_objs) to_display = row_size if self.coga_panel[panel_counter].orientation == wx.HORIZONTAL: to_display += 2 self.coga_panel[panel_counter].drawGenomes(genome_objs[:to_display]) panel_counter += 1 status.append([peer.getName(), 'online']) else: status.append([peer.getName(), 'offline']) self.parent.peerStatus(status) if peer_genome: # fill the rest of the empty coga panels with # remaining genomes, if any leftover = [] for genome in peer_genome: leftover.extend(genome[row_size:]) random.shuffle(leftover) for panel in self.coga_panel[panel_counter:]: to_display = row_size if panel.orientation == wx.HORIZONTAL: to_display += 2 panel.drawGenomes(leftover[:to_display]) del(leftover[:to_display]) #for i in xrange(peer_num): # if peer_list[i].online(): # genome = peer_list[i].proxy.getGenomes() # genome_objs = loads(genome) # peer_genome.append(genome_objs) # panels = gaParams.draw(self.coga_panel[panel_counter], genome_objs[:row_size]) # self.coga_panel[panel_counter].addPanels(panels) # panel_counter += 1 self.peer_genome = peer_genome
def __init__(self, paramClass, paramDict): nsga_ii.Population.__init__(self, paramClass, paramDict) ops = gaParams.getVar('operators') len_ops = len(ops) op_prob = 1. / len_ops for i in xrange(len_ops): ops[i] = op_prob self.op_len = len(ops) print 'ops ', ops
def report(self, pop, subset, gen): ''' Write to console or file population statistics. ''' user = gaParams.getVar('user') app_name = self.params['name'] dump_file = 'data/%s_%s_%d_pop_%d_%d.pickle' % (user, app_name, gen, self.hour, self.min) fout = open(dump_file, 'w') pickle.dump(pop, fout) fout.close() return
def display(self, panels_to_display): ''' Takes a list of panels to display to be evaluated. ''' displayPanel = self.displayPanel displayPanel.clear() expandFlag = bool(gaParams.getVar('expand')) displayPanel.addPanels(panels_to_display, expand=expandFlag) displayPanel.fit() self.fillCoGAPanels() self.Layout()
def __init__(self, parent, id, decoded_data, pos=wx.DefaultPosition, size=(300,300)): feedbackpanel.FeedbackPanel.__init__(self, parent, id, size) self.parent = parent self.SetBackgroundColour(wx.WHITE) self.SetMinSize(size) appVar = gaParams.getVar('application') self.width = size[0] self.height = size[1] self.decoded_data = decoded_data imgs = [Image.open('app/docdesign/'+img).convert('RGBA') for img in appVar['images']] self.imgs = imgs self.Bind(wx.EVT_PAINT, self.draw)
def onSubmit(self, e): ''' Take user selection and pass it to the GA for fitness evaluation. ''' # get user input feedback = self.displayPanel.getUserInput() if feedback: # check collaborative panels to see if any genomes need to be added # to gene pool inject_genomes = [] for cpanel in self.coga_panel: inject_genomes.extend(cpanel.getPeerGenomes()) print 'inject_genomes ', inject_genomes panels_to_display = gaParams.step(feedback, self.displayPanel, inject_genomes) self.display(panels_to_display) self.generation += gaParams.getVar('stepSize') self.genLabel.SetLabel('Generation %d' % self.generation)
def __init__(self, parent, ID=wx.NewId(), dimensions=[], description=[], transf = [], color_scheme = [], pos=wx.DefaultPosition, size=(220,260)): feedbackpanel.FeedbackPanel.__init__(self,parent,ID,size) self.parent = parent self.SetBackgroundColour(wx.WHITE) self.dimensions=dimensions self.description=description self.transf = transf self.color_scheme = color_scheme self.coordinates, self.roomsizes = self.getRoomDesc() self.SetMinSize(size) appVar = gaParams.getVar('application') self.max_val = appVar['max_scale'] self.min_val = appVar['min_scale'] self.rr_radius = appVar['rr_radius'] self.width = appVar['plotSizeX'] self.height = appVar['plotSizeY'] self.canvas = wx.Panel(self, size =(self.width, self.height)) self.canvas.Bind(wx.EVT_PAINT, self.draw) vsizer = wx.BoxSizer(wx.HORIZONTAL) vsizer.AddSpacer((20,10)) vsizer.Add(self.canvas) test_bmp = wx.Bitmap('app/doctemplate/eog.png') test_button = wx.BitmapButton(self, wx.NewId(), bitmap = test_bmp) self.Bind(wx.EVT_BUTTON, self.onTest, test_button) vsizer.AddSpacer((10,10)) vsizer.Add(test_button) self.sizer.Add(vsizer) self.computeShapeLoc()
def __init__(self, parent, ID=wx.NewId(), individual = None, quad_tree=[], color_scheme = [], pos=wx.DefaultPosition, size=(220,260)): feedbackpanel.FeedbackPanel.__init__(self,parent,ID,size) self.parent = parent self.SetBackgroundColour(wx.LIGHT_GREY) self.shape_list = quad_tree self.color_scheme = color_scheme self.rank = individual.rank self.SetMinSize(size) appVar = gaParams.getVar('application') self.max_val = appVar['max_scale'] self.min_val = appVar['min_scale'] self.rr_radius = appVar['rr_radius'] self.width = appVar['plotSizeX'] self.height = appVar['plotSizeY'] self.canvas = wx.Panel(self, size =(self.width, self.height)) self.canvas.Bind(wx.EVT_PAINT, self.draw) vsizer = wx.BoxSizer(wx.HORIZONTAL) vsizer.AddSpacer((20,10)) vsizer.Add(self.canvas) test_bmp = wx.Bitmap('app/doctemplate/eog.png') test_button = wx.BitmapButton(self, wx.NewId(), bitmap = test_bmp) self.Bind(wx.EVT_BUTTON, self.onTest, test_button) vsizer.AddSpacer((10,10)) vsizer.Add(test_button) self.sizer.Add(vsizer) self.updateShapeList() self.sizer.Add(wx.StaticText(self, -1, 'R: %d' % self.rank)) self.Layout()
def __init__(self, parent, ID=wx.NewId(), dimensions=[], description=[], transf = [], pos=wx.DefaultPosition, size=(220,260)): feedbackpanel.FeedbackPanel.__init__(self,parent,ID,size) self.parent = parent self.SetBackgroundColour(wx.WHITE) self.dimensions=dimensions self.description=description self.transf = transf self.SetMinSize(size) self.max_val = 0.3 self.min_val = -0.3 appVar = gaParams.getVar('application') self.width = appVar['plotSizeX'] self.height = appVar['plotSizeY'] self.canvas = wx.Panel(self, size =(self.width, self.height)) self.canvas.Bind(wx.EVT_PAINT, self.draw) vsizer = wx.BoxSizer(wx.HORIZONTAL) vsizer.AddSpacer((20,10)) vsizer.Add(self.canvas) self.sizer.Add(vsizer)
def __init__(self, parent, size = None, color = "LIGHT BLUE", style = None): #wx.Panel.__init__(self, parent, -1, size=size, style = wx.RAISED_BORDER | wx.DOUBLE_BORDER) wx.Panel.__init__(self, parent, -1, size=size, style = wx.DOUBLE_BORDER) self.SetBackgroundColour('WHITE') self.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL,wx.FONTWEIGHT_BOLD)) self.gaWindow = parent.GetParent() yaml = gaParams.getYaml() f = open('config/guiconfig.yml', 'r') widgets = yaml.load(f) widgets = widgets['widgets'] f.close() self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add((10, 14)) # Population size label self.sizer.Add(wx.StaticText(self, -1, 'Population Size:'), 0, wx.ALIGN_CENTER) # Population size slider self.populationSlider = wx.Slider(self, -1, size=(100, 40), style= wx.SL_LABELS | wx.SL_AUTOTICKS) max = int(widgets['population']['max']) min = int(widgets['population']['min']) self.populationSlider.SetRange(min, max) self.populationSlider.SetValue(gaParams.getVar('population_size')) self.sizer.Add(self.populationSlider, 0, wx.ALIGN_CENTER) self.Bind(wx.EVT_SCROLL, self.onPopulationChange, self.populationSlider) xoRate, mutRate = gaParams.getGARates() # XO Rate Slider self.xoRateSlider = wx.Slider(self, -1, size = (100, 40), style = wx.SL_LABELS | wx.SL_AUTOTICKS) max = int(widgets['crossover']['max']) min = int(widgets['crossover']['min']) self.xoRateSlider.SetRange(min, max) self.xoRateSlider.SetValue(xoRate * max) # Add xo slider to sizer self.sizer.Add((10, 10)) self.sizer.Add(wx.StaticText(self, -1, 'Crossover Rate:'), 0, wx.ALIGN_CENTER) self.sizer.Add(self.xoRateSlider, 0, wx.ALIGN_CENTER) self.Bind(wx.EVT_SCROLL, self.onCrossoverChange, self.xoRateSlider) # Mutation Rate self.mutBox = wx.TextCtrl(self, -1, size = (50, -1)) self.mutBox.SetValue("%.3f" % mutRate) tempSizer = wx.BoxSizer(wx.HORIZONTAL) tempSizer.Add(wx.StaticText(self, -1, 'Mutation:'), 0, wx.ALIGN_CENTER_VERTICAL) tempSizer.Add(self.mutBox, 0) self.sizer.Add((10, 10)) self.sizer.Add(tempSizer, 0, wx.ALIGN_CENTER) max = int(widgets['mutation']['max']) min = int(widgets['mutation']['min']) self.Bind(wx.EVT_TEXT, self.onMutationChange, self.mutBox) self.sizer.Add((10, 10)) # Step size spinner control self.stepSize = wx.SpinCtrl(self, wx.ID_ANY, size = (50,23)) self.stepSize.SetRange(1, 300) step = gaParams.getVar('stepSize') or 1 self.stepSize.SetValue(step) self.Bind(wx.EVT_SPINCTRL, self.onSpin, self.stepSize) # Add spinner with text label to sizer tempSizer = wx.BoxSizer(wx.HORIZONTAL) tempSizer.Add(wx.StaticText(self, -1, 'Step Size:'), 0, wx.ALIGN_CENTER_VERTICAL) tempSizer.Add(self.stepSize) self.sizer.Add(tempSizer, 0, wx.ALIGN_CENTER) # edit mask button self.sizer.AddSpacer((10, 10)) self.maskB = wx.Button(self, -1, 'Edit Mask') self.Bind(wx.EVT_BUTTON, self.onEditMask, self.maskB) self.sizer.Add(self.maskB, 0, wx.ALIGN_CENTER) if not gaParams.getAppVars(): self.maskB.Enable(False) # 8px spaces for widgets in same group # 10px for widgets not in the same group # ----------------------------------- # peer stuff self.sizer.Add((10, 10)) self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND) self.sizer.Add((10, 10)) peers = {} peer_list = gaParams.getVar('peers') online = wx.Bitmap('gui/online.png') offline = wx.Bitmap('gui/offline.png') delete = wx.Bitmap('gui/delete.png') self.online, self.offline, self.delete = online, offline, delete # my status tmp_sizer = wx.BoxSizer(wx.HORIZONTAL) self.my_status = wx.StaticBitmap(self) self.my_status.SetBitmap(online) tmp_sizer.Add(self.my_status) tmp_sizer.Add(wx.StaticText(self, -1, 'Collaborate')) self.sizer.Add(tmp_sizer) # add peer button self.sizer.Add((10, 10)) newButton = wx.Button(self, -1, 'Add Peer...') newButton.Bind(wx.EVT_BUTTON, self.onAddPeer, newButton) self.sizer.Add(newButton) self.sizer.Add((10, 10)) # keeps track of each ID for each peer self.names = {} # add list of peers all_peers_sizer = wx.BoxSizer(wx.VERTICAL) for peer in peer_list: id = wx.NewId() peer_sizer = wx.BoxSizer(wx.HORIZONTAL) peer_status = wx.StaticBitmap(self) peer_status.SetBitmap(offline) peer_name = wx.StaticText(self, -1, peer) peer_name.Bind(wx.EVT_LEFT_DOWN, self.onEditPeer, peer_name) peer_sizer.Add(peer_status) peer_sizer.Add(peer_name) peer_delete = wx.BitmapButton(self, id = id, bitmap = delete, style = wx.ALIGN_RIGHT) self.Bind(wx.EVT_BUTTON, self.onDeletePeer, peer_delete) peer_sizer.Add(wx.StaticText(self, -1, ' '), 1) peer_sizer.Add(peer_delete) all_peers_sizer.Add(peer_sizer, 0, wx.EXPAND) peers[id] = {'name': peer, 'sizer': peer_sizer, 'status': peer_status} self.names[peer] = id self.sizer.Add(all_peers_sizer) self.peer_sizer = all_peers_sizer self.peers = peers self.status_bitmap = {} self.status_bitmap['online'] = online self.status_bitmap['offline'] = offline # Disconnect button self.sizer.AddSpacer((10, 10)) self.disconnect = wx.Button(self, -1, 'Disconnect') self.Bind(wx.EVT_BUTTON, self.onDisconnect, self.disconnect) self.sizer.Add(self.disconnect, 0, wx.ALIGN_CENTER) # refresh button self.sizer.AddSpacer((10, 10)) self.refresh = wx.Button(self, wx.ID_REFRESH, '') self.Bind(wx.EVT_BUTTON, self.onRefresh, self.refresh) self.sizer.Add(self.refresh, 0, wx.ALIGN_CENTER) # back button self.sizer.AddSpacer((10, 10)) self.back = wx.Button(self, wx.ID_BACKWARD, '') self.back.Enable(False) self.Bind(wx.EVT_BUTTON, self.onBack, self.back) self.sizer.Add(self.back, 0, wx.ALIGN_CENTER) self.sizer.AddSpacer((10, 10)) self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND) self.sizer.AddSpacer((10, 10)) self.app_panels = [] self.appSizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.appSizer, 0, wx.EXPAND) self.reset() # Add submit button self.submit = wx.Button(self, -1, 'Step %d Gen' % step, size = (130,-1)) self.submit.Enable(False) self.Bind(wx.EVT_BUTTON, self.onSubmit, self.submit) self.sizer.Add(self.submit, 0, wx.ALIGN_CENTER) # final sizer and fitting stuff self.SetSizer(self.sizer) self.SetAutoLayout(True) self.sizer.Layout() self.sizer.Fit(self) self.sizer.SetSizeHints(self) self.Layout() # Keeps the textbox from having the default focus, which was annoying self.SetFocus() self.timestamp = 0. self.gen = 0
except: print 'No psyco! Oh well...' args = parse() from iga.gacommon import gaParams if args.has_key('config'): filename = args['config'] if not filename.startswith('config'): filename = 'config/' + filename gaParams.fileArgs(filename) else: gaParams.fileArgs('config/floorplan.yml') gaParams.setArgs(args) if gaParams.getVar('mode') == 'ga': gaParams.consoleGA() else: from gui import gawindow import wx app = wx.PySimpleApp() gaWindow = gawindow.GAWindow() gaWindow.SetFocus() app.MainLoop() app.Destroy() #-------------------------------------------#