Beispiel #1
0
static ERL_NIF_TERM
divide(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64 m;
  ErlNifSInt64* target;
  int count;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_BIN(0, bin, count, vs);

  if (!enif_get_int64(env, argv[1], &m))
    return enif_make_badarg(env);

  if (!m)
    return enif_make_badarg(env);

  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, bin.size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  for (int i = 0; i < count; i++) {
    if (IS_SET(vs[i])) {
      target[i] = TO_DDB(FROM_DDB(vs[i]) / m);
    } else {
      target[i] = 0;
    }
  }
  return r;
}
Beispiel #2
0
static ERL_NIF_TERM
derivate_r(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* target;
  ErlNifSInt64* vs;
  int count;

  if (argc != 1)
    return enif_make_badarg(env);

  GET_BIN(0, bin, count, vs);

  if (count < 1) // can't be empty
    return enif_make_badarg(env);

  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, bin.size - sizeof(ErlNifSInt64), &r)))
    return enif_make_badarg(env); // TODO return propper error

  for (int i = 1; i < count; i++) {
    target[i - 1] = vs[i] - vs[i-1];
  }
  return r;
}
Beispiel #3
0
static ERL_NIF_TERM
mul_r(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64 m;
  ErlNifSInt64* target;
  int count;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_BIN(0, bin, count, vs);

  if (!enif_get_int64(env, argv[1], &m))
    return enif_make_badarg(env);

  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, bin.size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  for (int i = 0; i < count; i++) {
    target[i] = vs[i] * m;
  }
  return r;
}
Beispiel #4
0
/***************************************************
 * Function: DensityGrid::GetDensity               *
 * Description: Get_Density from density grid      *
 **************************************************/
float DensityGrid::GetDensity(float Nx, float Ny, float Nz,bool fineDensity) 
{
	deque<Node>::iterator BI;
	int x_grid, y_grid, z_grid;
	float x_dist, y_dist, z_dist, distance, density=0;
	int boundary=10;	// boundary around plane


	/* Where to look */
	x_grid = (int)((Nx+HALF_VIEW+.5)*VIEW_TO_GRID);
	y_grid = (int)((Ny+HALF_VIEW+.5)*VIEW_TO_GRID);
	z_grid = (int)((Nz+HALF_VIEW+.5)*VIEW_TO_GRID);

	// Check for edges of density grid (10000 is arbitrary high density)
	if (x_grid > GRID_SIZE-boundary || x_grid < boundary) return 10000;
	if (y_grid > GRID_SIZE-boundary || y_grid < boundary) return 10000;
	if (z_grid > GRID_SIZE-boundary || z_grid < boundary) return 10000;

	// Fine density?
	if (fineDensity) {

		// Go through nearest bins
	  for (int k=z_grid-1; k<=z_grid+1; k++)
	    for(int i=y_grid-1; i<=y_grid+1; i++)
	      for(int j=x_grid-1; j<=x_grid+1; j++) {
		      
		// Look through bin and add fine repulsions
		for(BI = GET_BIN(k,i,j).begin(); BI < GET_BIN(k,i,j).end(); ++BI) {
		  x_dist =  Nx-(BI->x);
		  y_dist =  Ny-(BI->y);
		  z_dist =  Nz-(BI->z);
		  distance = x_dist*x_dist+y_dist*y_dist+z_dist*z_dist;
		  density += 1e-4/(distance + 1e-50);
		}
	      }
	  
	// Course density
	} else {

		// Add rough estimate
		density = Density[z_grid][y_grid][x_grid];
		density *= density;
	}

	return density;
}
Beispiel #5
0
int get_bin2(void **buf, int *len, void **value, size_t *n)
{
    GET_BIN_ARG_CHECK;

    uint16_t blen = 0;
    if (get_uint16(buf, len, &blen) < 0)
        return -2;

    GET_BIN(blen);
}
Beispiel #6
0
/***************************************************
 * Function: DensityGrid::fineSubtract             *
 * Description: Subtract a node from bins		   *
 **************************************************/
