
    bic,                     :   d Z ddlZddlZddlZddlmZ ddlmZ ddlZddlZddl	m
Z
mZ ddlZddlZddlmZmZmZ  ej&                   ej(                  e      d      Zej.                  d        Zd	 Zd
 Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&y)z$ Tests for fortran sequential files     N)path)iglob)assert_equalassert_allclose)FortranFileFortranEOFErrorFortranFormattingErrordatac                  *    t        j                         S )N)	threadingLock     V/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/io/tests/test_fortran.pyio_lockr      s    >>r   c                    t        t        j                  t        d            D ]D  }t	        j
                  d|t        j                        }|st        d| d      t        |j                  d            t        |j                  d            t        |j                  d            f}|j                  d      j                  d	d
      }| 5  t        |dd      }|j                  |      j                  |d      }|j                          d d d        t        j                   t        j"                  |            j                  |      j%                  |      }t'        |       G y # 1 sw Y   _xY w)Nfortran-*-*x*x*.dat%fortran-([^-]+)-(\d+)x(\d+)x(\d+).datCouldn't match  filename to regex            s<r<u4dtypeForder)r   r   join	DATA_PATHresearchIRuntimeErrorintgroupreplacer   read_recordreshapeclosenparangeprodastyper   )r   filenamemdimsr    fr
   expecteds           r   test_fortranfiles_readr9      s"   $))I/DEF %II>"$$O
:LMNNAGGAJQWWQZ#aggaj/B
""3, 	Hc51A==u=-55d#5FDGGI	
 99RWWT]+33D9@@GT8$%	 	s   AE--E6	c                 `   t        j                  t        d      }| 5  t        |dd      5 }|j	                  d      }d d d        d d d        t        d   d   d       t        |d   d   d	       t        |d
   d   d       t        |d   d   ddg       y # 1 sw Y   \xY w# 1 sw Y   `xY w)Nzfortran-mixed.datr   r   z<i4,<f4,<i8,2<f8f0r   r   f1gffffff@f2r   f3gffffff@g333333@)r   r$   r%   r   r-   r   r   )r   r4   r7   records       r   test_fortranfiles_mixed_recordr@   /   s    yy$78H	 73. 	7!]]#56F	77 a!$F4LOS)a!$F4LOc3Z0	7 	77 7s!   B$BB$B!	B$$B-c                  r   t        t        j                  t        d            D ]  } t	        j
                  d| t        j                        }|st        d|  d      t        |j                  d            t        |j                  d            t        |j                  d            f}|j                  d      j                  d	d
      }t        j                  t        j                  |            j                  |      j                  |      }t!        j"                         }	 t        j                  t%        t'        j(                               |t        j*                  |             }t-        |dd      }|j/                  |j0                         |j3                          t5        | d      }t5        |d      }	t7        |j9                         |	j9                         |        |j3                          |	j3                          t;        j<                  |        y # t;        j<                  |       w xY w)Nr   r   r   r   r   r   r   r   r   r   wr   rb)err_msg)r   r   r$   r%   r&   r'   r(   r)   r*   r+   r,   r0   r1   r2   r.   r3   tempfilemkdtempstrr   get_native_idbasenamer   write_recordTr/   openr   readshutilrmtree)
r4   r5   r6   r    r
   tmpdirtestFiler7   originalfilenewfiles
             r   test_fortranfiles_writerT   ;   s   $))I/DEF "II>"$$O
:LMNNAGGAJQWWQZ#aggaj/B
""3,yy'//5<<UC!!#	"yyY%<%<%>!?!'h(?AHHc%0ANN466"GGI$/L8T*G**,glln!)+ MMOMM&!/". MM&!s   'CHH6c                    t        j                  t        d      }| 5  t        |dd      5 }|j	                  dd      }d d d        d d d        t        j                  d      j                  dd      j                  t
        j                        }t        j                  dd	gt
        j                  
      }t        d   |j                         t        |d   |j                         y # 1 sw Y   xY w# 1 sw Y   xY w)Nzfortran-3x3d-2i.datr   r   z(3,3)<f8z2<i4	   r   r   r   r   )r   r$   r%   r   r-   r0   r1   r.   r3   float64arrayint32r   rK   )r   r4   r7   r?   axbxs         r   "test_fortranfile_read_mixed_recordr^   V   s     yy$9:H	 73. 	7!]]:v6F	77 
