Skip to content

Commit c97b779

Browse files
authored
fix 398 (#399)
* fix 398 * fix `diagm` for Julia 1.0
1 parent 4b1052e commit c97b779

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# Changes in v0.13.5
2+
3+
* fix [#398](https://github.com/jump-dev/Convex.jl/issues/398) by allowing `fix!`'d variables in `quadform`.
4+
15
# Changes in v0.13.4
26

37
* You can now create your own variable types by subtyping `AbstractVariable`.

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "Convex"
22
uuid = "f65535da-76fb-5f13-bab9-19810c17039a"
3-
version = "0.13.4"
3+
version = "0.13.5"
44

55
[deps]
66
AbstractTrees = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"

src/atoms/second_order_cone/quadform.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
function quadform(x::Value, A::AbstractExpr)
32
return x' * A * x
43
end
@@ -23,3 +22,13 @@ function quadform(x::AbstractExpr, A::Value)
2322
P = real(sqrt(Matrix(factor * A)))
2423
return factor * square(norm2(P * x))
2524
end
25+
26+
function quadform(x::AbstractExpr, A::AbstractExpr)
27+
if vexity(x) == ConstVexity()
28+
return quadform(evaluate(x), A)
29+
elseif vexity(A) == ConstVexity()
30+
return quadform(x, evaluate(A))
31+
else
32+
error("Either `x` or `A` must be constant in `quadform(x,A)`.")
33+
end
34+
end

src/problem_depot/problems/socp.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,27 @@ end
246246
@test p.optval 3.7713 atol=atol rtol=rtol
247247
@test evaluate(quadform(x, A)) -1 atol=atol rtol=rtol
248248
end
249+
250+
251+
# https://github.com/jump-dev/Convex.jl/issues/398
252+
n = 3
253+
b = randn(n)
254+
x = Variable(n)
255+
H = Semidefinite(n)
256+
Hval = randn(n,n)
257+
Hval .= Hval'*Hval+10*diagm(0 => ones(n)) # symmetric positive definite
258+
fix!(H, Hval)
259+
p = minimize(x'b + quadform(x,H), [x >= 0]; numeric_type = T)
260+
handle_problem!(p)
261+
262+
p2 = minimize(x'b + quadform(x,Hval), [x >= 0]; numeric_type = T)
263+
handle_problem!(p2)
264+
265+
if test
266+
@test p.optval p2.optval atol=atol rtol=rtol
267+
@test evaluate(H) Hval atol=atol rtol=rtol
268+
end
269+
249270
end
250271

251272
@add_problem socp function socp_huber_atom(handle_problem!, ::Val{test}, atol, rtol, ::Type{T}) where {T, test}

0 commit comments

Comments
 (0)