From 9553847c268032a8059b5cb435681fefe520d72d Mon Sep 17 00:00:00 2001 From: Anshuman Chhabra Date: Sat, 4 Aug 2018 14:28:07 +0530 Subject: [PATCH] Fixed bugs in C code --- c_src/Tensorflex.c | 43 +++++++++++++++++++++++---------------- test/cropped_panda.jpg | Bin 0 -> 2683 bytes test/tensorflex_test.exs | 11 ++++++++++ 3 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 test/cropped_panda.jpg diff --git a/c_src/Tensorflex.c b/c_src/Tensorflex.c index a67af22..c489997 100644 --- a/c_src/Tensorflex.c +++ b/c_src/Tensorflex.c @@ -26,7 +26,6 @@ typedef union static int get_number(ErlNifEnv* env, ERL_NIF_TERM term, double* dp); static Matrix* alloc_matrix(ErlNifEnv* env, unsigned nrows, unsigned ncols); -static Matrix* realloc_matrix(ErlNifEnv* env, Matrix* mx, unsigned nrows, unsigned ncols); static void matrix_destr(ErlNifEnv* env, void* obj); static ErlNifResourceType* resource_type = NULL; @@ -193,17 +192,24 @@ static ERL_NIF_TERM matrix_to_lists(ErlNifEnv* env, int argc, const ERL_NIF_TERM static ERL_NIF_TERM append_to_matrix(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { - mx_t mx; - unsigned j; + Matrix* mx_ret = NULL; + unsigned j, it_i, it_j; unsigned nrows, ncols; ERL_NIF_TERM list, row, ret; + mx_t mx; if (!enif_get_resource(env, argv[0], resource_type, &mx.vp)) return enif_make_badarg(env); nrows = mx.p->nrows; ncols = mx.p->ncols; - mx.p = realloc_matrix(env, mx.p, nrows+1, ncols); + mx_ret = alloc_matrix(env, nrows+1, ncols); + for(it_i = 0; it_i < nrows; it_i++) { + for(it_j = 0; it_j < ncols; it_j++){ + POS(mx_ret, it_i, it_j) = POS(mx.p, it_i, it_j); + } + } + list = argv[1]; if (!enif_get_list_cell(env, list, &row, &list)) { goto badarg; @@ -211,7 +217,7 @@ static ERL_NIF_TERM append_to_matrix(ErlNifEnv* env, int argc, const ERL_NIF_TER for (j = 0; jnrows = nrows; - mx->ncols = ncols; - mx->data = enif_realloc(mx->data, nrows*ncols*sizeof(double)); - return mx; -} - static void matrix_destr(ErlNifEnv* env, void* obj) { Matrix* mx = (Matrix*) obj; @@ -495,8 +493,14 @@ static ERL_NIF_TERM float64_tensor(ErlNifEnv *env, int argc, const ERL_NIF_TERM } } - tensor = TF_NewTensor(TF_DOUBLE, dims, ndims, mx1.p->data, (size_alloc) * sizeof(double), tensor_deallocator, 0); + double *data = enif_alloc((mx1.p->nrows)*(mx1.p->ncols)*sizeof(double)); + for (i = 0; i < mx1.p->nrows; i++) { + for (j = 0; j < mx1.p->ncols; j++) { + data[(i)*(mx1.p->ncols) + (j)] = (double) POS(mx1.p, i, j); + } + } + tensor = TF_NewTensor(TF_DOUBLE, dims, ndims, data, (size_alloc) * sizeof(double), tensor_deallocator, 0); } memcpy((void *) tensor_resource_alloc, (void *) &tensor, sizeof(TF_Tensor *)); @@ -775,7 +779,12 @@ static ERL_NIF_TERM load_image_as_tensor(ErlNifEnv *env, int argc, const ERL_NIF const int size_alloc = output_size * sizeof(unsigned char); int64_t dims[3] = {width, height, num_pixels}; - tensor = TF_NewTensor(TF_UINT8, dims, 3, output, size_alloc, tensor_deallocator, 0); + uint8_t *data = enif_alloc(output_size*sizeof(uint8_t)); + for(int it = 0; it < output_size; it++){ + data[it] = (uint8_t)output[it]; + } + + tensor = TF_NewTensor(TF_UINT8, dims, 3, data, size_alloc, tensor_deallocator, 0); memcpy((void *) tensor_resource_alloc, (void *) &tensor, sizeof(TF_Tensor *)); ERL_NIF_TERM new_tensor = enif_make_resource(env, tensor_resource_alloc); enif_release_resource(tensor_resource_alloc); diff --git a/test/cropped_panda.jpg b/test/cropped_panda.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a8bc27d7034109018070551b16cd2ca6a2e4ebed GIT binary patch literal 2683 zcmb7=c{tRI7skIcgRu-6OLt^!GlRkgy;qnV0~wNiFT29s;aC07fX?2K$h#Ynbf zSC;I%v7|AQOV$u0w2-;(^Lw8A|L;BjozFS%d7r~!a{dO65b*>&00IF3=&%6J6krDM z^6)@;xOt&aC?6j$KTJ#zCLjQl5D^s?lR73NEp-ful*Onj%A!=zNaS&y6DlXwH8nM5 z6!i>su?DIdn%I9$Kzw|BFaa1sP!NHYL&{U z=}nBPUDkVAjzPCy${hyydJ#)UZ`QS^pg1`wU^Gj3qIWA)q0p^_B7aaAwpBg!fT5(# zqtv%|eDBn_#Xz>!UKCtLF03eWT0QB6VW(|TnUk@%_8ji@gSOMIU{!8a(lu>E`F*wB z3DDVqG-v6Mv;n>+dwgf>FfUiepcS*WSB@_*-3#l~@Za4Ql7l6rnu_lYrI8~L{a|%+ zFFI%?%^FkR)$Z&0Z9lOOv9#oNrqQiDVY?YI=BH&6rjmaXI(_w2XJl8nOnAoul8aD2p%e7<3SU_^xHNVg7J<~n)4@H zKCjSO&F*~nxQZgC%0@Nt-(7+%#_M{l|L&*RD}7)sa`_om?iZD3en0JpePvIaeB9HS zux|B2`(G6-GOfc1Q<{<*;(+@!K|8uEcmbNP@^VY18|9PX>F0r?xz$d&`ssVxsFu(z zOO{`;PHPM_TxK^3Esyp_x=B^r3eTYyQ!9kne&@XRN)*lpBHO9(vGasA25Sq2@>MM+KS19Xqh(vh=%Lgj zTvP%SA%xqQnk(A=-JZ-;Auo{MLjuac8RbJml3foZ+Xu`O3+zrTQXL)9=t2V1Hzeqi zs8+{GY<%7Qx0d4!7dTtKHm|gojOr;Z@T`CP(^kWRpm5i{zR~k45;I75KN2DPVbt}P za>b-ky8q(1e{RaL7hTPFzgUk2lm(J~m7foz(R^55|IFeqTrIUV+1HQX##`rdGrb=s z<$7S&aARwVBA0sQywLK=pqAQeT{Ugt3N`S@kw(*B8bXruhYu#UhQ(viXLKV3H^V1> zi_=_0d-CDOJ!wtuo@5*s8Arq}Dwh9AZoh!l^IA z^3MO(nD+adzdV!%p6QA4mHJeEZ#&g7Fy$Jbv3~kCp)zq&rl1?5v{mZv?AMvJWd4vP z_AuKe?m9oQ!(Y5r=@#ynuk{?*i~OR8&zFhUuTi3$Al;TnA&6|WLA`yUahV7 zDXa^ojJwk=$!4V+&{53K9>eRz+Qk+7E=IeoSCUA|YTZx}iQ%lX$;P!|Hkl1vemWeW z#X3BxWlV8YZNBQY$sGRAKino`E6Z4NK_bO{cXfq?nBQcYyb~wYpHob7&cRI*LxScp zsrjIl)wJy=0y%Nz@@$10Lx6Lh8#SlyWgPPKE1qQ0%7gVr;TuW{TbK)(T_5_aDYum? zXY=qc)(Vbvz!}s~`e#S|;Qi3^JvSLkky|*bH(ptCM3T{BH%His(NHLnub1_Px->>+ z2A6GL_8&8;%P>*TUbIzm))bQ)y)Vt`9doZ$TA@ClAJOyp}SI_@e4Gj zMSy@crdwu9MzO|nvnJ=`N<_xJ2uGL%^KaRWJXX@SmGmV|^=b1|wT~ht3$ZPJ{Ad1< zg0LK7LzW)pXB=n8>w7TsCa9%hL9O?0e#N$!4Mpv3KUKzAnY)OX2PeC}oOF2!*nW#4 zoTcEM@WPpNZ2kJBvHb6|JHez8aoxRo9O-Fiojn4S8NN=WMl0P?V~Ad?g=L=UiQS&( z0CES4Q`HBV`}$xqwHrR%~x2Z3X0v> zlhYWNE!&x$oeKQQ`#vWmHK^iRxHWtQKWtY=n8Ot>kL1}Kn*926-7HlyShzctrqMeF z{^(~LuKme~w|=%HP3uikD1A3QN%Pi_@vYdYLLPX7mT`Qc=DTOkBuKbvZEGid%!m1m zhwCh>GCEhz4N=zQz;4T}^F-WLUrBr*aWDGvem%ZntrkUA;*eN1Mm|pDe zU-V{UJf<4 + {:ok, _tensor} = Tensorflex.load_image_as_tensor("./test/sample1.csv") + end + end end end