コード例 #1
0
double InferenceEngineBP::computePartition(FeatureGenerator *fGen, DataSequence *X, 
	Model *m, int seqLabel, bool bUseStatePerNodes)
{
	Beliefs beliefs;
	computeBeliefs(beliefs, fGen, X, m, false, seqLabel, bUseStatePerNodes); 
	return beliefs.partition;
}
コード例 #2
0
ファイル: IPFP.cpp プロジェクト: pierrickrogermele/cfm
void IPFP::applyIPFPstep( std::vector<Message> &actual_marginals, std::vector<Message> &desired_marginals, int idx ){
	
	applyEvidenceAndPropagate( cfg->dv_spectrum_depths[idx] - 1, desired_marginals[idx], actual_marginals[idx] );
	double diff = computeBeliefs();
	computeMarginals( actual_marginals );
	diff_buf[idx] = diff;
}
コード例 #3
0
ファイル: IPFP.cpp プロジェクト: pierrickrogermele/cfm
int IPFP::runGEMA( ){
	
	//Apply GEMA extensions of Iterative Proportional Fitting Procedure
	int iter = 0;
	targets_modified = false;
	IPFP ipfp_copy(*this);
	double diff = computeBeliefs();
	std::vector<Message> desired_marginals, actual_marginals;
	std::vector<Message> gema_marginals(cfg->dv_spectrum_depths.size());
    computeMarginals( actual_marginals );
	setDesiredMarginals( desired_marginals, actual_marginals );
	while( !checkConvergence(false) && iter < MAX_IPFP_ITERATIONS ){
		iter++;

		//Re-initialise the GEMA target marginals	
		for( unsigned int idx = 0; idx < cfg->dv_spectrum_depths.size(); idx++ ) 
			gema_marginals[idx].reset(actual_marginals[idx].size());
		
		//Update the GEMA target marginals		
		for( unsigned int idx = 0; idx < cfg->dv_spectrum_depths.size(); idx++ ){
			ipfp_copy = *this;	//Create a copy of the IPFP instance so we don't change this one
			std::vector<Message> tmp_marginals( actual_marginals );
			ipfp_copy.applyIPFPstep( tmp_marginals, desired_marginals, idx );
			for( unsigned int j = 0; j < cfg->dv_spectrum_depths.size(); j++ ) 
				gema_marginals[j].addWeightedMessage(tmp_marginals[j], cfg->dv_spectrum_weights[idx]);
		}

		//Run standard IPFP for number of spectra iterations
		for( unsigned int idx = 0; idx < cfg->dv_spectrum_depths.size(); idx++ )
			applyIPFPstep( actual_marginals, gema_marginals, idx );

	}
	return iter;
}
コード例 #4
0
ファイル: IPFP.cpp プロジェクト: pierrickrogermele/cfm
int IPFP::runIPFP( ){
	
	//Apply Iterative Proportional Fitting Procedure
	int iter = 0;
	targets_modified = false;
	double diff = computeBeliefs();
	std::vector<Message> desired_marginals, actual_marginals;
    computeMarginals( actual_marginals );
	setDesiredMarginals( desired_marginals, actual_marginals );
	while( !checkConvergence(false) && iter < MAX_IPFP_ITERATIONS ){
		iter++;
		for( unsigned int idx = 0; idx < cfg->dv_spectrum_depths.size(); idx++ )
			applyIPFPstep( actual_marginals, desired_marginals, idx );
	}
	return iter;
}
コード例 #5
0
ファイル: IPFP.cpp プロジェクト: pierrickrogermele/cfm
int IPFP::runIPFPwithOscAdjust( ){
	
	//Apply Iterative Proportional Fitting Procedure - detecting and adjusting for oscillatory convergence
	int iter = 0;
	int reverse = 0;
	targets_modified = false;

	//Store a copy of the initial msgs
	std::vector<Message> init_down_msgs = down_msgs;
	std::vector<Message> init_up_msgs = up_msgs;
	
	//Initialise the target marginals
	std::vector<Message> desired_marginals, actual_marginals, reverse_marginals;	
	initialiseFactorProbsAndBeliefs();
	double diff = computeBeliefs();
	computeMarginals( actual_marginals );
	setDesiredMarginals( desired_marginals, actual_marginals );	

	int retries = 0;
	while( (retries == 0 || status == OSC_CONVERGE) && retries <= MAX_IPFP_OSC_RETRIES ){

		//Run IPFP to convergence (oscillatory or otherwise) in the forward direction
		iter = 0;
		while( !checkConvergence(true) && iter < MAX_IPFP_ITERATIONS ){
			iter++;
			//for( int idx = cfg->dv_spectrum_depths.size()-1; idx >= 0; idx-- ){
			for( unsigned int idx = 0; idx < cfg->dv_spectrum_depths.size(); idx++ )
				applyIPFPstep( actual_marginals, desired_marginals, idx );
		}
		if( status != OSC_CONVERGE ) break;

		//Oscillatory Convergence detected:
		// std::cout << "Oscillatory convergence - modifying targets for retry after " << iter << " iterations ("  << retries << " retry)" << std::endl;

		//Re-Initialise msgs and factor transition/persistence probabilities
		down_msgs = init_down_msgs;
		up_msgs = init_up_msgs;
		initialiseFactorProbsAndBeliefs();
		diff = computeBeliefs();
		computeMarginals( reverse_marginals );
		for( unsigned int i = 0; i < diff_buf.size(); i++){
			diff_buf[i] = 100.0;
			prev_diff_buf[i] = 1000.0;
		}

		//Run IPFP to convergence (oscillatory or otherwise) in the reverse direction
		iter = 0;
		while( !checkConvergence(true) && iter < MAX_IPFP_ITERATIONS ){
			iter++;
			for( int idx = cfg->dv_spectrum_depths.size()-1; idx >= 0; idx-- )
				applyIPFPstep( reverse_marginals, desired_marginals, idx );
		}
		
		//Set the target marginals to the average of the forward and reverse marginals
		desired_marginals = actual_marginals;
		for( unsigned int j = 0; j < cfg->dv_spectrum_depths.size(); j++ ) 
			desired_marginals[j].addWeightedMessage(reverse_marginals[j], 1.0);	
		targets_modified = true;
		
		//Re-Initialise everything ready to go again
		down_msgs = init_down_msgs;
		up_msgs = init_up_msgs;
		initialiseFactorProbsAndBeliefs();
		diff = computeBeliefs();
		computeMarginals( actual_marginals );
		for( unsigned int i = 0; i < diff_buf.size(); i++){
			diff_buf[i] = 100.0;
			prev_diff_buf[i] = 1000.0;
		}

		retries++;

	}
	return iter;
}