def Integrals(expressions, quadrature_multiindex, argument_multiindices, parameters): """Constructs an integral representation for each GEM integrand expression. :arg expressions: integrand multiplied with quadrature weight; multi-root GEM expression DAG :arg quadrature_multiindex: quadrature multiindex (tuple) :arg argument_multiindices: tuple of argument multiindices, one multiindex for each argument :arg parameters: parameters dictionary :returns: list of integral representations """ # Rewrite: a / b => a * (1 / b) expressions = replace_division(expressions) # Unroll max_extent = parameters["unroll_indexsum"] if max_extent: def predicate(index): return index.extent <= max_extent expressions = unroll_indexsum(expressions, predicate=predicate) expressions = [index_sum(e, quadrature_multiindex) for e in expressions] argument_indices = tuple(chain(*argument_multiindices)) return [Integral(e, quadrature_multiindex, argument_indices) for e in expressions]
def Integrals(expressions, quadrature_multiindex, argument_multiindices, parameters): """Constructs an integral representation for each GEM integrand expression. :arg expressions: integrand multiplied with quadrature weight; multi-root GEM expression DAG :arg quadrature_multiindex: quadrature multiindex (tuple) :arg argument_multiindices: tuple of argument multiindices, one multiindex for each argument :arg parameters: parameters dictionary :returns: list of integral representations """ # Unroll max_extent = parameters["unroll_indexsum"] if max_extent: def predicate(index): return index.extent <= max_extent expressions = unroll_indexsum(expressions, predicate=predicate) # Choose GEM expression as the integral representation expressions = [index_sum(e, quadrature_multiindex) for e in expressions] expressions = replace_delta(expressions) expressions = remove_componenttensors(expressions) expressions = replace_division(expressions) argument_indices = tuple(itertools.chain(*argument_multiindices)) return optimise_expressions(expressions, argument_indices)
def Integrals(expressions, quadrature_multiindex, argument_multiindices, parameters): """Constructs an integral representation for each GEM integrand expression. :arg expressions: integrand multiplied with quadrature weight; multi-root GEM expression DAG :arg quadrature_multiindex: quadrature multiindex (tuple) :arg argument_multiindices: tuple of argument multiindices, one multiindex for each argument :arg parameters: parameters dictionary :returns: list of integral representations """ # Unroll max_extent = parameters["unroll_indexsum"] if max_extent: def predicate(index): return index.extent <= max_extent expressions = unroll_indexsum(expressions, predicate=predicate) # Integral representation: just a GEM expression return replace_division( [index_sum(e, quadrature_multiindex) for e in expressions])
def test_replace_div(): i = Index() A = Variable('A', ()) B = Variable('B', (6,)) Bi = Indexed(B, (i,)) d = Division(Bi, A) result, = replace_division([d]) expected = Product(Bi, Division(Literal(1.0), A)) assert result == expected