def __init__(self, f, argv, kwargs, required=None): self._function_call = (f, argv, kwargs) if required is False: # This call finishes never required = None elif required is None: # Extract requirements automatically required = (argv, kwargs) else: # Use given requirements required = required name = 'callback_%s_%i_%s_%s' % (f.__name__, id(f), gs.SIS_HASH(argv), gs.SIS_HASH(kwargs)) super().__init__(name, required)
def _replace_graph_objects_helper(current, replace_function=None, visited=None): visited = {} if visited is None else visited sis_hash = gs.SIS_HASH(current) try: return visited[sis_hash] except KeyError: pass replace = replace_function(current) if replace != current: visited[sis_hash] = replace return replace if isinstance(current, Job): kwargs = _replace_graph_objects_helper(current._sis_kwargs, replace_function, visited) next = type(current)(**kwargs) elif isinstance(current, Path): creator = _replace_graph_objects_helper(current.creator, replace_function, visited) # TODO tage care of other attributes next = type(current)(current.path, creator) elif isinstance(current, (list, tuple, set)): next = type(current)( _replace_graph_objects_helper(i, replace_function, visited) for i in current) elif isinstance(current, dict): next = type(current)( (k, _replace_graph_objects_helper(v, replace_function, visited)) for k, v in current.items()) elif hasattr(current, '__dict__'): # TODO may add usage of get an set state dict_ = _replace_graph_objects_helper(current.__dict__, replace_function, visited) if dict_ == current.__dict__: next = current else: next = type(current).__new__(type(current)) next.__dict__ = dict_ elif hasattr(current, '__slots__'): diff = False dict_ = {} for k in current.__slots__: if hasattr(current, k): v = getattr(current, k) new = _replace_graph_objects_helper(v, replace_function, visited) diff = diff or v != new if diff: next = current else: next = type(current).__new__(type(current)) for k, v in dict_: setattr(next, k, v) else: next = current visited[sis_hash] = next return next
def sis_hash(obj): """ Takes most object and tries to convert the current state into a hash. :param object obj: :rtype: str """ return gs.SIS_HASH(obj)
def notebook(args): """ Starts interactive notebook session """ notebook_file = args.filename import IPython from IPython.lib import passwd from socket import gethostname if not notebook_file.endswith('.ipynb'): notebook_file += '.ipynb' if not os.path.isfile(notebook_file): with open(notebook_file, 'w') as f: f.write("""{ "metadata": { "name": "", "signature": "sha256:0f5ff51613f8ce0a6edf3b69cfa09d0dbecf33f4c03078419f58189b6059a373" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "from sisyphus.notebook import *\\n", "tk.gs.SIS_COMMAND = ['../sis']" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "manager.load_file('config.py')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "manager.start()" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }""") password = gs.SIS_HASH(random.random()) argv = [] argv.append("notebook") argv.append(notebook_file) argv.append("--IPKernelApp.pylab='inline'") argv.append("--NotebookApp.ip=" + gethostname()) argv.append("--NotebookApp.open_browser=False") argv.append("--NotebookApp.password="******"Notebook password: %s" % password) IPython.start_ipython(argv=argv)
def compare_graph(obj1, obj2, traceback=None, visited=None): """ Compares two objects and shows traceback to first found difference :param obj1 (Job/Path): Object1 to compare :param obj2 (Job/Path): Object2 which is compared to Object1 :param traceback: Used for recursion, leave blank :param visited: Used for recursion, leave blank :return: traceback """ visited = set() if visited is None else visited traceback = [] if traceback is None else traceback traceback.append((obj1, obj2)) sis_hash = gs.SIS_HASH(obj1) skip = sis_hash in visited if not skip: visited.add(gs.SIS_HASH(obj1)) if skip: pass elif type(obj1) != type(obj2): yield traceback + [(type(obj1), type(obj2))] elif isinstance(obj1, Job): if obj1._sis_id() != obj2._sis_id(): yield from compare_graph(obj1._sis_kwargs, obj2._sis_kwargs, traceback[:], visited) elif isinstance(obj1, Path): if obj1.path != obj2.path: yield traceback + [(obj1.path, obj2.path)] else: yield from compare_graph(obj1.creator, obj2.creator, traceback[:], visited) elif isinstance(obj1, (list, tuple, set)): if len(obj1) != len(obj2): yield traceback + [len(obj1), len(obj2)] else: if isinstance(obj1, set): obj1 = sorted(list(obj1)) obj2 = sorted(list(obj2)) for a, b in zip(obj1, obj2): yield from compare_graph(a, b, traceback[:], visited) elif isinstance(obj1, dict): for k, v1 in obj1.items(): try: v2 = obj2[k] except KeyError: yield traceback + [(k, None)] else: yield from compare_graph(v1, v2, traceback[:], visited) for k, v2 in obj2.items(): if k not in obj1: yield traceback + [(None, k)] elif hasattr(obj1, '__dict__'): yield from compare_graph(obj1.__dict__, obj2.__dict__, traceback[:], visited) elif hasattr(obj1, '__slots__'): for k in obj1.__slots__: if hasattr(obj1, k): if hasattr(obj2, k): v1 = getattr(obj1, k) v2 = getattr(obj2, k) yield from compare_graph(v1, v2, traceback[:], visited) else: yield traceback + [(k, None)] else: if hasattr(obj2, k): yield traceback + [(None, k)] else: if obj1 != obj2: yield traceback[:]