Esempio n. 1
0
//pteracuda_nifs:gemv(Ctx, _m, _n, _alpha, A, X, _betha, Y),
ERL_NIF_TERM pteracuda_nifs_gemv(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    PCudaContextRef *ctxRef;
   PCudaBufferRef *ref_A, *ref_X, *ref_Y;
    
    unsigned long transpose;
    unsigned long  m, n;
    double alpha, beta;

    if (argc != 9 || 
        !enif_get_resource(env, argv[0], pteracuda_context_resource, (void **) &ctxRef) ||
        !enif_get_ulong(env, argv[1], &transpose)||
        !enif_get_ulong(env, argv[2], &m)||
        !enif_get_ulong(env, argv[3], &n)||
        !enif_get_double(env, argv[4], &alpha)||
        !enif_get_resource(env, argv[5], pteracuda_buffer_resource, (void **) &ref_A) ||
        !enif_get_resource(env, argv[6], pteracuda_buffer_resource, (void **) &ref_X)||
        !enif_get_double(env, argv[7], &beta)||
        !enif_get_resource(env, argv[8], pteracuda_buffer_resource, (void **) &ref_Y)) {

        return enif_make_badarg(env);
    }

    if(((PCudaMatrixFloatBuffer*)ref_A->buffer)->rows() != m || ((PCudaMatrixFloatBuffer*)ref_A->buffer)->cols() != n){
        return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix A dimensions do not match m,n parameters")); 
    }

    cuCtxSetCurrent(ctxRef->ctx);
    pcuda_gemv(transpose, m, n, alpha, ((PCudaMatrixFloatBuffer *)ref_A->buffer)->get_data(), ((PCudaFloatBuffer *)ref_X->buffer)->get_data(), beta, ((PCudaFloatBuffer *)ref_Y->buffer)->get_data());

    return ATOM_OK;
}
Esempio n. 2
0
/**
 * Erlang Wrapper for geonum_encode
 */
