예제 #1
0
 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)
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
    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
예제 #5
0
    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