3		1	%	,	,RZZ	8B	2r("((	+BBDD!BDD!	7 	77 7s!   C6C*C6*C3	/C66C?c                 $   t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       dt        j                  d      t        j                  d      t        j                  d      ff}dt        j                  j                  d	d
g      j                  t        j                        t        j                  j                  d	ddg      j                  t        j                        t        j                  j                  d	dg      j                  t        j                        ff}||g}|D ]  \  }}t        |d      5 } |j                  |  d d d        t        |d      5 } |j                   | }d d d        t#        t%        |      t%                     t'        ||      D ]  \  }	}
t#        |
|	         y # 1 sw Y   nxY w# 1 sw Y   VxY w)Ntest.datTexist_ok)f4rc   i4r   r   d   )4f4z(3,3)f48i4   r   )size   rB   r   )r   r$   rG   r   rH   osmakedirsdirnamer0   float32r[   randomrandintr3   r   rJ   r-   r   lenzip)rP   tfr1r2recordsr    ar7   baabbs              r   #test_fortranfile_write_mixed_recordr{   n   s   	3v;I$;$;$= >
	KBKKR 40
rzz!}bjjmRXXc]K	LB
#99Ss+222::>99S1v.55bjjA99Ss+22288<>
?B 2hG 
!qS! 	QANNA	 S! 	&Qu%A	& 	SVSV$!Qi 	!FBR 	!
!	 		& 	&s   =G:!H:H	H	c                    t        |j                         d      5 }|j                  d       t        j                  |t        j
                  | |z  |z        }|j                  d       ddd       j                  | |z  |z  k7  r!t        d| |z  |z   d|j                         |j                  | ||fd      S # 1 sw Y   UxY w)	aj  
    Read a Fortran-style unformatted binary file written with a single write() call,
    assuming it wraps the data with 4-byte record markers.

    Returns:
        np.ndarray of shape (m, n, k) with dtype float64

    Reference:
        Fortran implementation:
        https://github.com/scipy/scipy/blob/maintenance/1.15.x/scipy/io/_test_fortran.f#L1-L9
    rC   r   r    countN	Expected  elements, got r!   r"   )	rL   striprM   r0   fromfilerY   ri   
ValueErrorr.   r5   nkr4   r7   r
   s         r   read_unformatted_doubler      s     
hnn	% 	q	{{1BJJa!eai@	q	
 yyAEAI9QqSUG?499+FGG<<Aq	<--    AB>>Cc                 t   t        |j                         d      5 }|j                  d       t        j                  |t        j
                  | |z        }t        j                  |t        j                  |      }|j                  d       ddd       j                  | |fd      }|fS # 1 sw Y   "xY w)a  
    Read a Fortran unformatted binary file that contains a mix of:
    - a double precision array a(m, n)
    - an integer array b(k)

    Assumes a single write(10) a, b was used and file is wrapped
    with Fortran record markers.

    Returns:
        a: np.ndarray of shape (m, n) with dtype float64
        b: np.ndarray of shape (k,) with dtype int32

    Reference:
        Fortran implementation:
        https://github.com/scipy/scipy/blob/maintenance/1.15.x/scipy/io/_test_fortran.f#L21-L30
    rC   r   r}   Nr!   r"   )rL   r   rM   r0   r   rY   r[   r.   )r5   r   r   r4   r7   a_flatrx   rw   s           r   read_unformatted_mixedr      s    " 
