From b0b6b9b2dcba86b1c4c210cc82c7a080949a6c1c Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Tue, 9 Jan 2024 14:24:43 -0600 Subject: [PATCH] Implement MIPLearn solution method --- Project.toml | 8 +- src/UnitCommitment.jl | 9 +++ src/solution/methods/MIPLearn/miplearn.jl | 71 ++++++++++++++++++ src/solution/methods/MIPLearn/structs.jl | 11 +++ test/Project.toml | 1 + test/fixtures/case14.json.gz.h5 | Bin 0 -> 28991 bytes test/src/UnitCommitmentT.jl | 3 + .../solution/methods/MIPLearn/usage_test.jl | 20 +++++ 8 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 src/solution/methods/MIPLearn/miplearn.jl create mode 100644 src/solution/methods/MIPLearn/structs.jl create mode 100644 test/fixtures/case14.json.gz.h5 create mode 100644 test/src/solution/methods/MIPLearn/usage_test.jl diff --git a/Project.toml b/Project.toml index 2a45202..c1b9ded 100644 --- a/Project.toml +++ b/Project.toml @@ -13,13 +13,15 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" +MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" PackageCompiler = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +Requires = "ae029012-a4dd-5104-9daa-d747884805df" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +Suppressor = "fd094767-a336-5f1f-9728-57cf17d0bbfb" TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" [compat] DataStructures = "0.18" @@ -27,8 +29,8 @@ Distributions = "0.25" GZip = "0.5" JSON = "0.21" JuMP = "1" -MathOptInterface = "1" MPI = "0.20" +MathOptInterface = "1" PackageCompiler = "1" +TimerOutputs = "0.5" julia = "1" -TimerOutputs = "0.5" \ No newline at end of file diff --git a/src/UnitCommitment.jl b/src/UnitCommitment.jl index d46d71e..d447228 100644 --- a/src/UnitCommitment.jl +++ b/src/UnitCommitment.jl @@ -4,6 +4,8 @@ module UnitCommitment +using Requires + using Base: String include("instance/structs.jl") @@ -72,4 +74,11 @@ include("lmp/conventional.jl") include("lmp/aelmp.jl") include("market/market.jl") +function __init__() + @require MIPLearn = "2b1277c3-b477-4c49-a15e-7ba350325c68" begin + include("solution/methods/MIPLearn/structs.jl") + include("solution/methods/MIPLearn/miplearn.jl") + end +end + end diff --git a/src/solution/methods/MIPLearn/miplearn.jl b/src/solution/methods/MIPLearn/miplearn.jl new file mode 100644 index 0000000..dc4f8ba --- /dev/null +++ b/src/solution/methods/MIPLearn/miplearn.jl @@ -0,0 +1,71 @@ +# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using .MIPLearn +using Suppressor +using JuMP + +function _build_ucjl_model(instance, method) + if instance isa String + instance = UnitCommitment.read(instance) + end + model = UnitCommitment.build_model( + instance = instance, + optimizer = method.optimizer, + variable_names = true, + ) + write_to_file(model, "/tmp/model.lp") + return JumpModel(model) +end + +function _set_default_collectors!(method::MIPLearnMethod) + method.collectors = [BasicCollector()] + return +end + +function _set_default_solver!(method::MIPLearnMethod) + KNN = MIPLearn.pyimport("sklearn.neighbors").KNeighborsClassifier + method.solver = LearningSolver( + components = [ + MemorizingPrimalComponent( + clf = KNN(n_neighbors = 30), + extractor = H5FieldsExtractor( + instance_fields = ["static_var_obj_coeffs"], + ), + constructor = MergeTopSolutions(30, [0.0, 1.0]), + action = FixVariables(), + ), + ], + ) + return +end + +function collect!(filenames::Vector, method::MIPLearnMethod) + build(x) = _build_ucjl_model(x, method) + if method.collectors === nothing + _set_default_collectors!(method) + end + for c in method.collectors + c.collect(filenames, build) + end +end + +function fit!(filenames::Vector, method::MIPLearnMethod) + if method.solver === nothing + _set_default_solver!(method) + end + return method.solver.fit(filenames) +end + +function optimize!(filename::AbstractString, method::MIPLearnMethod) + build(x) = _build_ucjl_model(x, method) + method.solver.optimize(filename, build) + return +end + +function optimize!(instance::UnitCommitmentInstance, method::MIPLearnMethod) + model = _build_ucjl_model(instance, method) + method.solver.optimize(model) + return +end \ No newline at end of file diff --git a/src/solution/methods/MIPLearn/structs.jl b/src/solution/methods/MIPLearn/structs.jl new file mode 100644 index 0000000..893cee9 --- /dev/null +++ b/src/solution/methods/MIPLearn/structs.jl @@ -0,0 +1,11 @@ +# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using Suppressor + +Base.@kwdef mutable struct MIPLearnMethod + optimizer::Any + collectors::Any = nothing + solver::Any = nothing +end diff --git a/test/Project.toml b/test/Project.toml index 167e679..e326b64 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -13,6 +13,7 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" JuliaFormatter = "98e50ef6-434e-11e9-1051-2b60c6c9e899" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +MIPLearn = "2b1277c3-b477-4c49-a15e-7ba350325c68" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" diff --git a/test/fixtures/case14.json.gz.h5 b/test/fixtures/case14.json.gz.h5 new file mode 100644 index 0000000000000000000000000000000000000000..343902486130c977a0838e1098e57905fe7d9dcb GIT binary patch literal 28991 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%0D7uR<|c7%jX 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 literal 0 HcmV?d00001 diff --git a/test/src/UnitCommitmentT.jl b/test/src/UnitCommitmentT.jl index ae28329..f72b1e9 100644 --- a/test/src/UnitCommitmentT.jl +++ b/test/src/UnitCommitmentT.jl @@ -1,6 +1,7 @@ module UnitCommitmentT using JuliaFormatter +using MIPLearn using UnitCommitment using Test @@ -16,6 +17,7 @@ include("solution/methods/ProgressiveHedging/usage_test.jl") include("solution/methods/TimeDecomposition/initial_status_test.jl") include("solution/methods/TimeDecomposition/optimize_test.jl") include("solution/methods/TimeDecomposition/update_solution_test.jl") +include("solution/methods/MIPLearn/usage_test.jl") include("transform/initcond_test.jl") include("transform/slice_test.jl") include("transform/randomize/XavQiuAhm2021_test.jl") @@ -46,6 +48,7 @@ function runtests() solution_methods_TimeDecomposition_initial_status_test() solution_methods_TimeDecomposition_optimize_test() solution_methods_TimeDecomposition_update_solution_test() + solution_methods_MIPLearn_usage_test() transform_initcond_test() transform_slice_test() transform_randomize_XavQiuAhm2021_test() diff --git a/test/src/solution/methods/MIPLearn/usage_test.jl b/test/src/solution/methods/MIPLearn/usage_test.jl new file mode 100644 index 0000000..1abc98e --- /dev/null +++ b/test/src/solution/methods/MIPLearn/usage_test.jl @@ -0,0 +1,20 @@ +# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment +# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. +# Released under the modified BSD license. See COPYING.md for more details. + +using HiGHS + +function solution_methods_MIPLearn_usage_test() + dirname = mktempdir() + cp(fixture("case14.json.gz"), "$dirname/case14.json.gz") + train_data = ["$dirname/case14.json.gz"] + + method = UnitCommitment.MIPLearnMethod(optimizer = HiGHS.Optimizer) + UnitCommitment.collect!(train_data, method) + UnitCommitment.fit!(train_data, method) + UnitCommitment.optimize!(train_data[1], method) + + instance = UnitCommitment.read(train_data[1]) + UnitCommitment.optimize!(instance, method) + return +end