U
    qh#                     @  s   d dl mZ d dlmZ d dlmZ d dlZd dlm	Z	 G dd deZ
G dd	 d	eZG d
d deZG dd dZG dd dZG dd de	ZdS )    )annotations)IntEnum)CallableN)OpRunAiOnnxMlc                   @  s   e Zd ZdZdZdZdZdS )AggregationFunctionr            N)__name__
__module____qualname__AVERAGESUMMINMAX r   r   P/tmp/pip-unpacked-wheel-xnis5xre/onnx/reference/ops/aionnxml/op_tree_ensemble.pyr      s   r   c                   @  s    e Zd ZdZdZdZdZdZdS )PostTransformr   r   r   r	      N)r
   r   r   NONEZSOFTMAXZLOGISTICZSOFTMAX_ZEROZPROBITr   r   r   r   r      s
   r   c                   @  s(   e Zd ZdZdZdZdZdZdZdZ	dS )	Moder   r   r   r	   r         N)
r
   r   r   LEQLTGTEGTEQNEQMEMBERr   r   r   r   r      s   r   c                   @  sP   e Zd ZddddddZdddd	d
ZdddddddZddddZdS )LeaffloatintNone)weight	target_idreturnc                 C  s   || _ || _d S N)r$   r%   )selfr$   r%   r   r   r   __init__%   s    zLeaf.__init__
np.ndarrayxr&   c                 C  s   t | j| jgS r'   )nparrayr$   r%   r(   r,   r   r   r   predict*   s    zLeaf.predictr   listprefixindentr&   c                 C  s(   | d| d| j d| j d  d S )N zLeaf WEIGHT: z
, TARGET: 
)appendr$   r%   r(   r3   r4   r   r   r   _print-   s    zLeaf._printstrr&   c                 C  s   g }|  | d|S N r9   joinr(   r3   r   r   r   __repr__2   s    
zLeaf.__repr__N)r   )r
   r   r   r)   r0   r9   rA   r   r   r   r   r    $   s   r    c                   @  sv   e Zd ZU ded< ded< ded< ded< dd	dd
ddddZdddddZdddddddZddddZdS )Nodez+Callable[[float, float | set[float]], bool]compareNode | Leaftrue_branchfalse_branchr"   featurer   zfloat | set[float]boolr#   )modevaluerG   missing_tracks_truer&   c                   s   |t jkr fdd| _n|t jkr< fdd| _n|t jkrZ fdd| _nv|t jkrx fdd| _nX|t jkr fdd| _n:|t jkr fdd| _n|t jkrЇ fdd| _|| _	| _
 | _d S )	Nc                   s&   |     kp$o$t|     S r'   itemr-   isnanr,   rG   rK   rJ   r   r   <lambda>F   s   zNode.__init__.<locals>.<lambda>c                   s&   |     k p$o$t|     S r'   rL   rO   rP   r   r   rQ   J   s   c                   s&   |     kp$o$t|     S r'   rL   rO   rP   r   r   rQ   N   s   c                   s&   |     kp$o$t|     S r'   rL   rO   rP   r   r   rQ   R   s   c                   s&   |     kp$o$t|     S r'   rL   rO   rP   r   r   rQ   V   s   c                   s&   |     kp$o$t|     S r'   rL   rO   rP   r   r   rQ   Z   s   c                   s&   |     kp$o$t|     S r'   rL   rO   rP   r   r   rQ   ^   s   )r   r   rC   r   r   r   r   r   r   rI   rJ   rG   )r(   rI   rJ   rG   rK   r   rP   r   r)   >   s"    






zNode.__init__r*   r!   r+   c                 C  s&   |  |r| j|S | j|S d S r'   )rC   rE   r0   rF   r/   r   r   r   r0   e   s    
zNode.predictr   r1   r2   c              
   C  sT   | d| d| j d| j d| j d  | j||d  | j||d  d S )Nr5   z
Node CMP: z	, SPLIT: z, FEATURE: r6   r   )r7   rI   rJ   rG   rE   r9   rF   r8   r   r   r   r9   k   s    zNode._printr:   r;   c                 C  s   g }|  | d|S r<   r>   r@   r   r   r   rA   s   s    
zNode.__repr__N)r   )r
   r   r   __annotations__r)   r0   r9   rA   r   r   r   r   rB   8   s   
'rB   c                   @  s&   e Zd ZejejddddfddZdS )TreeEnsembleNc                    s  |d kr$t dd D rLtdn(t| tdd D krLtd|d k	r\t|nd dd	
fdd	g }|D ]4}
| o| o| | k}||| q fd
d|D }tdd |D  \}}tj|dd}tj|dd	tj
}|tjtjfkr>tjt |f jd}nh|tjkrjtt |ft jj}n<|tjkrtt |ft jj}ntd|dtt||D ]&\}\}}|d}|d}|tjkrt||D ]\}}|||f  |7  < qn|tjkrNt||D ]&\}}|||f  |t| 7  < q$n|tjkrt||D ]$\}}t|||f ||||f< qdnN|tjkrt||D ]$\}}t|||f ||||f< qntd|dq|fS )Nc                 s  s   | ]}|t jkV  qd S r'   )r   r   .0rI   r   r   r   	<genexpr>   s     z$TreeEnsemble._run.<locals>.<genexpr>z>Cannot have set membership node without specifying set membersc                 s  s   | ]}t |tjkV  qd S r'   )r"   r   r   rT   r   r   r   rV      s    z;Must specify membership values for all set membership nodesrD   r;   c                   s   |rt |  |  S |  tjkrtt }t }rLt|sL|| q*t|  ||  d k	rl|  nd}n*t|  |  |  d k	r|  nd} 
|  	|  |_	 |  |  |_
|S )NF)r    r   r   setnextr-   rN   addrB   rE   rF   )Zcurrent_node_indexis_leafZset_membersZ
set_membernode)
build_nodeleaf_targetidsleaf_weightsnodes_falseleafsnodes_falsenodeidsnodes_featureidsnodes_missing_value_tracks_truenodes_modesnodes_splitsnodes_trueleafsnodes_truenodeidsset_membership_iterr   r   r\      sH     

z%TreeEnsemble._run.<locals>.build_nodec                   s   g | ]}t j|jd  dqS )r   )axisZarr)r-   Zapply_along_axisr0   )rU   tree)Xr   r   
<listcomp>   s    z%TreeEnsemble._run.<locals>.<listcomp>c                 S  s   g | ]}t j|d ddqS )r   r   rh   )r-   split)rU   r,   r   r   r   rk      s     r   rl   )dtypezaggregate_transform=z not supported yet.)any
ValueErrorr-   rN   sumiterr7   zipZconcatenateZastypeZint64r   r   r   zeroslenrn   r   fullZfinfomaxr   minNotImplementedError	enumerateZreshape) r(   rj   rd   ra   rc   rf   r`   re   r_   r]   r^   Z
tree_rootsZpost_transformZaggregate_functionZnodes_hitratesrb   Zmembership_values	n_targetsZtreesZ
root_indexrZ   Z
raw_valuesweightsZ
target_idsresultZ	batch_numwtr$   r%   rJ   tidr   )rj   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   r   _runz   sv    
(.
  


"  
zTreeEnsemble._run)r
   r   r   r   r   r   r   r   r   r   r   r   rS   y   s   rS   )
__future__r   enumr   typingr   Znumpyr-   Z,onnx.reference.ops.aionnxml._op_run_aionnxmlr   r   r   r   r    rB   rS   r   r   r   r   <module>   s   
A