Пример #1
0
    def map_sum(self, expr, other, urecs):
        if (not isinstance(other, type(expr))
                or len(expr.children) != len(other.children)):
            return []

        result = []

        from pytools import generate_permutations
        had_structural_match = False
        for perm in generate_permutations(range(len(expr.children))):
            it_assignments = urecs

            for my_child, other_child in zip(
                    expr.children,
                    (other.children[i] for i in perm)):
                it_assignments = self.rec(my_child, other_child, it_assignments)
                if not it_assignments:
                    break

            if it_assignments:
                had_structural_match = True
                result.extend(it_assignments)

        if not had_structural_match:
            return self.treat_mismatch(expr, other, urecs)

        return result
Пример #2
0
    def map_sum(self, expr, other, urecs):
        if (not isinstance(other, type(expr))
                or len(expr.children) != len(other.children)):
            return []

        result = []

        from pytools import generate_permutations
        had_structural_match = False
        for perm in generate_permutations(range(len(expr.children))):
            it_assignments = urecs

            for my_child, other_child in zip(expr.children, (other.children[i]
                                                             for i in perm)):
                it_assignments = self.rec(my_child, other_child,
                                          it_assignments)
                if not it_assignments:
                    break

            if it_assignments:
                had_structural_match = True
                result.extend(it_assignments)

        if not had_structural_match:
            return self.treat_mismatch(expr, other, urecs)

        return result
Пример #3
0
def size(k, string):
    minimum = 'inf'
    size = 0
    for permutation in generate_permutations(range(k)):
        result = []
        for i in range(len(string) / k):
            result.append(permute(permutation, string[k * i:k * (i + 1)]))
        minimum = min(minimum, compressed_size(''.join(result)))
    return minimum
def test_mapping_differences_tri():
    """Check that triangle interpolation is independent of mapping to reference
    """
    from hedge.discretization.local import TriangleDiscretization
    from random import random
    from pytools import generate_permutations

    def shift(list):
        return list[1:] + [list[0]]

    class LinearCombinationOfFunctions:
        def __init__(self, coefficients, functions, premap):
            self.coefficients = coefficients
            self.functions = functions
            self.premap = premap

        def __call__(self, x):
            return sum(coeff * f(self.premap(x))
                       for coeff, f in zip(self.coefficients, self.functions))

    def random_barycentric_coordinates(dim):
        remain = 1
        coords = []
        for i in range(dim):
            coords.append(random() * remain)
            remain -= coords[-1]
        coords.append(remain)
        return coords

    tri = TriangleDiscretization(5)

    for trial_number in range(10):
        vertices = [numpy.random.randn(2) for vi in range(3)]
        map = tri.geometry.get_map_unit_to_global(vertices)
        nodes = [map(node) for node in tri.unit_nodes()]
        node_values = numpy.array([random() for node in nodes])

        functions = []
        for pvertices in generate_permutations(vertices):
            pmap = tri.geometry.get_map_unit_to_global(pvertices)
            pnodes = [pmap(node) for node in tri.unit_nodes()]

            # map from pnode# to node#
            nodematch = {}
            for pi, pn in enumerate(pnodes):
                for i, n in enumerate(nodes):
                    if la.norm(n - pn) < 1e-13:
                        nodematch[pi] = i
                        break

            pnode_values = numpy.array(
                [node_values[nodematch[pi]] for pi in range(len(nodes))])

            interp_f = LinearCombinationOfFunctions(
                la.solve(tri.vandermonde(), pnode_values),
                tri.basis_functions(), pmap.inverted())

            # verify interpolation property
            #for n, nv in zip(pnodes, pnode_values):
            #assert abs(interp_f(n) - nv) < 1e-13

            functions.append(interp_f)

        for subtrial_number in range(15):
            pt_in_element = sum(coeff * vertex for coeff, vertex in zip(
                random_barycentric_coordinates(2), vertices))
            f_values = [f(pt_in_element) for f in functions]
            avg = sum(f_values) / len(f_values)
            err = [abs(fv - avg) for fv in f_values]
            assert max(err) < 1e-12
Пример #5
0
def test_mapping_differences_tri():
    """Check that triangle interpolation is independent of mapping to reference
    """
    from hedge.discretization.local import TriangleDiscretization
    from random import random
    from pytools import generate_permutations

    def shift(list):
        return list[1:] + [list[0]]

    class LinearCombinationOfFunctions:
        def __init__(self, coefficients, functions, premap):
            self.coefficients = coefficients
            self.functions = functions
            self.premap = premap

        def __call__(self, x):
            return sum(coeff * f(self.premap(x)) for coeff, f in zip(self.coefficients, self.functions))

    def random_barycentric_coordinates(dim):
        remain = 1
        coords = []
        for i in range(dim):
            coords.append(random() * remain)
            remain -= coords[-1]
        coords.append(remain)
        return coords

    tri = TriangleDiscretization(5)

    for trial_number in range(10):
        vertices = [numpy.random.randn(2) for vi in range(3)]
        map = tri.geometry.get_map_unit_to_global(vertices)
        nodes = [map(node) for node in tri.unit_nodes()]
        node_values = numpy.array([random() for node in nodes])

        functions = []
        for pvertices in generate_permutations(vertices):
            pmap = tri.geometry.get_map_unit_to_global(pvertices)
            pnodes = [pmap(node) for node in tri.unit_nodes()]

            # map from pnode# to node#
            nodematch = {}
            for pi, pn in enumerate(pnodes):
                for i, n in enumerate(nodes):
                    if la.norm(n - pn) < 1e-13:
                        nodematch[pi] = i
                        break

            pnode_values = numpy.array([node_values[nodematch[pi]] for pi in range(len(nodes))])

            interp_f = LinearCombinationOfFunctions(
                la.solve(tri.vandermonde(), pnode_values), tri.basis_functions(), pmap.inverted()
            )

            # verify interpolation property
            # for n, nv in zip(pnodes, pnode_values):
            # assert abs(interp_f(n) - nv) < 1e-13

            functions.append(interp_f)

        for subtrial_number in range(15):
            pt_in_element = sum(coeff * vertex for coeff, vertex in zip(random_barycentric_coordinates(2), vertices))
            f_values = [f(pt_in_element) for f in functions]
            avg = sum(f_values) / len(f_values)
            err = [abs(fv - avg) for fv in f_values]
            assert max(err) < 5e-13