⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randomvariable.cc.svn-base

📁 Probabilistic graphical models in matlab.
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
}unsigned int DiscreteRandomVariable::sample(){	unsigned int i = internal_sample();		++prior_samples[i];		return i;}unsigned int DiscreteRandomVariable::sample_without_recording (){	return internal_sample();}unsigned int DiscreteRandomVariable::sample_without_recording (const vector <double> & sp_vec){	assert ( sp_vec.size() == sampling_probabilities.size() );		if ( is_conditionned () )	{		return last_sampled_value;	}		copy(sp_vec.begin(), sp_vec.end(), sampling_probabilities.begin() );		return internal_sample();}unsigned int DiscreteRandomVariable::sample_from_particles (const vector <unsigned int> & positions, const vector <double> & weights){	assert ( positions.size() == weights.size());		if ( is_conditionned () )	{		return last_sampled_value;	}		unsigned int i;		double a = 0;	double random_number = uniform_distribution_0_1();		for (i = 0; i < weights.size(); ++i )	{		a+= weights[i];				if (random_number < a)		{			break;		}			}		assert ( i < weights.size());		++prior_samples[positions[i]];		last_sampled_value = positions[i];		return positions[i];	}// Private methodsvoid DiscreteRandomVariable::set_value_at_random(){		if (conditionned) // we don't want to change the value if it is already observed!	{		return;	}		uniform_int <int> uni_int_dist(0, number_values-1);		variate_generator <boost::lagged_fibonacci607 &, uniform_int <int> > vg (fibonnacci_number_generator, uni_int_dist);		last_sampled_value = vg();	}unsigned int DiscreteRandomVariable::internal_sample(){	if ( is_conditionned () )	{		return last_sampled_value;	}		unsigned int i;		double a = 0;	double random_number = uniform_distribution_0_1();		for (i = 0; i < number_values; ++i )	{		a+= sampling_probabilities[i];				if (random_number < a)		{			break;		}			}		assert ( i < number_values);		last_sampled_value = i;		return i;}// Unknown methodsvector < DiscreteRandomVariable *> DiscreteRandomVariable::uncombine(){	vector < DiscreteRandomVariable *> a;	cout << "ERROR (CRITICAL): we called uncombine() from the DiscreteRandomVariable class" << endl;	return a;}void DiscreteRandomVariable::compute_mean(){	if (particle_mean)	{		//cout << "particle_mean" << endl;				double a(0.0);				for ( unsigned int i = 0; i <  particle_means_vec.size();++i)		{					// cout << "Particle " << i << " " << particle_vec[i] << endl;						a += particle_means_vec[i];		}				mean = a / particle_means_vec.size();				return;	}			double a(0.0);	unsigned int b(0);		for ( unsigned int i = 0; i <  prior_samples.size();++i)	{		b += prior_samples[i];;	}		for ( unsigned int i = 0; i <  prior_samples.size();++i)	{		a += (double) (i * prior_samples[i])/b;	}		mean = a;}void DiscreteRandomVariable::compute_true_mean(){	double a(0.0);		for ( unsigned int i = 0; i <  sampling_probabilities.size();++i)	{		a += i * sampling_probabilities[i];	}		mean = a;}// Testing purposesvoid DiscreteRandomVariable::set_mean_particles( vector <unsigned int> & particle_vec ){	double a(0.0);		for ( unsigned int i = 0; i <  particle_vec.size();++i)	{				// cout << "Particle " << i << " " << particle_vec[i] << endl;				a += particle_vec[i];	}		//mean = a / particle_vec.size();			particle_mean = true;	//cout << "Mean (" << index << " ) " << mean << endl;		particle_means_vec.push_back(a / particle_vec.size());	}void DiscreteRandomVariable::set_mean_bw_particles( vector <unsigned int> & particle_vec, vector <double> & weights_vec ){	double a(0.0);		for ( unsigned int i = 0; i <  particle_vec.size();++i)	{		//cout << "Particle " << i << " " << particle_vec[i] << " " << weights_vec[i] << endl;				if (index == 55)		{						//cout << particle_vec[i] << " " << index << " ) " << weights_vec[i] << endl;					}				a += (double) (particle_vec[i]) * weights_vec[i];	}		//mean = a / particle_vec.size();		particle_mean = true;		if (index == 55)	{		//cout << "******************Mean (" << index << " ) " << a<< endl;		}		particle_means_vec.push_back(a);	}// Meant to be virtual laterbool DiscreteRandomVariable::loop_over (){		if ( end_loop)	{			end_loop = false;		return false;	}		if ( conditionned)	{		//cout << "I am conditionned" << endl;		end_loop = true;		return true;	}		if (start_loop)	{		start_loop = false;		last_sampled_value = 0;	}	else	{		++last_sampled_value;	}		if (last_sampled_value +1 == number_values)	{		start_loop = true;		end_loop = true;	}		return true;}void DiscreteRandomVariable::serialize_marginals (std::ofstream & output_file) const{	output_file << "( " << index << " ) ( " ;		for (vector<double>::const_iterator it = sampling_probabilities.begin(); it != sampling_probabilities.end(); ++it)	{		output_file << *it << " ";	}		output_file << " ) ";}#ifndef NDEBUGvoid DiscreteRandomVariable::debug_display_probabilities() const{	cout << "( " << index << " ) ( " ;		for (vector<double>::const_iterator it = sampling_probabilities.begin(); it != sampling_probabilities.end(); ++it)	{		cout << *it << " ";	}		cout << " ) " << endl;}#endif//****************** End of DiscreteRandomVariable Implementation ********************* ////****************** CombinedDiscreteRandomVariable Implementation ********************* //CombinedDiscreteRandomVariable::CombinedDiscreteRandomVariable( list<DiscreteRandomVariable *> l, unsigned int b): DiscreteRandomVariable(b) // constructor, setting the index AND the possible number of values{	unsigned int a = 1;		for (list<DiscreteRandomVariable *>::iterator it = l.begin(); it != l.end(); ++it)	{		a = a * (*it)->get_number_values();				correspondance_table[ (*it)->get_index() ] = number_of_variable_values.size() ;				if (number_of_variable_values.empty())		{			help_vector.push_back(1);		}		else		{			help_vector.push_back( help_vector.back() * number_of_variable_values.back() );		}				number_of_variable_values.push_back((*it)->get_number_values());		variable_values.push_back(0);			}		sampling_probabilities.resize(a,  1.0 / a);	prior_samples.resize(a);	number_values = a;	}unsigned int CombinedDiscreteRandomVariable::get_combined_position() const{	return inner_product(variable_values.begin(), variable_values.end(), help_vector.begin(), 0);}vector < DiscreteRandomVariable * > CombinedDiscreteRandomVariable::uncombine(){	vector < DiscreteRandomVariable * > result_vec;		//list <DiscreteRandomVariable *> ert;	//CombinedDiscreteRandomVariable * er = new CombinedDiscreteRandomVariable( ert , 0);		//DiscreteRandomVariable * yt = new DiscreteRandomVariable( 5 , 5);		//er->sampling_probabilities [0] = 2.0;	//yt->sampling_probabilities [0] = 2.0;		for ( map <unsigned int, unsigned int>::const_iterator it = correspondance_table.begin(); it != correspondance_table.end(); ++it)	{		DiscreteRandomVariable * new_variable = new DiscreteRandomVariable( it->first, number_of_variable_values[ it->second] );				result_vec.push_back( new_variable );				unsigned int a = 0;				for ( vector <double>::iterator current_probability = (new_variable->sampling_probabilities).begin(); current_probability != new_variable->sampling_probabilities.end(); ++current_probability)		{						set_variable_value_by_index( it->first, a );						*current_probability = internal_sum_over_variable(it->second);						//cout << *current_probability << endl;						++a;		}			}		return result_vec;}double CombinedDiscreteRandomVariable::internal_sum_over_variable(unsigned int index){		unsigned int left_block_size,right_block_size,right_blocks, fixed_value;			// Right_blocks is the number of blocks we have to "the right", it is in fact the number of times we must sum in the outer loop	// Right_block_size is the size of the blocks to the right... we add that once we are over in the inner loop		if (index == number_of_variable_values.size()-1)	{		right_blocks = 1;		right_block_size = 0; // Not used in this case	}	else	{		right_blocks = number_of_variable_values[number_of_variable_values.size()-1]*help_vector[number_of_variable_values.size()-1]/help_vector[index+1];		right_block_size = help_vector[index+1];	}		// The fixed value represents how much we must add constantly to read the point where "the sum is frozen"	// Left block size represents the size of the blocks to the left, ie, 1 if we are not summing over the first variable		left_block_size = help_vector[index];	fixed_value = variable_values[index]*left_block_size;		//cout << "fixed value " << fixed_value << endl;		double sum = 0;	unsigned int a = fixed_value;		for (unsigned int i = 0; i < right_blocks; ++i)	{				for (unsigned int j = 0; j < left_block_size; ++j)		{			sum += sampling_probabilities[a+j];		}				a += right_block_size;			}		return sum;	}//****************** End of CombinedDiscreteRandomVariable Implementation ********************* //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -