diff --git a/.github/workflows/format_check.yml b/.github/workflows/format_check.yml index 8e14535f..e90e24a7 100644 --- a/.github/workflows/format_check.yml +++ b/.github/workflows/format_check.yml @@ -20,8 +20,7 @@ jobs: using Pkg Pkg.add(PackageSpec(name="JuliaFormatter", version="2")) using JuliaFormatter - format("src", verbose=true) - format("test", verbose=true) + format("."; verbose = true) out = String(read(Cmd(`git diff`))) if isempty(out) exit(0) diff --git a/benchmark/Manifest.toml b/benchmark/Manifest.toml index 9efd0281..c3390186 100644 --- a/benchmark/Manifest.toml +++ b/benchmark/Manifest.toml @@ -1,335 +1,394 @@ # This file is machine-generated - editing it directly is not advised -[[ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - [[Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" [[BenchmarkTools]] -deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] -git-tree-sha1 = "4c10eee4af024676200bc7752e536f858c6b8f93" +deps = ["Compat", "JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "7fecfb1123b8d0232218e2da0c213004ff15358d" uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -version = "1.3.1" +version = "1.6.3" [[Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+0" - -[[Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "2dd813e5f2f7eec2d1268c57cf2373d3ee91fcea" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.15.1" - -[[ChangesOfVariables]] -deps = ["ChainRulesCore", "LinearAlgebra", "Test"] -git-tree-sha1 = "1e315e3f4b0b7ce40feded39c73049692126cf53" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.3" +version = "1.0.9+0" [[CodecBzip2]] -deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] -git-tree-sha1 = "2e62a725210ce3c3c2e1a3080190e7ca491f18d7" +deps = ["Bzip2_jll", "TranscodingStreams"] +git-tree-sha1 = "84990fa864b7f2b4901901ca12736e45ee79068c" uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" -version = "0.7.2" +version = "0.8.5" [[CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.0" +version = "0.7.8" [[CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" +version = "0.3.1" [[Compat]] -deps = ["Dates", "LinearAlgebra", "UUIDs"] -git-tree-sha1 = "924cdca592bc16f14d2f7006754a621735280b74" +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.1.0" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" [[CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.13" +version = "1.3.0+1" [[Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" [[DiffResults]] -deps = ["StaticArrays"] -git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.0.3" +version = "1.1.0" [[DiffRules]] deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "28d605d9a0ac17118fe2c5e9ce0fbb76c3ceb120" +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.11.0" +version = "1.15.1" [[DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.6" +version = "0.9.5" -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +[[ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" [[ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "2f18915445b248731ec5db4e4a17e451020bf21e" +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "eef4c86803f47dcb61e9b8790ecaa96956fdd8ae" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.30" +version = "1.3.2" + + [ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + + [ForwardDiff.weakdeps] + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[HiGHS]] +deps = ["HiGHS_jll", "LinearAlgebra", "MathOptIIS", "MathOptInterface", "OpenBLAS32_jll", "PrecompileTools", "SparseArrays"] +git-tree-sha1 = "900d431a604b096953437855a3d5fd03a18c3a6c" +uuid = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" +version = "1.21.1" + +[[HiGHS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Zlib_jll", "libblastrampoline_jll"] +git-tree-sha1 = "621d773f277b9eadac7e049eaa6418af65c7b9d7" +uuid = "8fd58aa0-07eb-5a78-9b36-339c94fd15ea" +version = "1.13.1+0" [[InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "b3364212fb5d870f724876ffcd34dd8ec6d98918" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.7" +version = "1.11.0" [[IrrationalConstants]] -git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.1.1" +version = "0.2.6" [[JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.4.1" +version = "1.7.1" [[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "b3ad4a0255688dcb895a52fafbaae3023b588a90" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.3" +version = "1.4.0" + + [JSON.extensions] + JSONArrowExt = ["ArrowTypes"] + + [JSON.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" [[JuMP]] -deps = ["Calculus", "DataStructures", "ForwardDiff", "LinearAlgebra", "MathOptInterface", "MutableArithmetics", "NaNMath", "OrderedCollections", "Printf", "SparseArrays", "SpecialFunctions"] -git-tree-sha1 = "936e7ebf6c84f0c0202b83bb22461f4ebc5c9969" +deps = ["LinearAlgebra", "MacroTools", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays"] +git-tree-sha1 = "8e4088727b5a130c12b1fedbc316306b6bbf2b9d" uuid = "4076af6c-e467-56ae-b986-b466b2749572" -version = "1.0.0" +version = "1.29.4" -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + [JuMP.extensions] + JuMPDimensionalDataExt = "DimensionalData" -[[LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + [JuMP.weakdeps] + DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" -[[LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +[[JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" +version = "1.12.0" [[Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" [[LinearAlgebra]] -deps = ["Libdl"] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" [[LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "09e4b894ce6a976c354a69041a04748180d43637" +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.15" +version = "0.3.29" + + [LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" [[Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" [[MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.9" +version = "0.5.16" [[Markdown]] -deps = ["Base64"] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[MathOptIIS]] +deps = ["MathOptInterface"] +git-tree-sha1 = "31d4a6353ea00603104f11384aa44dd8b7162b28" +uuid = "8c4f8055-bd93-4160-a86b-a0c04941dbff" +version = "0.1.1" [[MathOptInterface]] -deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] -git-tree-sha1 = "10d26d62dab815306bbd2c46eb52460e98f01e46" +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test"] +git-tree-sha1 = "7fb98657926ccb4de8f9bb96cda453700ca39a8b" uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "1.6.0" - -[[MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "1.49.0" [[MutableArithmetics]] deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "4e675d6e9ec02061800d6cfb695812becbd03cdf" +git-tree-sha1 = "22df8573f8e7c593ac205455ca088989d0a2c7a0" uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "1.0.4" +version = "1.6.7" [[NaNMath]] -git-tree-sha1 = "737a5957f387b17e74d4ad2f440eb330b39a62c5" +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.0.0" +version = "1.1.3" + +[[OpenBLAS32_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "46cce8b42186882811da4ce1f4c7208b02deb716" +uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" +version = "0.3.30+0" -[[NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +[[OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.29+0" [[OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.7+0" [[OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" +version = "0.5.6+0" [[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" +version = "1.8.1" + +[[ParameterJuMP]] +deps = ["JuMP", "MathOptInterface", "MutableArithmetics", "SparseArrays"] +git-tree-sha1 = "a7ea1d5263f9a3aa0670fbcc58c2cca275baa3fc" +uuid = "774612a8-9878-5177-865a-ca53ae2495f9" +version = "0.4.1" [[ParametricOptInterface]] deps = ["MathOptInterface"] -git-tree-sha1 = "4f0dfcc0c4f42c1baf4774ba9c0a397ae309c625" +path = ".." uuid = "0ce4ce61-57bf-432b-a095-efac525d185e" -version = "0.4.1" +version = "0.14.2" [[Parsers]] -deps = ["Dates"] -git-tree-sha1 = "0044b23da09b5608b4ecacb4e5e6c6332f833a7e" +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.3.2" +version = "2.8.3" -[[Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +[[PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.3.3" [[Preferences]] deps = ["TOML"] -git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" +git-tree-sha1 = "522f093a29b31a93e34eaea17ba055d850edea28" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.3.0" +version = "1.5.1" [[Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" [[Profile]] -deps = ["Printf"] +deps = ["StyledStrings"] uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" [[Random]] -deps = ["Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" [[SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" [[Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" [[SparseArrays]] -deps = ["LinearAlgebra", "Random"] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" [[SpecialFunctions]] -deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "d75bda01f8c31ebb72df80a46c88b25d1c79c56d" +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "5acc6a41b3082920f79ca3c759acbcecf18a8d78" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.1.7" +version = "2.7.1" -[[StaticArrays]] -deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] -git-tree-sha1 = "e972716025466461a3dc1588d9168334b71aafff" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.5.1" + [SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + + [SpecialFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" [[StaticArraysCore]] -git-tree-sha1 = "66fe9eb253f910fe8cf161953880cfdaef01cdf0" +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.0.1" +version = "1.4.4" [[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "28145feabf717c5d65c1d5e09747ee7b1ff3ed13" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.6.3" + + [StructUtils.extensions] + StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsTablesExt = ["Tables"] + + [StructUtils.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + +[[StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.8.3+2" [[TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.0.3" [[Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.29" + + [TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" [[TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c" +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.6" +version = "0.11.3" [[UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" [[Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" [[Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.3.1+2" -[[nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[p7zip_jll]] +[[libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.15.0+0" diff --git a/benchmark/Project.toml b/benchmark/Project.toml index 4e7a00ee..124b3824 100644 --- a/benchmark/Project.toml +++ b/benchmark/Project.toml @@ -1,5 +1,9 @@ [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +ParameterJuMP = "774612a8-9878-5177-865a-ca53ae2495f9" ParametricOptInterface = "0ce4ce61-57bf-432b-a095-efac525d185e" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" diff --git a/benchmark/run_benchmarks.jl b/benchmark/run_benchmarks.jl index bdc66680..f71a8a11 100644 --- a/benchmark/run_benchmarks.jl +++ b/benchmark/run_benchmarks.jl @@ -3,36 +3,35 @@ # Use of this source code is governed by an MIT-style license that can be found # in the LICENSE.md file or at https://opensource.org/licenses/MIT. -using MathOptInterface -using ParametricOptInterface using BenchmarkTools -const MOI = MathOptInterface -const POI = ParametricOptInterface + +import MathOptInterface as MOI +import ParametricOptInterface as POI import Pkg function moi_add_variables(N::Int) model = MOI.Utilities.Model{Float64}() MOI.add_variables(model, N) - return nothing + return end function poi_add_variables(N::Int) model = POI.Optimizer(MOI.Utilities.Model{Float64}()) MOI.add_variables(model, N) - return nothing + return end function poi_add_parameters(N::Int) model = POI.Optimizer(MOI.Utilities.Model{Float64}()) MOI.add_constrained_variable.(model, MOI.Parameter.(ones(N))) - return nothing + return end function poi_add_parameters_and_variables(N::Int) model = POI.Optimizer(MOI.Utilities.Model{Float64}()) MOI.add_variables(model, N / 2) MOI.add_constrained_variable.(model, MOI.Parameter.(ones(Int(N / 2)))) - return nothing + return end function poi_add_parameters_and_variables_alternating(N::Int) @@ -41,7 +40,7 @@ function poi_add_parameters_and_variables_alternating(N::Int) MOI.add_variable(model) MOI.add_constrained_variable(model, MOI.Parameter(1.0)) end - return nothing + return end function moi_add_saf_ctr(N::Int, M::Int) @@ -54,7 +53,7 @@ function moi_add_saf_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_saf_ctr(N::Int, M::Int) @@ -67,7 +66,7 @@ function poi_add_saf_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_saf_variables_and_parameters_ctr(N::Int, M::Int) @@ -86,7 +85,7 @@ function poi_add_saf_variables_and_parameters_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_saf_variables_and_parameters_ctr_parameter_update( @@ -110,7 +109,7 @@ function poi_add_saf_variables_and_parameters_ctr_parameter_update( end MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) - return nothing + return end function moi_add_sqf_variables_ctr(N::Int, M::Int) @@ -127,7 +126,7 @@ function moi_add_sqf_variables_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_sqf_variables_ctr(N::Int, M::Int) @@ -144,7 +143,7 @@ function poi_add_sqf_variables_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_sqf_variables_parameters_ctr(N::Int, M::Int) @@ -164,7 +163,7 @@ function poi_add_sqf_variables_parameters_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_sqf_variables_parameters_ctr_parameter_update(N::Int, M::Int) @@ -186,7 +185,7 @@ function poi_add_sqf_variables_parameters_ctr_parameter_update(N::Int, M::Int) end MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) - return nothing + return end function poi_add_sqf_parameters_parameters_ctr(N::Int, M::Int) @@ -206,7 +205,7 @@ function poi_add_sqf_parameters_parameters_ctr(N::Int, M::Int) MOI.GreaterThan(1.0), ) end - return nothing + return end function poi_add_sqf_parameters_parameters_ctr_parameter_update(N::Int, M::Int) @@ -228,7 +227,7 @@ function poi_add_sqf_parameters_parameters_ctr_parameter_update(N::Int, M::Int) end MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) - return nothing + return end function moi_add_saf_obj(N::Int, M::Int) @@ -241,7 +240,7 @@ function moi_add_saf_obj(N::Int, M::Int) MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(1.0, x), 0.0), ) end - return nothing + return end function poi_add_saf_obj(N::Int, M::Int) @@ -254,7 +253,7 @@ function poi_add_saf_obj(N::Int, M::Int) MOI.ScalarAffineFunction(MOI.ScalarAffineTerm.(1.0, x), 0.0), ) end - return nothing + return end function poi_add_saf_variables_and_parameters_obj(N::Int, M::Int) @@ -273,7 +272,7 @@ function poi_add_saf_variables_and_parameters_obj(N::Int, M::Int) ), ) end - return nothing + return end function poi_add_saf_variables_and_parameters_obj_parameter_update( @@ -299,7 +298,7 @@ function poi_add_saf_variables_and_parameters_obj_parameter_update( MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) end - return nothing + return end function moi_add_sqf_variables_obj(N::Int, M::Int) @@ -316,7 +315,7 @@ function moi_add_sqf_variables_obj(N::Int, M::Int) ), ) end - return nothing + return end function poi_add_sqf_variables_obj(N::Int, M::Int) @@ -333,7 +332,7 @@ function poi_add_sqf_variables_obj(N::Int, M::Int) ), ) end - return nothing + return end function poi_add_sqf_variables_parameters_obj(N::Int, M::Int) @@ -353,7 +352,7 @@ function poi_add_sqf_variables_parameters_obj(N::Int, M::Int) ), ) end - return nothing + return end function poi_add_sqf_variables_parameters_obj_parameter_update(N::Int, M::Int) @@ -377,7 +376,7 @@ function poi_add_sqf_variables_parameters_obj_parameter_update(N::Int, M::Int) MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) end - return nothing + return end function poi_add_sqf_parameters_parameters_obj(N::Int, M::Int) @@ -397,7 +396,7 @@ function poi_add_sqf_parameters_parameters_obj(N::Int, M::Int) ), ) end - return nothing + return end function poi_add_sqf_parameters_parameters_obj_parameter_update(N::Int, M::Int) @@ -421,7 +420,7 @@ function poi_add_sqf_parameters_parameters_obj_parameter_update(N::Int, M::Int) MOI.set.(model, POI.ParameterValue(), y, 0.5) POI.update_parameters!(model) end - return nothing + return end function run_benchmarks(N::Int, M::Int) @@ -519,7 +518,7 @@ function run_benchmarks(N::Int, M::Int) "Update parameters in SQF objective with product of parameters on a POI.Optimizer.", ) @btime poi_add_sqf_parameters_parameters_obj_parameter_update($N, $M) - return nothing + return end N = 10_000 diff --git a/benchmark/run_benchmarks_jump.jl b/benchmark/run_benchmarks_jump.jl index 877b2707..6feb9d37 100644 --- a/benchmark/run_benchmarks_jump.jl +++ b/benchmark/run_benchmarks_jump.jl @@ -3,11 +3,10 @@ # Use of this source code is governed by an MIT-style license that can be found # in the LICENSE.md file or at https://opensource.org/licenses/MIT. -using ParametricOptInterface using BenchmarkTools using JuMP -using LinearAlgebra -const POI = ParametricOptInterface + +import ParametricOptInterface as POI import Pkg function moi_add_variables(N::Int) @@ -18,7 +17,7 @@ function moi_add_variables(N::Int) ), ) @variable(model, x[i=1:N]) - return nothing + return end function poi_add_variables(N::Int) @@ -31,7 +30,7 @@ function poi_add_variables(N::Int) ), ) @variable(model, x[i=1:N]) - return nothing + return end function poi_add_parameters(N::Int) @@ -43,8 +42,8 @@ function poi_add_parameters(N::Int) ), ), ) - @variable(model, x[i=1:N] in MOI.Parameter(1.0)) - return nothing + @variable(model, x[i=1:N] in Parameter(1)) + return end function poi_add_parameters_and_variables(N::Int) @@ -56,8 +55,8 @@ function poi_add_parameters_and_variables(N::Int) ), ), ) - @variable(model, x[i=1:N] in MOI.Parameter(1.0)) - return nothing + @variable(model, x[i=1:N] in Parameter(1)) + return end function poi_add_parameters_and_variables_alternating(N::Int) @@ -71,9 +70,9 @@ function poi_add_parameters_and_variables_alternating(N::Int) ) for i in 1:Int(N/2) @variable(model) - @variable(model, set = MOI.Parameter(1.0)) + @variable(model, set = Parameter(1)) end - return nothing + return end function moi_add_saf_ctr(N::Int, M::Int) @@ -85,7 +84,7 @@ function moi_add_saf_ctr(N::Int, M::Int) ) @variable(model, x[i=1:N]) @constraint(model, cons[i=1:M], sum(x) >= 1) - return nothing + return end function poi_add_saf_ctr(N::Int, M::Int) @@ -99,7 +98,7 @@ function poi_add_saf_ctr(N::Int, M::Int) ) @variable(model, x[i=1:N]) @constraint(model, cons[i=1:M], sum(x) >= 1) - return nothing + return end function poi_add_saf_variables_and_parameters_ctr(N::Int, M::Int) @@ -112,9 +111,9 @@ function poi_add_saf_variables_and_parameters_ctr(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(0)) + @variable(model, p[i=1:Int(N/2)] in Parameter(0)) @constraint(model, con[i=1:M], sum(x) + sum(p) >= 1) - return nothing + return end function poi_add_saf_variables_and_parameters_ctr_parameter_update( @@ -130,11 +129,11 @@ function poi_add_saf_variables_and_parameters_ctr_parameter_update( ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(0)) + @variable(model, p[i=1:Int(N/2)] in Parameter(0)) @constraint(model, con[i=1:M], sum(x) + sum(p) >= 1) MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) - return nothing + return end function moi_add_sqf_variables_ctr(N::Int, M::Int) @@ -145,8 +144,8 @@ function moi_add_sqf_variables_ctr(N::Int, M::Int) ), ) @variable(model, x[i=1:N]) - @constraint(model, con[i=1:M], dot(x, x) >= 1) - return nothing + @constraint(model, con[i=1:M], x' * x >= 1) + return end function poi_add_sqf_variables_ctr(N::Int, M::Int) @@ -159,8 +158,8 @@ function poi_add_sqf_variables_ctr(N::Int, M::Int) ), ) @variable(model, x[i=1:N]) - @constraint(model, con[i=1:M], dot(x, x) >= 1) - return nothing + @constraint(model, con[i=1:M], x' * x >= 1) + return end function poi_add_sqf_variables_parameters_ctr(N::Int, M::Int) @@ -173,9 +172,9 @@ function poi_add_sqf_variables_parameters_ctr(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) - @constraint(model, con[i=1:M], dot(x, p) >= 1) - return nothing + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) + @constraint(model, con[i=1:M], x' * p >= 1) + return end function poi_add_sqf_variables_parameters_ctr_parameter_update(N::Int, M::Int) @@ -188,11 +187,11 @@ function poi_add_sqf_variables_parameters_ctr_parameter_update(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) - @constraint(model, con[i=1:M], dot(x, p) >= 1) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) + @constraint(model, con[i=1:M], x' * p >= 1) MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) - return nothing + return end function poi_add_sqf_parameters_parameters_ctr(N::Int, M::Int) @@ -205,9 +204,9 @@ function poi_add_sqf_parameters_parameters_ctr(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) - @constraint(model, con[i=1:M], dot(p, p) >= 1) - return nothing + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) + @constraint(model, con[i=1:M], p' * p >= 1) + return end function poi_add_sqf_parameters_parameters_ctr_parameter_update(N::Int, M::Int) @@ -220,11 +219,11 @@ function poi_add_sqf_parameters_parameters_ctr_parameter_update(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) - @constraint(model, con[i=1:M], dot(p, p) >= 1) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) + @constraint(model, con[i=1:M], p' * p >= 1) MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) - return nothing + return end function moi_add_saf_obj(N::Int, M::Int) @@ -236,7 +235,7 @@ function moi_add_saf_obj(N::Int, M::Int) ) @variable(model, x[i=1:N]) @objective(model, Min, sum(x)) - return nothing + return end function poi_add_saf_obj(N::Int, M::Int) @@ -252,7 +251,7 @@ function poi_add_saf_obj(N::Int, M::Int) for _ in 1:M @objective(model, Min, sum(x)) end - return nothing + return end function poi_add_saf_variables_and_parameters_obj(N::Int, M::Int) @@ -265,11 +264,11 @@ function poi_add_saf_variables_and_parameters_obj(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M @objective(model, Min, sum(x) + sum(p)) end - return nothing + return end function poi_add_saf_variables_and_parameters_obj_parameter_update( @@ -285,7 +284,7 @@ function poi_add_saf_variables_and_parameters_obj_parameter_update( ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M @objective(model, Min, sum(x) + sum(p)) end @@ -293,7 +292,7 @@ function poi_add_saf_variables_and_parameters_obj_parameter_update( MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) end - return nothing + return end function moi_add_sqf_variables_obj(N::Int, M::Int) @@ -305,9 +304,9 @@ function moi_add_sqf_variables_obj(N::Int, M::Int) ) @variable(model, x[i=1:N]) for _ in 1:M - @objective(model, Min, dot(x, x)) + @objective(model, Min, x' * x) end - return nothing + return end function poi_add_sqf_variables_obj(N::Int, M::Int) @@ -321,9 +320,9 @@ function poi_add_sqf_variables_obj(N::Int, M::Int) ) @variable(model, x[i=1:N]) for _ in 1:M - @objective(model, Min, dot(x, x)) + @objective(model, Min, x' * x) end - return nothing + return end function poi_add_sqf_variables_parameters_obj(N::Int, M::Int) @@ -336,11 +335,11 @@ function poi_add_sqf_variables_parameters_obj(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M - @objective(model, Min, dot(x, p)) + @objective(model, Min, x' * p) end - return nothing + return end function poi_add_sqf_variables_parameters_obj_parameter_update(N::Int, M::Int) @@ -353,15 +352,15 @@ function poi_add_sqf_variables_parameters_obj_parameter_update(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M - @objective(model, Min, dot(x, p)) + @objective(model, Min, x' * p) end for _ in 1:M MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) end - return nothing + return end function poi_add_sqf_parameters_parameters_obj(N::Int, M::Int) @@ -374,11 +373,11 @@ function poi_add_sqf_parameters_parameters_obj(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M - @objective(model, Min, dot(p, p)) + @objective(model, Min, p' * p) end - return nothing + return end function poi_add_sqf_parameters_parameters_obj_parameter_update(N::Int, M::Int) @@ -391,15 +390,15 @@ function poi_add_sqf_parameters_parameters_obj_parameter_update(N::Int, M::Int) ), ) @variable(model, x[i=1:Int(N/2)]) - @variable(model, p[i=1:Int(N/2)] in MOI.Parameter.(1)) + @variable(model, p[i=1:Int(N/2)] in Parameter(1)) for _ in 1:M - @objective(model, Min, dot(p, p)) + @objective(model, Min, p' * p) end for _ in 1:M MOI.set.(model, POI.ParameterValue(), p, 0.5) POI.update_parameters!(backend(model)) end - return nothing + return end function run_benchmarks(N::Int, M::Int) @@ -497,7 +496,7 @@ function run_benchmarks(N::Int, M::Int) "Update parameters in SQF objective with product of parameters on a POI.Optimizer.", ) @btime poi_add_sqf_parameters_parameters_obj_parameter_update($N, $M) - return nothing + return end N = 10_000 diff --git a/benchmark/MOI_benchmarks.jl b/benchmark/run_benchmarks_pmedian.jl similarity index 54% rename from benchmark/MOI_benchmarks.jl rename to benchmark/run_benchmarks_pmedian.jl index 3dc91c22..c8ca1dbc 100644 --- a/benchmark/MOI_benchmarks.jl +++ b/benchmark/run_benchmarks_pmedian.jl @@ -3,25 +3,11 @@ # Use of this source code is governed by an MIT-style license that can be found # in the LICENSE.md file or at https://opensource.org/licenses/MIT. -push!(LOAD_PATH, "./src") -using ParametricOptInterface -using MathOptInterface -using HiGHS +import HiGHS +import MathOptInterface as MOI +import ParametricOptInterface as POI import Random -#using SparseArrays -using TimerOutputs - -const MOI = MathOptInterface -const POI = ParametricOptInterface -SOLVER = HiGHS - -if SOLVER == HiGHS - MAX_ITER_PARAM = "simplex_iteration_limit" -elseif SOLVER == Gurobi - MAX_ITER_PARAM = "IterationLimit" -elseif SOLVER == Xpress - MAX_ITER_PARAM = "LPITERLIMIT" -end +import TimerOutputs struct PMedianData num_facilities::Int @@ -117,7 +103,7 @@ function generate_poi_problem(model, data::PMedianData, add_parameters::Bool) if add_parameters d, cd = MOI.add_constrained_variable( model, - MOI.Parameter(data.num_facilities), + MOI.Parameter{Float64}(data.num_facilities), ) end @@ -128,7 +114,7 @@ function generate_poi_problem(model, data::PMedianData, add_parameters::Bool) MOI.ScalarAffineTerm.(1.0, vcat(facility_variables, d)), 0.0, ), - MOI.EqualTo{Float64}(0), + MOI.EqualTo{Float64}(0.0), ) else MOI.add_constraint( @@ -147,127 +133,54 @@ end function solve_moi( data::PMedianData, optimizer; - vector_version, params, - add_parameters = false, + add_parameters::Bool = false, ) - model = optimizer() + model = MOI.instantiate(optimizer) for (param, value) in params MOI.set(model, param, value) end - @timeit "generate" x, y = if vector_version - generate_poi_problem_vector(model, data, add_parameters) - else - generate_poi_problem(model, data, add_parameters) - end - @timeit "solve" MOI.optimize!(model) - return MOI.get(model, MOI.ObjectiveValue()) -end - -function POI_OPTIMIZER() - return POI.Optimizer(SOLVER.Optimizer) -end - -function solve_moi_loop( - data::PMedianData; - vector_version, - max_iters = Inf, - time_limit_sec = Inf, - loops, -) - params = [] - if isfinite(time_limit_sec) - push!(params, (MOI.TimeLimitSec(), time_limit_sec)) - end - if isfinite(max_iters) - push!(params, (MOI.RawOptimizerAttribute(MAX_ITER_PARAM), max_iters)) - end - push!(params, (MOI.Silent(), true)) - s_type = vector_version ? "vector" : "scalar" - - @timeit( - "$(SOLVER) MOI $(s_type)", - for _ in 1:loops - solve_moi( - data, - SOLVER.Optimizer(); - vector_version = vector_version, - params = params, - ) - end + TimerOutputs.@timeit( + "generate", + generate_poi_problem(model, data, add_parameters), ) + TimerOutputs.@timeit "solve" MOI.optimize!(model) + return MOI.get(model, MOI.TerminationStatus()) end -function solve_poi_no_params_loop( +function solve_moi_loop( + optimizer, + name, data::PMedianData; - vector_version, max_iters = Inf, time_limit_sec = Inf, loops, + kwargs..., ) - params = [] + params = Any[(MOI.Silent(), true)] if isfinite(time_limit_sec) push!(params, (MOI.TimeLimitSec(), time_limit_sec)) end if isfinite(max_iters) - push!(params, (MOI.RawOptimizerAttribute(MAX_ITER_PARAM), max_iters)) - end - push!(params, (MOI.Silent(), true)) - s_type = vector_version ? "vector" : "scalar" - @timeit( - "$(SOLVER) POI NO PARAMS $(s_type)", - for _ in 1:loops - solve_moi( - data, - POI_OPTIMIZER; - vector_version = vector_version, - params = params, - ) - end - ) -end - -function solve_poi_loop( - data::PMedianData; - vector_version, - max_iters = Inf, - time_limit_sec = Inf, - loops = 1, -) - params = [] - if isfinite(time_limit_sec) - push!(params, (MOI.TimeLimitSec(), time_limit_sec)) + push!( + params, + (MOI.RawOptimizerAttribute("simplex_iteration_limit"), max_iters), + ) end - if isfinite(max_iters) - push!(params, (MOI.RawOptimizerAttribute(MAX_ITER_PARAM), max_iters)) + TimerOutputs.@timeit "$name" for _ in 1:loops + solve_moi(data, optimizer; params, kwargs...) end - push!(params, (MOI.Silent(), true)) - s_type = vector_version ? "vector" : "scalar" - - @timeit( - "$(SOLVER) POI $(s_type)", - for _ in 1:loops - solve_moi( - data, - POI_OPTIMIZER; - vector_version = vector_version, - params = params, - add_parameters = true, - ) - end - ) + return end function run_benchmark(; num_facilities, num_customers, num_locations, - time_limit_sec, - max_iters, - loops, + kwargs..., ) Random.seed!(10) - reset_timer!() + TimerOutputs.reset_timer!() data = PMedianData( num_facilities, num_customers, @@ -275,35 +188,21 @@ function run_benchmark(; rand(num_customers) .* num_locations, ) GC.gc() - solve_moi_loop( - data, - vector_version = false, - max_iters = max_iters, - time_limit_sec = time_limit_sec, - loops = loops, - ) + solve_moi_loop(HiGHS.Optimizer, "HiGHS MOI NO PARAMS", data; kwargs...) GC.gc() - solve_poi_no_params_loop( - data, - vector_version = false, - max_iters = max_iters, - time_limit_sec = time_limit_sec, - loops = loops, - ) + solve_moi_loop("HiGHS POI NO PARAMS", data; kwargs...) do + return POI.Optimizer(HiGHS.Optimizer) + end GC.gc() - solve_poi_loop( - data, - vector_version = false, - max_iters = max_iters, - time_limit_sec = time_limit_sec, - loops = loops, - ) + solve_moi_loop("HiGHS POI", data; add_parameters = true, kwargs...) do + return POI.Optimizer(HiGHS.Optimizer) + end GC.gc() - print_timer() - return println() + TimerOutputs.print_timer() + return end -run_benchmark( +run_benchmark(; num_facilities = 100, num_customers = 100, num_locations = 100, @@ -312,7 +211,7 @@ run_benchmark( loops = 1, ) -run_benchmark( +run_benchmark(; num_facilities = 100, num_customers = 100, num_locations = 100, diff --git a/benchmark/run_benders_quantile_regression_benchmark.jl b/benchmark/run_benders_quantile_regression_benchmark.jl index dec633fb..10eb6197 100644 --- a/benchmark/run_benders_quantile_regression_benchmark.jl +++ b/benchmark/run_benders_quantile_regression_benchmark.jl @@ -3,40 +3,22 @@ # Use of this source code is governed by an MIT-style license that can be found # in the LICENSE.md file or at https://opensource.org/licenses/MIT. -import Pkg -Pkg.activate(@__DIR__) -Pkg.instantiate() - -using ParametricOptInterface -using MathOptInterface - -const POI = ParametricOptInterface -const MOI = MathOptInterface - -using ParameterJuMP using JuMP - -using HiGHS -const OPTIMIZER = HiGHS.Optimizer using TimerOutputs -using LinearAlgebra -using Random +import HiGHS +import MathOptInterface as MOI +import ParameterJuMP +import ParametricOptInterface as POI +import Random const N_Candidates = 200 const N_Observations = 2000 const N_Nodes = 200 - const Observations = 1:N_Observations const Candidates = 1:N_Candidates -const Nodes = 1:N_Nodes; - -#' Initialize a random number generator to keep results deterministic - -rng = Random.MersenneTwister(123); - -#' Building regressors (explanatory) sinusoids - +const Nodes = 1:N_Nodes +const rng = Random.MersenneTwister(123) const X = zeros(N_Candidates, N_Observations) const time = [obs / N_Observations * 1 for obs in Observations] for obs in Observations, cand in Candidates @@ -44,35 +26,23 @@ for obs in Observations, cand in Candidates f = cand X[cand, obs] = sin(2 * pi * f * t) end - -#' Define coefficients - β = zeros(N_Candidates) for i in Candidates if rand(rng) <= (1 - i / N_Candidates)^2 && i <= 100 β[i] = 4 * rand(rng) / i end end -# println("First coefs: $(β[1:min(10, N_Candidates)])") - const y = X' * β .+ 0.1 * randn(rng, N_Observations) function full_model_regression() - time_build = @elapsed begin # measure time to create a model - - # initialize a optimization model - full_model = direct_model(OPTIMIZER) - MOI.set(full_model, MOI.Silent(), true) - - # create optimization variables of the problem + time_build = @elapsed begin + full_model = direct_model(HiGHS.Optimizer) + set_silent(full_model) @variables(full_model, begin ɛ_up[Observations] >= 0 ɛ_dw[Observations] >= 0 β[1:N_Candidates] - # 0 <= β[Candidates] <= 8 end) - - # define constraints of the model @constraints( full_model, begin @@ -82,26 +52,20 @@ function full_model_regression() ɛ_dw[i] >= -sum(X[j, i] * β[j] for j in Candidates) + y[i] end ) - - # construct the objective function to be minimized @objective( full_model, Min, sum(ɛ_up[i] + ɛ_dw[i] for i in Observations) ) end - - # solve the problem time_solve = @elapsed optimize!(full_model) - println( "First coefficients in solution: $(value.(β)[1:min(10, N_Candidates)])", ) println("Objective value: $(objective_value(full_model))") println("Time in solve: $time_solve") println("Time in build: $time_build") - - return nothing + return end function ObsSet(K) @@ -110,52 +74,29 @@ function ObsSet(K) end function slave_model(PARAM, K) - - # initialize the JuMP model slave = if PARAM == 0 - # special constructor exported by ParameterJuMP - # to add the functionality to the model - Model(OPTIMIZER) + Model(HiGHS.Optimizer) elseif PARAM == 1 - # POI constructor - direct_model(POI.Optimizer(OPTIMIZER())) - # Model(() -> POI.ParametricOptimizer(OPTIMIZER())) + direct_model(POI.Optimizer(HiGHS.Optimizer)) else - # regular JuMP constructor - direct_model(OPTIMIZER()) + direct_model(HiGHS.Optimizer()) end - MOI.set(slave, MOI.Silent(), true) - - # Define local optimization variables for norm-1 error + set_silent(slave) @variables(slave, begin ɛ_up[ObsSet(K)] >= 0 ɛ_dw[ObsSet(K)] >= 0 end) - - # create the regression coefficient representation if PARAM == 0 - # here is the main constructor of the Parameter JuMP packages - # It will create model *parameters* instead of variables - # Variables are added to the optimization model, while parameters - # are not. Parameters are merged with LP problem constants and do not - # increase the model dimensions. - @variable(slave, β[i=1:N_Candidates] == 0, Param()) + @variable(slave, β[1:N_Candidates] == 0, ParameterJuMP.Param()) elseif PARAM == 1 - # Create parameters - @variable(slave, β[i=1:N_Candidates] in MOI.Parameter.(0.0)) + @variable(slave, β[1:N_Candidates] in Parameter(0)) else - # Create fixed variables @variables(slave, begin β[Candidates] β_fixed[1:N_Candidates] == 0 end) @constraint(slave, β_fix[i in Candidates], β[i] == β_fixed[i]) end - - # create local constraints - # Note that *parameter* algebra is implemented just like variables - # algebra. We can multiply parameters by constants, add parameters, - # sum parameters and variables and so on. @constraints( slave, begin @@ -165,160 +106,90 @@ function slave_model(PARAM, K) ɛ_dw[i] >= -sum(X[j, i] * β[j] for j in Candidates) + y[i] end ) - - # create local objective function @objective(slave, Min, sum(ɛ_up[i] + ɛ_dw[i] for i in ObsSet(K))) - - # return the correct group of parameters return (slave, β) end function master_model(PARAM) - master = Model(OPTIMIZER) + master = Model(HiGHS.Optimizer) + set_silent(master) @variables(master, begin ɛ[Nodes] >= 0 β[1:N_Candidates] end) - @objective(master, Min, sum(ɛ[i] for i in Nodes)) - sol = zeros(N_Candidates) - return (master, ɛ, β, sol) + @objective(master, Min, sum(ɛ)) + return (master, ɛ, β, zeros(N_Candidates)) end function master_solve(PARAM, master_model) - model = master_model[1] - β = master_model[3] + model, _, β, _ = master_model optimize!(model) return (value.(β), objective_value(model)) end function slave_solve(PARAM, model, master_solution) - β0 = master_solution[1] - slave = model[1] - - # The first step is to fix the values given by the master problem + β0, _ = master_solution + slave, β = model @timeit "fix" if PARAM == 0 - # ParameterJuMP: *parameters* can be set to new values and the optimization - # model will be automatically updated - β = model[2] set_value.(β, β0) elseif PARAM == 1 - # POI: assigning new values to *parameters* and the optimization - # model will be automatically updated - β = model[2] - MOI.set.(slave, POI.ParameterValue(), β, β0) + set_parameter_value.(β, β0) else - # JuMP: it is also possible to fix variables to new values - β_fixed = slave[:β_fixed] - fix.(β_fixed, β0) + fix.(slave[:β_fixed], β0) end - - # here the slave problem is solved @timeit "opt" optimize!(slave) - - # query dual variables, which are sensitivities - # They represent the subgradient (almost a derivative) - # of the objective function for infinitesimal variations - # of the constants in the linear constraints - @timeit "dual" if PARAM == 0 - # ParameterJuMP: we can query dual values of *parameters* - π = dual.(β) + @timeit "dual" π = if PARAM == 0 + dual.(β) elseif PARAM == 1 - # POI: we can query dual values of *parameters* - π = MOI.get.(slave, POI.ParameterDual(), β) + dual.(ParameterRef.(β)) else - # or, in pure JuMP, we query the duals form - # constraints that fix the values of our regression - # coefficients - π = dual.(slave[:β_fix]) + dual.(slave[:β_fix]) end - - # π2 = shadow_price.(β_fix) - # @show sum(π .- π2) obj = objective_value(slave) - rhs = obj - dot(π, β0) + rhs = obj - π' * β0 return (rhs, π, obj) end function master_add_cut(PARAM, master_model, cut_info, node) - master = master_model[1] - ɛ = master_model[2] - β = master_model[3] - - rhs = cut_info[1] - π = cut_info[2] - + master, ɛ, β, _ = master_model + rhs, π, _ = cut_info @constraint(master, ɛ[node] >= sum(π[j] * β[j] for j in Candidates) + rhs) + return end + function decomposed_model(PARAM; print_timer_outputs::Bool = true) - reset_timer!() # reset timer fo comparision + reset_timer!() time_init = @elapsed @timeit "Init" begin - # println("Initialize decomposed model") - - # Create the master problem with no cuts - # println("Build master problem") @timeit "Master" master = master_model(PARAM) - - # initialize solution for the regression coefficients in zero - # println("Build initial solution") @timeit "Sol" solution = (zeros(N_Candidates), Inf) best_sol = deepcopy(solution) - - # Create the slave problems - # println("Build slave problems") @timeit "Slaves" slaves = [slave_model(PARAM, i) for i in Candidates] - - # Save initial version of the slave problems and create - # the first set of cuts - # println("Build initial cuts") @timeit "Cuts" cuts = [slave_solve(PARAM, slaves[i], solution) for i in Candidates] end - - UB = +Inf - LB = -Inf - - # println("Initialize Iterative step") + LB, UB = -Inf, +Inf time_loop = @elapsed @timeit "Loop" for k in 1:80 - - # Add cuts generated from each slave problem to the master problem @timeit "add cuts" for i in Candidates master_add_cut(PARAM, master, cuts[i], i) end - - # Solve the master problem with the new set of cuts - # Obtain new solution candidate for the regression coefficients @timeit "solve master" solution = master_solve(PARAM, master) - - # Pass the new candidate solution to each of the slave problems - # Solve the slave problems and obtain cutting planes - # @show solution[2] @timeit "solve nodes" for i in Candidates cuts[i] = slave_solve(PARAM, slaves[i], solution) end - LB = solution[2] new_UB = sum(cuts[i][3] for i in Candidates) if new_UB <= UB best_sol = deepcopy(solution) end UB = min(UB, new_UB) - # println("Iter = $k, LB = $LB, UB = $UB") - if abs(UB - LB) / (abs(UB) + abs(LB)) < 0.05 - # println("Converged!") break end end - # println( - # "First coefficients in solution: $(solution[1][1:min(10, N_Candidates)])", - # ) - # println("Objective value: $(solution[2])") - # println("Time in loop: $time_loop") - # println("Time in init: $time_init") - - print_timer_outputs && print_timer() - + if print_timer_outputs + print_timer() + end return best_sol[1] end @@ -339,3 +210,5 @@ GC.gc() β3 = decomposed_model(2; print_timer_outputs = false); GC.gc() β3 = decomposed_model(2); + +nothing;