Пример #1
0
    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)
Пример #2
0
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
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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[:]