From dd2b9b030a42dc0f496c853622f6a1bc7baf726e Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Thu, 9 Mar 2023 20:59:33 +0000 Subject: [PATCH 1/9] snoop precompile --- Project.toml | 2 ++ src/Clarabel.jl | 29 ++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index d06bebf6..22360968 100644 --- a/Project.toml +++ b/Project.toml @@ -13,6 +13,7 @@ PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" QDLDL = "bfc457fd-c171-5ab7-bd9e-d5dbfc242d63" Requires = "ae029012-a4dd-5104-9daa-d747884805df" +SnoopPrecompile = "66db9d55-30c0-4569-8b51-7e840670fc0c" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" @@ -26,6 +27,7 @@ MathOptInterface = "1.2" PrettyTables = "1, 2" QDLDL = "0.4" Requires = "1" +SnoopPrecompile = "1" StaticArrays = "1" TimerOutputs = "0.5" julia = "1.2" diff --git a/src/Clarabel.jl b/src/Clarabel.jl index ce619d0b..94f6e5fe 100644 --- a/src/Clarabel.jl +++ b/src/Clarabel.jl @@ -1,4 +1,3 @@ -__precompile__() module Clarabel using SparseArrays, LinearAlgebra, Printf, Requires @@ -85,5 +84,33 @@ module Clarabel end const Optimizer{T} = Clarabel.MOImodule.Optimizer{T} + +using SnoopPrecompile + +function __precompile_min_example() + cones = [ + Clarabel.NonnegativeConeT(1), + Clarabel.ZeroConeT(1), + Clarabel.SecondOrderConeT(2)]; + nvars = 4 + P = A = sparse(I(nvars)*1.) + b = ones(nvars) + c = -ones(nvars) + m = Clarabel.Solver() + s = Clarabel.Settings(verbose=false) + Clarabel.setup!(m,P,c,A,b,cones,s) + Clarabel.solve!(m) +end + + +SnoopPrecompile.@precompile_setup begin + SnoopPrecompile.@precompile_all_calls begin + @eval begin + let + __precompile_min_example() + end + end + end end +end #end module \ No newline at end of file From ab43ffca22f8b01216dc0052f69686078e46473c Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Sun, 12 Mar 2023 21:53:27 +0000 Subject: [PATCH 2/9] reduce packages deps --- Project.toml | 7 +--- src/cones/coneops_defaults.jl | 2 - src/equilibration.jl | 1 - src/settings.jl | 76 +++++++++++++++++++---------------- src/utils/mathutils.jl | 3 ++ src/version.jl | 6 +-- 6 files changed, 49 insertions(+), 46 deletions(-) diff --git a/Project.toml b/Project.toml index 22360968..7431c228 100644 --- a/Project.toml +++ b/Project.toml @@ -5,26 +5,21 @@ version = "0.4.1" [deps] AMD = "14f7f29c-3bd6-536c-9a0b-7339e30b5a3e" -DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" QDLDL = "bfc457fd-c171-5ab7-bd9e-d5dbfc242d63" Requires = "ae029012-a4dd-5104-9daa-d747884805df" SnoopPrecompile = "66db9d55-30c0-4569-8b51-7e840670fc0c" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" -Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" SuiteSparse = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" +TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" [compat] AMD = "0.4, 0.5" -DataFrames = "1" MathOptInterface = "1.2" -PrettyTables = "1, 2" QDLDL = "0.4" Requires = "1" SnoopPrecompile = "1" diff --git a/src/cones/coneops_defaults.jl b/src/cones/coneops_defaults.jl index 7b9adf1b..e55f7838 100644 --- a/src/cones/coneops_defaults.jl +++ b/src/cones/coneops_defaults.jl @@ -1,5 +1,3 @@ -import Statistics: mean - ## ------------------------------------------- # Default implementations for cone operations # -------------------------------------------- diff --git a/src/equilibration.jl b/src/equilibration.jl index 7533c72a..cd431d12 100644 --- a/src/equilibration.jl +++ b/src/equilibration.jl @@ -1,5 +1,4 @@ import LinearAlgebra -import Statistics: mean #Ruiz Equilibration procedure, using same method as in COSMO.jl diff --git a/src/settings.jl b/src/settings.jl index ea3d16a1..53d7b053 100644 --- a/src/settings.jl +++ b/src/settings.jl @@ -1,5 +1,3 @@ -using PrettyTables - # ------------------------------------- # User definable settings # ------------------------------------- @@ -146,42 +144,52 @@ end function Base.show(io::IO, settings::Clarabel.Settings{T}) where {T} s = get_precision_string(T) - println("Clarabel settings with Float precision: $s\n") + println(io, "Clarabel settings with Float precision: $s\n") names = fieldnames(Clarabel.Settings) - valstrs = [] - types = [] + values = String[] + types = String[] for name in names - value = getfield(settings,name) - type = typeof(value) + v = getfield(settings,name) + type = String(Symbol(typeof(v))) push!(types, type) - push!(valstrs,type == BigFloat ? @sprintf("%g",value) : string(value)) + push!(values,type == BigFloat ? @sprintf("%g",v) : string(v)) + end + names = collect(String.(names)) + types = String.(Symbol.(types)) + + table = [names types values] + titles = ["Setting","DataType","Value"] + + # pad out each column of the table to a common length + dividers = String[] + for i in eachindex(titles) + len = max(8,maximum(length.(table[:,i]))) + table[:,i] .= rpad.(table[:,i],len+1) + titles[i] = rpad(titles[i],len+1) + push!(dividers,repeat("=",len+2)) + end + + # print the header ... + @printf(io, " ") + for str in titles + @printf(io, " %s ", str) + end + println(io) + # and the divider ... + @printf(io, " ") + for str in dividers + @printf(io, "%s ", str) + end + println(io) + # and the settings + for row in 1:size(table,1) + @printf(io, " ") + for col in 1:size(table,2) + @printf(io, " %s ", table[row,col]) + end + println(io) end - table = hcat(collect(names), types, valstrs) - - #NB: same as tf_compact, but with bolded row separator - tf = TextFormat( - up_right_corner = ' ', - up_left_corner = ' ', - bottom_left_corner = ' ', - bottom_right_corner = ' ', - up_intersection = ' ', - left_intersection = ' ', - right_intersection = ' ', - middle_intersection = ' ', - bottom_intersection = ' ', - column = ' ', - row = '=' - ) - - header = ["Setting", "DataType", "Value"] - - pretty_table(table, - header=header, - compact_printing=true, - alignment = :l, - backend = Val(:text), - tf = tf, - hlines = [1]) + println(io) end diff --git a/src/utils/mathutils.jl b/src/utils/mathutils.jl index 2d6dc198..bd99a16b 100644 --- a/src/utils/mathutils.jl +++ b/src/utils/mathutils.jl @@ -274,6 +274,9 @@ function quad_form( return out end +function mean(v::AbstractArray{T}) where {T} + sum(v)/length(v) +end # --------------------------------- diff --git a/src/version.jl b/src/version.jl index f636e079..a7b6565c 100644 --- a/src/version.jl +++ b/src/version.jl @@ -1,9 +1,9 @@ -using Pkg +using TOML function _get_clarabel_version() toml_path = joinpath(@__DIR__,"../Project.toml") - pkg = Pkg.Types.read_package(toml_path) - string(pkg.version) + version = TOML.parsefile(toml_path)["version"] + string(version) end const SOLVER_NAME = "Clarabel" From f53a48142f498903099ec100a32c7206803fdb92 Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Sun, 12 Mar 2023 21:53:58 +0000 Subject: [PATCH 3/9] improve precompile coverage --- src/Clarabel.jl | 32 ++++---------- src/MOI_wrapper/MOI_wrapper.jl | 6 ++- src/precompile.jl | 76 ++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 src/precompile.jl diff --git a/src/Clarabel.jl b/src/Clarabel.jl index 94f6e5fe..2b64d8b1 100644 --- a/src/Clarabel.jl +++ b/src/Clarabel.jl @@ -1,3 +1,4 @@ +__precompile__() module Clarabel using SparseArrays, LinearAlgebra, Printf, Requires @@ -85,32 +86,13 @@ module Clarabel const Optimizer{T} = Clarabel.MOImodule.Optimizer{T} -using SnoopPrecompile - -function __precompile_min_example() - cones = [ - Clarabel.NonnegativeConeT(1), - Clarabel.ZeroConeT(1), - Clarabel.SecondOrderConeT(2)]; - nvars = 4 - P = A = sparse(I(nvars)*1.) - b = ones(nvars) - c = -ones(nvars) - m = Clarabel.Solver() - s = Clarabel.Settings(verbose=false) - Clarabel.setup!(m,P,c,A,b,cones,s) - Clarabel.solve!(m) -end - - -SnoopPrecompile.@precompile_setup begin + #precompile minimal MOI / native examples + using SnoopPrecompile + include("./precompile.jl") SnoopPrecompile.@precompile_all_calls begin - @eval begin - let - __precompile_min_example() - end - end + __precompile_native() + __precompile_moi() end -end + end #end module \ No newline at end of file diff --git a/src/MOI_wrapper/MOI_wrapper.jl b/src/MOI_wrapper/MOI_wrapper.jl index 84b16bb5..437ed304 100644 --- a/src/MOI_wrapper/MOI_wrapper.jl +++ b/src/MOI_wrapper/MOI_wrapper.jl @@ -137,7 +137,11 @@ end MOI.is_empty(optimizer::Optimizer) = isnothing(optimizer.solver) function MOI.optimize!(optimizer::Optimizer) - solution = optimizer.solver_module.solve!(optimizer.solver) + if(optimizer.solver_module === Clarabel) + solution = Clarabel.solve!(optimizer.solver) + else + solution = optimizer.solver_module.solve!(optimizer.solver) + end optimizer.solver_solution = solution optimizer.solver_info = optimizer.solver_module.get_info(optimizer.solver) nothing diff --git a/src/precompile.jl b/src/precompile.jl new file mode 100644 index 00000000..a0fdced4 --- /dev/null +++ b/src/precompile.jl @@ -0,0 +1,76 @@ +using MathOptInterface + +function __precompile_native() + cones = [ + Clarabel.NonnegativeConeT(1), + Clarabel.ZeroConeT(1), + Clarabel.SecondOrderConeT(2), + Clarabel.ExponentialConeT(), + Clarabel.PowerConeT(0.5), + Clarabel.PSDTriangleConeT(1) + ]; + nvars = sum(Clarabel.nvars.(cones)) + P = A = sparse(I(nvars)*1.) + b = c = ones(nvars) + settings = Clarabel.Settings(verbose=false,max_iter = 1) + solver = Clarabel.Solver(P,c,A,b,cones,settings) + Clarabel.solve!(solver) +end + +function __precompile_moi() + + MOI = MathOptInterface + + model = MOI.Utilities.CachingOptimizer( + MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), + MOI.instantiate(Clarabel.Optimizer; with_bridge_type = Float64), + ) + MOI.set(model, MOI.Silent(), true) + MOI.set(model,MOI.RawOptimizerAttribute("max_iter"),1) + + # variables + x = MOI.add_variables(model, 3) + y, _ = MOI.add_constrained_variables(model, MOI.Nonnegatives(2)) + z = MOI.add_variable(model) + MOI.supports(model, MOI.VariableName(), typeof(x[1])) + MOI.set(model, MOI.VariableName(), x[1], "x1") + f = 1.0*x[1] + x[2] + x[3] + + # constraints + MOI.add_constraint(model, x, MOI.Nonnegatives(3)) + MOI.add_constraint(model, x, MOI.Zeros(3)) + MOI.add_constraint(model, x, MOI.SecondOrderCone(3)) + MOI.add_constraint(model, x, MOI.ExponentialCone()) + MOI.add_constraint(model, x, MOI.PowerCone(0.5)) + MOI.add_constraint(model, x, MOI.PositiveSemidefiniteConeTriangle(2)) + + for (i,C) in enumerate((MOI.GreaterThan,MOI.LessThan,MOI.EqualTo)) + for F in (MOI.VariableIndex, MOI.ScalarAffineFunction{Float64}) + MOI.supports_constraint(model, F, C) + end + MOI.add_constraint(model, x[i], C(0.0)) + MOI.add_constraint(model, f, C(0.0)) + end + + c = MOI.add_constraint(model, f, MOI.GreaterThan(0.0)) + MOI.supports(model, MOI.ConstraintName(), typeof(c)) + MOI.set(model, MOI.ConstraintName(), c, "c") + for (F, S) in MOI.get(model, MOI.ListOfConstraintTypesPresent()) + MOI.get(model, MOI.ListOfConstraintIndices{F, S}()) + end + + # objectives + f = f + 1.0*x[1]*x[1]; + MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) + MOI.supports(model, MOI.ObjectiveFunction{typeof(f)}()) + MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f) + + # solve and output + MOI.optimize!(model) + MOI.get(model, MOI.TerminationStatus()) + MOI.get(model, MOI.PrimalStatus()) + MOI.get(model, MOI.DualStatus()) + MOI.get(model, MOI.VariablePrimal(), x) + +end + From 94973a5fb704e7d2ffc6ca2dcf6d0a1cc96d9d6d Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Sun, 12 Mar 2023 23:28:27 +0000 Subject: [PATCH 4/9] minor mods --- src/MOI_wrapper/MOI_wrapper.jl | 4 ++-- src/precompile.jl | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/MOI_wrapper/MOI_wrapper.jl b/src/MOI_wrapper/MOI_wrapper.jl index 437ed304..b5132795 100644 --- a/src/MOI_wrapper/MOI_wrapper.jl +++ b/src/MOI_wrapper/MOI_wrapper.jl @@ -134,9 +134,9 @@ function MOI.empty!(optimizer::Optimizer{T}) where {T} optimizer.rowranges = Dict{Int, UnitRange{Int}}() end -MOI.is_empty(optimizer::Optimizer) = isnothing(optimizer.solver) +MOI.is_empty(optimizer::Optimizer{T}) where {T} = isnothing(optimizer.solver) -function MOI.optimize!(optimizer::Optimizer) +function MOI.optimize!(optimizer::Optimizer{T}) where {T} if(optimizer.solver_module === Clarabel) solution = Clarabel.solve!(optimizer.solver) else diff --git a/src/precompile.jl b/src/precompile.jl index a0fdced4..93f07b3b 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -14,7 +14,7 @@ function __precompile_native() b = c = ones(nvars) settings = Clarabel.Settings(verbose=false,max_iter = 1) solver = Clarabel.Solver(P,c,A,b,cones,settings) - Clarabel.solve!(solver) + Clarabel.solve!(solver); end function __precompile_moi() @@ -60,9 +60,10 @@ function __precompile_moi() end # objectives - f = f + 1.0*x[1]*x[1]; + f = f + 1.0*x[1]*x[1] + x[2]; MOI.set(model, MOI.ObjectiveSense(), MOI.MIN_SENSE) MOI.supports(model, MOI.ObjectiveFunction{typeof(f)}()) + MOI.set(model, MOI.ObjectiveFunction{typeof(x[1])}(), x[1]) MOI.set(model, MOI.ObjectiveFunction{typeof(f)}(), f) # solve and output @@ -70,7 +71,7 @@ function __precompile_moi() MOI.get(model, MOI.TerminationStatus()) MOI.get(model, MOI.PrimalStatus()) MOI.get(model, MOI.DualStatus()) - MOI.get(model, MOI.VariablePrimal(), x) + MOI.get(model, MOI.VariablePrimal(), x); end From 5280ff4d3ae57010132f363aa51985a068f0d4ee Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Mon, 13 Mar 2023 09:03:11 +0000 Subject: [PATCH 5/9] capture printfs in precompile --- src/Clarabel.jl | 8 +++++--- src/precompile.jl | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Clarabel.jl b/src/Clarabel.jl index 2b64d8b1..f2ada3b0 100644 --- a/src/Clarabel.jl +++ b/src/Clarabel.jl @@ -89,9 +89,11 @@ module Clarabel #precompile minimal MOI / native examples using SnoopPrecompile include("./precompile.jl") - SnoopPrecompile.@precompile_all_calls begin - __precompile_native() - __precompile_moi() + redirect_stdout(devnull) do; + SnoopPrecompile.@precompile_all_calls begin + __precompile_native() + __precompile_moi() + end end diff --git a/src/precompile.jl b/src/precompile.jl index 93f07b3b..1ca42422 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -12,7 +12,7 @@ function __precompile_native() nvars = sum(Clarabel.nvars.(cones)) P = A = sparse(I(nvars)*1.) b = c = ones(nvars) - settings = Clarabel.Settings(verbose=false,max_iter = 1) + settings = Clarabel.Settings(max_iter = 1) solver = Clarabel.Solver(P,c,A,b,cones,settings) Clarabel.solve!(solver); end @@ -25,7 +25,7 @@ function __precompile_moi() MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), MOI.instantiate(Clarabel.Optimizer; with_bridge_type = Float64), ) - MOI.set(model, MOI.Silent(), true) + MOI.set(model, MOI.Silent(), false) #module will redirect to devnull MOI.set(model,MOI.RawOptimizerAttribute("max_iter"),1) # variables From d4a931f14775e3ceccf5c43fefc06fc3d45b4b45 Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Mon, 13 Mar 2023 10:36:42 +0000 Subject: [PATCH 6/9] modified printing calls --- src/Clarabel.jl | 4 ++-- src/info_print.jl | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Clarabel.jl b/src/Clarabel.jl index f2ada3b0..f0c8ed4c 100644 --- a/src/Clarabel.jl +++ b/src/Clarabel.jl @@ -89,12 +89,12 @@ module Clarabel #precompile minimal MOI / native examples using SnoopPrecompile include("./precompile.jl") - redirect_stdout(devnull) do; + #redirect_stdout(devnull) do; SnoopPrecompile.@precompile_all_calls begin __precompile_native() __precompile_moi() end - end + #end end #end module \ No newline at end of file diff --git a/src/info_print.jl b/src/info_print.jl index 005fa4eb..74e92a8e 100644 --- a/src/info_print.jl +++ b/src/info_print.jl @@ -33,7 +33,7 @@ function info_print_configuration( print_conedims_by_type(cones, PSDTriangleCone) print_conedims_by_type(cones, PowerCone) print_conedims_by_type(cones, ExponentialCone) - print_settings(settings, T) + print_settings(settings) @printf("\n") return nothing @@ -110,7 +110,7 @@ end -function print_settings(settings::Settings, T::DataType) +function print_settings(settings::Settings{T}) where {T} set = settings @printf("\nsettings:\n") @@ -168,7 +168,7 @@ get_precision_string(T::Type{<:Real}) = string(T) get_precision_string(T::Type{<:BigFloat}) = string(T," (", precision(T), " bit)") -function print_conedims_by_type(cones::CompositeCone{T}, type) where {T} +function print_conedims_by_type(cones::CompositeCone{T}, type::Type) where {T} maxlistlen = 5 @@ -180,7 +180,7 @@ function print_conedims_by_type(cones::CompositeCone{T}, type) where {T} return #don't report if none end - nvars = map(K->Clarabel.numel(K), cones[isa.(cones,type)]) + nvars = Int64[Clarabel.numel(K) for K in cones[isa.(cones,type)]] name = rpad(string(nameof(type))[1:end-4],11) #drops "Cone" part @printf(" : %s = %i, ", name, count) From 79339393b33706fda16331b04a8bd77011934fd5 Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Mon, 13 Mar 2023 12:56:52 +0000 Subject: [PATCH 7/9] improve print precompiling --- src/Clarabel.jl | 6 +- src/info_print.jl | 154 +++++++++++++++++++++++++--------------------- src/precompile.jl | 44 ++++++++++++- 3 files changed, 129 insertions(+), 75 deletions(-) diff --git a/src/Clarabel.jl b/src/Clarabel.jl index f0c8ed4c..f5de85e3 100644 --- a/src/Clarabel.jl +++ b/src/Clarabel.jl @@ -89,12 +89,12 @@ module Clarabel #precompile minimal MOI / native examples using SnoopPrecompile include("./precompile.jl") - #redirect_stdout(devnull) do; + redirect_stdout(devnull) do; SnoopPrecompile.@precompile_all_calls begin __precompile_native() __precompile_moi() end - #end - + end + __precompile_printfcns() end #end module \ No newline at end of file diff --git a/src/info_print.jl b/src/info_print.jl index 74e92a8e..598fffbf 100644 --- a/src/info_print.jl +++ b/src/info_print.jl @@ -1,16 +1,20 @@ -function print_banner(verbose::Bool) +function print_banner(io::IO, verbose::Bool) if !verbose return; end - println("-------------------------------------------------------------") - @printf(" Clarabel.jl v%s - Clever Acronym \n", version()) - println(" (c) Paul Goulart ") - println(" University of Oxford, 2022 ") - println("-------------------------------------------------------------") + println(io, "-------------------------------------------------------------") + @printf(io, " Clarabel.jl v%s - Clever Acronym \n", version()) + println(io, " (c) Paul Goulart ") + println(io, " University of Oxford, 2022 ") + println(io, "-------------------------------------------------------------") end +print_banner(verbose) = print_banner(stdout,verbose) + + function info_print_configuration( + io::IO, info::DefaultInfo{T}, - settings::Settings, + settings::Settings{T}, data::DefaultProblemData{T}, cones::CompositeCone{T} ) where {T} @@ -18,90 +22,98 @@ function info_print_configuration( if(settings.verbose == false) return end if(is_reduced(data.presolver)) - @printf("\npresolve: removed %i constraints\n", count_reduced(data.presolver)) + @printf(io, "\npresolve: removed %i constraints\n", count_reduced(data.presolver)) end - @printf("\nproblem:\n") - @printf(" variables = %i\n", data.n) - @printf(" constraints = %i\n", data.m) - @printf(" nnz(P) = %i\n", nnz(data.P)) - @printf(" nnz(A) = %i\n", nnz(data.A)) - @printf(" cones (total) = %i\n", length(cones)) - print_conedims_by_type(cones, ZeroCone) - print_conedims_by_type(cones, NonnegativeCone) - print_conedims_by_type(cones, SecondOrderCone) - print_conedims_by_type(cones, PSDTriangleCone) - print_conedims_by_type(cones, PowerCone) - print_conedims_by_type(cones, ExponentialCone) - print_settings(settings) - @printf("\n") + @printf(io, "\nproblem:\n") + @printf(io, " variables = %i\n", data.n) + @printf(io, " constraints = %i\n", data.m) + @printf(io, " nnz(P) = %i\n", nnz(data.P)) + @printf(io, " nnz(A) = %i\n", nnz(data.A)) + @printf(io, " cones (total) = %i\n", length(cones)) + print_conedims_by_type(io, cones, ZeroCone) + print_conedims_by_type(io, cones, NonnegativeCone) + print_conedims_by_type(io, cones, SecondOrderCone) + print_conedims_by_type(io, cones, PSDTriangleCone) + print_conedims_by_type(io, cones, PowerCone) + print_conedims_by_type(io, cones, ExponentialCone) + print_settings(io, settings) + @printf(io, "\n") return nothing end +info_print_configuration(info,settings,data,cones) = info_print_configuration(stdout,info,settings,data,cones) + function info_print_status_header( + io::IO, info::DefaultInfo{T}, - settings::Settings, + settings::Settings{T}, ) where {T} if(settings.verbose == false) return end #print a subheader for the iterations info - @printf("%s", "iter ") - @printf("%s", "pcost ") - @printf("%s", "dcost ") - @printf("%s", "gap ") - @printf("%s", "pres ") - @printf("%s", "dres ") - @printf("%s", "k/t ") - @printf("%s", " μ ") - @printf("%s", "step ") - @printf("\n") - println("---------------------------------------------------------------------------------------------") + @printf(io, "%s", "iter ") + @printf(io, "%s", "pcost ") + @printf(io, "%s", "dcost ") + @printf(io, "%s", "gap ") + @printf(io, "%s", "pres ") + @printf(io, "%s", "dres ") + @printf(io, "%s", "k/t ") + @printf(io, "%s", " μ ") + @printf(io, "%s", "step ") + @printf(io, "\n") + println(io, "---------------------------------------------------------------------------------------------") return nothing end +info_print_status_header(info, settings) = info_print_status_header(stdout,info,settings) function info_print_status( + io::IO, info::DefaultInfo{T}, settings::Settings ) where {T} if(settings.verbose == false) return end - @printf("%3d ", info.iterations) - @printf("% .4e ", info.cost_primal) - @printf("% .4e ", info.cost_dual) - @printf("%.2e ", min(info.gap_abs,info.gap_rel)) - @printf("%.2e ", info.res_primal) - @printf("%.2e ", info.res_dual) - @printf("%.2e ", info.ktratio) - @printf("%.2e ", info.μ) + @printf(io, "%3d ", info.iterations) + @printf(io, "% .4e ", info.cost_primal) + @printf(io, "% .4e ", info.cost_dual) + @printf(io, "%.2e ", min(info.gap_abs,info.gap_rel)) + @printf(io, "%.2e ", info.res_primal) + @printf(io, "%.2e ", info.res_dual) + @printf(io, "%.2e ", info.ktratio) + @printf(io, "%.2e ", info.μ) if(info.iterations > 0) - @printf("%.2e ", info.step_length) + @printf(io, "%.2e ", info.step_length) else - @printf(" ------ ") #info.step_length + @printf(io, " ------ ") #info.step_length end - @printf("\n") + @printf(io, "\n") return nothing end +info_print_status(info,settings) = info_print_status(stdout,info,settings) function info_print_footer( + io::IO, info::DefaultInfo{T}, settings::Settings ) where {T} if(settings.verbose == false) return end - println("---------------------------------------------------------------------------------------------") - @printf("Terminated with status = %s\n",SolverStatusDict[info.status]) - @printf("solve time = %s\n",TimerOutputs.prettytime(info.solve_time*1e9)) + println(io, "---------------------------------------------------------------------------------------------") + @printf(io, "Terminated with status = %s\n",SolverStatusDict[info.status]) + @printf(io, "solve time = %s\n",TimerOutputs.prettytime(info.solve_time*1e9)) return nothing end +info_print_footer(info,settings) = info_print_footer(stdout,info,settings) function bool_on_off(v::Bool) @@ -109,66 +121,66 @@ function bool_on_off(v::Bool) end - -function print_settings(settings::Settings{T}) where {T} +function print_settings(io::IO, settings::Settings{T}) where {T} set = settings - @printf("\nsettings:\n") + @printf(io, "\nsettings:\n") if(set.direct_kkt_solver) - @printf(" linear algebra: direct / %s, precision: %s\n", set.direct_solve_method, get_precision_string(T)) + @printf(io, " linear algebra: direct / %s, precision: %s\n", set.direct_solve_method, get_precision_string(T)) end - @printf(" max iter = %i, time limit = %f, max step = %.3f\n", + @printf(io, " max iter = %i, time limit = %f, max step = %.3f\n", set.max_iter, set.time_limit, set.max_step_fraction, ) # - @printf(" tol_feas = %0.1e, tol_gap_abs = %0.1e, tol_gap_rel = %0.1e,\n", + @printf(io, " tol_feas = %0.1e, tol_gap_abs = %0.1e, tol_gap_rel = %0.1e,\n", set.tol_feas, set.tol_gap_abs, set.tol_gap_rel ) - @printf(" static reg : %s, ϵ1 = %0.1e, ϵ2 = %0.1e\n", + @printf(io, " static reg : %s, ϵ1 = %0.1e, ϵ2 = %0.1e\n", bool_on_off(set.static_regularization_enable), set.static_regularization_constant, set.static_regularization_proportional, ) # - @printf(" dynamic reg: %s, ϵ = %0.1e, δ = %0.1e\n", + @printf(io, " dynamic reg: %s, ϵ = %0.1e, δ = %0.1e\n", bool_on_off(set.dynamic_regularization_enable), set.dynamic_regularization_eps, set.dynamic_regularization_delta ) - @printf(" iter refine: %s, reltol = %0.1e, abstol = %0.1e, \n", + @printf(io, " iter refine: %s, reltol = %0.1e, abstol = %0.1e, \n", bool_on_off(set.iterative_refinement_enable), set.iterative_refinement_reltol, set.iterative_refinement_abstol ) - @printf(" max iter = %d, stop ratio = %.1f\n", + @printf(io, " max iter = %d, stop ratio = %.1f\n", set.iterative_refinement_max_iter, set.iterative_refinement_stop_ratio ) - @printf(" equilibrate: %s, min_scale = %0.1e, max_scale = %0.1e\n", + @printf(io, " equilibrate: %s, min_scale = %0.1e, max_scale = %0.1e\n", bool_on_off(set.equilibrate_enable), set.equilibrate_min_scaling, set.equilibrate_max_scaling ) - @printf(" max iter = %d\n", + @printf(io, " max iter = %d\n", set.equilibrate_max_iter, ) return nothing end + get_precision_string(T::Type{<:Real}) = string(T) get_precision_string(T::Type{<:BigFloat}) = string(T," (", precision(T), " bit)") -function print_conedims_by_type(cones::CompositeCone{T}, type::Type) where {T} +function print_conedims_by_type(io::IO, cones::CompositeCone{T}, type::Type) where {T} maxlistlen = 5 @@ -182,25 +194,25 @@ function print_conedims_by_type(cones::CompositeCone{T}, type::Type) where {T} nvars = Int64[Clarabel.numel(K) for K in cones[isa.(cones,type)]] name = rpad(string(nameof(type))[1:end-4],11) #drops "Cone" part - @printf(" : %s = %i, ", name, count) + @printf(io, " : %s = %i, ", name, count) if count == 1 - @printf(" numel = %i",nvars[1]) + @printf(io, " numel = %i",nvars[1]) elseif count <= maxlistlen #print them all - @printf(" numel = (") - foreach(x->@printf("%i,",x),nvars[1:end-1]) - @printf("%i)",nvars[end]) + @printf(io, " numel = (") + foreach(x->@printf(io, "%i,",x),nvars[1:end-1]) + @printf(io, "%i)",nvars[end]) else #print first (maxlistlen-1) and the final one - @printf(" numel = (") - foreach(x->@printf("%i,",x),nvars[1:(maxlistlen-1)]) - @printf("...,%i)",nvars[end]) + @printf(io, " numel = (") + foreach(x->@printf(io, "%i,",x),nvars[1:(maxlistlen-1)]) + @printf(io, "...,%i)",nvars[end]) end - @printf("\n") - + @printf(io, "\n") end + diff --git a/src/precompile.jl b/src/precompile.jl index 1ca42422..7f630cee 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,5 +1,47 @@ using MathOptInterface +function __precompile_printfcns() + + # Verbose printing of SnoopPrecompile examples is disabled, + # so force precompile of solver print statements here by + # providing necessary signatures. + + # NB: It is not sufficient to wrap the SnoopPrecompile + # block inside a redirect_stdout(..), since then all of + # the println and @printf calls get compiled with signatures + # like println(io::Base.DevNull,...) + + stdoutT = typeof(stdout) + + precompile(Clarabel.print_banner, (Bool,)) + precompile(Clarabel.print_settings, + (stdoutT, Clarabel.Settings{Float64},) + ) + + precompile(Clarabel.info_print_configuration, + ( + stdoutT, + Clarabel.DefaultInfo{Float64}, + Clarabel.Settings{Float64}, + Clarabel.DefaultProblemData{Float64}, + Clarabel.CompositeCone{Float64}, + ) + ) + + for fcn in (Clarabel.info_print_status_header, + Clarabel.info_print_status, + Clarabel.info_print_footer) + precompile(fcn, + ( + stdoutT, + Clarabel.DefaultInfo{Float64}, + Clarabel.Settings{Float64}, + ) + ) + end + +end + function __precompile_native() cones = [ Clarabel.NonnegativeConeT(1), @@ -25,7 +67,7 @@ function __precompile_moi() MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()), MOI.instantiate(Clarabel.Optimizer; with_bridge_type = Float64), ) - MOI.set(model, MOI.Silent(), false) #module will redirect to devnull + MOI.set(model, MOI.Silent(), false) MOI.set(model,MOI.RawOptimizerAttribute("max_iter"),1) # variables From 6d09f1f746df603ed20a9dd4a575219aa96c4f9f Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Mon, 13 Mar 2023 15:18:56 +0000 Subject: [PATCH 8/9] drop unneeded enumerate --- src/kktsolvers/direct-ldl/directldl_utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kktsolvers/direct-ldl/directldl_utils.jl b/src/kktsolvers/direct-ldl/directldl_utils.jl index 16c63945..9cd3e3aa 100644 --- a/src/kktsolvers/direct-ldl/directldl_utils.jl +++ b/src/kktsolvers/direct-ldl/directldl_utils.jl @@ -41,7 +41,7 @@ struct LDLDataMap SOC_v = Vector{Vector{Int}}(undef,nsoc) count = 1 - for (i,cone) in enumerate(cones) + for cone in enumerate(cones) if isa(cone,Clarabel.SecondOrderCone) SOC_u[count] = Vector{Int}(undef,numel(cone)) SOC_v[count] = Vector{Int}(undef,numel(cone)) From 866bf12b5e84bf9519055f4563b1680cace8f757 Mon Sep 17 00:00:00 2001 From: goulart-paul Date: Mon, 13 Mar 2023 16:02:38 +0000 Subject: [PATCH 9/9] fix thing I broke --- src/kktsolvers/direct-ldl/directldl_utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kktsolvers/direct-ldl/directldl_utils.jl b/src/kktsolvers/direct-ldl/directldl_utils.jl index 9cd3e3aa..616b670d 100644 --- a/src/kktsolvers/direct-ldl/directldl_utils.jl +++ b/src/kktsolvers/direct-ldl/directldl_utils.jl @@ -41,7 +41,7 @@ struct LDLDataMap SOC_v = Vector{Vector{Int}}(undef,nsoc) count = 1 - for cone in enumerate(cones) + for cone in cones if isa(cone,Clarabel.SecondOrderCone) SOC_u[count] = Vector{Int}(undef,numel(cone)) SOC_v[count] = Vector{Int}(undef,numel(cone))