
    Ng                        d dl mZ d dlmZmZ d dlmZmZmZ d dl	Z
d dlmZ 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  G d	 d
e          Z G d de          Z G d de          Z G d de          ZdS )    )annotations)ABCabstractmethod)AnyListcastN)Image)ElementType)grow_region_to_match_regionintersections)LayoutElementLayoutElementsclean_layoutelementspartition_groups_from_regionsseparatec                  N    e Zd ZdZd Zed
d            Zd
dZed             Zd	S )UnstructuredModelz:Wrapper class for the various models used by unstructured.c                    d| _         dS )zmodel should support inference of some sort, either by calling or by some method.
        UnstructuredModel doesn't provide any training interface, it's assumed the model is
        already trained.
        N)model)selfs    k/var/www/html/ai-engine/env/lib/python3.11/site-packages/unstructured_inference/models/unstructuredmodel.py__init__zUnstructuredModel.__init__   s    
 


    xr   returnc                2    | j         t          d          dS )%Do inference using the wrapped model.NzwModel has not been initialized. Please call the initialize method with the appropriate arguments for loading the model.)r   ModelNotInitializedErrorr   r   s     r   predictzUnstructuredModel.predict!   s*     :*?   	r   c                ,    |                      |          S z(Inference using function call interface.)r    r   s     r   __call__zUnstructuredModel.__call__+   s    ||Ar   c                    dS )zLoad the model for inference.N )r   argskwargss      r   
initializezUnstructuredModel.initialize/   s	     	r   N)r   r   r   r   )	__name__
__module____qualname____doc__r   r   r    r#   r(   r%   r   r   r   r      sx        DD      ^      ^  r   r   c                       e Zd ZdZed fd            Zd fdZe	 ddd            Zee	j
        fdd            Z	 dddZ xZS ) UnstructuredObjectDetectionModelz?Wrapper class for object detection models used by unstructured.r   r	   r   $LayoutElements | list[LayoutElement]c                J    t                                          |           g S r   superr    r   r   	__class__s     r   r    z(UnstructuredObjectDetectionModel.predict8         		r   r   c                F    t                                          |          S r"   r3   r#   r4   s     r   r#   z)UnstructuredObjectDetectionModel.__call__>       ww"""r   333333?elementsList[LayoutElement]iom_to_mergefloatc                    d  D             }t          | }t          |          D ]\  }          rt          j        |          d         }||k             }t	          |          dk    rKt	          |          dk    r5 fd|D             }|                    d d           fd|D             }|D ])} |                    |         }j                            |j                  }	j                            |j                  }
|j                            j                  }|
r|sd	 <   |r|
sd	 |<   |	rj        	                    |j                  }||k     rt          j        |j                   ωj        j        |j        j        k    r!t          j        |j                   d	 |<   
t          |j        j                   d	 <   +d
  D               S )zThis function traverses all the elements and either deletes nested elements,
        or merges or splits them depending on the iom score for both regionsc                    g | ]	}|j         
S r%   )bbox).0els     r   
<listcomp>zDUnstructuredObjectDetectionModel.enhance_regions.<locals>.<listcomp>I   s    ,,,R,,,r   r      c                n    g | ]1}|         
|j                             |         j                   f2S N)rA   intersection_over_minimum)rB   jr;   firsts     r   rD   zDUnstructuredObjectDetectionModel.enhance_regions.<locals>.<listcomp>V   sI     $ $ $#A;2 EJ@@!AQRRS222r   c                    | d         S )NrE   r%   )r   s    r   <lambda>zBUnstructuredObjectDetectionModel.enhance_regions.<locals>.<lambda>\   s
    ad r   Tkeyreversec                8    g | ]}|d          k    |d          S )r   r%   )rB   r   is     r   rD   zDUnstructuredObjectDetectionModel.enhance_regions.<locals>.<listcomp>_   s&    'P'P'Padaii!iiir   Nc                    g | ]}||S rG   r%   )rB   es     r   rD   zDUnstructuredObjectDetectionModel.enhance_regions.<locals>.<listcomp>~   s    999!1=A===r   )r   	enumeratenpwherelensortrA   intersectionis_inrH   r   arear   )r;   r=   rectsintersections_mtxrowindices_to_checkiom_to_checkrI   secondrY   first_inside_secondsecond_inside_firstiomrJ   rQ   s   `            @@r   enhance_regionsz0UnstructuredObjectDetectionModel.enhance_regionsB   sq    -,8,,,)51 122 0	3 0	3FAsQKE .3#%8C==#3 #34D4I#J '((A--'((1,,$ $ $ $ $!1$ $ $L
 !%%*N $ &    (Q'P'P'Pl'P'P'P$) 3 3A{*hqk.A %a[F#(:#:#:$ $L +0**:*:6;*G*G'*0+*;*;EJ*G*G'* 33F 3&*, 35H 3&*% 3#jBB6;OO--$UZ====
  %z1AAA ;EJ T T T.2 ;FK T T T.299x999r   list[LayoutElement]c                   fd| D             fd| D             }t                    dk    st          |          dk    r| S                     d d           |                    d d           D ]*fdD             }|D ]}                    |           +t          fd	|          }t	          |          }|                               |                    d
            |S )zkAfter this function, the list of elements will not contain any element inside
        of the type specifiedc                *    g | ]}|j         k    |S r%   typerB   rS   type_to_cleans     r   rD   z?UnstructuredObjectDetectionModel.clean_type.<locals>.<listcomp>   s%    JJJ!&M2I2I12I2I2Ir   c                *    g | ]}|j         k    |S r%   ri   rk   s     r   rD   z?UnstructuredObjectDetectionModel.clean_type.<locals>.<listcomp>   s%    III=1H1H!1H1H1Hr   r   c                    | j         j        S rG   rA   r[   rS   s    r   rL   z=UnstructuredObjectDetectionModel.clean_type.<locals>.<lambda>   s
    16; r   TrM   c                    | j         j        S rG   ro   rp   s    r   rL   z=UnstructuredObjectDetectionModel.clean_type.<locals>.<lambda>   s
    !&+ r   c                ^    g | ])}|j                             j                   r|k    '|*S r%   rA   is_almost_subregion_of)rB   rS   elements     r   rD   z?UnstructuredObjectDetectionModel.clean_type.<locals>.<listcomp>   sH       600>> DE<< CO<<r   c                >     t           fdD                        S )Nc              3  V   K   | ]#}j                             |j                   V  $d S rG   rs   )rB   targetrS   s     r   	<genexpr>zPUnstructuredObjectDetectionModel.clean_type.<locals>.<lambda>.<locals>.<genexpr>   sF        ?E--fk::     r   )any)rS   target_elementss   `r   rL   z=UnstructuredObjectDetectionModel.clean_type.<locals>.<lambda>   s=    #    IX      r   c                    | j         j        S rG   )rA   y1rp   s    r   rL   z=UnstructuredObjectDetectionModel.clean_type.<locals>.<lambda>   s
    !&) r   )rN   )rW   rX   removefilterlistextend)r;   rl   other_elementscontains	containedfinal_elementsru   r{   s    `    @@r   
clean_typez+UnstructuredObjectDetectionModel.clean_type   sv    KJJJhJJJIIIIXIII1$$N(;(;q(@(@O 	!6!6EEE 5 5tDDD ' 	2 	2G   (  H
 & 2 2	&&y11112      	
 
 n--o... 	 3 3444r      min_text_sizeintc                    t          |          dk    r|S g }t          t          t                   t	          |                    }|D ]$}|                    t          |                     %t          j        |          S )z3Deletes overlapping elements in a list of elements.rE   )rW   r   r   r   r   appendr   concatenate)r   r;   r   cleaned_elementsgroupsgroups         r   deduplicate_detected_elementsz>UnstructuredObjectDetectionModel.deduplicate_detected_elements   s     x==AO d>*,I(,S,STT 	A 	AE##$8$?$?@@@@)*:;;;r   )r   r	   r   r/   )r   r	   r   r   )r:   )r;   r<   r=   r>   r   r<   )r;   rf   r   r<   )r   )r;   r   r   r   r   r   )r)   r*   r+   r,   r   r    r#   staticmethodre   r
   TABLEr   r   __classcell__r5   s   @r   r.   r.   5   s        II     ^
# # # # # #  "< < < < \<|  "'& & & & \&V  < < < < < < < < <r   r.   c                  @     e Zd ZdZed fd            Zd fdZ xZS )	"UnstructuredElementExtractionModelz@Wrapper class for object extraction models used by unstructured.r   r	   r   r<   c                J    t                                          |           g S r1   r2   r4   s     r   r    z*UnstructuredElementExtractionModel.predict   r6   r   c                F    t                                          |          S r"   r8   r4   s     r   r#   z+UnstructuredElementExtractionModel.__call__   r9   r   )r   r	   r   r<   )r)   r*   r+   r,   r   r    r#   r   r   s   @r   r   r      sk        JJ     ^
# # # # # # # # # #r   r   c                      e Zd ZdS )r   N)r)   r*   r+   r%   r   r   r   r      s        Dr   r   )
__future__r   abcr   r   typingr   r   r   numpyrU   	PIL.Imager	    unstructured_inference.constantsr
   )unstructured_inference.inference.elementsr   r   .unstructured_inference.inference.layoutelementr   r   r   r   r   r   r.   r   	Exceptionr   r%   r   r   <module>r      s   " " " " " " # # # # # # # # " " " " " " " " " "           8 8 8 8 8 8                           <F< F< F< F< F<'8 F< F< F<R# # # # #): # # #	 	 	 	 	y 	 	 	 	 	r   