void HardMatching::normalize () { optimize_1(); for (size_t i = 0; i < size_1(); ++i) { m_1_non[i] = true; } for (size_t ij = 0; ij < size_arc(); ++ij) { Arc arc = m_arcs[ij]; m_1_ass[ij] = (m_post_ass[ij] == m_optima[arc.i]); } optimize_2(); for (size_t j = 0; j < size_2(); ++j) { m_2_non[j] = true; } for (size_t ij = 0; ij < size_arc(); ++ij) { Arc arc = m_arcs[ij]; m_2_ass[ij] = (m_post_ass[ij] == m_optima[arc.j]); if (post_1_ass(ij) and post_2_ass(ij)) { m_1_ass[ij] = true; m_1_non[arc.i] = false; m_2_non[arc.j] = false; } else { m_1_ass[ij] = false; } } }
void HardMatching::propagate_12 () { optimize_1(); for (size_t ij = 0; ij < size_arc(); ++ij) { Arc arc = m_arcs[ij]; float message = m_message_12[ij] = -m_optima[arc.i].best_alternative(m_post_ass[ij]); m_post_ass[ij] = message + m_message_21[ij] + m_prior_ass[ij]; ASSERT1_COST(m_post_ass[ij]); } }
/*-------------------------------------------------------------------------*/ static void optimize(curr_poly_t *c, poly_stage2_t *data, root_sieve_t *rs, assess_t *assess, stage2_stat_t *stats) { int err; double skewness; double pol_norm; double alpha_proj; double log_max_norm_2 = log(data->max_norm_2); profile_start(PROF_ALL); while (1) { err = read_a5pd(c, data); if (err < 0) { if (feof(data->infile)) break; continue; } if (!pol_expand(c, data->gmp_N)) { mpz_out_str(stdout, 10, c->gmp_a[5]); fprintf(stderr, "expand failed\n"); continue; } profile_start(PROF_INITIAL_OPTIMIZE); optimize_1(c, &skewness, &pol_norm, &alpha_proj); profile_stop(PROF_INITIAL_OPTIMIZE); if (pol_norm * exp(alpha_proj) > data->max_norm_1) continue; root_sieve_run(c, log_max_norm_2, data, rs, assess, stats, skewness, pol_norm, alpha_proj); } profile_stop(PROF_ALL); }