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
void UbermasterProcess::bertini_real(WitnessSet & W, vec_mp *pi, VertexSet & V) { W.set_incidence_number(get_incidence_number( W.point(0), program_options, program_options.input_filename())); boost::filesystem::path temp_name = program_options.output_dir(); std::stringstream converter; converter << "_dim_" << W.dimension() << "_comp_" << W.component_number(); temp_name += converter.str(); program_options.output_dir(temp_name); switch (W.dimension()) { case 1: { Curve C; // curve C.main(V, W, pi, program_options, solve_options); if (program_options.verbose_level()>=2) printf("outputting data\n"); C.output_main(program_options.output_dir()); V.print(program_options.output_dir()/ "V.vertex"); } break; case 2: { Surface S; // surface S.main(V, W, pi, program_options, solve_options); S.output_main(program_options.output_dir()); V.print(program_options.output_dir()/ "V.vertex"); } break; default: { std::cout << "bertini_real not programmed for components of dimension " << W.dimension() << std::endl; } break; } }