a
    hPN                     @   s   d dl Z d dlZd dlZd dlZd dlZG dd dZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd dlZed krG d!d" d"ejZe  dS )#    Nc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ),pmtc_tc                 C   sP   t ||kr tdt ||f |dk r4td| || _dgt| | _d S )NzImages length (%d) != n (%d).   zn must be >= 1; got %d.r   )lenRuntimeErrorncopyzimages)selfimagesr    r   Q/homepages/25/d321765456/htdocs/pub_http_internet/grad-school/src/sack/pmtc_tm.py__init__   s    zpmtc_t.__init__c                 C   sT   t  | j}|  td| jd D ]*}|| |kr$tdt| jt|f q$d S )Nr   z!Not a permutation: %s.  Test: %s.)r   r   sortranger   r   str)r	   testir   r   r   check_permutation'   s
    zpmtc_t.check_permutationc                 C   s   | j |j kS Nr   abr   r   r   __eq__.   s    zpmtc_t.__eq__c                 C   s   | j |j kS r   r   r   r   r   r   __ne__1   s    zpmtc_t.__ne__c           	      C   s   |   }|  }t|}td|D ]0}|| || k r< dS || || kr" dS q"| j}td|d D ]4}| j| }|j| }||k r dS ||krh dS qhdS )Nr   r   )
cycle_typer   r   r   r   )	r   r   ctactbmr   r   azibzir   r   r   __cmp__:   s"    

zpmtc_t.__cmp__c                 C   sh   | j |j kr td| j |j f ttd| j d | j }td| j d D ]}| j|j|  |j|< qH|S )Nzmul() length mismatch: %d != %dr   )r   r   r   r   r   )r   r   cr   r   r   r   __mul__M   s    zpmtc_t.__mul__c                 C   sB   t td| jd | j}td|jd D ]}||j| j| < q(|S Nr   )r   r   r   r   )r   r#   r   r   r   r   invU   s    z
pmtc_t.invc                 C   s   |dkrt d| j| S )Nr   zpmtc: zimage[0] is protected.)r   r   )r	   r   r   r   r   __getitem__[   s    zpmtc_t.__getitem__c                 C   s>   t  |}tdt| jD ]}|| j| d  ||d < q|S r%   )r   r   r   r   )r	   inputoutputr   r   r   r   ofb   s    
z	pmtc_t.ofc                 C   sh   t d| jd D ]}| j| |kr|  S qttj? df ttj? d|f ttj? d| f td d S )Nr   z pmtc.inv_img: inverse not found.zinput       = zpermutation = )r   r   r   printsysstderrexit)r	   ZdstZsrcr   r   r   inv_imgm   s    
zpmtc_t.inv_imgc           
      C   sv   d}d}| j }td|d D ]P}| j| }t|d |d D ].}| j| }|| }|| }	||9 }||	9 }q<q|| S r%   r   r   r   )
r	   ZnumersZdenomsr   r   ZsijZsjZnumerZdenomr   r   r   sgnw   s    

z
pmtc_t.sgnc                 C   s   |   dkrdS dS d S )Nr   r   )r2   r	   r   r   r   parity   s    zpmtc_t.parityc                 C   s   d}t | jd }t| j}|}|dkrtd|D ]D}|| ||d  kr4|| }||d  ||< |||d < |d7 }q4|d8 }q"|d@ S Nr   r   )r   r   r   r   )r	   Znswapr   Zimsorttopr   tempr   r   r   	oldparity   s    

zpmtc_t.oldparityc                 C   s   |   dkrdS dS d S )Nr   r   r   )r4   r3   r   r   r   oldsgn   s    zpmtc_t.oldsgnc                 C   s|   | j }g }dg|d  }td|d D ]P}|| r4q&g }|}d||< ||g }| j| }||krbqld||< qD||g }q&|S r5   r0   )r	   r   cdZmarksr   cyclenextr   r   r   cycle_decomposition   s     


zpmtc_t.cycle_decompositionc                 C   s"   |   }tt|}|jdd |S )NT)reverse)r=   mapr   r   )r	   r:   ctr   r   r   r      s    
zpmtc_t.cycle_typec           
      C   s   g }| j }td|d }t| jdd  |}d}|sd}td|d D ]}|j| |krF|} qbqF|dkrpd}qt||}|j| }	|	|j|< ||j|	< || || }q0|S )Nr   Fr   T)r   r   r   r   append)
r	   Ztausr   Zid_imgsZsigmaZdoner   kZtaur1   r   r   r   transposition_decomposition   s*    





