
    Mj                      @   d Z ddlZddlZddlZddlZddlZddlZ ej                         j                  d      xr dej
                  v Z
 ej                         dk(  Z ej                         dk(  Z ed ej                          d ej                                  ed	e
        	 ddlZd
ZdZdZ	 ddlZe
r	 ed       n<	  ej*                         Z eed      rej0                  rd
ZdZ ed       n ed       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-Zi d.d/d0d1d2d3d4d3d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNi dOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdqdrdsdtdudvdwdxdydz
Zd{d|d}d~ddZdddddZddddddddddddddZddZ d Z!d Z"dZ#dZ$dZ% G d d      Z& G d d      Z' G d d      Z( G d d      Z)e*dk(  
r ed        ed        ed        e)       Z+ ed        e, e-e+      D  cg c]%  } | j                  d      r e. e/e+|             r| ' c}       Z0 ed e1e0       d        ed        ed       e+je                           ed       ejf                  ji                  dd      jk                  ejl                        Z7ejf                  ji                  dd      jk                  ejl                        Z8 ejr                   ejt                  e+jw                  e7e8      e7e8z  z
              dk  sJ  ed        ed       ejf                  ji                  d      jk                  ejl                        Z< ejt                  ejf                  ji                  d      jk                  ejl                              dz   Z=dD ]Q  Z>  e/ee>      e<e=      Z?  e/e+e>      e<e=      Z@ ejr                   ejt                  e@e?z
              dk  rLJ e>         ed e1g d       d        ed        ejt                  ejf                  ji                  d      jk                  ejl                              dz  dz   Z<g dZA e, eBeA            ZAeAD ]O  Z>  e/ee>      e<      Z?  e/e+e>      e<      Z@ ejr                   ejt                  e@e?z
              dk  rJJ e>         ed e1eA       d       ejf                  ji                  d      jk                  ejl                        dz  ZCg dZDeDD ]O  Z>  e/e+e>      eC      Z@  e/ee>      eC      Z? ejr                   ejt                  e@e?z
              dk  rJJ e>         ed e1eD       d        ed       ejf                  ji                  d      jk                  ejl                        Z<dD ]5  Z>  e/ee>      e<      Z?  e/e+e>      e<      Z@ e:e@e?z
        dk  r0J e>         ed        ed       ejf                  ji                  d      jk                  ejl                        Z<e+j                  e<dd      ZF ejr                   ejt                  eF ej                  e<dd      z
              dk  sJ e+j                  e<d«      ZH ejr                   ejt                  eH ej                  e<dkD  e<de<z        z
              dk  sJ ejf                  ji                  ddī      jk                  ejl                        ZJe+j                  eJdŬƫ      ZL ej                  eJeJjs                  dd
ǫ      z
        ZNeNeNj                  dd
ǫ      z  ZN ejr                   ejt                  eLeNz
              dk  sJ e+j                  eJdŬƫ      ZQ ejr                   ejt                  eQ ej                  eN      z
              dk  sJ  edȫ        edɫ        ej                  dʫ      j                  dd      jk                  ejl                        Z<e+j                  e<      e<j                  k(  j                         sJ e+j                  e<dd˫      e<j                  dd˫      k(  j                         sJ e+j                   ej                  g d̢       ej                  g d͢            j                         dk(  sJ e+j                   ej                  ddg       ej                  ddg             ej                  ddgddgg      k(  j                         sJ  ej                  g dԢ      Z\ ej                  g dբ      Z]e+j                  e\e]g       ej                  e\e]g      k(  j                         sJ e+j                  e\e]g      j                  dk(  sJ  ed׫        edث       ejf                  ji                  d٫      jk                  ejl                        Z< ee+j                  dګ      re+j                  j                  ndZb	 e+j                  j                  e<      Z@ e:e@ej                  j                  e<      z
        dk  sJ  ed۫       er edݫ        ejh                  ddë      Zee+jw                  eeee      Z@ efe@ej                        sJ dޫ        ej                  e@eeeez  d߫      sJ e+j                  ee      Z@ efe@ej                        sJ e+j                  eedd      Z@ ej                  e@ ej                  eedd      d߫      sJ e+j                  eedŬƫ      Z@ ej                  e@j                  dū       ej                  dë      d߫      sJ  ed       n ed        ed       ejf                  ji                  ddΫ      jk                  ejl                        Z<ejf                  ji                  ddΫ      jk                  ejl                        Z= ej                         Zl emd      D ]  Zne+j                  e<e=      Zn  ej                         elz
  dz  Zp edepddepdz  dd        ede+j                                  ed        ed        ed       yy# e$ r dZdZY w xY w# e$ rZ ede d       Y dZ[dZ[ww xY w# e$ r  ed       Y w xY wc c} w # ed$ rZ ede        Y dZ[~dZ[ww xY w)u  
vgpu_cache.py — Universal VGPU persistent kernel cache.

v3.0 Highlights
---------------
  • ~60 numpy / torch ops exposed as REAL, auto-generated instance methods
    on the cache:  dir(cache), TAB-completion and help() all show them.
  • Computes on moderngl (Linux/macOS/Windows GPU) and numpy (RPi5 / fallback).
  • Persistent kernel cache keyed on (op, N, dtype) — second call is data-only.
  • Transparent torch.Tensor ↔ np.ndarray interop.
  • Universal fallback: any numpy/torch function name not in the registry
    is dispatched on the active backend.

Supported GPU-accelerated ops
-----------------------------
Binary (16): add, subtract, multiply, divide, true_divide, floor_divide,
             power, pow, fmod, remainder, mod, maximum, minimum,
             fmax, fmin, copysign

Unary (40):  negative, absolute, abs, sqrt, cbrt, square, exp, exp2, expm1,
             log, log2, log10, log1p, sin, cos, tan, asin, acos, atan,
             sinh, cosh, tanh, asinh, acosh, atanh, floor, ceil, round,
             trunc, sign, reciprocal, rsqrt, relu, sigmoid, swish,
             softplus, softsign, mish, gelu

Reduce (5):  sum, mean, max, min, prod

Special (4): clip(x, lo, hi), leaky_relu(x, alpha),
             softmax(x, axis=-1), log_softmax(x, axis=-1)

Tensor ops (CPU, exposed as methods): matmul, dot, outer, transpose, reshape,
             squeeze, ravel, flatten, concatenate, stack, where, copy, astype

Universal fallback (active backend): every other numpy.torch function name.

Author: Per Lindholm
License: MIT
    NarmlinuxDarwinWindowsz[VGPU] Platform:  z[VGPU] Raspberry Pi: TFz)[VGPU] RPi5 detected: CPU (numpy) backendcompute_shadermodernglu#   [VGPU] ✅ GPU available (moderngl)u&   [VGPU] ⚠️  No compute shaders; CPUu   [VGPU] ❌ GPU init failed: ; CPUz*[VGPU] moderngl not installed; CPU (numpy)addzA[i] + B[i]subtractzA[i] - B[i]multiplyzA[i] * B[i]dividezB[i] != 0.0 ? A[i] / B[i] : 0.0true_dividefloor_dividezfloor(A[i] / B[i])powerzpow(max(A[i], 0.0), B[i])powfmodz A[i] - B[i] * floor(A[i] / B[i])	remaindermodmaximumzmax(A[i], B[i])minimumzmin(A[i], B[i])fmaxfmincopysignz&(B[i] >= 0.0 ? abs(A[i]) : -abs(A[i]))negativez-A[i]positivez+A[i]absolutez	abs(A[i])abssqrtz
