
    PHj&              	           d dl Z G d d      Zd Zd Zd Zd Zd Zd	 Zd
 Z	d Z
d Zd Zedk(  r eddd      Zedz   Z ededej#                                edz  Z ededej#                                edz  Z ededej#                                 e ej(                  g d            Z ededz   j#                                 ededz  j#                                 eej,                  j/                  dd            Z eej,                  j/                  dd            Zeez  Z edej6                          ed ej8                  ej#                         ej#                         ej#                         z               d ed!<    ed"ej#                                 e ej(                  ddgdd#gg            Z ed$ej=                  d %      j#                                 ed&ej?                         j#                                yy)'    Nc                       e Zd ZdZdZdZd Zd Zed        Z	ed        Z
ed        Zd	 Zed
        Zd Zd ZeZd Zd Zd ZeZd Zd Zd Zd Zd Zd Zd Zd Zd ZddZddZ d Z!d Z"d Z#y) RANArrayz
    Array-valued Rational-Addition Number: elementwise a/b + c.
    Supports numpy broadcasting, arrays, matrices, scalars, and standard
    arithmetic operators (+, -, *, /, @, **).
    abci  c                     t        j                  |t         j                        | _        t        j                  |t         j                        | _        t        j                  |t         j                        | _        y Ndtype)npasarrayfloat64r   r   r   )selfr   r   r   s       I/home/per/Documents/rational-addition-number-system/ran_array_complete.py__init__zRANArray.__init__   sD    ARZZ0ARZZ0ARZZ0    c                 N    | j                   | j                  z  | j                  z   S )z(Evaluate a/b + c. Returns a numpy array.r   r   s    r   collapsezRANArray.collapse   s    vv''r   c                     t        | j                  j                  | j                  j                  | j                  j                        S N)r   r   Tr   r   r   s    r   r   z
RANArray.T   s)    $&&((DFFHH55r   c                     t        j                  | j                  | j                  | j                        j
                  S r   )r   	broadcastr   r   r   shaper   s    r   r   zRANArray.shape   s'    ||DFFDFFDFF3999r   c                 .    | j                   j                  S r   )r   ndimr   s    r   r   zRANArray.ndim   s    vv{{r   c                 D    d| j                    d| j                          dS )NzRANArray(shape=u
   , value≈))r   r   r   s    r   __repr__zRANArray.__repr__"   s"     Jt}}6GqIIr   c                 h   t        | t              r| S t        | t        j                  t        t
        f      r.t        t        j                  | t        j                              S t        | t        t        t        j                  t        j                  f      rt        t        |             S t        S )z3Convert numbers, arrays, lists, tuples to RANArray.r   )
isinstancer   r   ndarraylisttuplereal_ranr   r   intfloatintegerfloatingNotImplemented)others    r   _coercezRANArray._coerce%   sr     eX&Lebjj$67BJJuBJJ?@@ec5"**bkkBCE%L))r   c                     t        |       S r   )ran_negr   s    r   __neg__zRANArray.__neg__1   s    t}r   c                 X    | j                  |      }|t        u rt        S t        | |      S r   )r.   r,   ran_addr   r-   s     r   __add__zRANArray.__add__5   +    U#N"!!tU##r   c                 X    | j                  |      }|t        u rt        S t        | |      S r   r.   r,   ran_subr4   s     r   __sub__zRANArray.__sub__>   r6   r   c                 X    | j                  |      }|t        u rt        S t        ||       S r   r8   r4   s     r   __rsub__zRANArray.__rsub__D   s+    U#N"!!ud##r   c                 X    | j                  |      }|t        u rt        S t        | |      S r   )r.   r,   ran_mulr4   s     r   __mul__zRANArray.__mul__K   r6   r   c                 <   | j                  |      }|t        u rt        S | j                  | j                  | j                  }}}|j                  |j                  |j                  }}}||||z  z   z  }||||z  z   z  }	t        ||	t        j                  |            S r   )r.   r,   r   r   r   r   r   
zeros_like)
r   r-   r   r   r   defABs
             r   __truediv__zRANArray.__truediv__T   s    U#N"!!&&$&&$&&a1''577EGGa1QUOQUO1bmmA.//r   c                 b    | j                  |      }|t        u rt        S |j                  |       S r   )r.   r,   rG   r4   s     r   __rtruediv__zRANArray.__rtruediv___   s/    U#N"!!  &&r   c                 X    | j                  |      }|t        u rt        S t        | |      S r   r.   r,   
