def preprocess(cls, gens): if isinstance(gens, Basic): gens = (gens, ) elif len(gens) == 1 and hasattr(gens[0], '__iter__'): gens = gens[0] if gens == (None, ): gens = () elif has_dups(gens): raise GeneratorsError("duplicated generators: %s" % str(gens)) elif any(gen.is_commutative is False for gen in gens): raise GeneratorsError("non-commutative generators: %s" % str(gens)) return tuple(gens)
def __new__(cls, *partition): """ Generates a new partition object. This method also verifies if the arguments passed are valid and raises a ValueError if they are not. Examples ======== >>> from diofant.combinatorics.partitions import Partition >>> a = Partition([1, 2], [3]) >>> a {{3}, {1, 2}} >>> a.partition [[1, 2], [3]] >>> len(a) 2 >>> a.members (1, 2, 3) """ args = partition if not all(isinstance(part, (list, FiniteSet)) for part in args): raise ValueError( "Each argument to Partition should be a list or a FiniteSet") # sort so we have a canonical reference for RGS partition = sorted(sum(list(map(list, partition)), []), key=default_sort_key) if has_dups(partition): raise ValueError("Partition contained duplicated elements.") obj = FiniteSet.__new__(cls, *[FiniteSet(*x) for x in args]) obj.members = tuple(partition) obj.size = len(partition) return obj
def test_has_dups(): assert has_dups(set()) is False assert has_dups(list(range(3))) is False assert has_dups([1, 2, 1]) is True
def eval(cls, *args): if all(isinstance(a, (int, Integer)) for a in args): return eval_levicivita(*args) if has_dups(args): return S.Zero