
    1^i7!                        d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
 e
e	e         e	e         ef         Z G d d          Ze G d d                      ZdS )	    )annotations)	dataclassfield)AnyDictListOptionalTuplec                      e Zd ZdZd	dZdS )
ConflictFinderz{
    Placeholder for your App\Services\ConflictFinder.

    Replace this with your real implementation (or inject it).
    readingDict[str, Any]therapy_payloadreturnNonec                    d S N )selfr   r   s      E/var/www/html/epic_fhir/sentinel-connect/connectors/therapy_engine.pydetect_realtimezConflictFinder.detect_realtime   s	     	    N)r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r      s2         
     r   r   c                  4   e Zd ZU  ed           Zded<    ed           Zded<    ed           Zded	<    ed
           Zded<    ed           Z	ded<    ed           Z
ded<   dZded<   	 	 d*d+dZd,dZd-d#Zd.d$Zd/d%Zd/d&Zd0d)ZdS )1TherapyEnginec                      dddddddddddddS )	N   r               ?gMbP?g?)InsulinDextroseKClHeparin	ProtamineCRRTTocilizumabABXUF_RateVasoDoseNorepiHTSr   r   r   r   <lambda>zTherapyEngine.<lambda>   s4    D D r   )default_factoryDict[str, float]therapy_basec                      ddddddddddddd	S )
N(        2         ?r!      i  )r$   r%   r&   r'   r(   r)   r-   r,   r*   r+   r.   r/   r   r   r   r   r0   zTherapyEngine.<lambda>+   s4    C C r   therapy_maxc                     i dddddddddd	d
ddd	dddddddddddd	dddd	ddddddddddddddddddd d!d"dd#d$d%dd&d'd(dd)d	ddd*d+d,dd-d'dd.dddddd	d/dd	d/dd-d0dd1d2ddd
dd2d3dd4	S )5NKg      @g      @lohiNas      IL6r   d   Pct   GlucoseF   iX  pHg      @g333333@antiXa      ?SerumLactate
Creatinineg?g      @	Platelets   INR皙?	PaO2_FiO2P   i  Tempg      A@g      D@MAPr8   n   HRr5      CVPCO       @g       @
   r9   i,  r7                 @g      2@)	BicarbonateMg2BUNUrineOutputCRPFerritinD_DimerSpO2Hbr   r   r   r   r0   zTherapyEngine.<lambda>:   s     OCs## OS$$ O 	as## O 	aq!!	 O
 	"C(( O 	S%% O 	#&& O 	q** O 	S,, O 	Bc** O 	c%% O 	Bc** O 	t4(( O 	b$$ O  	Rs##! O" 	ar""# O$ 	S$$% O( !++%%r""s++s##T**S))%%%%? O  O  O r   Dict[str, Dict[str, float]]sensor_hi_loc                     ddddddddddd
S )Nr   r          r:   )
r-   r.   r&   r/   r'   r(   r$   r)   r*   r+   r   r   r   r   r0   zTherapyEngine.<lambda>\   s,    ? ? r   zDict[str, int]	hierarchyc                 8    ddgdgdgdgdgdgdgd	d
gdgdgdgdS )N)7   Nr-   A   Z   r.   )N   r,   )r6   Nr,   )      @r_   r&   )   r"   r/   rT   rY   r$   )g@g@r)   )g?rR   r'   )Ngffffff?r(   )Nr8   r*   )Nrl   r+   )Nr\   r)   )rV   rZ   rS   r=   rA   rH   rJ   rK   rD   rF   rN   r   r   r   r   r0   zTherapyEngine.<lambda>i   s    "

 "
 #
 
 
 !
 !
 "$

 &
 
  
C$L $L r   zDict[str, List[TriggerRule]]triggersc                     dgdgddgdS )Nrq   )ru   g      @r&   rw   )NrI   r%   )rV   r=   rH   r   r   r   r   r0   zTherapyEngine.<lambda>   s/    
 
 !"
Q Q r   triggers_liteNzOptional[ConflictFinder]conflict_finderFlabsDict[str, Dict[str, Any]]vitals#Optional[Dict[str, Dict[str, Any]]]liteboolr   c                X    t          |          }|r|                    |           |r j        n j        }g }i }|                                D ]\  }}	||vr
t          ||         d                   }
|	D ]s\  }}}|d uo|
|k     }|d uo|
|k    }|s|s|r||
z
  }d}n|
