
    xKg)                        d 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	m
Z
 ddlZddlmZmZmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z% da&d Z'e d        Z(d Z) G d dejT                        Z+ G d dejX                        Z- ej\                  e+      d        Z/ ee-       G d dej`                  jb                  jd                  jf                               Z4 ee+      d        Z5 ee+ejl                  ejn                  ejX                        d        Z8 ee-      d        Z9 ee-d      d        Z:ed        Z; G d de%e$      Z<e=d k(  r ej|                          yy)!z!
Test NumPy Subclassing features
    N)Numberwraps)ir)njittypeofobjmode)cgutilstypestyping)box)TypingError)
cpu_target)	intrinsiclower_builtinoverload_classmethodregister_modeltype_callabletypeof_implregister_jitable)numpy_support)TestCaseMemoryLeakMixinc                  <    t         t         j                  |        y y N)_loggerappendargss    g/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/numba/tests/test_ndarray_subclasses.py_do_logr!      s    t     c                  R    t               5  t        |   d d d        y # 1 sw Y   y xY wr   )r	   r!   r   s    r    logr$   $   s    	 
s   	&c                 .     t                fd       }|S )Nc                      g a  | i |S r   )r   )r   kwargsfns     r    corezuse_logger.<locals>.core+   s     4"6""r"   r   )r(   r)   s   ` r    
use_loggerr*   *   s     
2Y# # Kr"   c                       e Zd ZdZd Zy)MyArrayTc                 @   |dk(  rd }g }|D ]  }t        |t              r|j                  |       %t        |t        |       t        j
                  f      rt        |t        |             r;|j                  t	        j
                  |j                  |j                  |             n|j                  |       |||j                  k7  st        d      |j                  }t        c S   ||i |}| j                  |j                  |j                  |      S t        S )N__call__zinconsistent sizes)
isinstancer   r   typenpndarrayshapedtype	TypeErrorNotImplemented	__class__)	selfufuncmethodinputsr'   Nscalarsinprets	            r    __array_ufunc__zMyArray.__array_ufunc__=   s    ZAGc6*NN3'd4j"**%=>!#tDz2rzz#))SYY'LMs+}		>"+,@"AAII))  +F+C>>#))SYY<<!!r"   N)__name__
__module____qualname__ __numba_array_subtype_dispatch__r@    r"   r    r,   r,   3   s    '+$"r"   r,   c                   <     e Zd Zd fd	Zd Zd Zed        Z xZS )MyArrayTypec                 H    d| d| d| d}t         |   ||||||       y )NzMyArray(z, ))readonlyalignedname)super__init__)r8   r4   ndimlayoutrJ   rK   rL   r7   s          r    rN   zMyArrayType.__init__W   s<    $r%6(!4fx!(t 	 	5r"   c                     t         r   )NotImplementedError)r8   r   r'   s      r    copyzMyArrayType.copy\   s
     "!r"   c                     |dk(  rW|D ]4  }t        |t        j                  t        j                  f      r.t        c S  t        d |D              rt        S t        S t        S )Nr.   c              3   <   K   | ]  }t        |t                y wr   )r/   rG   ).0r>   s     r    	<genexpr>z.MyArrayType.__array_ufunc__.<locals>.<genexpr>h   s     B6C:c;/6s   )r/   r   Arrayr   r6   allrG   )r8   r9   r:   r;   r'   r>   s         r    r@   zMyArrayType.__array_ufunc__b   sS    Z!#U\\'BC))  B6BB%%!!r"   c                     t         S r   )r,   )r8   s    r    box_typezMyArrayType.box_typen   s    r"   )FT)	rA   rB   rC   rN   rS   r@   propertyr[   __classcell__r7   s   @r    rG   rG   V   s&    5
"
"  r"   rG   c                    	 t        j                  | j                        }t        j
                  |       }| j                  j                   }t        || j                  ||      S # t        $ r t	        d| j                        w xY w)NzUnsupported array dtype: )rJ   )
r   
from_dtyper4   rR   
ValueError
map_layoutflags	writeablerG   rO   )valcr4   rP   rJ   s        r    typeof_ta_ndarrayrg   s   sz    G((3 %%c*F99&&&HuchhBB	  G#))EFFGs   A& &"Bc                        e Zd Z fdZ xZS )MyArrayTypeModelc                    |j                   }dt        j                  |j                        fdt        j                  fdt        j
                  fdt        j
                  fdt        j                  |j                        fdt        j                  t        j
                  |      fdt        j                  t        j
                  |      fdt        j
                  fg}t        t        | +  |||       y )	Nmeminfoparentnitemsitemsizedatar3   stridesextra_field)rO   r   MemInfoPointerr4   pyobjectintpCPointerUniTuplerM   ri   rN   )r8   dmmfe_typerO   membersr7   s        r    rN   zMyArrayTypeModel.__init__   s    ||,,W]];<u~~&uzz"$U^^GMM23ennUZZ67uzz489EJJ'	
 	.sGWEr"   )rA   rB   rC   rN   r]   r^   s   @r    ri   ri   ~   s    F Fr"   ri   c                     d }|S )Nc                 \    t        |j                  t        |       |j                        }|S )N)r4   rO   rP   )rG   r4   lenrP   )r3   r4   bufouts       r    typerztype_myarray.<locals>.typer   s&    ))#e*SZZ
 
r"   rE   )contextr   s     r    type_myarrayr      s     Lr"   c                    ddl m}m} |j                  d   }|\  }}}	  ||      | ||	      }
  ||j                        | |      } |||
j
                  |
j                  |
j                  |
j                  |
j                         |j                         }| j                  j                  ||j                  |       |S )Nr   )
make_arraypopulate_array)value)ro   r3   rp   rn   rk   )numba.np.arrayobjr   r   r   return_typero   r3   rp   rn   rk   	_getvaluenrtincref)r   buildersigr   r   r   srcarytyr3   r4   r}   srcaryretaryr?   s                r    impl_myarrayr      s    <xx|HE5#!Z!'7#>F )Z(':F6!>>"OO!>>+ 


CKKw5Jr"   c                 x   |j                   j                  sJ t        j                  | j                        }|j
                  j                  |j
                  j                  |            }|j                  j                  | ||      }|j                   j                  j                  |j                  | |       |S r   )r   
enable_nrtr   as_dtyper4   env_manager
read_const	add_constpyapinrt_adapt_ndarray_to_pythonr   decrefr   )typre   rf   np_dtypedtypeptrnewarys         r    	box_arrayr      s    99%%cii0H}}''(?(?(IJHWW00c8DFIIMMC-Mr"   	_allocatec                     d }|S )z;Implements a Numba-only classmethod on the array type.
    c                 4    t        d||       t        ||      S )NLOG _ol_array_allocate)r$   allocator_MyArray)cls	allocsizealigns      r    implz _ol_array_allocate.<locals>.impl   s    $i7 E22r"   rE   )r   r   r   r   s       r    _ol_array_allocater      s    3 Kr"   c                     d }t        j                  t         j                        }t        j                  |||      }||fS )Nc                    | j                   j                          |\  }}|j                  }t        j                  d      }t
        j                  }t        j                  |d      }	t        j                  ||	d      }
|j                  |
d      }t        j                  |t
        j                  ||g      }t        j                  ||d      }|j                  j                  d       t        |t        j                        r!| j!                  t"        j$                  |      }n|j&                  |k(  sJ d       |j                  ||||g      }d|_        |S )	N    rE   "_nrt_get_sample_external_allocator)rL   'NRT_MemInfo_alloc_safe_aligned_externalnoaliaszalign must be a uint32allocate_MyArray)r   _require_nrtmoduler   IntTyper
   	voidptr_tFunctionTypeget_or_insert_functioncallintp_treturn_valueadd_attributer/   builtinsintget_constantr   uint32r0   rL   )r   r   r   r   sizer   modu32voidptrget_alloc_fntyget_alloc_fn	ext_allocfntyr(   r   s                  r    r   zallocator_MyArray.<locals>.impl   s     "ennjjn##"555&J
 LLr2	wg(FG++E
 	%%i0eX\\*((u=E::$>&>>$||Bui 89&	r"   )r   rr   r   r   	signature)	typingctxr   r   r   mipr   s         r    r   r      s;    6 

u}}
-C


3	5
1C9r"   c                   ^    e Zd Zd Zd Zd Zd Zej                  d        Z	d Z
ed        Zy)	TestNdarraySubclassesc                 R   t         d        }t        j                  d      }t        |j                  |j
                  |      }|j                  |      } ||      }| j                  |t               | j                  t        |      t        |             | j                  ||       y)z6This tests the path to `MyArrayType.box_type`
        c                     | dz   S )N   rE   as    r    fooz6TestNdarraySubclasses.test_myarray_return.<locals>.foo   s    q5Lr"      Nr   r1   aranger,   r3   r4   py_funcassertIsInstanceassertIsr0   assertPreciseEqualr8   r   r}   r   expectedgots         r    test_myarray_returnz)TestNdarraySubclasses.test_myarray_return   s     
	 
	 iilCIIsyy#.;;q>!fc7+d8nd3i0#.r"   c                 R   t         d        }t        j                  d      }t        |j                  |j
                  |      }|j                  |      } ||      }| j                  |t               | j                  t        |      t        |             | j                  ||       y )Nc                     | S r   rE   r   s    r    r   z8TestNdarraySubclasses.test_myarray_passthru.<locals>.foo   s    Hr"   r   r   r   s         r    test_myarray_passthruz+TestNdarraySubclasses.test_myarray_passthru   s    		 
	 iilCIIsyy#.;;q>!fc7+d8nd3i0#.r"   c                    t         d        }t        j                  d      }|j                  |      } ||      }| j	                  |t
               | j                  t        |      t        |             | j                  ||       y )Nc                 D    t        | j                  | j                  |       S r   r,   r3   r4   )r}   s    r    r   z7TestNdarraySubclasses.test_myarray_convert.<locals>.foo  s    399cii55r"   r   )	r   r1   r   r   r   r,   r   r0   r   )r8   r   r}   r   r   s        r    test_myarray_convertz*TestNdarraySubclasses.test_myarray_convert  sp    		6 
	6 iil;;s##hc7+d8nd3i0#.r"   c                     d }t        j                  d      } ||      }| j                  t        |      t         j                         | j                  |||z          y )Nc                 t    t        | j                  | j                  |       }t        j                  |      | z   S r   r,   r3   r4   r1   asarrayr}   	converteds     r    r   z?TestNdarraySubclasses.test_myarray_asarray_non_jit.<locals>.foo  s,    		399c:I::i(3..r"   r   )r1   r   r   r0   r2   r   r8   r   r}   r   s       r    test_myarray_asarray_non_jitz2TestNdarraySubclasses.test_myarray_asarray_non_jit  sI    	/ iil#hd3i,S3Y/r"   c                     | j                          t        d        }t        j                  d      } ||      }| j	                  t        |      t        j                         y )Nc                 n    t        | j                  | j                  |       }t        j                  |      S r   r   r   s     r    r   z7TestNdarraySubclasses.test_myarray_asarray.<locals>.foo!  s'    		399c:I::i((r"   r   )disable_leak_checkr   r1   r   r   r0   r2   r   s       r    test_myarray_asarrayz*TestNdarraySubclasses.test_myarray_asarray  sP    !		) 
	) iil#h 	d3i,r"   c                 &   t         d        }t        j                  dt        j                        }| j	                  t
              5 } ||       d d d        d}|D ]'  }| j                  |t        j                               ) y # 1 sw Y   8xY w)Nc                 N    t        | j                  | j                  |       }||z   S r   r   r   s     r    r   zATestNdarraySubclasses.test_myarray_ufunc_unsupported.<locals>.foo-  s#    		399c:Iy((r"   r   r4   )zNo implementation of functionz3add(MyArray(1, float32, C), MyArray(1, float32, C)))	r   r1   r   float32assertRaisesr   assertInstr	exception)r8   r   r}   raisesmsgms         r    test_myarray_ufunc_unsupportedz4TestNdarraySubclasses.test_myarray_ufunc_unsupported,  sz    		) 
	) ii,{+vH ,FAMM!S!1!123  ,+s   	BBc                    t         d        }t        j                  dt        j                        }t	        |j
                  |j                  |      }|j                  |      } ||      }| j                  ||       t        }t        j                  }t        |j                        }|j                  |      }	| j                  |d|d   j                  |	fd|d   j                  |	fg       y)z:
        Checks that our custom allocator is used
        c                 x    | t        j                  | j                  t         j                        z   }| dz   }||fS )Nr   y              ?)r1   r   r   float64)r   brf   s      r    r   zBTestNdarraySubclasses.test_myarray_allocator_override.<locals>.foo@  s1    BIIaffBJJ77ABAa4Kr"   r   r   r   r   r   N)r   r1   r   r   r,   r3   r4   r   r   r   r   target_contextr   get_preferred_array_alignmentassertEqualnbytes)
r8   r   r}   r   r   r   logged_lines	targetctxnb_dtyper   s
             r    test_myarray_allocator_overridez5TestNdarraySubclasses.test_myarray_allocator_override;  s    
 
	 
	
 ii,CIIsyy#.;;q>!fX.--	#))$77A%x{'9'95A%x{'9'95A(
 	r"   N)rA   rB   rC   r   r   r   r   unittestexpectedFailurer   r   r*   r  rE   r"   r    r   r      sI    //
/0 - -4  r"   r   __main__)?__doc__r   r  numbersr   	functoolsr   numpyr1   llvmliter   numbar   r   r	   
numba.corer
   r   r   numba.core.pythonapir   numba.core.errorsr   numba.core.registryr   numba.extendingr   r   r   r   r   r   r   numba.npr   numba.tests.supportr   r   r   r!   r$   r*   r2   r,   rX   rG   registerrg   r)   	datamodelmodelsStructModelri   r   rv   DTyper   r   r   r   r   rA   mainrE   r"   r    <module>r     s          ' ' - - $ ) */ / / # 9 
  
 "bjj  "F%++ : gC C Fuzz++22>> F F  w  wU[[A B, [  k;/ 0  BmOX m` zHMMO r"   