void DensityGrid::fineSubtract(Node &N) 
{
  int x_grid, y_grid, z_grid;

  /* Where to subtract */
  x_grid = (int)((N.sub_x+HALF_VIEW+.5)*VIEW_TO_GRID);
  y_grid = (int)((N.sub_y+HALF_VIEW+.5)*VIEW_TO_GRID);
  z_grid = (int)((N.sub_z+HALF_VIEW+.5)*VIEW_TO_GRID);
  GET_BIN(z_grid,y_grid,x_grid).pop_front();
}
Beispiel #7
0
void DensityGrid::Init() 
{
  
  try
    {
      Density = new float[GRID_SIZE][GRID_SIZE][GRID_SIZE];
      fall_off = new float[RADIUS*2+1][RADIUS*2+1][RADIUS*2+1];
      Bins = new deque<Node>[GRID_SIZE*GRID_SIZE*GRID_SIZE];
    }
  catch (bad_alloc errora)
    {
      // cout << "Error: Out of memory! Program stopped." << endl;
	  #ifdef MUSE_MPI
        MPI_Abort ( MPI_COMM_WORLD, 1 );
	  #else
	    igraph_error("DrL is out of memory", __FILE__, __LINE__,
			 IGRAPH_ENOMEM);
	  #endif
    }
	
  // Clear Grid
  int i;
  for (i=0; i< GRID_SIZE; i++) 
    for (int j=0; j< GRID_SIZE; j++) 
      for (int k=0; k < GRID_SIZE; k++) {
	Density[i][j][k] = 0;
	GET_BIN(i,j,k).erase(GET_BIN(i,j,k).begin(),GET_BIN(i,j,k).end());
      }
  
  // Compute fall off
  for(i=-RADIUS; i<=RADIUS; i++)
    for(int j=-RADIUS; j<=RADIUS; j++) 
      for (int k=-RADIUS; k<=RADIUS; k++) {
	fall_off[i+RADIUS][j+RADIUS][k+RADIUS] = 
	  (float)((RADIUS-fabs((float)i))/RADIUS) * 
	  (float)((RADIUS-fabs((float)j))/RADIUS) *
	  (float)((RADIUS-fabs((float)k))/RADIUS);
      }
  
}
Beispiel #8
0
/***************************************************
 * Function: DensityGrid::fineAdd                  *
 * Description: Add a node to the bins			   *
 **************************************************/
void DensityGrid::fineAdd(Node &N) 
{
  int x_grid, y_grid, z_grid;

  /* Where to add */
  x_grid = (int)((N.x+HALF_VIEW+.5)*VIEW_TO_GRID);
  y_grid = (int)((N.y+HALF_VIEW+.5)*VIEW_TO_GRID);
  z_grid = (int)((N.z+HALF_VIEW+.5)*VIEW_TO_GRID);
  N.sub_x = N.x;
  N.sub_y = N.y;
  N.sub_z = N.z;
  GET_BIN(z_grid,y_grid,x_grid).push_back(N);
}
Beispiel #9
0
static ERL_NIF_TERM
min_r(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64* target;
  ErlNifSInt64 chunk;         // size to be compressed
  ErlNifSInt64 target_i = 0; // target position
  ErlNifSInt64 aggr;         // target position
  uint32_t pos;
  uint32_t count;
  uint32_t target_size;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_CHUNK(chunk);
  GET_BIN(0, bin, count, vs);

  target_size = ceil((double) count / chunk) * sizeof(ErlNifSInt64);
  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, target_size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  // If we don't have any input data we can return right away.
  if (count == 0)
    return r;

  // We know we have at least one element in the list so our
  // aggregator will start with this
  aggr = vs[0];
  pos = 1;
  // We itterate over the remining i .. count-1 elements
  for (uint32_t i = 1; i < count; i++, pos++) {
    if (pos == chunk) {
      target[target_i] = aggr;
      target_i++;
      aggr = vs[i];
      pos = 0;
    } else {
      if (vs[i] < aggr) {
        aggr = vs[i];
      };
    }
  }
  // Making sure the last aggregate is saved.
  if (target_i < target_size)
    target[target_i] = aggr;

  return r;
}
Beispiel #10
0
static ERL_NIF_TERM
avg_r(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64* target;
  ErlNifSInt64 chunk;         // size to be compressed
  ErlNifSInt64 aggr;          // Aggregator

  uint32_t target_i = 0;      // target position
  uint32_t count;
  uint32_t pos = 0;
  uint32_t target_size;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_CHUNK(chunk);
  GET_BIN(0, bin, count, vs);

  target_size = ceil((double) count / chunk) * sizeof(ErlNifSInt64);
  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, target_size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  if (count == 0)
    return r;

  aggr = vs[0];
  pos++;

  for (uint32_t i = 1; i < count; i++, pos++) {
    if (pos == chunk) {
      target[target_i] =  aggr / chunk;
      target_i++;
      aggr = vs[i];
      pos = 0;
    } else {
      aggr += vs[i];
    }
  }
  if (count % chunk) {
    aggr +=  vs[count - 1] * (chunk - (count % chunk));
  }
  target[target_i] = aggr / chunk;

  return r;
}
Beispiel #11
0
static ERL_NIF_TERM
derivate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64 last;
  ErlNifSInt64* target;
  ErlNifSInt64* vs;
  int count;
  int has_value;

  if (argc != 1)
    return enif_make_badarg(env);

  GET_BIN(0, bin, count, vs);

  if (count < 1) // can't be empty
    return enif_make_badarg(env);

  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, bin.size - sizeof(ErlNifSInt64), &r)))
    return enif_make_badarg(env); // TODO return propper error


  has_value = IS_SET(vs[0]);
  if (has_value) {
    last = FROM_DDB(vs[0]);
  }
  for (int i = 1; i < count; i++) {
    if (IS_SET(vs[i])) {
      if (has_value) {
        ErlNifSInt64 this = FROM_DDB(vs[i]);
        target[i - 1] = TO_DDB(this - last);
        last = this;
      } else {
        target[i - 1] = 0;
        last = FROM_DDB(vs[i]);
        has_value = 1;
      }
    } else {
      if (has_value) {
        target[i - 1] = TO_DDB(0);
      } else {
        target[i - 1] = 0;
      }
    }
  }
  return r;
}
Beispiel #12
0
static ERL_NIF_TERM
empty(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64* target;
  ErlNifSInt64 chunk;         // size to be compressed
  ErlNifSInt64 target_i = 0;  // target position
  ErlNifSInt64 pos = 0;       // position in chunk
  ErlNifSInt64 aggr = 0;      // aggregated value for this chunk
  int count;
  int target_size;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_CHUNK(chunk);
  GET_BIN(0, bin, count, vs);

  target_size = ceil((double) count / chunk) * sizeof(ErlNifSInt64);
  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, target_size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  if (count == 0)
    return r;
  pos = 0;
  for (int i = 0; i < count; i++, pos++) {
    if (pos == chunk) {
      target[target_i] = TO_DDB(aggr);
      target_i++;
      aggr = !IS_SET(vs[i]);
      pos = 0;
    } else {
      aggr += !IS_SET(vs[i]);
    }
  }

  if (count % chunk) {
    aggr += (chunk - (count % chunk));
  }
  target[target_i] = TO_DDB(aggr);

  return r;
}
Beispiel #13
0
static ERL_NIF_TERM
avg(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
  ErlNifBinary bin;
  ERL_NIF_TERM r;
  ErlNifSInt64* vs;
  ErlNifSInt64* target;
  ErlNifSInt64 chunk;         // size to be compressed
  ErlNifSInt64 target_i = 0;  // target position
  ErlNifSInt64 pos = 0;       // position in chunk
  ErlNifSInt64 aggr = 0;      // aggregated value for this chunk
  ErlNifSInt64 last = 0;
  int count;
  int has_value = 0;
  int has_last = 0;
  int target_size;

  if (argc != 2)
    return enif_make_badarg(env);

  GET_CHUNK(chunk);
  GET_BIN(0, bin, count, vs);

  target_size = ceil((double) count / chunk) * sizeof(ErlNifSInt64);
  if (! (target = (ErlNifSInt64*) enif_make_new_binary(env, target_size, &r)))
    return enif_make_badarg(env); // TODO return propper error

  // If we don't have any input data we can return right away.
  if (count == 0)
    return r;

  // We know we have at least one element in the list so our
  // aggregator will start with this
  if (IS_SET(vs[0])) {
    aggr = FROM_DDB(vs[0]);
    last = aggr;
    has_value = 1;
    has_last = 1;
  };
  pos = 1;
  // We itterate over the remining i .. count-1 elements

  for (int i = 1; i < count; i++, pos++) {
    if (pos == chunk) {
      if (has_value) {
        target[target_i] = TO_DDB(aggr / chunk);
      } else {
        target[target_i] = 0;
      }

      target_i++;
      has_value = IS_SET(vs[i]);
      if (has_value) {
        aggr = FROM_DDB(vs[i]);
        last = aggr;
        has_last = 1;
      } else if (has_last) {
        aggr = last;
        has_value = 1;
      }
      pos = 0;
    } else if (!has_value) {
      if (IS_SET(vs[i])) {
        aggr = FROM_DDB(vs[i]);
        last = aggr;
        has_value = 1;
        has_last = 1;
      };
    } else {
      if (IS_SET(vs[i])) {
        last = FROM_DDB(vs[i]);
        aggr += last;
        has_last = 1;
        has_value = 1;
      } else if (has_last) {
        aggr += last;
        has_value = 1;
      }
    }
  }

  if (has_value) {
    if (count % chunk) {
      aggr += (last * (chunk - (count % chunk)));
    }
    target[target_i] = TO_DDB(aggr / chunk);
  } else {
    target[target_i] = 0;
  }
  return r;
}
Beispiel #14
0
static char *pkgtostr(struct sockaddr_in *client_addr, char *pkg, int len, uint64_t *hash_key)
{
    int ret;

    void *p  = pkg;
    int left = len;

    static char str[UINT16_MAX * 10];
    size_t use = 0;

    static void  *buf;
    static size_t buf_len;

    /* make sure buf is not NULL */
    auto_realloc(&buf, &buf_len, 128);

    struct column *curr = settings.columns;
    while (curr)
    {
        switch (curr->type)
        {
        case COLUMN_TYPE_TINY_INT:
            GET_INT(uint8, PRIu8, int8, PRIi8);

            break;
        case COLUMN_TYPE_SMALL_INT:
            GET_INT(uint16, PRIu16, int16, PRIi16);

            break;
        case COLUMN_TYPE_INT:
            GET_INT(uint32, PRIu32, int32, PRIi32);

            break;
        case COLUMN_TYPE_BIG_INT:
            GET_INT(uint64, PRIu64, int64, PRIi64);

            break;
        case COLUMN_TYPE_FLOAT:
            {
                float v = 0.0;
                if (curr->is_zero == false)
                    FAIL_LOG(get_float(&p, &left, &v));
                if (curr->is_storage)
                    use += snprintf(str + use, sizeof(str) - use, "%.7g,", v);
            }

            break;
        case COLUMN_TYPE_DOUBLE:
            {
                double v = 0.0;
                if (curr->is_zero == false)
                    FAIL_LOG(get_double(&p, &left, &v));
                if (curr->is_storage)
                    use += snprintf(str + use, sizeof(str) - use, "%.16g,", v);
            }

            break;
        case COLUMN_TYPE_CHAR:
            GET_STR(get_str1);

            break;
        case COLUMN_TYPE_VARCHAR:
            GET_STR(get_str2);

            break;
        case COLUMN_TYPE_TINY_TEXT:
            GET_STR(get_str1);

            break;
        case COLUMN_TYPE_TEXT:
            GET_STR(get_str2);

            break;
        case COLUMN_TYPE_BINARY:
            GET_BIN(get_bin1);

            break;
        case COLUMN_TYPE_VARBINARY:
            GET_BIN(get_bin2);

            break;
        case COLUMN_TYPE_TINY_BLOB:
            GET_BIN(get_bin1);

            break;
        case COLUMN_TYPE_BLOB:
            GET_BIN(get_bin2);

            break;
        case COLUMN_TYPE_DATE:
            GET_TIME(get_date_str);

            break;
        case COLUMN_TYPE_TIME:
            GET_TIME(get_time_str);

            break;
        case COLUMN_TYPE_DATETIME:
            GET_TIME(get_datetime_str);

            break;
        default:
            log_fatal("unknow column type: %d", curr->type);

            break;
        }

        curr = curr->next;
    }

    /* delete last comma */
    use -= 1;
    str[use] = 0;

    return str;
}