jump-dev / Convex.jl

A Julia package for disciplined convex programming
https://jump.dev/Convex.jl/stable/
Other
568 stars 121 forks source link

Error: TypeError: in typeassert, expected Convex.SparseTape{BigFloat}, got a value of type Vector{BigFloat} #703

Closed Jo-star-star closed 1 month ago

Jo-star-star commented 1 month ago

I stumbled open an issue I haven't been able to understand. I have two SDP problems set up similarly but with different matrix sizes, the second of which includes the first as a submatrix. The smaller one runs just fine but the second throws the following error:

TypeError: in typeassert, expected Convex.SparseTape{BigFloat}, got a value of type Vector{BigFloat}

Stacktrace:
   [1] real_operate(::typeof(vcat), ::Type{BigFloat}, ::Vector{BigFloat}, ::Vector{BigFloat}, ::Vector{BigFloat}, ::Vector{BigFloat}, ::Vararg{Union{Convex.SparseTape{BigFloat}, Vector{BigFloat}}})
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/real_operate.jl:223
   [2] operate(::typeof(vcat), ::Type{BigFloat}, ::NoSign, ::Vector{BigFloat}, ::Vararg{Any})
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/operate.jl:118
   [3] new_conic_form!(context::Convex.Context{BigFloat, MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SDPAFamily.Optimizer{BigFloat}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{BigFloat}}}}}, x::Convex.HcatAtom)
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/atoms/HcatAtom.jl:38
   [4] #8
     @ ~/.julia/packages/Convex/5ZBPt/src/variable_template.jl:99 [inlined]
   [5] get!
     @ ./iddict.jl:181 [inlined]
   [6] conic_form!(context::Convex.Context{BigFloat, MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SDPAFamily.Optimizer{BigFloat}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{BigFloat}}}}}, a::Convex.HcatAtom)
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/variable_template.jl:99
   [7] new_conic_form!(context::Convex.Context{BigFloat, MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SDPAFamily.Optimizer{BigFloat}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{BigFloat}}}}}, A::Convex.ReshapeAtom)
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/atoms/ReshapeAtom.jl:39
   [8] #8
     @ ~/.julia/packages/Convex/5ZBPt/src/variable_template.jl:99 [inlined]
   [9] get!
     @ ./iddict.jl:181 [inlined]
  [10] conic_form!(context::Convex.Context{BigFloat, MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SDPAFamily.Optimizer{BigFloat}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{BigFloat}}}}}, a::Convex.ReshapeAtom)
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/variable_template.jl:99
  [11] new_conic_form!(context::Convex.Context{BigFloat, MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{SDPAFamily.Optimizer{BigFloat}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{BigFloat}}}}}, x::Convex.MultiplyAtom)
     @ Convex ~/.julia/packages/Convex/5ZBPt/src/atoms/MultiplyAtom.jl:93 
...
(This is repeated around 10 times)

A minimal working example is:

using SDPAFamily, Convex

include("file.txt")

problem = minimize(target, [ reA + (imA *1im) ⪰ 0]; numeric_type = BigFloat)

solve!(problem, () -> SDPAFamily.Optimizer(variant=:sdpa_gmp))

If file.txt contains

x=Variable(2)
imA=[(BigFloat(0)) (BigFloat(0)) (BigFloat(0));(BigFloat(0)) (BigFloat(0)) (BigFloat(0.5));(BigFloat(0)) (BigFloat(-0.5)) (BigFloat(0))]
reA=[(BigFloat(1.) + x[1]) (BigFloat(299.)) (BigFloat(0));(BigFloat(299.)) (BigFloat(99500.) + x[1]) (BigFloat(0));(BigFloat(0)) (BigFloat(0)) (BigFloat(0.004937810945) + x[1] + BigFloat(-0.8291873964)*x[2])]
target=x[1]

everything works fine. However, if it contains

x=Variable(3)
imA=[(BigFloat(0)) (BigFloat(0)) (BigFloat(0)) (BigFloat(0)) (BigFloat(-0.5)) (BigFloat(0));(BigFloat(0)) (BigFloat(0)) (BigFloat(0.5)) (BigFloat(0)) (BigFloat(0)) (BigFloat(0));(BigFloat(0)) (BigFloat(-0.5)) (BigFloat(0)) (BigFloat(-299.)) (BigFloat(0)) (BigFloat(0));(BigFloat(0)) (BigFloat(0)) (BigFloat(299.)) (BigFloat(0)) (BigFloat(49750.)) (BigFloat(0));(BigFloat(0.5)) (BigFloat(0)) (BigFloat(0)) (BigFloat(-49750.)) (BigFloat(0)) (BigFloat(0.007406716418) + BigFloat(-1.243781095)*x[2]);(BigFloat(0)) (BigFloat(0)) (BigFloat(0)) (BigFloat(0)) (BigFloat(-0.007406716418) + BigFloat(1.243781095)*x[2]) (BigFloat(0))]
reA=[(BigFloat(1.) + x[1]) (BigFloat(299.)) (BigFloat(0)) (BigFloat(99500.)) (BigFloat(0)) (BigFloat(0.004937810945) + BigFloat(-0.8291873964)*x[2]);(BigFloat(299.)) (BigFloat(99500.) + x[1]) (BigFloat(0)) (BigFloat(3.4825e7)) (BigFloat(0)) (BigFloat(0.495));(BigFloat(0)) (BigFloat(0)) (BigFloat(0.004937810945) + x[1] + BigFloat(-0.8291873964)*x[2]) (BigFloat(0)) (BigFloat(0.495)) (BigFloat(-0.08291873964)*x[3]);(BigFloat(99500.)) (BigFloat(3.4825e7)) (BigFloat(0)) (BigFloat(1.256486e10) + x[1]) (BigFloat(0)) (BigFloat(98.5));(BigFloat(0)) (BigFloat(0)) (BigFloat(0.495)) (BigFloat(0)) (BigFloat(99.5) + x[1]) (BigFloat(0.08291873964)*x[3]);(BigFloat(0.004937810945) + BigFloat(-0.8291873964)*x[2]) (BigFloat(0.495)) (BigFloat(-0.08291873964)*x[3]) (BigFloat(98.5)) (BigFloat(0.08291873964)*x[3]) (x[1] + x[2])]
target=x[1]

it throws the error above. Can you help me understand what is the difference between the two cases and what is happening?

odow commented 1 month ago

This is just a bug in Convex.jl. I'll open a PR with the fix.

odow commented 1 month ago

This is fixed if you update to the latest v0.16.3 version of Convex.jl

Thanks for reporting the issue!

Jo-star-star commented 1 month ago

Thank you very much for the super quick reply!