Example #1
0
 def make(self, src_templ, evaldict=None, addsource=False, **attrs):
     "Make a new function from a given template and update the signature"
     src = src_templ % vars(self)  # expand name and signature
     evaldict = evaldict or {}
     mo = DEF.match(src)
     if mo is None:
         raise SyntaxError("not a valid function template\n%s" % src)
     name = mo.group(1)  # extract the function name
     names = set([name] + [arg.strip(" *") for arg in self.shortsignature.split(",")])
     for n in names:
         if n in ("_func_", "_call_"):
             raise NameError("%s is overridden in\n%s" % (n, src))
     if not src.endswith("\n"):  # add a newline just for safety
         src += "\n"  # this is needed in old versions of Python
     try:
         code = compile(src, "<string>", "single")
         # print >> sys.stderr, 'Compiling %s' % src
         exec_(code, evaldict)
     except:
         print("Error in generated code:", file=sys.stderr)
         print(src, file=sys.stderr)
         raise
     func = evaldict[name]
     if addsource:
         attrs["__source__"] = src
     self.update(func, **attrs)
     return func
Example #2
0
 def make(self, src_templ, evaldict=None, addsource=False, **attrs):
     "Make a new function from a given template and update the signature"
     src = src_templ % vars(self)  # expand name and signature
     evaldict = evaldict or {}
     mo = DEF.match(src)
     if mo is None:
         raise SyntaxError('not a valid function template\n%s' % src)
     name = mo.group(1)  # extract the function name
     names = set([name] + [arg.strip(' *') for arg in
                          self.shortsignature.split(',')])
     for n in names:
         if n in ('_func_', '_call_'):
             raise NameError('%s is overridden in\n%s' % (n, src))
     if not src.endswith('\n'):  # add a newline just for safety
         src += '\n'  # this is needed in old versions of Python
     try:
         code = compile(src, '<string>', 'single')
         # print >> sys.stderr, 'Compiling %s' % src
         exec_(code, evaldict)
     except:
         print('Error in generated code:', file=sys.stderr)
         print(src, file=sys.stderr)
         raise
     func = evaldict[name]
     if addsource:
         attrs['__source__'] = src
     self.update(func, **attrs)
     return func
Example #3
0
def _nonlin_wrapper(name, jac):
    """
    Construct a solver wrapper with given name and jacobian approx.

    It inspects the keyword arguments of ``jac.__init__``, and allows to
    use the same arguments in the wrapper function, in addition to the
    keyword arguments of `nonlin_solve`

    """
    import inspect
    args, varargs, varkw, defaults = inspect.getargspec(jac.__init__)
    kwargs = list(zip(args[-len(defaults):], defaults))
    kw_str = ", ".join(["%s=%r" % (k, v) for k, v in kwargs])
    if kw_str:
        kw_str = ", " + kw_str
    kwkw_str = ", ".join(["%s=%s" % (k, k) for k, v in kwargs])
    if kwkw_str:
        kwkw_str = kwkw_str + ", "

    # Construct the wrapper function so that its keyword arguments
    # are visible in pydoc.help etc.
    wrapper = """
def %(name)s(F, xin, iter=None %(kw)s, verbose=False, maxiter=None,
             f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
             tol_norm=None, line_search='armijo', callback=None, **kw):
    jac = %(jac)s(%(kwkw)s **kw)
    return nonlin_solve(F, xin, jac, iter, verbose, maxiter,
                        f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search,
                        callback)
"""

    wrapper = wrapper % dict(name=name, kw=kw_str, jac=jac.__name__,
                             kwkw=kwkw_str)
    ns = {}
    ns.update(globals())
    exec_(wrapper, ns)
    func = ns[name]
    func.__doc__ = jac.__doc__
    _set_doc(func)
    return func
Example #4
0
def _nonlin_wrapper(name, jac):
    """
    Construct a solver wrapper with given name and jacobian approx.

    It inspects the keyword arguments of ``jac.__init__``, and allows to
    use the same arguments in the wrapper function, in addition to the
    keyword arguments of `nonlin_solve`

    """
    import inspect
    args, varargs, varkw, defaults = inspect.getargspec(jac.__init__)
    kwargs = list(zip(args[-len(defaults):], defaults))
    kw_str = ", ".join(["%s=%r" % (k, v) for k, v in kwargs])
    if kw_str:
        kw_str = ", " + kw_str
    kwkw_str = ", ".join(["%s=%s" % (k, k) for k, v in kwargs])
    if kwkw_str:
        kwkw_str = kwkw_str + ", "

    # Construct the wrapper function so that its keyword arguments
    # are visible in pydoc.help etc.
    wrapper = """
def %(name)s(F, xin, iter=None %(kw)s, verbose=False, maxiter=None,
             f_tol=None, f_rtol=None, x_tol=None, x_rtol=None,
             tol_norm=None, line_search='armijo', callback=None, **kw):
    jac = %(jac)s(%(kwkw)s **kw)
    return nonlin_solve(F, xin, jac, iter, verbose, maxiter,
                        f_tol, f_rtol, x_tol, x_rtol, tol_norm, line_search,
                        callback)
"""

    wrapper = wrapper % dict(
        name=name, kw=kw_str, jac=jac.__name__, kwkw=kwkw_str)
    ns = {}
    ns.update(globals())
    exec_(wrapper, ns)
    func = ns[name]
    func.__doc__ = jac.__doc__
    _set_doc(func)
    return func