sqrt(A[i])cbrtz$sign(A[i]) * pow(abs(A[i]), 1.0/3.0)rsqrtz1.0 / sqrt(A[i])squarezA[i] * A[i]expz	exp(A[i])exp2z
exp2(A[i])expm1zexp(A[i]) - 1.0logz	log(A[i])log2z
log2(A[i])log10zlog(A[i]) / log(10.0)log1pzlog(1.0 + A[i])sinz	sin(A[i])cosz	cos(A[i])tanz	tan(A[i])asinzasin(clamp(A[i], -1.0, 1.0))acoszacos(clamp(A[i], -1.0, 1.0))atanz
atan(A[i])sinhz
sinh(A[i])coshz
cosh(A[i])tanhz
tanh(A[i])asinhzasinh(A[i])acoshzacosh(max(A[i], 1.0))atanhz)atanh(clamp(A[i], -0.9999999, 0.9999999))floorzfloor(A[i])ceilz
ceil(A[i])roundzfloor(A[i] + 0.5)truncztrunc(A[i])signz.(A[i] > 0.0 ? 1.0 : (A[i] < 0.0 ? -1.0 : 0.0))
reciprocalz
1.0 / A[i]reluzmax(A[i], 0.0)z1.0 / (1.0 + exp(-A[i]))z!A[i] * (1.0 / (1.0 + exp(-A[i])))zlog(1.0 + exp(A[i]))zA[i] / (1.0 + abs(A[i]))z!A[i] * tanh(log(1.0 + exp(A[i])))zL0.5 * A[i] * (1.0 + tanh(0.7978845608 * (A[i] + 0.044715 * A[i]*A[i]*A[i])))z(A[i] == A[i] ? 0.0 : 1.0)z3A[i] == 0.0 ? 0.0 : ((1.0/A[i]) == 0.0 ? 1.0 : 0.0)zG(A[i] != A[i]) || (A[i] == 0.0 ? 0.0 : ((1.0/A[i]) == 0.0 ? 0.0 : 1.0)))
logisticsigmoidswishsoftplussoftsignmishgeluisnanisinfisfinite)0.0(a + b)N)rG   rH   mean)z-3.4028235e+38	max(a, b)N)z3.4028235e+38	min(a, b)N)z1.0(a * b)N)sumrI   maxminprod)clip_dispatch_clip)
leaky_relu_dispatch_leaky_relu)softmax_dispatch_softmax)log_softmaxrV   )rQ   rS   rU   rW   _dispatch_transpose_dispatch_reshape_dispatch_squeeze_dispatch_ravel_dispatch_flatten_dispatch_concatenate_dispatch_stack_dispatch_where_dispatch_copy_dispatch_astype_dispatch_dot_dispatch_outer_dispatch_flip)	transposereshapesqueezeravelflattenconcatenatestackwherecopyastypedotouterflipc                     t         rGt        | t        j                        r-| j	                         j                         j                         }nt        j                  |       }|r|j                  |      S |S )u?   torch.Tensor | ndarray | list → np.ndarray (optionally cast).)
TORCH_AVAILABLE
isinstancetorchTensordetachcpunumpynpasarrayrn   )xdtypearrs      )/home/per/Documents/VGPU/vgpu_cache_v3.py_as_ndarrayr      sP    :a6hhjnn$$&jjm %3::e.3.    c                     t         r[t        | t        j                        rAt        j                  t        j                  |            j                  | j                        S t        j                  |      S )u<   If template is torch → return torch tensor on same device.)	rs   rt   ru   rv   
from_numpyrz   ascontiguousarraytodevice)templatendarrays     r   _as_output_liker      sN    :h= 4 4W =>AA(//RR((r   c                     t         sy| D ]  }t        |t        j                        s y |j	                         D ]  }t        |t        j                        s y y)NFT)rs   rt   ru   rv   values)argskwargsavs       r   _prefer_torchr      sU     a& ]]_ a& r   aw  #version 430 core
layout(local_size_x = {LX}) in;
layout(std430, binding = 0) readonly buffer A_buf {{ float A[]; }};
layout(std430, binding = 1) readonly buffer B_buf {{ float B[]; }};
layout(std430, binding = 2) writeonly buffer C_buf {{ float C[]; }};
uniform int N;
void main() {{
    uint i = gl_GlobalInvocationID.x;
    if (i >= uint(N)) return;
    C[i] = {BODY};
}}
aG  #version 430 core
layout(local_size_x = {LX}) in;
layout(std430, binding = 0) readonly buffer A_buf {{ float A[]; }};
layout(std430, binding = 2) writeonly buffer C_buf {{ float C[]; }};
uniform int N;
void main() {{
    uint i = gl_GlobalInvocationID.x;
    if (i >= uint(N)) return;
    float x = A[i];
    C[i] = {BODY};
}}
a  #version 430 core
layout(local_size_x = {LX}) in;
layout(std430, binding = 0) readonly buffer A_buf {{ float A[]; }};
layout(std430, binding = 1) buffer Out_buf {{ float Out[]; }};
shared float sh[{LX}];
uniform int N;
void main() {{
    uint tid = gl_LocalInvocationID.x;
    float v = {INIT};
    for (uint i = tid; i < uint(N); i += {LX}u) {{
        float a = {OP}(v, A[i]);
        v = a;
    }}
    sh[tid] = v;
    barrier();
    uint s = {LX}u >> 1;
    for (; s > 0u; s >>= 1u) {{
        if (tid < s) {{
            float a = {OP}(sh[tid], sh[tid + s]);
            sh[tid] = a;
        }}
        barrier();
    }}
    if (tid == 0u) Out[0] = sh[0];
}}
c                       e Zd ZdZd Zd Zy)_BinaryKernelctxprogramABCgxNc                 l    ||c| _         | _        |||c| _        | _        | _        ||c| _        | _        y Nr   )selfr   r   r   r   r   r   r   s           r   __init__z_BinaryKernel.__init__'  s7    !$g$,!"Aqar   c                 ,   | j                   j                  |j                                | j                  j                  |j                                | j                   j	                  d       | j                  j	                  d       | j
                  j	                  d       | j                  j                  | j                  dd       t        j                  | j
                  j                         t        j                        j                         S Nr         r}   )r   writetobytesr   bind_to_storage_bufferr   r   runr   rz   
