§
    �Wêj~9  ã                  ó„   — d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ dadd„Zdd„Zdd„Zdd„Z G d„ d¦  «        ZdS ) é    )ÚannotationsN)ÚPool)ÚPath)ÚOptionalÚUnionÚCallableÚconfig_pathÚstrÚ
model_pathÚimf_model_pathÚfeature_set_nameÚ
input_typeúOptional[tuple]Úuse_gpuÚboolÚuse_sortÚtable_grid_model_verÚreturnÚNonec                ó:   — ddl m}  || ||||d|||¬¦	  «	        adS )z-Initialize BoxRFDGNN once per worker process.é   ©Ú	BoxRFDGNNF©	r	   r   r   r   r   Úenable_inference_cacher   r   r   N)Úonnx.BoxRFDGNNr   Ú_worker_model)	r	   r   r   r   r   r   r   r   r   s	            ú”/Users/tedpeters/Documents/Projects/Claude Projects/TPC Houses/house-viewer/.venv/lib/python3.11/site-packages/pymupdf/layout/MultiProcessWrapper.pyÚ_worker_initr      sK   € ð *Ð)Ð)Ð)Ð)Ð)Ø�IØ!,Ø!+Ø!/Ø!1Ø!+Ø!&Ø!(Ø!)Ø!5ð
ñ 
ô 
€M€M€Mó    ÚargsÚtupleútuple[int, str]c                ó¼   — | \  }}}}ddl }|                     |¦  «        }||         }t                               |||¬¦  «        }|                     ¦   «          ||fS )z¦
    Worker task: open PDF, process one page, return (page_no, markdown).

    Parameters
    ----------
    args : (pdf_path, page_no, join, skip_header_footer)
    r   N©ÚjoinÚskip_header_footer)ÚfitzÚopenr   Úto_markdownÚclose©	r!   Úpdf_pathÚpage_nor&   r'   r(   ÚdocÚpageÚmds	            r   Ú_worker_to_markdownr2   )   sh   € ð 37Ñ/€Hˆg�tÐ/Ø€K€K€KØ�9Š9�XÑÔ€CØˆwŒ<€DÝ×$Ò$ T°ÐI[Ð$Ñ\Ô\€BØ‡I‚I�K„K€KØ�Bˆ;Ðr    c                ó¼   — | \  }}}}ddl }|                     |¦  «        }||         }t                               |||¬¦  «        }|                     ¦   «          ||fS )z·
    Worker task: open PDF, process one page, return (page_no, markdown with HTML tables).

    Parameters
    ----------
    args : (pdf_path, page_no, join, skip_header_footer)
    r   Nr%   )r(   r)   r   Úto_markdown_html_tabler+   r,   s	            r   Ú_worker_to_markdown_html_tabler5   :   sh   € ð 37Ñ/€Hˆg�tÐ/Ø€K€K€KØ�9Š9�XÑÔ€CØˆwŒ<€DÝ×/Ò/°¸4ÐTfÐ/ÑgÔg€BØ‡I‚I�K„K€KØ�Bˆ;Ðr    útuple[int, list, str]c                óò   — | \  }}}}ddl }|                     |¦  «        }||         }t                               |¦  «        }t                               |||¬¦  «        }	|                     ¦   «          |||	fS )aç  
    Worker task: open PDF, process one page, return (page_no, layout, markdown).

    predict() is called first so its result is cached internally,
    allowing to_markdown() to reuse it without redundant computation.

    Parameters
    ----------
    args : (pdf_path, page_no, join, skip_header_footer)

    Returns
    -------
    (page_no, layout, markdown)
        layout   : list of [x1, y1, x2, y2, class_name] per detected box
        markdown : markdown text for the page
    r   Nr%   )r(   r)   r   Úpredictr*   r+   )
r!   r-   r.   r&   r'   r(   r/   r0   Úlayoutr1   s
             r   Ú_worker_to_resultr:   K   s~   € ð" 37Ñ/€Hˆg�tÐ/Ø€K€K€KØ�YŠY�xÑ Ô €CØ�Œ\€DÝ×"Ò" 4Ñ(Ô(€FÝ×&Ò& t°$ÐK]Ð&Ñ^Ô^€BØ‡I‚I�K„K€KØ�F˜BÐÐr    c                  ó´   — e Zd ZdZ	 	 	 	 	 	 	 	 	 d1d2d„Zd3d„Zd„ Z	 	 	 d4d5d"„Z	 	 	 d4d5d#„Z	 	 d6d7d&„Z		 	 	 d4d8d(„Z