|z
  }d}|                    |t          |          t          t          |                    |
||d           t|                     fd           i }|D ]}|d         }||v rt           j	        
                    |d                    }                     ||d	         |          }|||d
         |d         |d         |d	         d}|||<   |                    |d         g                               |            j        rp|                                D ][\  }}|
                    |g           }|s|D ]:} j                            ||d         |
                    d          d|           ;\|S )Nvaluelowhigh)therapydeltasevr   param	directionc                X    j                             | d         d          | d          fS )Nr   i ʚ;r   )rn   get)cr   s    r   r0   z-TherapyEngine.compute_doses.<locals>.<lambda>   s(    4>--a	lEBBQuXIN r   )keyr   r   r   r   r   )r   ratereasonr   r   r   id)namer   r   )dictupdaterz   rx   itemsfloatappendabssortr3   r   _dose_adjust
setdefaultr{   r   )r   r|   r~   r   readingsactive_triggers
candidatestherapy_by_paramr   rulesvr?   r@   r   
breach_lowbreach_highr   r   outr   tbaser   computedr   r   payloadstps   `                           r   compute_doseszTherapyEngine.compute_doses   s    /34jj 	$OOF###04G$,,$-+-
<> ,1133 	 	LE5H$$huog.//A#(  B n7R
!~8!b&" k  '!VE %IIVE &I!!&"5\\uU||,,"!*# #    . 	NNNN 	 	
 	
 	
 *, 	I 	IA)ACxx*..q!4455D$$Q'
D99D K.777 H CF'''
B77>>xHHHH  		!)!1!1  g+//b99 "  B(88!%0@TXHYHYZZ    
r   c                2    |                      |i d          S )NT)r|   r~   r   )r   )r   r|   s     r   compute_doses_lite_from_labsz*TherapyEngine.compute_doses_lite_from_labs   s    !!tBT!BBBr   r   strr   r   c                ~    t          | j                            |d                    }t          ||z  dz  d          S )Nr9   g      Y@r    )r   r;   r   round)r   r   r   ms       r   normalise_ratezTherapyEngine.normalise_rate   s;    $"&&w4455dQh%'+++r   c                    i }| j                                         D ]\  }}|D ]\  }}}||d||<   |                    | j                   |S )zq
        Return {therapy: {lo, hi}} for trigger-defined ranges,
        merged with sensor hi/lo ranges.
        r>   )rx   r   r   rj   )r   r   _paramr   r?   r@   r   s          r   get_display_rangesz TherapyEngine.get_display_ranges   ss    
 ,.!]0022 	4 	4MFE#( 4 4B&(33G4 	

4$%%%
r   c                *    t          | j                  S r   )r   r;   r   s    r   get_therapy_maxzTherapyEngine.get_therapy_max  s    D$%%%r   c                *    t          | j                  S r   )r   r3   r   s    r   get_therapy_basezTherapyEngine.get_therapy_base  s    D%&&&r   r   r   c           
         ddddddddd	                     |d
          }t          dt          ||t          |          z  z   d                    S )Ng{Gz?gQ?rG   rL   r6   r]   r#   rP   )r-   r.   r&   r/   r'   r(   r$   r)   r    r^   rm   )r   maxr   r   )r   r   r   r   gs        r   r   zTherapyEngine._dose_adjust  sd    	
 	
 #gq// 	
 3dQu%55q99:::r   )NF)r|   r}   r~   r   r   r   r   r}   )r|   r}   r   r}   )r   r   r   r   r   r   )r   ri   )r   r2   )r   r   r   r   r   r   r   r   )r   r   r   r   r3   __annotations__r;   rj   rn   rx   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r      s         &+U < < & & &L     %*E ; ; % % %K     16  G  G  1  1  1L        D !& 7 7 ! ! !I     .3U $D $D $. $. $.H $ $ $ $L 38% I I 3 3 3M     15O4444 7;	S S S S SjC C C C, , , ,   & & & &' ' ' '
; ; ; ; ; ;r   r   N)
__future__r   dataclassesr   r   typingr   r   r   r	   r
   r   r   TriggerRuler   r   r   r   r   <module>r      s    " " " " " " ( ( ( ( ( ( ( ( 3 3 3 3 3 3 3 3 3 3 3 3 3 3 HUOXe_c9:
 
 
 
 
 
 
 
 F; F; F; F; F; F; F; F; F; F;r   