Example #1
0
double * amoeba(Search_settings *sett, Aux_arrays *aux, double *point, double *nS, double *res_max, int dim, double tol, double *pc2, double **sigaa, double **sigbb){
	int ihi, ilo, inhi;
// ihi = ih[0], ilo = ih[1], inhi = ih[2];
	int *ih;
	int j, i;
	static double NM_out[11];
	double ** fx = alloc_matrix(dim + 1, 11);
	double * midpoint = alloc_vector(dim);
	double * line = alloc_vector(dim);
	double ** simplex = make_simplex(point, dim, pc2);

	evaluate_simplex(simplex, dim, fx, sett, aux, nS, sigaa, sigbb);

	while (true)
	{
		ih = simplex_extremes(fx, dim);
		ihi = ih[0];
		ilo = ih[1]; 
		inhi = ih[2];
		simplex_bearings(simplex, dim, midpoint, line, ihi);
		if(check_tol(fx[ihi][5], fx[ilo][5], tol)) break;
		update_simplex(simplex, dim, fx[ihi][5], fx, ihi, midpoint, line, -1.0, sett, aux, nS, sigaa, sigbb);
		if (fx[ihi][5] < fx[ilo][5]){
			update_simplex(simplex, dim, fx[ihi][5], fx, ihi, midpoint, line, -2.0, sett, aux, nS, sigaa, sigbb);
		}
		else if (fx[ihi][5] > fx[inhi][5]){
			if (!update_simplex(simplex, dim, fx[ihi][5], fx, ihi, midpoint, line, 0.5, sett, aux, nS, sigaa, sigbb)){
				contract_simplex(simplex, dim, fx, ilo, ihi, sett, aux, nS, sigaa, sigbb);
			}
		}
	}

	for (j = 0; j < dim; j++) point[j] = simplex[ilo][j];
	for (j = 0; j < 11; j++) NM_out[j] = fx[ilo][j];
	free_matrix(fx, dim + 1, 10);
	free_vector(midpoint, dim);
	free_vector(line, dim);
	free_matrix(simplex, dim + 1, dim);

/*	free(fx);
	free(midpoint);
	free(line);
	free(simplex);
*/
	return NM_out;
}
Example #2
0
void deWall(point_set *P, face_list *AFL, simplex_list *SL, Axis ax, int rec_level) {

  face *f;
  face_list AFLa, AFL1, AFL2;

  plane alpha;
  simplex *t;
  point_set P1, P2;

  uniform_grid UG;
  int i = 0;

  initialize_face_list(&AFLa, P->size/4);
  initialize_face_list(&AFL1, P->size/4);
  initialize_face_list(&AFL2, P->size/4);

  if (P->size > MIN_UG_SIZE) {
    if (!createUniformGrid(P,&UG)){
      printf("Could not create uniform grid :/\n");
      return;
    }
  }

  if (!pointset_partition(P,&alpha,ax,&P1,&P2)) 
    return;

  /* Simple Wall Construction */

  if (AFL->size == 0){
    if (make_first_simplex(P,&t)){
      for(i = 0; i < 3; i++) 
        insert_face(t->face[i],AFL);	
      insert_simplex(t,SL,P);
    }
  }

  // Dividing the faces in 3 lists
  while (extract_face(&f,AFL)){
    if (rec_level < MAX_REC_LEVEL){	
      switch (intersect(f,&alpha)) {
        case  0: insert_face(f, &AFLa); break;
        case -1: insert_face(f, &AFL1); break;
        case  1: insert_face(f, &AFL2); break;
      }
    } else {
      insert_face(f, &AFLa); 
    }
  }		

  // Building the wall for the faces in the middle
  while(AFLa.size > 0){
    extract_face(&f,&AFLa);
    int make_simp = 0;
    if (P->size > MIN_UG_SIZE)
      make_simp = make_simplex_ug(f, P, &t, &UG);
    else
      make_simp = make_simplex(f, P, &t);
    if (make_simp){ 
      if (insert_simplex(t,SL,P)){
        for(i = 0; i < 3; i++){                
          if (!equal_face(t->face[i], f)){ 	
            if (rec_level < MAX_REC_LEVEL){				        
              switch (intersect(t->face[i],&alpha)) {
                case  0: update_face(t->face[i], &AFLa); break;
                case -1: update_face(t->face[i], &AFL1); break;
                case  1: update_face(t->face[i], &AFL2); break;
              }
            } else {
              update_face(t->face[i], &AFLa); break;
            }
          }  
        }               
      }
      // Alocated in build_simplex function   
      free(t);
      // Allocated in build_simplex function
      free(f);
    }		
  }

  /* Recursive Triangulation */
  rec_level++;
  // Deciding to use parallel or serial version
  if (P->size < LIMIT_OMP){
    if (AFL1.size > 0 && P1.size > 0)
      deWall(&P1, &AFL1, SL, invert_axis(ax), rec_level);
    if (AFL2.size > 0 && P2.size > 0)
      deWall(&P2, &AFL2, SL, invert_axis(ax), rec_level);		
  } else {
#pragma omp task
    if (AFL1.size > 0 && P1.size > 0)
      deWall(&P1, &AFL1, SL, invert_axis(ax), rec_level);
#pragma omp task
    if (AFL2.size > 0 && P2.size > 0)
      deWall(&P2, &AFL2, SL, invert_axis(ax), rec_level);  
  }
}