/
variable_conic_form.jl
28 lines (26 loc) · 1.23 KB
/
variable_conic_form.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function conic_form!(x::AbstractVariable, unique_conic_forms::UniqueConicForms)
if !has_conic_form(unique_conic_forms, x)
add_to_id_to_variables!(unique_conic_forms, x)
if vexity(x) == ConstVexity()
# do exactly what we would for a constant
objective = ConicObj()
objective[objectid(:constant)] = (vec([real(evaluate(x));]),vec([imag(evaluate(x));]))
cache_conic_form!(unique_conic_forms, x, objective)
else
objective = ConicObj()
vec_size = length(x)
objective[x.id_hash] = (real_conic_form(x), imag_conic_form(x))
objective[objectid(:constant)] = (spzeros(vec_size, 1), spzeros(vec_size, 1))
# placeholder values in unique constraints prevent infinite recursion depth
cache_conic_form!(unique_conic_forms, x, objective)
if !(sign(x) == NoSign() || sign(x) == ComplexSign())
conic_form!(sign(x), x, unique_conic_forms)
end
# apply the constraints `x` itself carries
for constraint in constraints(x)
conic_form!(constraint, unique_conic_forms)
end
end
end
return get_conic_form(unique_conic_forms, x)
end