a
    b@                     @   sr   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m	Z	 d dl
mZ d dlmZ G dd dZdS )    N)Plumi)Vemli)Runer)Sidatc                   @   sv   e Zd ZdddZdddZdd Zd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dd ZdS ) TrainFc                 C   st   || _ t| j | _t| j | _t| j | _t| j | _| jj	| _	d| _
d | _d| j jv rjt| j jd | _|| _d S )NFZtrain_limit_by_days)er   plumir   vemlir   runerr   sidatsig	has_errortrain_limitconfint
do_verbose)selferimpr    r   !/home/ernad/ernad/python/train.py__init__   s    
zTrain.__init__c                 C   s   | j }||jvr&td| tjd dS |j| }|| _|| _|sFi | _| j}|jd d | d | _	|jd d | d | _
|jd d | d | _|jd d | d }t| d S )	Nztrain does not see the repcode fileFmocla/.train.modelz.sutra.json.gz)r   reportprintsysstderrrepcodesutrar   dirs
train_fufi
model_fufi
sutra_fufifilerprepare)r   r!   grund_boostr   r   r   r$   r   r   r   setup    s"    

zTrain.setupc                 C   s   | j }| | | j}|j| jd }|j|}|du r>dS |jd }|jj|dd}|du rddS tj	|dk rxdS t
||gS )	z4no renew if *any* model is newer than last sent filesentNFr   z*.model)searchTd   )r   r*   r   r#   d	very_lastlast_by_mtimeospathgetsizer'   donere)r   r!   r   r   sent_dirZlast_sent_file	mocla_dir
last_modelr   r   r   r4   5   s    

zTrain.donereNc                 C   s   | j }|rtd | | | j}| j}i | _g | _t| t	j
|rt|rtd|  t	| t	j
| jrtd| d |  t	| ndS t|d| _| j|}d}d| _|D ]}|| _i | j|< d| j| d< d| j| d	< | jd
ur\t|| jkr\d| _d
| j| d< d
| j| d	< |sHtd|  d}| j rtd|  q|| | _| | qd| jjvs| jrtd| j d |   dS i | jd< d| jd d< d| jd d	< | j|}	| |	 | j |}
t	j
|
rt| j!"|
}|d
u r td|
  nRt#|}|D ]B}| j$|dd | j%d||  d  | jd d  d7  < q.ntd|
  |d
ur| &| t'| jjd t(| j }|dkrtdt)| d  | *|}| &| n2| jj+| j,d d }t--|D ]}t	| q|   dS )z=--> build the train file, only done if there is no train filezmocla: start buildtrain deletes the empty train deletes z
 based on Fwr   +1-1NTztrain skips plumis older than ztrain skips plumis from Zis_seedabletrain: z is too old for seeds
0000-00-00z%train does not have sidat vemlis, no seednote+1 
   z(train does not see external seed krikts 
grund_sizezI add z from grund.r   z/grund*).r   r   r*   r$   r%   r"   seen_papidsr'   r(   r1   r2   isfileis_emptyremoveopen
train_filer   fufisZam_i_older_than_train_limit	issuedater   daterago
plumi_fufi
feed_issuer   r   r!   finish_buildr   
sidis_fufi	add_sidisZ
krikt_fufir	   Z
build_fufiloadcheck_seen_papidswrite
feed_grundr   lenstrfind_grund_to_addr   r#   glob)r   r!   grund_papidsr   r$   r%   Zplumi_dafusZhave_i_printed_about_skiprM   rS   Zkrikt_seed_fufiZseed_vemli_fufiZ
vemli_datapapid	grund_gapZ
grund_globfufir   r   r   
build_fileH   s    














zTrain.build_filec                 C   sf   t | jdkr tdtjd dS | jr4td| j  t| j| j | jrXtd| j	  | j
  d S )Nr   z#train does not write an empty sutrar   Fztrain writes ztrain finishes building )rY   r"   r   r   r    r   r&   r'   dumpr$   rK   close)r   r   r   r   rR      s    zTrain.finish_buildc           	      C   s   t j|s(ddl}|jd| j dd t|}| j}|D ]}| j	|| |}|| }|du rt
d | j| j | j	|| |}|du rd| d| }|d	| f7 }t
|tjd
 q<| j||d | jd| d  | jd d  d7  < q<dS )zThis adds the interla seedr   Nzsidat T)shellz+train got a None sidis vemli, try to updatez
