@@ -104,23 +104,13 @@ function MOI.get(model::MOI.ModelLike, attr::Union{MOI.ConstraintDual, MOI.Const
104
104
return dual
105
105
end
106
106
# Given constraint dual start of (u, v, w), constraint dual on GreaterThan is u
107
- # and on exponential cone constraint i is (r,s,t) for -r exp (s/r - 1) = t, where
108
- # s = w_i, t = v_i, and r = exp(W(-s / (-t * e))) * (-t * e), where W is the
109
- # Lambert W function. The derivation of the r expression follows:
110
- # -r exp (s/r - 1) = t => s/r - 1 = log(t/-r) => s/r = log (e * t/-r)
111
- # => -s = r log (r / (-t * e)) => -s / (-t * e) = r / (-t * e) log (r / (-t * e))
112
- # let x = r / (-t * e) and y = -s / (-t * e), solve y = x log x using Lambert W function:
113
- # x = exp(W(y)) => r / (-t * e) = exp(W(-s / (-t * e))) => r = exp(W(-s / (-t * e))) * (-t * e).
114
- import LambertW
107
+ # and on exponential cone constraint i is (r_i, w_i, v_i), but since y_i is free,
108
+ # its dual is 0, so we have -r_i + value[1] == 0 hence r_i = value[1].
115
109
function MOI. set (model:: MOI.ModelLike , :: MOI.ConstraintDualStart , bridge:: RelativeEntropyBridge , value)
116
110
MOI. set (model, MOI. ConstraintDualStart (), bridge. ge_index, value[1 ])
117
111
w_start = 1 + length (bridge. y)
118
112
for i in eachindex (bridge. y)
119
- s_value = value[w_start + i]
120
- t_value = value[1 + i]
121
- r_value = exp (LambertW. lambertw (s_value / (t_value * ℯ))) * - t_value * ℯ
122
- @assert - r_value * exp (s_value / r_value - 1 ) - t_value ≈ 0
123
- MOI. set (model, MOI. ConstraintDualStart (), bridge. exp_indices[i], [r_value, s_value, t_value])
113
+ MOI. set (model, MOI. ConstraintDualStart (), bridge. exp_indices[i], [value[1 ], value[w_start + i], value[1 + i]])
124
114
end
125
115
return
126
116
end
0 commit comments