hnn	% 		q	 QbjjA> KK3	q		 	1vS)Aa4K	 	s   A2B..B7c                    t        |j                         d      5 }|j                  d       t        j                  |t        j
                  | |z  |z        }|j                  d       ddd       j                  | |z  |z  k7  r!t        d| |z  |z   d|j                         |j                  | ||fd      S # 1 sw Y   UxY w)	a  
    Read a Fortran unformatted binary file
    containing a 3D integer array (m, n, k).
    Assumes the array is written with a single
    write(10) a and wrapped with record markers.

    Returns:
        np.ndarray: 3D array of shape (m, n, k) with dtype int32

    Reference:
        Fortran implementation:
        https://github.com/scipy/scipy/blob/maintenance/1.15.x/scipy/io/_test_fortran.f#L11-L19
    rC   r   r}   Nr   r   r!   r"   )	rL   r   rM   r0   r   r[   ri   r   r.   r   s         r   read_unformatted_intr      s     
hnn	% 	q	 {{1BHHAEAI>	q	 yyAEAI9QqSUG?499+FGG<<Aq	<-- r   c                    t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       t        j                  j                  d      }d\  }}}|j                  |||      }t        |d      5 }|j                  |j                         d d d        |5  t        ||||      }	d d d        t        |d      5 }|j!                  d      j                  }
d d d        t#        	|       t#        
|       d\  }}}|j                  |||      j%                  t        j&                        }t        |d      5 }|j                  |j                         d d d        |5  t)        ||||      }	d d d        t        |d      5 }|j!                  d	      j                  }
d d d        t#        |	|       t#        |
|       d\  }}}|j                  ||      }|j                  |      j%                  t        j*                        }t        |d      5 }|j                  |j                  |j                         d d d        |5  t-        ||||      \  }	}d d d        t        |d      5 }|j!                  d
d      \  }
}|
j                  }
d d d        t#        |	|       t#        |
|       t#        |       t#        |       y # 1 sw Y   6xY w# 1 sw Y   *xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   gxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr`   Tra   r   )   r   r   rB   r   z	(2,3,5)f8z	(2,3,5)i4z(3,5)f82i4)r   r$   rG   r   rH   rk   rl   rm   r0   ro   RandomStaterandnr   rJ   rK   r   r-   r   r3   r[   r   intcr   )rP   r   r4   rngr5   r   r   rw   r7   a2a3rx   b2b3s                 r   test_fortran_roundtripr      s   yyVc)*A*A*C&D#%HKKX&6
))


"C GAq!		!QA	Xs	# q	qss	 8$Q1h78 
Xs	# *q]];'))*QQ GAq!		!Q!!"((+A	Xs	# q	qss	 5!!Q845	Xs	# *q]];'))*QQ GAq!		!QA		!BGG$A	Xs	# !q	qssACC !	 ;'1a:B;	Xs	# qy%0BTT QQQQI 8 8* * 5 5* *! !; ; sl   *K:L3L1L!L.:L;'M9M"M :LLL!L+.L8;MMM M)c                    t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       t        j                  j                  d      }t        |d      5 }|j                  |j                  d             |j                  |j                  d             d d d        t        |d      5 }t        |j                               dk(  sJ t        |j                               dk(  sJ t!        j"                  t$              5  |j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)	NscratchTra   r   rB   r   r   r   )r   r$   rG   r   rH   rk   rl   rm   r0   ro   r   r   rJ   r   rq   
read_realspytestraisesr   rP   r4   r   r7   s       r   test_fortran_eof_okr     s!   yyVc)*A*A*C&D"$HKKX&6
))