train for z no z
for sidis r   r@   rB   rC   r>   r;   rD   )r1   r2   rG   
subprocessrunr!   r'   rU   r	   Zgrepr   r   Zupdate_reportr   r    rV   rK   rW   r"   )	r   rS   re   Zpapisur!   r^   r	   rM   errorr   r   r   rT      s*    
zTrain.add_sidisc                 C   s   || j v rr|d u r2td| d tjd d| _dS |dkrNtd| d  dS td| d | tjd d| _dS | j | dS )	Ntrain sees zagain.r   TFgrund in the grund.z in )rF   r   r   r    r   append)r   r^   rA   r   r   r   rV      s    
zTrain.check_seen_papidsc                 C   s2  | j ||d | j}tj|rNt|rNtd| d  t| | 	| t
| jd tj|s| jrztd|  | 	| tj|std| tjd | jrtd|  t| jrtd	| j tjd t| j d
S | j}t||gstd| d| d dS | jr@td td|  t| t  d}d| jjv rr|| jjd d 7 }||d 7 }||7 }d| d | j }| jrt|d |  | jj||dd}|d
u rtd| d  d
S | jrtd tj| jddrtd| j d tjd t| j d
S tj
|ddd d
S ) z;--> run training, build train file only if no training filer)   r8   .r   ztrain builds ztrain could not build the r   ztrain uses ztrain has no data in Nztrain doneres z over Fzmocla: end because of errorzmocla: I delete z/usr/bin/svm-train -b 1 Zsvm_train_flags Ztrain__T)Zdo_skipr=   z
 is lockedzsvm-train doneX   )min_sizeztrain finds that the model z is empty. It deletes it.r   )r   )r*   r$   r1   r2   rG   r'   rH   r   rI   ra   clear_by_extensionr   r   r    r%   r4   r   quitr   r   r   r
   Zrun_with_lock)r   r!   r)   r$   r%   Zrunnerloggeroutr   r   r   rf      sn    






z	Train.runc                 C   s   | j }| jrtd|  d| j d }|jd d | | }tj|std| d tj	d td	| j
 d
  t| j
 tdtj	d t  t| jd}| }t|| _d| _|D ]0}| j|dd  |d | |   q| j| j dS )zfeeds issue into train fileztrain: build_file adds ro   z.json.gzr	   r   ztrain does not see z' this should have done by post_process.r   r9   rm   ztrain ends.r    r@   N)r   r   r   r   r#   r1   r2   rG   r   r    r$   rI   rs   gziprJ   rP   	readlinesr'   rU   vstringrV   decodefeed_plumi_linerstriprK   rW   )r   rM   r   end
vemli_fufiZ
plumi_fileZplumi_linesliner   r   r   rQ   (  s.    zTrain.feed_issuec                 C   s*  ddl m} || j| _ | j j}|du rHtdtjd t| j	 t
  | jjj|vrptd| jjj d | t| j j}|D ]&}||vrtd| d	 d
 tjd qt| j	d| _|D ]h}|| jv rtd| d  q| j|ddsq||vrq| jd||  d  | jd d  d7  < qdS )z'--> add only the papids in grund_papidsr   )GrundNz9train can't continue without grund vemlis, try 'grund -l'r   zsig inconsistency between z and ztrain: the requested z is not in the grund,z try to run grund -laztrain finds seen paper rj   ri   r@   z-1 rC   r>   r<   rD   T)ri   r   r   r   r   r   r    r1   rI   r$   rs   r   r	   r   	Exceptionr'   rU   rJ   rK   rF   rV   rW   r"   )r   r]   r   Zgrund_vemli_fufiZgrund_vemlisr^   r   r   r   rX   @  sJ    
zTrain.feed_grundc                 C   s|   | j }|dd }|dd  }||vrBt|d | j tjd d S | j| j |  d7  < |  j|d ||  d 7  _d S )	Nr      rx   z is not in the vemli of r   rD   rn   rC   )r|   r   rM   r   r    r"   r}   )r   r   r|   Zindicr^   r   r   r   r   i  s    zTrain.feed_plumi_linec           
      C   s
  | j   td | j| jdd ddlm} || jd| _td | jj| jd d| jd	}td
|  ddl	m
} || jd| _	| j	j|d}d}t| jjd | }g }|D ] }	||k r|d7 }q||	 qt||krtdtt| d t| tjd |S )Nztrain runs for grundTrl   r   )Mocla)r   ztrain runs grund classF)Zdo_asembr   rh   )Asemb)r`   rE   rD   zcount problem rn   r   )rK   rc   r   rf   r!   r   r   r   r   Zasembr   Zparse_side_fufir   r   rk   rY   rZ   r   r    )
r   r_   r   Z	side_fufir   Zpapwescountstartr]   r^   r   r   r   r[   w  s8    
zTrain.find_grund_to_add)F)F)N)N)F)__name__
__module____qualname__r   r*   r4   ra   rR   rT   rV   rf   rQ   rX   r   r[   r   r   r   r   r      s   


s

6)r   )r\   rz   r1   r   r'   rN   r   r   r	   r   r
   r   r   r   r   r   r   r   r   <module>   s   