Open Jordan08 opened 5 years ago
Bonjour,
ça y est IBEXOPT est completement compatible avec AMPL On peut appeler ibexopt directement depuis l'IDE de AMPL.
Il suffit de copier ou mettre un lien vers "ibexopt" dans le dossier de Amplide et on peut appeler ibexopt et récupérer la solution dans l'IDE de AMPL.
var x {1..3} >= 1, <= 5; var truc >= 1, <= 5; minimize obj: x[1]truc(x[1] + x[2] + x[3]) + x[3]; subject to constr1: truc *prod {i in 1..3} x[i] >= 25; subject to constr2: truc^2 +sum {i in 1..3} x[i]^2 = 40; let x[1] := 1; let x[2] := 5; let x[3] := 5; let truc := 1;
display x; display truc; display obj - 17.0140173;
option ibexopt_options " trace=0 rigor=0 rel_eps_f=1.e-5 abs_eps_f=1.e-6 eps_h=1.e-8 eps_x=1.e-8 initial_loup=20 timeout=10"; option solver ibexopt; solve;
display x; display truc; display obj; display obj - 17.0140173;
Il me faudrait une relecture sur les messages de retour et sur les noms des options
Si on ne met pas de "ibexopt_options" c'est les options par default de ibexopt. ( d'ailleurs il faudrait peut-être réunir toutes les variables par défault dans un endroit, car c'est très éparpillé: NormalizedSystem, Optimizer, DefaultOptimizer,.... )
J'ai fait en sorte que rien ne change en apparence avec ibexopt. On peut toujours faire du Minibex si on veut sans rien changer.
Un peu de relecture est NEOS nous tend les bras ;-)
Super boulot Jordan, merci !
On a quelques questions pour bien comprendre :)
On souhaite faire des tests sur l'ensemble des benchs. L'idée serait de prendre un fichier mbx, de le ré-écrire en ampl, d'utiliser le plugin pour le relire encore une fois, et finalement de comparer les deux sorties du solver. Comme tu es à fond dans AMPL, voudrais-tu bien écrire la fonction System::to_AMPL() membre de la classe System et qui écrit fichier AMPL dans une chaîne de caractère? Tu pourrais fortement t'inspirer de System::minibex() qui est très simple... De notre coté, on ferait l'exécutable qui lit, converti, résout et compare les sorties.
Gilles aimerait au final inclure cela dans les tests unitaires du plugin, ca serait super !
Il me faudrait une relecture sur les messages de retour et sur les noms des options
Que faut-il relire?
Merci encore !
Alex (& Gilles)
* Finalement, tu utilises la librairie ASL distribuée par AMPL pour lire les nl, n'est-ce pas? Tu as fait quelques patchs sur ces librairies distribuées par AMPL si j'ai bien compris, n'est-ce pas?
oui c'est ça. Mais, j'ai du bien modifié les script d'install de AMPL pour que ça marche (bug dans les option, rename des librairies, ajoute d'option PREFIX,....)
* Au final, lit-on des .ampl ou des .nl?
On peut faire les deux.
- Soit on fait un fichier .ampl ou .mod comme j'ai mis dans mon précédent message, puis: ampl monfichier.mod
et la résolution s'affiche
* Joli d'avoir réussi à passer les options ibexopt à AMPL !!! Gilles a pris note et reconnais sa faute de débutant de répartir des options par défaut dans les 100000 lignes de code ;) Il corrige cela au plus vite :)
pas bien :-1: :-D
On souhaite faire des tests sur l'ensemble des benchs. L'idée serait de prendre un fichier mbx, de le ré-écrire en ampl, d'utiliser le plugin pour le relire encore une fois, et finalement de comparer les deux sorties du solver. Comme tu es à fond dans AMPL, voudrais-tu bien écrire la fonction System::to_AMPL() membre de la classe System et qui écrit fichier AMPL dans une chaîne de caractère? Tu pourrais fortement t'inspirer de System::minibex() qui est très simple... De notre coté, on ferait l'exécutable qui lit, converti, résout et compare les sorties.
oui ça peut se faire.
là je suis en train de récupérer les noms de variable depuis le .nl pour les avoir dans le System Ibex pour corriger le bug ibex-team/ibex-lib#351
Pour la relecture, je ne suis pas entierement satisfait des noms des options, ce n'est pas très compatible avec ce que font les autres (voir le dossier doc dans amplide lorsque l'on installe la version gratuite ). De même, est-ce que les messages de retour aux utilisateurs sont satisfaisants?
a+
J'ai ajouté la récupération des nom de variables, de contraintes et de fonction objectif. Il suffit de rajouter l'option suivante dans le .mod avant de générer le .nl option ibexopt_auxfiles rc;
J'ai commencé System::toAmpl(). Les variables et definition générale du problème ont besoin d'être testé... Mais surtout, il faut faire Function::toAmpl() et Expr2Ampl().... C'est plus compliqué que prévu.... Car, les produits Matrice-Matrice et Matrice-Vecteur n'existent pas en Ampl... il faut les développer.... Donc, to continue...
Bonjour,
Dans la branche "ampl", j'ai fait un update du code.
Je mets ici une todo liste du travail qu'il reste à faire
l'installateur cmake de la libraire ASL pour lire les fichiers .nl Mais je pense que l'on peut s'inspirer de ce qui est fait ici: https://github.com/ampl/mp/blob/master/src/asl/CMakeLists.txt Attention, j'ai modifié le fichier "configure" et "makefile" dans amplsolvers.tar.gz par rapport à l'original http://ampl.com/netlib/ampl J'ai corrigé aussi un bug dans le fichier dtoa1.c. Lorsque l'on compile avec Gaol, il faut compiler Ampl avec l'option -DNo_dtoa et un bug apparait: https://github.com/ampl/mp/issues/126
Il reste à écrire la fonction "writeSolution" de ibex_AmplInterface.cpp Cette fonction doit créer le fichier ou le message qui est stocké dans le fichier .sol que lit Ampl. IIl faut certainement utiliser la fonction de Ampl: void write_sol(char msg, real x, real y, Option_Info oi); voir la doc ici: https://github.com/ibex-team/ibex-lib/blob/ampl/plugins/ampl/3rd/hooking3.pdf
Dans l'exécutable "ibexopt" du pluggin "optim", si l'option " -AMPL " est présente alors il faut écrire un fichier .sol en utilisant writeSolution. Cette simple option rend possible l'appel de ibexopt directement dans Ampl.
A+