예제 #1
0
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);
}
예제 #2
0
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;
}