diff --git a/python/dune/codegen/__init__.py b/python/dune/codegen/__init__.py index 243911af33e57531a147b9b4814b14ad65fd408b..e892baf44c4c9fb301536c15c40059a5acc5d602 100644 --- a/python/dune/codegen/__init__.py +++ b/python/dune/codegen/__init__.py @@ -6,8 +6,7 @@ os.environ["OMP_NUM_THREADS"] = "1" # Trigger imports that involve monkey patching! import dune.codegen.loopy.symbolic # noqa -# Trigger some imports that are needed to have all backend implementations visible -# to the selection mechanisms +# Trigger some imports that are needed to have all mixin implementations visible import dune.codegen.pdelab # noqa import dune.codegen.sumfact # noqa import dune.codegen.blockstructured # noqa diff --git a/python/dune/codegen/blockstructured/argument.py b/python/dune/codegen/blockstructured/argument.py index b0940e669058777886da45938482f4cf747503e2..420773e85bea93ee55cb310255da7fa60d55d9de 100644 --- a/python/dune/codegen/blockstructured/argument.py +++ b/python/dune/codegen/blockstructured/argument.py @@ -1,5 +1,4 @@ -from dune.codegen.generation import (backend, - kernel_cached, +from dune.codegen.generation import (kernel_cached, valuearg, instruction, globalarg) from dune.codegen.options import get_form_option from dune.codegen.pdelab.argument import CoefficientAccess @@ -26,7 +25,6 @@ def name_alias(container, lfs, element): # TODO remove the need for element -@backend(interface="pymbolic_coefficient", name="blockstructured") @kernel_cached def pymbolic_coefficient(container, lfs, element, index): # TODO introduce a proper type for local function spaces! diff --git a/python/dune/codegen/blockstructured/basis.py b/python/dune/codegen/blockstructured/basis.py index ea90582e5f991f94d5044ed47e9711f060b730e8..5af8bb48f2bb625a0b336c5cae6d42863f0063c5 100644 --- a/python/dune/codegen/blockstructured/basis.py +++ b/python/dune/codegen/blockstructured/basis.py @@ -1,9 +1,7 @@ from loopy import Reduction -from dune.codegen.generation import (backend, - basis_mixin, +from dune.codegen.generation import (basis_mixin, kernel_cached, - get_backend, instruction, temporary_variable, globalarg, @@ -139,7 +137,6 @@ class BlockStructuredBasisMixin(GenericBasisMixin): # define FE basis explicitly in localoperator -@backend(interface="typedef_localbasis", name="blockstructured") @class_member(classtag="operator") def typedef_localbasis(element, name): df = "typename {}::Traits::GridView::ctype".format(type_leaf_gfs(element)) diff --git a/python/dune/codegen/generation/__init__.py b/python/dune/codegen/generation/__init__.py index b8207414ef0faf0702762a5bc13b38acc6596fe1..d0cf1d4dc8b6880db13bfdec4458d815ea8208c2 100644 --- a/python/dune/codegen/generation/__init__.py +++ b/python/dune/codegen/generation/__init__.py @@ -1,9 +1,3 @@ -from __future__ import absolute_import - -from dune.codegen.generation.backend import (backend, - get_backend, - ) - from dune.codegen.generation.counter import (get_counter, get_counted_variable, ) diff --git a/python/dune/codegen/generation/backend.py b/python/dune/codegen/generation/backend.py deleted file mode 100644 index ba793674dce947141a550db904492901e0676d69..0000000000000000000000000000000000000000 --- a/python/dune/codegen/generation/backend.py +++ /dev/null @@ -1,44 +0,0 @@ -from dune.codegen.generation.cache import _RegisteredFunction -from dune.codegen.options import option_switch -from pytools import ImmutableRecord - - -_backend_mapping = {} - - -class FuncProxy(ImmutableRecord): - def __init__(self, interface, name, func): - ImmutableRecord.__init__(self, interface=interface, name=name, func=func) - - def __call__(self, *args, **kwargs): - return self.func(*args, **kwargs) - - -def register_backend(interface, name, func): - _backend_mapping.setdefault(interface, {}) - _backend_mapping[interface][name] = func - - -def backend(interface=None, name='default'): - assert interface - - def _dec(func): - if not isinstance(func, _RegisteredFunction): - # Allow order independence of the generator decorators - # and the backend decorator by delaying the registration - func = FuncProxy(interface, name, func) - - register_backend(interface, name, func) - - return func - - return _dec - - -def get_backend(interface=None, selector=option_switch("sumfact"), **kwargs): - assert interface and selector - - select = selector(**kwargs) - assert select in _backend_mapping[interface], "Implementation '{}' for interface '{}' missing!".format(select, interface) - - return _backend_mapping[interface][select] diff --git a/python/dune/codegen/generation/cache.py b/python/dune/codegen/generation/cache.py index c727fe0516e02e1197dc37bd6168103668492a78..2e555ae99e73b5917d082d6c631d675c70cfc3de 100644 --- a/python/dune/codegen/generation/cache.py +++ b/python/dune/codegen/generation/cache.py @@ -86,12 +86,6 @@ class _RegisteredFunction(object): # Initialize the memoization cache self._memoize_cache = {} - # Allow order independence of the backend and the generator decorators. - # If backend was applied first, we resolve the issued FuncProxy object - from dune.codegen.generation.backend import FuncProxy - if isinstance(self.func, FuncProxy): - raise NotImplementedError("Please use @backend as the outer decorator if combining with generator decorators") - def _get_content(self, key): return self._memoize_cache[key].value diff --git a/python/dune/codegen/pdelab/argument.py b/python/dune/codegen/pdelab/argument.py index f9c6c56b97c60356cdb58db2ab4099d8e86c7d59..8d3c3a3db6dc623da71cfff7679384712e414196 100644 --- a/python/dune/codegen/pdelab/argument.py +++ b/python/dune/codegen/pdelab/argument.py @@ -11,7 +11,6 @@ from dune.codegen.generation import (domain, valuearg, get_global_context_value, kernel_cached, - backend ) from dune.codegen.loopy.target import dtype_floatingpoint from dune.codegen.pdelab.index import name_index @@ -96,7 +95,6 @@ def name_applycontainer(restriction): return name -@backend(interface="pymbolic_coefficient") @kernel_cached def pymbolic_coefficient(container, lfs, index): # TODO introduce a proper type for local function spaces! diff --git a/python/dune/codegen/pdelab/basis.py b/python/dune/codegen/pdelab/basis.py index 583c3738f3e450f4839e852291a2ee868eb7b000..03c069ac518f01efaec8304356fddcf34915668f 100644 --- a/python/dune/codegen/pdelab/basis.py +++ b/python/dune/codegen/pdelab/basis.py @@ -1,9 +1,7 @@ """ Generators for basis evaluations """ -from dune.codegen.generation import (backend, - basis_mixin, +from dune.codegen.generation import (basis_mixin, class_member, - get_backend, include_file, instruction, kernel_cached, @@ -278,7 +276,6 @@ def declare_grid_function_range(gridfunction): return _decl -@backend(interface="typedef_localbasis") @class_member(classtag="operator") def typedef_localbasis(element, name): basis_type = "{}::Traits::FiniteElementMap::Traits::FiniteElementType::Traits::LocalBasisType".format(type_leaf_gfs(element)) @@ -294,7 +291,14 @@ def type_localbasis(element): name = "DG{}_LocalBasis".format(element._degree) else: raise NotImplementedError("Element type not known in code generation") - get_backend("typedef_localbasis", selector=option_switch("blockstructured"))(element, name) + + # TODO get rid of this + if get_form_option("blockstructured"): + from dune.codegen.blockstructured.basis import typedef_localbasis as bs_typedef_localbasis + bs_typedef_localbasis(element, name) + else: + typedef_localbasis(element, name) + return name diff --git a/python/dune/codegen/pdelab/function.py b/python/dune/codegen/pdelab/function.py deleted file mode 100644 index 74e6b6b6ad08cdf8b6b9c1f0a1c5aeeae5f3f3c9..0000000000000000000000000000000000000000 --- a/python/dune/codegen/pdelab/function.py +++ /dev/null @@ -1,52 +0,0 @@ -from dune.codegen.generation import (get_backend, - instruction, - kernel_cached, - preamble, - temporary_variable, - ) -from dune.codegen.pdelab.geometry import (name_cell, - world_dimension, - ) -from dune.codegen.pdelab.localoperator import name_gridfunction_member - -import pymbolic.primitives as prim - - -@preamble -def bind_gridfunction_to_element(gf, restriction): - element = name_cell(restriction) - return "{}.bind({});".format(gf, element) - - -def declare_grid_function_range(gridfunction): - def _decl(name, kernel, decl_info): - return "typename decltype({})::Range {};".format(gridfunction, name) - - return _decl - - -@kernel_cached -def pymbolic_evaluate_gridfunction(name, coeff, restriction, grad): - diffOrder = 1 if grad else 0 - - gridfunction = name_gridfunction_member(coeff, restriction, diffOrder) - bind_gridfunction_to_element(gridfunction, restriction) - - temporary_variable(name, - shape=(1,) + (world_dimension(),) * diffOrder, - decl_method=declare_grid_function_range(gridfunction), - managed=False, - ) - - quadpos = get_backend(interface="qp_in_cell")(restriction) - instruction(code="{} = {}({});".format(name, gridfunction, quadpos), - assignees=frozenset({name}), - within_inames=frozenset(get_backend(interface="quad_inames")()), - within_inames_is_final=True, - ) - - -def pymbolic_gridfunction(coeff, restriction, grad): - name = "coeff{}{}".format(coeff.count(), "_grad" if grad else "") - pymbolic_evaluate_gridfunction(name, coeff, restriction, grad) - return prim.Subscript(prim.Variable(name), (0,)) diff --git a/python/dune/codegen/pdelab/geometry.py b/python/dune/codegen/pdelab/geometry.py index 4ade8a2284cdfff27120c396584982c675ca44d5..5ecd8c191f751d6ce9bb7e69e8f089d69983dac2 100644 --- a/python/dune/codegen/pdelab/geometry.py +++ b/python/dune/codegen/pdelab/geometry.py @@ -1,10 +1,8 @@ from dune.codegen.ufl.modified_terminals import Restriction from dune.codegen.pdelab.restriction import restricted_name -from dune.codegen.generation import (backend, - class_member, +from dune.codegen.generation import (class_member, domain, geometry_mixin, - get_backend, get_global_context_value, globalarg, iname, diff --git a/python/dune/codegen/pdelab/localoperator.py b/python/dune/codegen/pdelab/localoperator.py index 65627da0d73816c1cce5c970ee2afa28a1ab8a95..70ab9f4793a6163559d070e33e3600f9cd8c5578 100644 --- a/python/dune/codegen/pdelab/localoperator.py +++ b/python/dune/codegen/pdelab/localoperator.py @@ -10,7 +10,6 @@ from dune.codegen.options import (get_form_option, option_switch, set_form_option) from dune.codegen.generation import (accumulation_mixin, - backend, base_class, class_basename, class_member, @@ -21,7 +20,6 @@ from dune.codegen.generation import (accumulation_mixin, end_of_file, function_mangler, generator_factory, - get_backend, get_global_context_value, global_context, iname, @@ -545,9 +543,13 @@ def generate_kernel(integrals): return knl -@backend(interface="generate_kernels_per_integral") def generate_kernels_per_integral(integrals): - yield generate_kernel(integrals) + if get_form_option("sumfact"): + from dune.codegen.sumfact.switch import sumfact_generate_kernels_per_integral + for k in sumfact_generate_kernels_per_integral(integrals): + yield k + else: + yield generate_kernel(integrals) def extract_kernel_from_cache(tag, name, signature, wrap_in_cgen=True, add_timings=True): @@ -826,7 +828,7 @@ def generate_residual_kernels(form, original_form): with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name with global_context(kernel=assembler_routine_name()): - kernel = [k for k in get_backend(interface="generate_kernels_per_integral")(form.integrals_by_type(measure))] + kernel = [k for k in generate_kernels_per_integral(form.integrals_by_type(measure))] # The integrals might vanish due to unfulfillable boundary conditions. # We only generate the local operator enums/base classes if they did not. @@ -913,7 +915,7 @@ def generate_jacobian_kernels(form, original_form): with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name with global_context(kernel=assembler_routine_name()): - kernel = [k for k in get_backend(interface="generate_kernels_per_integral")(jac_apply_form.integrals_by_type(measure))] + kernel = [k for k in generate_kernels_per_integral(jac_apply_form.integrals_by_type(measure))] operator_kernels[(measure, 'jacobian_apply')] = kernel # Generate dummy functions for those kernels, that vanished in the differentiation process @@ -942,7 +944,7 @@ def generate_jacobian_kernels(form, original_form): with global_context(integral_type=measure): from dune.codegen.pdelab.signatures import assembler_routine_name with global_context(kernel=assembler_routine_name()): - kernel = [k for k in get_backend(interface="generate_kernels_per_integral")(jacform.integrals_by_type(measure))] + kernel = [k for k in generate_kernels_per_integral(jacform.integrals_by_type(measure))] operator_kernels[(measure, 'jacobian')] = kernel # Generate dummy functions for those kernels, that vanished in the differentiation process diff --git a/python/dune/codegen/pdelab/quadrature.py b/python/dune/codegen/pdelab/quadrature.py index 71972c2c92cdb374045e3f8ce00355c7fdaab335..ae6a7e2db7212b254e3857bc86813ea420ed0251 100644 --- a/python/dune/codegen/pdelab/quadrature.py +++ b/python/dune/codegen/pdelab/quadrature.py @@ -1,9 +1,7 @@ import numpy -from dune.codegen.generation import (backend, - class_member, +from dune.codegen.generation import (class_member, domain, - get_backend, get_global_context_value, globalarg, iname, diff --git a/python/dune/codegen/sumfact/accumulation.py b/python/dune/codegen/sumfact/accumulation.py index ba8c9bba34d2e5f15511265296ab758355d47fa1..3be02ae08e1dd18e0fb942e1755587984fec3755 100644 --- a/python/dune/codegen/sumfact/accumulation.py +++ b/python/dune/codegen/sumfact/accumulation.py @@ -4,7 +4,6 @@ from dune.codegen.pdelab.argument import (name_accumulation_variable, PDELabAccumulationFunction, ) from dune.codegen.generation import (accumulation_mixin, - backend, domain, dump_accumulate_timer, generator_factory, diff --git a/python/dune/codegen/sumfact/basis.py b/python/dune/codegen/sumfact/basis.py index a6fdbb301f52f9ebbbc57bdff6a40e1cda511800..d9ecc4a7e6c9a4637526c903ae1c193d38181122 100644 --- a/python/dune/codegen/sumfact/basis.py +++ b/python/dune/codegen/sumfact/basis.py @@ -5,8 +5,7 @@ multiplication with the test function is part of the sum factorization kernel. """ import itertools -from dune.codegen.generation import (backend, - basis_mixin, +from dune.codegen.generation import (basis_mixin, domain, get_counted_variable, get_counter, diff --git a/python/dune/codegen/sumfact/geometry.py b/python/dune/codegen/sumfact/geometry.py index aa3963405c2b2915e2b7a1a6bc1792e5b71094cc..feda608341ec4d82d93a5c749372fb5a97983a89 100644 --- a/python/dune/codegen/sumfact/geometry.py +++ b/python/dune/codegen/sumfact/geometry.py @@ -1,7 +1,6 @@ """ Sum factorized geometry evaluations """ -from dune.codegen.generation import (backend, - class_member, +from dune.codegen.generation import (class_member, domain, geometry_mixin, get_counted_variable, diff --git a/python/dune/codegen/sumfact/quadrature.py b/python/dune/codegen/sumfact/quadrature.py index 8698244375867491e71ad69ee8601d8b835d050d..91e99c4c3c0cd333d6e64353ed06ac0c129a7e05 100644 --- a/python/dune/codegen/sumfact/quadrature.py +++ b/python/dune/codegen/sumfact/quadrature.py @@ -1,5 +1,4 @@ -from dune.codegen.generation import (backend, - domain, +from dune.codegen.generation import (domain, function_mangler, get_global_context_value, globalarg, diff --git a/python/dune/codegen/sumfact/realization.py b/python/dune/codegen/sumfact/realization.py index d00f2a01681ecfe14f171ef74bca08e667c67112..a40be948fb8d36969c83672c1f9102eaedf5282d 100644 --- a/python/dune/codegen/sumfact/realization.py +++ b/python/dune/codegen/sumfact/realization.py @@ -17,7 +17,6 @@ from dune.codegen.generation import (barrier, transform, ) from dune.codegen.loopy.flatten import flatten_index -from dune.codegen.pdelab.argument import pymbolic_coefficient from dune.codegen.pdelab.basis import shape_as_pymbolic from dune.codegen.pdelab.geometry import world_dimension from dune.codegen.options import (get_form_option, diff --git a/python/dune/codegen/sumfact/switch.py b/python/dune/codegen/sumfact/switch.py index c057e731a0d3b32c90ec67b532660af51559e57e..67cb9df358112e456b4ef9250c3602f1f9aacdec 100644 --- a/python/dune/codegen/sumfact/switch.py +++ b/python/dune/codegen/sumfact/switch.py @@ -2,13 +2,11 @@ import csv -from dune.codegen.generation import (backend, - get_backend, - get_global_context_value, +from dune.codegen.generation import (get_global_context_value, global_context, ) from dune.codegen.pdelab.geometry import world_dimension -from dune.codegen.pdelab.localoperator import generate_kernel +from dune.codegen.pdelab.localoperator import generate_kernel, generate_kernels_per_integral from dune.codegen.pdelab.signatures import (assembly_routine_args, assembly_routine_signature, kernel_name, @@ -17,8 +15,7 @@ from dune.codegen.options import get_form_option, get_option, set_form_option from dune.codegen.cgen.clazz import ClassMember -@backend(interface="generate_kernels_per_integral", name="sumfact") -def generate_kernels_per_integral(integrals): +def sumfact_generate_kernels_per_integral(integrals): dim = world_dimension() measure = get_global_context_value("integral_type") @@ -29,7 +26,7 @@ def generate_kernels_per_integral(integrals): # Maybe skip sum factorization on boundary integrals if not get_form_option("sumfact_on_boundary"): set_form_option("sumfact", False) - for k in get_backend(interface="generate_kernels_per_integral")(integrals): + for k in generate_kernels_per_integral(integrals): yield k set_form_option("sumfact", True) return diff --git a/python/dune/codegen/sumfact/vectorization.py b/python/dune/codegen/sumfact/vectorization.py index 0b6b3a232bbc5b199b853c022743c8a18884f3fe..fc555f2c3afafce212a6d266b6817f57e2d9683f 100644 --- a/python/dune/codegen/sumfact/vectorization.py +++ b/python/dune/codegen/sumfact/vectorization.py @@ -7,9 +7,7 @@ import logging from dune.codegen.loopy.target import dtype_floatingpoint from dune.codegen.loopy.vcl import get_vcl_type_size from dune.codegen.loopy.symbolic import SumfactKernel, VectorizedSumfactKernel -from dune.codegen.generation import (backend, - generator_factory, - get_backend, +from dune.codegen.generation import (generator_factory, get_counted_variable, get_global_context_value, kernel_cached, diff --git a/python/test/dune/codegen/generation/test_backend.py b/python/test/dune/codegen/generation/test_backend.py deleted file mode 100644 index e7b11e56dc14a18d18bf04ff453b3dc078cc702b..0000000000000000000000000000000000000000 --- a/python/test/dune/codegen/generation/test_backend.py +++ /dev/null @@ -1,21 +0,0 @@ -from dune.codegen.generation import (backend, - get_backend, - generator_factory, - ) - - -@backend(interface="foo", name="f1") -@generator_factory() -def f1(): - return 1 - - -@backend(interface="bar", name="f3") -@generator_factory() -def f3(): - return 3 - - -def test_backend(): - assert get_backend(interface="foo", selector=lambda: "f1")() == 1 - assert get_backend(interface="bar", selector=lambda: "f3")() == 3