Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LfAction refactoring and area interchange target action support #1172

Open
wants to merge 13 commits into
base: main
Choose a base branch
from

Conversation

obrix
Copy link
Member

@obrix obrix commented Jan 16, 2025

Please check if the PR fulfills these requirements

  • The commit message follows our guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)

Does this PR already have an issue describing the problem?

No issue

What kind of change does this PR introduce?

Add the support of AreaInterchangeTarget action and change the implementation of LfAction.
LfAction existing design was confusing as everything was handled in the unique LfAction object.
A proper class hierarchy has been setup so as the make feature extension and maintenance easier.

What is the current behavior?

All actions implemented in the LfAction object. Created through the create method and applied through the global update connectivity method (for switch and terminal connection actions) and apply method.
Each instance of LfAction was capable of describing all kind of actions through all the available attributes but a single instance was created per iidm action.

What is the new behavior (if this is a feature change)?

All action creation and application processes are implemented in dedicated class, with common code in AbstractLfAction for all actions and additional AbstractLfBranchAction for switch and terminal connection action (they both impact topology).

Applying the action can be done through a call to the apply method or through a call to LfActionUtils.applyListOfActions. This last method, in a similar way that was done before the refactoring, apply a list of action by first applying the actions modifying topology and then the rest of the actions.

Does this PR introduce a breaking change or deprecate an API?

  • Yes
  • No

If yes, please check if the following requirements are fulfilled

  • The Breaking Change or Deprecated label has been added
  • The migration steps are described in the following section

What changes might users need to make in their application due to this PR? (migration steps)

Other information:

obrix added 4 commits January 14, 2025 15:54
Signed-off-by: Bertrand Rix <[email protected]>
Signed-off-by: Bertrand Rix <[email protected]>
Signed-off-by: Bertrand Rix <[email protected]>
@obrix obrix changed the title LfAction refacto and area interchange target action support [WIP] LfAction refacto and area interchange target action support Jan 16, 2025
@obrix obrix changed the title [WIP] LfAction refacto and area interchange target action support LfAction refacto and area interchange target action support Jan 20, 2025
@obrix obrix requested a review from jeandemanged January 20, 2025 08:20
Signed-off-by: Bertrand Rix <[email protected]>
@obrix
Copy link
Member Author

obrix commented Jan 21, 2025

Note for the reviewer : There was no specific rule about crashing or outputing a warning when an action cannot be applied so I kept more or less the same behavior for each action. Some of the warning / exception raising have been moved from construction to action application though.

In my opinion I would prefer to raise warning and eventually have something in the output API to query which action has been applied rather that raising an exception for potentially a single wrong action and losing all the analysis.

obrix added 2 commits January 21, 2025 14:23
Signed-off-by: Bertrand Rix <[email protected]>
@obrix
Copy link
Member Author

obrix commented Jan 22, 2025

To sum up a bit, there is 4 cases of action setup that causes an exception raise :

• For TapChangerAction, if the PiModel is a SimpleModel (no tap changer on the transformer) -> throw UnsupportedOperationException
• For GeneratorAction, if we want to do something else than simply set an active power target (with absolute or relative value) : throw UnsupportedOperationException
• For HvdcAction, if ac emulation is already enabled -> throw UnsupportedOperationException
• For TerminalsConnectionAction, is a side is provided -> throw UnsupportedOperationException (only both side can be opened / closed)

Those exception are the same as before the refactoring. All other potential issue are only outputting a warning, for example a branch not found in the network for a TerminalsConnectionAction.

I also added a global warning for failing to apply an action in LfActionUtils, which might lead to a lot of warning when doing a security analysis on multiple component. So not sure we should keep that.

acParameters.getNetworkParameters().setAreaInterchangeControl(false);

LfAction lfAreaTargetAction = LfActionUtils.createLfAction(targetAction, network, acParameters.getNetworkParameters().isBreakers(), lfNetwork);
assertFalse(lfAreaTargetAction.apply(lfNetwork, null, acParameters.getNetworkParameters()));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The behavior should change very soon, after #1156 's merge.

Because of the ContingencyLoadFlowParameters extension, AIC can be performed on some post-contingency cases even if networkParameters.isAreaInterchangeControl() is false. So Area-s will now always be created, and this assertion will fail

Copy link
Member Author

@obrix obrix Jan 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks I will update if 1156 is merged before this one.

private LfActionUtils() {
}

public static LfAction createLfAction(Action action, Network network, boolean breakers, LfNetwork lfNetwork) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why don(t you return an optional ? The previous code could help detect NOOP actions for the network by returning an empty value if the element did not exist.
You now loose the ability to detect actions that do nothing on a given LfNetwork.

Copy link
Member Author

@obrix obrix Jan 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The old code was returning an optional but actually did not do anything with the "empty" information and just silently ignored the action.
Same checks are done in the apply method with a boolean return and a warning is logged (to be discussed maybe).
Ultimately I think the operator strategy result API should hold the info of what action was applied successfully, this is also why I designed it like this, but this a change of API to be seen in the futur..

Copy link
Collaborator

@vidaldid-rte vidaldid-rte Jan 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the explanation.
But isn't there a functional change ?
In current code, I suppose there is no LF run if the list of LF actions is empty for a strategy. Is it the same here .

The point of reporting the missing action is a good point but:
Should be done in a report (users won't look at the log)
May not be relevant in the (rare ?) case of contingency and actions covering different network component.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current code, even if the list of lfAction converted from iidm actions is empty there is always a load flow done and an operator strategy result is produced (see AbstractSecurityAnalysis.runSimulations usage of lfActionById).
Whether that is a good thing is probably a good question but there is no functionnal change here as far as I can see.

Furthermore we still have the checkActions method that do some additional checks and raise an exception if there is some inconsistency. This one is still there.

Ok for putting the missing action in the report, good idea!

@jeandemanged jeandemanged changed the title LfAction refacto and area interchange target action support LfAction refactoring and area interchange target action support Jan 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support area interchange actions in SA with Operator Strategies
3 participants