U
    0BfN1                     @   sL  d Z ddlmZ ddlT ddlZddlmZ ddlZ	ddl
mZ ddlT ddlmZmZmZ ddlmZ ddlZddlZddl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"e#fd!d"Z$d#d$ Z%d%d& Z&d'd( Z'd)d* Z(d+d, Z)e#e*fd-d.Z+e#e*fd/d0Z,d1d2 Z-e.d3krHe-  dS )4z~ pareto_functions.py file
This file contains a number of functions listed below:


The main function uses a hard coded file


    )sqrt)*N)	euclideanread_arbor_full)optimal_midpointoptimal_midpoint_approxoptimal_midpoint_alpha1)defaultdictc                 C   s.   d}|   D ]\}}|| | | d 7 }q|S )Nr   length)edges)Gwiringuv r   n/home/dh_an3skk/arjun-chandrasekhar-teaching.com/tomato/backend/backend_plant_architecture/pareto_functions.pywiring_cost   s    r   c                 C   s   i }g }d}t  }| jd }|| d||< d}t|dkr|d}||ksTt|| | j| d dkr|||| 7 }| |D ]2}||kr|| || | | | d  ||< qq2t|| 	 kst|S )a}  
    use a breadth-first search to compute the distance to from the root to each point

    when we encounter a visit node for the first time, we record its distance to the root
    (which is the sum of its parent's distance, plus the length of the edge from the parent
    to the current node').  We keep a running total of the total distances from the root
    to each node.
    N	main rootr   labellateral root tipr   
setgraphappendlenpopAssertionErroraddnodes	neighborsnumber_of_nodes)r   drootqueuecurrvisitedrootdelayr   r   r   r   conduction_delay   s(    	




 r(   c           
      C   s   i }g }d}t  }| jd }|| d||< d}d}t|dkr|d}||ksXt|| | j| d dkr||| 7 }| |D ]>}||kr|| | | | d }	||	7 }|| |	 ||< qq6t|| 	 kst||fS )zg
    perform a breadth-first search that simultaneously computers wiring cost and conduction delay
    Nmain root baser   r   r   r   r   )
r   r"   r#   r$   r%   r&   r   r'   r   r   r   r   r   pareto_costsD   s.    




r*   c                 C   sb   t |  D ]P}| j| d }|dkrHt | |D ]}| || q4qt| |s| | qd S Nr   r   )listr   r    remove_edgeis_on_main_rootremove_node)r   r   r   nr   r   r   prune_lateral_rootsh   s    
r1   c                 C   s   |   }t| |S N)copyr1   )r   Pr   r   r   starting_graphq   s    r5   c                 C   sN   |   }t| | jd }|  D ]&}| j| d }|dkr"t||| q"|S )Nr)   r   r   )r3   r1   r   r   connect_points)r   Sr&   r   r   r   r   r   satellite_treev   s    
r8   c                 C   s   i }| j d }|}|g}t|dkr| }d}||kr@|| }t||| ||< | |D ](}| j| d dkr\||kr\|| q\|}q|S )Nr)   r   r   r   )r   r   r   r   r    r   r   )r   	distancesr&   prevr#   r$   Zprev_distancer0   r   r   r   get_root_distances   s    
r;   c                 C   s2   g }|   D ] }| j | d dkr|| q|S r+   )r   r   )r   Ztipsr   r   r   r   get_lateral_root_tips   s
    r<   c                 C   s   g }t  }| jd g}t|dkr| }d| j| d ks@t|| | |D ]6}||krTd| j| d krT|||f || qTq|S )Nr)   r   r   r   )	r   r   r   r   r   r   r   r    r   )r   segmentsr%   r#   r$   neighborr   r   r   get_main_root_segments   s    
r?   c                 C   s   t t}|D ]}td}d }d }	d }
d }|D ]h\}}|| }d\}}}|dkrbt|||\}}}nt|||||\}}}||k r,|}|}|}	|}
|}q,|dkr||
kstt| ||
 q||	|
f |||f q|S )Ninf)NNN   )r
   r,   floatr	   r   r   r6   r   )r   lateral_root_tipsmain_root_segmentsroot_distancesalphabest_midpointslateral_root	best_costbest_midpointZbest_p0Zbest_p1
