U
    $f                     @   s   d dl Zd dlZd dlmZ d dlZd dlm	Z	m
Z
mZ d dlT d dlmZ d dlZd dlZd dlZd dlZdd Zdd	 Zd
d ZdddZdddZdd Zdd Zdd Zedkre  dS )    N)defaultdict)toy_networktoy_network2
draw_arbor)*)read_arbor_fullc                 C   s*   d}|D ]\}}|| | | d 7 }q|S Nr   length )Gmain_root_segmentstotal_lengthuvr
   r
   i/home/dh_an3skk/arjun-chandrasekhar-teaching.com/tomato/backend/backend_plant_architecture/null_models.pyget_main_root_length   s    r   c                 C   s   t |}tttjd|||}tt}d}|D ]\}}	| | |	 d }
t	||	}||
7 }t |dkr2|d d |kr2|
d\}}|||
  }||
kst||
 }t|||}|||	f |||f q^q2|S r   )lensortedzipnprandomuniformr   listomslope_vectorpopAssertionErrormidpointappend)r   r   lateral_root_tipsmain_root_lengthZntipsoffsets	midpointsr   r   r   r	   slopeoffsetlateral_rootZrelative_offsetdeltar   r
   r
   r   get_random_midpoints   s     r'   c                 C   sZ   t | }d| jd  |jd< t |}t |}t||}t||||}t || |S )Nz%s-random-arbor
arbor name)pfstarting_graphgraphget_lateral_root_tipsget_main_root_segmentsr   r'   connect_to_midpoints)r   Rr   r   r    Zrandom_midpointsr
   r
   r   random_arbor+   s    



r0   r   c                 C   s   | dkrt S d S )Nr   )r0   methodr
   r
   r   get_null_function;   s    r3      c              	   C   s   |d krdg}d|t  | jd f }tj| }t|d}|rn|d t| \}}|dd||f  |D ]F}	t	|	d}
t
|D ].}|
| }t|\}}|d|	||f  qqrW 5 Q R X d S )	Nr   z	%s/%s.csvr(   az%model, wiring cost, conduction delay
z%s, %f, %f
arborr1   )NULL_MODELS_DIRr+   ospathexistsopenwriter)   pareto_costsr3   range)r   
pathPrefixmethodsZntrialstree_costs_file
first_timefwiringdelayr2   Znull_model_funciNr
   r
   r   null_comparisonB   s    

rH   c                 C   s<   t | t D ](}td t| t|| }t||  qd S )Nz:analyzing null models, creating null models for comparison)r8   listdirRECONSTRUCTIONS_DIRprintr   rH   )r?   Zreconstructionr   r
   r
   r   analyze_null_modelsX   s
    
rL   c              
   C   s  d| t   }t|d}|d t| t D ]}|d}td t| d| t |f }d| t |f }t	j
|dd}t	j
|dd}|d	 }	|d
 }
t|d |d	 |d
 D ]@\}}}t|||	|
}t|||	|
}|d||||f  qq0W 5 Q R X d S )Nz%s/models.csvwzHarbor name, model, pareto front distance, pareto front scaling distance
z.csvz-writing null models files from null_models.pyz%s/%sT)skipinitialspacezwiring costzconduction delaymodelz%s, %s, %f, %f
)STATISTICS_DIRr;   r<   r8   rI   r7   striprK   PARETO_FRONTS_DIRpdread_csvr   r)   pareto_distpareto_dist_scale)r?   Zmodels_fnameZmodels_fileZ
arbor_file
arbor_namerA   Zpareto_front_file
tree_costspareto_front
opt_wiring	opt_delayrO   Zmodel_wiringZmodel_delay	null_distZnull_dist_scaler
   r
   r   write_null_models_file_   s.    


 r]   c                  C   sL   t  } | jdddd | jdddd |  }|jr<t  |jrHt  d S )Nz-az	--analyze
store_true)actionz-wz--write)argparseArgumentParseradd_argument
parse_argsanalyzerL   r<   r]   )parserargsr
   r
   r   main|   s    rg   __main__)r   )Nr4   )numpyr   pareto_functionsr)   collectionsr   optimal_midpointr   utilsr   r   r   new_constantsread_arbor_reconstructionr   pandasrS   r8   r   r`   r   r'   r0   r3   rH   rL   r]   rg   __name__r
   r
   r
   r   <module>   s(   

