def onRun(self, display_panel):
        '''
        Called when GA is created.
        '''
        self.pingPeers()

        from iga import IGA
        self.ga = IGA(self.params)

        return self.ga.run(display_panel)
Esempio n. 2
0
    def onInit(self, context = {}):
        '''
        Called when GA is created.
        '''
        self.createPeers()
        print 'colab', context['collaborate']
        self.params['collaborate'] = context['collaborate']

        self.params['application']['init_context'] = context
        from iga import IGA
        self.ga = IGA(self.params)
Esempio n. 3
0
    def onRun(self, display_panel):
        '''
        Called when GA is created.
        '''
        self.params['current_gen'] = 0

        from iga import IGA
        self.ga = IGA(self.params)

        self.createPeers()

        return self.ga.run(display_panel)
class CommonParams:
    '''
    Holder for shared variables.
    The variables are set and modified by the GUI.
    The vars are retrieved by the GA.
    '''

    def __init__(self):
        self.ga = None
        self.params = None
        self.peer_list = None
        self.server_thread = None
        self.app_name = None
        self.yaml_file = None
        self.dirty = False

#-------------------------------------------#
    def reset(self):
        '''
            Reset server state.
        '''
        self.exit()
        if self.ga:
            del self.ga
        self.ga = None
        self.params = None
        self.peer_list = None
        self.server_thread = None
        self.app_name = None
        self.yaml_file = None
        self.dirty = False

#-------------------------------------------#
    def getYaml(self):
        try:
            import yaml
        except:
            import _yaml_ as yaml

        return yaml

#-------------------------------------------#
    def fileArgs(self, yaml_file):
        '''
        Parse config files.
        '''
        self.yaml_file = yaml_file
        yaml = self.getYaml()
        f = open(yaml_file, 'r')
        params = yaml.load(f)
        f.close()

        # helper func which recursively inherits dictionaries
        def fillDict(_params, _inherit_params):
            for _key, _value in _params.iteritems():
                if type(_value) is dict and _inherit_params.has_key(_key):
                    fillDict(_value, _inherit_params[_key])
                else:
                    _inherit_params[_key] = _value

        # parse any files from which the
        # yaml config is being inherited from
        if params.has_key('inherits'):
            inherit_params = {}
            base_files = params['inherits'][:]
            base_files.reverse()
            for filename in base_files:
                # fill temp dictionary with inherited attributes
                f = open('config/'+filename, 'r')
                base_params = yaml.load(f)
                f.close()

                # values not defined in derived file are pulled from inherited file
                fillDict(inherit_params, base_params)
                inherit_params = base_params

            # fill our dictionary with values inherited
            fillDict(params, inherit_params)
            self.params = inherit_params                       
        else:
            self.params = params

        self.app_name = self.params['application']['name']

#-------------------------------------------#
    def exit(self):
        '''
        Kill running server.
        '''
        if self.server_thread:
            import time
            proxy = xmlrpclib.Server("http://localhost:%i" % self.params['port'])
            # The first call sets the kill flag
            proxy.__kill__()
            time.sleep(.1)
            # because of racing conditions we may have to call
            # kill again to terminate the server
            try:
                proxy.__kill__()
            except:
                pass
            del(proxy)
            self.server_thread.join()


        if self.dirty:
            self.yaml_file
            f = open(self.yaml_file, 'r')
            params = f.readlines()
            f.close()

            i = 0
            for line in params:
                if line.strip().startswith('peers'):
                    params[i] = 'peers: %s\n' % str(self.params['peers'])
                    break
                i += 1

            f = open(self.yaml_file, 'w')
            for line in params:
                f.write(line)
            f.close()


#-------------------------------------------#
    def addPeer(self, name):
        '''
        Add peer node.
        Duplicate check is done by GUI.
        '''
        plist = self.peer_list

        if plist is None:
            if self.params.has_key('peers'):
                self.params['peers'].append(name)
            else:
                self.params['peers'] = [name]

        else:
            plist.append(PeerNode(name, self.app_name))
            self.params['peers'].append(name)

        self.dirty = True

#-------------------------------------------#
    def delPeer(self, name):
        '''
        Delete the given peer from list.
        '''
        plist = self.peer_list
        if plist is None:
            self.params['peers'].remove(name)
        else:
            for peer in self.peer_list:
                if name == peer.getName():
                    self.peer_list.remove(peer)
                    self.params['peers'].remove(name)
                    break

        self.dirty = True

