コード例 #1
0
 def test__random_int(self):
     val = 10
     rnd = OrbRing.random_int(val)
     print(rnd)
     assert rnd in range(-val, val + 1)
コード例 #2
0
    def random( self, coef_bnd = 3, random_pmat = True ):
        '''
        Sets (restricted) random values for "self.omat", 
        "self.vmat" and "self.pmat". 
                
        Parameters
        ----------
        coef_bnd : int    
            Positive integer.
        
        random_pmat : boolean 
                     
        Returns
        -------
        self
                
        Notes
        -----
        The translation coefficients of "self.vmat" 
        are in the interval: [-coef_bnd, +coef_bnd].              
        If "random_pmat== True", then "self.pmat" 
        is set to a random value (P1), and 
        otherwise "self.pmat" is set to a standard 
        projection (P0).          
        '''

        ch_lst = ['r', 's', 'p', 'm', 'a']

        #
        # random self.pmat
        #
        Pn = {True:'P1', False:'P0'}[random_pmat]
        self.pmat = get_mat( Pn, 'I', 'I' )
        self.info_dct['pmat'] = ( Pn, 'I', 'I' )

        #
        # random self.omat
        #
        rnd = OrbRing.random_elt( [0, 1] )
        if rnd == 0:
            ch_str = ''.join( [OrbRing.random_elt( ch_lst ) for i in range( 4 ) ] )
            B_str = 'O' + ch_str

            rnd2 = OrbRing.random_elt( [0, 1] )
            if rnd2 == 0:
                A_str = 'I'
                C_str = 'I'
            else:
                p = sage_Permutations( range( 1, 8 + 1 ) )
                rp = p.random_element()
                rpI = sage_Permutation( rp ).inverse()
                A_str = 'E' + str( list( rpI ) )
                C_str = 'E' + str( list( rp ) )

        elif rnd == 1:
            A_str = 'I'
            B_str = 'tT'
            C_str = 'I'

        self.omat = get_mat( A_str, B_str, C_str )
        self.info_dct['omat'] = ( A_str, B_str, C_str )

        #
        # random self.vmat
        #

        #     All the coefficients are bound by coef_size-n for some integer n.
        coef_size = OrbRing.random_elt( range( 1, coef_bnd + 1 ) )

        #     A -- self.vmat
        t_lst = [OrbRing.random_int( coef_size ) for i in range( 7 )]
        A_str = 'T' + str( t_lst )

        #     B -- self.vmat"
        #          note that small angles means small coefficients
        angle_lst = [ OrbRing.random_elt( range( 0, 360 ) ) for i in range( 4 ) ]
        ch_str = ''.join( [OrbRing.random_elt( ch_lst ) for i in range( 4 ) ] )
        B_str = 'R' + ch_str + str( angle_lst )

        #     C -- self.vmat
        rnd = OrbRing.random_elt( [0, 1, 2] )
        if rnd == 0:
            C_str = 'T' + str( [-t_lst[i] for i in range( 7 )] )  # inverse
        elif rnd == 1:
            C_str = 'T' + str( [OrbRing.random_int( coef_size ) for i in range( 7 )] )
        elif rnd == 2:
            C_str = 'I'

        #     A*B*C -- self.vmat
        self.vmat = get_mat( A_str, B_str, C_str )
        self.info_dct['vmat'] = ( A_str, B_str, C_str )

        return self