frombufferreadfloat32rm   )r   a_flatb_flats      r   r   z_BinaryKernel.run+  s    V^^%&V^^%&%%a(%%a(%%a(!Q'}}TVV[[]"**=BBDDr   N__name__
__module____qualname__	__slots__r   r    r   r   r   r   %  s    <I Er   r   c                       e Zd ZdZd Zd Zy)_UnaryKernelr   r   r   r   r   r   c                 ^    ||c| _         | _        ||c| _        | _        ||c| _        | _        y r   r   )r   r   r   r   r   r   r   s          r   r   z_UnaryKernel.__init__7  s0    !$g$,Aar   c                    | j                   j                  |j                                | j                   j                  d       | j                  j                  d       | j
                  j                  | j                  dd       t        j                  | j                  j                         t        j                        j                         S )Nr   r   r   r   )r   r   r   r   r   r   r   r   rz   r   r   r   rm   r   x_flats     r   r   z_UnaryKernel.run;  s    V^^%&%%a(%%a(!Q'}}TVV[[]"**=BBDDr   Nr   r   r   r   r   r   5  s    7I Er   r   c                       e Zd ZdZd Zd Zy)_ReduceKernelr   r   r   r   r   c                 N    ||c| _         | _        ||c| _        | _        || _        y r   r   )r   r   r   r   r   r   s         r   r   z_ReduceKernel.__init__E  s(    !$g$,Ar   c                 z   | j                   j                  |j                                | j                   j                  d       | j                  j                  d       | j
                  j                  ddd       t        j                  | j                  j                         t        j                        d   S )Nr   r   r   )r   r   r   r   r   r   r   rz   r   r   r   r   s     r   r   z_ReduceKernel.runI  sw    V^^%&%%a(%%a(Aq!}}TVV[[]"**=a@@r   Nr   r   r   r   r   r   C  s    1IAr   r   c                   V   e Zd ZdZdZd Zd Zed        Zed        Z	ed        Z
ed        Zed	        Zd
 Zd Zd Zd Zd Zd Zd-dZd.dZd/dZd Zd/dZd Zd Zd0dZd0dZd1dZd Zd Zd Zd Z d/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-e.d,        Z/y)2	VGPUCachea
  
    Universal persistent kernel cache for numpy / torch ops.

    Every GPU-accelerated op in this class is a real instance method,
    automatically generated from the SUPPORTED_* registries in `__init__`.
    Tab-complete and `dir(cache)` show the full list.
    @   c                    i | _         dddddi dd| _        t        | _        t        | _        | j                  r$t        dk(  r	 t        j                         | _        nd | _        t        d| j                  rdnd	 d
t        rdt        rdnd dndz          | j                          y # t        $ r'}t        d| d       d| _        d | _        Y d }~pd }~ww xY w)Nr   )compiles
cache_hits
dispatches	cpu_calls	gpu_callsop_calls	fallbacksr	   z[VGPU] GPU context error: r
   Fz[VGPU] Using GPUCPUz backendz	 (torch: onoff) )_kernels_statsGPU_AVAILABLEgpu_availableGPU_BACKENDgpu_backendr	   create_standalone_contextr   	Exceptionprintrs   _bind_methods)r   es     r   r   zVGPUCache.__init__c  s    
 +(+";)#==? DHt'9'9euEXN# _T%@B)+- 	.
 	  )21#U;<%*"$()s   B) )	C2CCc                    t         D ]2  }t        | |t        j                  | j	                  |      |              4 t
        D ]2  }t        | |t        j                  | j                  |      |              4 t        j                         D ]9  \  }\  }}t        | |t        j                  | j                  ||      |              ; t        j                         D ]6  \  }}t        | |t        j                  | j                  ||      |              8 t        D ]2  }t        | |t        j                  | j                  |      |              4 y)z;Attach every supported op as a fully-bound instance method.N)BINARY_GLSLsetattrtypes
