o
    toi.$                     @  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	 er$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)TYPE_CHECKINGN)OpRunAiOnnxMl)Callablec                   @  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   `/home/ubuntu/.local/lib/python3.10/site-packages/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   NONESOFTMAXLOGISTICSOFTMAX_ZERO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                   @  s6   e Zd ZdddZdddZddddZdddZdS )Leafweightfloat	target_idintreturnNonec                 C  s   || _ || _d S N)r&   r(   )selfr&   r(   r   r   r   __init__(   s   
zLeaf.__init__x
np.ndarrayc                 C  s   t | j| jgS r,   )nparrayr&   r(   r-   r/   r   r   r   predict-   s   zLeaf.predictr   prefixlistindentc                 C  s(   | d| d| j d| j d  d S )N zLeaf WEIGHT: z
, TARGET: 
)appendr&   r(   r-   r5   r7   r   r   r   _print0   s   zLeaf._printstrc                 C     g }|  | d|S N r<   joinr-   r5   r   r   r   __repr__5      

zLeaf.__repr__N)r&   r'   r(   r)   r*   r+   )r/   r0   r*   r0   r   r5   r6   r7   r)   r*   r+   r*   r=   )r   r   r   r.   r4   r<   rD   r   r   r   r   r%   '   s
    

r%   c                   @  sX   e Zd ZU ded< ded< ded< ded< d!ddZd"ddZd#d$ddZd%ddZd S )&Nodez+Callable[[float, float | set[float]], bool]compareNode | Leaftrue_branchfalse_branchr)   featuremoder   valuefloat | set[float]missing_tracks_trueboolr*   r+   c                   s   |t jkr fdd| _nY|t jkr fdd| _nJ|t jkr- fdd| _n;|t jkr< fdd| _n,|t jkrK fdd| _n|t jkrZ fdd| _n|t jkrh fdd| _|| _	| _
 | _d S )	Nc                   s&   |     kpot|     S r,   itemr1   isnanr/   rN   rR   rP   r   r   <lambda>I       zNode.__init__.<locals>.<lambda>c                   s&   |     k pot|     S r,   rT   rW   rX   r   r   rY   M   rZ   c                   s&   |     kpot|     S r,   rT   rW   rX   r   r   rY   Q   rZ   c                   s&   |     kpot|     S r,   rT   rW   rX   r   r   rY   U   rZ   c                   s&   |     kpot|     S r,   rT   rW   rX   r   r   rY   Y   rZ   c                   s&   |     kpot|     S r,   rT   rW   rX   r   r   rY   ]   rZ   c                   s&   |     v pot|     S r,   rT   rW   rX   r   r   rY   a   rZ   )r   r   rJ   r   r    r!   r"   r#   r$   rO   rP   rN   )r-   rO   rP   rN   rR   r   rX   r   r.   A   s"   







zNode.__init__r/   r0   r'   c                 C  s"   |  |r| j|S | j|S r,   )rJ   rL   r4   rM   r3   r   r   r   r4   h   s   
zNode.predictr   r5   r6   r7   c              
   C  sT   | d| d| j d| j d| j d  | j||d  | j||d  d S )Nr8   z
Node CMP: z	, SPLIT: z, FEATURE: r9   r   )r:   rO   rP   rN   rL   r<   rM   r;   r   r   r   r<   m   s   zNode._printr=   c                 C  r>   r?   rA   rC   r   r   r   rD   u   rE   zNode.__repr__N)
rO   r   rP   rQ   rN   r)   rR   rS   r*   r+   )r/   r0   r*   r'   rF   rG   rH   )r   r   r   __annotations__r.   r4   r<   rD   r   r   r   r   rI   ;   s   
 

'rI   c                   @  s&   e Zd ZejejddddfddZdS )TreeEnsembleNc                    s  |d u rt dd D rtdnt| tdd D kr&td|d ur.t|nd d	
fdd	g }|D ]}
| oW| oW| | k}||| qF fd
d|D }tdd |D ddi\}}tj|dd}tj|dd	tj
}|tjtjfv rtjt |f jd}n2|tjkrtt |ft jj}n|tjkrtt |ft jj}ntd|dtt||ddD ]\}\}}|d}|d}|tjkrt||ddD ]\}}|||f  |7  < qq|tjkr)t||ddD ]\}}|||f  |t| 7  < qq|tjkrJt||ddD ]\}}t|||f ||||f< q6q|tjkrkt||ddD ]\}}t|||f ||||f< qWqtd|d|fS )Nc                 s  s    | ]}|t jkV  qd S r,   )r   r$   .0rO   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$   r]   r   r   r   r_      s    
z;Must specify membership values for all set membership nodesr*   rK   c                   s   |rt |  |  S |  tjkrDt }t }r0t|s0|| t }r0t|r t|  ||  d ur@|  nd}nt|  |  |  d urV|  nd} 
|  	|  |_	 |  |  |_
|S )NF)r%   r   r$   setnextr1   rV   addrI   rL   rM   )current_node_indexis_leafset_members
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   rh      sL   
z%TreeEnsemble._run.<locals>.build_nodec                   s   g | ]}t j|jd  dqS )r   )axisarr)r1   apply_along_axisr4   )r^   tree)Xr   r   
<listcomp>   s    z%TreeEnsemble._run.<locals>.<listcomp>c                 S  s   g | ]
}t j|d ddqS )r	   r   rt   )r1   split)r^   r/   r   r   r   ry      s    strictFr   rz   )dtypezaggregate_transform=z not supported yet.)r|   )r*   rK   )any
ValueErrorr1   rV   sumiterr:   zipconcatenateastypeint64r   r   r   zeroslenr}   r   fullfinfomaxr   minNotImplementedError	enumeratereshape) r-   rx   rp   rm   ro   rr   rl   rq   rk   ri   rj   
tree_rootspost_transformaggregate_functionnodes_hitratesrn   membership_values	n_targetstrees
root_indexrd   
raw_valuesweights
target_idsresult	batch_numwtr&   r(   rP   tidr   )rx   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   r   _run|   s   
$.


 
 


 
zTreeEnsemble._run)r   r   r   r   r   r   r   r   r   r   r   r   r\   {   s    r\   )
__future__r   enumr   typingr   numpyr1   ,onnx.reference.ops.aionnxml._op_run_aionnxmlr   collections.abcr   r   r   r   r%   rI   r\   r   r   r   r   <module>   s    
@