lanl-ansi / PowerModelsSecurityConstrained.jl

A PowerModels Extension for Security Constrained Optimization Problems
https://lanl-ansi.github.io/PowerModelsSecurityConstrained.jl/stable/
Other
39 stars 15 forks source link

Cost block preprocessing explanation #41

Closed opfsolver closed 1 year ago

opfsolver commented 1 year ago

I'm trying to understand the generator cost block preprocessing code. It first removes the blocks which are too expensive: https://github.com/lanl-ansi/PowerModelsSecurityConstrained.jl/blob/8e2ac90dbb9cb2cc7f9b81fa4821113b49c565e3/src/io/goc_c2.jl#L258-L263

and then does some other transformation: https://github.com/lanl-ansi/PowerModelsSecurityConstrained.jl/blob/8e2ac90dbb9cb2cc7f9b81fa4821113b49c565e3/src/io/goc_c2.jl#L265-L275

There are a couple of things I don't understand here: 1) The if statement condition checks if a block pmax is larger than the generator pmax. Given the cost_pmax = sum(cblock["pmax"] for cblock in gen["cblocks"]) line above this is never possible for generators with more than one block? 2) Why do we limit the block pmax to 1.1 of the generator pmax? Is it for numerical reasons to help optimisation? 3) There is also the if condition statement which seems unlikely to be what's intended (https://github.com/lanl-ansi/PowerModelsSecurityConstrained.jl/pull/40)

opfsolver commented 1 year ago

Is there any chance this could be answered? It's still relevant and valuable to know about this for me.

ccoffrin commented 1 year ago

The goal of this procedure is to remove cost blocks which will never be used due to the bounds of the generator's output. The second step, which extends the cost block by 10% above the generator limit is to avoid some numerical issue in the solvers.

opfsolver commented 1 year ago

Thanks for your response! My understanding is that block pmax refers to the size of the block, regardless of the position in the sequence of blocks, i.e. two 5MW blocks would have sizes of (5MW, 5MW) rather than cumulative (5MW, 10MW). points would be the cumulative one right?

So in this case we are checking whether any individual block size is larger than the generator pmax (maybe never happens?).

Also, I think the second part of the condition should be reversed (see https://github.com/lanl-ansi/PowerModelsSecurityConstrained.jl/pull/40 which I've edited a little from the original PR)

ccoffrin commented 1 year ago

So in this case we are checking whether any individual block size is larger than the generator pmax (maybe never happens?).

I am sure it did happen at some point, these checks were added to address some issue that was encountered in some dataset. But it is reasonable to check if this is really important or not given the final version of competition datasets.

opfsolver commented 1 year ago

Ok, thanks for your response!