ran_matmulr4   s     r   
__matmul__zRANArray.__matmul__f   s+    U#N"!!$&&r   c                 X    | j                  |      }|t        u rt        S t        ||       S r   rK   r4   s     r   __rmatmul__zRANArray.__rmatmul__l   s+    U#N"!!%&&r   c                    t        |t        t        j                  f      r|dk(  r(t	        t        j
                  | j                              S | }t        t        |      dz
        D ]  }t        ||       } |dk  r+t	        t        j
                  |j                              |z  S |S t        | j                         |z        S )Nr      )r#   r(   r   r*   	const_ran	ones_liker   rangeabsr>   r'   r   )r   r-   result_s       r   __pow__zRANArray.__pow__s   s    ec2::./z dff!566F3u:>* / ./qy fhh!786AAM5011r   c                 j    t        | j                  |   | j                  |   | j                  |         S r   r   r   r   r   )r   idxs     r   __getitem__zRANArray.__getitem__   s)    sTVVC[$&&+>>r   c                     | j                  |      }|j                  | j                  |<   |j                  | j                  |<   |j                  | j                  |<   y r   )r.   r   r   r   )r   r[   values      r   __setitem__zRANArray.__setitem__   sC    U#ggsggsggsr   c                     t        | j                  j                  |      | j                  j                  |      | j                  j                  |            S r   )r   r   reshaper   r   )r   r   s     r   ra   zRANArray.reshape   s9    u-tvv~~e/DdffnnUZF[\\r   c                     t        | j                  j                         | j                  j                         | j                  j                               S r   )r   r   ravelr   r   r   s    r   flattenzRANArray.flatten   s/    GGr   Nc           	         | j                   | j                  | j                  }}}|2|j                         |j                         |j                         }}}d}t	        j
                  |dk(        rit        t	        j                  ||      t	        j                  t	        j                  ||      j                        t	        j                  ||            S t        ||||      \  }}}t        |||      S )z8Reduce along axis using RAN algebra. axis=None flattens.r   rQ   axis)r   r   r   rc   r   allr   sumonesr   _tree_reduce_add)r   rg   r   r   r   s        r   ri   zRANArray.sum   s    &&$&&$&&a1<ggiAGGI!qAD66!q&>BFF140"''"&&:N:T:T2UWYW]W]^_fjWkll"1a61a1a  r   c                     || j                   j                  n| j                   j                  |   }| j                  |      |z  S )Nrf   )r   sizer   ri   )r   rg   ns      r   meanzRANArray.mean   s8    <DFFKKTVV\\$-?xxTx"Q&&r   c                 |    | j                   j                  dk(  rt        d      | j                   j                  d   S )Nr   zlen() of unsized RANArray)r   r   	TypeErrorr   r   s    r   __len__zRANArray.__len__   s0    66;;!788vv||Ar   c              #      K   | j                   j                  dk(  rt        d      t        | j                   j                  d         D ]	  }| |     y w)Nr   ziteration over a 0-d RANArray)r   r   rq   rT   r   )r   is     r   __iter__zRANArray.__iter__   sK     66;;!;<<tvv||A' 	Aq'M	s   AAc                     | j                  |      }|t        u rt        S t        j                  | j	                         |j	                               S r   )r.   r,   r   iscloser   r4   s     r   __eq__zRANArray.__eq__   s<    U#N"!!zz$--/5>>+;<<r   r   )$__name__
__module____qualname____doc__	__slots____array_priority__r   r   propertyr   r   r   r!   staticmethodr.   r1   r5   __radd__r:   r<   r?   __rmul__rG   rI   rM   rO   rX   r\   r_   ra   rd   ri   ro   rr   ru   rx    r   r   r   r      s    
  I1