#-------------------------------------------#
    def pingPeers(self):
        '''
        Create connections to each peer.
        '''
        from p2p import serverthread
        self.server_thread = serverthread.ServerThread()
        self.server_thread.start()

        if self.peer_list is None:
            if self.params.has_key('peers'):
                peer_list = []
                for peer in self.params['peers']:
                    peer_list.append(PeerNode(peer, self.app_name))

                self.peer_list = peer_list
        else:
            self.peer_list = []

#-------------------------------------------#
    def getGARates(self):
        '''
        Get crossover and mutation rates.
        '''
        return self.params['crossover']['prob'], self.params['mutation']['prob']

#-------------------------------------------#
    def setVar(self, name, value):
        '''
        Set variable in the attributes dictionary, or create new if var doesn't exist.
        directly.
        '''
        if name == 'crossover_prob':
            self.params['crossover']['prob'] = value
        elif name == 'mutation_prob':
            self.params['mutation']['prob'] = value
        elif name == 'population_size':
            self.params['population']['size'] = value
        else:
            self.params[name] = value


#-------------------------------------------#
    def setVars(self, varNames, values):
        '''
        Sets variables from list in the attributes dictionary, or create new if var doesn't exist.
        directly.
        '''
        for i in xrange(len(varNames)):
            self.params[varNames[i]] = values[i]

#-------------------------------------------#
    def getVar(self, name):
        '''
        Get variable from the attributes dictionary. To keep from accessing the dictionary
        directly.
        '''
        if name == 'crossover_prob':
            return self.params['crossover']['prob']
        elif name == 'mutation_prob':
            return self.params['mutation']['prob']
        elif name == 'population_size':
            return self.params['population']['size']

        else:
            if self.params.has_key(name):
                return self.params[name]
            else:
                print 'Variable %s does not exist!' % name
                return None

#-------------------------------------------#
    def getVars(self, varNames):
        '''
        Get list of variables from the attributes dictionary. To keep from accessing the dictionary
        directly.
        '''
        returnList = []
        for name in varNames:
            if self.params.has_key(name):
                returnList.append(self.params[name])
            else:
                print 'Variable %s does not exist!' % name

        return returnList


#-------------------------------------------#
    def setArgs(self, args):
        '''
        Update settings based on command line arguments.
        Command line arguments override file defaults.
        '''
        if args:
            self.setVars(args.keys(), args.values())


#-------------------------------------------#
    def consoleGA(self):
        '''
        Run non-interactive GA.
        '''
        from ga import GA
        ga = GA(self.params)
        ga.run()

#-------------------------------------------#
    def step(self, user_feedback, display_panel, inject_genomes):
        '''
        Take the user input and the individuals to inject
        and step n generations.
        '''
        print 'user_feedback', user_feedback
        return self.ga.step(user_feedback, display_panel, inject_genomes)

#-------------------------------------------#
    def onRun(self, display_panel):
        '''
        Called when GA is created.
        '''
        self.pingPeers()

        from iga import IGA
        self.ga = IGA(self.params)

        return self.ga.run(display_panel)

#-------------------------------------------#
    def draw(self, parent_panel, genomes):
        '''
        Take a list of genomes and have the app file
        create panels for them.
        '''
        panels = self.ga.draw(parent_panel, genomes)
        return panels

#-------------------------------------------#
    def getAppVars(self):
        '''
        Return a reference to the application variables.
        '''
        if self.params['application'].has_key('vars'):
            return self.params['application']['vars']
        else:
            return None

#-------------------------------------------#
    def updateMask(self, mask_vars):
        '''
        Used by the peer handler.
        Returns a list of genomes to be displayed
        on the screen of the requesting peer.
        '''
        vars = self.getAppVars()
        if vars:
            to_update = []
            for var_name, var_state in mask_vars.iteritems():
                if var_state is not vars[var_name]['mask']:
                    to_update.append(var_name)
                    vars[var_name]['mask'] = var_state
            
            # if GA is running, then update pop with new mask
            if self.ga:
                self.ga.updateMask(to_update)


#-------------------------------------------#
    def back(self, display_panel):
        return self.ga.back(display_panel)

#-------------------------------------------#
    def getAppName(self):
        return self.app_name

#-------------------------------------------#
    def getNGenomes(self, genome_num):
        '''
        Used by the peer handler.
        Returns a list of genomes to be displayed
        on the screen of the requesting peer.
        '''
        subset = self.ga.getSubset()
        # just return the subset displayed on the peers' screens

        #random_inds = self.ga.getNRandom(len(subset))
        #subset.extend(random_inds)
        return subset, self.app_name
Esempio n. 5
0
class CommonParams:
    '''
    Holder for shared variables.
    The variables are set and modified by the GUI.
    The vars are retrieved by the GA.
    '''

    def __init__(self):
        self.ga = None
        self.params = None
        self.peer_list = None
        self.server_thread = None
        self.app_name = None
        self.yaml_file = None
        self.dirty = False
        self.peer_subset = []

#-------------------------------------------#
    def reset(self):
        '''
            Reset server state.
        '''
        self.exit()
        if self.ga:
            del self.ga
        self.ga = None
        self.params = None
        self.peer_list = None
        self.server_thread = None
        self.app_name = None
        self.yaml_file = None
        self.dirty = False

#-------------------------------------------#
    def getYaml(self):
        import yaml
        return yaml

#-------------------------------------------#
    def fileArgs(self, yaml_file, collaborate = False, tag = None):
        '''
        Parse config files.
        '''
        pre_path = yaml_file.split(yaml_file.split('/')[-1])[0]
        self.yaml_file = yaml_file
        yaml = self.getYaml()
        f = open(yaml_file, 'r')
        params = yaml.load(f)
        f.close()

        # helper func which recursively inherits dictionaries
        def fillDict(_params, _inherit_params):
            for _key, _value in _params.iteritems():
                if type(_value) is dict and _inherit_params.has_key(_key):
                    fillDict(_value, _inherit_params[_key])
                else:
                    _inherit_params[_key] = _value

        # parse any files from which the
        # yaml config is being inherited from
        if params.has_key('inherits'):
            inherit_params = {}
            base_files = params['inherits'][:]
            base_files.reverse()
            for filename in base_files:
                # fill temp dictionary with inherited attributes
                f = open(pre_path + filename, 'r')
                base_params = yaml.load(f)
                f.close()

                # values not defined in derived file are pulled from inherited file
                fillDict(inherit_params, base_params)
                inherit_params = base_params

            # fill our dictionary with values inherited
            fillDict(params, inherit_params)
            self.params = inherit_params                       
        else:
            self.params = params

        self.app_name = self.params['application']['name']
        if self.params['seed']:
            self.params['random'] = rnd.Random(self.params['seed'])
        else:
            self.params['random'] = rnd.Random()


        import time
        t = time.localtime()
        h, m, s = t[3], t[4], t[5]
        user = self.params['user']
        self.params['user'] = '******' % (user, h, m, s)


#-------------------------------------------#
    def exit(self):
        '''
        Kill running server.
        '''
        if self.server_thread:
            import time
            proxy = xmlrpclib.Server("http://localhost:%i" % self.params['port'])
            # The first call sets the kill flag
            proxy.__kill__()
            time.sleep(.1)
            # because of racing conditions we may have to call
            # kill again to terminate the server
            try:
                proxy.__kill__()
            except:
                pass
            del(proxy)
            self.server_thread.join()

#-------------------------------------------#
    def pingPeers(self):
        return all(peer.online() for peer in self.peer_list)

#-------------------------------------------#
    def createPeers(self):
        '''
        Create connections to each peer.
        '''
        from p2p import serverthread
        self.server_thread = serverthread.ServerThread()
        self.server_thread.start()

        if self.peer_list is None:
            if self.params.has_key('peers'):
                peer_list = []
                for peer in self.params['peers']:
#                    peer_list.append(peernode.PeerNode(peer, self.app_name))
                    peer_list.append(PeerNode(peer, self.app_name))

                self.peer_list = peer_list
        else:
            self.peer_list = []

#-------------------------------------------#
    def getGARates(self):
        '''
        Get crossover and mutation rates.
        '''
        return self.params['crossover']['prob'], self.params['mutation']['prob']

#-------------------------------------------#
    def setVar(self, name, value):
        '''
        Set variable in the attributes dictionary, or create new if var doesn't exist.
        directly.
        '''
        if name == 'crossover_prob':
            self.params['crossover']['prob'] = value
        elif name == 'mutation_prob':
            self.params['mutation']['prob'] = value
        elif name == 'population_size':
            self.params['population']['size'] = value
        else:
            self.params[name] = value


#-------------------------------------------#
    def setVars(self, varNames, values):
        '''
        Sets variables from list in the attributes dictionary, or create new if var doesn't exist.
        directly.
        '''
        for i in xrange(len(varNames)):
            self.params[varNames[i]] = values[i]

#-------------------------------------------#
    def getVar(self, name):
        '''
        Get variable from the attributes dictionary. To keep from accessing the dictionary
        directly.
        '''
        if name == 'crossover_prob':
            return self.params['crossover']['prob']
        elif name == 'mutation_prob':
            return self.params['mutation']['prob']
        elif name == 'population_size':
            return self.params['population']['size']

        else:
            if self.params.has_key(name):
                return self.params[name]
            else:
                print 'Variable %s does not exist!' % name
                return None

#-------------------------------------------#
    def getVars(self, varNames):
        '''
        Get list of variables from the attributes dictionary. To keep from accessing the dictionary
        directly.
        '''
        returnList = []
        for name in varNames:
            if self.params.has_key(name):
                returnList.append(self.params[name])
            else:
                print 'Variable %s does not exist!' % name

        return returnList


#-------------------------------------------#
    def setArgs(self, args):
        '''
        Update settings based on command line arguments.
        Command line arguments override file defaults.
        '''
        if args:
            self.setVars(args.keys(), args.values())


#-------------------------------------------#
    def consoleGA(self):
        '''
        Run non-interactive GA.
        '''
        from ga import GA
        ga = GA(self.params)
        ga.run()
        return ga.getPop()

#-------------------------------------------#
    def onInit(self, context = {}):
        '''
        Called when GA is created.
        '''
        self.createPeers()
        print 'colab', context['collaborate']
        self.params['collaborate'] = context['collaborate']

        self.params['application']['init_context'] = context
        from iga import IGA
        self.ga = IGA(self.params)

#-------------------------------------------#
    def onRun(self, display_panel):
        '''
        Called when GA is created.
        '''
        self.params['current_gen'] = 0

        from iga import IGA
        self.ga = IGA(self.params)

        self.createPeers()

        return self.ga.run(display_panel)

#-------------------------------------------#
    def step(self, user_feedback, inject_genomes = None):
        '''
        Take the user input and the individuals to inject
        and step n generations.
        '''
        print 'user_feedback', user_feedback
        return self.ga.step(user_feedback, inject_genomes)

#-------------------------------------------#
    def old_draw(self, parent_panel, genomes):
        '''
        Take a list of genomes and have the app file
        create panels for them.
        '''
        panels = self.ga.draw(parent_panel, genomes)
        return panels

#-------------------------------------------#
    def getAppVars(self):
        '''
        Return a reference to the application variables.
        '''
        if self.params['application'].has_key('vars'):
            return self.params['application']['vars']
        else:
            return None

#-------------------------------------------#
    def back(self):
        return self.ga.back()

#-------------------------------------------#
    def getAppName(self):
        return self.app_name

#-------------------------------------------#
    def callAppSlot(self, slot, args):
        self.ga.callAppSlot(slot, args)

#-------------------------------------------#
    def getNGenomes(self, genome_num):
        '''
        Used by the peer handler.
        Returns a list of genomes to be displayed
        on the screen of the requesting peer.
        '''
        subset = self.ga.getSubset()
        # just return the subset displayed on the peers' screens

        #random_inds = self.ga.getNRandom(len(subset))
        #subset.extend(random_inds)
        return subset, self.app_name

#-------------------------------------------#
    def getPop(self):
        '''
        Web method.
        '''
        return self.ga.getPop()


#-------------------------------------------#
    def get_peer_genomes(self):
        subset_size = self.getVar('population')['subset']['size']
        peer_list = self.peer_list
        if peer_list:
            to_draw = []
            must = []

            for peer in peer_list:
                if peer.online():
                    genome_objs = peer.getGenomes()
                    if genome_objs:
                        must.append(genome_objs[0])
                        to_draw.extend(genome_objs[1:])

            if must and to_draw:
                subset = must + rnd.sample(to_draw, subset_size-len(must))
                self.draw_peers({'peer_genomes': subset})
                self.peer_subset = subset
                return self.peer_subset

            else:
                return []

        else:
            return []




#-------------------------------------------#
    #def web_step(self, user_feedback, inject_genomes = None):
    def web_step(self, context = {}):
        '''
        Take the user input and the individuals to inject
        and step n generations.
        Web method.
        '''
        user_feedback = context.get('feedback', [])
        peer_keys = context.get('inject_genomes', [])
        s = self.peer_subset
        inj_genomes = []
        if s: inj_genomes = [s[i] for i in peer_keys]
        inject_genomes = {'genomes': inj_genomes, 'best': None}

        # get from peers

        # end from peers

        print 'user_feedback', user_feedback
        return self.ga.step(user_feedback, inject_genomes, context)

#-------------------------------------------#
    def draw(self, context = {}):
        '''
        Web method.
        '''
        context['user'] = self.params['user']
        return self.ga.igaStep(context)

#-------------------------------------------#
    def get_best(self, context):
        '''
        Web method.
        '''
        return self.ga.get_best(context)

#-------------------------------------------#
    def draw_peers(self, context):
        '''
        Web method.
        '''
        context['user'] = self.params['user']
        #panels = self.ga.draw(parent_panel, genomes)
        return self.ga.draw(context)