diff --git a/src/sage/ext/fast_callable.pyx b/src/sage/ext/fast_callable.pyx index d21bddd5deb..8719f0bdeb9 100644 --- a/src/sage/ext/fast_callable.pyx +++ b/src/sage/ext/fast_callable.pyx @@ -465,41 +465,89 @@ def fast_callable(x, domain=None, vars=None, etb = ExpressionTreeBuilder(vars=vars, domain=domain) et = x._fast_callable_(etb) - if isinstance(domain, sage.rings.abc.RealField): - from sage.ext.interpreters.wrapper_rr import Wrapper_rr as builder - str = InstructionStream(sage.ext.interpreters.wrapper_rr.metadata, - len(vars), - domain) - - elif isinstance(domain, sage.rings.abc.ComplexField): - from sage.ext.interpreters.wrapper_cc import Wrapper_cc as builder - str = InstructionStream(sage.ext.interpreters.wrapper_cc.metadata, - len(vars), - domain) - - elif isinstance(domain, sage.rings.abc.RealDoubleField) or domain is float: - from sage.ext.interpreters.wrapper_rdf import Wrapper_rdf as builder - str = InstructionStream(sage.ext.interpreters.wrapper_rdf.metadata, - len(vars), - domain) - elif isinstance(domain, sage.rings.abc.ComplexDoubleField): - from sage.ext.interpreters.wrapper_cdf import Wrapper_cdf as builder - str = InstructionStream(sage.ext.interpreters.wrapper_cdf.metadata, - len(vars), - domain) - elif domain is None: - from sage.ext.interpreters.wrapper_py import Wrapper_py as builder - str = InstructionStream(sage.ext.interpreters.wrapper_py.metadata, - len(vars)) - else: - from sage.ext.interpreters.wrapper_el import Wrapper_el as builder - str = InstructionStream(sage.ext.interpreters.wrapper_el.metadata, - len(vars), - domain) + builder, str = _builder_and_stream(vars=vars, domain=domain) + generate_code(et, str) str.instr('return') return builder(str.get_current()) + +def _builder_and_stream(vars, domain): + r""" + Return a builder and a stream. + + This is an internal function used only once, by :func:`fast_callable`. + + INPUT: + + - ``vars`` -- a sequence of variable names + + - ``domain`` -- a Sage parent or Python type or ``None``; if non-``None``, + all arithmetic is done in that domain + + OUTPUT: A :class:`Wrapper`, an class:`InstructionStream` + + EXAMPLES:: + + sage: from sage.ext.fast_callable import _builder_and_stream + sage: _builder_and_stream(["x", "y"], ZZ) + (, + ) + sage: _builder_and_stream(["x", "y"], RR) # optional - sage.rings.real_mpfr + (, + ) + + Modularized test with sagemath-categories after :issue:`35095`, which has + (a basic version of) ``RDF`` but not the specialized interpreter for it. + In this case, the function falls back to using the :class:`Element` + interpreter:: + + sage: domain = RDF + sage: from sage.structure.element import Element as domain # optional - sage.modules + sage: _builder_and_stream(["x", "y"], domain) + (, + ) + """ + if isinstance(domain, sage.rings.abc.RealField): + try: + from sage.ext.interpreters.wrapper_rr import metadata, Wrapper_rr as builder + except ImportError: + pass + else: + return builder, InstructionStream(metadata, len(vars), domain) + + if isinstance(domain, sage.rings.abc.ComplexField): + try: + from sage.ext.interpreters.wrapper_cc import metadata, Wrapper_cc as builder + except ImportError: + pass + else: + return builder, InstructionStream(metadata, len(vars), domain) + + if isinstance(domain, sage.rings.abc.RealDoubleField) or domain is float: + try: + from sage.ext.interpreters.wrapper_rdf import metadata, Wrapper_rdf as builder + except ImportError: + pass + else: + return builder, InstructionStream(metadata, len(vars), domain) + + if isinstance(domain, sage.rings.abc.ComplexDoubleField): + try: + from sage.ext.interpreters.wrapper_cdf import metadata, Wrapper_cdf as builder + except ImportError: + pass + else: + return builder, InstructionStream(metadata, len(vars), domain) + + if domain is None: + from sage.ext.interpreters.wrapper_py import metadata, Wrapper_py as builder + return builder, InstructionStream(metadata, len(vars)) + + from sage.ext.interpreters.wrapper_el import metadata, Wrapper_el as builder + return builder, InstructionStream(metadata, len(vars), domain) + + def function_name(fn): r""" Given a function, return a string giving a name for the function. diff --git a/src/sage_setup/autogen/interpreters/__init__.py b/src/sage_setup/autogen/interpreters/__init__.py index c3534aeccf9..75096d06b80 100644 --- a/src/sage_setup/autogen/interpreters/__init__.py +++ b/src/sage_setup/autogen/interpreters/__init__.py @@ -119,25 +119,10 @@ from .instructions import * from .memory import * from .specs.base import * -from .specs.cdf import * -from .specs.element import * -from .specs.python import * -from .specs.rdf import * -from .specs.rr import * -from .specs.cc import * from .storage import * from .utils import * -# Gather up a list of all interpreter classes imported into this module -# A better way might be to recursively iterate InterpreterSpec.__subclasses__ -# or to use a registry, but this is fine for now. -_INTERPRETERS = sorted(filter(lambda c: (isinstance(c, type) and - issubclass(c, InterpreterSpec) and - c.name), - globals().values()), - key=lambda c: c.name) - # Tuple of (filename_root, extension, method) where filename_root is the # root of the filename to be joined with "_".ext and # method is the name of a get_ method on InterpreterGenerator that returns @@ -157,6 +142,7 @@ def build_interp(interp_spec, dir): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: testdir = tmp_dir() sage: rdf_interp = RDFInterpreter() sage: build_interp(rdf_interp, testdir) @@ -174,12 +160,28 @@ def build_interp(interp_spec, dir): write_if_changed(path, method()) -def rebuild(dirname, force=False): +def rebuild(dirname, force=False, interpreters=None, distribution=None): r""" Check whether the interpreter and wrapper sources have been written since the last time this module was changed. If not, write them. - EXAMPLES:: + INPUT: + + - ``dirname`` -- name of the target directory for the generated sources + + - ``force`` -- boolean (default ``False``); if ``True``, ignore timestamps + and regenerate the sources unconditionally + + - ``interpreters`` -- an iterable of strings, or ``None`` (the default, + which means all interpreters); which interpreters to generate + + - ``distribution`` -- a string (the distribution name such as + ``"sagemath-categories"``) or ``None`` (the default, which means + the monolithic Sage library) + + EXAMPLES: + + Monolithic build:: sage: from sage_setup.autogen.interpreters import * sage: testdir = tmp_dir() @@ -189,11 +191,36 @@ def rebuild(dirname, force=False): sage: with open(testdir + '/wrapper_el.pyx') as f: ....: f.readline() '# Automatically generated by ...\n' + + Modularized build:: + + sage: testdir = tmp_dir() + sage: rebuild(testdir, interpreters=['Element', 'Python'], + ....: distribution='sagemath-categories') + Building interpreters for fast_callable + -> First build of interpreters + sage: with open(testdir + '/all__sagemath_categories.py') as f: + ....: f.readline() + '# Automatically generated by ...' """ # This line will show up in "sage -b" (once per upgrade, not every time # you run it). print("Building interpreters for fast_callable") + if interpreters is None: + interpreters = ['CDF', 'Element', 'Python', 'RDF', 'RR', 'CC'] + + from importlib import import_module + + _INTERPRETERS = [getattr(import_module('sage_setup.autogen.interpreters.specs.' + interpreter.lower()), + interpreter + 'Interpreter') + for interpreter in interpreters] + + if distribution is None: + all_py = 'all.py' + else: + all_py = f'all__{distribution.replace("-", "_")}.py' + try: os.makedirs(dirname) except OSError: @@ -213,7 +240,7 @@ class NeedToRebuild(Exception): try: if force: raise NeedToRebuild("-> Force rebuilding interpreters") - gen_file = os.path.join(dirname, 'all.py') + gen_file = os.path.join(dirname, all_py) if not os.path.isfile(gen_file): raise NeedToRebuild("-> First build of interpreters") @@ -235,5 +262,5 @@ class NeedToRebuild(Exception): for interp in _INTERPRETERS: build_interp(interp(), dirname) - with open(os.path.join(dirname, 'all.py'), 'w') as f: + with open(os.path.join(dirname, all_py), 'w') as f: f.write("# " + AUTOGEN_WARN) diff --git a/src/sage_setup/autogen/interpreters/generator.py b/src/sage_setup/autogen/interpreters/generator.py index f090f201afd..bec7cae2b47 100644 --- a/src/sage_setup/autogen/interpreters/generator.py +++ b/src/sage_setup/autogen/interpreters/generator.py @@ -43,6 +43,7 @@ def __init__(self, spec): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: gen = InterpreterGenerator(interp) sage: gen._spec is interp @@ -72,6 +73,7 @@ def gen_code(self, instr_desc, write): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: gen = InterpreterGenerator(interp) sage: from io import StringIO @@ -218,6 +220,7 @@ def func_header(self, cython=False): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.element import ElementInterpreter sage: interp = ElementInterpreter() sage: gen = InterpreterGenerator(interp) sage: print(gen.func_header()) @@ -260,6 +263,7 @@ def write_interpreter(self, write): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: gen = InterpreterGenerator(interp) sage: from io import StringIO @@ -307,6 +311,7 @@ def write_wrapper(self, write): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: gen = InterpreterGenerator(interp) sage: from io import StringIO @@ -476,6 +481,7 @@ def write_pxd(self, write): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: gen = InterpreterGenerator(interp) sage: from io import StringIO @@ -527,6 +533,9 @@ def get_interpreter(self): First we get the InterpreterSpec for several interpreters:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter + sage: from sage_setup.autogen.interpreters.specs.element import ElementInterpreter sage: rdf_spec = RDFInterpreter() sage: rr_spec = RRInterpreter() sage: el_spec = ElementInterpreter() @@ -649,6 +658,9 @@ def get_wrapper(self): First we get the InterpreterSpec for several interpreters:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter + sage: from sage_setup.autogen.interpreters.specs.element import ElementInterpreter sage: rdf_spec = RDFInterpreter() sage: rr_spec = RRInterpreter() sage: el_spec = ElementInterpreter() @@ -972,6 +984,9 @@ def get_pxd(self): First we get the InterpreterSpec for several interpreters:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter + sage: from sage_setup.autogen.interpreters.specs.element import ElementInterpreter sage: rdf_spec = RDFInterpreter() sage: rr_spec = RRInterpreter() sage: el_spec = ElementInterpreter() diff --git a/src/sage_setup/autogen/interpreters/instructions.py b/src/sage_setup/autogen/interpreters/instructions.py index d45a34e629a..116f598197c 100644 --- a/src/sage_setup/autogen/interpreters/instructions.py +++ b/src/sage_setup/autogen/interpreters/instructions.py @@ -187,6 +187,7 @@ class InstrSpec(object): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: InstrSpec('add', pg('SS','S'), code='o0 = i0+i1;') add: SS->S = 'o0 = i0+i1;' @@ -213,7 +214,7 @@ def __init__(self, name, io, code=None, uses_error_handler=False, EXAMPLES:: sage: from sage_setup.autogen.interpreters import * - + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: InstrSpec('add', pg('SS','S'), code='o0 = i0+i1;') add: SS->S = 'o0 = i0+i1;' @@ -288,6 +289,7 @@ def __repr__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: InstrSpec('add', pg('SS','S'), code='o0 = i0+i1;') add: SS->S = 'o0 = i0+i1;' @@ -310,6 +312,7 @@ def instr_infix(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: instr_infix('mul', pg('SS', 'S'), '*') mul: SS->S = 'o0 = i0 * i1;' @@ -325,6 +328,7 @@ def instr_funcall_2args(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: instr_funcall_2args('atan2', pg('SS', 'S'), 'atan2') atan2: SS->S = 'o0 = atan2(i0, i1);' @@ -340,6 +344,7 @@ def instr_unary(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: pg = RDFInterpreter().pg sage: instr_unary('sin', pg('S','S'), 'sin(i0)') sin: S->S = 'o0 = sin(i0);' @@ -357,6 +362,7 @@ def instr_funcall_2args_mpfr(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter sage: pg = RRInterpreter().pg sage: instr_funcall_2args_mpfr('add', pg('SS','S'), 'mpfr_add') add: SS->S = 'mpfr_add(o0, i0, i1, MPFR_RNDN);' @@ -372,6 +378,7 @@ def instr_funcall_1arg_mpfr(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter sage: pg = RRInterpreter().pg sage: instr_funcall_1arg_mpfr('exp', pg('S','S'), 'mpfr_exp') exp: S->S = 'mpfr_exp(o0, i0, MPFR_RNDN);' @@ -386,6 +393,7 @@ def instr_funcall_2args_mpc(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import CCInterpreter sage: pg = CCInterpreter().pg sage: instr_funcall_2args_mpc('add', pg('SS','S'), 'mpc_add') add: SS->S = 'mpc_add(o0, i0, i1, MPC_RNDNN);' @@ -400,6 +408,7 @@ def instr_funcall_1arg_mpc(name, io, op): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import CCInterpreter sage: pg = CCInterpreter().pg sage: instr_funcall_1arg_mpc('exp', pg('S','S'), 'mpc_exp') exp: S->S = 'mpc_exp(o0, i0, MPC_RNDNN);' diff --git a/src/sage_setup/autogen/interpreters/memory.py b/src/sage_setup/autogen/interpreters/memory.py index be6ec531722..e719f47d77a 100644 --- a/src/sage_setup/autogen/interpreters/memory.py +++ b/src/sage_setup/autogen/interpreters/memory.py @@ -172,6 +172,7 @@ class using this memory chunk, to allocate local variables. EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.declare_call_locals() ' cdef RealNumber retval = (self.domain)()\n' diff --git a/src/sage_setup/autogen/interpreters/specs/base.py b/src/sage_setup/autogen/interpreters/specs/base.py index 67d75b9bf45..c020c37cdb3 100644 --- a/src/sage_setup/autogen/interpreters/specs/base.py +++ b/src/sage_setup/autogen/interpreters/specs/base.py @@ -49,6 +49,8 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter sage: interp = RDFInterpreter() sage: interp.c_header '#include ' @@ -84,6 +86,7 @@ def _set_opcodes(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter sage: interp = RDFInterpreter() sage: interp.instr_descs[5].opcode 5 @@ -128,6 +131,9 @@ def __init__(self, type, mc_retval=None): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import RDFInterpreter + sage: from sage_setup.autogen.interpreters.specs.rr import RRInterpreter + sage: from sage_setup.autogen.interpreters.specs.element import ElementInterpreter sage: rdf = RDFInterpreter() sage: rr = RRInterpreter() sage: el = ElementInterpreter() diff --git a/src/sage_setup/autogen/interpreters/specs/cc.py b/src/sage_setup/autogen/interpreters/specs/cc.py index aa0db45bad1..ea5e8708647 100644 --- a/src/sage_setup/autogen/interpreters/specs/cc.py +++ b/src/sage_setup/autogen/interpreters/specs/cc.py @@ -31,6 +31,7 @@ def declare_class_members(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: mc = MemoryChunkCCRetval('retval', ty_mpc) sage: mc.declare_class_members() '' @@ -45,6 +46,7 @@ class using this memory chunk, to allocate local variables. EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: mc = MemoryChunkCCRetval('retval', ty_mpc) sage: mc.declare_call_locals() ' cdef ComplexNumber retval = (self.domain_element._new())\n' @@ -62,6 +64,7 @@ def declare_parameter(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: mc = MemoryChunkCCRetval('retval', ty_mpc) sage: mc.declare_parameter() 'mpc_t retval' @@ -76,6 +79,7 @@ def pass_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: mc = MemoryChunkCCRetval('retval', ty_mpc) sage: mc.pass_argument() '((retval.__re))' @@ -90,6 +94,7 @@ def pass_call_c_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: mc = MemoryChunkCCRetval('retval', ty_mpc) sage: mc.pass_call_c_argument() 'result' @@ -111,6 +116,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cc import * sage: interp = CCInterpreter() sage: interp.name 'cc' diff --git a/src/sage_setup/autogen/interpreters/specs/cdf.py b/src/sage_setup/autogen/interpreters/specs/cdf.py index 7f09c3b6a5c..137487e1de2 100644 --- a/src/sage_setup/autogen/interpreters/specs/cdf.py +++ b/src/sage_setup/autogen/interpreters/specs/cdf.py @@ -34,6 +34,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.cdf import * sage: interp = CDFInterpreter() sage: interp.name 'cdf' diff --git a/src/sage_setup/autogen/interpreters/specs/element.py b/src/sage_setup/autogen/interpreters/specs/element.py index 3e4e4eca04f..bbb9c21ae57 100644 --- a/src/sage_setup/autogen/interpreters/specs/element.py +++ b/src/sage_setup/autogen/interpreters/specs/element.py @@ -38,6 +38,7 @@ def setup_args(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.element import * sage: mc = MemoryChunkElementArguments('args', ty_python) sage: mc.setup_args() 'mapped_args = [self._domain(a) for a in args]\n' @@ -51,6 +52,7 @@ def pass_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.element import * sage: mc = MemoryChunkElementArguments('args', ty_python) sage: mc.pass_argument() '(mapped_args).ob_item' @@ -80,6 +82,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.element import * sage: interp = ElementInterpreter() sage: interp.name 'el' diff --git a/src/sage_setup/autogen/interpreters/specs/python.py b/src/sage_setup/autogen/interpreters/specs/python.py index eb4eee56b68..86d0d95f827 100644 --- a/src/sage_setup/autogen/interpreters/specs/python.py +++ b/src/sage_setup/autogen/interpreters/specs/python.py @@ -32,6 +32,7 @@ def declare_class_members(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPythonArguments('args', ty_python) """ return " cdef int _n_%s\n" % self.name @@ -45,6 +46,7 @@ class members. EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPythonArguments('args', ty_python) sage: mc.init_class_members() " count = args['args']\n self._n_args = count\n" @@ -62,6 +64,7 @@ def setup_args(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPythonArguments('args', ty_python) sage: mc.setup_args() '' @@ -75,6 +78,7 @@ def pass_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPythonArguments('args', ty_python) sage: mc.pass_argument() '(args).ob_item' @@ -97,6 +101,7 @@ def __init__(self, name): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPyConstant('domain') sage: mc.name 'domain' @@ -113,6 +118,7 @@ def declare_class_members(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPyConstant('domain') sage: mc.declare_class_members() ' cdef object _domain\n' @@ -131,6 +137,7 @@ class members. EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPyConstant('domain') sage: mc.init_class_members() " self._domain = args['domain']\n" @@ -148,6 +155,7 @@ def declare_parameter(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPyConstant('domain') sage: mc.declare_parameter() 'PyObject* domain' @@ -162,6 +170,7 @@ def pass_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: mc = MemoryChunkPyConstant('domain') sage: mc.pass_argument() 'self._domain' @@ -204,6 +213,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.python import * sage: interp = PythonInterpreter() sage: interp.name 'py' diff --git a/src/sage_setup/autogen/interpreters/specs/rdf.py b/src/sage_setup/autogen/interpreters/specs/rdf.py index 6f576844d13..95894f8d6d2 100644 --- a/src/sage_setup/autogen/interpreters/specs/rdf.py +++ b/src/sage_setup/autogen/interpreters/specs/rdf.py @@ -37,6 +37,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rdf import * sage: interp = RDFInterpreter() sage: interp.name 'rdf' @@ -60,9 +61,11 @@ def __init__(self): Make sure that pow behaves reasonably:: - sage: var('x,y') - (x, y) - sage: ff = fast_callable(x^y, vars=[x,y], domain=RDF) + sage: from sage.ext.fast_callable import ExpressionTreeBuilder + sage: etb = ExpressionTreeBuilder(vars=('x','y')) + sage: x = etb.var('x') + sage: y = etb.var('y') + sage: ff = fast_callable(x^y, domain=RDF) sage: ff(1.5, 3) 3.375 sage: ff(-2, 3) diff --git a/src/sage_setup/autogen/interpreters/specs/rr.py b/src/sage_setup/autogen/interpreters/specs/rr.py index d59e1c2bf8e..264b694dfab 100644 --- a/src/sage_setup/autogen/interpreters/specs/rr.py +++ b/src/sage_setup/autogen/interpreters/specs/rr.py @@ -31,6 +31,7 @@ def declare_class_members(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.declare_class_members() '' @@ -45,6 +46,7 @@ class using this memory chunk, to allocate local variables. EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.declare_call_locals() ' cdef RealNumber retval = (self.domain)()\n' @@ -62,6 +64,7 @@ def declare_parameter(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.declare_parameter() 'mpfr_t retval' @@ -76,6 +79,7 @@ def pass_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.pass_argument() 'retval.value' @@ -90,6 +94,7 @@ def pass_call_c_argument(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: mc = MemoryChunkRRRetval('retval', ty_mpfr) sage: mc.pass_call_c_argument() 'result' @@ -112,6 +117,7 @@ def __init__(self): EXAMPLES:: sage: from sage_setup.autogen.interpreters import * + sage: from sage_setup.autogen.interpreters.specs.rr import * sage: interp = RRInterpreter() sage: interp.name 'rr'