/* * Note: parameters are always refreshed in advance by $pc_export_sw_info/1, * so it causes no problem to overwrite them temporarily */ int pc_compute_n_viterbi_rerank_4(void) { TERM p_n_viterbi_list; int n,l,goal_id; n = bpx_get_integer(bpx_get_call_arg(1,4)); l = bpx_get_integer(bpx_get_call_arg(2,4)); goal_id = bpx_get_integer(bpx_get_call_arg(3,4)); initialize_egraph_index(); alloc_sorted_egraph(1); /* INIT_MIN_MAX_NODE_NOS; */ RET_ON_ERR(sort_one_egraph(goal_id,0,1)); if (verb_graph) print_egraph(0,PRINT_NEUTRAL); alloc_occ_switches(); transfer_hyperparams_prolog(); get_param_means(); compute_n_max(l); get_n_most_likely_path_rerank(n,l,goal_id,&p_n_viterbi_list); release_occ_switches(); return bpx_unify(bpx_get_call_arg(4,4),p_n_viterbi_list); }
/* We check if all smoothing constants are positive (MAP), * or all smoothing constants are zero. If some are positive, * but the others are zero, die immediately. We also check * if there exist parameters fixed at zero in MAP estimation. */ int check_smooth(int *smooth) { /* q = +4 : found non-zero smoothing constants +2 : found zero-valued smoothing constants +1 : found parameters fixed to zero */ int i, q = 0; SW_INS_PTR sw_ins_ptr; for (i = 0; i < occ_switch_tab_size; i++) { sw_ins_ptr = occ_switches[i]; while (sw_ins_ptr != NULL) { if (sw_ins_ptr->smooth_prolog < 0) { emit_error("negative delta values in MAP estimation"); RET_ERR(err_invalid_numeric_value); } q |= (sw_ins_ptr->smooth_prolog < TINY_PROB) ? 2 : 4; q |= (sw_ins_ptr->fixed && sw_ins_ptr->inside < TINY_PROB) ? 1 : 0; sw_ins_ptr = sw_ins_ptr->next; } } switch (q) { case 0: /* p.counts = (none), w/o 0-valued params */ case 1: /* p.counts = (none), with 0-valued params */ emit_internal_error("unexpected case in check_smooth()"); RET_ERR(ierr_unmatched_branches); break; case 2: /* p.counts = 0 only, w/o 0-valued params */ case 3: /* p.counts = 0 only, with 0-valued params */ *smooth = 0; break; case 4: /* p.counts = + only, w/o 0-valued params */ *smooth = 1; break; case 5: /* p.counts = + only, with 0-valued params */ emit_error("parameters fixed to zero in MAP estimation"); RET_ERR(err_invalid_numeric_value); break; case 6: /* p.counts = (both), w/o 0-valued params */ case 7: /* p.counts = (both), with 0-valued params */ emit_error("mixture of zero and non-zero pseudo counts"); RET_ERR(err_invalid_numeric_value); } transfer_hyperparams_prolog(); return BP_TRUE; }
/* Just check if there is any negative hyperparameter */ int check_smooth_vb(void) { int i; SW_INS_PTR sw_ins_ptr; for (i = 0; i < occ_switch_tab_size; i++) { sw_ins_ptr = occ_switches[i]; while (sw_ins_ptr != NULL) { if (sw_ins_ptr->smooth_prolog <= -1.0) { emit_internal_error("illegal hyperparameters"); RET_INTERNAL_ERR; } sw_ins_ptr = sw_ins_ptr->next; } } transfer_hyperparams_prolog(); return BP_TRUE; }