MethodType_make_binary_dispatcher
UNARY_GLSL_make_unary_dispatcherSPECIAL_OPSitems_make_special_dispatcher
TENSOR_OPS_make_tensor_dispatcherREDUCE_GLSL_make_reduce_dispatcher)r   op_dispatch_attrs       r   r   zVGPUCache._bind_methods  sO    	9BD"e..,,R0$8 9	9  	8BD"e..++B/7 8	8 '2&7&7&9 	I"B"MD"e..--b-@$H I	I ",!1!1!3 	HBD"e..,,R?G H	H  	9BD"e..,,R0$8 9	9r   c                 6      fd} |_         d  d|_        |S )Nc                 .     | j                   ||fi |S r   )_dispatch_binary)r   r   br   r   s       r   methodz1VGPUCache._make_binary_dispatcher.<locals>.method  s    (4((Q<V<<r   GPU-accelerated `z"(a, b)` with numpy/torch fallback.r   __doc__r   r   s   ` r   r   z!VGPUCache._make_binary_dispatcher  s%    	=-bT1STr   c                 6      fd} |_         d  d|_        |S )Nc                 ,     | j                   |fi |S r   )_dispatch_unaryr   r|   r   r   s      r   r   z0VGPUCache._make_unary_dispatcher.<locals>.method  s    '4''A888r   r   (x)` with numpy/torch fallback.r   r   s   ` r   r   z VGPUCache._make_unary_dispatcher  s%    	9-bT1PQr   c                 6      fd} |_         d  d|_        |S )Nc                 ,     | j                   |fi |S r   )_dispatch_reducer   s      r   r   z1VGPUCache._make_reduce_dispatcher.<locals>.method  s    (4((Q9&99r   r   r   r   r   s   ` r   r   z!VGPUCache._make_reduce_dispatcher  s%    	:-bT1PQr   c                 6    fd}| |_         d|  d|_        |S )Nc                 (     t        |       |i |S r   getattrr   r   r   r   s      r   r   z2VGPUCache._make_special_dispatcher.<locals>.method      /74/@@@r   `u3   (...)` — GPU when possible, numpy/torch fallback.r   r   r   r   s    ` r   r   z"VGPUCache._make_special_dispatcher  s&    	AbT!TUr   c                 6    fd}| |_         d|  d|_        |S )Nc                 (     t        |       |i |S r   r   r  s      r   r   z1VGPUCache._make_tensor_dispatcher.<locals>.method  r  r   r  u8   (...)` — tensor-layout op, runs on the active backend.r   r  s    ` r   r   z!VGPUCache._make_tensor_dispatcher  s&    	AbT!YZr   c                    t        |t        j                        }t        |t        j                        }|j                  \  }}|j                  \  }}||k(  sJ d| d|        d|||f}	| j                  dxx   dz  cc<   | j                  d   j                  dd      dz   | j                  d   d<   | j                  | j                  r	 |	| j                  v r| j                  dxx   dz  cc<   n7| j                  |||      | j                  |	<   | j                  d	xx   dz  cc<    | j                  |	   ||      j                  ||      }
| j                  d
xx   dz  cc<   t        ||
      S | j                  dxx   dz  cc<   t        |||z        S # t        $ r7}t        d| d       d| _        | j                  dxx   dz  cc<   Y d }~ad }~ww xY w)Nzmatmul: inner dims mismatch: z vs matmulr   r   r   r   r   r   r   z[VGPU] GPU matmul failed: r
   Fr   r   )r   rz   r   shaper   getr   r   r   _compile_matmulrf   r   r   r   )r   r   r   t0t1MKK2r   keyresultr   s               r   r	  zVGPUCache.matmul  s   BJJ'BJJ'xx1ABwC7s$rdCCwAq!L!Q&!,0KK
,C,G,GRS,TWX,XJ)88D$6$6.$--'KK-2-)-)=)=aA)FDMM#&KK
+q0++s+B3;;AqAK(A-(&q&11
 	K A% q"r'**  .21#U;<%*"K(A-((.s   B%F 	G"-GGc                   	
 d| d| d| d| d| d| d}| j                   j                  |      | j                   j                  ||z  dz  	      | j                   j                  ||z  dz  	      | j                   j                  ||z  dz  	      t        d
|dz   dz        	t        d
|dz   dz        
 G 	
fdd      }t	        d| d| d|         |       S )Na}  
#version 430 core
layout(local_size_x = 16, local_size_y = 16) in;
layout(std430, binding = 0) readonly buffer A_buf { float A[]; };
layout(std430, binding = 1) readonly buffer B_buf { float B[]; };
layout(std430, binding = 2) writeonly buffer C_buf { float C[]; };
void main() {
    uint row = gl_GlobalInvocationID.y;
    uint col = gl_GlobalInvocationID.x;
    if (row >= uint(z) || col >= uint(z?)) return;
    float sum = 0.0;
    for (uint k = 0u; k < uint(z&); k++) {
        sum += A[row * uint(z) + k] * B[k * uint(z!) + col];
    }
    C[row * uint(z) + col] = sum;
}
   reserver         c                   ,    e Zd ZdZ fdZd Zy)0VGPUCache._compile_matmul.<locals>._MatmulKernelprogr   r   r   r   gyc                 Z    | _         | _        | _        | _        | _        | _        y r   r  )r   A_bufB_bufC_bufr   r  r  s    r   r   z9VGPUCache._compile_matmul.<locals>._MatmulKernel.__init__  s.    $	etv5DFPU^`VZV]ikaeahr   c                 $   | j                   j                  |j                                | j                  j                  |j                                | j                   j	                  d       | j                  j	                  d       | j
                  j	                  d       | j                  j                  | j                  | j                  d       t        j                  | j
                  j                         t        j                        S r   )r   r   r   r   r   r   r  r   r   r  rz   r   r   r   )r   r   r   s      r   __call__z9VGPUCache._compile_matmul.<locals>._MatmulKernel.__call__  s    QYY[)466<<		+D--a0$&&2O2OPQ2R--a0		dggtww2}}TVV[[]"**EEr   N)r   r   r   r   r   r$  )r   r!  r"  r   r  r  s   r   _MatmulKernelr    s    6IkkFr   r%  u   [VGPU] ✅ compiled matmul r|   )r   r   bufferrN   r   )r   r  r  r   srcr%  r   r!  r"  r   r  r  s         @@@@@@r   r  zVGPUCache._compile_matmul  s   	 C( ,  !s #C3A3 7 " xx&&s+A	2A	2A	2QVN#QVN#	F 	F 	F 	+A3as!A378r   c                    t         |   }t        |      j                  t        j                  d      }t        |      j                  t        j                  d      }t        j
                  |j                  |j                        }t        j                  ||      }	t        j                  ||      }
|rt        t        j                  |            nd}| j                  dxx   dz  cc<   | j                  d   j                  |d      dz   | j                  d   |<   | j                  | j                  r|dkD  r	 ||f}|| j                  v r| j                  dxx   dz  cc<   n7| j                  |||      | j                  |<   | j                  dxx   dz  cc<   | j                  |   j!                  |	j#                  d	      |
j#                  d	            }| j                  d
xx   dz  cc<   t%        ||j#                  |            S | j                  dxx   dz  cc<   t+        ||f|      rt-        |t.        j0                        r|nt/        j2                  |      }t-        |t.        j0                        r|nt/        j2                  |      }t5        t.        |d       r t5        t.        |d       ||      S t%        | t5        t        |      ||fi |      S t%        | t5        t        |      ||fi |      S # t&        $ r;}t)        d| d| d       d| _        | j                  dxx   dz  cc<   Y d }~3d }~ww xY w)NFrm   r   r   r   r   r   r   r   [VGPU] GPU 	 failed: r
   r   r   )r   r   rn   rz   r   broadcast_shapesr
  broadcast_tointrP   r   r  r   r   r   _compile_binaryr   rf   r   r   r   r   rt   ru   rv   	as_tensorr  )r   r   r   r   r   bodya_ndb_nd	out_shapea_bb_br   r  flatr   tatbs                    r   r   zVGPUCache._dispatch_binary	  s   21~$$RZZe$<1~$$RZZe$<''

DJJ?	oodI.oodI.)2c"'')$%L!Q&!&*kk*&=&A&A"a&H1&LJ#88D$6$61q5.1g$--'KK-2-)-)=)=b!T)JDMM#&KK
+q0+}}S)--ckk"os{{2OK(A-(&q$,,y*ABB 	K A% !Q( ELL1ut7LB ELL1ut7LB7>ub$7O+75"d+B3 O$QBd(Mf(MNOq/'"b/$"G"GHH  .B4y59:%*"K(A-((.s   =CL 	M
0M  Mc                    t         |   }t        |      j                  t        j                  d      }t        |j                        }|j                  }| j                  dxx   dz  cc<   | j                  d   j                  |d      dz   | j                  d   |<   | j                  | j                  r|dkD  r	 ||f}|| j                  v r| j                  dxx   dz  cc<   n7| j                  |||      | j                  |<   | j                  dxx   dz  cc<   | j                  |   j                  |j                  d	            }	| j                  d
xx   dz  cc<   t!        ||	j                  |            S | j                  dxx   dz  cc<   t'        t        |d       }t)        |f|      rYt'        t*        |d       rHt-        |t*        j.                        r|nt+        j0                  |      } t'        t*        |      |fi |S |t!        | ||fi |      S t3        d|      # t"        $ r:}
t%        d| d|
 d       d| _        | j                  dxx   dz  cc<   Y d }
~
d }
~
ww xY w)NFr)  r   r   r   r   r   r   r*  r   r+  r,  r
   r   r   zUnknown unary op: )r   r   rn   rz   r   r/  sizer
  r   r  r   r   r   _compile_unaryr   rf   r   r   r   r  r   ru   rt   rv   r1  AttributeError)r   r   r|   r   r2  x_ndr   r
  r  r8  r   fn_nptxs                r   r   zVGPUCache._dispatch_unary,  s,   "~1~$$RZZe$<499~

L!Q&!&*kk*&=&A&A"a&H1&LJ#88D$6$61q5.1g$--'KK-2-)-)<)<RD)IDMM#&KK
+q0+}}S)--dll2.>?K(A-(&q$,,u*=>> 	K A% B%!v&75"d+C ELL1ut7LB%75"%b3F33"1eD&;F&;<<1"899  .B4y59:%*"K(A-((.s   <B?H- -	I060I++I0c                    t         |   \  }}}t        |      j                  t        j                  d      j                  d      }t        |j                        }| j                  dxx   dz  cc<   | j                  d   j                  |d      dz   | j                  d   |<   | j                  | j                  r|dkD  r	 ||f}	|	| j                  v r| j                  dxx   dz  cc<   n8| j                  ||||      | j                  |	<   | j                  d	xx   dz  cc<   | j                  |	   j                  |      }
| j                  d
xx   dz  cc<   |dk(  r
|dkD  r|
|z  }
t        |t        j                   |
|j"                              S | j                  dxx   dz  cc<   t)        t        |d       }t+        |f|      r{t)        t,        |d       rjt/        |t,        j0                        r|n6t-        j2                  |j                  t        |      j4                              } t)        t,        |      |fi |S |7t        |      }t        | ||fi |j                  |j"                              S t7        d|      # t$        $ r;}t'        d| d| d       d| _        | j                  dxx   dz  cc<   Y d }~6d }~ww xY w)NFr)  r*  r   r   r   r   r   r   r   rI   r   z[VGPU] GPU reduce r,  r
   r   r   zUnknown reduce op: )r   r   rn   rz   r   rf   r/  r<  r   r  r   r   r   _compile_reducer   r   arrayr}   r   r   r  r   ru   rt   rv   r1  r
  r>  )r   r   r|   r   init	glsl_bodypostr?  r   r  valr   r@  rA  x_fulls                  r   r   zVGPUCache._dispatch_reduceM  s~    +Bi1~$$RZZe$<DDRH499~L!Q&!&*kk*&=&A&A"a&H1&LJ#88D$6$61q5.1g$--'KK-2-)-)=)=b!T9)UDMM#&KK
+q0+mmC(,,T2K(A-(6>a!e'C&q"((3djj*IJJ 	K A% B%!v&75"d+C ELL1ut||T_`aTbThThGi7jB%75"%b3F33 ^F"1f''..v||<> >22&9::  .*2$is%@A%*"K(A-((.s   CJ 	K0K