d9d*„Z	 d:d;d+„Z	 d:d;d,„Zd<d-„Zd.„ Zd/„ Zd0„ ZdS )=ÚMultiProcessWrapperzQ
    Wraps BoxRFDGNN for both single-page and whole-PDF parallel processing.
    Núimf+rfé   FÚV1r	   úOptional[str]r   r   r   r
   r   r   Ú	n_workersÚintr   r   r   r   r   r   c
                óâ   — ddl m}
  |
|||||d|||	¬¦	  «	        | _        || _        | j        j        | j        j        | j        j        | j        j        | j        j        |||	f| _	        d | _
        d S )Nr   r   Tr   )r   r   Ú_modelÚ
_n_workersr	   r   r   r   r   Ú_worker_argsÚ_pool)Úselfr	   r   r   r   r   rA   r   r   r   r   s              r   Ú__init__zMultiProcessWrapper.__init__o   sœ   € ð 	.Ð-Ð-Ð-Ð-Ð-ð  �iØ%0Ø%/Ø%3Ø%5Ø%/Ø%)Ø%,Ø%-Ø%9ð

ñ 

ô 

ˆŒð $ˆŒàŒKÔ#ØŒKÔ"ØŒKÔ&ØŒKÔ(ØŒKÔ"ØØØ ð	
ˆÔð &*ˆŒ
ˆ
ˆ
r    c                ó6   — | j                              |¦  «        S ©N)rD   Úis_image_page)rH   r0   s     r   rL   z!MultiProcessWrapper.is_image_page˜   s   € ØŒ{×(Ò(¨Ñ.Ô.Ð.r    c                ó(   —  | j         j        |fi |¤ŽS rK   )rD   r8   )rH   r0   Úkwargss      r   r8   zMultiProcessWrapper.predict›   s   € Ø"ˆtŒ{Ô" 4Ð2Ð2¨6Ð2Ð2Ð2r    TÚpage_or_pathúUnion[str, Path, object]r&   r'   Úprogress_callbackú$Optional[Callable[[int, int], None]]úUnion[list[str], str]c                óÀ   — t          |t          t          f¦  «        s| j                             |||¬¦  «        S |                      t          |¦  «        |||¬¦  «        S )a¬  
        Convert a page or an entire PDF to Markdown with progress tracking.

        Parameters
        ----------
        page_or_path : PyMuPDF page object or PDF file path.
        join         : If True, returns a single string joined by separators.
        skip_header_footer : If True, page-header and page-footer blocks are excluded.
        progress_callback : Called as callback(completed_count, total_count).
        r%   ©r&   r'   rQ   )Ú
isinstancer
   r   rD   r*   Ú_to_markdown_pdf©rH   rO   r&   r'   rQ   s        r   r*   zMultiProcessWrapper.to_markdownž   sj   € õ" ˜,­­d¨Ñ4Ô4ð 	kØ”;×*Ò*¨<¸dÐWiÐ*ÑjÔjÐjà×$Ò$Ý�ÑÔØØ1Ø/ð	 %ñ 
ô 
ð 	
r    c                óÀ   — t          |t          t          f¦  «        s| j                             |||¬¦  «        S |                      t          |¦  «        |||¬¦  «        S )a³  
        Convert a page or an entire PDF to Markdown with HTML tables.

        Parameters
        ----------
        page_or_path       : PyMuPDF page object or PDF file path.
        join               : If True, returns a single string joined by separators.
        skip_header_footer : If True, page-header and page-footer blocks are excluded.
        progress_callback  : Called as callback(completed_count, total_count).
        r%   rU   )rV   r
   r   rD   r4   Ú_to_markdown_html_table_pdfrX   s        r   r4   z*MultiProcessWrapper.to_markdown_html_table¹   st   € õ" ˜,­­d¨Ñ4Ô4ð 	Ø”;×5Ò5Ø 4Ð<Nð 6ñ ô ð ð ×/Ò/Ý�ÑÔØØ1Ø/ð	 0ñ 