best_deltap0p1r"   costmidpointdeltar   r   r   get_best_midpoints   s0    
rQ   c           	      C   s   |  D ]\\}}}| ||s$t| || |}t|D ]P\}}}||kr|| |s|| | d| j| d< t| || t| || |}q<||krt| || qd S )Nr   r   )	itemshas_edger   r-   sortedhas_nodeadd_noder   r6   )	r   rG   rL   rM   	midpoints
prev_pointrK   rJ   rH   r   r   r   connect_to_midpoints   s    
rY   c           	      C   st   |dkrt | S | jd \}}t| }t| }d| jd |f |jd< t|}t|}t|||||}t|| |S )Nr   r)   z%s-alpha=%0.2f
arbor name)r8   r   r;   r5   r<   r?   rQ   rY   )	r   rF   Zroot_xZroot_yrE   r4   rC   rD   rG   r   r   r   	opt_arbor   s    
r[   c                 C   sD   g }g }|D ].}t | |}t|\}}|| || q||fS r2   )r[   r*   r   )r   alphaswiring_costsconduction_delaysrF   optr   r'   r   r   r   pareto_front   s    

r`   c                 C   s>   t d}t||D ]&\}}t| |f||f}||k r|}q|S Nr@   )rB   zipr   r   r'   Zopt_wiring_costsZopt_conduction_delaysclosest_distZ
opt_wiringZ	opt_delaypareto_distr   r   r   re      s    re   c                 C   sZ   t | \}}td}d }t|||D ],\}}	}
t||f|	|
f}||k r$|}|}q$||fS ra   )r*   rB   rb   r   r   r\   r]   r^   Zarbor_wiringZarbor_delayrd   Zclosest_alpharF   r   r'   re   r   r   r   arbor_dist_loc  s    rg   c                 C   sT   t | t |ksttd}tt | D ]&}| | }|| }|| }t||}q(|S )Nz-inf)r   r   rB   rangemax)rM   p2Z	max_ratioiZcoord1Zcoord2ratior   r   r   point_dist_scale  s    rm   c                 C   s>   t d}t||D ]&\}}t||f| |f}||k r|}q|S ra   )rB   rb   rm   rc   r   r   r   pareto_dist_scale!  s    rn   c                 C   sZ   t | \}}td}d }t|||D ],\}}	}
t|	|
f||f}||k r$|}|}q$||fS ra   )r*   rB   rb   rm   rf   r   r   r   arbor_dist_loc_scale+  s    ro   c                 C   s6   |D ],}t | |}t|d|| | jd f d qd S )N%s/%srZ   )outdir)r[   
draw_arborr   )r   
pathPrefixr\   rq   rF   r_   r   r   r   	viz_trees9  s    
rt   c           	      C   s   | j d }tjd|t |f dd}|jdddd d|d	< tjd|t |f dd}||}||d	 d
k }t  t	j
ddd	|d d|| |f }td|  td||f  dS )az  
    wiring_costs, conduction_delays = pareto_front(G, alphas=alphas)

    arbor_wiring, arbor_delay = pareto_costs(G)
    sns.set()
    pylab.figure()
    pylab.plot(wiring_costs, conduction_delays, color='b')
    pylab.scatter(wiring_costs, conduction_delays, color='b')
    pylab.scatter(arbor_wiring, arbor_delay, marker='x', color='r')
    pylab.xlabel('wiring cost')
    pylab.ylabel('conduction delay')
    pylab.tight_layout()
    plot_dir = '%s/%s' % (outdir, G.graph['arbor name'])
    os.system('mkdir -p %s' % plot_dir)
    pylab.savefig('%s/%s-pareto-front.pdf' % (plot_dir, G.graph['arbor name']))
    pylab.close()
    rZ   z	%s/%s.csvT)skipinitialspacerF   rA   )axisinplacezPareto frontmodelrandomzwiring costzconduction delay)xyhuedatarp   zmkdir -p %sz%s/%s-pareto-front.pdfN)r   pdread_csvPARETO_FRONTS_DIRdropNULL_MODELS_DIR_appendpylabfiguresnsZscatterplotossystemsavefig)	r   rs   r\   rq   
arbor_namer`   Z
tree_costsZ
scatter_dfZplot_dirr   r   r   	viz_front>  s    

r   c                  C   s   t d} d S )Nz001_1_C_day5.csvr   )r   r   r   r   maino  s    r   __main__)/__doc__mathr   utilsnetworkxnxscipy.spatial.distancer   numpynpread_arbor_reconstructionr   new_constantsr   r   r	   collectionsr
   seabornr   r   pandasr~   r   r(   r*   r1   r5   r8   r;   r<   r?   rQ   rY   r[   DEFAULT_ALPHASr`   re   rg   rm   rn   ro   FRONT_DRAWINGS_DIRrt   r   r   __name__r   r   r   r   <module>   sF   	&$	

1
