
    oGj                    x    d Z ddlmZ ddlmZmZ e G d d                      Zd"dZd#dZd$dZ	d%dZ
d&d Zd!S )'uO   Scoring engine — чистий Python, нуль Streamlit/DB імпортів.    )annotations)	dataclassfieldc                  d    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<    ee          Zded<   dS )ScoringResultdict[int, float]class_indicesfloatoverall_index
int | Nonecertification_levelboolhas_criticalz	list[int]nonconformity_req_ids)default_factoryzdict[int, bool]req_metN)__name__
__module____qualname____annotations__r   dictr        engine/scoring.pyr   r      sl         ########$$$$$uT:::G::::::r   r   operatorstrvalueobject	thresholdreturnr   c                   | xdk    r! t          |          t          |          k    S xdk    r! t          |          t          |          k    S xdk    r! t          |          t          |          k    S dk    rDt          |                                          t          |                                          k    S 	 t          d|           )u\   §С.3.7: порівняння значення з порогом за оператором.z>=z<==zyes-nozUnknown operator: )r
   r   lower
ValueError)r   r   r   s      r   dispatch_operatorr%      s    
TTTT<<5#3#333TTTT<<5#3#333SSSSu::Y//XXu::##%%Y)=)=)?)???>(>>???r   requirementslistresults_by_reqdict[int, str]r   c                   i }i | D ]}|j         }|                    |d          dz   ||<   |                    |j                  }|6	 t          |j        ||j                  }n# t          t          f$ r d}Y nw xY wd}                    |d          |rdndz   |<   fd|                                D             S )uh   §С.3.8: невагований індекс відповідності по кожному класу.r      NFc                V    i | ]%\  }}|d k    |                     |d           |z  &S )r   )get).0cidtotalmetss      r   
<dictcomp>z)compute_class_indices.<locals>.<dictcomp>5   sC       C199 	TXXc1%99r   )	class_idr-   idr%   r   r   r$   	TypeErroritems)r&   r(   totalsreqr/   rawmetr1   s          @r   compute_class_indicesr;       s    
  FD 9 9ljja((1,s  ((?'c3=II	*    CHHS!$$Sa8S		    ,,..   s   
A&&A<;A<class_scopeclass_id_by_codedict[str, int]set[int]c                    |                                                                  dk    r!t                                                    S d |                     d          D             }fd|D             S )NALLc                6    g | ]}|                                 S r   )strip)r.   cs     r   
<listcomp>z$_scope_class_ids.<locals>.<listcomp>?   s     7771QWWYY777r   ,c                (    h | ]}|v |         S r   r   )r.   rD   r=   s     r   	<setcomp>z#_scope_class_ids.<locals>.<setcomp>@   s*    HHHA!7G2G2GQ2G2G2Gr   )rC   uppersetvaluessplit)r<   r=   codess    ` r   _scope_class_idsrN   <   s|      ""e++#**,,---77 1 1# 6 6777EHHHHHHHHr   r	   r   r
   r   levelsr   c                     |rdS t          |d d          D ]Kt          j        |          }t           fd|D                       }|j        k    }|r|r	j        c S LdS )u~   §С.4.6: двовимірний вибір рівня; критична НВ жорстко обмежує до рівня 1.r+   c                    | j         S )Nlevel)lvs    r   <lambda>z,select_certification_level.<locals>.<lambda>N   s    RX r   T)keyreversec              3  V   K   | ]#}                     |d           j        k    V  $dS )        N)r-   class_min_index)r.   r/   r	   lvls     r   	<genexpr>z-select_certification_level.<locals>.<genexpr>P   sO       
 
 c3''3+>>
 
 
 
 
 
r   N)sortedrN   r<   alloverall_min_indexrS   )	r	   r   r   rO   r=   	scope_idsclass_ok
overall_okr[   s	   `       @r   select_certification_levelrc   C   s      qf"5"5tDDD  $S_6FGG	 
 
 
 
 
 
 
 
 
 
 #c&;;
 	
 	94r   c                   i }| D ]`}|                     |j                  }|6	 t          |j        ||j                  }n# t
          t          f$ r d}Y nw xY wd}|||j        <   at          | |          }t          |           }	|	dk    r$t          |
                                          |	z  nd}
d}|r't          d |D             |d                   }|j        }g }d}| D ]=}|j        r4||j                 s'|                    |j                   |j        |k    rd}>t!          ||
|||          }t#          ||
||||          S )	uZ   Повний цикл розрахунку: §С.3.7 → §С.3.8 → §С.4.6 → §С.5.NFr   rY      c              3  0   K   | ]}|j         d k    |V  dS )r+   NrR   )r.   rT   s     r   r\   z&evaluate_assessment.<locals>.<genexpr>w   s(      ::BBHMMRMMMM::r   T)r	   r   r   r   r   r   )r-   r4   r%   r   r   r$   r5   r;   lensumrK   nextcritical_threshold	mandatoryappendcriticalityrc   r   )r&   r(   rO   r=   r   r8   r9   r:   r	   r0   r   rj   lvl1r   r   
cert_levels                   r   evaluate_assessmentrp   [   s     "G 	 	  ((?'c3=II	*    C *,GGME5:QYYC(())E11CM  5::&:::F1IFF!4 (*L $ $= 	$ 	$!((000"444# ,}lF<L J ##&!3   s   A  AAN)r   r   r   r   r   r   r    r   )r&   r'   r(   r)   r    r   )r<   r   r=   r>   r    r?   )r	   r   r   r
   r   r   rO   r'   r=   r>   r    r   )
r&   r'   r(   r)   rO   r'   r=   r>   r    r   )__doc__
__future__r   dataclassesr   r   r   r%   r;   rN   rc   rp   r   r   r   <module>rt      s    U U " " " " " " ( ( ( ( ( ( ( ( ; ; ; ; ; ; ; ;@ @ @ @   8I I I I   04 4 4 4 4 4r   