ERL_NIF_TERM
erl_geonum_encode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    double lat;
    double lon;
    int precision;
    long long bin_geonum[1];

    if(!enif_get_double(env, argv[0], &lat)) {
        return enif_make_badarg(env);
    }

    if(!enif_get_double(env, argv[1], &lon)) {
        return enif_make_badarg(env);
    }

    if(!enif_get_int(env, argv[2], &precision)) {
        return enif_make_badarg(env);
    }

    if(precision >= GEONUM_MAX || precision < 1) {
        return make_error(env, "precision_range");
    }

    geonum_encode(lat, lon, precision, bin_geonum);

    return make_ok(env, enif_make_int64(env, bin_geonum[0]));
}
Esempio n. 3
0
static ERL_NIF_TERM perspective(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
			double fovy,aspect,zNear,zFar;
			ERL_NIF_TERM d[16];

			if(!enif_get_double(env,argv[0], &fovy)) {
							return enif_make_badarg(env);
			}
			if(!enif_get_double(env,argv[1], &aspect)) {
							return enif_make_badarg(env);
			}
			if(!enif_get_double(env,argv[2], &zNear)) {
							return enif_make_badarg(env);
			}
			if(!enif_get_double(env,argv[3], &zFar)) {
							return enif_make_badarg(env);
			}

			glm::dmat4 p = glm::perspective(fovy, aspect,zNear, zFar);
			const double *pSource = (const double*)glm::value_ptr(p);
			for( int i=0; i< 16; ++i) 
							d[i] = enif_make_double(env,pSource[i]);

			return enif_make_tuple_from_array(env, d, 16);
}
Esempio n. 4
0
static ERL_NIF_TERM btRigidBody_setDamping(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
    double lin_damping,and_damping;
    enif_get_double(env, argv[1], &lin_damping);
    enif_get_double(env, argv[2], &and_damping);
    ((btRigidBody*)unwrap_pointer(env,btRigidBody_resource,argv[0]))->setDamping(lin_damping,and_damping);
    return enif_make_atom(env, "ok");
}
Esempio n. 5
0
/* Currently support for 2 dimensions only */
int
set_GEOSCoordSeq_from_eterm_list(GEOSCoordSequence *seq, int pos,
        ErlNifEnv *env, const ERL_NIF_TERM *coords) {
    double dbl_coord;
    int int_coord;
    ERL_NIF_TERM head, tail;

    if (enif_get_list_cell(env, *coords, &head, &tail)) {
        if (enif_get_int(env, head, &int_coord)) {
            dbl_coord = int_coord;
        }
        else if (!enif_get_double(env, head, &dbl_coord)) {
            return 0;
        }
        GEOSCoordSeq_setX(seq, pos, dbl_coord);

        enif_get_list_cell(env, tail, &head, &tail);
        if (enif_get_int(env, head, &int_coord)) {
            dbl_coord = int_coord;
        }
        else if (!enif_get_double(env, head, &dbl_coord)) {
            return 0;
        }
        GEOSCoordSeq_setY(seq, pos, dbl_coord);
        return 1;
    }
    return 0;
}
Esempio n. 6
0
static btVector3 get_vector(ErlNifEnv *env, const ERL_NIF_TERM arg) {
    double x,y,z;
    const ERL_NIF_TERM *tuple;
    int arity;
    enif_get_tuple(env, arg, &arity, &tuple);
    enif_get_double(env, tuple[0], &x);
    enif_get_double(env, tuple[1], &y);
    enif_get_double(env, tuple[2], &z);
    return btVector3(x,y,z);
}
Esempio n. 7
0
static btQuaternion get_quaternion(ErlNifEnv *env, const ERL_NIF_TERM arg) {
    double x,y,z,w;
    const ERL_NIF_TERM *tuple;
    int arity;
    enif_get_tuple(env, arg, &arity, &tuple);
    enif_get_double(env, tuple[0], &x);
    enif_get_double(env, tuple[1], &y);
    enif_get_double(env, tuple[2], &z);
    enif_get_double(env, tuple[3], &w);
    return btQuaternion(x,y,z,w);
}
Esempio n. 8
0
///////////////////Matrix operations
// C(m,n) = A(m,k) * B(k,n)
//gemm(_Ctx, _transpose_op_A, _transpose_op_B, _m, _n, _k, _alpha, _A, _B, _beta, _C ) 
ERL_NIF_TERM pteracuda_nifs_gemm(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    PCudaContextRef *ctxRef;
    PCudaBufferRef *ref_A, *ref_B, *ref_C;
    unsigned long transpose_a, transpose_b;
    unsigned long  m, n, k;
    double alpha, beta;
    
    if (argc != 11 || !enif_get_resource(env, argv[0], pteracuda_context_resource, (void **) &ctxRef) ||
        !enif_get_ulong(env, argv[1], &transpose_a)||
        !enif_get_ulong(env, argv[2], &transpose_b)||
        !enif_get_ulong(env, argv[3], &m)||
        !enif_get_ulong(env, argv[4], &n)||
        !enif_get_ulong(env, argv[5], &k)||
        !enif_get_double(env, argv[6], &alpha)||
        !enif_get_resource(env, argv[7], pteracuda_buffer_resource, (void **) &ref_A) ||
        !enif_get_resource(env, argv[8], pteracuda_buffer_resource, (void **) &ref_B)||
        !enif_get_double(env, argv[9], &beta)||
        !enif_get_resource(env, argv[10], pteracuda_buffer_resource, (void **) &ref_C)
        ) {
        return enif_make_badarg(env);
    }

    if(transpose_a == CUBLAS_OP_N){
        if(((PCudaMatrixFloatBuffer*)ref_A->buffer)->rows() != m || ((PCudaMatrixFloatBuffer*)ref_A->buffer)->cols() != k){
            return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix A dimensions do not match m,k parameters")); 
        }
    }else{
         if(((PCudaMatrixFloatBuffer*)ref_A->buffer)->rows() != k || ((PCudaMatrixFloatBuffer*)ref_A->buffer)->cols() != n){
            return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix A dimensions do not match m,k parameters")); 
        }
    }

    if(transpose_b == CUBLAS_OP_N){
        if(((PCudaMatrixFloatBuffer*)ref_B->buffer)->rows() != k || ((PCudaMatrixFloatBuffer*)ref_B->buffer)->cols() != n){
            return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix B dimensions do not match k,n parameters")); 
        }
    }else{
        if(((PCudaMatrixFloatBuffer*)ref_B->buffer)->rows() != n || ((PCudaMatrixFloatBuffer*)ref_B->buffer)->cols() != k){
            return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix B dimensions do not match k,n parameters")); 
        }
    }    

    if(((PCudaMatrixFloatBuffer*)ref_C->buffer)->rows() != m || ((PCudaMatrixFloatBuffer*)ref_C->buffer)->cols() != n){
        return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Matrix C dimensions do not match m,n parameters")); 
    }

    cuCtxSetCurrent(ctxRef->ctx);
    //pcuda_mmul(((PCudaMatrixFloatBuffer*)ref_A->buffer)->get_data(), ((PCudaMatrixFloatBuffer*)ref_B->buffer)->get_data(), ((PCudaMatrixFloatBuffer*)ref_C->buffer)->get_data(), m, k, n);
    pcuda_gemm(transpose_a, transpose_b, m, n, k, alpha, ((PCudaMatrixFloatBuffer*)ref_A->buffer)->get_data(), ((PCudaMatrixFloatBuffer*)ref_B->buffer)->get_data(), beta, ((PCudaMatrixFloatBuffer*)ref_C->buffer)->get_data());
    
    return ATOM_OK;
}
Esempio n. 9
0
static ERL_NIF_TERM cost_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    double x,y,ret;
    if (!enif_get_double(env, argv[0], &x)) {
		return enif_make_badarg(env);
    }
    if (!enif_get_double(env, argv[1], &y)) {
		return enif_make_badarg(env);
    }

    ret = cost(x,y);
    return enif_make_double(env, ret);
}
Esempio n. 10
0
static ERL_NIF_TERM lookat(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
			int arity;
			const ERL_NIF_TERM *eye,*center,*up;
			ERL_NIF_TERM d[16];

			if(!enif_get_tuple(env,argv[0],&arity,&eye)) {
							return enif_make_badarg(env);
			}
			if(arity!=3) {
							return enif_make_badarg(env);
			}

			if(!enif_get_tuple(env,argv[1],&arity,&center)) {
							return enif_make_badarg(env);
			}
			if(arity!=3) {
							return enif_make_badarg(env);
			}

			if(!enif_get_tuple(env,argv[2],&arity,&up)) {
							return enif_make_badarg(env);
			}
			if(arity != 3) {
							return enif_make_badarg(env);
			}

			glm::dvec3 veye;
			if(!(enif_get_double(env,eye[0],&veye.x) && 
					 enif_get_double(env,eye[1],&veye.y) &&	
					 enif_get_double(env,eye[2],&veye.z))) {
							return enif_make_badarg(env);
			}

			glm::dvec3 vcenter;
			if(!(enif_get_double(env,center[0],&vcenter.x) && 
					 enif_get_double(env,center[1],&vcenter.y) &&	
					 enif_get_double(env,center[2],&vcenter.z))) {
							return enif_make_badarg(env);
			}

			glm::dvec3 vup;
			if(!(enif_get_double(env,up[0],&vup.x) && 
					 enif_get_double(env,up[1],&vup.y) &&	
					 enif_get_double(env,up[2],&vup.z))) {
							return enif_make_badarg(env);
			}

			glm::dmat4 m = glm::lookAt(veye,vcenter,vup);
			const double *pSource = (const double*)glm::value_ptr(m);
			for(int i =0; i<16;++i) 
							d[i] = enif_make_double(env,pSource[i]);
			return enif_make_tuple_from_array(env,d,16);
}
Esempio n. 11
0
ERL_NIF_TERM date_get_field(ErlNifEnv* env, int argc, 
    const ERL_NIF_TERM argv[])
{
    UErrorCode status = U_ZERO_ERROR;
    UCalendar* cal;
    cloner* ptr;
    double date;
    ERL_NIF_TERM res;


    if(!((argc == 3)
      && enif_get_resource(env, argv[0], calendar_type, (void**) &ptr)  
      && enif_get_double(env, argv[1], &date))) {
        return enif_make_badarg(env);
    }

    cal = (UCalendar*) cloner_get(ptr);
    CHECK_RES(env, cal);

    ucal_setMillis(cal, (UDate) date, &status);
    CHECK(env, status);

    res = do_date_get_field(env, cal, argv[2], status);
    CHECK(env, status);

    return res;
}
Esempio n. 12
0
ERL_NIF_TERM _hh_percentile(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    double percentile;
    hh_ctx_t* ctx = NULL;

    ErlNifResourceType* ctx_type = get_hh_ctx_type(env);
    if (argc != 2 ||
        ctx_type == NULL ||
        !enif_get_resource(env, argv[0], ctx_type, (void **)&ctx) ||
        !enif_get_double(env, argv[1], &percentile))
    {
        return enif_make_badarg(env);
    }
   
    if (ctx != NULL)
    {
        if (ctx->data->total_count == 0)
        {
            return enif_make_double(env, 0.);
        }
        else
        {
            return enif_make_double(
                env,
                round_to_significant_figures(
                    hdr_value_at_percentile(ctx->data,percentile),
                    ctx->significant_figures
                )
            );
        }
    }

    return make_error(env, "bad_hdr_histogram_nif_impl");
}
Esempio n. 13
0
ERL_NIF_TERM pteracuda_ml_gd_learn(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    PCudaContextRef *ctxRef;
    PCudaBufferRef *ref_Theta, *ref_X, *ref_Y;
    unsigned long num_features; 
    unsigned long num_samples;
    unsigned long iterations;
    double learning_rate;
    
    if (argc != 8 || !enif_get_resource(env, argv[0], pteracuda_context_resource, (void **) &ctxRef) ||
        !enif_get_resource(env, argv[1], pteracuda_buffer_resource, (void **) &ref_Theta) ||
        !enif_get_resource(env, argv[2], pteracuda_buffer_resource, (void **) &ref_X) ||
        !enif_get_resource(env, argv[3], pteracuda_buffer_resource, (void **) &ref_Y) ||
        !enif_get_ulong(env, argv[4], &num_features) ||
        !enif_get_ulong(env, argv[5], &num_samples) ||
        !enif_get_double(env, argv[6], &learning_rate) ||
        !enif_get_ulong(env, argv[7], &iterations)

        ) {
        return enif_make_badarg(env);
    }

    cuCtxSetCurrent(ctxRef->ctx);

    pcuda_gd_learn(((PCudaFloatBuffer*)ref_Theta->buffer)->get_data(), ((PCudaFloatBuffer*)ref_X->buffer)->get_data(), ((PCudaFloatBuffer*)ref_Y->buffer)->get_data(), num_features, num_samples, (float)learning_rate, iterations);
    
    return ATOM_OK;
}
Esempio n. 14
0
ERL_NIF_TERM pteracuda_nifs_saxpy(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
    PCudaContextRef *ctxRef;

    PCudaBufferRef *ref_X, *ref_Y;
    
    double a;

    if (argc != 4 || 
        !enif_get_resource(env, argv[0], pteracuda_context_resource, (void **) &ctxRef) ||
        !enif_get_double(env, argv[1], &a)||
        !enif_get_resource(env, argv[2], pteracuda_buffer_resource, (void **) &ref_X)||
        !enif_get_resource(env, argv[3], pteracuda_buffer_resource, (void **) &ref_Y)) {

        return enif_make_badarg(env);
    }

    if(((PCudaFloatBuffer *)ref_X->buffer)->get_data()->size() != ((PCudaFloatBuffer *)ref_Y->buffer)->get_data()->size()){
        return enif_make_tuple2(env, ATOM_ERROR, enif_make_atom(env, "Size X does not match size Y.")); 
    }

    cuCtxSetCurrent(ctxRef->ctx);
    pcuda_saxpy(a, ((PCudaFloatBuffer *)ref_X->buffer)->get_data(), ((PCudaFloatBuffer *)ref_Y->buffer)->get_data());

    return ATOM_OK;
}
Esempio n. 15
0
static ERL_NIF_TERM btCollisionShape_calculateLocalInertia(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
    btVector3 ret;
    double mass;
    enif_get_double(env, argv[1], &mass);
    ((btCollisionShape*)unwrap_pointer(env,btCollisionShape_resource,argv[0]))->calculateLocalInertia((btScalar)mass,ret);
    return vector_to_tuple(env,ret);
}
Esempio n. 16
0
static ERL_NIF_TERM
multiply_with_scalar(ErlNifEnv *env, int argc, const ERL_NIF_TERM *argv) {
    ErlNifBinary  matrix;
    ERL_NIF_TERM  result;
    double        large_scalar;
    float         scalar;
    float        *matrix_data, *result_data;
    int32_t       data_size;
    size_t        result_size;

    (void)(argc);

    if (!enif_inspect_binary(env, argv[0], &matrix)) return enif_make_badarg(env);
    if (enif_get_double(env, argv[1], &large_scalar) == 0) {
        long long_element;
        enif_get_int64(env, argv[1], &long_element);

        large_scalar = (double) long_element;
    }
    scalar = (float) large_scalar;

    matrix_data = (float *) matrix.data;
    data_size   = (int32_t) (matrix_data[0] * matrix_data[1] + 2);

    result_size = sizeof(float) * data_size;
    result_data = (float *) enif_make_new_binary(env, result_size, &result);

    matrix_multiply_with_scalar(matrix_data, scalar, result_data);

    return result;
}
Esempio n. 17
0
static ERL_NIF_TERM
float_ref(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  int err;
  double helper;
  float *value;
  
  value = enif_alloc(sizeof(float));
  if (!value) {
    goto error;
  }

  err = enif_get_double(env, argv[0], &helper);
  if (!err) {
    enif_free(value);
    goto error;
  }

  *value = (float)helper;
  
  return enif_make_tuple2(env, 
			  nifty_make_ptr(env, (ptr_t)value),
			  enif_make_string(env, "nifty.float *", ERL_NIF_LATIN1));

 error:
  return enif_make_badarg(env);
}
Esempio n. 18
0
static ERL_NIF_TERM rotate(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
				double angle;
				int arity;
				const ERL_NIF_TERM *t,*v;
				double dm[16]; 
				ERL_NIF_TERM d[16];

				if(!enif_get_tuple(env,argv[0],&arity,&t)) {
								return enif_make_badarg(env);
				}
				if(arity!=16) {
								return enif_make_badarg(env);
				}

				for(int i=0; i<16; ++i) {
								enif_get_double(env,t[i],&dm[i]);
				}

				glm::dmat4 matrix = glm::make_mat4(dm);

				if(!enif_get_double(env,argv[1],&angle)) {
								return enif_make_badarg(env);
				}

				if(!enif_get_tuple(env,argv[2],&arity,&v)) {
								return enif_make_badarg(env);
				}
				if(arity != 3) {
								return enif_make_badarg(env);
				}

				glm::dvec3 axis;

			  if(!(enif_get_double(env,v[0],&axis.x) && enif_get_double(env,v[1],&axis.y) &&	enif_get_double(env,v[2],&axis.z))) {
								return enif_make_badarg(env);
				}

				glm::dmat4 rotation = glm::rotate(matrix,angle,axis);
				
				const double *pSource = (const double*)glm::value_ptr(rotation);
				for(int i =0; i<16; ++i) {
							d[i] = enif_make_double(env,pSource[i]);
				}
				return enif_make_tuple_from_array(env,d,16);
}
Esempio n. 19
0
ERL_NIF_TERM date_diff_field(ErlNifEnv* env, int argc, 
    const ERL_NIF_TERM argv[])
{
    UErrorCode status = U_ZERO_ERROR;
    UCalendar* cal;
    cloner* ptr;
    double startMs, targetMs;

    char    value[ATOM_LEN];
    int     parsed_value, amount;
    UCalendarDateFields field;


    if(!((argc == 4)
      && enif_get_resource(env, argv[0], calendar_type, (void**) &ptr)  
      && enif_get_double(env, argv[1], &startMs)
      && enif_get_double(env, argv[2], &targetMs)
      && enif_get_atom(env, argv[3], (char*) value, ATOM_LEN, 
            ERL_NIF_LATIN1))) {
        return enif_make_badarg(env);
    }

    cal = (UCalendar*) cloner_get(ptr);
    CHECK_RES(env, cal);

    ucal_setMillis(cal, (UDate) startMs, &status);
    CHECK(env, status);



    parsed_value = parseCalendarDateField(value);
    if (parsed_value == -1) {
        status = U_ILLEGAL_ARGUMENT_ERROR;
        CHECK(env, status);
    }

    field = (UCalendarDateFields) parsed_value;

    amount = (int) dateFieldDifference(cal, 
        targetMs, 
        field, 
        status);
    CHECK(env, status);

    return enif_make_int(env, amount);
}
Esempio n. 20
0
static ERL_NIF_TERM mutate_solution(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]){

    // struct timespec start, end;
    // long diff;
    // clock_gettime(CLOCK_MONOTONIC, &start);

    ERL_NIF_TERM term;
    ErlNifResourceType* sol_type;
    Solution *sol, *mut_sol;
    // unsigned int i;
    double range, rate;

    CHECK(env, argc == 3)

    sol_type = (ErlNifResourceType*) enif_priv_data(env);
    CHECK(env, sol_type)

    CHECK(env, enif_get_resource(env, argv[0], sol_type, (void**) &sol))
    CHECK(env, enif_get_double(env, argv[1], &range))
    CHECK(env, enif_get_double(env, argv[2], &rate))

    mut_sol = (Solution*) enif_alloc_resource(sol_type, sizeof(Solution));
    CHECK(env, mut_sol)
    
    term = enif_make_resource(env, mut_sol);
    CHECK(env,term)
    enif_release_resource(mut_sol);

    mut_sol->len = sol->len;
    mut_sol->genotype = (double*) malloc(sizeof(double)*sol->len);

    mutate(sol, mut_sol, range, rate);

    #ifdef DEBUG
    print_solution(sol, "Genotype");
    print_solution(mut_sol, "MutatedGenotype");
    #endif

    // clock_gettime(CLOCK_MONOTONIC, &end);
    // diff = CLOCKS_PER_SEC * (end.tv_sec - start.tv_sec) + end.tv_nsec - start.tv_nsec;
    // printf("mut=%llu\n", (long long unsigned int) diff);

    return term;

}
Esempio n. 21
0
ERL_NIF_TERM date_clear(ErlNifEnv* env, int argc, 
    const ERL_NIF_TERM argv[])
{
    UErrorCode status = U_ZERO_ERROR;
    UCalendar* cal;
    cloner* ptr;
    double date;

    UCalendarDateFields field;
    ERL_NIF_TERM head, tail;
    unsigned int count, i = 0;

    char    value[ATOM_LEN];
    int     parsed_value;

    if(!((argc == 3)
      && enif_get_resource(env, argv[0], calendar_type, (void**) &ptr)  
      && enif_get_double(env, argv[1], &date)
      && enif_get_list_length(env, argv[2], &count))) {
        return enif_make_badarg(env);
    }

    cal = (UCalendar*) cloner_get(ptr);
    CHECK_RES(env, cal);

    ucal_setMillis(cal, (UDate) date, &status);
    CHECK(env, status);

    tail = argv[2];
    while (enif_get_list_cell(env, tail, &head, &tail)) {

            /* Set an attribute start */

            if (!enif_get_atom(env, head, (char*) value, 
                    ATOM_LEN, ERL_NIF_LATIN1)) 
                goto bad_elem;
                
            parsed_value = parseCalendarDateField(value);
            if ((parsed_value == -1)) 
                goto bad_elem;

            field = (UCalendarDateFields) parsed_value;
 
            ucal_clearField(cal, field);

            if (U_FAILURE(status))
                goto bad_elem;
            
            /* Set an attribute end */

    }

    return calendar_to_double(env, (const UCalendar*) cal);

    bad_elem:
        return list_element_error(env, argv[2], i);
}
Esempio n. 22
0
bool PCudaFloatBuffer::contains(ErlNifEnv *env, ERL_NIF_TERM rawTarget) {
    double target;
    if (enif_get_double(env, rawTarget, &target)) {
        return pcuda_float_binary_search(this->data, target);
    }
    else {
        return false;
    }
}
Esempio n. 23
0
static ERL_NIF_TERM cost4_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    double x1,x2,x3,x4,ret;
    if (!enif_get_double(env, argv[0], &x1)) {
		return enif_make_badarg(env);
    }
    if (!enif_get_double(env, argv[1], &x2)) {
		return enif_make_badarg(env);
    }
    if (!enif_get_double(env, argv[2], &x3)) {
		return enif_make_badarg(env);
    }
    if (!enif_get_double(env, argv[2], &x4)) {
		return enif_make_badarg(env);
    }
    ret = cost4(x1,x2,x3,x4);
    return enif_make_double(env, ret);
}
Esempio n. 24
0
static int test_double(ErlNifEnv* env, double d1)
{
    double d2 = 0;
    ERL_NIF_TERM term = enif_make_double(env, d1);
    if (!enif_get_double(env,term, &d2) || d1 != d2) {
	fprintf(stderr, "test_double(%e) ...FAILED i2=%e\r\n", d1, d2);
	return 0;
    }
    return 1;
}
Esempio n. 25
0
static inline int
match_double(ErlNifEnv* env, ERL_NIF_TERM term, State *st){
  double dp;
  int n;
  if(!enif_get_double(env, term, &dp))
    return 0;
  b_reserve(24, st);
  n = sprintf((char *)st->cur, "%.15g", dp);
  b_seek(n, st);
  return 1;  
}
Esempio n. 26
0
static ERL_NIF_TERM new_btRigidBodyConstructionInfo(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
    double mass;
    btVector3 inertia = get_vector(env,argv[3]);
    enif_get_double(env, argv[0], &mass);
    return wrap_pointer(env,btRigidBodyConstructionInfo_resource, new btRigidBody::btRigidBodyConstructionInfo(
        mass,
        (btMotionState*)unwrap_pointer(env,btMotionState_resource,argv[1]),
        (btCollisionShape*)unwrap_pointer(env,btCollisionShape_resource,argv[2]),
        inertia
        ));
}
Esempio n. 27
0
static ERL_NIF_TERM translate(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
			double x,y,z;
			ERL_NIF_TERM d[16];

			if(!enif_get_double(env,argv[0],&x)) {
							return enif_make_badarg(env);
			}
			if(!enif_get_double(env,argv[1],&y)) {
							return enif_make_badarg(env);
			}
			if(!enif_get_double(env,argv[2],&z)) {
							return enif_make_badarg(env);
			}

			glm::mat4 trans = glm::translate(glm::mat4(1.0f), glm::vec3((float)x,(float)y,(float)z));
			const float *pSource = (const float*)glm::value_ptr(trans);
			for(int i =0; i<16;++i) 
							d[i] = enif_make_double(env,(double)pSource[i]);
			return enif_make_tuple_from_array(env,d,16);
}
Esempio n. 28
0
bool PCudaFloatBuffer::insert_at(unsigned long position, ErlNifEnv *env, ERL_NIF_TERM rawValue) {
    double value;
    if (enif_get_double(env, rawValue, &value)) {
        std::vector<double>::iterator iter = this->data->begin();
        for (unsigned long i = 0; i < position; i++) {
            iter++;
        }
        this->data->insert(iter, 1, value);
        return true;
    }
    return false;
}
Esempio n. 29
0
static int
bind_cell(ErlNifEnv *env, const ERL_NIF_TERM cell, sqlite3_stmt *stmt, unsigned int i)
{
    int the_int;
    ErlNifSInt64 the_long_int;
    double the_double;
    char the_atom[MAX_ATOM_LENGTH+1];
    ErlNifBinary the_blob;
    int arity;
    const ERL_NIF_TERM* tuple;

    if(enif_get_int(env, cell, &the_int)) 
	    return sqlite3_bind_int(stmt, i, the_int);

    if(enif_get_int64(env, cell, &the_long_int)) 
        return sqlite3_bind_int64(stmt, i, the_long_int);

    if(enif_get_double(env, cell, &the_double)) 
	    return sqlite3_bind_double(stmt, i, the_double);

    if(enif_get_atom(env, cell, the_atom, sizeof(the_atom), ERL_NIF_LATIN1)) {
	    if(strcmp("undefined", the_atom) == 0) {
	       return sqlite3_bind_null(stmt, i);
	    }
	  
	    return sqlite3_bind_text(stmt, i, the_atom, strlen(the_atom), SQLITE_TRANSIENT);
    }

    /* Bind as text assume it is utf-8 encoded text */
    if(enif_inspect_iolist_as_binary(env, cell, &the_blob))
        return sqlite3_bind_text(stmt, i, (char *) the_blob.data, the_blob.size, SQLITE_TRANSIENT);

    /* Check for blob tuple */
    if(enif_get_tuple(env, cell, &arity, &tuple)) {
        if(arity != 2) 
            return -1;

        /* length 2! */
        if(enif_get_atom(env, tuple[0], the_atom, sizeof(the_atom), ERL_NIF_LATIN1)) {
            /* its a blob... */
            if(0 == strncmp("blob", the_atom, strlen("blob"))) {
                /* with a iolist as argument */
                if(enif_inspect_iolist_as_binary(env, tuple[1], &the_blob)) {
                    /* kaboom... get the blob */
	                return sqlite3_bind_blob(stmt, i, the_blob.data, the_blob.size, SQLITE_TRANSIENT);
                }
            }
        }
    }

    return -1;
}
Esempio n. 30
0
// convert an erlang term to a python object
// return None if the type can't be converted
static PyObject* pynerl_term_to_obj(ErlNifEnv* env, ERL_NIF_TERM term) {
	int vint;
	Py_ssize_t arity, i;
	long int vlong;
	double vdouble;
	char buff[BUFF_SIZE];
	PyObject* obj;
	ERL_NIF_TERM list, head, tail;
	const ERL_NIF_TERM *terms;

	// TODO: add more types
	if (enif_get_long(env, term, &vlong)) {
		obj = PyLong_FromLong(vlong);
	}
	else if (enif_get_double(env, term, &vdouble)) {
		obj = PyFloat_FromDouble(vlong);
	}
	else if (enif_is_empty_list(env, term)) {
		obj = PyList_New(0);
	}
	else if (enif_get_tuple(env, term, &vint, &terms)) {
		arity = vint;
		obj = PyTuple_New(arity);

		for (i = 0; i < arity; i++) {
			PyTuple_SetItem(obj, i, pynerl_term_to_obj(env, terms[(int)i]));
		}
	}
	else if (enif_is_identical(term, enif_make_atom(env, "true"))) {
		obj = Py_True;
	}
	else if (enif_is_identical(term, enif_make_atom(env, "false"))) {
		obj = Py_False;
	}
	else if (enif_get_string(env, term, buff, BUFF_SIZE, ERL_NIF_LATIN1)) {
		obj = PyUnicode_FromString(buff);
	}
	else if (enif_get_list_cell(env, term, &head, &tail)) {
		obj = PyList_New(0);
		list = term;

		while (enif_get_list_cell(env, list, &head, &tail)) {
			PyList_Append(obj, pynerl_term_to_obj(env, head));
			list = tail;
		}
	}
	else {
		obj = Py_None;
	}

	return obj;
}