ô 
ð 	
r    r-   úUnion[str, Path]c                ó`   — | j         j                             t          |¦  «        ||¬¦  «        S )aD  
        Convert an entire PDF to a complete HTML document.

        Parameters
        ----------
        pdf_path           : Path to the PDF file.
        skip_header_footer : If True, page-header and page-footer blocks are excluded.
        progress_callback  : Called as callback(completed_count, total_count).
        )r'   rQ   )rD   Úhtml_generatorÚgenerater
   )rH   r-   r'   rQ   s       r   Úto_htmlzMultiProcessWrapper.to_htmlÖ   s5   € ð Œ{Ô)×2Ò2Ý�‰MŒMØ1Ø/ð 3ñ 
ô 
ð 	
r    Údictc                ó^  ‡‡‡— ddl }t          ‰¦  «        Š|                     ‰¦  «        }|j        }|                     ¦   «          g }| j        dk    r„ˆˆˆfd„t          |¦  «        D ¦   «         }	|                      ¦   «         }
t          |
 	                    t          |	¦  «        d¦  «        D ](\  }}|                     |¦  «         |r |||¦  «         Œ)n§ddl }|                     ‰¦  «        }t          |¦  «        D ]j}||         }| j                             |¦  «        }| j                             |‰‰¬¦  «        }|                     |||f¦  «         |r ||dz   |¦  «         Œk|                     ¦   «          |                     d„ ¬¦  «         d	„ |D ¦   «         d
„ |D ¦   «         dœS )aF  
        Process an entire PDF and return layout and markdown for all pages.

        predict() is called before to_markdown() on each page so that the
        internal inference cache is populated and reused, avoiding duplicate
        computation.

        Parameters
        ----------
        pdf_path : Path to the PDF file.
        join : If True, result['markdown'] is list[str] where each str is the
               joined markdown of all elements on that page.
               If False, result['markdown'] is list[list[str]] where each inner
               list contains one markdown string per layout element.
        skip_header_footer : If True, page-header and page-footer blocks are excluded.
        progress_callback : Called as callback(completed_count, total_count).

        Returns
        -------
        dict with keys:
            'layout'   : list[list]        -- per-page list of
                         [x1, y1, x2, y2, class_name] boxes
            'markdown' : list[str]         -- when join=True
                       : list[list[str]]   -- when join=False
        r   Né   c                ó   •— g | ]}‰|‰‰f‘Œ	S © rd   ©Ú.0Úir&   r-   r'   s     €€€r   ú
<listcomp>z2MultiProcessWrapper.get_result.<locals>.<listcomp>  ó#   ø€ ÐTÐTÐTÀ�X˜q $Ð(:Ð;ÐTÐTÐTr    r   r%   c                ó   — | d         S ©Nr   rd   ©Úxs    r   ú<lambda>z0MultiProcessWrapper.get_result.<locals>.<lambda>+  ó
   €  1 Q¤4€ r    ©Úkeyc                ó   — g | ]\  }}}|‘Œ	S rd   rd   )rf   Ú_r9   s      r   rh   z2MultiProcessWrapper.get_result.<locals>.<listcomp>.  s   € Ð<Ð<Ð<¡L A v¨q˜Ð<Ð<Ð<r    c                ó   — g | ]\  }}}|‘Œ	S rd   rd   ©rf   rs   r1   s      r   rh   z2MultiProcessWrapper.get_result.<locals>.<listcomp>/  s   € Ð=Ð=Ð=¡M A q¨r˜Ð=Ð=Ð=r    )r9   Úmarkdown)r(   r
   r)   Ú
page_countr+   rE   ÚrangeÚ_ensure_poolÚ	enumerateÚimap_unorderedr:   ÚappendrD   r8   r*   Úsort)rH   r-   r&   r'   rQ   r(   r/   Ún_pagesÚresultsr!   Úpoolrg   ÚresÚ_fitzr.   r0   r9   r1   s    ```              r   Ú
get_resultzMultiProcessWrapper.get_resultë   sï  øøø€ ð@ 	ˆˆˆÝ�x‘=”=ˆØ—9’9˜XÑ&Ô&ˆØ”>ˆØ�	Š	‰Œˆà/1ˆàŒ?˜aÒÐØTÐTÐTÐTÐTÐTÅUÈ7Á^Ä^ÐTÑTÔTˆDØ×$Ò$Ñ&Ô&ˆDÝ#Ø×#Ò#Õ$5°tÑ<Ô<¸añô ð 2ð 2‘��3ð —’˜sÑ#Ô#Ð#Ø$ð 2Ø%Ð% a¨Ñ1Ô1Ð1øð2ð !Ð Ð Ð Ø—*’*˜XÑ&Ô&ˆCÝ  ™>œ>ð <ð <�Ø˜Wœ�Øœ×,Ò,¨TÑ2Ô2�Øœ×0Ò0°¸DÐUgÐ0ÑhÔh�Ø—’ ¨°Ð4Ñ5Ô5Ð5Ø$ð <Ø%Ð% g°¡k°7Ñ;Ô;Ð;øØ�IŠI‰KŒKˆKà�Š˜˜ˆÑ(Ô(Ð(ð =Ð<°GÐ<Ñ<Ô<Ø=Ð=°WÐ=Ñ=Ô=ð
ð 
ð 	
r    r   c                ój   — | j         €&t          | j        t          | j        ¬¦  «        | _         | j         S )N)Ú	processesÚinitializerÚinitargs)rG   r   rE   r   rF   ©rH   s    r   ry   z MultiProcessWrapper._ensure_pool2  s8   € ØŒ:ÐÝØ"œoÝ*Ø"Ô/ðñ ô ˆDŒJð
 ŒzÐr    c                ó  ‡‡‡— dd l }|                     ‰¦  «        }|j        }|                     ¦   «          g }| j        dk    r„ˆˆˆfd„t          |¦  «        D ¦   «         }	|                      ¦   «         }