Kc                    t        |      j                  t        j                  d      }t	        |j
                        }|j                  }| j                  dxx   dz  cc<   | j                  d   j                  dd      dz   | j                  d   d<   | j                  "| j                  r|dkD  r	 d|t        |      t        |      f}|| j                  v rRt        |      | j                  |   _        t        |      | j                  |   _        | j                  dxx   dz  cc<   n7| j                  |||      | j                  |<   | j                  d	xx   dz  cc<   | j                  |   j!                  |j#                  d
            }| j                  dxx   dz  cc<   t%        ||j#                  |            S | j                  dxx   dz  cc<   t%        |t        j*                  t        |      ||            S # t&        $ r7}	t)        d|	 d       d| _
        | j                  dxx   dz  cc<   Y d }	~	|d }	~	ww xY w)NFr)  r   r   r   rQ   r   r   r   r*  r   z[VGPU] GPU clip failed: r
   r   r   )r   rn   rz   r   r/  r<  r
  r   r  r   r   floatr   LOHI_compile_clipr   rf   r   r   r   rQ   )
r   r|   lohir?  r   r
  r  r8  r   s
             r   rR   zVGPUCache._dispatch_clipr  s   1~$$RZZe$<499~

L!Q&!*.++j*A*E*Efa*PST*TJ'88D$6$61q5.q%)U2Y7$--',1"IDMM#&),1"IDMM#&)KK-2-)-););Ar2)FDMM#&KK
+q0+}}S)--dll2.>?K(A-(&q$,,u*=>>
 	K A% q"''+a."b"ABB  .059:%*"K(A-((.s   6DH 	I-I  Ic           	         t        |      j                  t        j                  d      }t	        |j
                        }|j                  }| j                  dxx   dz  cc<   | j                  d   j                  dd      dz   | j                  d   d<   | j                  | j                  r|dkD  r	 d|t        |      f}|| j                  v r| j                  dxx   dz  cc<   n6| j                  ||      | j                  |<   | j                  d	xx   dz  cc<   | j                  |   j                  |j                  d
            }| j                  dxx   dz  cc<   t!        ||j                  |            S | j                  dxx   dz  cc<   t        |      }	t!        |t        j&                  |	dkD  |	||	z              S # t"        $ r7}t%        d| d       d| _
        | j                  dxx   dz  cc<   Y d }~d }~ww xY w)NFr)  r   r   r   rS   r   r   r   r*  r   z[VGPU] GPU leaky_relu failed: r
   r   r   )r   rn   rz   r   r/  r<  r
  r   r  r   r   rK  r   _compile_leaky_relur   rf   r   r   r   rl   )
r   r|   alphar?  r   r
  r  r8  r   r   s
             r   rT   zVGPUCache._dispatch_leaky_relu  s   1~$$RZZe$<499~

