From d29ad014bf8457dc059f7494c4649e869d933065 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Sat, 27 Apr 2024 17:24:55 -0300 Subject: [PATCH] Fix add tensor --- build/libtensor.so | Bin 16568 -> 16600 bytes csrc/tensor.cpp | 78 +++++++++++++++++++++++- csrc/tensor.h | 1 + csrc/tensor.o | Bin 6416 -> 9192 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 3016 -> 3092 bytes norch/tensor.py | 64 +++++++++++++------ 6 files changed, 125 insertions(+), 18 deletions(-) diff --git a/build/libtensor.so b/build/libtensor.so index dd8d235ed01fc045b7c8f75d93596150ccbe4b04..d7ec51345feccacd17e5d7e8494a9c0765d9f534 100755 GIT binary patch delta 2801 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 GW&Zndim; i++) { index += indices[i] * tensor->strides[i]; @@ -65,6 +67,7 @@ extern "C" { } Tensor* add_tensor(Tensor* tensor1, Tensor* tensor2) { + printf("Adding tensor\n"); if (tensor1->ndim != tensor2->ndim) { fprintf(stderr, "Tensors must have the same number of dimensions %d and %d for addition\n", tensor1->ndim, tensor2->ndim); exit(1); @@ -135,4 +138,77 @@ extern "C" { return create_tensor(result_data, shape, ndim); } + + Tensor* sub_tensor(Tensor* tensor1, Tensor* tensor2) { + printf("Adding tensor\n"); + if (tensor1->ndim != tensor2->ndim) { + fprintf(stderr, "Tensors must have the same number of dimensions %d and %d for addition\n", tensor1->ndim, tensor2->ndim); + exit(1); + } + + int ndim = tensor1->ndim; + int* shape = (int*)malloc(ndim * sizeof(int)); + if (shape == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + + printf("Size: %d\n", tensor1->size); + printf("Data: ["); + for (int i = 0; i < tensor1->size; i++) { + printf("%.2f", tensor1->data[i]); + if (i < tensor1->size - 1) { + printf(", "); + } + } + printf("]\n"); + + printf("Size: %d\n", tensor2->size); + printf("Data: ["); + for (int i = 0; i < tensor2->size; i++) { + printf("%.2f", tensor2->data[i]); + if (i < tensor2->size - 1) { + printf(", "); + } + } + printf("]\n"); + + printf("Shapes : ["); + for (int i = 0; i < tensor1->ndim; i++) { + printf("%d", tensor1->shape[i]); + if (i < tensor1->ndim - 1) { + printf(", "); + } + } + printf("]\n"); + + printf("Shapes : ["); + for (int i = 0; i < tensor2->ndim; i++) { + printf("%d", tensor2->shape[i]); + if (i < tensor2->ndim - 1) { + printf(", "); + } + } + printf("]\n"); + + for (int i = 0; i < ndim; i++) { + if (tensor1->shape[i] != tensor2->shape[i]) { + fprintf(stderr, "Tensors must have the same shape %d and %d at index %d for addition\n", tensor1->shape[i], tensor2->shape[i], i); + exit(1); + } + shape[i] = tensor1->shape[i]; + } + + float* result_data = (float*)malloc(tensor1->size * sizeof(float)); + if (result_data == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + + for (int i = 0; i < tensor1->size; i++) { + result_data[i] = tensor1->data[i] - tensor2->data[i]; + } + + return create_tensor(result_data, shape, ndim); + } } diff --git a/csrc/tensor.h b/csrc/tensor.h index 0ce9d86..58e79a2 100644 --- a/csrc/tensor.h +++ b/csrc/tensor.h @@ -14,6 +14,7 @@ extern "C" { float get_item(Tensor* tensor, int* indices); Tensor* create_tensor(float* data, int* shape, int ndim); Tensor* add_tensor(Tensor* tensor1, Tensor* tensor2); + Tensor* sub_tensor(Tensor* tensor1, Tensor* tensor2); } #endif /* TENSOR_H */ diff --git a/csrc/tensor.o b/csrc/tensor.o index 0e5799c204de938d1574408254aea96d6b138c92..363e2a1e5b5e39484d92b63a7ea55e2bbb7411f6 100644 GIT binary patch literal 9192 zcmeHMVQd^n6`r$0n!0iBQi7CFtKC1bXwn=`Xb_jA^I-M_syF(Z}*(9>+NlIfqEiyciv`jx=kC0m~a*4S*FQJioc7srtR&Q>{hJG#m^ zIr?9!pU_Jv42%zz0!4j(s4y=Ec9T6jHg6>UVvN0AX9UJ=y;Q8T^?B5~j%l5;g&ive z&y5%L(okwXF!viCsH#4$H@d#~M+yE47hDda9c}U&aW|_%ozNF>nyoKj4BMsDkR4kn zO9e$9mfST)^o7FO8vjH3LSXKvRa$HPUUmIm-Km!f2VB3f@~aiMi@^}&+?Pkmd^txT zbP(Q%e$~_U)xg{3dikoMT6&YlUwWfzwGJ%a$xR9Rl%wCKU)a_ z_@8zBLkQ6S?1%fu+;sfUditML{PXHO9~}Mz_^vGX3Uh~N%T=)-;L6#8b8w_Q6yr0n zLPK7mZVrPXIwyAiN^5b!_|Vf*Ys9rUy!yLtte_4C{scQxhp&xyKY9K7b@UCHpuRnB z?sW$*47n$0GXkaXpu0AF2~=VPr4ZNbrfW40rMpyBua=-*Ee0PMTMVuhL-0PDdlBC| z_WlJh0I#<{(+iK)#9L(vL+10gk^6nCEO~texWRGD!mYA|(WtE`|JP*+Yr0oiTIF4q zj@&?5+M6}wR&V;aW|`?+CM))vsZ4fIi}&?q5-^ZSYu)kQJ~P=M4m$)bffLN6mdhs+ zW-iyA@9P_+vEFodCYy4m?GO*;Q(b0O%XDkW-W1FQTe%(DMzADDa=nk6E^w$P-Vfcc zh>b~cpC*oq&&93yjs|!RZ|fFE8yZAwGRZ_j6?fI-v{XK4X+81BOwH;swOl-9YH1J0 z;8%;MlXwG(S{%&b;u^%EvIxf~XmG^jG?eqfesZXq8ID_8Z#roX)H)IS_U_%GeInMC zPg{8{623p&vSn-DdD{Baww7?q{o!r*x;Xm8wgRpYT=OagX#SHQFfNB`Zur@}LcD*yW&nVC&tJxf(`u_{)jQFt#_*}$iIx|BTP^7D zVZk1)Ufk}1qWzUM_-a7zWcr<$1NL#aaR1cS0)Q8ezcjpX+$%49uMhrtA3W)U9{?Qn zlWr#`0DDB@JLDEPxd2!KE-yWgO8#3i)WjEVT?r@p`-NLNI%TEl+}D0!PiuSUfws0o z`r*#Qt$W(_PSKyYaw6rFACa??W;QFjzn1N_Okoc6TH?5Ab;3hRzzHTp-Tm3#wAC$g z`7VOo_=6-oH%?Y8!^b4Hdk}<%sf~L__`L{1L%b0#!gnGFZ4+E;;3E7Wg3!o5+QRll z_vY9MLZA3?hGYB){~N=(-)j-mDty}aBR>4B!l!+I z(uZGE_>{NLFh1Y+=M_G!_hrWCd3#Rb(|X_V;lHQwX}#Bc_(A875S94TdN)WMr*S>a z3ZK@yneq90w<-KJa=&&lKDVDy_*7>GefZBReA53tAO2Z|Px^nt_+0#^?HfEOGVx{z9?i{2vAE^*FP`>&7I*L%^eY zvR;0#pw32yZ<4s`w^ib_Uet=MjoIOKql4kx?7=^4S>m`}9-r+D=Q=wW&g0W1anO zUs3o}XI}H+zpL=6&Mf-yZ(YTA5{3H{}AJI{ihWEX{mq2hksV#lm1tI_~#Wq=^tl&u7B4Z zu7FK&A8xD`rW0ks}Vx5wxuQiWK}OTIl?x0Wj|epL4rSbO%~$iJ2g*U$J?0O9Mcb%mz6vN zaPRYv+hlCi=CV5=T^#_^v!dl;!xPn_pqZA|O8;Y!Fi&DUZ(2rU3CWJoID9axz~S8s zE#6>9|E0_zI-ktMdo#(4DAC;=&m{W>Qv;}{f1tN7)5BtRum>W=UHG^8hpjyvugA}F z32%cDua!N)SrX-z*fSFDk?^+?E?4==akYv~V+3haDgFsp2E%>Su3Xp;X`dBHDPfg7 zeFkp&YPBZF`}|o`N|#ggZCpRaadJGbq@PvvU0gp`ME_FJrxD81kT*pFekcLgc!A$V z^d@N#UZPJo*cJsjt{$LPk28e`80G;DQh?l{{TvtiQLb;1^m2z%FyXhdSBtRY948O* zT7}*FMf8sp{as%Dsic?PCfP-(N9sJK_ze+-@9{*};ZTK@9pfzNmOQmH5-v||f#YhG z1*M9Z+ILbOd1yZ}ypv9|T=U`3;OIdf_}rYdug{;d6$viwY}zE>m`0VTDf(Ml7q{O~wf? zamHb~L&(o@5-j@+D*839kC1GE4uuuhFhSWX3M-t9P$zd3RyYBUt4^jAy>RlF)>>3p z;bfVz>k2EJXrKkGfV+$x>c5`AM8Hbi=Bzrz50$7*-kDjB6aQQBPYm~*gv&FG;8f6R z_t{yvT4fijL_d{qv>w}7P;AQZG9S5+6JA5g66V(IC7C%GC+V72O#{=yCm z)y>W!a%=HA>i}n{S>LeZ4{9a;pxWSEC?apCLlFZxm^cRWp{Nlv*scLIj~}+zMD(=r zFB)%$3>d9xH72=k2z+x^twcsT0dW-ic-)8UA*t%C6xiY!&T F{sLsq*K+^> diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index 8523f4f941a636651e4b3459a7ee6bb7c8176fb0..d8a3609688d28acbcd6c68057067a6a5f8b6c6cd 100644 GIT binary patch delta 1267 zcmZ`(OK)366rMBpHFxeKwy_jbLJCzWz2Z@jfEKA$7XiegiYS4qvWl+U%p|o*9BVvX z6dVO9mDnMbVT-UOHUTz>KftnL!4H@ndn)x0fH*TYDFxxH^PMx_yv}#d$oH4O>XaWA z1t<9X_M?}!ba}7*?BXGGnG6IIso>kkew!knN+#1~BGV4(a+yhf2tZ^!jc25r<2e8E zmrvo^dw85AT@a*8WiSl|%%B^IrU*oM7rL>CM0}TY6Ojmp-d}`16`9DeBN| z$j-+N=cmPl3_`RREtv&)RCCx8?uw>ICR|FXASjcrAHjOnvdPv?Pir|;8Ol-xf(>@$ z`Jv^ar+f9LzB7`lbaXbp)f>q`7}`2E3>7-BG|!_Q&W{1C1|_0z+!1!tbbZI*3IUH7%zRZrp2 zr>Rz4^fW>hs8w?|J_oOw>+!F+`}w4TOXh0wK6}kg15SURtiapme)1v@k@9`i=FjBn zS?pSLNcOQqlc45UI5N#<1Y<1KAV-h3L5`^Tn!S=%h1a8=`;vDKd}6#OM2+Pe@2Poe z$648Mb8mFV*X1Zwt9Yx8_Vg{OY*Wec?H#??R*$r@*@AL4R}EY{ho;+=)U~^$eisMh zHUfbh7+pDm#cN?1V?X?){J>}NvR`d}OP+XK={uL5xNHK0Y(^gwoq5suvFHLtqiqoN z2HsVb|B|fEBl}3J<>T8o|E_@RhPvRuKZiG6^j|e@Lwz0R{-Nf7#rVY)KGj08OYXeX zf%_-%FV==@Z(X^fTrbo~2d+S>a^QNeUU%U4T{aK+vu&3R!9ARq|!-`4)7ZR|Ylb^h}(UZnxPqDyajepjisQHR4YBP}B~()Wt^T8WPfvw^^d)=3I#AA16x1Uo z?KSESlg=7jVH3EE>y(#XE>0Z1zF=99)fPKe;oyX<3CHPH^lxJKtPOa@vxlQ%<9Y#C zPIaAN@cZ>sz#uGxF|4t3{)v4&Pd(yBw1`}xw2+E;Qj_OT>cX3_j7KL+qUDt`%I4f!3QIhit=R~;VfZC=Q zc*UHKkzLN*IK$#Ws*JyAj!cTg1dErFj`IY{RLV|O7L9nDGNI%c1R(hOhse=oz6I<2 zVfg=+9Yui>bZ?b_{wB&tF!r6hhlh&NR+|JX1g{VfDb;HP2YSzc`PC3rf!~2x5<&#H zEVYa#VrW0<4&oRYOa>L{&;46Bi1NlRy8YBx-9gttV&G!~ZDV!1edCN&cTnix{p;md TCirqSd`FZ;2xvl+3oPef+NKNU diff --git a/norch/tensor.py b/norch/tensor.py index 8ac8d61..62ad203 100644 --- a/norch/tensor.py +++ b/norch/tensor.py @@ -12,21 +12,31 @@ class CTensor(ctypes.Structure): class Tensor: _C = ctypes.CDLL("../build/libtensor.so") - def __init__(self, data): - data, shape = self.flatten(data) - # Adjust the path to the shared library - self.data = (ctypes.c_float * len(data))(*data) - self.shape = shape - self.ndim = len(shape) + def __init__(self, data=None): - Tensor._C.create_tensor.argtypes = [ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_int), ctypes.c_int] - Tensor._C.create_tensor.restype = ctypes.POINTER(CTensor) + if data != None: + data, shape = self.flatten(data) + # Adjust the path to the shared library + self.data_ctype = (ctypes.c_float * len(data))(*data) + self.shape_ctype = (ctypes.c_int * len(shape))(*shape) + self.ndim_ctype = ctypes.c_int(len(shape)) - self.tensor = Tensor._C.create_tensor( - self.data, - (ctypes.c_int * len(shape))(*shape), - ctypes.c_int(len(shape)) - ) + self.shape = shape + self.ndim = len(shape) + + Tensor._C.create_tensor.argtypes = [ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_int), ctypes.c_int] + Tensor._C.create_tensor.restype = ctypes.POINTER(CTensor) + + self.tensor = Tensor._C.create_tensor( + self.data_ctype, + self.shape_ctype, + self.ndim_ctype + ) + + else: + self.tensor = None, + self.shape = None, + self.ndim = None def flatten(self, nested_list): flat_data = [] @@ -68,11 +78,28 @@ class Tensor: result_tensor_ptr = Tensor._C.add_tensor(self.tensor, other.tensor) - result_data = [result_tensor_ptr.contents.data[i] for i in range(self.shape[0] * self.shape[1])] - result_shape = [result_tensor_ptr.contents.shape[i] for i in range(result_tensor_ptr.contents.ndim)] + result_data = Tensor() + result_data.tensor = result_tensor_ptr + result_data.shape = self.shape.copy() + result_data.ndim = self.ndim - return Tensor(result_data, result_shape) + return result_data + + def __sub__(self, other): + if self.shape != other.shape: + raise ValueError("Tensors must have the same shape for addition") + + Tensor._C.add_tensor.argtypes = [ctypes.POINTER(CTensor), ctypes.POINTER(CTensor)] + Tensor._C.add_tensor.restype = ctypes.POINTER(CTensor) + result_tensor_ptr = Tensor._C.sub_tensor(self.tensor, other.tensor) + + result_data = Tensor() + result_data.tensor = result_tensor_ptr + result_data.shape = self.shape.copy() + result_data.ndim = self.ndim + + return result_data if __name__ == "__main__": from tensor import Tensor @@ -82,7 +109,10 @@ if __name__ == "__main__": a = Tensor([[1, 2, 3], [1, 2, 3]]) b = Tensor([[1, 2, 3], [1, 2, 3]]) - c = a + b + c = a + b - b + + print(c) + fim = time.time() print(fim-ini) \ No newline at end of file