class ConnectServer(object): ''' Server which receives requests from, and passes connect jobs to the workers The server also receives minima and transition states from the workers and adds them to the database. Parameters ---------- system : pygmin.system.BaseSystem system class to process database : pygmin.storage.Database working database server_name : string, optional Unique name for clients to connect to this server on current host (objid for pyros). None for random host : string, optional host to setup server. default is localhost which does not allow connections from remote machines port : integer, optional port to listen for connections See Also -------- ConnectWorker pygmin.landscape.ConnectManager ''' def __init__(self, system, database, server_name=None, host=None, port=0): self.system = system self.db = database self.server_name = server_name self.host=host self.port=port self.connect_manager = ConnectManager(self.db) def set_connect_manager(self, connect_manager): """add a custom connect manager the connect manager decides which connect jobs should be performed """ self.connect_manager = connect_manager # def set_emax(self, Emax): # raise Exception("set_emax is not implemented yet in the new ConnectManager scheme") # self.Emax = None def get_connect_job(self, strategy="random"): ''' get a new connect job ''' min1, min2 = self.connect_manager.get_connect_job(strategy) return min1._id, min1.coords, min2._id, min2.coords def get_system(self): ''' provide system class to worker ''' return self.system def add_minimum(self, E, coords): ''' called by worker if a new minimum is found Returns ------- ID : global id of minimum added. ''' print "a client found a minimum", E m = self.db.addMinimum(E, coords) return m._id def add_ts(self, id1, id2, E, coords, eigenval=None, eigenvec=None): '''called by worker if a new transition state is found Parameters ---------- id1, id2 : int The server-side (global) ID's of the minima on either side of the transition state. The worker is responsible for knowing the global id of the minima. This ID is returned to the worker when a minimum is added E : float energy of transition state coords : array coordinates of transition state Returns ------- ID : global id of transition state added ''' print "a client found a transition state", E # min1 = self.db.session.query(Minimum).filter(Minimum._id == id1).one() # min2 = self.db.session.query(Minimum).filter(Minimum._id == id2).one() min1 = self.db.getMinimum(id1) min2 = self.db.getMinimum(id2) ts = self.db.addTransitionState(E, coords, min1, min2, eigenval=eigenval, eigenvec=eigenvec) return ts._id def run(self): ''' start the server and listen for incoming connections ''' print "Starting Pyros daemon" daemon=Pyro4.Daemon(host=self.host, port=self.port) # make the connect_server available to Pyros childs uri=daemon.register(self, objectId=self.server_name) print "The connect server can be accessed by the following uri: ", uri print "Ready to accept connections" daemon.requestLoop()
class ConnectServer(object): ''' Server which receives requests from, and passes connect jobs to the workers The server also receives minima and transition states from the workers and adds them to the database. Parameters ---------- system : pygmin.system.BaseSystem system class to process database : pygmin.storage.Database working database server_name : string, optional Unique name for clients to connect to this server on current host (objid for pyros). None for random host : string, optional host to setup server. default is localhost which does not allow connections from remote machines port : integer, optional port to listen for connections See Also -------- ConnectWorker pygmin.landscape.ConnectManager ''' def __init__(self, system, database, server_name=None, host=None, port=0): self.system = system self.db = database self.server_name = server_name self.host = host self.port = port self.connect_manager = ConnectManager(self.db) def set_connect_manager(self, connect_manager): """add a custom connect manager the connect manager decides which connect jobs should be performed """ self.connect_manager = connect_manager # def set_emax(self, Emax): # raise Exception("set_emax is not implemented yet in the new ConnectManager scheme") # self.Emax = None def get_connect_job(self, strategy="random"): ''' get a new connect job ''' min1, min2 = self.connect_manager.get_connect_job(strategy) return min1._id, min1.coords, min2._id, min2.coords def get_system(self): ''' provide system class to worker ''' return self.system def add_minimum(self, E, coords): ''' called by worker if a new minimum is found Returns ------- ID : global id of minimum added. ''' print "a client found a minimum", E m = self.db.addMinimum(E, coords) return m._id def add_ts(self, id1, id2, E, coords, eigenval=None, eigenvec=None): '''called by worker if a new transition state is found Parameters ---------- id1, id2 : int The server-side (global) ID's of the minima on either side of the transition state. The worker is responsible for knowing the global id of the minima. This ID is returned to the worker when a minimum is added E : float energy of transition state coords : array coordinates of transition state Returns ------- ID : global id of transition state added ''' print "a client found a transition state", E # min1 = self.db.session.query(Minimum).filter(Minimum._id == id1).one() # min2 = self.db.session.query(Minimum).filter(Minimum._id == id2).one() min1 = self.db.getMinimum(id1) min2 = self.db.getMinimum(id2) ts = self.db.addTransitionState(E, coords, min1, min2, eigenval=eigenval, eigenvec=eigenvec) return ts._id def run(self): ''' start the server and listen for incoming connections ''' print "Starting Pyros daemon" daemon = Pyro4.Daemon(host=self.host, port=self.port) # make the connect_server available to Pyros childs uri = daemon.register(self, objectId=self.server_name) print "The connect server can be accessed by the following uri: ", uri print "Ready to accept connections" daemon.requestLoop()