int push_as3_array_to_lua_stack(lua_State * L, AS3_Val array) { LCALL(L, stack); int len = 0; int i = 0; AS3_Val cur; AS3_Val len_v; if (!AS3_InstanceOf(array, Array_class)) { LRETURN(L, stack, 0); } len_v = AS3_GetS(array, "length"); len = AS3_IntValue(len_v); SAFE_RELEASE(len_v); for (i = 0; i < len; i++) { AS3_Val i_v = AS3_Int(i); cur = AS3_Get(array, i_v); SAFE_RELEASE(i_v); /* TODO: This probably should be push_as3_to_lua_stack */ push_as3_lua_userdata(L, cur); SAFE_RELEASE(cur); } LRETURN(L, stack, len); }
int push_as3_array_to_lua_stack_convert_values(lua_State * L, AS3_Val array) { LCALL(L, stack); int len = 0; int i = 0; AS3_Val cur; AS3_Val len_v; if (!AS3_InstanceOf(array, Array_class)) { LRETURN(L, stack, 0); } len_v = AS3_GetS(array, "length"); len = AS3_IntValue(len_v); SAFE_RELEASE(len_v); for (i = 0; i < len; i++) { AS3_Val i_v = AS3_Int(i); cur = AS3_Get(array, i_v); SAFE_RELEASE(i_v); push_as3_to_lua_stack(L, cur); SAFE_RELEASE(cur); } LRETURN(L, stack, len); }
static AS3_Val initparam(void* self, AS3_Val args) { AS3_Val tmp = AS3_Undefined(); int il, len; for (il=0; il < sizeof(models)/sizeof(LAYER); ++il) { tmp = AS3_Get(args, AS3_Int(2*il)); len = AS3_IntValue(AS3_GetS(tmp, "length")); models[il].w = (float*) malloc(len); AS3_ByteArray_readBytes(models[il].w, tmp, len); tmp = AS3_Get(args, AS3_Int(2*il+1)); len = AS3_IntValue(AS3_GetS(tmp, "length")); models[il].b = (float*) malloc(len); AS3_ByteArray_readBytes(models[il].b, tmp, len); } data = (float*) malloc(BUF_SIZE); o = (float*) malloc(BUF_SIZE); return AS3_Int(0); }
static AS3_Val prediction(void* self, AS3_Val args) { AS3_Val in_arr = AS3_Undefined(), out_arr = AS3_Array(0); float *tmp, d, e; int i,j,k,l, n,x,y, newx,newy, il, dx,dy; LAYER *pL; AS3_ArrayValue( args, "AS3ValType", &in_arr ); for(i=0; i < 1024; ++i) data[i] = AS3_IntValue(AS3_Get(in_arr, AS3_Int(4*i+1))) /255.0; n = 1; x = 32; y = 32; #define DATA(l,j,i) data[((l)*y + (j))*x + (i)] #define O(k,dy,dx) o[((k)*newy + (dy))*newx + (dx)] #define W(k,l,j,i) pL->w[(((k)*n + (l))*pL->y + (j))*pL->x + (i)] for (il=0; il < nl; ++il) { flyield(); pL = L+il; newx = x+1-pL->x; newy = y+1-pL->y; for (dx=0; dx < newx; ++dx) for (dy=0; dy < newy; ++dy) for (k=0; k < pL->n; ++k) { d = pL->b[k]; for (l=0; l < n; ++l) for(j=0; j < pL->y; ++j) for(i=0; i < pL->x; ++i) d += DATA(l,j+dy,i+dx)*W(k,l,j,i); O(k,dy,dx) = d; } if(pL->maxpool) { for (k=0; k < pL->n; ++k) for (dx=0; dx < newx; dx+=2) for (dy=0; dy < newy; dy+=2) { d=O(k,dy,dx); e=O(k,dy,dx+1); if(e>d) d=e; e=O(k,dy+1,dx); if(e>d) d=e; e=O(k,dy+1,dx+1); if(e>d) d=e; O(k,dy/2,dx/2)=d; } newx /= 2; newy /= 2; } for (dx=0; dx < newx; ++dx) for (dy=0; dy < newy; ++dy) { e = 0; for (k=0; k < pL->n; ++k) { d = O(k,dy,dx); if(pL->nonlin==1) d=1.0/(1.0 + exp(-d)); else if(pL->nonlin==2) d=tanh(d); else if(pL->nonlin==3) { d=exp(d); e += d; } O(k,dy,dx) = d; } if(pL->nonlin==3 && e) for (k=0; k < pL->n; ++k) O(k,dy,dx) /= e; } tmp = data; data = o; o = tmp; x = newx; y = newy; n = pL->n; } for(i=0; i < n*x*y; ++i) AS3_Set(out_arr, AS3_Int(i), AS3_Number(data[i])); return out_arr; }