void WitnessSet::merge(const WitnessSet & W_in, tracker_config_t * T) { //error checking first if ( (num_vars_==0) && (W_in.num_vars_!=0) && (num_points()==0)) { num_vars_ = W_in.num_vars_; num_natty_vars_ = W_in.num_natty_vars_; } if (W_in.num_natty_vars_ != this->num_natty_vars_) { std::stringstream ss; ss << "merging two witness sets with differing numbers of natural variables. "<< W_in.num_natural_variables() <<" merging set, "<< this->num_natural_variables() << " existing\n", throw std::logic_error(ss.str()); } //just mindlessly add the linears. up to user to ensure linears get merged correctly. no way to know what they want... for (unsigned int ii = 0; ii<W_in.num_linears(); ii++) { WitnessSet::add_linear(W_in.linear(ii)); } for (unsigned int ii = 0; ii<W_in.num_points(); ii++) { int is_new = 1; vec_mp & in_point = W_in.point(ii); for (unsigned int jj = 0; jj<num_points(); jj++){ vec_mp & curr_point = this->point(jj); //cache the sizes int in_size = in_point->size; int curr_size = curr_point->size; in_point->size = this->num_natural_variables(); curr_point->size = this->num_natural_variables(); if (isSamePoint_homogeneous_input(curr_point, in_point, T->final_tol_times_mult)) { is_new = 0; in_point->size = in_size; curr_point->size = curr_size; break; } // restore the sizes in_point->size = in_size; curr_point->size = curr_size; } if (is_new==1) WitnessSet::add_point( (in_point) ); } for (unsigned int ii = 0; ii<W_in.num_patches(); ii++) { int is_new = 1; for (unsigned int jj = 0; jj<this->num_patches(); jj++){ if ( this->patch(jj)->size == W_in.patch(ii)->size) { if (isSamePoint_inhomogeneous_input(patch(jj), W_in.patch(ii), T->final_tol_times_mult)) { is_new = 0; break; } } } if (is_new==1) WitnessSet::add_patch(W_in.patch(ii)); } return; }//re: merge_witness_sets
int UbermasterProcess::main_loop() { boost::timer::auto_cpu_timer t; program_options.splash_screen(); //parse the options program_options.startup(); // tests for existence of necessary files, etc. //if desired, display the options if (program_options.verbose_level()>=3) program_options.display_current_options(); parse_preproc_data("preproc_data", &solve_options.PPD); int num_vars = get_num_vars_PPD(solve_options.PPD); NumericalIrreducibleDecomposition witness_data; witness_data.populate(&solve_options.T); WitnessSet W = witness_data.choose(program_options); if (W.num_points()==0) { std::cout << "no witness points, cannot decompose anything..." << std::endl; return 1; } W.get_variable_names(num_vars); W.set_input_filename(program_options.input_filename()); if (program_options.verbose_level()>=1) { W.print_to_screen(); } VertexSet V(num_vars); V.set_tracker_config(&solve_options.T); V.set_same_point_tolerance(1e1*solve_options.T.real_threshold); vec_mp *pi = (vec_mp *) br_malloc(W.dimension()*sizeof(vec_mp )); for (int ii=0; ii<W.dimension(); ii++) { init_vec_mp2(pi[ii],W.num_variables(), solve_options.T.AMP_max_prec); pi[ii]->size = W.num_variables(); } get_projection(pi, program_options, W.num_variables(), W.dimension()); for (int ii=0; ii<W.dimension(); ii++) { V.add_projection(pi[ii]); } if (program_options.primary_mode()==BERTINIREAL) { bertini_real(W,pi,V); } else if(program_options.primary_mode()==CRIT) { critreal(W,pi,V); } for (int ii=0; ii<W.dimension(); ii++) clear_vec_mp(pi[ii]); free(pi); // dismiss the workers int sendme = TERMINATE; MPI_Bcast(&sendme, 1, MPI_INT, 0, MPI_COMM_WORLD); return SUCCESSFUL; }