Source code for ufl.utils.sequences
# -*- coding: utf-8 -*-
"""Various sequence manipulation utilities."""
# Copyright (C) 2008-2016 Martin Sandve Alnæs
#
# This file is part of UFL (https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
from functools import reduce
import numpy
[docs]def product(sequence):
"""Return the product of all elements in a sequence."""
p = 1
for f in sequence:
p *= f
return p
[docs]def unzip(seq):
"""Inverse operation of zip:
unzip(zip(a, b)) == (a, b)."""
return [s[0] for s in seq], [s[1] for s in seq]
[docs]def xor(a, b):
return bool(a) if b else not a
[docs]def or_tuples(seqa, seqb):
"""Return 'or' of all pairs in two sequences of same length."""
return tuple(a or b for (a, b) in zip(seqa, seqb))
[docs]def and_tuples(seqa, seqb):
"""Return 'and' of all pairs in two sequences of same length."""
return tuple(a and b for (a, b) in zip(seqa, seqb))
[docs]def iter_tree(tree):
"""Iterate over all nodes in a tree represented
by lists of lists of leaves."""
if isinstance(tree, list):
for node in tree:
for i in iter_tree(node):
yield i
else:
yield tree
[docs]def recursive_chain(lists):
for l in lists:
if isinstance(l, str):
yield l
else:
for s in recursive_chain(l):
yield s
[docs]def max_degree(degrees):
"""Maximum degree for mixture of scalar and tuple degrees."""
# numpy.maximum broadcasts scalar degrees to tuple degrees if
# necessary. reduce applies numpy.maximum pairwise.
degree = reduce(numpy.maximum, map(numpy.asarray, degrees))
if degree.ndim:
degree = tuple(map(int, degree)) # tuple degree
else:
degree = int(degree) # scalar degree
return degree