L!Q&!04J0G0K0KLZ[0\_`0`J-88D$6$61q5.#Qe5$--'KK-2-)-)A)A!U)KDMM#&KK
+q0+}}S)--dll2.>?K(A-(&q$,,u*=>>
 	K A% Nq"((1q5!UQY"?@@  .6qc?@%*"K(A-((.s   3CG 	H-H  Hc                     t        |      j                  t        j                  d      }| j                  dxx   dz  cc<   | j                  d   j                  |d      dz   | j                  d   |<   t        j                  ||d      }t        j                  ||z
        }|j                  |d      }|d	k(  rt        |||z        S t        |t        j                  |      t        j                  |      z
        S )
z/Supports softmax and log_softmax (single-axis).Fr)  r   r   r   r   TaxiskeepdimsrU   )r   rn   rz   r   r   r  rN   r#   rM   r   r&   )r   r|   rV  kindr?  mexss           r   rV   zVGPUCache._dispatch_softmax  s    1~$$RZZe$<L!Q&!(,J(?(C(CD!(Lq(PJ%VVDtd3VVD1HVVV-9"1b1f--q"&&*rvvay"899r   Nc                     t        |      }|rt        j                  ||      n|j                  }t	        |t        j
                  |            S )N)axes)r   rz   re   Tr   r   )r   r|   r]  r?  r  s        r   rX   zVGPUCache._dispatch_transpose  s;    1~26d.DFFq""6"6v">??r   c                 F    t        | t        |      j                  |       S r   )r   r   rf   )r   r|   r
  s      r   rY   zVGPUCache._dispatch_reshape  s!    q"8+a."8"8%"@AAr   c                 V    t        |t        j                  t        |      |            S NrV  )r   rz   rg   r   r   r|   rV  s      r   rZ   zVGPUCache._dispatch_squeeze  s    q"**[^$"GHHr   c                 H    t        |t        |      j                               S r   )r   r   rh   r   r|   s     r   r[   zVGPUCache._dispatch_ravel  s    q+a."6"6"899r   c                 H    t        |t        |      j                               S r   )r   r   ri   re  s     r   r\   zVGPUCache._dispatch_flatten  s    q+a."8"8":;;r   c                     |D cg c]  }t        |       }}t        |d   t        j                  ||            S c c}w Nr   rb  )r   r   rz   rj   r   xsrV  r   arrss        r   r]   zVGPUCache._dispatch_concatenate  s:    (*+1A++r!ubnnT&EFF ,   =c                     |D cg c]  }t        |       }}t        |d   t        j                  ||            S c c}w rh  )r   r   rz   rk   ri  s        r   r^   zVGPUCache._dispatch_stack  s:    (*+1A++r!ubhht$&?@@ ,rl  c           
          |*|(t        |t        j                  t        |                  S t        |t        j                  t        |      t        |      t        |                  S r   )r   rz   rl   r   )r   condr|   ys       r   r_   zVGPUCache._dispatch_where  sN    9"4+d2C)DEEq"((;t+<k!nkZ[n"]^^r   c                 H    t        |t        |      j                               S r   )r   r   rm   re  s     r   r`   zVGPUCache._dispatch_copy  s    q+a."5"5"788r   c                 J    t        |t        |      j                  |            S r   )r   r   rn   )r   r|   r}   s      r   ra   zVGPUCache._dispatch_astype  s    q+a."7"7">??r   c           	      f    t        |t        j                  t        |      t        |                  S r   )r   rz   ro   r   r   r   r   s      r   rb   zVGPUCache._dispatch_dot  s"    q"&&QQ"HIIr   c           	      f    t        |t        j                  t        |      t        |                  S r   )r   rz   rp   r   rt  s      r   rc   zVGPUCache._dispatch_outer  s"    q"((;q>;q>"JKKr   c                     |(t        |t        j                  t        |                  S t        |t        j                  t        |      |            S ra  )r   rz   rq   r   rc  s      r   rd   zVGPUCache._dispatch_flip  s=    <"1bggk!n&=>>q"''+a.t"DEEr   c           	         | j                   }t        d||z   dz
  |z        }t        j                  ||      }| j                  j                  |      }| j                  j                  |dz        }| j                  j                  |dz        }	| j                  j                  |dz        }
t        d| d| d       t        | j                  |||	|
||      S Nr   LXBODYr  r  u   [VGPU] ✅ compiled  (N=r   )	rz  rN   BINARY_TEMPLATEformatr   r   r&  r   r   )r   r   r   r2  rz  r   r'  r  r   r   r   s              r   r0  zVGPUCache._compile_binary  s    WW3q1r6A:""45b$$$6xx&&s+HHOOAEO*HHOOAEO*HHOOAEO*$RDQCq12TXXtQ1b!<<r   c                 |   | j                   }t        d||z   dz
  |z        }t        j                  ||      }| j                  j                  |      }| j                  j                  |dz        }| j                  j                  |dz        }	t        d| d| d       t        | j                  |||	||      S rx  )	rz  rN   UNARY_TEMPLATEr~  r   r   r&  r   r   )
r   r   r   r2  rz  r   r'  r  r   r   s
             r   r=  zVGPUCache._compile_unary  s    WW3q1r6A:""45b##r#5xx&&s+HHOOAEO*HHOOAEO*$RDQCq12DHHdAq"a88r   c                    d}d|j                  dd      j                  dd      j                  dd      j                  dd       d}dj                  |      }t        j                  |||	      }| j                  j	                  |      }	| j                  j                  |d
z        }
| j                  j                  d
      }t        d| d| d       t        | j                  |	|
||      S )N   (rH   rL   rJ   rK   r   z({0}))rz  INITOPr  r  u   [VGPU] ✅ compiled reduce r|  )replacer~  REDUCE_TEMPLATEr   r   r&  r   r   )r   r   r   rE  r2  rz  merge_op_glslglsl_opr'  r  r   r   s               r   rC  zVGPUCache._compile_reduce  s    DLL9=EEiPYZbbcnoz{  D  D  EP  Q\  ]  ^  ^_  `..&$$'$Bxx&&s+HHOOAEO*HHOOAO&+B4tA3a89TXXtQ155r   c           	         | j                   }t        d||z   dz
  |z        }t        j                  |d      }| j                  j                  |      }t              |d<   t              |d<   | j                  j                  |dz        }| j                  j                  |dz        }	 G fdd	t              }