t          |
                     t          |	¦  «        d¦  «        D ](\  }}| 
                    |¦  «         |r |||¦  «         Œ)nˆ|                     ‰¦  «        }t          |¦  «        D ]O}||         }| j                             |‰‰¬¦  «        }| 
                    ||f¦  «         |r ||dz   |¦  «         ŒP|                     ¦   «          |                     d„ ¬¦  «         d„ |D ¦   «         }‰rd	                     |¦  «        S |S )
Nr   rb   c                ó   •— g | ]}‰|‰‰f‘Œ	S rd   rd   re   s     €€€r   rh   z8MultiProcessWrapper._to_markdown_pdf.<locals>.<listcomp>J  ri   r    r   r%   c                ó   — | d         S rk   rd   rl   s    r   rn   z6MultiProcessWrapper._to_markdown_pdf.<locals>.<lambda>_  ro   r    rp   c                ó   — g | ]\  }}|‘ŒS rd   rd   ru   s      r   rh   z8MultiProcessWrapper._to_markdown_pdf.<locals>.<listcomp>`  ó   € Ð,Ð,Ð,™5˜1˜b�BÐ,Ð,Ð,r    ú

---

)r(   r)   rw   r+   rE   rx   ry   rz   r{   r2   r|   rD   r*   r}   r&   ©rH   r-   r&   r'   rQ   r(   r/   r~   r   r!   r€   rg   r�   r.   r0   r1   Úpages_mds    ```             r   rW   z$MultiProcessWrapper._to_markdown_pdf;  sÀ  øøø€ ð 	ˆˆˆØ—)’)˜HÑ%Ô%ˆØ”.ˆØ�	Š	‰Œˆà)+ˆàŒ?˜aÒÐØTÐTÐTÐTÐTÐTÅUÈ7Á^Ä^ÐTÑTÔTˆDØ×$Ò$Ñ&Ô&ˆDÝ#Ø×#Ò#Õ$7¸Ñ>Ô>Àñô ð 2ð 2‘��3ð —’˜sÑ#Ô#Ð#Ø$ð 2Ø%Ð% a¨Ñ1Ô1Ð1øð2ð —)’)˜HÑ%Ô%ˆCÝ  ™>œ>ð <ð <�Ø˜7”|�Ø”{×.Ò.¨t¸$ÐSeÐ.ÑfÔf�Ø—’ ¨˜}Ñ-Ô-Ð-Ø$ð <Ø%Ð% g°¡k°7Ñ;Ô;Ð;øØ�IŠI‰KŒKˆKà�Š˜˜ˆÑ(Ô(Ð(Ø,Ð, GÐ,Ñ,Ô,ˆàð 	0Ø ×%Ò% hÑ/Ô/Ð/Øˆr    c                ó  ‡‡‡— dd l }|                     ‰¦  «        }|j        }|                     ¦   «          g }| j        dk    r„ˆˆˆfd„t          |¦  «        D ¦   «         }	|                      ¦   «         }
t          |
                     t          |	¦  «        d¦  «        D ](\  }}| 
                    |¦  «         |r |||¦  «         Œ)nˆ|                     ‰¦  «        }t          |¦  «        D ]O}||         }| j                             |‰‰¬¦  «        }| 
                    ||f¦  «         |r ||dz   |¦  «         ŒP|                     ¦   «          |                     d„ ¬¦  «         d„ |D ¦   «         }‰rd	                     |¦  «        S |S )
