Author: varioustoxins Date: Sun Apr 29 23:20:42 2007 New Revision: 3276 URL: http://svn.gna.org/viewcvs/relax?rev=3276&view=rev Log: modifications to make the multi hierachy indepndant of relax; multi can now be used to run other multiprocessor tasks (uni processor and mpi work) Modified: branches/multi_processor/multi/commands.py branches/multi_processor/multi/mpi4py_processor.py branches/multi_processor/multi/processor.py branches/multi_processor/multi/uni_processor.py branches/multi_processor/relax Modified: branches/multi_processor/multi/commands.py URL: http://svn.gna.org/viewcvs/relax/branches/multi_processor/multi/commands.py?rev=3276&r1=3275&r2=3276&view=diff ============================================================================== --- branches/multi_processor/multi/commands.py (original) +++ branches/multi_processor/multi/commands.py Sun Apr 29 23:20:42 2007 @@ -110,7 +110,7 @@ self.hc=hc self.warning=warning - def run(self,relax,processor,memo): + def run(self,processor,memo): m_f=memo.model_free m_f.iter_count = 0 m_f.f_count = 0 @@ -457,7 +457,7 @@ self.hc=hc self.warning=warning - def run(self,relax,processor,memo): + def run(self,processor,memo): # FIXME: Check against full result # FIXME: names not consistent in memo Modified: branches/multi_processor/multi/mpi4py_processor.py URL: http://svn.gna.org/viewcvs/relax/branches/multi_processor/multi/mpi4py_processor.py?rev=3276&r1=3275&r2=3276&view=diff ============================================================================== --- branches/multi_processor/multi/mpi4py_processor.py (original) +++ branches/multi_processor/multi/mpi4py_processor.py Sun Apr 29 23:20:42 2007 @@ -126,7 +126,7 @@ self.result_commands=result_commands - def run(self,relax,processor,batched_memo): + def run(self,processor,batched_memo): processor.assert_on_master() if batched_memo != None: @@ -198,8 +198,8 @@ - def __init__(self,relax_instance, chunkyness=1): - super(Mpi4py_processor,self).__init__(relax_instance = relax_instance, chunkyness=chunkyness) + def __init__(self,callback): + super(Mpi4py_processor,self).__init__(callback=callback) @@ -315,7 +315,7 @@ memo=None if result.memo_id != None: memo=self.memo_map[result.memo_id] - result.run(self.relax_instance,self,memo) + result.run(self,memo) if result.memo_id != None and result.completed: del self.memo_map[result.memo_id] @@ -386,13 +386,12 @@ if self.on_master(): try: self.pre_run() - self.relax_instance.run() + self.callback.init_master(self) self.post_run() except Exception,e: - # check me could be moved outside - #print e - traceback.print_exc(file=sys.stdout) - self.abort() + self.callback.handle_exception(self,e) + + # note this a modified exit that kills all MPI processors sys.exit() Modified: branches/multi_processor/multi/processor.py URL: http://svn.gna.org/viewcvs/relax/branches/multi_processor/multi/processor.py?rev=3276&r1=3275&r2=3276&view=diff ============================================================================== --- branches/multi_processor/multi/processor.py (original) +++ branches/multi_processor/multi/processor.py Sun Apr 29 23:20:42 2007 @@ -44,6 +44,20 @@ print e break +class Application_callback(object): + + def __init__(self,master): + self.master=master + self.init_master = self.default_init_master + self.handle_error= self.default_handle_error + + def default_init_master(self,processor): + self.master.run() + + def default_handle_error(self,processor,exception): + traceback.print_exc(file=sys.stdout) + processor.abort() + def raise_unimplimented(method): raise NotImplementedError("Attempt to invoke unimplemented abstract method %s") % method.__name__ @@ -56,11 +70,11 @@ class Processor(object): #FIXME: remname chunk* grain* - def __init__(self,relax_instance,chunkyness=1): + def __init__(self,callback): + self.callback=callback + self.chunkyness=1 self.pre_queue_command=None self.post_queue_command=None - self.chunkyness = chunkyness - self.relax_instance = relax_instance self.NULL_RESULT=Null_result_command(processor=self) def add_to_queue(self,command,memo=None): @@ -169,7 +183,7 @@ self.memo_id=memo_id - def run(self,relax,processor,memo): + def run(self,processor,memo): pass class Null_result_command(Result_command): @@ -183,7 +197,7 @@ super(Result_exception,self).__init__(processor=processor,completed=completed) self.exception=exception - def run(self,relax,processor,memos): + def run(self,processor,memos): raise self.exception Modified: branches/multi_processor/multi/uni_processor.py URL: http://svn.gna.org/viewcvs/relax/branches/multi_processor/multi/uni_processor.py?rev=3276&r1=3275&r2=3276&view=diff ============================================================================== --- branches/multi_processor/multi/uni_processor.py (original) +++ branches/multi_processor/multi/uni_processor.py Sun Apr 29 23:20:42 2007 @@ -71,8 +71,9 @@ class Uni_processor(Processor): - def __init__(self,relax_instance): - self.relax_instance= relax_instance + def __init__(self,callback): + super(Uni_processor,self).__init__(callback=callback) + self.command_queue=[] self.memo_map={} @@ -103,9 +104,11 @@ # start_time = time.clock() try: self.pre_run() - self.relax_instance.run() - finally: + self.callback.init_master(self) self.post_run() + except Exception,e: + self.callback.handle_exception(self,e) + # end_time = time.clock() # time_diff= end_time - start_time # time_delta = datetime.timedelta(seconds=time_diff) @@ -148,7 +151,7 @@ memo=None if result.memo_id != None: memo=self.memo_map[result.memo_id] - result.run(self.relax_instance,self,memo) + result.run(self,memo) if result.memo_id != None and result.completed: del self.memo_map[result.memo_id] Modified: branches/multi_processor/relax URL: http://svn.gna.org/viewcvs/relax/branches/multi_processor/relax?rev=3276&r1=3275&r2=3276&view=diff ============================================================================== --- branches/multi_processor/relax (original) +++ branches/multi_processor/relax Sun Apr 29 23:20:42 2007 @@ -1,4 +1,5 @@ #! /usr/bin/env python +from numpy.f2py.cfuncs import callbacks ############################################################################### # # @@ -43,6 +44,7 @@ from string import split, strip import sys from warnings import warn +from multi.processor import Application_callback # Numeric. try: @@ -560,7 +562,7 @@ #FIXME error checking for if module require not found #FIXME move module loading to processor #FIXME module loading code needs to be in a util module -def load_multiprocessor(relax_instance): +def load_multiprocessor(callback): processor_name = relax_instance.multiprocessor_type + '_processor' class_name= processor_name[0].upper() + processor_name[1:] @@ -575,7 +577,7 @@ else: raise RelaxError("can't load class %s from module %s" % (class_name,module_path)) - object = clazz(relax_instance) + object = clazz(callback) relax_instance.processor = object return object @@ -590,7 +592,8 @@ if not profile_flag: relax_instance = Relax() mode=relax_instance.arguments(sys.argv[1:]) - multi_processor = load_multiprocessor(relax_instance) + callbacks = Application_callback(master=relax_instance) + multi_processor = load_multiprocessor(callbacks) multi_processor.run() else: