Skip to content

Conversation

@odow
Copy link
Member

@odow odow commented Mar 23, 2025

This might have been needed in the past, but it's not needed now:

julia> model = Mosek.Optimizer()
MosekTools.Optimizer
├ ObjectiveSense: FEASIBILITY_SENSE
├ ObjectiveFunctionType: MOI.ScalarAffineFunction{Float64}
├ NumberOfVariables: 0
└ NumberOfConstraints: 0

julia> x = MOI.add_variables(model, 3)
3-element Vector{MathOptInterface.VariableIndex}:
 MOI.VariableIndex(1)
 MOI.VariableIndex(2)
 MOI.VariableIndex(3)

julia> f = MOI.Utilities.vectorize(1.0 .* x)
┌                              ┐
│0.0 + 1.0 MOI.VariableIndex(1)│
│0.0 + 1.0 MOI.VariableIndex(2)│
│0.0 + 1.0 MOI.VariableIndex(3)│
└                              ┘

julia> @code_warntype MOI.add_constraint(model, f, MOI.ExponentialCone())
MethodInstance for MathOptInterface.add_constraint(::MosekTools.Optimizer, ::MathOptInterface.VectorAffineFunction{Float64}, ::MathOptInterface.ExponentialCone)
  from add_constraint(m::MosekTools.Optimizer, func::MathOptInterface.VectorAffineFunction{Float64}, dom::D) where D<:Union{DualExponentialCone, ExponentialCone, RotatedSecondOrderCone, Scaled{PositiveSemidefiniteConeTriangle}, SecondOrderCone, DualPowerCone, PowerCone} @ MosekTools ~/.julia/dev/MosekTools/src/constraint.jl:644
Static Parameters
  D = MathOptInterface.ExponentialCone
Arguments
  #self#::Core.Const(MathOptInterface.add_constraint)
  m::MosekTools.Optimizer
  func::MathOptInterface.VectorAffineFunction{Float64}
  dom::Core.Const(MathOptInterface.ExponentialCone())
Locals
  @_5::Union{Nothing, Tuple{MathOptInterface.VectorAffineTerm{Float64}, Int64}}
  rbarcof::Vector{Float64}
  rbarsubl::Vector{Int64}
  rbarsubk::Vector{Int64}
  rbarsubj::Vector{Int32}
  rbarsubi::Vector{Int64}
  rcof::Vector{Float64}
  rsubj::Vector{Int32}
  rsubi::Vector{Int64}
  domi::Int64
  b::Vector{Float64}
  afei::Int64
  acci::Int64
  axbs::MathOptInterface.VectorAffineFunction{Float64}
  term::MathOptInterface.VectorAffineTerm{Float64}
  scale::Float64
  index::Union{MosekTools.ColumnIndex, MosekTools.MatrixIndex}
  row::Int64
  @_23::Float64
