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

📄 update_epsilon.c

📁 graphcut源代码
💻 C
字号:
#if	defined(DEBUG) || defined(CHECK_EPS_OPT)#include	<stdio.h>#endif#include	"csa_types.h"#include	"csa_defs.h"/* extern	double	epsilon, min_epsilon, scale_factor;*/extern	double	epsilon, min_epsilon;#ifdef	USE_PRICE_OUTextern	double	po_cost_thresh;#endifextern	lhs_ptr	head_lhs_node, tail_lhs_node;#if	defined(DEBUG) || defined(CHECK_EPS_OPT)extern	rhs_ptr	head_rhs_node;#endif#if	defined(USE_PRICE_OUT) || defined(CHECK_EPS_OPT)extern	unsigned	refines;#endif#ifdef	QUICK_MINextern	void	best_build();#endifint	update_epsilon(){#ifdef	USE_PRICE_OUTdouble	po_cutoff;double	thresh;int	one_priced_in;#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)int	need_best_rebuild;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */#ifdef	BACK_PRICE_OUTrl_aptr	b, b_stop;lhs_ptr	u;rhs_ptr	w;#endif	/* BACK_PRICE_OUT */#endif	/* USE_PRICE_OUT */#if	defined(USE_PRICE_OUT) || defined(CHECK_EPS_OPT)double	v_price, red_cost;lhs_ptr	v;lr_aptr	a, a_start, a_stop;#endif	/* USE_PRICE_OUT || CHECK_EPS_OPT */#ifdef	STRONG_POdouble	fix_in_thresh;#endif	/* STRONG_PO */extern	double	scale_factor;int	fix_in = FALSE;epsilon /= scale_factor;if (epsilon < min_epsilon) epsilon = min_epsilon;#ifdef	USE_PRICE_OUTpo_cutoff = po_cost_thresh * epsilon;#endif#if	defined(USE_PRICE_OUT) || defined(CHECK_EPS_OPT)/*Now if at least one refine has occurred (and hence all lhs nodes arematched), check for arcs that should be priced in and price them in,and check for arcs that should be priced out and price them out.*/if (refines > 0)  {  for (v = head_lhs_node; v != tail_lhs_node; v++)    {    /*    First, save the location of the first priced-in arc so we don't do    costly computations for any arc twice.    */    a_start = v->first;    /*    Determine the price we will assume v has. We choose the price so the    matching arc will have zero partial reduced cost, and this choice    enables us to do several things:    1) Detect epsilon-optimality by checking that partial reduced costs       of non-matching arcs are at least -epsilon;    2) Make price-in and price-out decisions in a way that lets us store       new costs (with incorporated rhs prices) without any backtracking.       Those arcs with reduced cost close to that of the matching arc       are priced in, those far away are priced out, and that's that.    */    v_price = v->matched->head->p - v->matched->c;#ifdef	USE_PRICE_OUT    thresh = po_cutoff - v_price;    one_priced_in = FALSE;#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)    need_best_rebuild = FALSE;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */#endif	/* USE_PRICE_OUT */#ifdef	STRONG_PO    /*    Check for arcs to price in.    */    fix_in_thresh = -epsilon - v_price;    for (a = v->priced_out; a != v->first; a++)      if ((a != v->matched) && ((red_cost = a->c - a->head->p) < thresh))	{	price_in_unm_arc(v, a);	one_priced_in = TRUE;	/*	If we have a fix-in, we don't have to unmatch the node here,	since refine unmatches all nodes initially anyway. Just let	main know that refine is needed.	*/	if (red_cost < fix_in_thresh)	  fix_in = TRUE;#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)	need_best_rebuild = TRUE;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */	if (a == v->first) break;	}#endif	/* STRONG_PO */    a_stop = (v+1)->priced_out;    /*    For each arc incident to v, decide whether or not to price it out.    */    for (a = a_start; a != a_stop; a++)      {      if (a != v->matched)	{	red_cost = a->c - a->head->p;#ifdef	USE_PRICE_OUT	if (red_cost >= thresh)	  {	  price_out_unm_arc(v, a);#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)	  need_best_rebuild = TRUE;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */	  }	else	  {	  one_priced_in = TRUE;#endif	/* USE_PRICE_OUT */#ifdef	CHECK_EPS_OPT	  /*	  0.01 in the following line because of precision problems	  that are ultimately OK, although they make the flow look	  non-epsilon-optimal.	  */	  if (v_price + red_cost < -epsilon * (scale_factor + 0.01))	    {	    (void) printf("Epsilon optimality violation! c(%ld, %ld)=%lg; epsilon=%lg\n",			  v - head_lhs_node + 1, a->head - head_rhs_node + 1,			  v_price + red_cost, epsilon);	    (void) fflush(stdout);	    }#endif	/* CHECK_EPS_OPT */#ifdef	USE_PRICE_OUT	  }#endif	/* USE_PRICE_OUT */	}      }#ifdef	USE_PRICE_OUT    a = v->matched;#ifdef	STRONG_PO    if (one_priced_in)      {      if (!a->head->node_info.priced_in)	{	/*	Matching arc is priced out.	*/	price_in_mch_arc(v, a);#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)	need_best_rebuild = TRUE;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */	}      }    else#else	/* !STRONG_PO */    if (!one_priced_in)#endif	/* STRONG_PO */      if (a->head->node_info.priced_in)	{	/*	No arcs are priced in except the matching arc. Price it out,	too, and if we use back-arc price-outs, price out all the arcs	incident to its head.	*/	price_out_mch_arc(v, a);#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)	need_best_rebuild = TRUE;#endif	/* QUICK_MIN && !BACK_PRICE_OUT */#ifdef	BACK_PRICE_OUT	w = a->head;	b_stop = (w+1)->priced_out;	for (b = w->back_arcs; b != b_stop; b++)	  {	  u = b->tail;	  a = b->rev;	  price_out_unm_arc(u, a);	  }#endif	/* BACK_PRICE_OUT */	}#if	defined(QUICK_MIN) && !defined(BACK_PRICE_OUT)    /*    Make sure v->node_info.few_arcs reflects the priced-in degree of v.    */    if (a_stop - v->first < NUM_BEST + 1)      v->node_info.few_arcs = TRUE;    else      {      v->node_info.few_arcs = FALSE;      if (need_best_rebuild)	best_build(v);      }#endif	/* QUICK_MIN && !BACK_PRICE_OUT */#endif	/* USE_PRICE_OUT */    }#if	defined(QUICK_MIN) && defined(BACK_PRICE_OUT)  /*  Rebuild the best list for every node, since back price outs mean we  can't build them as we do the price outs.  */  for (v = head_lhs_node; v != tail_lhs_node; v++)    if ((v+1)->priced_out - v->first < NUM_BEST + 1)      v->node_info.few_arcs = TRUE;    else      {      v->node_info.few_arcs = FALSE;      best_build(v);      }#endif  }#endif	/* USE_PRICE_OUT || CHECK_EPS_OPT */return(!fix_in);}

⌨️ 快捷键说明

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