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; }
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; }
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; }
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; }
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; }