void motion2(Eigen::Matrix3f &rot, Eigen::Vector3f &tr)
{
  rot = Eigen::Matrix3f::Identity();
  tr(0) = gen_random_float(0,0.2f);
  tr(1) = gen_random_float(0,0.2f);
  tr(2) = gen_random_float(0,0.2f);
}
void motion3(Eigen::Matrix3f &rot, Eigen::Vector3f &tr)
{
  Eigen::Vector3f n;
  n(0) = gen_random_float(-1,1);
  n(1) = gen_random_float(-1,1);
  n(2) = gen_random_float(-1,1);
  n.normalize();
  Eigen::AngleAxisf aa(gen_random_float(-0.02f,0.05f),n);
  rot = aa.toRotationMatrix();
  tr.fill(0);
}
Beispiel #3
0
///////////////////////////////////////////////////////////////////////
// Generate random string
std::string gen_rand_str(size_t len) {
  auto randchar = []() -> char {
    // const char charset[] =
    //   "0123456789"
    //   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    //   "abcdefghijklmnopqrstuvwxyz";
    const char charset[] =
    "0123456789"
    "abcdefghijklmnopqrstuvwxyz";
    // const size_t max_index = (sizeof(charset) - 1);
    // return charset[rand() % max_index];
    return charset[((int) std::floor(gen_random_float(0.0f, (float) sizeof(charset) - 1)))];
  };
  std::string str(len, 0);
  std::generate_n(str.begin(), len, randchar);
  return str;
}
Beispiel #4
0
void CliffordAttractor::constructConstants() {
  //  while (1) {
  constVals.clear();
  expressionX->constVals.clear();
  expressionY->constVals.clear();
  if (expressionZ) expressionZ->constVals.clear();

  for (int i = 0; i < consts.size(); i++) {
    constVals.push_back(gen_random_float(-PI, 3*PI));
  }

  for (int i = 0; i < expressionX->numConsts; i++)
    expressionX->constVals.push_back( constVals[i] );

  for (int i = 0; i < expressionY->numConsts; i++)
    expressionY->constVals.push_back( constVals[i] );

  if (expressionZ) {
    for (int i = 0; i < expressionY->numConsts; i++)
      expressionZ->constVals.push_back( constVals[i] );
  }

  /* Constants evaluation
     double x = 0;
     double y = 0;

     int good = 100;
     for (int i = 0; i < 100; i++) {
     vector<double> vals{x,y};
     double nx = expressionX->evaluate(vals);
     double ny = expressionY->evaluate(vals);

     double d = pow(x-nx, 2) + pow(y-ny, 2);
     }*/
  //}
}
std::vector<cob_3d_mapping_msgs::CurvedPolygon> generateRandomPlanes(const int N, const bool cors)
                            {
  std::vector<cob_3d_mapping_msgs::CurvedPolygon> r;

  for(int i=0; i<N; i++)
  {
    cob_3d_mapping_msgs::CurvedPolygon cp;

    cp.ID = i;

    cp.parameter[0] = gen_random_float(2.f, 4.f);
    cp.parameter[1] = gen_random_float(-1.f,1.f);
    cp.parameter[2] = 0;
    cp.parameter[3] = gen_random_float(-1.f,1.f);
    cp.parameter[4] = 0;
    cp.parameter[5] = 0;

    Eigen::Vector3f z,n,np;
    z.fill(0);z(2)=1.f;
    n=z;
    n(0) = -cp.parameter[1];
    n(1) = -cp.parameter[3];
    n.normalize();
    np = cp.parameter[0]*(z.dot(n))*n;

    cob_3d_mapping_msgs::feature ft;
    ft.ID = 1; //nearest point
    ft.x = np(0);
    ft.y = np(1);
    ft.z = np(2);
    cp.features.push_back(ft);

    if(cors)
    {
      cob_3d_mapping_msgs::simalarity_score ss;
      ss.ID = i;
      ss.prob = 1.f;
      cp.score.push_back(ss);
    }

    //outline
    float size = gen_random_float(0.5f, 2.f)/10;
    for(int j=0; j<10; j++)
    {
      cob_3d_mapping_msgs::polyline_point pt;
      pt.edge_prob = 1;

      pt.x = j*size;
      pt.y = 0;
      cp.polyline.push_back(pt);

      pt.x = j*size;
      pt.y = size*10;
      cp.polyline.push_back(pt);

      pt.y = j*size;
      pt.x = 0;
      cp.polyline.push_back(pt);

      pt.y = j*size;
      pt.x = size*10;
      cp.polyline.push_back(pt);
    }

    r.push_back(cp);
  }

  return r;
                            }
Beispiel #6
0
int main(int argc, char** argv)
{
	int args = 1;
#ifdef USE_OPENCL
	if (argc < 10) {
#else
	if (argc < 7) {
#endif
		std::cout << "Not enough arguments" << std::endl;
		system("pause");
		return 1;
	}

	DIM = util::toInt(argv[args++]);
	N = util::toInt(argv[args++]);
	K = util::toInt(argv[args++]);
	ITERATIONS = util::toInt(argv[args++]);
	RUNS = util::toInt(argv[args++]);
#ifdef USE_OPENCL
	AM_LWS = util::toInt(argv[args++]);
	RP_LWS = util::toInt(argv[args++]);
	CT_LWS = util::toInt(argv[args++]);

	USE_ALL_DEVICES = util::toInt(argv[args++]);
#else
	device_count = util::toInt(argv[args++]);
#endif


	std::cout << "DIM = " << DIM << std::endl;
	std::cout << "N = " << N << std::endl;
	std::cout << "K = " << K << std::endl;
	std::cout << "ITERATIONS = " << ITERATIONS << std::endl;
	std::cout << "RUNS = " << RUNS << std::endl;
#ifdef USE_OPENCL
	std::cout << "AM_LWS = " << AM_LWS << std::endl;
	std::cout << "RP_LWS = " << RP_LWS << std::endl;
	std::cout << "CT_LWS = " << CT_LWS << std::endl;
	std::cout << "USE_ALL_DEVICES = " << USE_ALL_DEVICES << std::endl << std::endl;
#else
	std::cout << "device_count = " << device_count << std::endl << std::endl;
#endif


#ifdef _WIN32
	rng.seed();
	srand(GetTickCount());
#else
	rng.seed();
	srand(getTimeMs());
#endif

	u = boost::uniform_real<float>(0.0f, 1000000.0f);
	gen = new boost::variate_generator<boost::mt19937&, boost::uniform_real<float> >(rng, u);

#ifdef USE_OPENCL
	cl_int clError = CL_SUCCESS;
	initCL();

	for (int i = 0; i < clDevices.size(); ++i) {

		clInputBuf.push_back(cl::Buffer(clContext, CL_MEM_READ_ONLY, N * DIM * sizeof(float), NULL, &clError));
		if (clError != CL_SUCCESS) std::cout << "OpenCL Error: Could not create buffer" << std::endl;

		clCentroidBuf.push_back(cl::Buffer(clContext, CL_MEM_READ_WRITE, K * DIM * sizeof(float), NULL, &clError));
		if (clError != CL_SUCCESS) std::cout << "OpenCL Error: Could not create buffer" << std::endl;

		clMappingBuf.push_back(cl::Buffer(clContext, CL_MEM_READ_WRITE, N * sizeof(int), NULL, &clError));
		if (clError != CL_SUCCESS) std::cout << "OpenCL Error: Could not create buffer" << std::endl;

		clReductionBuf.push_back(cl::Buffer(clContext, CL_MEM_WRITE_ONLY, N * sizeof(float), NULL, &clError));
		if (clError != CL_SUCCESS) std::cout << "OpenCL Error: Could not create buffer" << std::endl;

		clClusterAssignment[i].setArgs(clInputBuf[i](), clCentroidBuf[i](), clMappingBuf[i]());
		clClusterReposition[i].setArgs(clInputBuf[i](), clMappingBuf[i](), clCentroidBuf[i]());
		clClusterReposition_k[i].setArgs(clInputBuf[i](), clMappingBuf[i](), clCentroidBuf[i]());
		//clClusterReposition_k_c[i].setArgs(clInputBuf[i](), clMappingBuf[i](), clCentroidBuf[i](), clConvergedBuf[i]());
		clComputeCost[i].setArgs(clInputBuf[i](), clCentroidBuf[i](), clMappingBuf[i](), clReductionBuf[i]());

	}

	device_count = clDevices.size();
#endif

	util::Clock clock;
	clock.reset();

	for (int i = 0; i < RUNS; ++i) {
		mapping_list.push_back(NULL);
		centroids_list.push_back(NULL);
		cost_list.push_back(0.0f);
	}

	float* source = new float[N*DIM];
	for (int i = 0; i < N*DIM; ++i)
		source[i] = gen_random_float();

	input_list.push_back(source);

	for (int i = 1; i < device_count; ++i) {
		float* copy = new float[N*DIM];
		memcpy(copy, source, N*DIM*sizeof(float));
		input_list.push_back(copy);
	}

	if (device_count > 1) {
		boost::thread_group threads;

		for (int i = 0; i < device_count; ++i) {
			threads.create_thread(boost::bind(exec, i, true));
		}

		threads.join_all();
	} else {
		exec(0, false);
	}

#ifdef USE_OPENCL
	reduction_group.join_all();
#endif

	int best_result = 0;
	float best_cost = std::numeric_limits<float>::max();
	for (int i = 0; i < RUNS; ++i) {
		if (cost_list[i] < best_cost) {
			best_cost = cost_list[i];
			best_result = i;
		}
	}

	FILE *out_fdesc = fopen("centroids.out", "wb");
	fwrite((void*)centroids_list[best_result], K * DIM * sizeof(float), 1, out_fdesc);
	fclose(out_fdesc);

	out_fdesc = fopen("mapping.out", "wb");
	fwrite((void*)mapping_list[best_result], N * sizeof(int), 1, out_fdesc);
	fclose(out_fdesc);

	std::cout << "Best result is " << best_result << std::endl;

	for (int i = 0; i < device_count; ++i) {
		delete[] input_list[i];
	}

	for (int i = 0; i < RUNS; ++i) {
		delete[] mapping_list[i];
		delete[] centroids_list[i];
	}

	float now = clock.get();
	std::cout << "Total: " << now << std::endl;

	system("pause");

	return 0;
}