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; }
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); } }