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

Adding terms in binding constraints doesn't work #1884

Closed
1 task done
flomnes opened this issue Jan 8, 2024 · 2 comments · Fixed by #1903
Closed
1 task done

Adding terms in binding constraints doesn't work #1884

flomnes opened this issue Jan 8, 2024 · 2 comments · Fixed by #1903
Assignees
Labels
back-end bug Something isn't working
Milestone

Comments

@flomnes
Copy link
Member

flomnes commented Jan 8, 2024

Description

Provide a clear and concise description of the issue.

Steps to Reproduce

  1. Open a study (version 8.6)
  2. Add a binding constraint
  3. Add a term in the binding constraint.

Actual Behavior

  • If the constraint is of type "thermal", we get the following error message

Cluster 'pologne.Thermique' does not exist in binding constraint 'bc1'

  • If it is of "link" type, the user cannot select the areas that define the term (not in the list)
    Describe what actually happened.

Expected Behavior

The user should ba able to add terms to a binding constraint

Describe what you expected to happen.

Screenshots

image

Possible Solution

Fix bug ?

If you have a solution in mind, describe it here.

Environment

  • Production
  • [?] Staging

Additional Information

Add any other context about the problem here.

  • If applicable, provide the study ID that this issue relates to: c6360b7d-5bff-47a3-9d1d-6753c59be5f6
  • The date and time when the issue occurred:
  • Browser and version: Firefox 121.0
  • Operating System: Ubuntu 20.04
@flomnes flomnes added the bug Something isn't working label Jan 8, 2024
@laurent-laporte-pro laurent-laporte-pro added this to the v2.16.3 milestone Jan 9, 2024
@laurent-laporte-pro laurent-laporte-pro self-assigned this Jan 9, 2024
@laurent-laporte-pro
Copy link
Contributor

laurent-laporte-pro commented Jan 9, 2024

Analyse

Lors de la création du terme de la contrainte couplante, le front-end utilise le endpoint POST /v1/studies/{study_id}/bindingconstraints/{area_id}/term avec le body :

{"data":{"area":"area2","cluster":"Base"},"weight":7}

Dans la configuration de l'étude, au niveau du fichier /input/thermal/clusters/area2/list.ini, on a :

[Base]
group = Nuclear
name = Base
co2 = 0.0

➡ L’ identifiant du cluster correspond bien au nom de la section, c'est-à-dire "Base", avec une majuscule.

Le fonction qui implémente ce endpoint est la fonction add_constraint_term située dans antarest/study/web/study_data_blueprint.py.

Cette fonction utilise la méthode BindingConstraintManager.get_constraint_id pour générer un identifiant de contrainte à partir de l'identifiant de Zone et de l'identifiant du cluster. Dans le cadre de la gestion des contrainte couplantes, l'identifiant doit être en minuscules. Or, cette fonction utilise l'identifiant de cluster sans conversion.

Solution

La solution consiste à corriger la fonction get_constraint_id afin qu'elle calcule des identifiants de contraintes couplantes en minuscules.

D'autre part, la fonction de lecture des contraintes couplantes BindingConstraintManager.get_binding_constraint doit aussi être corrigée car, actuellement, elle retourne une liste d'objets BindingConstraintDTO comportant des IDs de cluster thermiques en minuscules. En conséquence, le front-end n'est pas en mesure de les afficher correctement ni de contrôler les doublons lors de la création de nouveaux termes.

Guide de développement

Le calcul des IDs de contrainte couplantes peut être implémenté comme suit, ce qui est beaucoup plus simple que l'actuel fonction statique get_constraint_id :

class LinkInfoDTO(BaseModel):
    area1: str
    area2: str

    @property
    def constraint_id(self) -> str:
        area1 = min(self.area1, self.area2)
        area2 = max(self.area1, self.area2)
        return f"{area1}%{area2}"


class ClusterInfoDTO(BaseModel):
    area: str
    cluster: str

    @property
    def constraint_id(self) -> str:
        return f"{self.area}%{self.cluster.lower()}"

La fonction get_binding_constraint doit récupérer les IDs réels des clusters thermiques afin d'avoir un moyen de retrouver les IDs réels connaissant les IDs en minuscules. Cela peut être réalisé à l'aide du dictionnaire suivant :

# Create an index of thermal clusters for each area.
# This index is used to find the real cluster ID base on its ID in lower case.
thermals_index = {
    area_id: {cl.id.lower(): cl.id for cl in area_obj.thermals}
    for area_id, area_obj in file_study.config.areas.items()
}

Une méthode de classe dans le classe BindingConstraintDTO doit permettre de créer les objets plus simplement à partir des données lues depuis le fichier INI et de ce dictionnaire thermals_index. On pourrait utiliser des regex pour faire le parsing des clefs et des valeurs.

➡ Un refactoring est nécessaire pour avoir un code plus simple et plus "pyrthonnique".

@flomnes
Copy link
Member Author

flomnes commented Jan 9, 2024

Contournement possible : nommer les zones de sorte que name == id, donc minuscules, pas d'espaces, caractères spéciaux. Pas testé

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
back-end bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants