Esempio n. 1
0
double NumFeatureDistance(Features_p f1, Features_p f2, double pred_w,
			  double func_w, double* weights)
{
   double res, norm, dist, wsq;
   int i;

   dist = arity_distr_distance(f1->pred_distrib, f2->pred_distrib,
			       MAX(f1->pred_max_arity, 
				   f2->pred_max_arity));
   wsq = pred_w*pred_w;
   res = dist*dist*wsq;
   norm = wsq;
  
   dist = arity_distr_distance(f1->func_distrib, f2->func_distrib,
			       MAX(f1->func_max_arity,
				   f2->func_max_arity));
   wsq = func_w*func_w;
   res += dist*dist*wsq;
   norm += wsq;
   
   for(i=0; i<FEATURE_NUMBER; i++)
   {
      dist = relative_difference(f1->features[i],f2->features[i]);
      wsq  = weights[i] * weights[i];
      res += dist*dist*wsq;
      norm += wsq;
   }
   res = res/norm;
   return sqrt(res);
}
Esempio n. 2
0
 inline typename boost::math::tools::promote_args<T, U>::type epsilon_difference(const T& arg_a, const U& arg_b)
 {
    typedef typename boost::math::tools::promote_args<T, U>::type result_type;
    result_type r = relative_difference(arg_a, arg_b);
    if(tools::max_value<result_type>() * boost::math::tools::epsilon<result_type>() < r)
       return tools::max_value<result_type>();
    return r / boost::math::tools::epsilon<result_type>();
 }
Esempio n. 3
0
static double arity_distr_distance(PDArray_p d1, PDArray_p d2, int
				   maxarity)
{
   int i, val1, val2;
   double res = 0;

   assert(maxarity >= -1);
   if(maxarity == -1)
   {
      return 0.0;
   }   
   for(i=0; i<=maxarity; i++)
   {
      val1 = PDArrayElementInt(d1, i);
      val2 = PDArrayElementInt(d2, i);
      res += relative_difference(val1,val2)*
	 relative_difference(val1,val2);
   }
   return sqrt(res)/(double)(maxarity+1);
}
Esempio n. 4
0
static void compute_linf_norms(MPI_Comm comm, 
                               real_t* x, 
                               real_t* y,
                               int N,
                               real_t* rel_norm,
                               real_t* abs_norm)
{
  real_t abs = 0.0, rel = 0.0;
  for (int i = 0; i < N; ++i)
  {
    real_t xi = x[i], yi = y[i];
    real_t rel_diff = relative_difference(xi, yi);
    real_t abs_diff = fabs(xi-yi);
    rel = MAX(rel, rel_diff);
    abs = MAX(abs, abs_diff);
  }

  real_t norms[2] = {rel, abs};
  MPI_Allreduce(MPI_IN_PLACE, norms, 2, MPI_REAL_T, MPI_MAX, comm);

  *rel_norm = norms[0];
  *abs_norm = norms[1];
}
Esempio n. 5
0
static void compute_l2_norms(MPI_Comm comm, 
                             real_t* x, 
                             real_t* y,
                             int N,
                             real_t* rel_norm,
                             real_t* abs_norm)
{
  real_t abs = 0.0, rel = 0.0;
  for (int i = 0; i < N; ++i)
  {
    real_t xi = x[i], yi = y[i];
    real_t rel_diff = relative_difference(xi, yi);
    real_t abs_diff = fabs(xi-yi);
    rel += rel_diff*rel_diff;
    abs += abs_diff*abs_diff;
  }

  real_t norms[2] = {rel, abs};
  MPI_Allreduce(MPI_IN_PLACE, norms, 2, MPI_REAL_T, MPI_SUM, comm);

  *rel_norm = sqrt(norms[0]);
  *abs_norm = sqrt(norms[1]);
}
Esempio n. 6
0
int	get_owner_element(e *E, double *pos){

	int		i;
	int		max_its;
	int		element;
	int		element_new;
	int		x_element;
	int		y_element;
	double	point;
	double	interval_size;
	int		check = 1;


	max_its = 20;

	// search over elements to determine which element contains this position
	// apply a binary search method on the elements

	// search in x
    i=0;
    element = (double)E->nx/2.0;
    element_new = 0;
	interval_size = E->nx/2.0;

	do{
		if( (relative_difference(pos[0],E->msh.x[element+1])<=TOLERANCE) || (relative_difference(pos[0],E->msh.x[element])<=TOLERANCE)
		   ||
		   (pos[0] <= E->msh.x[element+1]) && (pos[0] >= E->msh.x[element]) ){
			// found it
			element = element;
			break;
		}
		else if( E->msh.x[element] >= pos[0] ){ // means that the pos point is on the left of our current index
			element_new = ( (double)element - ceil(interval_size/2.0) );
			if(element_new < 0) element_new=0;
		}
		else{	// means that the pos point is on the right of our current index

			element_new = ceil( (double)element + (interval_size/2.0) );

			if(element_new >= E->nx){
				element_new=E->nx-1;
			}
		}
		interval_size = fabs(element_new - element);
		element = element_new;
		i++;
	}while(i<max_its);

	if(i>=max_its){
		printf("x get owner failed!\n");
		printf("pos = %f, %f\n", pos[0], pos[1]);
		printf("element = %d\n", element);
		printf("its = %d\n", i);

		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n", E->ele[element].node_coord[3][0], E->ele[element].node_coord[3][1],
			   E->ele[element].node_coord[2][0], E->ele[element].node_coord[2][1]);
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n\n", E->ele[element].node_coord[0][0], E->ele[element].node_coord[0][1],
			   E->ele[element].node_coord[1][0], E->ele[element].node_coord[1][1]);

		exit(1);
	}

	// x_element stores the column that this point will be in
	// lets use this information to constrain our search in y

	x_element = element;
	element = ceil((double)E->ny/2.0);
	element_new = 0;//(double)E->ny/2.0;
	interval_size = E->ny/2.0;

	// now search in y
	i=0;
	do{
		if( (relative_difference(pos[1],E->msh.y[element+1])<=TOLERANCE) || (relative_difference(pos[1],E->msh.y[element])<=TOLERANCE)
		   ||
		   (pos[1] <= E->msh.y[element+1]) && (pos[1] >= E->msh.y[element]) ){
			// found it
			break;
		}

		if( (E->msh.y[element] >= pos[1]) ){
			element_new = ( (double)element - ceil(interval_size/2.0) ) ;
			if(element_new < 0) element_new=0;
		}
		else{
			element_new = ( (double)element + ceil(interval_size/2.0) );

			if(element_new >= E->ny) {
				element_new=E->ny-1;
			}
        }

		interval_size = fabs(element_new - element);
		element = element_new;


		i++;
	}while(i<max_its);

	if(i>=max_its){
		printf("y get owner failed!\n");
		printf("pos = %f, %f\n", pos[0], pos[1]);
		printf("its = %d\n", i);

		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n", E->ele[element].node_coord[3][0], E->ele[element].node_coord[3][1],
			   E->ele[element].node_coord[2][0], E->ele[element].node_coord[2][1]);
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n\n", E->ele[element].node_coord[0][0], E->ele[element].node_coord[0][1],
			   E->ele[element].node_coord[1][0], E->ele[element].node_coord[1][1]);

		exit(1);
	}

	// the owner element for this point is element * x_element
	element = (element*(E->nx)) + x_element;

    /*
        printf("get owner finished\n");
		printf("pos = %f, %f\n", pos[0], pos[1]);
		printf("its = %d\n", i);

		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n", E->ele[element].node_coord[3][0], E->ele[element].node_coord[3][1],
			   E->ele[element].node_coord[2][0], E->ele[element].node_coord[2][1]);
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf("   |                              |\n");
		printf(" (%.5f, %.5f) --------- (%.5f, %.5f)\n\n", E->ele[element].node_coord[0][0], E->ele[element].node_coord[0][1],
			   E->ele[element].node_coord[1][0], E->ele[element].node_coord[1][1]);
    */

	return element;
}
Esempio n. 7
0
void three_body_system::competitive_loop(){

  int channel_0 = 3;
  int cind = channel_index(channel_0);

  if (cont->use_saved_states){
    string state_input_name = name + ".states";
    if (only_2body) state_input_name += "_2body";
    ifstream state_input(state_input_name);
    string line;

    while (getline(state_input, line)){
      string line_temp = line;
      if (line_temp.find("Fin") == std::string::npos)
        states.push_back(state_full(line, ang));
    }

    cout << "Successfully read states from file." << endl;

  }
  if (states.size() == 0){
    states.push_back(
      state_full(0, &ang->states[0], 
	scale_factor_r[cind], scale_factor_rho[cind], scale_factor_com[cind],
	channel_0)
      );
    string state_output_name = name + ".states";
    if (only_2body) state_output_name += "_2body";
    ofstream state_output(state_output_name, ios_base::app);
    state_output << states.back();
  }

  regenerate_matrices();
  diagonalise();


  // determine what mode we're in initially...
  int current_mode = 0;
  int state_counter = states.size();
  for (auto mode_size : cont->max_states){
    if (state_counter >= mode_size){ 
      current_mode++;
      state_counter -= mode_size;
    }
    else{
      break;
    }

  }

  int end_test_counter = 0;
  int fail_counter = 0;
  int fail_limit = 2;

  double energy_old = evals[0];
  double convtol = 1E-6;

  string energy_output_name = name + ".energies";
  if (only_2body){
    energy_output_name = name + ".2body";
  }
  ofstream energy_output(energy_output_name, ios_base::app);
  for (; current_mode < int(cont->max_states.size()); current_mode++){
    int mode_size = cont->max_states[current_mode];

    int fail_counter = 0;
    cout << "sc = " << state_counter << endl;
    while (state_counter++ <= mode_size){
      if (select_new_state_competitive(1000, current_mode)){
        if (relative_difference(energy_old, evals[0]) < convtol){
          fail_counter++;
        }
        else{
          cout << energy_old << " " << evals[0] << " " << relative_difference(energy_old, evals[0]) << endl;
          energy_old = evals[0];
          fail_counter = 0;
          energy_output << states.size() << ": " << flush;

          for (unsigned int i=0; i<10; i++){
            if (i < evals.size()){
              energy_output << evals[i] << " ";
            }
          }
          energy_output << endl;
          //break;
        }
      }
      else fail_counter++;
      if (fail_counter != 0) cout << "fails = " << fail_counter << endl;
      if (fail_counter >= fail_limit){
        cout << "Cannot find new states, ending simulation..." << endl;
        break;
      }
    }
    state_counter = 0;
    cout << "Completed mode " << current_mode << endl;
    cout << "state_counter = " << state_counter << endl;
    cout << "mode_size = " << mode_size << endl;
  }

  //print_matrix_to_file(&S[0], basis_size, name + ".S");
  //print_matrix_to_file(&H[0], basis_size, name + ".H");

}
Esempio n. 8
0
bool three_body_system::competitive_end_test(double eval_old, double eval_new){
  double diff_abs = abs(eval_old - eval_new);
  double diff_rel = relative_difference(eval_old, eval_new);

  return (diff_abs < 0.0001 && diff_rel < 0.0001);
}