Nr   rb   c                ó   •— g | ]}‰|‰‰f‘Œ	S rd   rd   re   s     €€€r   rh   zCMultiProcessWrapper._to_markdown_html_table_pdf.<locals>.<listcomp>u  ri   r    r   r%   c                ó   — | d         S rk   rd   rl   s    r   rn   zAMultiProcessWrapper._to_markdown_html_table_pdf.<locals>.<lambda>Š  ro   r    rp   c                ó   — g | ]\  }}|‘ŒS rd   rd   ru   s      r   rh   zCMultiProcessWrapper._to_markdown_html_table_pdf.<locals>.<listcomp>‹  r�   r    rŽ   )r(   r)   rw   r+   rE   rx   ry   rz   r{   r5   r|   rD   r4   r}   r&   r�   s    ```             r   rZ   z/MultiProcessWrapper._to_markdown_html_table_pdff  sÀ  øøø€ ð 	ˆˆˆØ—)’)˜HÑ%Ô%ˆØ”.ˆØ�	Š	‰Œˆà)+ˆàŒ?˜aÒÐØTÐTÐTÐTÐTÐTÅUÈ7Á^Ä^ÐTÑTÔTˆDØ×$Ò$Ñ&Ô&ˆDÝ#Ø×#Ò#Õ$BÀDÑIÔIÈ1ñô ð 2ð 2‘��3ð —’˜sÑ#Ô#Ð#Ø$ð 2Ø%Ð% a¨Ñ1Ô1Ð1øð2ð —)’)˜HÑ%Ô%ˆCÝ  ™>œ>ð <ð <�Ø˜7”|�Ø”{×9Ò9¸$ÀTÐ^pÐ9ÑqÔq�Ø—’ ¨˜}Ñ-Ô-Ð-Ø$ð <Ø%Ð% g°¡k°7Ñ;Ô;Ð;øØ�IŠI‰KŒKˆKà�Š˜˜ˆÑ(Ô(Ð(Ø,Ð, GÐ,Ñ,Ô,ˆàð 	0Ø ×%Ò% hÑ/Ô/Ð/Øˆr    c                óŠ   — | j         �;| j                              ¦   «          | j                              ¦   «          d | _         d S d S rK   )rG   r+   r&   rˆ   s    r   r+   zMultiProcessWrapper.close‘  sC   € ØŒ:Ð!ØŒJ×ÒÑÔÐØŒJ�OŠOÑÔÐØˆDŒJˆJˆJð "Ð!r    c                ó   — | S rK   rd   rˆ   s    r   Ú	__enter__zMultiProcessWrapper.__enter__—  s   € Øˆr    c                ó.   — |                       ¦   «          d S rK   )r+   )rH   rs   s     r   Ú__exit__zMultiProcessWrapper.__exit__š  s   € Ø�
Š
‰Œˆˆˆr    c                óR   — 	 |                       ¦   «          d S # t          $ r Y d S w xY wrK   )r+   Ú	Exceptionrˆ   s    r   Ú__del__zMultiProcessWrapper.__del__�  s:   € ð	Ø�JŠJ‰LŒLˆLˆLˆLøÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ ˜
&¥&)	NNNr=   Nr>   FFr?   )r	   r@   r   r@   r   r@   r   r
   r   r   rA   rB   r   r   r   r   r   r
   r   r   )r   r   )TTN)
rO   rP   r&   r   r'   r   rQ   rR   r   rS   )TN)r-   r[   r'   r   rQ   rR   r   r
   )
r-   r[   r&   r   r'   r   rQ   rR   r   r`   )r   r   rK   )
r-   r
   r&   r   r'   r   rQ   rR   r   rS   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rI   rL   r8   r*   r4   r_   rƒ   ry   rW   rZ   r+   r—   r™   rœ   rd   r    r   r<   r<   j   s£  € € € € € ðð ð 04Ø/3Ø/3Ø%-Ø15Ø%&Ø&+Ø&+Ø%)ð'*ð '*ð '*ð '*ð '*ðR/ð /ð /ð /ð3ð 3ð 3ð Ø#'ØBFð
ð 
ð 
ð 
ð 
ð< $(Ø#'ØCGð
ð 
ð 
ð 
ð 
ð@ $(ØCGð	
ð 
ð 
ð 
ð 
ð0 Ø#'ØBFðE
ð E
ð E
ð E
ð E
ðNð ð ð ð CGð)ð )ð )ð )ð )ð` DHð)ð )ð )ð )ð )ðVð ð ð ðð ð ðð ð ðð ð ð ð 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"   r   r6   )Ú
__future__r   ÚmultiprocessingÚmpÚmultiprocessing.poolr   Úpathlibr   Útypingr   r   r   r   r   r2   r5   r:   r<   rd   r    r   ú<module>r§      sø   ðØ "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ð €ðð ð ð ð4ð ð ð ð"ð ð ð ð"ð ð ð ð>wð wð wð wð wñ wô wð wð wð wr    