示例#1
0
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
示例#2
0
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;
}