"C	Xs	# %q	syy|$	syy|$% 
Xs	# q1<<>"a'''1<<>"a''']]?+ 	LLN	 % %	 	 s2   AE&AE6<E*E6E'*E3	/E66E?c                 h   t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       t        j                  j                  d      }t        |d      5 }|j                  |j                  d             |j                  |j                  d             d d d        t        |d      5 }|j                  d	       d d d        t        |d
      5 }t!        |j#                               dk(  sJ t!        |j#                               dk(  sJ t%        j&                  t(              5  |j#                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   Tra   r   rB   r   r   ab   r   )r   r$   rG   r   rH   rk   rl   rm   r0   ro   r   r   rJ   r   rL   writerq   r   r   r   r	   r   s       r   test_fortran_eof_broken_sizer     sO   yyVc)*A*A*C&D"$HKKX&6
))


"C	Xs	# %q	syy|$	syy|$% 
h	 		Xs	# q1<<>"a'''1<<>"a''']]12 	LLN	 % % 
	 	 s>   AF&FAF("F3F(FFF%	!F((F1c                    t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       t        j                  j                  d      }t        |d      5 }|j                  |j                  d             |j                  |j                  d             d d d        t        |d      5 }|j                  d	       d d d        t        |d
      5 }t!        j"                  t$              5  |j'                          d d d        d d d        y # 1 sw Y   wxY w# 1 sw Y   ]xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   Tra   r   rB   r   r   zw+bs   r   )r   r$   rG   r   rH   rk   rl   rm   r0   ro   r   r   rJ   r   rL   r   r   r   r	   r   r   s       r   test_fortran_bogus_sizer   (  s   yyVc)*A*A*C&D"$HKKX&6
))


"C	Xs	# %q	syy|$	syy|$% 
h	 !		Xs	# q]]12 	LLN	 % % 	 	 s=   AE&EE,&E 7E,EE E)	%E,,E5c                 X   t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       t        j                  j                  d      }t        |d      5 }|j                  |j                  d             |j                  |j                  d             d d d        t        |d      5 }|j                  t        j                   |      d	z
         d d d        t        |d
      5 }t#        |j%                               dk(  sJ t'        j(                  t*              5  |j%                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   {xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   Tra   r   rB   r   r   r      r   )r   r$   rG   r   rH   rk   rl   rm   r0   ro   r   r   rJ   r   rL   truncategetsizerq   r   r   r   r	   r   s       r   test_fortran_eof_broken_recordr   7  sD   yyVc)*A*A*C&D"$HKKX&6
))


"C	Xs	# %q	syy|$	syy|$% 
h	 .	

4<<)",-.	Xs	# q1<<>"a''']]12 	LLN	 % %. .	 	 s=   AE<&(F"8F F+F <FFF	F  F)c                    t        j                  t        |       t        t        j                               d      }t        j                  t        j                  |      d       d\  }}}t        j                  dt        j                  ||ffg      }t        j                  ||      }t        |d      5 }|j                  |d          |j                  |       |j                  |       d d d        t        |d	      5 }|j                  t        j                   |      d
z
         d d d        t        |d      5 }t#        |j%                  |            dk(  sJ t#        |j%                  |            |k(  sJ t'        j(                  t*              5  |j%                  |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   Tra   )r   r      fieldr   rB   r   r   r   r   r   )r   r$   rG   r   rH   rk   rl   rm   r0   r    rY   zerosr   rJ   rL   r   r   rq   r-   r   r   r	   )rP   r4   r   r5   qdtrw   r7   s           r   !test_fortran_eof_multidimensionalr   G  s   yyVc)*A*A*C&D"$HKKX&6GAq!	GRZZ!Q01	2B
"A	Xs	# q	qt	q	q 
h	 .	

4<<)",-.	Xs	# $q1==r=*+q0001==r=*+q000]]12 	$MMM#	$$ $ . .
	$ 	$$ $s=   87F=(G	?AG!G,G!=G	GG	G!!G*)'__doc__rE   rN   rk   r   globr   r   r&   numpy.testingr   r   numpyr0   r   scipy.ior   r   r	   r$   rm   __file__r%   fixturer   r9   r@   rT   r^   r{   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s    *   	    	 7  . .
 DIIldll8,f5	  %&	1"6"0!..,B.6.b" $r   