Body::MathOptInterface.ConstraintIndex{MathOptInterface.VectorAffineFunction{Float64}, MathOptInterface.ExponentialCone}
1 ── %1   = MathOptInterface.Utilities::Core.Const(MathOptInterface.Utilities)
│    %2   = Base.getproperty(%1, :canonical)::Core.Const(MathOptInterface.Utilities.canonical)
│           (axbs = (%2)(func))
│    %4   = Mosek.getnumacc::Core.Const(Mosek.getnumacc)
│    %5   = Base.getproperty(m, :task)::Mosek.Task%6   = (%4)(%5)::Int64
│           (acci = %6 + 1)
│    %8   = Mosek.getnumafe::Core.Const(Mosek.getnumafe)
│    %9   = Base.getproperty(m, :task)::Mosek.Task
│           (afei = (%8)(%9))
│    %11  = Base.getproperty(axbs, :constants)::Vector{Float64}%12  = $(Expr(:static_parameter, 1))::Core.Const(MathOptInterface.ExponentialCone)
│    %13  = MosekTools.reorder(%11, %12, true)::Vector{Float64}
│           (b = -%13)
│    %15  = Base.getproperty(m, :task)::Mosek.Task%16  = Base.getproperty(axbs, :constants)::Vector{Float64}%17  = MosekTools.length(%16)::Int64
│           (domi = MosekTools._append_cone_domain(%15, %17, dom))
│    %19  = MosekTools.:+::Core.Const(+)
│    %20  = afei::Int64%21  = MosekTools.eachindex(b)::Base.OneTo{Int64}%22  = Base.broadcasted(%19, %20, %21)::UnitRange{Int64}%23  = Base.materialize(%22)::UnitRange{Int64}%24  = Base.getproperty(m, :F_rows)::Dict{Int64, UnitRange{Int64}}
│           Base.setindex!(%24, %23, acci)
│    %26  = Mosek.appendafes::Core.Const(Mosek.appendafes)
│    %27  = Base.getproperty(m, :task)::Mosek.Task%28  = Base.getproperty(axbs, :constants)::Vector{Float64}%29  = MosekTools.length(%28)::Int64
│           (%26)(%27, %29)
│    %31  = Mosek.appendaccseq::Core.Const(Mosek.appendaccseq)
│    %32  = Base.getproperty(m, :task)::Mosek.Task%33  = domi::Int64%34  = (afei + 1)::Int64
│           (%31)(%32, %33, %34, b)
│    %36  = Base.getindex(MosekTools.Int64)::Vector{Int64}%37  = Base.getindex(MosekTools.Int32)::Vector{Int32}%38  = Base.getindex(MosekTools.Float64)::Vector{Float64}
│           (rsubi = %36)
│           (rsubj = %37)
│           (rcof = %38)
│    %42  = Base.getindex(MosekTools.Int64)::Vector{Int64}%43  = Base.getindex(MosekTools.Int32)::Vector{Int32}%44  = Base.getindex(MosekTools.Int64)::Vector{Int64}%45  = Base.getindex(MosekTools.Int64)::Vector{Int64}%46  = Base.getindex(MosekTools.Float64)::Vector{Float64}
│           (rbarsubi = %42)
│           (rbarsubj = %43)
│           (rbarsubk = %44)
│           (rbarsubl = %45)
│           (rbarcof = %46)
│    %52  = Base.getproperty(axbs, :terms)::Vector{MathOptInterface.VectorAffineTerm{Float64}}
│           (@_5 = Base.iterate(%52))
│    %54  = (@_5 === nothing)::Bool%55  = Base.not_int(%54)::Bool
└───        goto #13 if not %55
2 ┄─        Core.NewvarNode(:(scale))
│    %58  = @_5::Tuple{MathOptInterface.VectorAffineTerm{Float64}, Int64}
│           (term = Core.getfield(%58, 1))
│    %60  = Core.getfield(%58, 2)::Int64%61  = Base.getproperty(term, :output_index)::Int64%62  = MosekTools.reorder(%61, dom, true)::Int64
│           (row = %62 + afei)
│    %64  = Base.getproperty(term, :scalar_term)::MathOptInterface.ScalarAffineTerm{Float64}%65  = Base.getproperty(%64, :variable)::MathOptInterface.VariableIndex
│           (index = MosekTools.mosek_index(m, %65))
│    %67  = (index isa MosekTools.ColumnIndex)::Bool
└───        goto #4 if not %67
3 ──        MosekTools.push!(rsubi, row)
│    %70  = rsubj::Vector{Int32}%71  = Base.getproperty(index::MosekTools.ColumnIndex, :value)::Int32
│           MosekTools.push!(%70, %71)
│    %73  = rcof::Vector{Float64}%74  = Base.getproperty(term, :scalar_term)::MathOptInterface.ScalarAffineTerm{Float64}%75  = Base.getproperty(%74, :coefficient)::Float64
│           MosekTools.push!(%73, %75)
└───        goto #11
4 ── %78  = (index::MosekTools.MatrixIndex isa MosekTools.MatrixIndex)::Core.Const(true)
└───        goto #6 if not %78
5 ──        goto #7
6 ──        Core.Const(:(Base.AssertionError("index isa MatrixIndex")))
└───        Core.Const(:(Base.throw(%81)))
7 ┄─        MosekTools.push!(rbarsubi, row)
│    %84  = rbarsubj::Vector{Int32}%85  = Base.getproperty(index::MosekTools.MatrixIndex, :matrix)::Int32
│           MosekTools.push!(%84, %85)
│    %87  = rbarsubk::Vector{Int64}%88  = Base.getproperty(index::MosekTools.MatrixIndex, :row)::Int32
│           MosekTools.push!(%87, %88)
│    %90  = rbarsubl::Vector{Int64}%91  = Base.getproperty(index::MosekTools.MatrixIndex, :column)::Int32
│           MosekTools.push!(%90, %91)
│    %93  = Base.getproperty(index::MosekTools.MatrixIndex, :row)::Int32%94  = Base.getproperty(index::MosekTools.MatrixIndex, :column)::Int32%95  = (%93 == %94)::Bool
└───        goto #9 if not %95
8 ──        (@_23 = 1.0)
└───        goto #10
9 ──        (@_23 = 0.5)
10 ┄        (scale = @_23)
│    %101 = rbarcof::Vector{Float64}%102 = scale::Float64%103 = Base.getproperty(term, :scalar_term)::MathOptInterface.ScalarAffineTerm{Float64}%104 = Base.getproperty(%103, :coefficient)::Float64%105 = (%102 * %104)::Float64
└───        MosekTools.push!(%101, %105)
11 ┄        (@_5 = Base.iterate(%52, %60))
│    %108 = (@_5 === nothing)::Bool%109 = Base.not_int(%108)::Bool
└───        goto #13 if not %109
12 ─        goto #2
13%112 = MosekTools.isempty(rsubi)::Bool%113 = !%112::Bool
└───        goto #15 if not %113
14%115 = Mosek.putafefentrylist::Core.Const(Mosek.putafefentrylist)
│    %116 = Base.getproperty(m, :task)::Mosek.Task%117 = rsubi::Vector{Int64}%118 = rsubj::Vector{Int32}
└───        (%115)(%116, %117, %118, rcof)
15%120 = MosekTools.isempty(rbarsubi)::Bool%121 = !%120::Bool
└───        goto #17 if not %121
16%123 = Mosek.putafebarfblocktriplet::Core.Const(Mosek.putafebarfblocktriplet)
│    %124 = Base.getproperty(m, :task)::Mosek.Task%125 = rbarsubi::Vector{Int64}%126 = rbarsubj::Vector{Int32}%127 = rbarsubk::Vector{Int64}%128 = rbarsubl::Vector{Int64}
└───        (%123)(%124, %125, %126, %127, %128, rbarcof)
17%130 = MathOptInterface.ConstraintIndex::Core.Const(MathOptInterface.ConstraintIndex)
│    %131 = MathOptInterface.VectorAffineFunction::Core.Const(MathOptInterface.VectorAffineFunction)
│    %132 = Core.apply_type(%131, MosekTools.Float64)::Core.Const(MathOptInterface.VectorAffineFunction{Float64})
│    %133 = Core.apply_type(%130, %132, $(Expr(:static_parameter, 1)))::Core.Const(MathOptInterface.ConstraintIndex{MathOptInterface.VectorAffineFunction{Float64}, MathOptInterface.ExponentialCone})
│    %134 = (%133)(acci)::MathOptInterface.ConstraintIndex{MathOptInterface.VectorAffineFunction{Float64}, MathOptInterface.ExponentialCone}
└───        return %134

@odow odow merged commit 321d596 into master Mar 23, 2025
5 checks passed
@odow odow deleted the od/fix-let branch March 23, 2025 22:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants