diff --git a/.gitattributes b/.gitattributes index 176a458..c5fe64a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,6 @@ * text=auto +*.bz2 diff=bz2 +*.gz diff=gzip +*.tar diff=tar +*.tar.bz2 diff=tar-bz2 +*.zip diff=zip diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 5c18f4a..35ab8db 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -1,14 +1,9 @@ name: Benchmark -on: - push: - paths-ignore: - - '**.csv' - - '**.md' - - '.git*' - - 'test/**' +on: push jobs: benchmark: runs-on: [self-hosted, benchmark] + if: "contains(github.event.head_commit.message, '[benchmark]')" timeout-minutes: 10080 steps: - uses: actions/checkout@v1 @@ -23,11 +18,11 @@ jobs: - name: Upload logs uses: actions/upload-artifact@v2 with: - name: logs + name: Logs path: benchmark/results/* - name: Upload tables & charts uses: actions/upload-artifact@v2 with: - name: tables + name: Tables path: benchmark/tables/* diff --git a/.github/workflows/tagbot.yml b/.github/workflows/tagbot.yml new file mode 100644 index 0000000..d77d3a0 --- /dev/null +++ b/.github/workflows/tagbot.yml @@ -0,0 +1,11 @@ +name: TagBot +on: + schedule: + - cron: 0 * * * * +jobs: + TagBot: + runs-on: ubuntu-latest + steps: + - uses: JuliaRegistries/TagBot@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 059da54..cbd0ab0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,9 +1,28 @@ name: Tests -on: push +on: + push: + paths: + - '**.jl' + - '**.toml' + pull_request: + paths: + - '**.jl' + - '**.toml' jobs: test: - runs-on: self-hosted + runs-on: ${{ matrix.os }} + strategy: + matrix: + julia-version: ['1.3', '1.4', '1'] + julia-arch: [x64, x86] + os: [ubuntu-latest, windows-latest, macOS-latest] + exclude: + - os: macOS-latest + julia-arch: x86 steps: - - uses: actions/checkout@v1 - - name: Run unit tests - run: julia --project=@. -e 'using Pkg; Pkg.test("UnitCommitment")' + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@latest + with: + version: ${{ matrix.julia-version }} + - uses: julia-actions/julia-buildpkg@latest + - uses: julia-actions/julia-runtest@latest diff --git a/.gitignore b/.gitignore index c612bda..45de1d3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.lastrun *.so *.mps +*.ipynb .ipy* benchmark/results benchmark/runs @@ -11,6 +12,5 @@ build instances/**/*.json instances/_source local -docs notebooks TODO.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ffad49..275bc7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # UnitCommitment.jl -### Version 0.1.0 (November 6, 2020) +### Version 0.1.1 (Nov 16, 2020) + +* Fixes to MATLAB and PGLIB-UC instances +* Add OR-LIB and Tejada19 instances +* Improve documentation + +### Version 0.1.0 (Nov 6, 2020) * Initial public release diff --git a/COPYING.md b/LICENSE.md similarity index 100% rename from COPYING.md rename to LICENSE.md diff --git a/Makefile b/Makefile index ac379c6..2587acf 100644 --- a/Makefile +++ b/Makefile @@ -4,11 +4,12 @@ JULIA := julia --color=yes --project=@. MKDOCS := ~/.local/bin/mkdocs -SRC_FILES := $(wildcard src/*.jl) $(wildcard test/*.jl) VERSION := 0.1 build/sysimage.so: src/sysimage.jl Project.toml Manifest.toml mkdir -p build + mkdir -p benchmark/results/test + cd benchmark; $(JULIA) --trace-compile=../build/precompile.jl run.jl test/case14.1.sol.json $(JULIA) src/sysimage.jl clean: @@ -18,14 +19,11 @@ docs: $(MKDOCS) build -d ../docs/$(VERSION)/ rm ../docs/$(VERSION)/*.ipynb -docs-push: - rsync -avP docs/ isoron@axavier.org:/www/axavier.org/projects/UnitCommitment.jl/ - install-deps-docs: pip install --user mkdocs mkdocs-cinder python-markdown-math test: build/sysimage.so @echo Running tests... - cd test; $(JULIA) --sysimage ../build/sysimage.so runtests.jl | tee ../build/test.log + $(JULIA) --sysimage build/sysimage.so -e 'using Pkg; Pkg.test("UnitCommitment")' | tee build/test.log -.PHONY: docs docs-push build test +.PHONY: docs test diff --git a/Manifest.toml b/Manifest.toml index 4368635..e2af6b0 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -88,9 +88,9 @@ version = "0.3.0" [[Compat]] deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "48608f94f3e1a755f65e7ef34684675bb3653030" +git-tree-sha1 = "a706ff10f1cd8dab94f59fd09c0e657db8e77ff0" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.21.0" +version = "3.23.0" [[CompilerSupportLibraries_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -100,9 +100,9 @@ version = "0.3.4+0" [[DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "db07bb22795762895b60e44d62b34b16c982a687" +git-tree-sha1 = "fb0aa371da91c1ff9dc7fbed6122d3e411420b9c" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.7" +version = "0.18.8" [[Dates]] deps = ["Printf"] @@ -135,10 +135,10 @@ uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" version = "0.8.3" [[Documenter]] -deps = ["Base64", "Dates", "DocStringExtensions", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] -git-tree-sha1 = "fb1ff838470573adc15c71ba79f8d31328f035da" +deps = ["Base64", "Dates", "DocStringExtensions", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] +git-tree-sha1 = "71e35e069daa9969b8af06cef595a1add76e0a11" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "0.25.2" +version = "0.25.3" [[ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "NaNMath", "Random", "SpecialFunctions", "StaticArrays"] @@ -146,24 +146,6 @@ git-tree-sha1 = "1d090099fb82223abc48f7ce176d3f7696ede36d" uuid = "f6369f11-7733-5829-9624-2563aa707210" version = "0.10.12" -[[GLPK]] -deps = ["BinaryProvider", "Libdl", "MathOptInterface", "SparseArrays"] -git-tree-sha1 = "3420033e843e140d9237238d69937a5bc7292e5a" -uuid = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" -version = "0.13.0" - -[[GLPK_jll]] -deps = ["GMP_jll", "Libdl", "Pkg"] -git-tree-sha1 = "ccc855de74292e478d4278e3a6fdd8212f75e81e" -uuid = "e8aa6df9-e6ca-548a-97ff-1f85fc5b8b98" -version = "4.64.0+0" - -[[GMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "15abc5f976569a1c9d651aff02f7222ef305eb2a" -uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" -version = "6.1.2+6" - [[GZip]] deps = ["Libdl"] git-tree-sha1 = "039be665faf0b8ae36e089cd694233f5dee3f7d6" @@ -176,6 +158,12 @@ git-tree-sha1 = "c7ec02c4c6a039a98a15f955462cd7aea5df4508" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" version = "0.8.19" +[[IOCapture]] +deps = ["Logging"] +git-tree-sha1 = "377252859f740c217b936cebcd918a44f9b53b59" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.1.1" + [[IniFile]] deps = ["Test"] git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" @@ -187,9 +175,9 @@ deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[JLLWrappers]] -git-tree-sha1 = "7cec881362e5b4e367ff0279dd99a06526d51a55" +git-tree-sha1 = "c70593677bbf2c3ccab4f7500d0f4dacfff7b75c" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.1.2" +version = "1.1.3" [[JSON]] deps = ["Dates", "Mmap", "Parsers", "Unicode"] @@ -235,30 +223,30 @@ uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" [[MathOptInterface]] deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "JSON", "JSONSchema", "LinearAlgebra", "MutableArithmetics", "OrderedCollections", "SparseArrays", "Test", "Unicode"] -git-tree-sha1 = "5a1d631e0a9087d425e024d66b9c71e92e78fda8" +git-tree-sha1 = "4fd15565d1811be771e87a877f1e691a005d2b90" uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" -version = "0.9.17" +version = "0.9.18" [[MbedTLS]] deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "426a6978b03a97ceb7ead77775a1da066343ec6e" +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.2" +version = "1.0.3" [[MbedTLS_jll]] -deps = ["Libdl", "Pkg"] -git-tree-sha1 = "c0b1286883cac4e2b617539de41111e0776d02e8" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0eef589dd1c26a3ac9d753fe1a8bcad63f956fa6" uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.16.8+0" +version = "2.16.8+1" [[Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" [[MutableArithmetics]] deps = ["LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "6cf09794783b9de2e662c4e8b60d743021e338d0" +git-tree-sha1 = "c14dea152799bd0376024e3c3c1c3a6cb06764c7" uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" -version = "0.2.10" +version = "0.2.11" [[NaNMath]] git-tree-sha1 = "c84c576296d0e2fbb3fc134d3e09086b3ea617cd" @@ -278,9 +266,9 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.3+4" [[OrderedCollections]] -git-tree-sha1 = "16c08bf5dba06609fe45e30860092d6fa41fde7b" +git-tree-sha1 = "cf59cfed2e2c12e8a2ff0a4f1e9b2cd8650da6db" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.3.1" +version = "1.3.2" [[Osi_jll]] deps = ["CoinUtils_jll", "CompilerSupportLibraries_jll", "Libdl", "OpenBLAS32_jll", "Pkg"] @@ -290,9 +278,9 @@ version = "0.108.5+3" [[PackageCompiler]] deps = ["Libdl", "Pkg", "UUIDs"] -git-tree-sha1 = "98aa9c653e1dc3473bb5050caf8501293db9eee1" +git-tree-sha1 = "3eee77c94646163f15bd8626acf494360897f890" uuid = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d" -version = "1.2.1" +version = "1.2.3" [[Parsers]] deps = ["Dates"] @@ -316,12 +304,6 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" deps = ["Serialization"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -[[Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "28faf1c963ca1dc3ec87f166d92982e3c4a1f66d" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.1.0" - [[SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" @@ -347,9 +329,9 @@ version = "0.10.3" [[StaticArrays]] deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "016d1e1a00fabc556473b07161da3d39726ded35" +git-tree-sha1 = "da4cf579416c81994afd6322365d00916c79b8ae" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "0.12.4" +version = "0.12.5" [[Statistics]] deps = ["LinearAlgebra", "SparseArrays"] @@ -359,12 +341,6 @@ uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" deps = ["Distributed", "InteractiveUtils", "Logging", "Random"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[[TimerOutputs]] -deps = ["Printf"] -git-tree-sha1 = "f458ca23ff80e46a630922c555d838303e4b9603" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.6" - [[TranscodingStreams]] deps = ["Random", "Test"] git-tree-sha1 = "7c53c35547de1c5b9d46a4797cf6d8253807108c" diff --git a/Project.toml b/Project.toml index 5daf318..b375af8 100644 --- a/Project.toml +++ b/Project.toml @@ -1,18 +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. - name = "UnitCommitment" uuid = "64606440-39ea-11e9-0f29-3303a1d3d877" authors = ["Santos Xavier, Alinson "] repo = "https://github.com/ANL-CEEESA/UnitCommitment.jl" -version = "0.1.0" +version = "0.1.1" [deps] -Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -GLPK = "60bf3e95-4087-53dc-ae20-288a0d20c6a6" GZip = "92fee26a-97fe-5a0c-ad85-20a5f3185b63" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JuMP = "4076af6c-e467-56ae-b986-b466b2749572" @@ -22,10 +15,21 @@ MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" PackageCompiler = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" -Requires = "ae029012-a4dd-5104-9daa-d747884805df" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" [compat] +Cbc = "0.7" +DataStructures = "0.18" +GZip = "0.5" +JSON = "0.21" JuMP = "0.21" +MathOptInterface = "0.9" +PackageCompiler = "1" +julia = "1" + +[extras] +Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[targets] +test = ["Cbc", "Test"] diff --git a/README.md b/README.md index a660802..40d0be4 100755 --- a/README.md +++ b/README.md @@ -1,26 +1,44 @@ - - + + +DOI + # UnitCommitment.jl -**UnitCommitment.jl** is an optimization package for the Security-Constrained Unit Commitment Problem (SCUC), a fundamental optimization problem in power systems which is used, for example, to clear the day-ahead electricity markets. The problem asks for the most cost-effective power generation schedule under a number of physical, operational and economic constraints. +**UnitCommitment.jl** (UC.jl) is an optimization package for the Security-Constrained Unit Commitment Problem (SCUC), a fundamental optimization problem in power systems used, for example, to clear the day-ahead electricity markets. The package provides benchmark instances for the problem and JuMP implementations of state-of-the-art mixed-integer programming formulations. ### Package Components -* **Data Format:** The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. -* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic, based on publicly available data. +* **Data Format:** The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. The format supports all the most common generator characteristics (including ramping, piecewise-linear production cost curves and time-dependent startup costs), as well as operating reserves, price-sensitive loads, transmission networks and contingencies. +* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic. * **Model Implementation**: The package provides a Julia/JuMP implementation of state-of-the-art formulations and solution methods for SCUC. Our goal is to keep this implementation up-to-date, as new methods are proposed in the literature. * **Benchmark Tools:** The package provides automated benchmark scripts to accurately evaluate the performance impact of proposed code changes. ### Documentation -* [Installation Guide](https://axavier.org/projects/UnitCommitment.jl/install/) -* [Data Format Specification](https://axavier.org/projects/UnitCommitment.jl/format/) +* [Usage](https://anl-ceeesa.github.io/UnitCommitment.jl/0.1/usage/) +* [Data Format](https://anl-ceeesa.github.io/UnitCommitment.jl/0.1/format/) +* [Instances](https://anl-ceeesa.github.io/UnitCommitment.jl/0.1/instances/) ### Authors -* **Alinson Santos Xavier,** Argonne National Laboratory -* **Feng Qiu,** Argonne National Laboratory +* **Alinson Santos Xavier** (Argonne National Laboratory) +* **Feng Qiu** (Argonne National Laboratory) + +### Acknowledgments + +* We would like to thank **Aleksandr M. Kazachkov** (University of Florida), **Yonghong Chen** (Midcontinent Independent System Operator), **Feng Pan** (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package. + +* Based upon work supported by **Laboratory Directed Research and Development** (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy under Contract No. DE-AC02-06CH11357. + +### Citing + +If you use UnitCommitment.jl in your research, we request that you cite the package as follows: + +* **Alinson S. Xavier, Feng Qiu**. "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874). + +If you make use of the provided instances files, we request that you additionally cite the original sources, as described in the [instances page](https://anl-ceeesa.github.io/UnitCommitment.jl/0.1/instances/). + +### License + +Released under the modified BSD license. See `LICENSE.md` for more details. -### Collaborators -* **Yonghong Chen,** Midcontinent Independent System Operator -* **Feng Pan,** Pacific Northwest National Laboratory diff --git a/benchmark/Makefile b/benchmark/Makefile index 4665bea..d60f878 100644 --- a/benchmark/Makefile +++ b/benchmark/Makefile @@ -13,56 +13,15 @@ results_dir := results_$(FORMULATION) INSTANCES_PGLIB := \ pglib-uc/ca/2014-09-01_reserves_0 \ pglib-uc/ca/2014-09-01_reserves_1 \ - pglib-uc/ca/2014-09-01_reserves_3 \ - pglib-uc/ca/2014-09-01_reserves_5 \ - pglib-uc/ca/2014-12-01_reserves_0 \ - pglib-uc/ca/2014-12-01_reserves_1 \ - pglib-uc/ca/2014-12-01_reserves_3 \ - pglib-uc/ca/2014-12-01_reserves_5 \ pglib-uc/ca/2015-03-01_reserves_0 \ - pglib-uc/ca/2015-03-01_reserves_1 \ - pglib-uc/ca/2015-03-01_reserves_3 \ - pglib-uc/ca/2015-03-01_reserves_5 \ pglib-uc/ca/2015-06-01_reserves_0 \ - pglib-uc/ca/2015-06-01_reserves_1 \ - pglib-uc/ca/2015-06-01_reserves_3 \ - pglib-uc/ca/2015-06-01_reserves_5 \ - pglib-uc/ca/Scenario400_reserves_0 \ pglib-uc/ca/Scenario400_reserves_1 \ - pglib-uc/ca/Scenario400_reserves_3 \ - pglib-uc/ca/Scenario400_reserves_5 \ - pglib-uc/ferc/2015-01-01_hw \ pglib-uc/ferc/2015-01-01_lw \ - pglib-uc/ferc/2015-02-01_hw \ - pglib-uc/ferc/2015-02-01_lw \ - pglib-uc/ferc/2015-03-01_hw \ - pglib-uc/ferc/2015-03-01_lw \ - pglib-uc/ferc/2015-04-01_hw \ - pglib-uc/ferc/2015-04-01_lw \ - pglib-uc/ferc/2015-05-01_hw \ pglib-uc/ferc/2015-05-01_lw \ - pglib-uc/ferc/2015-06-01_hw \ - pglib-uc/ferc/2015-06-01_lw \ pglib-uc/ferc/2015-07-01_hw \ - pglib-uc/ferc/2015-07-01_lw \ - pglib-uc/ferc/2015-08-01_hw \ - pglib-uc/ferc/2015-08-01_lw \ - pglib-uc/ferc/2015-09-01_hw \ - pglib-uc/ferc/2015-09-01_lw \ - pglib-uc/ferc/2015-10-01_hw \ pglib-uc/ferc/2015-10-01_lw \ - pglib-uc/ferc/2015-11-02_hw \ - pglib-uc/ferc/2015-11-02_lw \ - pglib-uc/ferc/2015-12-01_hw \ pglib-uc/ferc/2015-12-01_lw \ - pglib-uc/rts_gmlc/2020-01-27 \ - pglib-uc/rts_gmlc/2020-02-09 \ - pglib-uc/rts_gmlc/2020-03-05 \ pglib-uc/rts_gmlc/2020-04-03 \ - pglib-uc/rts_gmlc/2020-05-05 \ - pglib-uc/rts_gmlc/2020-06-09 \ - pglib-uc/rts_gmlc/2020-07-06 \ - pglib-uc/rts_gmlc/2020-08-12 \ pglib-uc/rts_gmlc/2020-09-20 \ pglib-uc/rts_gmlc/2020-10-27 \ pglib-uc/rts_gmlc/2020-11-25 \ @@ -74,20 +33,12 @@ INSTANCES_MATPOWER := \ matpower/case300/2017-02-01 \ matpower/case300/2017-08-01 \ matpower/case1354pegase/2017-02-01 \ - matpower/case1354pegase/2017-08-01 \ matpower/case1888rte/2017-02-01 \ - matpower/case1888rte/2017-08-01 \ - matpower/case1951rte/2017-02-01 \ matpower/case1951rte/2017-08-01 \ matpower/case2848rte/2017-02-01 \ - matpower/case2848rte/2017-08-01 \ - matpower/case2868rte/2017-02-01 \ matpower/case2868rte/2017-08-01 \ - matpower/case3375wp/2017-02-01 \ matpower/case3375wp/2017-08-01 \ - matpower/case6468rte/2017-02-01 \ matpower/case6468rte/2017-08-01 \ - matpower/case6515rte/2017-02-01 \ matpower/case6515rte/2017-08-01 INSTANCES_INFORMS1 := \ @@ -288,9 +239,36 @@ SOLUTIONS_INFORMS2 := $(foreach s,$(SAMPLES),$(addprefix $(results_dir)/,$(addsu SOLUTIONS_INFORMS3 := $(foreach s,$(SAMPLES),$(addprefix $(results_dir)/,$(addsuffix .$(s).sol.json,$(INSTANCES_INFORMS3)))) SOLUTIONS_TEST := $(foreach s,$(SAMPLES),$(addprefix $(results_dir)/,$(addsuffix .$(s).sol.json,$(INSTANCES_TEST)))) -.PHONY: tables save small large clean-mps matpower pglib informs1 informs2 informs3 test +.PHONY: tables save small large clean-mps matpower pglib informs1 informs2 informs3 test pglib orlib -all: matpower pglib +INSTANCES_ORLIB := \ + or-lib/20_0_1_w \ + or-lib/20_0_5_w \ + or-lib/50_0_2_w \ + or-lib/75_0_2_w \ + or-lib/100_0_1_w \ + or-lib/100_0_4_w \ + or-lib/100_0_5_w \ + or-lib/200_0_3_w \ + or-lib/200_0_7_w \ + or-lib/200_0_9_w + +INSTANCES_TEJADA19 := \ + tejada19/UC_24h_290g \ + tejada19/UC_24h_623g \ + tejada19/UC_24h_959g \ + tejada19/UC_24h_1577g \ + tejada19/UC_24h_1888g \ + tejada19/UC_168h_72g \ + tejada19/UC_168h_86g \ + tejada19/UC_168h_130g \ + tejada19/UC_168h_131g \ + tejada19/UC_168h_199g + +SOLUTIONS_ORLIB := $(foreach s,$(SAMPLES),$(addprefix results/,$(addsuffix .$(s).sol.json,$(INSTANCES_ORLIB)))) +SOLUTIONS_TEJADA19 := $(foreach s,$(SAMPLES),$(addprefix results/,$(addsuffix .$(s).sol.json,$(INSTANCES_TEJADA19)))) + +all: matpower pglib orlib tejada19 matpower: $(SOLUTIONS_MATPOWER) @@ -302,14 +280,18 @@ informs3: $(SOLUTIONS_INFORMS3) test: $(SOLUTIONS_TEST) +orlib: $(SOLUTIONS_ORLIB) + +tejada19: $(SOLUTIONS_TEJADA19) + clean: @rm -rf tables/benchmark* tables/compare* $(results_dir) clean-mps: - @rm -fv $(results_dir)/*/*/*.mps.gz + @rm -fv results/*/*.mps.gz results/*/*/*.mps.gz clean-sol: - @rm -rf $(results_dir)/*/*/*.sol.* + @rm -rf results/*/*.sol.* results/*/*/*.sol.* save: mkdir -p "runs/$(TIMESTAMP)" diff --git a/benchmark/scripts/compare.py b/benchmark/scripts/compare.py index 65df665..01fefa3 100644 --- a/benchmark/scripts/compare.py +++ b/benchmark/scripts/compare.py @@ -8,7 +8,7 @@ import seaborn as sns import matplotlib.pyplot as plt import sys -easy_cutoff = 120 +#easy_cutoff = 120 b1 = pd.read_csv(sys.argv[1], index_col=0) b2 = pd.read_csv(sys.argv[2], index_col=0) @@ -24,10 +24,10 @@ merged["Time diff (s)"] = merged["B Time (s)"] - merged["A Time (s)"] merged["Value diff (%)"] = np.round((merged["B Value"] - merged["A Value"]) / merged["A Value"] * 100.0, 5) merged.loc[merged.loc[:, "B Time (s)"] <= 0, "Speedup"] = float("nan") merged.loc[merged.loc[:, "B Time (s)"] <= 0, "Time diff (s)"] = float("nan") -merged = merged[(merged["A Time (s)"] >= easy_cutoff) | (merged["B Time (s)"] >= easy_cutoff)] +#merged = merged[(merged["A Time (s)"] >= easy_cutoff) | (merged["B Time (s)"] >= easy_cutoff)] merged.reset_index(inplace=True) merged["Name"] = merged["Group"] + "/" + merged["Instance"] -merged = merged.sort_values(by="Speedup", ascending=False) +#merged = merged.sort_values(by="Speedup", ascending=False) k = len(merged.groupby("Name")) diff --git a/benchmark/scripts/table.py b/benchmark/scripts/table.py index 7f5c6dc..0d1ba99 100644 --- a/benchmark/scripts/table.py +++ b/benchmark/scripts/table.py @@ -9,7 +9,8 @@ from tabulate import tabulate def process_all_log_files(): - pathlist = Path(".").glob('results/*/*/*.log') + pathlist = list(Path(".").glob('results/*/*/*.log')) + pathlist += list(Path(".").glob('results/*/*.log')) rows = [] for path in pathlist: if ".ipy" in str(path): diff --git a/instances/README.md b/instances/README.md index 3d28541..26a1fb0 100644 --- a/instances/README.md +++ b/instances/README.md @@ -1,29 +1,53 @@ -UnitCommitment.jl Instances -=========================== +Instances +========= + +UnitCommitment.jl provides a large collection of benchmark instances collected +from the literature and converted to a common data format. If you use these instances in your research, we request that you cite UnitCommitment.jl, as well as the original sources, as listed below. [See documentation for more details](https://anl-ceeesa.github.io/UnitCommitment.jl/). References ---------- -### PGLIB-UC - -* Coffrin, Carleton and Knueven, Bernard. "Power Grid Lib - Unit Commitment". https://github.com/power-grid-lib/pglib-uc +### UnitCommitment.jl -* Knueven, Bernard, James Ostrowski, and Jean-Paul Watson. "On mixed integer programming formulations for the unit commitment problem." Pre-print available at http://www.optimization-online.org/DB_HTML/2018/11/6930.pdf (2018). +* [UCJL] **Alinson S. Xavier, Feng Qiu.** "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874) -* Krall, Eric, Michael Higgins, and Richard P. O’Neill. "RTO unit commitment test system." Federal Energy Regulatory Commission. Available: http://ferc.gov/legal/staff-reports/rto-COMMITMENT-TEST.pdf (2012). ### MATPOWER -* https://github.com/MATPOWER/matpower +* [MTPWR] **D. Zimmerman, C. E. Murillo-Sandnchez and R. J. Thomas.** "Matpower: Steady-state operations, planning, and analysis tools forpower systems research and education", IEEE Transactions on PowerSystems, vol. 26, no. 1, pp. 12 –19, Feb. 2011. [DOI: 10.1109/TPWRS.2010.2051168](https://doi.org/10.1109/TPWRS.2010.2051168) + +* [PSTCA] **University of Washington, Dept. of Electrical Engineering.** "Power Systems Test Case Archive". Available at: (Accessed: Nov 14, 2020) + +* [JoFlMa16] **C. Josz, S. Fliscounakis, J. Maeght, and P. Panciatici.** "AC Power Flow +Data in MATPOWER and QCQP Format: iTesla, RTE Snapshots, and PEGASE". [ArXiv (2016)](https://arxiv.org/abs/1603.01533). + +* [FlPaCa13] **S. Fliscounakis, P. Panciatici, F. Capitanescu, and L. Wehenkel.** +"Contingency ranking with respect to overloads in very large power +systems taking into account uncertainty, preventive and corrective +actions", Power Systems, IEEE Trans. on, (28)4:4909-4917, 2013. +[DOI: 10.1109/TPWRS.2013.2251015](https://doi.org/10.1109/TPWRS.2013.2251015) + -* R. D. Zimmerman, C. E. Murillo-Sanchez, and R. J. Thomas, "MATPOWER: Steady-State Operations, Planning and Analysis Tools for Power Systems Research and Education," Power Systems, IEEE Transactions on, vol. 26, no. 1, pp. 12–19, Feb. 2011. +### PGLIB-UC + +* [PGLIB] **Carleton Coffrin and Bernard Knueven.** "Power Grid Lib - Unit Commitment". Available at: (Accessed: Nov 14, 2020) -* C. Josz, S. Fliscounakis, J. Maeght, and P. Panciatici, "AC Power Flow Data in MATPOWER and QCQP Format: iTesla, RTE Snapshots, and PEGASE" https://arxiv.org/abs/1603.01533 +* [KrHiOn12] **Eric Krall, Michael Higgins and Richard P. O’Neill.** "RTO unit commitment test system." Federal Energy Regulatory Commission. Available at: (Accessed: Nov 14, 2020) -* S. Fliscounakis, P. Panciatici, F. Capitanescu, and L. Wehenkel, "Contingency ranking with respect to overloads in very large power systems taking into account uncertainty, preventive and corrective actions", Power Systems, IEEE Trans. on, (28)4:4909-4917, 2013. https://doi.org/10.1109/TPWRS.2013.2251015 +* [KnOsWa20] **Bernard Knueven, James Ostrowski and Jean-Paul Watson.** "On Mixed-Integer Programming Formulations for the Unit Commitment Problem". INFORMS Journal on Computing (2020). [DOI: 10.1287/ijoc.2019.0944](https://doi.org/10.1287/ijoc.2019.0944) ### RTS-GMLC * https://github.com/GridMod/RTS-GMLC -* Barrows, Clayton, Aaron Bloom, Ali Ehlen, Jussi Ikaheimo, Jennie Jorgenson, Dheepak Krishnamurthy, Jessica Lau et al. "The IEEE Reliability Test System: A Proposed 2019 Update." IEEE Transactions on Power Systems (2019). +* [BaBlEh19] **Clayton Barrows, Aaron Bloom, Ali Ehlen, Jussi Ikaheimo, Jennie Jorgenson, Dheepak Krishnamurthy, Jessica Lau et al.** "The IEEE Reliability Test System: A Proposed 2019 Update." IEEE Transactions on Power Systems (2019). [DOI: 10.1109/TPWRS.2019.2925557](https://doi.org/10.1109/TPWRS.2019.2925557) + +### OR-LIB + +* [ORLIB] **J.E.Beasley.** "OR-Library: distributing test problems by electronic mail", Journal of the Operational Research Society 41(11) (1990). [DOI: 10.2307/2582903](https://doi.org/10.2307/2582903) + +* [FrGe06] **A. Frangioni, C. Gentile.** "Solving nonlinear single-unit commitment problems with ramping constraints" Operations Research 54(4), p. 767 - 775, 2006. [DOI: 10.1287/opre.1060.0309](https://doi.org/10.1287/opre.1060.0309) + +### Tejada19 + +* [TeLuSa19] **D. A. Tejada-Arango, S. Lumbreras, P. Sanchez-Martin and A. Ramos.** "Which Unit-Commitment Formulation is Best? A Systematic Comparison," in IEEE Transactions on Power Systems. [DOI: 10.1109/TPWRS.2019.2962024](https://ieeexplore.ieee.org/document/8941313/). diff --git a/instances/matpower/case118/2017-02-01.json.gz b/instances/matpower/case118/2017-02-01.json.gz index 8543dac..57d852b 100644 Binary files a/instances/matpower/case118/2017-02-01.json.gz and b/instances/matpower/case118/2017-02-01.json.gz differ diff --git a/instances/matpower/case118/2017-08-01.json.gz b/instances/matpower/case118/2017-08-01.json.gz index aeff58f..34d3fda 100644 Binary files a/instances/matpower/case118/2017-08-01.json.gz and b/instances/matpower/case118/2017-08-01.json.gz differ diff --git a/instances/matpower/case1354pegase/2017-02-01.json.gz b/instances/matpower/case1354pegase/2017-02-01.json.gz index c9b078e..23bb656 100644 Binary files a/instances/matpower/case1354pegase/2017-02-01.json.gz and b/instances/matpower/case1354pegase/2017-02-01.json.gz differ diff --git a/instances/matpower/case1354pegase/2017-08-01.json.gz b/instances/matpower/case1354pegase/2017-08-01.json.gz index 9dcfaae..f466116 100644 Binary files a/instances/matpower/case1354pegase/2017-08-01.json.gz and b/instances/matpower/case1354pegase/2017-08-01.json.gz differ diff --git a/instances/matpower/case13659pegase/2017-02-01.json.gz b/instances/matpower/case13659pegase/2017-02-01.json.gz index 42f93f1..743f895 100644 Binary files a/instances/matpower/case13659pegase/2017-02-01.json.gz and b/instances/matpower/case13659pegase/2017-02-01.json.gz differ diff --git a/instances/matpower/case13659pegase/2017-08-01.json.gz b/instances/matpower/case13659pegase/2017-08-01.json.gz index 5ae7417..71ecc8a 100644 Binary files a/instances/matpower/case13659pegase/2017-08-01.json.gz and b/instances/matpower/case13659pegase/2017-08-01.json.gz differ diff --git a/instances/matpower/case14/2017-02-01.json.gz b/instances/matpower/case14/2017-02-01.json.gz index 22b779c..df09572 100644 Binary files a/instances/matpower/case14/2017-02-01.json.gz and b/instances/matpower/case14/2017-02-01.json.gz differ diff --git a/instances/matpower/case14/2017-08-01.json.gz b/instances/matpower/case14/2017-08-01.json.gz index 381959a..9ef9554 100644 Binary files a/instances/matpower/case14/2017-08-01.json.gz and b/instances/matpower/case14/2017-08-01.json.gz differ diff --git a/instances/matpower/case145/2017-02-01.json.gz b/instances/matpower/case145/2017-02-01.json.gz deleted file mode 100644 index d335af2..0000000 Binary files a/instances/matpower/case145/2017-02-01.json.gz and /dev/null differ diff --git a/instances/matpower/case145/2017-08-01.json.gz b/instances/matpower/case145/2017-08-01.json.gz deleted file mode 100644 index 0692fd7..0000000 Binary files a/instances/matpower/case145/2017-08-01.json.gz and /dev/null differ diff --git a/instances/matpower/case1888rte/2017-02-01.json.gz b/instances/matpower/case1888rte/2017-02-01.json.gz index 0150146..369964d 100644 Binary files a/instances/matpower/case1888rte/2017-02-01.json.gz and b/instances/matpower/case1888rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case1888rte/2017-08-01.json.gz b/instances/matpower/case1888rte/2017-08-01.json.gz index 8f7563e..a37fc6f 100644 Binary files a/instances/matpower/case1888rte/2017-08-01.json.gz and b/instances/matpower/case1888rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case1951rte/2017-02-01.json.gz b/instances/matpower/case1951rte/2017-02-01.json.gz index c05fb59..960f61f 100644 Binary files a/instances/matpower/case1951rte/2017-02-01.json.gz and b/instances/matpower/case1951rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case1951rte/2017-08-01.json.gz b/instances/matpower/case1951rte/2017-08-01.json.gz index 9b05b54..c95c0fd 100644 Binary files a/instances/matpower/case1951rte/2017-08-01.json.gz and b/instances/matpower/case1951rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case2383wp/2017-02-01.json.gz b/instances/matpower/case2383wp/2017-02-01.json.gz index 925d1b6..e6b2b65 100644 Binary files a/instances/matpower/case2383wp/2017-02-01.json.gz and b/instances/matpower/case2383wp/2017-02-01.json.gz differ diff --git a/instances/matpower/case2383wp/2017-08-01.json.gz b/instances/matpower/case2383wp/2017-08-01.json.gz index f3ad108..45cbb55 100644 Binary files a/instances/matpower/case2383wp/2017-08-01.json.gz and b/instances/matpower/case2383wp/2017-08-01.json.gz differ diff --git a/instances/matpower/case24/2017-02-01.json.gz b/instances/matpower/case24/2017-02-01.json.gz deleted file mode 100644 index 48bec8f..0000000 Binary files a/instances/matpower/case24/2017-02-01.json.gz and /dev/null differ diff --git a/instances/matpower/case24/2017-08-01.json.gz b/instances/matpower/case24/2017-08-01.json.gz deleted file mode 100644 index 5b40b21..0000000 Binary files a/instances/matpower/case24/2017-08-01.json.gz and /dev/null differ diff --git a/instances/matpower/case2736sp/2017-02-01.json.gz b/instances/matpower/case2736sp/2017-02-01.json.gz index bbb7693..8f3bb68 100644 Binary files a/instances/matpower/case2736sp/2017-02-01.json.gz and b/instances/matpower/case2736sp/2017-02-01.json.gz differ diff --git a/instances/matpower/case2736sp/2017-08-01.json.gz b/instances/matpower/case2736sp/2017-08-01.json.gz index fa90b25..301a76a 100644 Binary files a/instances/matpower/case2736sp/2017-08-01.json.gz and b/instances/matpower/case2736sp/2017-08-01.json.gz differ diff --git a/instances/matpower/case2737sop/2017-02-01.json.gz b/instances/matpower/case2737sop/2017-02-01.json.gz index a8352d3..bd2ae33 100644 Binary files a/instances/matpower/case2737sop/2017-02-01.json.gz and b/instances/matpower/case2737sop/2017-02-01.json.gz differ diff --git a/instances/matpower/case2737sop/2017-08-01.json.gz b/instances/matpower/case2737sop/2017-08-01.json.gz index 1cf6bb4..969c315 100644 Binary files a/instances/matpower/case2737sop/2017-08-01.json.gz and b/instances/matpower/case2737sop/2017-08-01.json.gz differ diff --git a/instances/matpower/case2746wop/2017-02-01.json.gz b/instances/matpower/case2746wop/2017-02-01.json.gz index 804d6ed..0d6275c 100644 Binary files a/instances/matpower/case2746wop/2017-02-01.json.gz and b/instances/matpower/case2746wop/2017-02-01.json.gz differ diff --git a/instances/matpower/case2746wop/2017-08-01.json.gz b/instances/matpower/case2746wop/2017-08-01.json.gz index 2b2df26..9f24c25 100644 Binary files a/instances/matpower/case2746wop/2017-08-01.json.gz and b/instances/matpower/case2746wop/2017-08-01.json.gz differ diff --git a/instances/matpower/case2746wp/2017-02-01.json.gz b/instances/matpower/case2746wp/2017-02-01.json.gz index 58fd284..f4d4650 100644 Binary files a/instances/matpower/case2746wp/2017-02-01.json.gz and b/instances/matpower/case2746wp/2017-02-01.json.gz differ diff --git a/instances/matpower/case2746wp/2017-08-01.json.gz b/instances/matpower/case2746wp/2017-08-01.json.gz index ecb1f78..99c70ca 100644 Binary files a/instances/matpower/case2746wp/2017-08-01.json.gz and b/instances/matpower/case2746wp/2017-08-01.json.gz differ diff --git a/instances/matpower/case2848rte/2017-02-01.json.gz b/instances/matpower/case2848rte/2017-02-01.json.gz index 413309f..945d688 100644 Binary files a/instances/matpower/case2848rte/2017-02-01.json.gz and b/instances/matpower/case2848rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case2848rte/2017-08-01.json.gz b/instances/matpower/case2848rte/2017-08-01.json.gz index 648e749..488895a 100644 Binary files a/instances/matpower/case2848rte/2017-08-01.json.gz and b/instances/matpower/case2848rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case2868rte/2017-02-01.json.gz b/instances/matpower/case2868rte/2017-02-01.json.gz index 8f493af..dbf55d3 100644 Binary files a/instances/matpower/case2868rte/2017-02-01.json.gz and b/instances/matpower/case2868rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case2868rte/2017-08-01.json.gz b/instances/matpower/case2868rte/2017-08-01.json.gz index 048dc75..54e455d 100644 Binary files a/instances/matpower/case2868rte/2017-08-01.json.gz and b/instances/matpower/case2868rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case2869pegase/2017-02-01.json.gz b/instances/matpower/case2869pegase/2017-02-01.json.gz index e5267fb..19a3605 100644 Binary files a/instances/matpower/case2869pegase/2017-02-01.json.gz and b/instances/matpower/case2869pegase/2017-02-01.json.gz differ diff --git a/instances/matpower/case2869pegase/2017-08-01.json.gz b/instances/matpower/case2869pegase/2017-08-01.json.gz index 32e3ac4..3dfef2f 100644 Binary files a/instances/matpower/case2869pegase/2017-08-01.json.gz and b/instances/matpower/case2869pegase/2017-08-01.json.gz differ diff --git a/instances/matpower/case30/2017-02-01.json.gz b/instances/matpower/case30/2017-02-01.json.gz index f68abb2..ffb3bf8 100644 Binary files a/instances/matpower/case30/2017-02-01.json.gz and b/instances/matpower/case30/2017-02-01.json.gz differ diff --git a/instances/matpower/case30/2017-08-01.json.gz b/instances/matpower/case30/2017-08-01.json.gz index 7fb5243..847b994 100644 Binary files a/instances/matpower/case30/2017-08-01.json.gz and b/instances/matpower/case30/2017-08-01.json.gz differ diff --git a/instances/matpower/case300/2017-02-01.json.gz b/instances/matpower/case300/2017-02-01.json.gz index 443d3a0..e75f8d2 100644 Binary files a/instances/matpower/case300/2017-02-01.json.gz and b/instances/matpower/case300/2017-02-01.json.gz differ diff --git a/instances/matpower/case300/2017-08-01.json.gz b/instances/matpower/case300/2017-08-01.json.gz index 091d48e..94b117c 100644 Binary files a/instances/matpower/case300/2017-08-01.json.gz and b/instances/matpower/case300/2017-08-01.json.gz differ diff --git a/instances/matpower/case3012wp/2017-02-01.json.gz b/instances/matpower/case3012wp/2017-02-01.json.gz index 9c640c3..d2897eb 100644 Binary files a/instances/matpower/case3012wp/2017-02-01.json.gz and b/instances/matpower/case3012wp/2017-02-01.json.gz differ diff --git a/instances/matpower/case3012wp/2017-08-01.json.gz b/instances/matpower/case3012wp/2017-08-01.json.gz index 2c1d0a8..adc73ed 100644 Binary files a/instances/matpower/case3012wp/2017-08-01.json.gz and b/instances/matpower/case3012wp/2017-08-01.json.gz differ diff --git a/instances/matpower/case3120sp/2017-02-01.json.gz b/instances/matpower/case3120sp/2017-02-01.json.gz index 8763a44..919e9e0 100644 Binary files a/instances/matpower/case3120sp/2017-02-01.json.gz and b/instances/matpower/case3120sp/2017-02-01.json.gz differ diff --git a/instances/matpower/case3120sp/2017-08-01.json.gz b/instances/matpower/case3120sp/2017-08-01.json.gz index a5b206e..d7092f8 100644 Binary files a/instances/matpower/case3120sp/2017-08-01.json.gz and b/instances/matpower/case3120sp/2017-08-01.json.gz differ diff --git a/instances/matpower/case3375wp/2017-02-01.json.gz b/instances/matpower/case3375wp/2017-02-01.json.gz index 0fa4aaf..2e9f9b7 100644 Binary files a/instances/matpower/case3375wp/2017-02-01.json.gz and b/instances/matpower/case3375wp/2017-02-01.json.gz differ diff --git a/instances/matpower/case3375wp/2017-08-01.json.gz b/instances/matpower/case3375wp/2017-08-01.json.gz index a4c93cd..92a543e 100644 Binary files a/instances/matpower/case3375wp/2017-08-01.json.gz and b/instances/matpower/case3375wp/2017-08-01.json.gz differ diff --git a/instances/matpower/case57/2017-02-01.json.gz b/instances/matpower/case57/2017-02-01.json.gz index d16f655..b9c0985 100644 Binary files a/instances/matpower/case57/2017-02-01.json.gz and b/instances/matpower/case57/2017-02-01.json.gz differ diff --git a/instances/matpower/case57/2017-08-01.json.gz b/instances/matpower/case57/2017-08-01.json.gz index 51c6fee..86a397b 100644 Binary files a/instances/matpower/case57/2017-08-01.json.gz and b/instances/matpower/case57/2017-08-01.json.gz differ diff --git a/instances/matpower/case6468rte/2017-02-01.json.gz b/instances/matpower/case6468rte/2017-02-01.json.gz index db1ee3e..ec6911b 100644 Binary files a/instances/matpower/case6468rte/2017-02-01.json.gz and b/instances/matpower/case6468rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case6468rte/2017-08-01.json.gz b/instances/matpower/case6468rte/2017-08-01.json.gz index 28c2ee5..1e48a4f 100644 Binary files a/instances/matpower/case6468rte/2017-08-01.json.gz and b/instances/matpower/case6468rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case6470rte/2017-02-01.json.gz b/instances/matpower/case6470rte/2017-02-01.json.gz index 2c5692f..7c5a403 100644 Binary files a/instances/matpower/case6470rte/2017-02-01.json.gz and b/instances/matpower/case6470rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case6470rte/2017-08-01.json.gz b/instances/matpower/case6470rte/2017-08-01.json.gz index 4d146cf..92cf7a7 100644 Binary files a/instances/matpower/case6470rte/2017-08-01.json.gz and b/instances/matpower/case6470rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case6495rte/2017-02-01.json.gz b/instances/matpower/case6495rte/2017-02-01.json.gz index b19a04e..c5fea3a 100644 Binary files a/instances/matpower/case6495rte/2017-02-01.json.gz and b/instances/matpower/case6495rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case6495rte/2017-08-01.json.gz b/instances/matpower/case6495rte/2017-08-01.json.gz index 67947fd..e78d6cb 100644 Binary files a/instances/matpower/case6495rte/2017-08-01.json.gz and b/instances/matpower/case6495rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case6515rte/2017-02-01.json.gz b/instances/matpower/case6515rte/2017-02-01.json.gz index f1269af..74e6c1c 100644 Binary files a/instances/matpower/case6515rte/2017-02-01.json.gz and b/instances/matpower/case6515rte/2017-02-01.json.gz differ diff --git a/instances/matpower/case6515rte/2017-08-01.json.gz b/instances/matpower/case6515rte/2017-08-01.json.gz index ddefb82..2e4bc82 100644 Binary files a/instances/matpower/case6515rte/2017-08-01.json.gz and b/instances/matpower/case6515rte/2017-08-01.json.gz differ diff --git a/instances/matpower/case89pegase/2017-02-01.json.gz b/instances/matpower/case89pegase/2017-02-01.json.gz index e6c463f..2018f9f 100644 Binary files a/instances/matpower/case89pegase/2017-02-01.json.gz and b/instances/matpower/case89pegase/2017-02-01.json.gz differ diff --git a/instances/matpower/case89pegase/2017-08-01.json.gz b/instances/matpower/case89pegase/2017-08-01.json.gz index 7b4e59b..93ae387 100644 Binary files a/instances/matpower/case89pegase/2017-08-01.json.gz and b/instances/matpower/case89pegase/2017-08-01.json.gz differ diff --git a/instances/matpower/case9241pegase/2017-02-01.json.gz b/instances/matpower/case9241pegase/2017-02-01.json.gz index 67302f7..53bd4a6 100644 Binary files a/instances/matpower/case9241pegase/2017-02-01.json.gz and b/instances/matpower/case9241pegase/2017-02-01.json.gz differ diff --git a/instances/matpower/case9241pegase/2017-08-01.json.gz b/instances/matpower/case9241pegase/2017-08-01.json.gz index 3b2c913..14897b4 100644 Binary files a/instances/matpower/case9241pegase/2017-08-01.json.gz and b/instances/matpower/case9241pegase/2017-08-01.json.gz differ diff --git a/instances/or-lib/100_0_1_w.json.gz b/instances/or-lib/100_0_1_w.json.gz new file mode 100644 index 0000000..79a4adb Binary files /dev/null and b/instances/or-lib/100_0_1_w.json.gz differ diff --git a/instances/or-lib/100_0_2_w.json.gz b/instances/or-lib/100_0_2_w.json.gz new file mode 100644 index 0000000..8f0c6d0 Binary files /dev/null and b/instances/or-lib/100_0_2_w.json.gz differ diff --git a/instances/or-lib/100_0_3_w.json.gz b/instances/or-lib/100_0_3_w.json.gz new file mode 100644 index 0000000..9063143 Binary files /dev/null and b/instances/or-lib/100_0_3_w.json.gz differ diff --git a/instances/or-lib/100_0_4_w.json.gz b/instances/or-lib/100_0_4_w.json.gz new file mode 100644 index 0000000..0b49995 Binary files /dev/null and b/instances/or-lib/100_0_4_w.json.gz differ diff --git a/instances/or-lib/100_0_5_w.json.gz b/instances/or-lib/100_0_5_w.json.gz new file mode 100644 index 0000000..e466f9f Binary files /dev/null and b/instances/or-lib/100_0_5_w.json.gz differ diff --git a/instances/or-lib/10_0_1_w.json.gz b/instances/or-lib/10_0_1_w.json.gz new file mode 100644 index 0000000..e25abd3 Binary files /dev/null and b/instances/or-lib/10_0_1_w.json.gz differ diff --git a/instances/or-lib/10_0_2_w.json.gz b/instances/or-lib/10_0_2_w.json.gz new file mode 100644 index 0000000..8e7ddc3 Binary files /dev/null and b/instances/or-lib/10_0_2_w.json.gz differ diff --git a/instances/or-lib/10_0_3_w.json.gz b/instances/or-lib/10_0_3_w.json.gz new file mode 100644 index 0000000..d686f5b Binary files /dev/null and b/instances/or-lib/10_0_3_w.json.gz differ diff --git a/instances/or-lib/10_0_4_w.json.gz b/instances/or-lib/10_0_4_w.json.gz new file mode 100644 index 0000000..b017c6e Binary files /dev/null and b/instances/or-lib/10_0_4_w.json.gz differ diff --git a/instances/or-lib/10_0_5_w.json.gz b/instances/or-lib/10_0_5_w.json.gz new file mode 100644 index 0000000..56fdf29 Binary files /dev/null and b/instances/or-lib/10_0_5_w.json.gz differ diff --git a/instances/or-lib/150_0_1_w.json.gz b/instances/or-lib/150_0_1_w.json.gz new file mode 100644 index 0000000..19e2a45 Binary files /dev/null and b/instances/or-lib/150_0_1_w.json.gz differ diff --git a/instances/or-lib/150_0_2_w.json.gz b/instances/or-lib/150_0_2_w.json.gz new file mode 100644 index 0000000..6080538 Binary files /dev/null and b/instances/or-lib/150_0_2_w.json.gz differ diff --git a/instances/or-lib/150_0_3_w.json.gz b/instances/or-lib/150_0_3_w.json.gz new file mode 100644 index 0000000..20db366 Binary files /dev/null and b/instances/or-lib/150_0_3_w.json.gz differ diff --git a/instances/or-lib/150_0_4_w.json.gz b/instances/or-lib/150_0_4_w.json.gz new file mode 100644 index 0000000..851ed57 Binary files /dev/null and b/instances/or-lib/150_0_4_w.json.gz differ diff --git a/instances/or-lib/150_0_5_w.json.gz b/instances/or-lib/150_0_5_w.json.gz new file mode 100644 index 0000000..3c4ed35 Binary files /dev/null and b/instances/or-lib/150_0_5_w.json.gz differ diff --git a/instances/or-lib/200_0_10_w.json.gz b/instances/or-lib/200_0_10_w.json.gz new file mode 100644 index 0000000..dd797b3 Binary files /dev/null and b/instances/or-lib/200_0_10_w.json.gz differ diff --git a/instances/or-lib/200_0_11_w.json.gz b/instances/or-lib/200_0_11_w.json.gz new file mode 100644 index 0000000..73a3d8a Binary files /dev/null and b/instances/or-lib/200_0_11_w.json.gz differ diff --git a/instances/or-lib/200_0_12_w.json.gz b/instances/or-lib/200_0_12_w.json.gz new file mode 100644 index 0000000..a79acf9 Binary files /dev/null and b/instances/or-lib/200_0_12_w.json.gz differ diff --git a/instances/or-lib/200_0_1_w.json.gz b/instances/or-lib/200_0_1_w.json.gz new file mode 100644 index 0000000..797ddbf Binary files /dev/null and b/instances/or-lib/200_0_1_w.json.gz differ diff --git a/instances/or-lib/200_0_2_w.json.gz b/instances/or-lib/200_0_2_w.json.gz new file mode 100644 index 0000000..634c705 Binary files /dev/null and b/instances/or-lib/200_0_2_w.json.gz differ diff --git a/instances/or-lib/200_0_3_w.json.gz b/instances/or-lib/200_0_3_w.json.gz new file mode 100644 index 0000000..fdca1d5 Binary files /dev/null and b/instances/or-lib/200_0_3_w.json.gz differ diff --git a/instances/or-lib/200_0_4_w.json.gz b/instances/or-lib/200_0_4_w.json.gz new file mode 100644 index 0000000..2f558a1 Binary files /dev/null and b/instances/or-lib/200_0_4_w.json.gz differ diff --git a/instances/or-lib/200_0_5_w.json.gz b/instances/or-lib/200_0_5_w.json.gz new file mode 100644 index 0000000..b4f807f Binary files /dev/null and b/instances/or-lib/200_0_5_w.json.gz differ diff --git a/instances/or-lib/200_0_6_w.json.gz b/instances/or-lib/200_0_6_w.json.gz new file mode 100644 index 0000000..96b84fc Binary files /dev/null and b/instances/or-lib/200_0_6_w.json.gz differ diff --git a/instances/or-lib/200_0_7_w.json.gz b/instances/or-lib/200_0_7_w.json.gz new file mode 100644 index 0000000..4136dc2 Binary files /dev/null and b/instances/or-lib/200_0_7_w.json.gz differ diff --git a/instances/or-lib/200_0_8_w.json.gz b/instances/or-lib/200_0_8_w.json.gz new file mode 100644 index 0000000..f6fbd0e Binary files /dev/null and b/instances/or-lib/200_0_8_w.json.gz differ diff --git a/instances/or-lib/200_0_9_w.json.gz b/instances/or-lib/200_0_9_w.json.gz new file mode 100644 index 0000000..bab7a62 Binary files /dev/null and b/instances/or-lib/200_0_9_w.json.gz differ diff --git a/instances/or-lib/20_0_1_w.json.gz b/instances/or-lib/20_0_1_w.json.gz new file mode 100644 index 0000000..c4f7e2b Binary files /dev/null and b/instances/or-lib/20_0_1_w.json.gz differ diff --git a/instances/or-lib/20_0_2_w.json.gz b/instances/or-lib/20_0_2_w.json.gz new file mode 100644 index 0000000..4e18ec6 Binary files /dev/null and b/instances/or-lib/20_0_2_w.json.gz differ diff --git a/instances/or-lib/20_0_3_w.json.gz b/instances/or-lib/20_0_3_w.json.gz new file mode 100644 index 0000000..d3aa07b Binary files /dev/null and b/instances/or-lib/20_0_3_w.json.gz differ diff --git a/instances/or-lib/20_0_4_w.json.gz b/instances/or-lib/20_0_4_w.json.gz new file mode 100644 index 0000000..3e0a5d0 Binary files /dev/null and b/instances/or-lib/20_0_4_w.json.gz differ diff --git a/instances/or-lib/20_0_5_w.json.gz b/instances/or-lib/20_0_5_w.json.gz new file mode 100644 index 0000000..be6dab0 Binary files /dev/null and b/instances/or-lib/20_0_5_w.json.gz differ diff --git a/instances/or-lib/50_0_1_w.json.gz b/instances/or-lib/50_0_1_w.json.gz new file mode 100644 index 0000000..89f02d4 Binary files /dev/null and b/instances/or-lib/50_0_1_w.json.gz differ diff --git a/instances/or-lib/50_0_2_w.json.gz b/instances/or-lib/50_0_2_w.json.gz new file mode 100644 index 0000000..a2ffbde Binary files /dev/null and b/instances/or-lib/50_0_2_w.json.gz differ diff --git a/instances/or-lib/50_0_3_w.json.gz b/instances/or-lib/50_0_3_w.json.gz new file mode 100644 index 0000000..1107598 Binary files /dev/null and b/instances/or-lib/50_0_3_w.json.gz differ diff --git a/instances/or-lib/50_0_4_w.json.gz b/instances/or-lib/50_0_4_w.json.gz new file mode 100644 index 0000000..4be1c33 Binary files /dev/null and b/instances/or-lib/50_0_4_w.json.gz differ diff --git a/instances/or-lib/50_0_5_w.json.gz b/instances/or-lib/50_0_5_w.json.gz new file mode 100644 index 0000000..96e4666 Binary files /dev/null and b/instances/or-lib/50_0_5_w.json.gz differ diff --git a/instances/or-lib/75_0_1_w.json.gz b/instances/or-lib/75_0_1_w.json.gz new file mode 100644 index 0000000..c17047a Binary files /dev/null and b/instances/or-lib/75_0_1_w.json.gz differ diff --git a/instances/or-lib/75_0_2_w.json.gz b/instances/or-lib/75_0_2_w.json.gz new file mode 100644 index 0000000..217e0e3 Binary files /dev/null and b/instances/or-lib/75_0_2_w.json.gz differ diff --git a/instances/or-lib/75_0_3_w.json.gz b/instances/or-lib/75_0_3_w.json.gz new file mode 100644 index 0000000..93776ef Binary files /dev/null and b/instances/or-lib/75_0_3_w.json.gz differ diff --git a/instances/or-lib/75_0_4_w.json.gz b/instances/or-lib/75_0_4_w.json.gz new file mode 100644 index 0000000..42b5fee Binary files /dev/null and b/instances/or-lib/75_0_4_w.json.gz differ diff --git a/instances/or-lib/75_0_5_w.json.gz b/instances/or-lib/75_0_5_w.json.gz new file mode 100644 index 0000000..026785e Binary files /dev/null and b/instances/or-lib/75_0_5_w.json.gz differ diff --git a/instances/pglib-uc/ca/2014-09-01_reserves_0.json.gz b/instances/pglib-uc/ca/2014-09-01_reserves_0.json.gz index 26cbf2f..0cebe6c 100644 Binary files a/instances/pglib-uc/ca/2014-09-01_reserves_0.json.gz and b/instances/pglib-uc/ca/2014-09-01_reserves_0.json.gz differ diff --git a/instances/pglib-uc/ca/2014-09-01_reserves_1.json.gz b/instances/pglib-uc/ca/2014-09-01_reserves_1.json.gz index 4f25b78..b2e33f5 100644 Binary files a/instances/pglib-uc/ca/2014-09-01_reserves_1.json.gz and b/instances/pglib-uc/ca/2014-09-01_reserves_1.json.gz differ diff --git a/instances/pglib-uc/ca/2014-09-01_reserves_3.json.gz b/instances/pglib-uc/ca/2014-09-01_reserves_3.json.gz index a201a48..9ec5b0c 100644 Binary files a/instances/pglib-uc/ca/2014-09-01_reserves_3.json.gz and b/instances/pglib-uc/ca/2014-09-01_reserves_3.json.gz differ diff --git a/instances/pglib-uc/ca/2014-09-01_reserves_5.json.gz b/instances/pglib-uc/ca/2014-09-01_reserves_5.json.gz index f587b9a..1aec4f9 100644 Binary files a/instances/pglib-uc/ca/2014-09-01_reserves_5.json.gz and b/instances/pglib-uc/ca/2014-09-01_reserves_5.json.gz differ diff --git a/instances/pglib-uc/ca/2014-12-01_reserves_0.json.gz b/instances/pglib-uc/ca/2014-12-01_reserves_0.json.gz index 077afec..65aaba4 100644 Binary files a/instances/pglib-uc/ca/2014-12-01_reserves_0.json.gz and b/instances/pglib-uc/ca/2014-12-01_reserves_0.json.gz differ diff --git a/instances/pglib-uc/ca/2014-12-01_reserves_1.json.gz b/instances/pglib-uc/ca/2014-12-01_reserves_1.json.gz index a4701cd..796f16f 100644 Binary files a/instances/pglib-uc/ca/2014-12-01_reserves_1.json.gz and b/instances/pglib-uc/ca/2014-12-01_reserves_1.json.gz differ diff --git a/instances/pglib-uc/ca/2014-12-01_reserves_3.json.gz b/instances/pglib-uc/ca/2014-12-01_reserves_3.json.gz index 4779efd..1a9c3cf 100644 Binary files a/instances/pglib-uc/ca/2014-12-01_reserves_3.json.gz and b/instances/pglib-uc/ca/2014-12-01_reserves_3.json.gz differ diff --git a/instances/pglib-uc/ca/2014-12-01_reserves_5.json.gz b/instances/pglib-uc/ca/2014-12-01_reserves_5.json.gz index 710e096..c68ccae 100644 Binary files a/instances/pglib-uc/ca/2014-12-01_reserves_5.json.gz and b/instances/pglib-uc/ca/2014-12-01_reserves_5.json.gz differ diff --git a/instances/pglib-uc/ca/2015-03-01_reserves_0.json.gz b/instances/pglib-uc/ca/2015-03-01_reserves_0.json.gz index e890ec6..cd43847 100644 Binary files a/instances/pglib-uc/ca/2015-03-01_reserves_0.json.gz and b/instances/pglib-uc/ca/2015-03-01_reserves_0.json.gz differ diff --git a/instances/pglib-uc/ca/2015-03-01_reserves_1.json.gz b/instances/pglib-uc/ca/2015-03-01_reserves_1.json.gz index 1172764..869dd90 100644 Binary files a/instances/pglib-uc/ca/2015-03-01_reserves_1.json.gz and b/instances/pglib-uc/ca/2015-03-01_reserves_1.json.gz differ diff --git a/instances/pglib-uc/ca/2015-03-01_reserves_3.json.gz b/instances/pglib-uc/ca/2015-03-01_reserves_3.json.gz index 69c8a1a..d17214e 100644 Binary files a/instances/pglib-uc/ca/2015-03-01_reserves_3.json.gz and b/instances/pglib-uc/ca/2015-03-01_reserves_3.json.gz differ diff --git a/instances/pglib-uc/ca/2015-03-01_reserves_5.json.gz b/instances/pglib-uc/ca/2015-03-01_reserves_5.json.gz index d00bc8e..a9b17e1 100644 Binary files a/instances/pglib-uc/ca/2015-03-01_reserves_5.json.gz and b/instances/pglib-uc/ca/2015-03-01_reserves_5.json.gz differ diff --git a/instances/pglib-uc/ca/2015-06-01_reserves_0.json.gz b/instances/pglib-uc/ca/2015-06-01_reserves_0.json.gz index da6fd7d..a678b11 100644 Binary files a/instances/pglib-uc/ca/2015-06-01_reserves_0.json.gz and b/instances/pglib-uc/ca/2015-06-01_reserves_0.json.gz differ diff --git a/instances/pglib-uc/ca/2015-06-01_reserves_1.json.gz b/instances/pglib-uc/ca/2015-06-01_reserves_1.json.gz index b387208..dd2a211 100644 Binary files a/instances/pglib-uc/ca/2015-06-01_reserves_1.json.gz and b/instances/pglib-uc/ca/2015-06-01_reserves_1.json.gz differ diff --git a/instances/pglib-uc/ca/2015-06-01_reserves_3.json.gz b/instances/pglib-uc/ca/2015-06-01_reserves_3.json.gz index f9686f3..8eaa8fe 100644 Binary files a/instances/pglib-uc/ca/2015-06-01_reserves_3.json.gz and b/instances/pglib-uc/ca/2015-06-01_reserves_3.json.gz differ diff --git a/instances/pglib-uc/ca/2015-06-01_reserves_5.json.gz b/instances/pglib-uc/ca/2015-06-01_reserves_5.json.gz index dab7eb3..4013bd7 100644 Binary files a/instances/pglib-uc/ca/2015-06-01_reserves_5.json.gz and b/instances/pglib-uc/ca/2015-06-01_reserves_5.json.gz differ diff --git a/instances/pglib-uc/ca/Scenario400_reserves_0.json.gz b/instances/pglib-uc/ca/Scenario400_reserves_0.json.gz index 032349f..617c9b1 100644 Binary files a/instances/pglib-uc/ca/Scenario400_reserves_0.json.gz and b/instances/pglib-uc/ca/Scenario400_reserves_0.json.gz differ diff --git a/instances/pglib-uc/ca/Scenario400_reserves_1.json.gz b/instances/pglib-uc/ca/Scenario400_reserves_1.json.gz index 8cbd8ae..848e06a 100644 Binary files a/instances/pglib-uc/ca/Scenario400_reserves_1.json.gz and b/instances/pglib-uc/ca/Scenario400_reserves_1.json.gz differ diff --git a/instances/pglib-uc/ca/Scenario400_reserves_3.json.gz b/instances/pglib-uc/ca/Scenario400_reserves_3.json.gz index 0777f6a..52f45c6 100644 Binary files a/instances/pglib-uc/ca/Scenario400_reserves_3.json.gz and b/instances/pglib-uc/ca/Scenario400_reserves_3.json.gz differ diff --git a/instances/pglib-uc/ca/Scenario400_reserves_5.json.gz b/instances/pglib-uc/ca/Scenario400_reserves_5.json.gz index 7c49ef6..9279988 100644 Binary files a/instances/pglib-uc/ca/Scenario400_reserves_5.json.gz and b/instances/pglib-uc/ca/Scenario400_reserves_5.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-01-01_hw.json.gz b/instances/pglib-uc/ferc/2015-01-01_hw.json.gz index 37b05d1..fa7dc93 100644 Binary files a/instances/pglib-uc/ferc/2015-01-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-01-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-01-01_lw.json.gz b/instances/pglib-uc/ferc/2015-01-01_lw.json.gz index e4131b5..8d9e040 100644 Binary files a/instances/pglib-uc/ferc/2015-01-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-01-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-02-01_hw.json.gz b/instances/pglib-uc/ferc/2015-02-01_hw.json.gz index 74b6f0d..057627e 100644 Binary files a/instances/pglib-uc/ferc/2015-02-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-02-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-02-01_lw.json.gz b/instances/pglib-uc/ferc/2015-02-01_lw.json.gz index b8f9c7a..5500c60 100644 Binary files a/instances/pglib-uc/ferc/2015-02-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-02-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-03-01_hw.json.gz b/instances/pglib-uc/ferc/2015-03-01_hw.json.gz index 5c1e6c1..fc6683d 100644 Binary files a/instances/pglib-uc/ferc/2015-03-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-03-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-03-01_lw.json.gz b/instances/pglib-uc/ferc/2015-03-01_lw.json.gz index 44476a6..b606435 100644 Binary files a/instances/pglib-uc/ferc/2015-03-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-03-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-04-01_hw.json.gz b/instances/pglib-uc/ferc/2015-04-01_hw.json.gz index 1d71ff7..8486c2b 100644 Binary files a/instances/pglib-uc/ferc/2015-04-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-04-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-04-01_lw.json.gz b/instances/pglib-uc/ferc/2015-04-01_lw.json.gz index bf4fc5d..dd09558 100644 Binary files a/instances/pglib-uc/ferc/2015-04-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-04-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-05-01_hw.json.gz b/instances/pglib-uc/ferc/2015-05-01_hw.json.gz index f1929f2..d645660 100644 Binary files a/instances/pglib-uc/ferc/2015-05-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-05-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-05-01_lw.json.gz b/instances/pglib-uc/ferc/2015-05-01_lw.json.gz index 8d4aa84..5e9ef9b 100644 Binary files a/instances/pglib-uc/ferc/2015-05-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-05-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-06-01_hw.json.gz b/instances/pglib-uc/ferc/2015-06-01_hw.json.gz index 95a2b23..86b9bb8 100644 Binary files a/instances/pglib-uc/ferc/2015-06-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-06-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-06-01_lw.json.gz b/instances/pglib-uc/ferc/2015-06-01_lw.json.gz index 0b39f38..c75a2db 100644 Binary files a/instances/pglib-uc/ferc/2015-06-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-06-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-07-01_hw.json.gz b/instances/pglib-uc/ferc/2015-07-01_hw.json.gz index 3019227..b547cd4 100644 Binary files a/instances/pglib-uc/ferc/2015-07-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-07-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-07-01_lw.json.gz b/instances/pglib-uc/ferc/2015-07-01_lw.json.gz index 9f0ce64..f393dcd 100644 Binary files a/instances/pglib-uc/ferc/2015-07-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-07-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-08-01_hw.json.gz b/instances/pglib-uc/ferc/2015-08-01_hw.json.gz index 25b22a0..6dcb8d5 100644 Binary files a/instances/pglib-uc/ferc/2015-08-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-08-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-08-01_lw.json.gz b/instances/pglib-uc/ferc/2015-08-01_lw.json.gz index 50a3867..cf2378c 100644 Binary files a/instances/pglib-uc/ferc/2015-08-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-08-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-09-01_hw.json.gz b/instances/pglib-uc/ferc/2015-09-01_hw.json.gz index ad30323..70cfed2 100644 Binary files a/instances/pglib-uc/ferc/2015-09-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-09-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-09-01_lw.json.gz b/instances/pglib-uc/ferc/2015-09-01_lw.json.gz index 8eaf80b..1d17667 100644 Binary files a/instances/pglib-uc/ferc/2015-09-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-09-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-10-01_hw.json.gz b/instances/pglib-uc/ferc/2015-10-01_hw.json.gz index ae8ec6e..4da1e00 100644 Binary files a/instances/pglib-uc/ferc/2015-10-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-10-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-10-01_lw.json.gz b/instances/pglib-uc/ferc/2015-10-01_lw.json.gz index a64be17..42b0c68 100644 Binary files a/instances/pglib-uc/ferc/2015-10-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-10-01_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-11-02_hw.json.gz b/instances/pglib-uc/ferc/2015-11-02_hw.json.gz index 7b77ff2..650441d 100644 Binary files a/instances/pglib-uc/ferc/2015-11-02_hw.json.gz and b/instances/pglib-uc/ferc/2015-11-02_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-11-02_lw.json.gz b/instances/pglib-uc/ferc/2015-11-02_lw.json.gz index cf00a2c..560f9ef 100644 Binary files a/instances/pglib-uc/ferc/2015-11-02_lw.json.gz and b/instances/pglib-uc/ferc/2015-11-02_lw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-12-01_hw.json.gz b/instances/pglib-uc/ferc/2015-12-01_hw.json.gz index f21388f..6a6b848 100644 Binary files a/instances/pglib-uc/ferc/2015-12-01_hw.json.gz and b/instances/pglib-uc/ferc/2015-12-01_hw.json.gz differ diff --git a/instances/pglib-uc/ferc/2015-12-01_lw.json.gz b/instances/pglib-uc/ferc/2015-12-01_lw.json.gz index 99517d3..5483439 100644 Binary files a/instances/pglib-uc/ferc/2015-12-01_lw.json.gz and b/instances/pglib-uc/ferc/2015-12-01_lw.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-01-27.json.gz b/instances/pglib-uc/rts_gmlc/2020-01-27.json.gz index 41417a1..874077a 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-01-27.json.gz and b/instances/pglib-uc/rts_gmlc/2020-01-27.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-02-09.json.gz b/instances/pglib-uc/rts_gmlc/2020-02-09.json.gz index ab113b8..88d4169 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-02-09.json.gz and b/instances/pglib-uc/rts_gmlc/2020-02-09.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-03-05.json.gz b/instances/pglib-uc/rts_gmlc/2020-03-05.json.gz index e7f0869..4a10488 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-03-05.json.gz and b/instances/pglib-uc/rts_gmlc/2020-03-05.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-04-03.json.gz b/instances/pglib-uc/rts_gmlc/2020-04-03.json.gz index 94da410..e66cf27 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-04-03.json.gz and b/instances/pglib-uc/rts_gmlc/2020-04-03.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-05-05.json.gz b/instances/pglib-uc/rts_gmlc/2020-05-05.json.gz index c101016..35b8c02 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-05-05.json.gz and b/instances/pglib-uc/rts_gmlc/2020-05-05.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-06-09.json.gz b/instances/pglib-uc/rts_gmlc/2020-06-09.json.gz index 78ae2f1..01e2fb5 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-06-09.json.gz and b/instances/pglib-uc/rts_gmlc/2020-06-09.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-07-06.json.gz b/instances/pglib-uc/rts_gmlc/2020-07-06.json.gz index 5718514..f2077ba 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-07-06.json.gz and b/instances/pglib-uc/rts_gmlc/2020-07-06.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-08-12.json.gz b/instances/pglib-uc/rts_gmlc/2020-08-12.json.gz index 9418f6d..d940933 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-08-12.json.gz and b/instances/pglib-uc/rts_gmlc/2020-08-12.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-09-20.json.gz b/instances/pglib-uc/rts_gmlc/2020-09-20.json.gz index 0a90287..1f5fa94 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-09-20.json.gz and b/instances/pglib-uc/rts_gmlc/2020-09-20.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-10-27.json.gz b/instances/pglib-uc/rts_gmlc/2020-10-27.json.gz index 50e7b9f..72bc446 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-10-27.json.gz and b/instances/pglib-uc/rts_gmlc/2020-10-27.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-11-25.json.gz b/instances/pglib-uc/rts_gmlc/2020-11-25.json.gz index 47729bb..8bd85a2 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-11-25.json.gz and b/instances/pglib-uc/rts_gmlc/2020-11-25.json.gz differ diff --git a/instances/pglib-uc/rts_gmlc/2020-12-23.json.gz b/instances/pglib-uc/rts_gmlc/2020-12-23.json.gz index e1a095e..8bd2a96 100644 Binary files a/instances/pglib-uc/rts_gmlc/2020-12-23.json.gz and b/instances/pglib-uc/rts_gmlc/2020-12-23.json.gz differ diff --git a/instances/tejada19/UC_168h_105g.json.gz b/instances/tejada19/UC_168h_105g.json.gz new file mode 100644 index 0000000..da4b4a6 Binary files /dev/null and b/instances/tejada19/UC_168h_105g.json.gz differ diff --git a/instances/tejada19/UC_168h_110g.json.gz b/instances/tejada19/UC_168h_110g.json.gz new file mode 100644 index 0000000..37c6979 Binary files /dev/null and b/instances/tejada19/UC_168h_110g.json.gz differ diff --git a/instances/tejada19/UC_168h_125g.json.gz b/instances/tejada19/UC_168h_125g.json.gz new file mode 100644 index 0000000..cdae0c8 Binary files /dev/null and b/instances/tejada19/UC_168h_125g.json.gz differ diff --git a/instances/tejada19/UC_168h_130g.json.gz b/instances/tejada19/UC_168h_130g.json.gz new file mode 100644 index 0000000..c3731b5 Binary files /dev/null and b/instances/tejada19/UC_168h_130g.json.gz differ diff --git a/instances/tejada19/UC_168h_131g.json.gz b/instances/tejada19/UC_168h_131g.json.gz new file mode 100644 index 0000000..24086c3 Binary files /dev/null and b/instances/tejada19/UC_168h_131g.json.gz differ diff --git a/instances/tejada19/UC_168h_140g.json.gz b/instances/tejada19/UC_168h_140g.json.gz new file mode 100644 index 0000000..a6b657d Binary files /dev/null and b/instances/tejada19/UC_168h_140g.json.gz differ diff --git a/instances/tejada19/UC_168h_165g.json.gz b/instances/tejada19/UC_168h_165g.json.gz new file mode 100644 index 0000000..81ac577 Binary files /dev/null and b/instances/tejada19/UC_168h_165g.json.gz differ diff --git a/instances/tejada19/UC_168h_175g.json.gz b/instances/tejada19/UC_168h_175g.json.gz new file mode 100644 index 0000000..2a5a0af Binary files /dev/null and b/instances/tejada19/UC_168h_175g.json.gz differ diff --git a/instances/tejada19/UC_168h_179g.json.gz b/instances/tejada19/UC_168h_179g.json.gz new file mode 100644 index 0000000..8fdde57 Binary files /dev/null and b/instances/tejada19/UC_168h_179g.json.gz differ diff --git a/instances/tejada19/UC_168h_188g.json.gz b/instances/tejada19/UC_168h_188g.json.gz new file mode 100644 index 0000000..9a26e1f Binary files /dev/null and b/instances/tejada19/UC_168h_188g.json.gz differ diff --git a/instances/tejada19/UC_168h_192g.json.gz b/instances/tejada19/UC_168h_192g.json.gz new file mode 100644 index 0000000..637a47b Binary files /dev/null and b/instances/tejada19/UC_168h_192g.json.gz differ diff --git a/instances/tejada19/UC_168h_199g.json.gz b/instances/tejada19/UC_168h_199g.json.gz new file mode 100644 index 0000000..129e135 Binary files /dev/null and b/instances/tejada19/UC_168h_199g.json.gz differ diff --git a/instances/tejada19/UC_168h_36g.json.gz b/instances/tejada19/UC_168h_36g.json.gz new file mode 100644 index 0000000..71baf94 Binary files /dev/null and b/instances/tejada19/UC_168h_36g.json.gz differ diff --git a/instances/tejada19/UC_168h_38g.json.gz b/instances/tejada19/UC_168h_38g.json.gz new file mode 100644 index 0000000..c7ae4fc Binary files /dev/null and b/instances/tejada19/UC_168h_38g.json.gz differ diff --git a/instances/tejada19/UC_168h_40g.json.gz b/instances/tejada19/UC_168h_40g.json.gz new file mode 100644 index 0000000..90f4b09 Binary files /dev/null and b/instances/tejada19/UC_168h_40g.json.gz differ diff --git a/instances/tejada19/UC_168h_53g.json.gz b/instances/tejada19/UC_168h_53g.json.gz new file mode 100644 index 0000000..77db66d Binary files /dev/null and b/instances/tejada19/UC_168h_53g.json.gz differ diff --git a/instances/tejada19/UC_168h_58g.json.gz b/instances/tejada19/UC_168h_58g.json.gz new file mode 100644 index 0000000..4a36b79 Binary files /dev/null and b/instances/tejada19/UC_168h_58g.json.gz differ diff --git a/instances/tejada19/UC_168h_59g.json.gz b/instances/tejada19/UC_168h_59g.json.gz new file mode 100644 index 0000000..bd93cc0 Binary files /dev/null and b/instances/tejada19/UC_168h_59g.json.gz differ diff --git a/instances/tejada19/UC_168h_72g.json.gz b/instances/tejada19/UC_168h_72g.json.gz new file mode 100644 index 0000000..1358790 Binary files /dev/null and b/instances/tejada19/UC_168h_72g.json.gz differ diff --git a/instances/tejada19/UC_168h_84g.json.gz b/instances/tejada19/UC_168h_84g.json.gz new file mode 100644 index 0000000..4aa391d Binary files /dev/null and b/instances/tejada19/UC_168h_84g.json.gz differ diff --git a/instances/tejada19/UC_168h_86g.json.gz b/instances/tejada19/UC_168h_86g.json.gz new file mode 100644 index 0000000..9ef10f4 Binary files /dev/null and b/instances/tejada19/UC_168h_86g.json.gz differ diff --git a/instances/tejada19/UC_168h_88g.json.gz b/instances/tejada19/UC_168h_88g.json.gz new file mode 100644 index 0000000..aaf3cf9 Binary files /dev/null and b/instances/tejada19/UC_168h_88g.json.gz differ diff --git a/instances/tejada19/UC_168h_93g.json.gz b/instances/tejada19/UC_168h_93g.json.gz new file mode 100644 index 0000000..c00592b Binary files /dev/null and b/instances/tejada19/UC_168h_93g.json.gz differ diff --git a/instances/tejada19/UC_24h_1069g.json.gz b/instances/tejada19/UC_24h_1069g.json.gz new file mode 100644 index 0000000..050eb53 Binary files /dev/null and b/instances/tejada19/UC_24h_1069g.json.gz differ diff --git a/instances/tejada19/UC_24h_1130g.json.gz b/instances/tejada19/UC_24h_1130g.json.gz new file mode 100644 index 0000000..8174a5a Binary files /dev/null and b/instances/tejada19/UC_24h_1130g.json.gz differ diff --git a/instances/tejada19/UC_24h_1376g.json.gz b/instances/tejada19/UC_24h_1376g.json.gz new file mode 100644 index 0000000..f5652ed Binary files /dev/null and b/instances/tejada19/UC_24h_1376g.json.gz differ diff --git a/instances/tejada19/UC_24h_1393g.json.gz b/instances/tejada19/UC_24h_1393g.json.gz new file mode 100644 index 0000000..f195fca Binary files /dev/null and b/instances/tejada19/UC_24h_1393g.json.gz differ diff --git a/instances/tejada19/UC_24h_1577g.json.gz b/instances/tejada19/UC_24h_1577g.json.gz new file mode 100644 index 0000000..ca2d888 Binary files /dev/null and b/instances/tejada19/UC_24h_1577g.json.gz differ diff --git a/instances/tejada19/UC_24h_1615g.json.gz b/instances/tejada19/UC_24h_1615g.json.gz new file mode 100644 index 0000000..35d6b54 Binary files /dev/null and b/instances/tejada19/UC_24h_1615g.json.gz differ diff --git a/instances/tejada19/UC_24h_1632g.json.gz b/instances/tejada19/UC_24h_1632g.json.gz new file mode 100644 index 0000000..1030f74 Binary files /dev/null and b/instances/tejada19/UC_24h_1632g.json.gz differ diff --git a/instances/tejada19/UC_24h_1768g.json.gz b/instances/tejada19/UC_24h_1768g.json.gz new file mode 100644 index 0000000..3c62a8e Binary files /dev/null and b/instances/tejada19/UC_24h_1768g.json.gz differ diff --git a/instances/tejada19/UC_24h_1804g.json.gz b/instances/tejada19/UC_24h_1804g.json.gz new file mode 100644 index 0000000..1942415 Binary files /dev/null and b/instances/tejada19/UC_24h_1804g.json.gz differ diff --git a/instances/tejada19/UC_24h_1820g.json.gz b/instances/tejada19/UC_24h_1820g.json.gz new file mode 100644 index 0000000..9a35d54 Binary files /dev/null and b/instances/tejada19/UC_24h_1820g.json.gz differ diff --git a/instances/tejada19/UC_24h_1823g.json.gz b/instances/tejada19/UC_24h_1823g.json.gz new file mode 100644 index 0000000..00ed15b Binary files /dev/null and b/instances/tejada19/UC_24h_1823g.json.gz differ diff --git a/instances/tejada19/UC_24h_1888g.json.gz b/instances/tejada19/UC_24h_1888g.json.gz new file mode 100644 index 0000000..4de3623 Binary files /dev/null and b/instances/tejada19/UC_24h_1888g.json.gz differ diff --git a/instances/tejada19/UC_24h_214g.json.gz b/instances/tejada19/UC_24h_214g.json.gz new file mode 100644 index 0000000..07be60c Binary files /dev/null and b/instances/tejada19/UC_24h_214g.json.gz differ diff --git a/instances/tejada19/UC_24h_250g.json.gz b/instances/tejada19/UC_24h_250g.json.gz new file mode 100644 index 0000000..6866a18 Binary files /dev/null and b/instances/tejada19/UC_24h_250g.json.gz differ diff --git a/instances/tejada19/UC_24h_290g.json.gz b/instances/tejada19/UC_24h_290g.json.gz new file mode 100644 index 0000000..1f597e1 Binary files /dev/null and b/instances/tejada19/UC_24h_290g.json.gz differ diff --git a/instances/tejada19/UC_24h_480g.json.gz b/instances/tejada19/UC_24h_480g.json.gz new file mode 100644 index 0000000..2c44354 Binary files /dev/null and b/instances/tejada19/UC_24h_480g.json.gz differ diff --git a/instances/tejada19/UC_24h_505g.json.gz b/instances/tejada19/UC_24h_505g.json.gz new file mode 100644 index 0000000..c8eff53 Binary files /dev/null and b/instances/tejada19/UC_24h_505g.json.gz differ diff --git a/instances/tejada19/UC_24h_623g.json.gz b/instances/tejada19/UC_24h_623g.json.gz new file mode 100644 index 0000000..1c00a34 Binary files /dev/null and b/instances/tejada19/UC_24h_623g.json.gz differ diff --git a/instances/tejada19/UC_24h_647g.json.gz b/instances/tejada19/UC_24h_647g.json.gz new file mode 100644 index 0000000..c650dbe Binary files /dev/null and b/instances/tejada19/UC_24h_647g.json.gz differ diff --git a/instances/tejada19/UC_24h_836g.json.gz b/instances/tejada19/UC_24h_836g.json.gz new file mode 100644 index 0000000..7ff637d Binary files /dev/null and b/instances/tejada19/UC_24h_836g.json.gz differ diff --git a/instances/tejada19/UC_24h_850g.json.gz b/instances/tejada19/UC_24h_850g.json.gz new file mode 100644 index 0000000..8893046 Binary files /dev/null and b/instances/tejada19/UC_24h_850g.json.gz differ diff --git a/instances/tejada19/UC_24h_918g.json.gz b/instances/tejada19/UC_24h_918g.json.gz new file mode 100644 index 0000000..278158d Binary files /dev/null and b/instances/tejada19/UC_24h_918g.json.gz differ diff --git a/instances/tejada19/UC_24h_931g.json.gz b/instances/tejada19/UC_24h_931g.json.gz new file mode 100644 index 0000000..84dbbd0 Binary files /dev/null and b/instances/tejada19/UC_24h_931g.json.gz differ diff --git a/instances/tejada19/UC_24h_940g.json.gz b/instances/tejada19/UC_24h_940g.json.gz new file mode 100644 index 0000000..67a188a Binary files /dev/null and b/instances/tejada19/UC_24h_940g.json.gz differ diff --git a/instances/tejada19/UC_24h_957g.json.gz b/instances/tejada19/UC_24h_957g.json.gz new file mode 100644 index 0000000..3e565ec Binary files /dev/null and b/instances/tejada19/UC_24h_957g.json.gz differ diff --git a/instances/tejada19/UC_24h_959g.json.gz b/instances/tejada19/UC_24h_959g.json.gz new file mode 100644 index 0000000..88145b9 Binary files /dev/null and b/instances/tejada19/UC_24h_959g.json.gz differ diff --git a/mkdocs.yml b/mkdocs.yml index 08fbcad..6c64aad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,17 +1,22 @@ site_name: UnitCommitment.jl -theme: cinder +theme: + name: cinder + hljs_languages: + - julia copyright: "Copyright © 2020, UChicago Argonne, LLC. All Rights Reserved." -repo_url: https://github.com/ -edit_uri: edit/master/src/docs/ +repo_url: https://github.com/ANL-CEEESA/unitcommitment.jl +edit_uri: edit/dev/src/docs/ nav: - Home: index.md - - Install: install.md - - Data: format.md + - Usage: usage.md + - Format: format.md + - Instances: instances.md plugins: - search markdown_extensions: - admonition - mdx_math + - fenced_code extra_javascript: - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML - js/mathjax.js diff --git a/src/docs/format.md b/src/docs/format.md index 4dcd6fa..2d48263 100644 --- a/src/docs/format.md +++ b/src/docs/format.md @@ -1,19 +1,21 @@ Data Format =========== +## 1. Input Data Format + Instances are specified by JSON files containing the following main sections: -* [Parameters](#parameters) -* [Buses](#buses) -* [Generators](#generators) -* [Price-sensitive loads](#price-sensitive-loads) -* [Transmission lines](#transmission-lines) -* [Reserves](#reserves) -* [Contingencies](#contingencies) +* Parameters +* Buses +* Generators +* Price-sensitive loads +* Transmission lines +* Reserves +* Contingencies -Each section is described in detail below. For a complete example, see [case14.json](https://github.com/ANL-CEEESA/UnitCommitment.jl/blob/dev/instances/matpower-24h/case14.json). +Each section is described in detail below. For a complete example, see [case14](https://github.com/ANL-CEEESA/UnitCommitment.jl/tree/dev/instances/matpower/case14). -## Parameters +### 1.1 Parameters This section describes system-wide parameters, such as power balance penalties, and optimization parameters, such as the length of the planning horizon. @@ -23,7 +25,7 @@ This section describes system-wide parameters, such as power balance penalties, | `Power balance penalty ($/MW)` | Penalty for system-wide shortage or surplus in production (in $/MW). This is charged per time period. For example, if there is a shortage of 1 MW for three time periods, three times this amount will be charged. | `1000.0` | Y -### Example +#### Example ```json { "Parameters": { @@ -33,7 +35,7 @@ This section describes system-wide parameters, such as power balance penalties, } ``` -## Buses +### 1.2 Buses This section describes the characteristics of each bus in the system. @@ -42,7 +44,7 @@ This section describes the characteristics of each bus in the system. | `Load (MW)` | Fixed load connected to the bus (in MW). | Required | Y -### Example +#### Example ```json { "Buses": { @@ -62,7 +64,7 @@ This section describes the characteristics of each bus in the system. ``` -## Generators +### 1.3 Generators This section describes all generators in the system, including thermal units, renewable units and virtual units. @@ -82,7 +84,7 @@ This section describes all generators in the system, including thermal units, re | `Must run?` | If `true`, the generator should be committed, even that is not economical (Boolean). | `false` | Y | `Provides spinning reserves?` | If `true`, this generator may provide spinning reserves (Boolean). | `true` | Y -### Production costs and limits +#### Production costs and limits Production costs are represented as piecewise-linear curves. Figure 1 shows an example cost curve with three segments, where it costs 1400, 1600, 2200 and 2400 dollars to generate, respectively, 100, 110, 130 and 135 MW of power. To model this generator, `Production cost curve (MW)` should be set to `[100, 110, 130, 135]`, and `Production cost curve ($)` should be set to `[1400, 1600, 2200, 2400]`. Note that this curve also specifies the production limits. Specifically, the first point identifies the minimum power output when the unit is operational, while the last point identifies the maximum power output. @@ -93,14 +95,14 @@ Note that this curve also specifies the production limits. Specifically, the fir
-**Additional remarks:** +#### Additional remarks: * For time-dependent production limits or time-dependent production costs, the usage of nested arrays is allowed. For example, if `Production cost curve (MW)` is set to `[5.0, [10.0, 12.0, 15.0, 20.0]]`, then the unit may generate at most 10, 12, 15 and 20 MW of power during time periods 1, 2, 3 and 4, respectively. The minimum output for all time periods is fixed to at 5 MW. * There is no limit to the number of piecewise-linear segments, and different generators may have a different number of segments. * If `Production cost curve (MW)` and `Production cost curve ($)` both contain a single element, then the generator must produce exactly that amount of power when operational. To specify that the generator may produce any amount of power up to a certain limit `P`, the parameter `Production cost curve (MW)` should be set to `[0, P]`. * Production cost curves must be convex. -### Example +#### Example ```json { @@ -131,7 +133,7 @@ Note that this curve also specifies the production limits. Specifically, the fir } ``` -## Price-sensitive loads +### 1.4 Price-sensitive loads This section describes components in the system which may increase or reduce their energy consumption according to the energy prices. Fixed loads (as described in the `buses` section) are always served, regardless of the price, unless there is significant congestion in the system or insufficient production capacity. Price-sensitive loads, on the other hand, are only served if it is economical to do so. @@ -142,7 +144,7 @@ This section describes components in the system which may increase or reduce the | `Demand (MW)` | Maximum amount of power required by this load. Any amount lower than this may be served. | Required | Y -### Example +#### Example ```json { "Price-sensitive loads": { @@ -155,7 +157,7 @@ This section describes components in the system which may increase or reduce the } ``` -## Transmission Lines +### 1.5 Transmission Lines This section describes the characteristics of transmission system, such as its topology and the susceptance of each transmission line. @@ -169,7 +171,7 @@ This section describes the characteristics of transmission system, such as its t | `Emergency flow limit (MW)` | Maximum amount of power (in MW) allowed to flow through the line when the system is in degraded state (for example, after the failure of another transmission line). | `+inf` | Y | `Flow limit penalty ($/MW)` | Penalty for violating the flow limits of the transmission line (in $/MW). This is charged per time period. For example, if there is a thermal violation of 1 MW for three time periods, three times this amount will be charged. | `5000.0` | Y -### Example +#### Example ```json { @@ -188,7 +190,7 @@ This section describes the characteristics of transmission system, such as its t ``` -## Reserves +### 1.6 Reserves This section describes the hourly amount of operating reserves required. @@ -197,7 +199,7 @@ This section describes the hourly amount of operating reserves required. | :-------------------- | :------------------------------------------------- | --------- | :----: | `Spinning (MW)` | Minimum amount of system-wide spinning reserves (in MW). Only generators which are online may provide this reserve. | `0.0` | Y -### Example +#### Example ```json { @@ -212,7 +214,7 @@ This section describes the hourly amount of operating reserves required. } ``` -## Contingencies +### 1.7 Contingencies This section describes credible contingency scenarios in the optimization, such as the loss of a transmission line or generator. @@ -221,7 +223,7 @@ This section describes credible contingency scenarios in the optimization, such | `Affected generators` | List of generators affected by this contingency. May be omitted if no generators are affected. | `[]` | `Affected lines` | List of transmission lines affected by this contingency. May be omitted if no lines are affected. | `[]` -### Example +#### Example ```json { @@ -237,9 +239,9 @@ This section describes credible contingency scenarios in the optimization, such } ``` -## Additional remarks +### 1.8 Additional remarks -### Time series parameters +#### Time series parameters Many numerical properties in the JSON file can be specified either as a single floating point number if they are time-independent, or as an array containing exactly `T` elements, where `T` is the length of the planning horizon, if they are time-dependent. For example, both formats below are valid when `T=3`: @@ -250,8 +252,13 @@ Many numerical properties in the JSON file can be specified either as a single f } ``` -### Current limitations +#### Current limitations * All reserves are system-wide (no zonal reserves) * Network topology remains the same for all time periods * Only N-1 transmission contingencies are supported. Generator contingencies are not supported. +* Time-varying minimum production amounts are not currently compatible with ramp/startup/shutdown limits. + +## 2. Output Data Format + +The output data format is also JSON-based, but it is not currently documented since we expect it to change significantly in a future version of the package. \ No newline at end of file diff --git a/src/docs/index.md b/src/docs/index.md index 58ed244..74c79c2 100644 --- a/src/docs/index.md +++ b/src/docs/index.md @@ -1,23 +1,42 @@ # UnitCommitment.jl -**UnitCommitment.jl** is an optimization package for the Security-Constrained Unit Commitment Problem (SCUC), a fundamental optimization problem in power systems which is used, for example, to clear the day-ahead electricity markets. The problem asks for the most cost-effective power generation schedule under a number of physical, operational and economic constraints. +**UnitCommitment.jl** (UC.jl) is a Julia optimization package for the Security-Constrained Unit Commitment Problem (SCUC), a fundamental optimization problem in power systems used, for example, to clear the day-ahead electricity markets. The package provides benchmark instances for the problem and Julia/JuMP implementations of state-of-the-art mixed-integer programming formulations. ### Package Components -* **Data Format:** The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. -* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic, based on publicly available data from ISOs. +* **Data Format:** The package proposes an extensible and fully-documented JSON-based data specification format for SCUC, developed in collaboration with Independent System Operators (ISOs), which describes the most important aspects of the problem. The format supports all the most common generator characteristics (including ramping, piecewise-linear production cost curves and time-dependent startup costs), as well as operating reserves, price-sensitive loads, transmission networks and contingencies. +* **Benchmark Instances:** The package provides a diverse collection of large-scale benchmark instances collected from the literature and extended to make them more challenging and realistic. * **Model Implementation**: The package provides a Julia/JuMP implementation of state-of-the-art formulations and solution methods for SCUC. Our goal is to keep this implementation up-to-date, as new methods are proposed in the literature. * **Benchmark Tools:** The package provides automated benchmark scripts to accurately evaluate the performance impact of proposed code changes. -### Contents +### Documentation -* [Installation Guide](install.md) -* [Data Format Specification](format.md) +* [Usage](usage.md) +* [Data Format](format.md) +* [Instances](instances.md) + +### Source code + +* [https://github.com/ANL-CEEESA/unitcommitment.jl](https://github.com/ANL-CEEESA/unitcommitment.jl) ### Authors -* **Alinson Santos Xavier,** Argonne National Laboratory -* **Feng Qiu,** Argonne National Laboratory +* **Alinson Santos Xavier** (Argonne National Laboratory) +* **Feng Qiu** (Argonne National Laboratory) + +### Acknowledgments + +* We would like to thank **Aleksandr M. Kazachkov** (University of Florida), **Yonghong Chen** (Midcontinent Independent System Operator), **Feng Pan** (Pacific Northwest National Laboratory) for valuable feedback on early versions of this package. + +* Based upon work supported by **Laboratory Directed Research and Development** (LDRD) funding from Argonne National Laboratory, provided by the Director, Office of Science, of the U.S. Department of Energy under Contract No. DE-AC02-06CH11357. + +### Citing + +If you use UnitCommitment.jl in your research, we request that you cite the package as follows: + +* Alinson S. Xavier, Feng Qiu, "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874). + +If you make use of the provided instances files, we request that you additionally cite the original sources, as described in the [instances page](instances.md). + +### License -### Collaborators -* **Yonghong Chen,** Midcontinent Independent System Operator -* **Feng Pan,** Pacific Northwest National Laboratory \ No newline at end of file +Released under the modified BSD license. See `LICENSE.md` for more details. \ No newline at end of file diff --git a/src/docs/install.md b/src/docs/install.md deleted file mode 100644 index da07480..0000000 --- a/src/docs/install.md +++ /dev/null @@ -1,21 +0,0 @@ -# Installation Guide - -This package was tested and developed with [Julia 1.4](https://julialang.org/). To install Julia, please -follow the [installation guide on their website](https://julialang.org/downloads/platform.html). -To install `UnitCommitment.jl`, run the Julia interpreter, type `]` to open the -package manager, then type: - -```text -pkg> add https://github.com/ANL-CEEESA/UnitCommitment.jl.git -``` - -To test that the package has been correctly installed, run: - -```text -pkg> test UnitCommitment -``` - -If all tests pass, the package should now be ready to be used by any Julia script on the machine. To try it out in the julia interpreter hit `backspace` to return to the regular interpreter, and type the following command: -```julia -using UnitCommitment -``` diff --git a/src/docs/instances.md b/src/docs/instances.md new file mode 100644 index 0000000..5b0173a --- /dev/null +++ b/src/docs/instances.md @@ -0,0 +1,325 @@ +# Instances + +UnitCommitment.jl provides a large collection of benchmark instances collected +from the literature and converted to a [common data format](format.md). In some cases, as indicated below, the original instances have been extended, with realistic parameters, using data-driven methods. +If you use these instances in your research, we request that you cite UnitCommitment.jl, as well as the original sources. + +Raw instances files are [available at our GitHub repository](https://github.com/ANL-CEEESA/UnitCommitment.jl/tree/dev/instances). Benchmark instances can also be loaded with +`UnitCommitment.read_benchmark(name)`, as explained in the [usage section](usage.md). + +## 1. MATPOWER + +[MATPOWER](https://github.com/MATPOWER/matpower) is an open-source package for solving power flow problems in MATLAB and Octave. It contains a number of power flow test cases, which have been widely used in the power systems literature. + +Because most MATPOWER test cases were originally designed for power flow studies, they lack a number of important unit commitment parameters, such as time-varying loads, production cost curves, ramp limits, reserves and initial conditions. The test cases included in UnitCommitment.jl are extended versions of the original MATPOWER test cases, modified as following: + +* **Production cost** curves were generated using a data-driven approach, based on publicly available data. More specifically, machine learning models were trained to predict typical production cost curves, for each day of the year, based on a generator's maximum and minimum power output. + +* **Load profiles** were generated using a similar data-driven approach. + +* **Ramp-up, ramp-down, startup and shutdown rates** were set to a fixed proportion of the generator's maximum output. + +* **Minimum reserves** were set to a fixed proportion of the total demand. + +* **Contingencies** were set to include all N-1 transmission line contingencies that do not generate islands or isolated buses. More specifically, there is one contingency for each transmission line, as long as that transmission line is not a bridge in the network graph. + +For each MATPOWER test case, UC.jl provides two variations (`2017-02-01` and `2017-08-01`) corresponding respectively to a winter and to a summer test case. + +### 1.1 MATPOWER/UW-PSTCA + +A variety of smaller IEEE test cases, [compiled by University of Washington](http://labs.ece.uw.edu/pstca/), corresponding mostly to small portions of the American Electric Power System in the 1960s. + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `matpower/case14/2017-02-01` | 14 | 5 | 20 | 19 | [MTPWR, PSTCA] +| `matpower/case14/2017-08-01` | 14 | 5 | 20 | 19 | [MTPWR, PSTCA] +| `matpower/case30/2017-02-01` | 30 | 6 | 41 | 38 | [MTPWR, PSTCA] +| `matpower/case30/2017-08-01` | 30 | 6 | 41 | 38 | [MTPWR, PSTCA] +| `matpower/case57/2017-02-01` | 57 | 7 | 80 | 79 | [MTPWR, PSTCA] +| `matpower/case57/2017-08-01` | 57 | 7 | 80 | 79 | [MTPWR, PSTCA] +| `matpower/case118/2017-02-01` | 118 | 54 | 186 | 177 | [MTPWR, PSTCA] +| `matpower/case118/2017-08-01` | 118 | 54 | 186 | 177 | [MTPWR, PSTCA] +| `matpower/case300/2017-02-01` | 300 | 69 | 411 | 320 | [MTPWR, PSTCA] +| `matpower/case300/2017-08-01` | 300 | 69 | 411 | 320 | [MTPWR, PSTCA] + + +### 1.2 MATPOWER/Polish + +Test cases based on the Polish 400, 220 and 110 kV networks, originally provided by **Roman Korab** (Politechnika Śląska) and corrected by the MATPOWER team. + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `matpower/case2383wp/2017-02-01` | 2383 | 323 | 2896 | 2240 | [MTPWR] +| `matpower/case2383wp/2017-08-01` | 2383 | 323 | 2896 | 2240 | [MTPWR] +| `matpower/case2736sp/2017-02-01` | 2736 | 289 | 3504 | 3159 | [MTPWR] +| `matpower/case2736sp/2017-08-01` | 2736 | 289 | 3504 | 3159 | [MTPWR] +| `matpower/case2737sop/2017-02-01` | 2737 | 267 | 3506 | 3161 | [MTPWR] +| `matpower/case2737sop/2017-08-01` | 2737 | 267 | 3506 | 3161 | [MTPWR] +| `matpower/case2746wop/2017-02-01` | 2746 | 443 | 3514 | 3155 | [MTPWR] +| `matpower/case2746wop/2017-08-01` | 2746 | 443 | 3514 | 3155 | [MTPWR] +| `matpower/case2746wp/2017-02-01` | 2746 | 457 | 3514 | 3156 | [MTPWR] +| `matpower/case2746wp/2017-08-01` | 2746 | 457 | 3514 | 3156 | [MTPWR] +| `matpower/case3012wp/2017-02-01` | 3012 | 496 | 3572 | 2854 | [MTPWR] +| `matpower/case3012wp/2017-08-01` | 3012 | 496 | 3572 | 2854 | [MTPWR] +| `matpower/case3120sp/2017-02-01` | 3120 | 483 | 3693 | 2950 | [MTPWR] +| `matpower/case3120sp/2017-08-01` | 3120 | 483 | 3693 | 2950 | [MTPWR] +| `matpower/case3375wp/2017-02-01` | 3374 | 590 | 4161 | 3245 | [MTPWR] +| `matpower/case3375wp/2017-08-01` | 3374 | 590 | 4161 | 3245 | [MTPWR] + +### 1.3 MATPOWER/PEGASE + +Test cases from the [Pan European Grid Advanced Simulation and State Estimation (PEGASE) project](https://cordis.europa.eu/project/id/211407), describing part of the European high voltage transmission network. + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `matpower/case89pegase/2017-02-01` | 89 | 12 | 210 | 192 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case89pegase/2017-08-01` | 89 | 12 | 210 | 192 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case1354pegase/2017-02-01` | 1354 | 260 | 1991 | 1288 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case1354pegase/2017-08-01` | 1354 | 260 | 1991 | 1288 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case2869pegase/2017-02-01` | 2869 | 510 | 4582 | 3579 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case2869pegase/2017-08-01` | 2869 | 510 | 4582 | 3579 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case9241pegase/2017-02-01` | 9241 | 1445 | 16049 | 13932 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case9241pegase/2017-08-01` | 9241 | 1445 | 16049 | 13932 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case13659pegase/2017-02-01` | 13659 | 4092 | 20467 | 13932 | [JoFlMa16, FlPaCa13, MTPWR] +| `matpower/case13659pegase/2017-08-01` | 13659 | 4092 | 20467 | 13932 | [JoFlMa16, FlPaCa13, MTPWR] + +### 1.4 MATPOWER/RTE + +Test cases from the R&D Division at [Reseau de Transport d'Electricite](https://www.rte-france.com) representing the size and complexity of the French very high voltage transmission network. + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `matpower/case1888rte/2017-02-01` | 1888 | 296 | 2531 | 1484 | [MTPWR, JoFlMa16] +| `matpower/case1888rte/2017-08-01` | 1888 | 296 | 2531 | 1484 | [MTPWR, JoFlMa16] +| `matpower/case1951rte/2017-02-01` | 1951 | 390 | 2596 | 1497 | [MTPWR, JoFlMa16] +| `matpower/case1951rte/2017-08-01` | 1951 | 390 | 2596 | 1497 | [MTPWR, JoFlMa16] +| `matpower/case2848rte/2017-02-01` | 2848 | 544 | 3776 | 2242 | [MTPWR, JoFlMa16] +| `matpower/case2848rte/2017-08-01` | 2848 | 544 | 3776 | 2242 | [MTPWR, JoFlMa16] +| `matpower/case2868rte/2017-02-01` | 2868 | 596 | 3808 | 2260 | [MTPWR, JoFlMa16] +| `matpower/case2868rte/2017-08-01` | 2868 | 596 | 3808 | 2260 | [MTPWR, JoFlMa16] +| `matpower/case6468rte/2017-02-01` | 6468 | 1262 | 9000 | 6094 | [MTPWR, JoFlMa16] +| `matpower/case6468rte/2017-08-01` | 6468 | 1262 | 9000 | 6094 | [MTPWR, JoFlMa16] +| `matpower/case6470rte/2017-02-01` | 6470 | 1306 | 9005 | 6085 | [MTPWR, JoFlMa16] +| `matpower/case6470rte/2017-08-01` | 6470 | 1306 | 9005 | 6085 | [MTPWR, JoFlMa16] +| `matpower/case6495rte/2017-02-01` | 6495 | 1352 | 9019 | 6060 | [MTPWR, JoFlMa16] +| `matpower/case6495rte/2017-08-01` | 6495 | 1352 | 9019 | 6060 | [MTPWR, JoFlMa16] +| `matpower/case6515rte/2017-02-01` | 6515 | 1368 | 9037 | 6063 | [MTPWR, JoFlMa16] +| `matpower/case6515rte/2017-08-01` | 6515 | 1368 | 9037 | 6063 | [MTPWR, JoFlMa16] + + +## 2. PGLIB-UC Instances + +[PGLIB-UC](https://github.com/power-grid-lib/pglib-uc) is a benchmark library curated and maintained by the [IEEE PES Task Force on Benchmarks for Validation of Emerging Power System Algorithms](https://power-grid-lib.github.io/). These test cases have been used in [KnOsWa20]. + +### 2.1 PGLIB-UC/California + +Test cases based on publicly available data from the California ISO. For more details, see [PGLIB-UC case file overview](https://github.com/power-grid-lib/pglib-uc). + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `pglib-uc/ca/2014-09-01_reserves_0` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-09-01_reserves_1` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-09-01_reserves_3` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-09-01_reserves_5` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-12-01_reserves_0` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-12-01_reserves_1` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-12-01_reserves_3` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2014-12-01_reserves_5` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-03-01_reserves_0` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-03-01_reserves_1` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-03-01_reserves_3` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-03-01_reserves_5` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-06-01_reserves_0` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-06-01_reserves_1` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-06-01_reserves_3` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/2015-06-01_reserves_5` | 1 | 610 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/Scenario400_reserves_0` | 1 | 611 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/Scenario400_reserves_1` | 1 | 611 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/Scenario400_reserves_3` | 1 | 611 | 0 | 0 | [KnOsWa20] +| `pglib-uc/ca/Scenario400_reserves_5` | 1 | 611 | 0 | 0 | [KnOsWa20] + + +### 2.2 PGLIB-UC/FERC + +Test cases based on a publicly available [unit commitment test case produced by the Federal Energy Regulatory Commission](https://www.ferc.gov/industries-data/electric/power-sales-and-markets/increasing-efficiency-through-improved-software-1). For more details, see [PGLIB-UC case file overview](https://github.com/power-grid-lib/pglib-uc). + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `pglib-uc/ferc/2015-01-01_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-01-01_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-02-01_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-02-01_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-03-01_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-03-01_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-04-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-04-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-05-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-05-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-06-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-06-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-07-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-07-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-08-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-08-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-09-01_hw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-09-01_lw` | 1 | 979 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-10-01_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-10-01_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-11-02_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-11-02_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-12-01_hw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] +| `pglib-uc/ferc/2015-12-01_lw` | 1 | 935 | 0 | 0 | [KnOsWa20, KrHiOn12] + + +### 2.3 PGLIB-UC/RTS-GMLC + +[RTS-GMLC](https://github.com/GridMod/RTS-GMLC) is an updated version of the RTS-96 test system produced by the United States Department of Energy's [Grid Modernization Laboratory Consortium](https://gmlc.doe.gov/). The PGLIB-UC/RTS-GMLC instances are modified versions of the original RTS-GMLC instances, with modified ramp-rates and without a transmission network. For more details, see [PGLIB-UC case file overview](https://github.com/power-grid-lib/pglib-uc). + +| Name | Buses | Generators | Lines | Contingencies | References | +|------|-------|------------|-------|---------------|--------| +| `pglib-uc/rts_gmlc/2020-01-27` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-02-09` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-03-05` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-04-03` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-05-05` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-06-09` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-07-06` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-08-12` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-09-20` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-10-27` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-11-25` | 1 | 154 | 0 | 0 | [BaBlEh19] +| `pglib-uc/rts_gmlc/2020-12-23` | 1 | 154 | 0 | 0 | [BaBlEh19] + +## 3. OR-LIB/UC + +[OR-LIB](http://people.brunel.ac.uk/~mastjjb/jeb/info.html) is a collection of test data sets for a variety of operations research problems, including unit commitment. The UC instances in OR-LIB are synthetic instances generated by a [random problem generator](http://groups.di.unipi.it/optimize/Data/UC.html) developed by the [Operations Research Group at University of Pisa](http://groups.di.unipi.it/optimize/). These test cases have been used in [FrGe06] and many other publications. + +| Name | Hours | Buses | Generators | Lines | Contingencies | References | +|------|-------|-------|------------|-------|---------------|------------| +| `or-lib/10_0_1_w` | 24 | 1 | 10 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/10_0_2_w` | 24 | 1 | 10 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/10_0_3_w` | 24 | 1 | 10 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/10_0_4_w` | 24 | 1 | 10 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/10_0_5_w` | 24 | 1 | 10 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/20_0_1_w` | 24 | 1 | 20 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/20_0_2_w` | 24 | 1 | 20 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/20_0_3_w` | 24 | 1 | 20 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/20_0_4_w` | 24 | 1 | 20 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/20_0_5_w` | 24 | 1 | 20 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/50_0_1_w` | 24 | 1 | 50 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/50_0_2_w` | 24 | 1 | 50 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/50_0_3_w` | 24 | 1 | 50 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/50_0_4_w` | 24 | 1 | 50 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/50_0_5_w` | 24 | 1 | 50 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/75_0_1_w` | 24 | 1 | 75 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/75_0_2_w` | 24 | 1 | 75 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/75_0_3_w` | 24 | 1 | 75 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/75_0_4_w` | 24 | 1 | 75 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/75_0_5_w` | 24 | 1 | 75 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/100_0_1_w` | 24 | 1 | 100 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/100_0_2_w` | 24 | 1 | 100 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/100_0_3_w` | 24 | 1 | 100 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/100_0_4_w` | 24 | 1 | 100 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/100_0_5_w` | 24 | 1 | 100 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/150_0_1_w` | 24 | 1 | 150 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/150_0_2_w` | 24 | 1 | 150 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/150_0_3_w` | 24 | 1 | 150 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/150_0_4_w` | 24 | 1 | 150 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/150_0_5_w` | 24 | 1 | 150 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_10_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_11_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_12_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_1_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_2_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_3_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_4_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_5_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_6_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_7_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_8_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] +| `or-lib/200_0_9_w` | 24 | 1 | 200 | 0 | 0 | [ORLIB, FrGe06] + +## 4. Tejada19 + + Test cases used in [TeLuSa19]. These instances are similar to OR-LIB/UC, in the sense that they use the same random problem generator, but are much larger. + +| Name | Hours | Buses | Generators | Lines | Contingencies | References | +|------|-------|-------|------------|-------|---------------|------------| +| `tejada19/UC_24h_214g` | 24 | 1 | 214 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_250g` | 24 | 1 | 250 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_290g` | 24 | 1 | 290 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_480g` | 24 | 1 | 480 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_505g` | 24 | 1 | 505 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_623g` | 24 | 1 | 623 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_647g` | 24 | 1 | 647 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_836g` | 24 | 1 | 836 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_850g` | 24 | 1 | 850 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_918g` | 24 | 1 | 918 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_931g` | 24 | 1 | 931 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_940g` | 24 | 1 | 940 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_957g` | 24 | 1 | 957 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_959g` | 24 | 1 | 959 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1069g` | 24 | 1 | 1069 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1130g` | 24 | 1 | 1130 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1376g` | 24 | 1 | 1376 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1393g` | 24 | 1 | 1393 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1577g` | 24 | 1 | 1577 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1615g` | 24 | 1 | 1615 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1632g` | 24 | 1 | 1632 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1768g` | 24 | 1 | 1768 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1804g` | 24 | 1 | 1804 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1820g` | 24 | 1 | 1820 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1823g` | 24 | 1 | 1823 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_24h_1888g` | 24 | 1 | 1888 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_36g` | 168 | 1 | 36 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_38g` | 168 | 1 | 38 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_40g` | 168 | 1 | 40 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_53g` | 168 | 1 | 53 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_58g` | 168 | 1 | 58 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_59g` | 168 | 1 | 59 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_72g` | 168 | 1 | 72 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_84g` | 168 | 1 | 84 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_86g` | 168 | 1 | 86 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_88g` | 168 | 1 | 88 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_93g` | 168 | 1 | 93 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_105g` | 168 | 1 | 105 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_110g` | 168 | 1 | 110 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_125g` | 168 | 1 | 125 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_130g` | 168 | 1 | 130 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_131g` | 168 | 1 | 131 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_140g` | 168 | 1 | 140 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_165g` | 168 | 1 | 165 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_175g` | 168 | 1 | 175 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_179g` | 168 | 1 | 179 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_188g` | 168 | 1 | 188 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_192g` | 168 | 1 | 192 | 0 | 0 | [TeLuSa19] +| `tejada19/UC_168h_199g` | 168 | 1 | 199 | 0 | 0 | [TeLuSa19] + +## 5. References + +* [UCJL] **Alinson S. Xavier, Feng Qiu.** "UnitCommitment.jl: A Julia/JuMP Optimization Package for Security-Constrained Unit Commitment". Zenodo (2020). [DOI: 10.5281/zenodo.4269874](https://doi.org/10.5281/zenodo.4269874) + +* [KnOsWa20] **Bernard Knueven, James Ostrowski and Jean-Paul Watson.** "On Mixed-Integer Programming Formulations for the Unit Commitment Problem". INFORMS Journal on Computing (2020). [DOI: 10.1287/ijoc.2019.0944](https://doi.org/10.1287/ijoc.2019.0944) + +* [KrHiOn12] **Eric Krall, Michael Higgins and Richard P. O’Neill.** "RTO unit commitment test system." Federal Energy Regulatory Commission. Available at: (Accessed: Nov 14, 2020) + +* [BaBlEh19] **Clayton Barrows, Aaron Bloom, Ali Ehlen, Jussi Ikaheimo, Jennie Jorgenson, Dheepak Krishnamurthy, Jessica Lau et al.** "The IEEE Reliability Test System: A Proposed 2019 Update." IEEE Transactions on Power Systems (2019). [DOI: 10.1109/TPWRS.2019.2925557](https://doi.org/10.1109/TPWRS.2019.2925557) + +* [JoFlMa16] **C. Josz, S. Fliscounakis, J. Maeght, and P. Panciatici.** "AC Power Flow +Data in MATPOWER and QCQP Format: iTesla, RTE Snapshots, and PEGASE". [ArXiv (2016)](https://arxiv.org/abs/1603.01533). + +* [FlPaCa13] **S. Fliscounakis, P. Panciatici, F. Capitanescu, and L. Wehenkel.** +"Contingency ranking with respect to overloads in very large power +systems taking into account uncertainty, preventive and corrective +actions", Power Systems, IEEE Trans. on, (28)4:4909-4917, 2013. +[DOI: 10.1109/TPWRS.2013.2251015](https://doi.org/10.1109/TPWRS.2013.2251015) + +* [MTPWR] **D. Zimmerman, C. E. Murillo-Sandnchez and R. J. Thomas.** "Matpower: Steady-state operations, planning, and analysis tools forpower systems research and education", IEEE Transactions on PowerSystems, vol. 26, no. 1, pp. 12 –19, Feb. 2011. [DOI: 10.1109/TPWRS.2010.2051168](https://doi.org/10.1109/TPWRS.2010.2051168) + +* [PSTCA] **University of Washington, Dept. of Electrical Engineering.** "Power Systems Test Case Archive". Available at: (Accessed: Nov 14, 2020) + +* [ORLIB] **J.E.Beasley.** "OR-Library: distributing test problems by electronic mail", Journal of the Operational Research Society 41(11) (1990). [DOI: 10.2307/2582903](https://doi.org/10.2307/2582903) + +* [FrGe06] **A. Frangioni, C. Gentile.** "Solving nonlinear single-unit commitment problems with ramping constraints" Operations Research 54(4), p. 767 - 775, 2006. [DOI: 10.1287/opre.1060.0309](https://doi.org/10.1287/opre.1060.0309) + +* [TeLuSa19] **D. A. Tejada-Arango, S. Lumbreras, P. Sanchez-Martin and A. Ramos.** "Which Unit-Commitment Formulation is Best? A Systematic Comparison," in IEEE Transactions on Power Systems. [DOI: 10.1109/TPWRS.2019.2962024](https://ieeexplore.ieee.org/document/8941313/). \ No newline at end of file diff --git a/src/docs/isf.md b/src/docs/isf.md deleted file mode 100644 index 4d46ff3..0000000 --- a/src/docs/isf.md +++ /dev/null @@ -1,19 +0,0 @@ -Linear Sensitivity Factors -========================== - -UnitCommitment.jl includes a number of functions to compute typical linear sensitivity -factors, such as [Injection Shift Factors](@ref) and [Line Outage Distribution Factors](@ref). These sensitivity factors can be used to quickly compute DC power flows in both base and N-1 contigency scenarios. - -Injection Shift Factors ------------------------ -Given a network with `B` buses and `L` transmission lines, the Injection Shift Factors (ISF) matrix is an `L`-by-`B` matrix which indicates much power flows through a certain transmission line when 1 MW of power is injected at bus `b` and withdrawn from the slack bus. For example, `isf[:l7, :b5]` indicates the amount of power (in MW) that flows through line `l7` when 1 MW of power is injected at bus `b5` and withdrawn from the slack bus. -This matrix is computed based on the DC linearization of power flow equations and does not include losses. -To compute the ISF matrix, the function `injection_shift_factors` can be used. It is necessary to specify the set of lines, buses and the slack bus: -```julia -using UnitCommitment -instance = UnitCommitment.load("ieee_rts/case14") -isf = UnitCommitment.injection_shift_factors(lines = instance.lines, - buses = instance.buses, - slack = :b14) -@show isf[:l7, :b5] -``` \ No newline at end of file diff --git a/src/docs/model.md b/src/docs/model.md deleted file mode 100644 index c874cc9..0000000 --- a/src/docs/model.md +++ /dev/null @@ -1,90 +0,0 @@ -Benchmark Model -=============== - -UnitCommitment.jl includes a reference Mixed-Integer Linear Programming -(MILP), built with [JuMP](https://github.com/JuliaOpt/JuMP.jl), which can -either be used as-is to solve instances of the problem, or be extended to -build more complex formulations. - -Building and Solving the Model -------------------------------- - -Given an instance and a JuMP optimizer, the function `build_model` can be used to -build the reference MILP model. For example: - -```julia -using UnitCommitment, JuMP, Cbc -instance = UnitCommitment.load("ieee_rts/case118") -model = build_model(instance, with_optimizer(Cbc.Optimizer)) -``` - -The model enforces all unit constraints described in [Unit Commitment -Instances](@ref), including ramping, minimum-up and minimum-down times. Some -system-wide constraints, such as spinning reserves, are also enforced. The -model, however, does not enforce transmission or N-1 security constraints, -since these are typically generated on-the-fly. - -A reference to the JuMP model is stored at `model.mip`. After constructed, the model can -be optimized as follows: - -```julia -optimize!(model.mip) -``` - -Decision Variables ------------------- - -References to all decision variables are stored at `model.vars`. -A complete list of available decision variables is as follows: - -| Variable | Description -| :---------------------------- | :--------------------------- -| `model.vars.production[gi,t]` | Amount of power (in MW) produced by unit with index `gi` at time `t`. -| `model.vars.reserve[gi,t]` | Amount of spinning reserves (in MW) provided by unit with index `gi` at time `t`. -| `model.vars.is_on[gi,t]` | Binary variable indicating if unit with index `gi` is operational at time `t`. -| `model.vars.switch_on[gi,t]` | Binary variable indicating if unit with index `gi` was switched on at time `t`. That is, the unit was not operational at time `t-1`, but it is operational at time `t`. -| `model.vars.switch_off[gi,t]` | Binary variable indicating if unit with index `gi` was switched off at time `t`. That is, the unit was operational at time `t-1`, but it is no longer operational at time `t`. -| `model.vars.unit_cost[gi,t]` | The total cost to operate unit with index `gi` at time `t`. Includes start-up costs, no-load costs and any other production costs. -| `model.vars.cost[t]` | Total cost at time `t`. -| `model.vars.net_injection[bi,t]` | Total net injection (in MW) at bus with index `bi` and time `t`. Net injection is defined as the total power being produced by units located at the bus minus the bus load. - - -Accessing the Solution ----------------------- -To access the value of a particular decision variable after the -optimization is completed, the function `JuMP.value(var)` can be used. The -following example prints the amount of power (in MW) produced by each unit at time 5: - -```julia -for g in instance.units - @show value(model.vars.production[g.index, 5]) -end -``` - -Modifying the Model -------------------- - -Prior to being solved, the reference model can be modified by using the variable references -above and conventional JuMP macros. For example, the -following code can be used to ensure that at most 10 units are operational at time 4: - -```julia -using UnitCommitment, JuMP, Cbc -instance = UnitCommitment.load("ieee_rts/case118") -model = build_model(instance, with_optimizer(Cbc.Optimizer)) - -@contraint(model.mip, - sum(model.vars.is_on[g.index, 4] - for g in instance.units) <= 10) - -optimize!(model.mip) -``` - -It is not currently possible to modify the constraints included in the -reference model. - -Reference ---------- -```@docs -UnitCommitment.build_model -``` \ No newline at end of file diff --git a/src/docs/solvers.md b/src/docs/solvers.md deleted file mode 100644 index 65e42aa..0000000 --- a/src/docs/solvers.md +++ /dev/null @@ -1,81 +0,0 @@ -Benchmark Solver -================ - -Solving an instance of the Unit Commitment problem typically involves more -than simply building a Mixed-Integer Linear Programming and handing it over to the -solver. Since the number of transmission and N-1 security constraints can -easily exceed hundreds of millions for large instances of the problem, it is often -necessary to iterate between MILP optimization and contingency screening, so -that only necessary transmission constraints are added to the MILP. - -`UnitCommitment.jl` includes a fast implementation of the contingency -screening method described in -[[1]](https://doi.org/10.1109/TPWRS.2019.2892620), which is able to -efficiently handle even ISO-scale instances of the problem. The method makes -use of Injection Shift Factors (ISFs) and Line Outage Distribution Factors -(LODFs) to model DC power flows and N-1 contingencies. If Julia is configured -to use multiple threads (through the environment variable `JULIA_NUM_THREADS`) -then multiple contingency scenarios are evaluated in parallel. - -Usage ------ - -To solve one of the benchmark instances using the included benchmark solver, use the method `UnitCommitment.solve` -as shown in the example below. - - julia> UnitCommitment.solve("ieee_rts/case118") - [ Info: Loading instance: ieee_rts/case118 - [ Info: 54 units - [ Info: 118 buses - [ Info: 186 lines - [ Info: Scaling problem (0.6 demands, 1.0 limits)... - [ Info: Using Cbc as MILP solver (0.001 gap, 4 threads) - [ Info: Computing sensitivity factors (0.001 ISF cutoff, 0.0001 LODF cutoff)... - [ Info: Building MILP model (24 hours, 0.01 reserve)... - [ Info: Optimizing... - [ Info: Optimal value: 4.033106e+06 - [ Info: Solved in 8.73 seconds - -With default settings, the solver does not consider any transmission or -security constraints, and the peak load is automatically set to 60% of the -installed capacity of the system. These, and many other settings, can be -configured using keyword arguments. See the reference section below for more -details. Sample usage: - - julia> UnitCommitment.solve("ieee_rts/case118", demand_scale=0.7, security=true) - [ Info: Loading instance: ieee_rts/case118 - [ Info: 54 units - [ Info: 118 buses - [ Info: 186 lines - [ Info: Scaling problem (0.7 demands, 1.0 limits)... - [ Info: Using Cbc as MILP solver (0.001 gap, 4 threads) - [ Info: Computing sensitivity factors (0.001 ISF cutoff, 0.0001 LODF cutoff)... - [ Info: Building MILP model (24 hours, 0.01 reserve)... - [ Info: Optimizing... - [ Info: Verifying flow constraints... - [ Info: Optimal value: 4.888740e+06 - [ Info: Solved in 4.50 seconds - -When transmission or N-1 security constraints are activated, the solver uses an -iterative method to lazily enforce them. See [this -paper](https://doi.org/10.1109/TPWRS.2019.2892620) for a detailed description -of the method. Injection Shift Factors (ISF) and Line Outage Distribution -Factors (LODF) are used for the computation of DC power flows. - -!!! note - Many of the benchmark instances were not originally designed for N-1 - security-constrained studies, and may become infeasible if these constraints - are enforced. To avoid infeasibilities, the transmission limits can be - increased through the keyword argument `limit_scale`. - -By default, the MILP is solved using [Cbc, the COIN-OR Branch and Cut -solver](https://github.com/coin-or/Cbc). If `UnitCommitment` is loaded after -either [CPLEX](https://github.com/JuliaOpt/CPLEX.jl) or -[SCIP](https://github.com/SCIP-Interfaces/SCIP.jl), then these solvers will be -used instead. A detailed solver log can be displayed by setting `verbose=true`. - -## Reference - -```@docs -UnitCommitment.solve -``` diff --git a/src/docs/usage.md b/src/docs/usage.md new file mode 100644 index 0000000..9742c21 --- /dev/null +++ b/src/docs/usage.md @@ -0,0 +1,106 @@ +# Usage + +## 1. Installation + +UnitCommitment.jl was tested and developed with [Julia 1.5](https://julialang.org/). To install Julia, please follow the [installation guide on the official Julia website](https://julialang.org/downloads/platform.html). To install UnitCommitment.jl, run the Julia interpreter, type `]` to open the package manager, then type: + +```text +pkg> add UnitCommitment +``` + +To test that the package has been correctly installed, run: + +```text +pkg> test UnitCommitment +``` + +If all tests pass, the package should now be ready to be used by any Julia script on the machine. + +To solve the optimization models, a mixed-integer linear programming (MILP) solver is also required. Please see the [JuMP installation guide](https://jump.dev/JuMP.jl/stable/installation/) for more instructions on installing a solver. Typical open-source choices are [Cbc](https://github.com/JuliaOpt/Cbc.jl) and [GLPK](https://github.com/JuliaOpt/GLPK.jl). In the instructions below, Cbc will be used, but any other MILP solver listed in JuMP installation guide should also be compatible. + +## 2. Typical Usage + +### 2.1 Solving user-provided instances + +The first step to use UC.jl is to construct a JSON file describing your unit commitment instance. See the [data format page]() for a complete description of the data format UC.jl expects. The next steps, as shown below, are to read the instance from file, construct the optimization model, run the optimization and extract the optimal solution. + +```julia +using Cbc +using JSON +using UnitCommitment + +# Read instance +instance = UnitCommitment.read("/path/to/input.json") + +# Construct optimization model +model = UnitCommitment.build_model(instance=instance, + optimizer=Cbc.Optimizer) + +# Solve model +UnitCommitment.optimize!(model) + +# Extract solution and write it to a file +solution = UnitCommitment.get_solution(model) +open("/path/to/output.json", "w") do file + JSON.print(file, solution, 2) +end +``` + +### 2.2 Solving benchmark instances + +As described in the [Instances page](instances.md), UnitCommitment.jl contains a number of benchmark instances collected from the literature. To solve one of these instances individually, instead of constructing your own, the function `read_benchmark` can be used: + +```julia +using UnitCommitment +instance = UnitCommitment.read_benchmark("matpower/case3375wp/2017-02-01") +``` + +## 3. Advanced usage + + +### 3.1 Modifying the formulation + +For the time being, the recommended way of modifying the MILP formulation used by UC.jl is to create a local copy of our git repository and directly modify the source code of the package. In a future version, it will be possible to switch between multiple formulations, or to simply add/remove constraints after the model has been generated. + +### 3.2 Generating initial conditions + + +When creating random unit commitment instances for benchmark purposes, it is often hard to compute, in advance, sensible initial conditions for all generators. Setting initial conditions naively (for example, making all generators initially off and producing no power) can easily cause the instance to become infeasible due to excessive ramping. Initial conditions can also make it hard to modify existing instances. For example, increasing the system load without carefully modifying the initial conditions may make the problem infeasible or unrealistically challenging to solve. + +To help with this issue, UC.jl provides a utility function which can generate feasible initial conditions by solving a single-period optimization problem, as shown below: + +```julia +using Cbc +using UnitCommitment + +# Read original instance +instance = UnitCommitment.read("instance.json") + +# Generate initial conditions (in-place) +UnitCommitment.generate_initial_conditions!(instance, Cbc.Optimizer) + +# Construct and solve optimization model +model = UnitCommitment.build_model(instance, Cbc.Optimizer) +UnitCommitment.optimize!(model) +``` + +!!! warning + The function `generate_initial_conditions!` may return different initial conditions after each call, even if the same instance and the same optimizer is provided. The particular algorithm may also change in a future version of UC.jl. For these reasons, it is recommended that you generate initial conditions exactly once for each instance and store them for later use. + +### 3.3 Verifying solutions + +When developing new formulations, it is very easy to introduce subtle errors in the model that result in incorrect solutions. To help with this, UC.jl includes a utility function that verifies if a given solution is feasible, and, if not, prints all the validation errors it found. The implementation of this function is completely independent from the implementation of the optimization model, and therefore can be used to validate it. The function can also be used to verify solutions produced by other optimization packages, as long as they follow the [UC.jl data format](format.md). + +```julia +using JSON +using UnitCommitment + +# Read instance +instance = UnitCommitment.read("instance.json") + +# Read solution (potentially produced by other packages) +solution = JSON.parsefile("solution.json") + +# Validate solution and print validation errors +UnitCommitment.validate(instance, solution) +``` diff --git a/src/instance.jl b/src/instance.jl index 3674b4c..dfd90f1 100644 --- a/src/instance.jl +++ b/src/instance.jl @@ -143,13 +143,13 @@ function from_json(json; fix=true) name_to_unit = Dict{String, Unit}() function timeseries(x; default=nothing) - x != nothing || return default + x !== nothing || return default x isa Array || return [x for t in 1:T] return x end function scalar(x; default=nothing) - x != nothing || return default + x !== nothing || return default x end @@ -201,10 +201,10 @@ function from_json(json; fix=true) # Read and validate initial conditions initial_power = scalar(dict["Initial power (MW)"], default=nothing) initial_status = scalar(dict["Initial status (h)"], default=nothing) - if initial_power == nothing - initial_status == nothing || error("unit $unit_name has initial status but no initial power") + if initial_power === nothing + initial_status === nothing || error("unit $unit_name has initial status but no initial power") else - initial_status != nothing || error("unit $unit_name has initial power but no initial status") + initial_status !== nothing || error("unit $unit_name has initial power but no initial status") initial_status != 0 || error("unit $unit_name has invalid initial status") if initial_status < 0 && initial_power > 1e-3 error("unit $unit_name has invalid initial power") diff --git a/src/log.jl b/src/log.jl index 8f9139d..f90026e 100644 --- a/src/log.jl +++ b/src/log.jl @@ -39,7 +39,7 @@ function handle_message(logger::TimeLogger, print(time_string) println(message) end - if logger.file != nothing && level >= logger.io_log_level + if logger.file !== nothing && level >= logger.io_log_level write(logger.file, time_string) write(logger.file, message) write(logger.file, "\n") diff --git a/src/model.jl b/src/model.jl index ad4bf25..d28d339 100644 --- a/src/model.jl +++ b/src/model.jl @@ -45,11 +45,11 @@ function build_model(; variable_names::Bool=false, ) :: UnitCommitmentModel - if (filename == nothing) && (instance == nothing) + if (filename === nothing) && (instance === nothing) error("Either filename or instance must be specified") end - if filename != nothing + if filename !== nothing @info "Reading: $(filename)" time_read = @elapsed begin instance = UnitCommitment.read(filename) @@ -61,7 +61,7 @@ function build_model(; isf = zeros(0, 0) lodf = zeros(0, 0) else - if isf == nothing + if isf === nothing @info "Computing injection shift factors..." time_isf = @elapsed begin isf = UnitCommitment.injection_shift_factors(lines=instance.lines, @@ -85,8 +85,8 @@ function build_model(; @info "Building model..." time_model = @elapsed begin - if model == nothing - if optimizer == nothing + if model === nothing + if optimizer === nothing mip = Model() else mip = Model(optimizer) @@ -193,7 +193,7 @@ function add_unit!(model::UnitCommitmentModel, g::Unit) error("Partially must-run units are not currently supported") end - if g.initial_power == nothing || g.initial_status == nothing + if g.initial_power === nothing || g.initial_status === nothing error("Initial conditions for $(g.name) must be provided") end @@ -416,7 +416,7 @@ function enforce_transmission(; instance, mip, vars = model.instance, model.mip, model.vars limit::Float64 = 0.0 - if violation.outage_line == nothing + if violation.outage_line === nothing limit = violation.monitored_line.normal_flow_limit[violation.time] @info @sprintf(" %8.3f MW overflow in %-5s time %3d (pre-contingency)", violation.amount, @@ -439,7 +439,7 @@ function enforce_transmission(; @constraint(mip, flow <= limit + overflow) @constraint(mip, -flow <= limit + overflow) - if violation.outage_line == nothing + if violation.outage_line === nothing @constraint(mip, flow == sum(vars.net_injection[b.name, violation.time] * isf[violation.monitored_line.offset, b.offset] for b in instance.buses diff --git a/src/sysimage.jl b/src/sysimage.jl index e8d1263..79887d1 100644 --- a/src/sysimage.jl +++ b/src/sysimage.jl @@ -5,22 +5,19 @@ using PackageCompiler using DataStructures -using Documenter -using GLPK using JSON using JuMP using MathOptInterface using SparseArrays -using TimerOutputs pkg = [:DataStructures, - :Documenter, - :GLPK, :JSON, :JuMP, :MathOptInterface, :SparseArrays, - :TimerOutputs] + ] @info "Building system image..." -create_sysimage(pkg, sysimage_path="build/sysimage.so") +create_sysimage(pkg, + precompile_statements_file="build/precompile.jl", + sysimage_path="build/sysimage.so") diff --git a/test/initcond_test.jl b/test/initcond_test.jl index c1e5d83..ba773f1 100644 --- a/test/initcond_test.jl +++ b/test/initcond_test.jl @@ -11,8 +11,8 @@ using UnitCommitment, Cbc, JuMP # All units should have unknown initial conditions for g in instance.units - @test g.initial_power == nothing - @test g.initial_status == nothing + @test g.initial_power === nothing + @test g.initial_status === nothing end # Generate initial conditions @@ -20,8 +20,8 @@ using UnitCommitment, Cbc, JuMP # All units should now have known initial conditions for g in instance.units - @test g.initial_power != nothing - @test g.initial_status != nothing + @test g.initial_power !== nothing + @test g.initial_status !== nothing end # TODO: Check that initial conditions are feasible