def test_read_partitions(self): a = Partition([[1], [2], [3], [4], [5]]) b = Partition([[2], [3], [4], [5], [1]]) c = Partition([[2], [1], [4], [3], [5]]) perm1 = Permutation([2, 3, 4, 5, 1]) perm1alt = Permutation.read_partitions(a, b) perm2 = Permutation([2, 1, 4, 3, 5]) perm2alt = Permutation.read_partitions(a, c) perm3 = Permutation([5, 2, 1, 4, 3]) perm3alt = Permutation.read_partitions(b, c) self.assertEqual(perm1, perm1alt) self.assertEqual(perm2, perm2alt) self.assertEqual(perm3, perm3alt)
def subgroup(self): #Needs to be done in this order. self.initialise_partition_stacks() self.initialise_r_base() self.initialise_search_tree() gens = [] while self._cur_height > -1: #alt_1 rule out. backtrack_index = self.tree_modifiers.exclude_backtrack_index(self.left, self.right, self._cur_position, self._cur_height) if backtrack_index is not None: self.backtrack(backtrack_index) #alt_2 discrete check. elif self.right.discrete(): perm = Permutation.read_partitions(self.left[self._cur_height], self.right[self._cur_height]) if not perm.trivial() and self.tree_modifiers.property_check(perm): gens.append(perm) backtrack_index = self.tree_modifiers.leaf_pass_backtrack_index(self.left,self.right,self._cur_position) else: backtrack_index = self.tree_modifiers.leaf_fail_backtrack_index(self.left,self.right,self._cur_position) self.backtrack(backtrack_index) #alt_3 function to extend. elif self._r_base[self._cur_height] is not None: func = self._r_base[self._cur_height] func(self.right) self._cur_height += 1 #alt_4 special level. else: self._extend_right() return gens
def find_partition_backtrack_coset(self): #Assume the refinement families are LR-symmetric. r_base = self._r_base() count = 0 while self._cur_height > -1: count += 1 #a = self._cur_position #b = self.right[self._cur_height] #c = self.left[self._cur_height] #if self.size == 13: #print("\n{}:{}\n{} -> {}".format(self._cur_height,a,c,b)) #Alternatice 1: premature rule out. if self.alt1(): #print("alt_1") self.backtrack(self._cur_height - 1) #Alternative 2: discrete check. elif self.right.discrete(): #print("alt_2") perm = Permutation.read_partitions(self.left[self._cur_height], self.right[self._cur_height]) if self.group_property.check(perm): return perm #self.backtrack() self.backtrack(self._cur_position.min_changed_index()) #Alternative 3: not a special level elif r_base[self._cur_height] is not None: #print("alt_3") r_base[self._cur_height](None, self.right) self._cur_height += 1 #Alternative 4: is a special level else: #print("alt_4") self.extend_right() print(count) return generators
def find_partition_backtrack_subgroup(self): #Assume the refinement families are symmetric. generators = [] self.functions = self.preprocess() self.extension_indices = [0] * len(self.functions) while self.function_index > 0: #Alternative 3-4 self.extend_right() #Alternatice 1: premature rule out. if self.alt1(): self.backtrack() #Alternative 2: discrete check. elif self.right.discrete(): perm = Permutation.read_partitions(left[func_index], right[func_index]) if not perm.trivial() and self.prop_check(perm): generators.append(perm) self.backtrack() return generators
def find_partition_backtrack_subgroup(self): #Assume the refinement families are symmetric. generators = [] r_base = self._r_base() count = 0 leaf_count = 0 if self.printing: print("-----------------------------------") print("Traversing tree:") while self._cur_height > -1: count += 1 if self.printing: a = self._cur_position b = self.right[self._cur_height] c = self.left[self._cur_height] print("\n{}: {}\n{} -> {}".format(self._cur_height,a,c,b)) #Alternatice 1: premature rule out. if self.alt1(): if self.printing: print("Alternative 1: partition violation") #print("alt_1") self.backtrack(self._cur_height - 1) #Alternative 2: discrete check. elif self.right.discrete(): leaf_count += 1 #print("alt_2") perm = Permutation.read_partitions(self.left[self._cur_height], self.right[self._cur_height]) if self.double_coset_check and self.printing: G=PermGroup(generators) Dco = G*perm*G perm_key = ordering.ordering_to_perm_key(self.left.fix()) if Dco.mid_minimal(key = perm_key): print("Actually minimal in own double coset: {}".format(Dco._list_elements(Perm_key))) added = False if not perm.trivial() and self.group_property.check(perm): generators.append(perm) added = True #self.backtrack() if self.printing: print("Alternative 2 found permutation: {} ({})".format(perm, added)) if self.multi_backtrack and added: self.backtrack(self._cur_position.min_changed_index()) else: self.backtrack() #Alternative 3: not a special level elif r_base[self._cur_height] is not None: #print("alt_3") r_base[self._cur_height](None, self.right) if self.printing: print("Alternative 3 applying function: {}".format(r_base[self._cur_height]._info)) self._cur_height += 1 #Alternative 4: is a special level else: if self.printing: print("Alternative 4 special level") #print("alt_4") self.extend_right() if self.printing: print("\nFinished tree traversal.") print("Visited {} vertices ({} of which were terminal).".format(count, leaf_count)) return generators