3
y^)                 @   s   d dl mZmZmZmZ d dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlZejeZG dd dejZdS )    )absolute_importdivisionprint_functionunicode_literalsN)Topological_sortc               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Compact_graph_partialc             C   s   d S )N )selfr   r   Y/broad/hptmp/bhaas/trinityrnaseq/Analysis/SuperTranscripts/pylib/Compact_graph_partial.py__init__   s    zCompact_graph_partial.__init__c       	      C   sR  d}d}xB|rL|d7 }t jdj| |j  d}tj|j }tjrndj|}|j	| t jdj| x|D ]}|j
 dkrqtt jdj||j  |j }t|dkr| j|r| j||r| j|rd}|j }t|dko| j|o| j||rt| j|rtd}qtW |rtjr@d	j|}|j	| t jdj| | j| qW d S )
NTr      z)
	### Partial graph compaction, Round: {}Fz+ladeda.BEGIN.compacted_partial.round_{}.dotz-wrote dot: {}z8

/////////// R[{}] Exploring compaction from node: {}

z)ladeda.END.compacted_partial.round_{}.dot)loggerdebugformatclear_touch_settingsr   topologically_sortget_all_nodesTGLOBALSDEBUG
draw_graphget_touched_valtoStringget_prev_nodeslen	untouched$all_have_lower_topological_orderingscompact_upwardget_next_nodes%all_have_higher_topological_orderingscompact_downwardcompact_unbranched)	r	   tgraphcompacted_flagroundsorted_nodesdot_filenamenode
prev_nodes
next_nodesr   r   r
   compact_graph   s<    



"
"


z#Compact_graph_partial.compact_graphc             C   sl   t jdj| t|}xNtdt|d D ]8}x2t|d t|D ]}| j|| || rDdS qDW q,W dS )Nzcompact_upward: Partial {}r   r   TF)r   r   r   listranger   compact_upward_node_pair)r	   r'   ijr   r   r
   r   N   s    z$Compact_graph_partial.compact_upwardc             C   s  t jdj|j |j  |j|s.|j|rDt jdj|| dS t|j t|j k rf|| }}|j }|j }t|}|d d d }|d d d }d}x.td|D ] }	||	 ||	 kr|d7 }qP qW |dkrt jdj|| dS |j }
|d| d  }|dt||  }|dt||  }t jdj||| t|t|t| ks^t	t|t|t| ks|t	t jdj|j  t jd	j|j  |j
 j|j
 }d
|j  d |j  }|
j|||}|j| |j| |j j|j }|
j|g|j  |
j|g|j  |
j|g| |j  t|dkrh|
j|j |g |
j| n|
j|g|g |j  t|dkr|
j|j |g |
j| n|
j|g|g |j  t jdj|j  t jdj|j  t jdj|j  t jdj||| dS )Nz/compact_upward_node_pair:
node_A: {}
node_B: {}z6-not parallel paths. excluding compaction of {} and {}Fr   r   z$no matching suffix between {} and {}z#Suffices:
seqA:{}
SeqB:{}
Shared:{}znode_A before mods: {}znode_B before mods: {}zUpart:,znode_A after mods: {}znode_B after mods: {}znode_C after mods: {}z7

	*** partially UP-compacted nodes: {} and {} + {} ***Tr0   r0   )r   r   r   r   is_ancestralr   get_seqr+   	get_graphAssertionErrorget_transcriptsunion
get_loc_idget_nodeset_seqr   prune_edges	add_edgestouchr   
prune_node)r	   node_Anode_BseqAseqBshorter_lenseqA_revseqB_revnum_matchesr-   r!   
shared_seq	uniqA_seq	uniqB_seqcombined_transcriptscombined_loc_idnode_CZall_next_nodesr   r   r
   r,   [   sj    



z.Compact_graph_partial.compact_upward_node_pairc             C   sl   t jdj| t|}xNtdt|d D ]8}x2t|d t|D ]}| j|| || rDdS qDW q,W dS )Nzcompact_downward: Partial {}r   r   TF)r   r   r   r*   r+   r   compact_downward_node_pair)r	   r(   r-   r.   r   r   r
   r      s    z&Compact_graph_partial.compact_downwardc             C   s  t jdj|j |j  |j|s.|j|rDt jdj|| dS t|j t|j k rf|| }}|j }|j }t|}d}x.td|D ] }|| || kr|d7 }qP qW |dkrt jdj|| dS |j }|d| }	||d  }
||d  }t jdj|||	 t jdj|j  t jd	j|j  |j	 j
|j	 }d
|j  d |j  }|j|||	}|j|
 |j| |j j
|j }|j|j |g |j|j |g |j||g |j  t|
dkr|j|g|j  |j| n|j|g|g |j  t|dkr@|j|g|j  |j| n|j|g|g |j  t jdj|j  t jdj|j  t jdj|j  t jdj||| dS )Nz1compact_downward_node_pair:
node_A: {}
node_B: {}z6-not parallel paths. excluding compaction of {} and {}Fr   r   z+-no matching prefix match between {} and {}z#Prefixes:
seqA:{}
SeqB:{}
Shared:{}znode_A before mods: {}znode_B before mods: {}zDpart:r/   znode_A after mods: {}znode_B after mods: {}znode_C after mods: {}z4

	*** partially compacted nodes: {} and {} + {} ***T)r   r   r   r   is_descendantr   r2   r+   r3   r5   r6   r7   r8   r9   r   r:   r;   r<   r   r=   )r	   r>   r?   r@   rA   rB   rE   r-   r!   rF   rG   rH   rI   rJ   rK   Zall_prev_nodesr   r   r
   rL      sb    



z0Compact_graph_partial.compact_downward_node_pairN)	__name__
__module____qualname__r   r)   r   r,   r   rL   r   r   r   r
   r      s   2jr   )
__future__r   r   r   r   ossysreloggingTGraphTNodeNode_alignmentCompact_graph_wholer   r   	getLoggerrN   r   r   r   r   r   r
   <module>   s   
