/** \brief add a projection to the solver. \param proj the new projection to add. */ void add_projection(vec_mp proj) { if (this->num_projections==0) { this->pi = (vec_d *) br_malloc(sizeof(vec_d)); } else { this->pi = (vec_d *) br_realloc(pi,(this->num_projections+1) *sizeof(vec_d)); } init_vec_d(pi[num_projections],0); vec_mp_to_d(pi[num_projections], proj); num_projections++; }
int sphere_eval_data_d::setup(SphereConfiguration & config, const WitnessSet & W, SolverConfiguration & solve_options) { SLP_memory = config.SLP_memory; // set up the vectors to hold the two linears. mp_to_d(radius, config.radius); vec_mp_to_d(center, config.center); if (this->center->size < W.num_variables()) { int old_size = this->center->size; increase_size_vec_d(this->center, W.num_variables()); this->center->size = W.num_variables(); for (int ii=old_size; ii<W.num_variables(); ii++) { set_zero_d(&this->center->coord[ii]); } } if (this->num_static_linears==0) { static_linear = (vec_d *) br_malloc(W.num_linears()*sizeof(vec_d)); } else { static_linear = (vec_d *) br_realloc(static_linear, W.num_linears()*sizeof(vec_d)); } for (unsigned int ii=0; ii<W.num_linears(); ii++) { init_vec_d(static_linear[ii],0); vec_mp_to_d(static_linear[ii],W.linear(ii)); } num_static_linears = W.num_linears(); num_natural_vars = W.num_natural_variables(); num_variables = W.num_variables(); for (int ii=0; ii<2; ii++) { vec_mp_to_d(starting_linear[ii],config.starting_linear[ii]); } verbose_level(solve_options.verbose_level()); SolverDoublePrecision::setup(config.SLP, config.randomizer()); generic_setup_patch(&patch,W); if (solve_options.use_gamma_trick==1) get_comp_rand_d(this->gamma); // set gamma to be random complex value else set_one_d(this->gamma); if (this->MPType==2) { this->BED_mp->setup(config, W, solve_options); rat_to_d(this->gamma, this->BED_mp->gamma_rat); } return 0; }
int check_issoln_sphere_d(endgame_data_t *EG, tracker_config_t *T, void const *ED) { sphere_eval_data_d *BED = (sphere_eval_data_d *)ED; // to avoid having to cast every time BED->SLP_memory.set_globals_to_this(); int ii; double n1, n2, max_rat; point_d f; eval_struct_d e; init_point_d(f, 1); init_eval_struct_d(e,0, 0, 0); max_rat = MAX(T->ratioTol,0.99999); // setup threshold based on given threshold and precision // if (num_digits > 300) // num_digits = 300; // num_digits -= 2; double tol = MAX(T->funcResTol, 1e-8); if (EG->prec>=64){ vec_d terminal_pt; init_vec_d(terminal_pt,1); vec_mp_to_d(terminal_pt,EG->PD_mp.point); evalProg_d(e.funcVals, e.parVals, e.parDer, e.Jv, e.Jp, terminal_pt, EG->PD_d.time, BED->SLP); clear_vec_d(terminal_pt); } else{ evalProg_d(e.funcVals, e.parVals, e.parDer, e.Jv, e.Jp, EG->PD_d.point, EG->PD_d.time, BED->SLP); } if (EG->last_approx_prec>=64) { vec_d prev_pt; init_vec_d(prev_pt,1); vec_mp_to_d(prev_pt,EG->PD_mp.point); evalProg_d(f, e.parVals, e.parDer, e.Jv, e.Jp, prev_pt, EG->PD_d.time, BED->SLP); clear_vec_d(prev_pt);} else{ evalProg_d(f, e.parVals, e.parDer, e.Jv, e.Jp, EG->last_approx_d, EG->PD_d.time, BED->SLP); } // compare the function values int isSoln = 1; for (ii = 0; (ii < BED->SLP->numFuncs) && isSoln; ii++) { n1 = d_abs_d( &e.funcVals->coord[ii]); // corresponds to final point n2 = d_abs_d( &f->coord[ii]); // corresponds to the previous point if (tol <= n1 && n1 <= n2) { // compare ratio if (n1 > max_rat * n2){ isSoln = 0; printf("labeled as non_soln due to max_rat (d) 1 coord %d\n",ii); } } else if (tol <= n2 && n2 <= n1) { // compare ratio if (n2 > max_rat * n1){ isSoln = 0; printf("labeled as non_soln due to max_rat (d) 2 coord %d\n",ii); } } } if (!isSoln) { print_point_to_screen_matlab(e.funcVals,"terminal_func_vals"); print_point_to_screen_matlab(f,"prev"); printf("tol was %le\nmax_rat was %le\n",tol,max_rat); } clear_eval_struct_d(e); clear_vec_d(f); BED->SLP_memory.set_globals_null(); return isSoln; }