( 6 6 : :  J  $ H$$$ H	0'''2?]H	!'
=r   r   c                     t        j                  | t         j                        }t        |t        j                  |      t        j
                  |            S )z1Build RAN(v, 1, 0): represents the exact value v.r   )r   r   r   r   rS   rA   r^   vs     r   rR   rR      s6    


5

+AAr||Aa(899r   c                     t        j                  | t         j                        }t        t        j                  |      t        j
                  |      |      S )z4Build RAN(0, 1, v): represents the value v with c=v.r   )r   r   r   r   rA   rS   r   s     r   r'   r'      s6    


5

+ABMM!$bll1oq99r   c                     t        j                  | t         j                        }t        |t        j                  |      |j                               S r
   )r   zerosr   r   rS   copy)r   zs     r   zero_ranr      s3    
bjj)AAr||A11r   c                     | j                   |j                  z  | j                  |j                   z  z   }| j                  |j                  z  }| j                  |j                  z   }t        |||      S r   )r   r   r   r   xyr   r   r   s        r   r3   r3      sU    	acc	ACC!##IA	acc	A	acc	AAq!r   c                 \    t        | j                   | j                  | j                         S r   rZ   )r   s    r   r0   r0      s!    QSSD!##t$$r   c                 ,    t        | t        |            S r   )r3   r0   )r   r   s     r   r9   r9      s    1gaj!!r   c                 N   | j                   |j                   z  | j                   |j                  z  |j                  z  z   | j                  | j                  z  |j                   z  z   }| j                  |j                  z  }| j                  |j                  z  }t        |||      S r   )r   r   r   r   r   s        r   r>   r>      sv    	acc	ACC!##IO#accACCi!##o5A	acc	A	acc	AAq!r   c                 V   t        j                  | |d      } t        j                  ||d      }t        j                  ||d      }| j                  d   dkD  r| j                  d   }|dz  }| d | |d | |d | }}}| |d|z   ||d|z   ||d|z   }}
}	||
z  ||	z  z   }||
z  }||z   }|dz  dk(  rTt        j                  || dd  gd      }t        j                  ||dd  gd      }t        j                  ||dd  gd      }|||}}} | j                  d   dkD  r| d   |d   |d   fS )Nr   rQ      rf   )r   moveaxisr   concatenate)r   r   r   rg   rn   halfa1b1c1a2b2c2nanbncs                  r   rk   rk      s`   
AtQA
AtQA
AtQA
''!*q.GGAJAvuXq$x5DBtAH%qa$h'74D9IB"WrBw"W"Wq5A:QrsV15BQrsV15BQrsV15Bb"a1 ''!*q. Q41qtr   c                    t        j                  | j                  dk(        rt        j                  |j                  dk(        r| j                  |j                  z  | j                  |j                  z  z   | j                  |j                  z  z   }| j                  |j                  z  }t        j
                  |      }t        |||      S | j                  j                  dk7  s|j                  j                  dk7  rt        d      | j                  dddddf   }| j                  dddddf   }| j                  dddddf   }|j                  dddddf   }|j                  dddddf   }	|j                  dddddf   }
||z  ||
z  |	z  z   ||z  |z  z   }||	z  }||
z  }t        |||d      \  }}}t        |||      S )z
    RAN-space matrix product.
    Fast path: when b == 1 everywhere (the common NN case), uses BLAS.
    General path: full RAN tree reduction over the contracted axis.
    rQ   r   zBGeneral RAN matmul only supports 2D arrays; use collapse() for 1D.Nrf   )
r   rh   r   r   r   rS   r   r   NotImplementedErrorrk   )r   wr   r   r   xaxbxcwawbwcpapbpcs                 r   rL   rL      s    
vvaccQhBFF133!8,CC!##Iacc	!ACC!##I-CC!##ILLO1a  ssxx1}A!P
 	
 
Q4ZB	
Q4ZB	
Q4ZB	
T1aZB	
T1aZB	
T1aZB	b27R<	"r'B,	.B	bB	bBr2r2GAq!Aq!r   c                    t        j                  | j                  dk(        rut        t        j                  | j
                  d      t        j                  | j
                  j                  d         t        j                  | j                  d            S t        | j
                  | j                  | j                  d      \  }}}t        |||      S )z6Sum a RANArray along axis 0 (used for bias gradients).rQ   r   rf   )
r   rh   r   r   ri   r   rj   r   r   rk   )r   r   r   r   s       r   ran_sum0r     s    	vvaccQhqss+RWWQSSYYq\-BBFF133UVDWXXqssACC15GAq!Aq!r   __main__      ?       @      @z	Scalar +:z->z	Scalar *:z	Scalar /:)r   r   r   zArray + 10:
   z
Array * 2:r            zMatmul shape:zMatmul matches numpy:g      Y@rQ   zAfter assignment:g      @zSum axis 0:rf   zMean:) numpyr   r   rR   r'   r   r3   r0   r9   r>   rk   rL   r   ry   r   r   printr   r   qarrayarrrandomrandnrE   rF   Cr   allclosemri   ro   r   r   r   <module>r      s   j= j=`::2%".< zc3A	CA	+q$

-	CA	+q$

-	CA	+q$

- 8288O,
-C	-#(,,./	,q**,- 	A&'AA&'A	AA	/177#	
!;2;;qzz|QZZ\AJJL=X#YZ CF	
s||~. 	C:Sz234A	-A//12	'1668$$&'? r   