ibex-team / ibex-ampl

Plugin for AMPL modeling language
GNU General Public License v3.0
1 stars 0 forks source link

Finish the AMPL interface #1

Open Jordan08 opened 5 years ago

Jordan08 commented 5 years ago

Bonjour,

Dans la branche "ampl", j'ai fait un update du code.

Je mets ici une todo liste du travail qu'il reste à faire

A+

Jordan08 commented 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.

exemple:

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;

printf "optimal solution as starting point \n";

let x[1] := 1;

let x[2] := 4.742994;

let x[3] := 3.8211503;

let x[4] := 1.3794082;

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;

Jordan08 commented 5 years ago

Il me faudrait une relecture sur les messages de retour et sur les noms des options

Jordan08 commented 5 years ago

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 ;-)

goldsztejn-a commented 5 years ago

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)

Jordan08 commented 5 years ago
* 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+

Jordan08 commented 5 years ago

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;

Jordan08 commented 5 years ago

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...