Conversation
dlcole3
marked this pull request as ready for review
July 21, 2026 00:20
…ance for multistage
…d Integer_Build column
dlcole3
force-pushed
the
dc/support_dcopf_expansion
branch
from
August 7, 2026 15:59
692a737 to
0e5e77b
Compare
lbonaldo
reviewed
Aug 11, 2026
lbonaldo
left a comment
Collaborator
There was a problem hiding this comment.
Hey @dlcole3, again, thank you so much for this additional PR! I added a few comments, most of them are probably related to the merge with the previous PR. Thank you for preparing them one next to the other. Let me know if you have any questions!
lbonaldo
self-requested a review
September 15, 2026 18:15
lbonaldo
reviewed
Sep 15, 2026
Co-authored-by: Luca Bonaldo <39280783+lbonaldo@users.noreply.github.com>
… in example system
11 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR adds code to support expansion decisions of DCOPF constrained GenX models that can be solved both monolithically or using Benders Decomposition. This work was originally started by @sambuddhac. It includes updates to settings, inputs loading, model construction, and solution methods. Part of the motivation for this work is supporting nodal spatial resolution of CEMs. In these cases, you might solve with DCOPF constraints, and you might also want to have integer decisions on new transmisison or generation builds (e.g., CC might be built in 500 MW increments to avoid unrealistic modular CC construction in lots of different zones). This PR is intended as a second step after the Benders PR (#914) is merged.
DiscreteInvestmentsflag in the settings of GenX. This controls whether there can be integer variables in the model (not that I chose to call thisDiscreteInvestmentsoverIntegerInvestmentsbecause MacroEnergySolvers.jl already has anIntegerInvestmentssetting). This can be applied to both resources and transmission lines. IfDiscreteInvestmentsis set to 1, then GenX will look for a column headerDiscrete_Buildin the Network.csv, Thermal.csv, and Vre.CSV and throw a warning statement if none of these files have the column header. This header controls which resources or lines can have discrete builds. This also gives the user flexiblity in controlling which components should be treated as integer/binary build decisions.Discrete_Buildcolumn has a 1, then there can be at least one new line constructed on that corridor. GenX internally builds a new DataFrame with each line separated out with individual flow variables on them. This is important for handling DC-OPF constraints. In addition, it supports the case where there may be multiple discrete parallel lines on a corridor, and the user can pass these directly with only one line of the CSV. There is an additional constraint added which adds a solve order to identical lines to avoid degeneracy.Discrete_Buildto zero, but there is a nonzeroLine_Max_Reinforcement_MW, then that line will be treated as the traditional line expansion available in GenX (note that this can essentially be thought of as reconductoring). If the discrete build flag is set to 1, thenLine_Max_Reinforcement_MWis used to determine the size of the new lines (note: we can restructure this if you think new lines should have more columns to support this instead of using the existing), with theNew_Line_Cap_Size_MWcolumn name used to determine how may lines fit intoLine_Max_Reinforcement_MW.FIXED_LINESwhich are lines that can't be expanded,EXPANSION_LINES, which are lines that have continuous reinforcement on them,DISCRETE_BUILD_LINESwhich are lines that have a binary build decision associated with them, andPHANTOM_LINES, which are theDISCRETE_BUILD_LINESwhich are on new corridors (this is important for the line angle limit constraints, which you only want to have applied if the line is built).A couple of additional notes:
vFLOWvariable, and this will be zero for any line not constructed. @sambuddhac may have a better idea on whether this is the case.@gschivley and I had discussions on the above structuring, so tagging him in case he wants to give input on how it came together.
What type of PR is this? (check all applicable)
Related Tickets & Documents
This PR also address the feature request of #900
Checklist
How this can be tested
There is a new example case (12) and a new set of unit tests. The unit tests run a smaller time horizon version of example 12 with both monolithic and Benders. In addition, the unit test running the three zone case also runs it with
DiscreteInvestments=1to test integer build decisions on resources.Post-approval checklist for GenX core developers
After the PR is approved