From 48f8c1d83d73c7fc0078e1496a786ca86a2bb7b4 Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Fri, 26 Apr 2024 18:38:07 -0300 Subject: [PATCH] Add tensors (still need to fix) --- build/Makefile | 2 +- build/libtensor.so | Bin 16528 -> 16568 bytes csrc/tensor.cpp | 138 ++++++++++++++++++++++++ csrc/tensor.h | 19 ++++ csrc/tensor.o | Bin 0 -> 6416 bytes norch/__pycache__/tensor.cpython-38.pyc | Bin 0 -> 3016 bytes norch/__pycache__/tensor.cpython-39.pyc | Bin 0 -> 2180 bytes norch/tensor.py | 89 +++++++++++++++ norch/tests.ipynb | 98 +++++++++++++++++ test.sh | 5 + 10 files changed, 350 insertions(+), 1 deletion(-) create mode 100644 csrc/tensor.cpp create mode 100644 csrc/tensor.h create mode 100644 csrc/tensor.o create mode 100644 norch/__pycache__/tensor.cpython-38.pyc create mode 100644 norch/__pycache__/tensor.cpython-39.pyc create mode 100644 norch/tensor.py create mode 100644 norch/tests.ipynb create mode 100755 test.sh diff --git a/build/Makefile b/build/Makefile index 78f3ec6..a62aaeb 100644 --- a/build/Makefile +++ b/build/Makefile @@ -5,7 +5,7 @@ CXX := g++ CXXFLAGS := -Wall -Werror -fpic # Source files -SRCS := ../src/tensor.cpp +SRCS := ../csrc/tensor.cpp # Object files OBJS := $(SRCS:.cpp=.o) diff --git a/build/libtensor.so b/build/libtensor.so index 1711f4eaa91579baf13d8fa393005fc9cd12e857..dd8d235ed01fc045b7c8f75d93596150ccbe4b04 100755 GIT binary patch delta 3356 zcmZ`*eN0=|6~EWU1QQ6hff^?Wo3v3ry4aY{0H!u+-neAR;v_TT_XYl!PkN|p$)k#3PRBoPG17TCz{kPmtFBqP+ z8I)Lzh+aNmbuiMq1}n`-&B#owlWwG$saBjpx24wM6xyCzok@J$X9JM5$??>ujiaWq zoK_ZM?fyAQl13h66+Bv#wh8oxiG-CwjSHbH`#yw}aoH2&-RhVO*SLWv!-idqR3<{X zBx<+_OGjS588S)>S@r=2;Fdzc9?SM+kC@HQ$0V{srat$Qsf3>3+w_n*4Y$*PxnSq- z*z)&1+du|u_A{15J_}`#Xbp=k-hV7fVl$w>ZFr6T+FXy9X_MtCe0S7R(m5**pQR8@^t|PT?|lq=RP6k>B*6s##`u$rXZd`2k=r1= z3&I;Lp?FNwT=32+UHxKdc@H$&JlO?L-$gTe}4`YnhD z7=-H}0shCD$+fTP>)Az>dznDSenyTb%JIIGmleOu`k0Yr9x|VRMun*vJ-enit?_U#YeG6>zdS6iHZ) z3d_lg_b^pNSRsS`E2s~a&d|!D(f4vK;bZB5rdf-!UyH&Ex*3x3Oo(ZQYqB-L7mp-q zT9{?)!1Lx;3bXx384p0C4YTCrU&++pbp*#BWSL<1fBz=<{{-^!g1rs?B+Mr0%a^M* zD_3nlGmsbeRWKM7X7SQE_?0u9?aW0k5=Yms*`8z?SRYMr1O(HC<~X_wAQs~w0SsShCVv6Jv@ow=fO+Os z3iJJbULl_;+AvSTT8*Me-og7d?@<;`E>E5eU|t5WThsT*0Os-1Zy>3S0q}DGKh;bQ z$p99TMF0Q`G5{z71F#TIE|LP^L%2)%3@sc0+mbSX1zrJ7zm{MXSl|FIfLM%!Wc@v{ zoHhI>NS>VV;<|Juwvu5P$3c*PK&I}&V$4Jl?Em9T$04qFN&CN%3_st_@}OwnVlCW) z!)50Ik9JCq0WN;SbON_Nh(B5X207Dk#%sJ>4J!nH2sP2ME9|}t?nmYa`zU#?vRSZ* zkbrZQ;OEM?odzwr;YaXG5Di+=rH8C6qOuGuMx`M3AK^G)FN(>kz)4|~gt>o14p*

