Skip to content

comparaison test between JuMP and OptimalControl Models #79

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

Draft
wants to merge 32 commits into
base: main
Choose a base branch
from

Conversation

Nico77310
Copy link
Collaborator

No description provided.

@Nico77310 Nico77310 linked an issue Jun 17, 2025 that may be closed by this pull request
@Nico77310 Nico77310 marked this pull request as draft June 17, 2025 14:24
@github-actions github-actions bot requested a review from ocots June 17, 2025 14:25
@ocots
Copy link
Member

ocots commented Jun 27, 2025

@Nico77310 Il faut avoir comme tests:

  • le solveur avec le modèle JuMP converge
  • le solveur avec le modèle OptimalControl converge
  • les deux solutions donnent le même objectif
  • les deux solutions donnent la même init (tester avec max_iter=0)
  • les deux solutions sont identiques en norme $L^2$ sur chaque composante

Important

De plus, il faudra modifier les modèles OptimalControl pour pouvoir utiliser ExaModels >pour modéliser le NLP obtenu après discrétisation. Dans ce cas, la dynamique doit être donnée par composante. Voir ce problème par exemple. Ajouter un argument nommé (exa::Bool=false) pour choisir si la dynamique est donnée de manière vectorielle ou par composante:

function OptimalControlProblems.beam(::OptimalControlBackend; nh::Int=100)
# Model
ocp = @def begin
t [0, 1], time
x R², state
u R, control
x(0) == [0, 1]
x(1) == [0, -1]
(t) == [x₂(t), u(t)]
0 x₁(t) 0.1
-10 u(t) 10
(u(t)^2) min
end

@ocots ocots mentioned this pull request Jun 27, 2025
@ocots
Copy link
Member

ocots commented Jun 27, 2025

@Nico77310 Il faut aussi :

  • ajouter une fonction available_problems() qui renvoie la liste des problèmes disponibles
  • utiliser cette fonction dans la documentation au lieu du tableau pour indiquer la liste des problèmes dispos
  • ajouter un test à la fin du runtests :
@test list_of_problems_final == available_problems()

pour vérifier que la fonction available_problems est toujours à jour.

@antoinepichon03
Copy link
Collaborator

@Nico77310 Il faut aussi :

  • ajouter une fonction available_problems() qui renvoie la liste des problèmes disponibles
  • utiliser cette fonction dans la documentation au lieu du tableau pour indiquer la liste des problèmes dispos
  • ajouter un test à la fin du runtests :
@test list_of_problems_final == available_problems()

pour vérifier que la fonction available_problems est toujours à jour.

Hello @ocots ! For the available_problems function, I implemented a solution using a text file cache that gets written every time you run the tests. This way, you can access the list of available/working problems without having to recompile or re-run the entire test suite. The function reads from this cached file to return the last known working problems list. What do you think about this approach? Do you see any potential improvements or issues with this caching strategy?

@antoinepichon03
Copy link
Collaborator

I can't push in the branch, can you send me the permission please ? @ocots

@Nico77310
Copy link
Collaborator Author

Hello @ocots, could you review comparison tests between JuMP and OC ? Thank you by advance.

@ocots
Copy link
Member

ocots commented Jul 2, 2025

@Nico77310 Je fais une relecture. Je vais faire quelques modifications. Il faut que tu merges la PR #80

@ocots
Copy link
Member

ocots commented Jul 2, 2025

@Nico77310 @antoinepichon03 Voici mes remarques, je fais en fonction du code sur la PR #80.

  • La comparaison sur l'objectif peut se faire en même temps que celle sur la solution.
  • La comparaison sur l'init doit pouvoir partager le même code que celle sur la solution. Juste le max_iter qui change. Factoriser le code.
  • La fonction available_problems doit se trouver dans le module OptimalControlProblems et être exportée.

Note

Il faudrait faire ces petits changements pour passer ensuite à l'ajout des modèles avec la dynamique donnée par composante (ce qui est un gros boulot).

@ocots
Copy link
Member

ocots commented Jul 4, 2025

@Nico77310 @antoinepichon03 Avez-vous vu mes messages plus haut ?

@antoinepichon03
Copy link
Collaborator

@Nico77310 @antoinepichon03 Avez-vous vu mes messages plus haut ?

Pardon je n'avais pas vu, je regarde ça de suite.

@ocots
Copy link
Member

ocots commented Jul 4, 2025

@Nico77310 Attention, il y a pleins de problèmes sans init ou avec une init partielle (c'est-à-dire parfois seul le contrôle est initialisé, parfois la variable n'est pas initialisé). Il faut que tous les problèmes aient une init. Mettre 0.1 par défaut.

@ocots
Copy link
Member

ocots commented Jul 11, 2025

Todo :

  • Tests en relatif (voir optinum) : 1%
  • Ne pas afficher dans les tests ceux qui passent
  • Comparaison init sur grille et solution en norme L2 : "init (L2 norm), sol (L2 norm)"

Attention, pour les problèmes sous forme de Lagrange, il faut le pas dans le critère discrétisé :

@objective(model, Min, sum(u[t]^2 for t in 0:nh))

step * sum(u[t]^2 for t in 0:nh)

@PierreMartinon
Copy link
Member

PierreMartinon commented Jul 17, 2025

Attention, pour les problèmes sous forme de Lagrange, il faut le pas dans le critère discrétisé :

@objective(model, Min, sum(u[t]^2 for t in 0:nh))

step * sum(u[t]^2 for t in 0:nh)

Hello a tous,

D'ailleurs il faudrait plutot sommer de 0 a nh-1 seulement non (euler), ou bien re-ecrire la somme pour trapeze (faire fonction annexe pour ca ?).

Autre chose, tous les problemes de maximization ratent le test d'objectif car dans OC ils sont transformes en minimization. Le signe est retabli a la construction de la solution, mais si on prend l'objectif de la solution du NLP, c'est l'oppose. Il faut tester l'objectif de la solution OCP au lieu de la solution NLP, ie obj_oc = objective(sol) au lieu de obj_oc = nlp_sol.objective.

https://github.com/control-toolbox/OptimalControlProblems.jl/blob/5ba5fe753b588f84e109ee3f168fd410dd3f56d9/test/test_Comparison.jl#L180C1-L180C39

@PierreMartinon
Copy link
Member

PierreMartinon commented Jul 18, 2025

See #81 also for some updates / fixes.

Suggestions for the main comparison tests

  • use relative error for the Lp norm tests
  • disable costate init tests entirely since we have no control over this part

The figures are great to check whether the trajectories match or not !

@PierreMartinon
Copy link
Member

Some minor fixes for the Jump tests:

  • in the metadata, the control variables names must be given as a list even if there is only one, otherwise the test script will try to get the symbol for the first letter only. This will work for 1-letter names such as "u", but not in the general case :D ex: cart_pendulum, glider
  • moonlander: use tf as variable instead of step, with expression for step
  • space shuttle: Dt being a vector causes an error at test_Comparison:89

@PierreMartinon
Copy link
Member

@Nico77310 I synchronised with branch problems_update, don't forget to pull

@ocots
Copy link
Member

ocots commented Jul 23, 2025

@Nico77310 Can you please push your updates and make a point on what you have done since last meeting and what you have to do?

test/utils.jl Outdated
end

# Liste par défaut si le cache n'existe pas ou est vide
@warn "Cache des problèmes disponibles non trouvé. Exécutez les tests pour mettre à jour la liste."
Copy link
Member

Choose a reason for hiding this comment

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

@Nico77310 English please.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Dev] Comparison tests
4 participants