t        d
| d d d        |
| j                  |||	||      S )Nr   zclamp(x, LO, HI)ry  rL  rM  r  r  c                   .     e Zd Z fdZ fdZ xZS ),VGPUCache._compile_clip.<locals>._ClipKernelc                 n    t         |   ||||||       t        	      | _        t              | _        y r   )superr   rK  rL  rM  )
r   r   r   r   r   r   r   	__class__rP  rO  s
          r   r   z5VGPUCache._compile_clip.<locals>._ClipKernel.__init__  s/     gq!R;)uRyTWr   c                     | j                   | j                  d<   | j                  | j                  d<   t        |   |      S )NrL  rM  )rL  r   rM  r  r   )r   r   r  s     r   r   z0VGPUCache._compile_clip.<locals>._ClipKernel.run  s6    %)WWT"%)WWT"w{6**r   )r   r   r   r   r   __classcell__)r  rP  rO  s   @r   _ClipKernelr    s    9+ +r   r  u   [VGPU] ✅ compiled clip (N=z, lo=z, hi=r   )
rz  rN   r  r~  r   r   rK  r&  r   r   )r   r   rO  rP  rz  r   r'  r  r   r   r  s     ``       r   rN  zVGPUCache._compile_clip  s    WW3q1r6A:""45b### $ 
 xx&&s+2YT
2YT
HHOOAEO*HHOOAEO*	+, 	+ 	,QCuRDbTCD488T1aQ77r   c                    | j                   }t        d||z   dz
  |z        }dt        |       d}t        j	                  ||      }| j
                  j                  |      }| j
                  j                  |dz        }| j
                  j                  |dz        }	t        d| d| d	       t        | j
                  |||	||      S )
Nr   z(x > 0.0 ? x : z * x)ry  r  r  u"   [VGPU] ✅ compiled leaky_relu (N=z, alpha=r   )
rz  rN   rK  r  r~  r   r   r&  r   r   )
r   r   rS  rz  r   r2  r'  r  r   r   s
             r   rR  zVGPUCache._compile_leaky_relu  s    WW3q1r6A:""45b ue4##r#5xx&&s+HHOOAEO*HHOOAEO*21#XeWAFGDHHdAq"a88r   c                 .     | j                   |g|i |S )z.`cache('add', a, b)` style universal dispatch.dispatchr   op_namer   r   s       r   r$  zVGPUCache.__call__*  s    t}}W6t6v66r   c                    |dk(  r | j                   |i |S |t        v r | j                  |g|i |S |t        v r | j                  |g|i |S |t
        v r | j                  |g|i |S |t        v r t        | t        |   d         |i |S |t        v r t        | t        |         |i |S  | j                  |g|i |S )zDRoute by op registry. Falls back to numpy/torch for everything else.r	  r   )r	  r   r   r   r   r   r   r   r  r   _dispatch_cpur  s       r   r  zVGPUCache.dispatch.  s    h4;;///k!(4((B4B6BBj '4''A$A&AAk!(4((B4B6BBk!974W!5a!894J6JJj 574G!45tFvFF!t!!';D;F;;r   c           
         | j                   dxx   dz  cc<   | j                   d   j                  |d      dz   | j                   d   |<   |r|d   nd}t        t        |d      }t        rt        t
        |d      nd}||t        d|d      t        ||      r|t        d |D              }|j                         D 	ci c]J  \  }}	|t        |	t
        j                        r|	n't        j                  t        j                  |	            L }
}}	 ||i |
S t        d	 |D              }|j                         D 	ci c]  \  }}	|t        |	       }}}	t        | ||i |      S c c}	}w c c}	}w )
zGLook up `op_name` in numpy, then torch. Result in flavour of first arg.r   r   r   r   Nz[VGPU] Unknown op: u    — not in numpy or torchc              3      K   | ]H  }t        |t        j                        r|n't        j                  t	        j
                  |             J y wr   )rt   ru   rv   r1  rz   r{   .0r   s     r   	<genexpr>z*VGPUCache._dispatch_cpu.<locals>.<genexpr>I  s@      *  !+1ell ;1QSQ[Q[\]Q^A__ *s   AAc              3   2   K   | ]  }t        |        y wr   )r   r  s     r   r  z*VGPUCache._dispatch_cpu.<locals>.<genexpr>O  s     6AQ6s   )r   r  r  rz   rs   ru   r>  r   tupler   rt   rv   r1  r{   r   r   )r   r  r   r   r   np_fntorch_fnt_argskr   t_kwarr_argsarr_kws                r   r  zVGPUCache._dispatch_cpu?  st   K A% +/;;z+B+F+FwPQ+RUV+VJ("472w-4C75'40=X- #6wkA[!\]]v&8+? *$(* *F #),,.2!Q z!U\\:!PRPZPZ[\P]@^^ 2D 2V,t,,66628,,.A$!QA{1~%AAx)CF)CDD2
 Bs   AE-E3c                 r     |j                  d      s	|dk(  s|dv rt        |      | fd}|_        |S )z;Last-resort fallback: `cache.<any_numpy_or_torch_op>(...)`.r   r   )r   rz  r   r   c                  0     j                   g| i |S r   r  )r   r   r   r   s     r   _dynz#VGPUCache.__getattr__.<locals>._dynY  s     4==5d5f55r   )