Dbon2zE3xa;me(0srf^P+Mn5 zIywrrRUl4B`+}ihmE#3;v^Ch(((7O>Jm9@0+{;AkLIgvOwvOhO)87mS9(aqs+5?pR zN9R75qyW&s7m_ppv=!(ZKw~SCbQS2{2a*&A`aaMVpzO)v1mQDB5I$|fTQX=>;U>dr z2sJ<`sydik+KvKD{5jL65>z>a{)nC?SY)F&!W1xSL zP8Hg%(`)bpVO@@9^->C0P2#N+8*OTXqBbP#7r~y3w9skSjoIj4=LtMS$DMZkE}e3^ z@MXH{w3~gb2Jo;BgFOSZ(B;BS^svj0J+#~PiE%`kh@aLMU55zRZ3T_novYt~nt)pI zfIKoH9}T+e@S8LSx=eJHPPwg{)&7%5=U+X_LI7yZ?ZkxQ(rkks8a4=AnoSQBpT&MU zQJkx{p#Z&CTxWYSz$S>HgZ9o(YfG#)b+&5w3Scl|zTG7*9H-+Yjk>^Asw;Kc#%!t) zr`KiEJP1@@>awW~t!lHNXah7>T4&UHPkOI(8!a!h;A7NXW_9m_D*vw@^pGNdMcFC+ zO4tDNf)*(V-?K75B7ZN*-)l^6h=cD|XoR!z^5kk+J>K5c7wYx->JHTJeZH~SS?nxZ z-^*(K?J4T7$eC=fxTV9b)LrE=4=MeyO5dg3AoVCMsY(mzM3u|fq)40S{i+J%fHE4O zJF6?S9ir}(%e1>X3~Rnx?V?Q{6D{%-nXf8)M5SG{+vBpROQ+JFH2RLmnXWDbY=M7x zzO555Ev|85Dbx#-T!9vZ2W{%;L= delta 2370 zcmZuzeN0nV6u-C7+6M@2LE37S7U#qnTUx%MmHP4IvCRdRnK4JEMsUH*4OmHLHiE3v z&~!w~QR7E4-Lg1La5CAZ^AB9rh$hbAJ~C&r1Q)i{QMW2CV@!QJ_r2GG*=~66ckVgo z{?5mJy_eISvlve-gGeo`_Gpv?3f zY)=klHn%pt>f1tIZuD(v@-=QFn;IHmkva#~sI#0D!|y|H9b1m0ZEh1sh>9GMW`t;$ z%YvLDAp;On8_ms19)kB#s{mp3Qko36(I>uwdBiGZKUOja^EF1WXwqhzys~x{LMp7) zR8ckT)l>|=l3U01>h{0|U8a7UgOH4z)r3rBESS10E^356o!}O_J=JIsy45Qglui2P z2toCb9p#;0`Z#ekBWDNWKCdA9nAju zgrMhhoJ9V9D2kB=Q4}w#kHcAgwJD9!2hk~f#*EHGtk+2V0IY_B^dNsl*e`@fRYG7m z@-Fll7A)So?0@}t%|`MTBtOdtBG1EZ!;79Gro8w-6p@f;@);%v`N^Qy6u5}W)u=p; z{vG&hGjE}YJadC3O_9WW;e2k9wqdJy`ba^t}uPDp> ziywd~E5Ga{Q%D((-)DRgiSM4o7f3jNjW$1jkB%QhzBa~p96GZ?9r;3_{kjln8^Ic` z2Ww0SBUnn=Io~qeD1K?8GbLD3ypu!t%ZS*JQSQtvl!p0HRG+Wu@kwyqSjLHS0e;NSM`*|R)gV7M{Xy7~R|xPi!QUPuZL9^W zr}LTlF%_j?KGsA&8kC0lC`%#8M=SWT_Gjhr7%n;;eIi4rmFrjZo0Ybpfi1*Dy0dmF zg~YI36B%{ki3~mQ^HDl}lu^oigpCzgCu2h3D*KSDrlhovworZjcTsGHa&N)e1TwRMZ6Er!ikpB~uk3c6{(g}f^ zP9sZW%4w%j(7Wa&8Au+iaP7tb*IY&zab?3pmx~f`78uR>N;UCtHWXBNX*9#80wb+~ z?F9}x0LKb8&`IRT1WTdC+>jmjmhlt!a3D#aaUg3ahxpswhcpdVKSH;6OzO>~~wC)UD%sl&`l3YTYFuxOLi% zN`(-vFv2Of-VpyUC61fbaKmj+iSGbzv%#}Qb&J4yk3A*c`KT3oJ;hue+e;jIgV#J& z6nko}bZ~-K(y_g&#F&*<&=n*@f8}FX{k6(UZb!as?*g;8Bt=^+&n79X_ZH(P6Y?(p E7e+0UDgXcg diff --git a/csrc/tensor.cpp b/csrc/tensor.cpp new file mode 100644 index 0000000..4b734ac --- /dev/null +++ b/csrc/tensor.cpp @@ -0,0 +1,138 @@ +#include +#include +#include "tensor.h" + +extern "C" { + + Tensor* create_tensor(float* data, int* shape, int ndim) { + Tensor* tensor = (Tensor*)malloc(sizeof(Tensor)); + if (tensor == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + tensor->data = data; + tensor->shape = shape; + tensor->ndim = ndim; + tensor->size = 1; + + for (int i = 0; i < ndim; i++) { + tensor->size *= shape[i]; + } + + tensor->strides = (int*)malloc(ndim * sizeof(int)); + if (tensor->strides == NULL) { + fprintf(stderr, "Memory allocation failed\n"); + exit(1); + } + int stride = 1; + for (int i = ndim - 1; i >= 0; i--) { + tensor->strides[i] = stride; + stride *= shape[i]; + } + + printf("Tensor created successfully\n"); + printf("Tensor information:\n"); + printf("Number of dimensions: %d\n", tensor->ndim); + printf("Number size: %d\n", tensor->size); + printf("Shape: ["); + for (int i = 0; i < ndim; i++) { + printf("%d", tensor->shape[i]); + if (i < ndim - 1) { + printf(", "); + } + } + printf("]\n"); + + printf("Data:\n["); + for (int i = 0; i < stride; i++) { + printf("%.2f", tensor->data[i]); + if (i < stride - 1) { + printf(", "); + } + } + printf("]\n\n\n"); + + + return tensor; + } + + float get_item(Tensor* tensor, int* indices) { + int index = 0; + for (int i = 0; i < tensor->ndim; i++) { + index += indices[i] * tensor->strides[i]; + } + return tensor->data[index]; + } + + Tensor* add_tensor(Tensor* tensor1, Tensor* tensor2) { + 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 new file mode 100644 index 0000000..0ce9d86 --- /dev/null +++ b/csrc/tensor.h @@ -0,0 +1,19 @@ +#ifndef TENSOR_H +#define TENSOR_H + +typedef struct { + float *data; + int* strides; + int* shape; + int ndim; + int size; +} Tensor; + +extern "C" { + Tensor* create_tensor(float* data, int* shape, int ndim); + float get_item(Tensor* tensor, int* indices); + Tensor* create_tensor(float* data, int* shape, int ndim); + Tensor* add_tensor(Tensor* tensor1, Tensor* tensor2); +} + +#endif /* TENSOR_H */ diff --git a/csrc/tensor.o b/csrc/tensor.o new file mode 100644 index 0000000000000000000000000000000000000000..0e5799c204de938d1574408254aea96d6b138c92 GIT binary patch literal 6416 zcmbtZZ)_Y#6`wtuG&M==v;~>ep#9K7i;}Ao%Aa#-xg?!r1x{lnIT4jc?&WT;KI*%3 zZueR{a1eTGq+{h0iB?pV_>ig+P$5-S`vIs#ZCAxfiHe0R)kyx}AcL;5L5FOqrm_g{ z&CcAto7+`F7->DTzxlmC^WK}8J^6=x@KD4sm}&-lh&A67%GiZZHOFx=jI$kVJ6r4i z+{X#4`Zuex8n>$D1*=+`t0u0zZ33r;Jgdq#tV(%4Qtm&nQRh^X%&maMeZ56#2-)cQO^*?$) z%WLQuD6iCvDqpRXSK0VCls+%9YNh^cP5(7w88aTQRU;l>MPKhAzRr2fOVqkwo2l|z zCAVslnj9>1vOcs5e{%j{-FL zYmD)Fd1ssb3a=Y0zi#oh-R`2+h}S1qO?Oqbtj6l}FzgJNBp!mTzJQ=4%kj7~d?%JighIlO@ZT^RNJG7Sx1y zWYbDrwx+K_4nTnTg+)By z8iv4Bip9qJL^|gK(>ZUfT-4GD0lPux7Nm115#tNOIfy(sw{T<5p`dVXA<(%6-MRKM zUu?z)>T9t)e^&HV)X;IYP3f=b}240VNmQy3Jfed3jt z_gCxIb$3g<5?|xwwiopnTX*1eNe;0{`O8SfhJNF5ZwmG-{6^s7kT)~Q?5LgYVkhjpQz)9LqMdZ@wCR*mDcf-}rP0v|HJ8n2 z3dNid8(@!=a;NR0S;&~_Yz|~Wmos4A4VvVPlRazu!10mf7!1F|?oPAaCOgF*PP)l~ zE_jdb%dk^jT})bV%v{NF&5`6&w&{-8rjyLsWykS(> z0GqK5dV;8)1hJ9vm?5Nt`a_-I5uL-XHDXv$rJP_WodB zf3*Mp=)QY>9BpFjgr^4{tl7hlBv^#8Da1P9!FGq=G2`qpW{me3cW%37>jk*@`T)lV z+v_02_>P|Qk%QZ}bo?>`6fyU8G0RvPdo>?%aaznjCg(jgsOCGK=@bMxr+0YgcCvq6 z({X(72>fD1T&<>6sza>474!9o9o#n2!ER~8d_F8FpmnfY15os5OB=ooklTp=BBp@t zf(P@Xw|)SE@UMp84~5`71pj6To({o}0*?MGzeUagJ1Oy~Oo7NXU@3Tl{AaG%?$OlP z81uLMu#d3e!-Gc;>>nIHdg#z`eq#8<{sV)2nB~NY!5lYj7mFxu z>7JTLWpU*Z@yyh~Kx&l8;1=S70kees6Gb-V9LT-jCn|3viA{rDGx zQ@bB(dKRVsYlKhp^0CJMyX1G`LZRt(G9Yo~r^@5QA^b-*zRF`dgnvfkpA%j%_7vgM zJf7G1YP}Z-pRV_38egsVVhH~Ojjz^wHH80>##ie#7>xH z##jCuTl_$^#b4rW@h5!h|D?qA{rhuG&!)`Ft3(eyH{K*T-M{M74E?0%#%=PGO}Bfm z#FhW*+=xmX_0V(UYXqlu-ynDw$S6G~jIp79d{m3efx^}I(&HMgzL!|knaH`x)6ly` zzaLSfqCJ|7y7susqG|Zy!lI`gheeA8|0Pw(!OtI<%NJZb3g7m795uMJ1JW>EPr zIPfP14^sLSAbT!7m-{C@$flz?{t literal 0 HcmV?d00001 diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8523f4f941a636651e4b3459a7ee6bb7c8176fb0 GIT binary patch literal 3016 zcmbtW&5t8T6|buP^w-Q}GD&uq&B_WP$Wk&B0Z|BARx9m>2oyPpT{u`oC6BA@vD0>Y zs>_jfWM6P3;1UUroNS2$`!Cg%(_Z)kf+FSjs(U;$3*tgs{p#!a)%*Cp_xiW3R-NJb z*PHJSf6!p;pR~CCL|8n;Tl@n=F~u|1W1lc3RPYs3fo2oF4tfGRp^C5*twk@;p^Co{ z=I`K7vS=Fg0$%<%?!`LZ#9P)&bf8jIQ}xkq90|V`kdXe*)0$3o?G4teSF#$qsT(@E z#nv46@F%R(cmZu$cR=*|6JzlZZ}BS-&3at1o={u|n@|UnXv>E}iE0)5Rd8cPTrqf} zavVjyM8&u-amk~ndRFAdg{p7+E-9=TD_yv#IP1@~3ukIPbzw2S(A`ezQYmNssg}~! zrJUw!k$d{@b7Yhck)wA+i4gBuMuc89FxFL5 zwJ7uN@zsoG!+hI?2YTm5xO|pi3{G5R(M&BfQ05L6&U8mbm=)V#Qa1 z8Agk7=bn8lWF65`wPYL?P$l8ypfo75)_+4TD@?3U|28aIt4 zn}o!NF@|(DiN0pw^y@9(29Uk4*c0}gcRL3z8D@P88w@gxnHGo(GAzj$Lm6fWn1Kzk=5_HFKM*kw`2nwgd$IqtgvcfTfPixOkmh8955faXMrnGl;iCD?en_`OfVEcfan?yDIH;6!{Flne6DAz z6PxeRvN40jTFGo&SXcA5QNDR6BIy>V{vaG%J$=bsbA#atz`SlzJ=XjW+yeF%#`qC6VhfXPGD#;jS+~KYQO%o}$EAcL zkI5CMlT8isT0pK?iDl`8ix0Ys>8UpDeAphNcnoyWo-PX8p7!nFtZmP9d$wahZ9#;_ z`K;*ddAE5yx%%(=*+PG8Om0f#d4N&yu25zu?k*i^E4|Zh(J3L++$M4dq!X0BPbxiJ z^d-rC$-k~4C8UrLDc`~03PLg=DiwEmQycse*}R$fF1Hfeuvku09G;G zFqu@Kka&Qlm{1WTHO;G7bhsgr7zq9^----2dX8&VCBK%f<=G85lY=Q+3D(8m zK;T*cal!!RBa3YHU>2Leh5&Ol0?N@Oo+L88+^Ng;+9SU} z?`->;)*j}j-B)UCf&LqQC2x?mBU<+v_nHF zkMC#spq~{FFuDALhoR}}qqx*zGh8C5fpKp-)$@z6&2c{`6C?wRw{^so0wz5~1`l zKPE!W=~@O|xrZz!`+dbq(f!i>G)Z1tIJOB~qtVDp7l4 z&0=5|M*H?$vU+W)jJnXGOuGO**YUpNr;ZO?FvMqJG&lI3`){hb^nUqu_<+iU@6o9^ StnEEay`NHkkKYsMV&Xf|GLJL> literal 0 HcmV?d00001 diff --git a/norch/__pycache__/tensor.cpython-39.pyc b/norch/__pycache__/tensor.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16c079804a3e136ea94de87632d351b1e122fa07 GIT binary patch literal 2180 zcmZuyOOG2x5bo}Iu3y<$n{7 zFt`t2@ihoZhE$Lt6I41IS2|N~OUF#GdgR-Yb76#9{+LbNVIVv_#{>@!WLD(LxFXiE z2@0(eAq(RbNAX-5HxtQh5QQe>Jd0=|BR)>^SQ~G|lT3q=aUxSu@E1f~f(Wd5^=1DkpUHljX8nixXfczS&Wpa1BPC-k z`TRuZYIM{e=XoFcM|sxQ*5y0%6UD%agMeTrLe`=9hX2_4x6ni7`>1>u#5sC`JtKg- zBV1@96T*kq6M+b!^~H{8KpTjrXh9o_HsIDVeg)eIZJs{pNC@8p_=-P3lw?Cnx}`s| z6_WFSMBWoy*g0sRK*ZE4+WVsF}< zI3=07(-v>r`3_pN<4f3XS|9_|t1N+i_8iZy$6LCE{d`vth=>iASMJ>DA1;zq^wZ?9 zhPcS1%O)77v4#ob%@w3kA=buy@bK|te5}>`geKhpyJEvo(oAsN6}-Ow0qE*5J(lIVogyBdV{R#gsq&CJ|sU~U%90VZD-|` zY(q;(2_?t3kM|*E&X`#s6$L91Q&*ueemtMcOhmpyCx^`pB9(%tNuh^3h%3i?XE7TF z#o`bbjGJgVJHH_|WYvZJ@4{DL$OK~BqanN|?#*I7I_l{o*~`uppvFLkk~}M-wuQ~o$26YC=|VnIDp!_s z6`%0NSyHJh&@xL+VNV_6y5uoN?-zedM%; zG*{fkS>awIpOY0mz75RxY_D6=jkCoP;SUV4+24G%We`{ZZCr3uFNa~+3Y{>tD*%rzqdQNuT8#8UNm~l-+W(m|;oa)5dk-ToFykTX GhW`OZM%JSM literal 0 HcmV?d00001 diff --git a/norch/tensor.py b/norch/tensor.py new file mode 100644 index 0000000..b319598 --- /dev/null +++ b/norch/tensor.py @@ -0,0 +1,89 @@ +import ctypes + +class CTensor(ctypes.Structure): + _fields_ = [ + ('data', ctypes.POINTER(ctypes.c_float)), + ('strides', ctypes.POINTER(ctypes.c_int)), + ('shape', ctypes.POINTER(ctypes.c_int)), + ('ndim', ctypes.c_int), + ('size', ctypes.c_int), + ] + +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) + + 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, + (ctypes.c_int * len(shape))(*shape), + ctypes.c_int(len(shape)) + ) + + def flatten(self, nested_list): + flat_data = [] + shape = [len(nested_list), len(nested_list[0])] + for sublist in nested_list: + for item in sublist: + flat_data.append(item) + return flat_data, shape + + def __getitem__(self, indices): + if len(indices) != self.ndim: + raise ValueError("Number of indices must match the number of dimensions") + + Tensor._C.get_item.argtypes = [ctypes.POINTER(CTensor), ctypes.POINTER(ctypes.c_int)] + Tensor._C.get_item.restype = ctypes.c_float + + indices = (ctypes.c_int * len(indices))(*indices) + value = Tensor._C.get_item(self.tensor, indices) + + return value + + def __str__(self): + result = "" + for i in range(self.shape[0]): + for j in range(self.shape[1]): + result += str(self[i, j]) + " " + result += "\n" + return result.strip() + + def __repr__(self): + return self.__str__() + + def __add__(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.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)] + + return Tensor(result_data, result_shape) + + +if __name__ == "__main__": + from tensor import Tensor + import time + + ini = time.time() + a = Tensor([[1, 2, 3], [1, 2, 3]]) + b = Tensor([[1, 2, 3], [1, 2, 3]]) + + + c = a + b + fim = time.time() + + print(fim-ini) \ No newline at end of file diff --git a/norch/tests.ipynb b/norch/tests.ipynb new file mode 100644 index 0000000..ca51d7d --- /dev/null +++ b/norch/tests.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 0, 2, 2] [2, 3, 3]\n", + "Tensor shape: [2, 3, 3]\n", + "Tensor created successfully\n", + "Tensor information:\n", + "Number of dimensions: 3\n", + "Shape: [2, 3, 3]\n", + "Data:\n", + "[0.00, 1.00, 2.00, 0.00, 2.00, 2.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00]\n" + ] + } + ], + "source": [ + "from tensor import Tensor\n", + "\n", + "data = [[0, 1, 2], [0, 2, 2], [0, 1, 2]]\n", + "tensor = Tensor(data)\n", + "print(\"Tensor shape:\", tensor.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tensor created successfully\n", + "Tensor information:\n", + "Number of dimensions: 2\n", + "Shape: [3, 3]\n", + "Data:\n", + "[0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90]\n" + ] + }, + { + "data": { + "text/plain": [ + "0.10000000149011612 0.20000000298023224 0.30000001192092896 \n", + "0.4000000059604645 0.5 0.6000000238418579 \n", + "0.699999988079071 0.800000011920929 0.8999999761581421" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "data = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]\n", + "shape = [3, 3]\n", + "tensor = Tensor(data, shape)\n", + "tensor\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..f8353cf --- /dev/null +++ b/test.sh @@ -0,0 +1,5 @@ +cd build +make +cd .. +cd norch +python3 tensor.py \ No newline at end of file