z"pmtc_t.transposition_decompositionc                 C   s   t d|d }td|}t|}|d }|dkr|| }td|}g }	|D ]}
|	t|
 qNt|	}|d }|dkr||	d  }||	|  ||	d < |||	| < |d8 }qr|d8 }q*|dd  }| || |   d S )Nr   r   :,)r   resplitr   rA   intr   r   )r	   Zcycles_stringr   r   Zcycle_strings
num_cyclescidxcycle_stringZindex_stringsindicesZindex_stringnum_indicesrB   r7   r
   r   r   r   scan   s*    

zpmtc_t.scanc                 C   s   t d|d }t|}|d }|dkr|| }t|}|d }|dkr|||d  }	|||  ||d < |	||| < |d8 }q>|d8 }q|dd  }
| |
| |   d S r5   )r   r   r   r   )r	   cyclesr   r   rI   rJ   r;   rM   rB   r7   r
   r   r   r   
cycle_fill  s     

zpmtc_t.cycle_fillc                 C   s   |   }d}d}|D ]p}t|dkr|d7 }nqt|d }t|}td|D ]}|d7 }|t|| 7 }qN|dkr||d7 }||7 }q|dkrd}|S )Nr    r   rE   rD   1)r=   r   r   r   )r	   r:   Znum_non_trivial_cyclesZ	cd_stringr;   rK   Z	cycle_lenr1   r   r   r   __str__/  s$    

