o
    toiv,                     @  s   d dl mZ d dlZd dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ dd Zdd	 Zd
d Zdd ZG dd deZdS )    )annotationsN)compute_logisticcompute_probitcompute_softmax_zerologisticsoftmaxsoftmax_zero)OpRunAiOnnxMl)	SVMCommonc                 C  s  t d| }tj| | f|jd}tj| f|jd}tj| f|jd}d|  }t| D ]Y}d|  ||< |d ||f d  |||f< |d ||f ||d |f< |||f  ||d d |f d  7  < ||d d |f  |||d d f  |||d d f< q)t|D ]|}|| |d d < ||  }	d}
t| D ]}t|| |	 }t ||
}
q|
|k r |S t| D ]I}||  |	 |||f  }||  |7  < |	|||||f  d||     d| d  }	|d|  }||||d d f   d|  |d d < qq|S )Nd   dtypeg{Gzt?g      ?      r   )maxnpemptyr   rangesumabs)kRmax_iterQQpPepst_pQp	max_errorerrordiff r#   a/home/ubuntu/.local/lib/python3.10/site-packages/onnx/reference/ops/aionnxml/op_svm_classifier.pymulticlass_probability   s:   
 ,<	0*r%   c                 C  s   | | | }dt | S )Nr   )r   )scoreprobaprobbvalr#   r#   r$   sigmoid_probability9   s   r*   c                 C  s  | dkr1|dkrdd |D }t j||jdS |dkrt|S |dkr't|S |dkr/t|S |S | d	kr|dkrFt jt|d
 g|jdS |dv rZt jd	|d
  |d
 g|jdS |dv r|dkrut jt|d
  t|d
 g|jdS |dkrtt j|d
  |d
 g|jdS |dkrtt j|d
  |d
 g|jdS |dkrtd|dt j|d
  |d
 g|jdS t j|d
 g|jdS t	d|  d)Nr   PROBITc                 S  s   g | ]}t |qS r#   )r   ).0r&   r#   r#   r$   
<listcomp>B       z write_scores.<locals>.<listcomp>r   LOGISTICSOFTMAXSOFTMAX_ZEROr   r   )r   r   )r      zpost_transform=z not applicable here.z
n_classes=z not supported.)
r   arrayr   r   r   r   r   r   RuntimeErrorNotImplementedError)	n_classesscorespost_transformadd_second_classresr#   r#   r$   write_scores?   sD    "
r;   c                 C  sl   d}t |dkr*d}|s$|r| dkr|d |fS | dkr$|s$|| |fS || |fS | dkr2||fS ||fS )Nr   g      ?r   r   )len)
max_weightmaxclass	has_probaweights_are_all_positive_classlabelsposclassnegclasswrite_additional_scoresr#   r#   r$   set_score_svmd   s   	rF   c                   @  sL   e Zd Zdd Zdd Zdd Zdd Z																						dd
dZd	S )SVMClassifierc           	      C  sR   g }t |D ]}| j||| |}| jjjd | }|| qtj||jdS )Nr   r   )	r   _svm
kernel_dotattsrhoappendr   r3   r   )	selfXcoefsclass_count_kernel_type_r7   jdr&   r#   r#   r$   _run_linear|   s   zSVMClassifier._run_linearc              	     sH  d} fddt |D }	t|	}
tj|f jd}g }t |D ]u}|| }jjj| }t |d |D ]`}|| }jjj| }t||d ||| f |
|||  }t||||| f |
|||  }jjj	| | | }|
| |dkr||  d7  < n||  d7  < |d7 }q8q$|tj| jdfS )Nr   c                   s    g | ]}j  | qS r#   )rH   rI   )r,   rR   rN   rQ   rM   svr#   r$   r-      s    z*SVMClassifier._run_svm.<locals>.<listcomp>r   r   )r   r   r3   zerosr   rH   rJ   vectors_per_classdotrK   rL   )rM   rN   rV   vector_count_rQ   rP   starting_vector_rO   evalskernels_listkernelsvotesr7   isi_i
class_i_scrR   si_j
class_j_scs1s2sr#   rU   r$   _run_svm   s:   


zSVMClassifier._run_svmc           	      C  s   t j||f|jd}d}t|D ]:}t|d |D ]0}t|| | jjj| | jjj| }t	|d}t
|d}||||f< d| |||f< |d7 }qqt||S )Nr   r   r   gHz>gP?)r   rW   r   r   r*   rH   rJ   prob_aprob_br   minr%   )	rM   r7   rP   probsp2indexr`   rR   val1val2r#   r#   r$   _probabilities   s    



zSVMClassifier._probabilitiesc                 C  s   d}|d urt |dkrt|}|| }n	t|}|| }d}| jjjjdkr6t|||||dd\}	}n|d urEt |dkrE|| }	n|}	t|j|| jjj	|}
|	|
fS )Nr   r<   r   )
r=   r   argmaxrH   rJ   rK   sizerF   r;   r8   )rM   r_   r7   rA   r@   classlabels_intsr>   	max_classrE   label
new_scoresr#   r#   r$   _compute_final_scores   s6   



	
z#SVMClassifier._compute_final_scoresNc           "        s"  t ||||||	|
||d	}|| _d}tt|p pg d}g }|jjd ur5|jjD ]}|| ||7 }q)|dkrRd}|jj|df}|jj	}|jj
d|f}nd}d}|jj
|df}t|jj
dk}|dkr|dkrtj|jd |f|jd}t|jd D ]}| || |||}|||d d f< qd }nItj|jd ||d  d	 f|jd}tj|jd |f|jd}t|jd D ]!}| || ||||||\}}|||d d f< |||d d f< q|jjd ur$t|jjdkr$|dkr$tj|jd |f|jd}t|jd D ]}| || |}|||d d f< qd
}n|}d}d }g }t|jd D ]9}| |d u r>d n|| || |||\} }!|d u r^tj|jd |!jf|jd}|!||d d f< ||  q3 d urt dkrt fdd|D |fS tj|tjd|fS )N)	coefficientskernel_paramskernel_typer8   ri   rj   rK   support_vectorsrX   r   r   SVM_SVCr<   
SVM_LINEARLINEARr   r   TFc                   s   g | ]} | qS r#   r#   )r,   r`   classlabels_stringsr#   r$   r-   L  r.   z&SVMClassifier._run.<locals>.<listcomp>)r
   rH   r   r=   rJ   rX   rL   r{   reshaperz   rx   rk   r   r   shaper   r   rT   rh   ri   rp   rw   rr   r3   int64)"rM   rN   rs   r   rx   ry   rz   r8   ri   rj   rK   r{   rX   svmrZ   rP   r[   vcmoderV   rQ   rO   rA   r:   nr7   r_   voterg   r@   final_scoreslabelsru   rv   r#   r   r$   _run   s   

	

zSVMClassifier._run)NNNNNNNNNNN)__name__
__module____qualname__rT   rh   rp   rw   r   r#   r#   r#   r$   rG   {   s"    &&rG   )
__future__r   numpyr   .onnx.reference.ops.aionnxml._common_classifierr   r   r   r   r   r   ,onnx.reference.ops.aionnxml._op_run_aionnxmlr	   )onnx.reference.ops.aionnxml.op_svm_helperr
   r%   r*   r;   rF   rG   r#   r#   r#   r$   <module>   s    %%