startswithr>  r   )r   namer  r   s   `  @r   __getattr__zVGPUCache.__getattr__S  s?    ??345=GG &&	6r   c                    t        t        j                               t        t        j                               t        t        j                               t        t
        j                               t        t        j                               dgd}|j                         D ]3  \  }}t        d|ddt        |      dddj                  |              5 y	)
z)Print the full set of supported op names.r	  )zBinary (GPU)zUnary (GPU)zReduce (GPU)zSpecial (GPU/CPU)zTensor (CPU)zmatmul (GPU/CPU)z  18sz (z>3dz)  , N)sortedr   keysr   r   r   r   r   r   lenjoin)r   groupsgnamess       r   list_opszVGPUCache.list_opsa  s     #;#3#3#56":??#45";#3#3#56!'(8(8(:!;"():";#+*
  	GHAuBqgRE
3/s499U3C2DEF	Gr   c                 :   | j                   }| j                  rdnd}dj                  d t        |d   j	                               D              }d| d|d    d	|d
    d|d    d|d    d|d    d|d    d|rd| dndz   dt        | j                         z   S )Nr   r   r  c              3   0   K   | ]  \  }}| d |   yw)=Nr   )r  r  r   s      r   r  z#VGPUCache.report.<locals>.<genexpr>q  s     Mtq!1#Qqc
Ms   r   zVGPUCache [z]: r   z compiles, r   z cache hits, r   z dispatches, r   z GPU, r   z CPU, r   z
 fallbacksz
  | ops: {}r   z  | kernels cached: )r   r   r  r  r   r  r   )r   r[  backendopss       r   reportzVGPUCache.reportn  s    KK--%5iiMva
m6I6I6K/LMMgYcZ=/\?#=\?#=[>"&;(8[>"*. -0[R(R9 )T]]);(<=> 	?r   c                 N    | j                   j                          t        d       y )Nz[VGPU] kernel cache cleared)r   clearr   r   s    r   r  zVGPUCache.clear{  s    +,r   c                 ,    t        | j                        S r   )dictr   r  s    r   statszVGPUCache.stats  s    DKK  r   )g{Gz?)r*  rU   r   )r   )NN)0r   r   r   r   rz  r   r   staticmethodr   r   r   r   r   r	  r  r   r   r   rR   rT   rV   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   r0  r=  rC  rN  rR  r$  r  r  r  r  r  r  propertyr  r   r   r   r   r   U  sI    
B
H9(          +4$R!IF:B";JC4A2:@
BI:<GA_
9@JLF=968.97<"E(	G?- ! !r   r   __main__zF======================================================================u3   VGPU Universal Cache v3.0 — full op coverage demoz)
[1] Available ops (dir() introspection):r   z   z callable ops exposed on cacheuX      e.g. cache.add, cache.relu, cache.sum, cache.clip, cache.transpose, cache.softmax …z'
[2] Full op list via cache.list_ops():z
[3] matmul(4x4 @ 4x4):r  gMbP?u      ✓ verifiedz
[4] Binary elementwise ops:i   g      ?)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u      ✓ verified all z GPU-backed binary opsz
[5] Unary elementwise ops:g?)r   r   r   r   r    r!   r"   r#   r"   r%   r&   r'   r(   r)   r;   r6   r7   r8   r9   r:   r<   r>   r?   r@   rA   rB   rC   r   rD   rE   rF   u      ✓ verified z GPU-backed unary ops)r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   z trig / hyperbolic opsz
[6] Reductions:i    u%      ✓ verified sum/mean/max/min/prodz
[7] Special ops:g      g?)rS     r  r*  rb  rU  u9      ✓ verified clip / leaky_relu / softmax / log_softmaxz
[8] Tensor-layout ops:      )r   r   r  )r            r   r   
      (   )r   r   r  r  )r  r     r  )r   r  u?      ✓ verified transpose / reshape / dot / outer / cat / stackz)
[9] Universal fallback for any numpy op:d   invu.      ✓ c.linalg.norm(a) works (numpy fallback)u      ✗ fallback failed: z
[10] torch.Tensor round-trip:zshould return torch)atoluD      ✓ torch tensors preserved end-to-end (matmul/relu/clip/softmax)z;
[10] torch.Tensor round-trip skipped (torch not installed)u,   
[11] benchmark: 1000× cache.add on 32×32:i  z.2fz ms total,  ~z.3fz ms eachzG
======================================================================u   ✅ All tests passed.r   )rr   ry   rz   ossysplatformtimer   machiner  IS_RASPBERRY_PIsystemIS_MACOS
IS_WINDOWSr   ru   rs   ImportErrorr   r   r	   r   _probehasattrr   r   r   r   r   r   r   r   r   r   r   r}  r  r  r   r   r   r   r   cr  dircallabler  op_namesr  r  randomrandnrn   r   r   r   rN   r   r	  r   r   r   refoutr  seta2trigrQ   clip_outrS   leakyrl   sm_inrU   sm_outr#   ref_smrM   rW   lsm_outr&   arangerf   re   r^  allro   rD  itemrp   c1c2rj   rk   r
  linalgr  normr>  trt   rv   allcloser<   clamponesr  ranger   r   dtr  )ns   0r   <module>r     s  %L  	 
   
 #(""$//6R7cll;R!(//#x/!(//#y0
 /(//+,A.>h.>.>.@-AB C o./ 0O 89:		;7X779Fv/0V5J5J $ *;<>?	] ] ]	
 6 6 ) 0 
0 7 7 
7 & & &  &!" =#(/'/'/ +/ 
+	/
 ,/ 8/ $/ -/ 
+/ ,/ #/ 
+/ ,/ )/ #/  
+!/" 
+#/$ 
+%/& 0'/( 0)/* ,+/, ,-/. ,//0 ,1/2 -3/4 )5/6 =7/8 -9/: ,;/< %=/> -?/@ BA/B ,C/D "E/F -,5(,59.G5[/
f 12110 3855	 *''%'+%%$&#%$
(/)	 >E E E EA A$l! l!d z	(O	
?@	(OA 

67#a& 4QS0A#GAqM2  4 5H	CH<
=>	 ; = 

45JJL 

$%
		1$$RZZ0A
		1$$RZZ0A266&"&&!Q!a%/01D888	
 

)*
		$$RZZ0Aryyt$++BJJ783>AA 4 gb"oa#ganQ"rvvfbffS3Y'(4/33/4 
   &}  "~  !  U  V  W 

()ryyt$++BJJ783>DA'C S
C 4gb"oa ganQrvvfbffS3Y'(4/33/4 
SXJ&;
<= 
		%	%bjj	1C	7B%D 4ganR gb"ob!rvvfbffS3Y'(4/33/	4
 
SYK'=
>? 


		$$RZZ0A3 )gb"oa ganQ39~$(b($) 

12 


		$$RZZ0Avvas#H266&"&&GBGGAtS$99:;dBBBLL$L'E266&"&&!a%D1H!==>?$FFFIIOOAr"))"**5EYYu2Y&FRVVEEII2I==>Ffjjb4j88F266&"&&&)*T111mmEm+G266&"&&6266&>123d:::	
EF 

$%		"a#**2::6AKKNacc!&&(((IIaA!))Aq/16688855'"HBHHW$56;;=CCCGGHBHHaUOXRXXr"g%678288bWbQSWDU;VV[[]]]	)	B	)	BMM2r(#~r~~r2h'??DDFFFGGRH##u,-,	
KL 

67
		##BJJ/A!!((E2!((,,C.hhmmA3**+d222>?
 /0EKK1hhq!n#u||,C.CC,u~~c1q5t444ffQi#u||,,,ffQc"u~~c;5;;q$#<4HHHiii#u~~cggbk:5::a=tDDDTULM 

9:
		B&&rzz2A
		B&&rzz2A	B4[ EE!QK
$))+
d	"B	C3x}RWSM
:;	C
|
	/	
!"	(Oe W  EO*  	;059::	; 8	
678z4P  .(,--.sm   +r: 6s) ;s
 :s=s=At :	ss
s&s!s) !s&&s) )s:9s:ttt