zpmtc_t.__str__c                 C   s   |   S r   )rS   r3   r   r   r   __repr__G  s    zpmtc_t.__repr__N)__name__
__module____qualname__r   r   r   r   r"   r$   r&   r'   r*   r/   r2   r4   r8   r9   r=   r   rC   rN   rP   rS   rT   r   r   r   r   r      s*   	
#r   c                 C   s$   t td|d |}|| | |S r%   r   r   rP   )rO   r   objr   r   r   from_cycles[  s    rZ   c                 C   s&   t td|d |}|| g| |S r%   rX   )r;   r   rY   r   r   r   
from_cycle`  s    r[   c                 C   sH   d}d}g }| D ],}t ||| }|| ||7 }||7 }qt||S r5   )r   rA   rZ   )r@   r   rB   rO   eltr;   r   r   r   from_cycle_typef  s    

r]   c                 C   s*   t | }g }|D ]}|t| q|S r   )sackintptnsrA   r]   )r   r_   ZrepsZptnr   r   r   cycle_type_repsr  s
    
r`   c                 C   s`   | g krg S g }| d }d}| D ],}||kr6|d7 }q | ||g |}d}q | ||g |S r5   )rA   )r@   pairsZpreviouscounter   r   r   type_to_counts}  s    
rd   c                 C   sZ   d}| D ]}||7 }qt |}| D ]}|| }q$t| }|D ]}|t |d  }q>|S r5   )r^   	factorialrd   )r@   r   rc   Zrvra   Zpairr   r   r   num_ct_reps  s    


rf   c                 C   s   t | }|S r   )rH   )params_stringr   r   r   r   params_from_string  s    rh   c                 C   s,   t |}ttd|d |}|| | |S r%   )rh   r   r   rN   )Zvalue_stringrg   r   rY   r   r   r   from_string  s    ri   c           
      C   st   |}t d|}t d|d }|}t d|D ]>}|| }| | }| | }	|} ||	 d ||< ||	= |d8 }q*t||S r5   )r   r   )
rB   r   ZnfactZnifactr
   r7   Zniposrqr   r   r   kth_pmtc  s    

rm   c                 C   s   t td| d | S r%   )r   r   )r   r   r   r   identity_pmtc  s    rn   c                 C   s|   t d| d }d}| }t d| d D ]D}t||| d }|| }|| ||< |||< |d7 }|d8 }q$t|dd  | S r5   r   randomZrandintr   )Nr   Zunused_startZ
num_unusedrB   ur7   r   r   r   	rand_pmtc  s    
rs   c                 C   s\   t d| d }t d| d D ],}td| }|| }|| ||< |||< qt|dd  | S r5   ro   )rq   r   rB   rr   r7   r   r   r   bad_rand_pmtc)  s    
rt   c                 C   s   | d }|d }||k rdS ||kr(dS | d }|d }t d|D ]0}|| || k r\ dS || || krB dS qB| d }|d }|j}	t d|	d D ]4}|j| }
|j| }|
|k r dS |
|kr dS qdS )N   r   r   r   )r   r   r   )ZtatbZncaZncbr   r   r   ZpmtaZpmtbr   r    r!   r   r   r   pmtc_cmpC  s0    

rw   c                 C   s`   t | }g }| D ] }| }|||t |g q|t td|D ]}|| d | |< qFd S )Nr   )r   r   rA   r   rw   r   )listr   ra   Zpmtr@   r   r   r   r   
sort_pmtcsi  s    
ry   __main__c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dES )F	test_pmtcc                 C   s   |  t tg dd}W d    n1 s.0    Y  |  t tg d}W d    n1 sb0    Y  tdgd}tddgd}tg dd}d S )Nr   ru         r   r   ru   r}   )ZassertRaisesr   r   )r	   Zpir   r   r   	test_ctor  s    ,(ztest_pmtc.test_ctorc                 C   s   d S r   r   r3   r   r   r   test_check_permutation  s    z test_pmtc.test_check_permutationc                 C   sD   |  tg ddtg dd | tg ddtg dd d S )Nr|   r}   )r   r}   ru   )ZassertEqualr   ZassertNotEqualr3   r   r   r   test_eq  s     ztest_pmtc.test_eqc                 C   s   d S r   r   r3   r   r   r   test_ne  s    ztest_pmtc.test_nec                 C   s   d S r   r   r3   r   r   r   test_cmp  s    ztest_pmtc.test_cmpc                 C   s   d S r   r   r3   r   r   r   test_mul  s    ztest_pmtc.test_mulc                 C   s   d S r   r   r3   r   r   r   test_inv  s    ztest_pmtc.test_invc                 C   s   d S r   r   r3   r   r   r   test_getitem  s    ztest_pmtc.test_getitemc                 C   s   d S r   r   r3   r   r   r   test_of  s    ztest_pmtc.test_ofc                 C   s   d S r   r   r3   r   r   r   test_inv_mg  s    ztest_pmtc.test_inv_mgc                 C   s   d S r   r   r3   r   r   r   test_sgn  s    ztest_pmtc.test_sgnc                 C   s   d S r   r   r3   r   r   r   test_parity  s    ztest_pmtc.test_parityc                 C   s   d S r   r   r3   r   r   r   test_oldparity  s    ztest_pmtc.test_oldparityc                 C   s   d S r   r   r3   r   r   r   test_oldsgn  s    ztest_pmtc.test_oldsgnc                 C   s   d S r   r   r3   r   r   r   test_cycle_decomposition  s    z"test_pmtc.test_cycle_decompositionc                 C   s   d S r   r   r3   r   r   r   test_cycle_type  s    ztest_pmtc.test_cycle_typec                 C   s   d S r   r   r3   r   r   r    test_transposition_decomposition  s    z*test_pmtc.test_transposition_decompositionc                 C   s   d S r   r   r3   r   r   r   	test_scan  s    ztest_pmtc.test_scanc                 C   s   d S r   r   r3   r   r   r   test_cycle_fill  s    ztest_pmtc.test_cycle_fillc                 C   s   d S r   r   r3   r   r   r   test_str  s    ztest_pmtc.test_strc                 C   s   d S r   r   r3   r   r   r   	test_repr  s    ztest_pmtc.test_reprc                 C   s   d S r   r   r3   r   r   r   test_from_cycles  s    ztest_pmtc.test_from_cyclesc                 C   s   d S r   r   r3   r   r   r   test_from_cycle  s    ztest_pmtc.test_from_cyclec                 C   s   d S r   r   r3   r   r   r   test_from_cycle_type  s    ztest_pmtc.test_from_cycle_typec                 C   s   d S r   r   r3   r   r   r   test_cycle_type_reps  s    ztest_pmtc.test_cycle_type_repsc                 C   s   d S r   r   r3   r   r   r   test_type_to_counts  s    ztest_pmtc.test_type_to_countsc                 C   s   d S r   r   r3   r   r   r   test_num_ct_reps  s    ztest_pmtc.test_num_ct_repsc                 C   s   d S r   r   r3   r   r   r   test__params_from_string  s    z"test_pmtc.test__params_from_stringc                 C   s   d S r   r   r3   r   r   r   test_from_string  s    ztest_pmtc.test_from_stringc                 C   s   d S r   r   r3   r   r   r   test_kth_pmtc  s    ztest_pmtc.test_kth_pmtcc                 C   s   d S r   r   r3   r   r   r   test_identity_pmtc  s    ztest_pmtc.test_identity_pmtcc                 C   s   d S r   r   r3   r   r   r   test_rand_pmtc  s    ztest_pmtc.test_rand_pmtcc                 C   s   d S r   r   r3   r   r   r   test_pmtc_cmp"  s    ztest_pmtc.test_pmtc_cmpc                 C   s   d S r   r   r3   r   r   r   test_sort_pmtcs&  s    ztest_pmtc.test_sort_pmtcsN)%rU   rV   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r{   {  sD   	
r{   )rF   r   r,   rp   r^   r   rZ   r[   r]   r`   rd   rf   rh   ri   rm   rn   rs   rt   rw   ry   ZunittestrU   ZTestCaser{   mainr   r   r   r   <module>   s.      A<!& 0