rime.util.dual_bisect.dual_v

rime.util.dual_bisect.dual_v(v, s, alpha, beta, eps, constraint_type='ub')[source]
min_{v<=0} d(v)

= min_{u>=0} max_pi L(pi, u, v) = E_xy [ u(x)alpha(x) + v(y)beta(y) + Softplus(1/eps)(s-u-v) ],

where u = min{u>=0 : E_y[pi(x,y)] <= alpha(x)}

When eps -> 0, Softplus(1/eps)(z) -> max(z, 0) -> z * sigmoid(z / eps) = z * pi

d(v) = E_xy [ u(x)alpha(x) + v(y)beta(y) + (s - u - v) pi ]

= E_xy [ s(x,y) pi(x,y) + u(x)(alpha(x) - pi(x,y)) + v(y)(beta(y) - pi(x,y)) ] >= E_xy [ s(x,y) + v(y)(beta(y) - pi(x,y)) ]