Wrapper pour CLP (in French) #489
Replies: 71 comments 58 replies
-
Bonjour, |
Beta Was this translation helpful? Give feedback.
-
Pour le fichier CMake pour clp, je peux m'en occuper. Je vais esayer d'avoir un premier jet aujourd'hui ou demain |
Beta Was this translation helpful? Give feedback.
-
Super! Et s'il pouvait y avoir un autre volontaire pour aider Raphaël là-dessus, ce serait le top. |
Beta Was this translation helpful? Give feedback.
-
En attendant de pouvoir compiler voici les 2 fichiers que j'ai définis pour le wrapper clp. Je ne suis pas sûr d'avoir compris le fonctionnement de toutes les méthodes de la classe, donc si vous voyez des choses qui vous semblent étranges, il ne faut pas hésiter à le dire. |
Beta Was this translation helpful? Give feedback.
-
Je viens de commiter les fichiers que tu as mis en lien + une première version de scripts CMake pour la détection de Clp. Ca devrait te permettre de tester tes fichiers en passant Edit: le message d'erreur que j'obtiens;
|
Beta Was this translation helpful? Give feedback.
-
Raphaël, je viens de t'ajouter comme développeur (tu as du recevoir une invitation); tu pourras faire des push directement. |
Beta Was this translation helpful? Give feedback.
-
Le script CMake que j'ai écrit rapidement ne fait pas encore l'installation automatique (le code que tu as vu est le copié coller du code du fichier CMakeLists.txt de soplex). Par contre si tu as Clp d'installé sur ta machine, le script devrait pouvoir le détecter. Tu as fait une erreur dans l'argument pour spécifier le chemin de Clp:
Il manque le
|
Beta Was this translation helpful? Give feedback.
-
L'installation automatique de Clp va prendre du temps à écrire, mais j'ai pushé un commit pour clarifier le message d'erreur lorsque CMake ne trouve pas Clp. |
Beta Was this translation helpful? Give feedback.
-
J'ai peut être écrit le script trop vite. C'est quoi ton installation exactement ? Tu as quoi comme message d'erreur ? |
Beta Was this translation helpful? Give feedback.
-
Bon j'ai refait une install propre de clp avec la dernière version à jour directement sur homebrew et pas ce qui est indiqué sur la page de clp.
J'ai cette erreur:
Et voici le résultat de la commande pkg-config:
|
Beta Was this translation helpful? Give feedback.
-
Quel est l'output de
Tu utilises Clp 1.17.6, je me suis basé sur Clp 1.15.6 pour écrire les scripts CMake, ils ont peut être changé l'architecture du répertoire d'installation entre les deux versions. Je vais essayer de voir. |
Beta Was this translation helpful? Give feedback.
-
Voici:
|
Beta Was this translation helpful? Give feedback.
-
Ok j'ai compris, Clp et coin ne sont pas installés au même endroit, ce qui était le cas chez moi avec Clp 1.15.6, je vais mettre à jour le script de détection pour prendre ça en compte. |
Beta Was this translation helpful? Give feedback.
-
Salut, En plus, j'ai vu un projet pour compiler clp avec cmake: Pour ubuntu, il n'y a pas besoin de cmake, je pense, car on utilisera le packet "coinor-clp" dans les dépot standart. a+ |
Beta Was this translation helpful? Give feedback.
-
J'ai mis à jour le script FindClp.cmake (sur la branche develop). On peut maintenant spécifier COINUTILS_DIR et CLP_DIR séparement. Et le script utilise pkg-config en interne, donc si pkg-config arrive à trouver Clp, il n'y a pas besoin d'utiliser les variables COINUTILS_DIR et CLP_DIR. |
Beta Was this translation helpful? Give feedback.
-
Autre proposition encore plus simple: |
Beta Was this translation helpful? Give feedback.
-
Il se passe par ailleurs un phénomène bizarre que je ne comprends pas et qui me semble être un bug. il se produit un blocage dans la remontee des uplo au bout de 2mn30 environ à une itération différente : Les 2 executions divergent donc : une trace fine donne au moment de la divergence
|
Beta Was this translation helpful? Give feedback.
-
Ca me parait correct oui !
Ca fonctionne aussi sans normaliser les contraintes j'ai l'impression non?
La normalisation donnerait peut-être une direction plus "centrée vers
l'intérieur"?
On peut aussi résoudre Ah = -1 et h est la direction:
A(x*+h) = Ax* + Ah = b-1
C'est bon aussi?
Alex
…On Mon, Jan 18, 2021 at 10:26 AM Gilles Chabert ***@***.***> wrote:
Autre proposition encore plus simple:
On normalise les contraintes pour qu'elles soient de la forme a_i.x=b_i
avec ||a_i||=1
Soit A la matrice des contraintes actives en x*. On a donc Ax*=b.
En général n contraintes sont actives au minimum d'un LP donc on peut
calculer x1 = l'unique solution de A.x=b-(1,...,1). Cela correspond à une
restriction supplémentaire uniforme.
La direction x1-x* est notre direction candidate.
Correct?
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#489 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ADF6P2FR3HRLH73K2HTSN2LS2P5E7ANCNFSM4U5D3UVA>
.
--
Dr. Alexandre Goldsztejn
CNRS - Laboratoire des Sciences du Numérique de Nantes
Mobile : +33 6 78 04 94 87
Web: www.goldsztejn.com
Email: [email protected] <http://irccyn.ec-nantes.fr/> @
univ-nantes.fr @gmail.com
La science a fait de nous des Dieux, avant même que nous soyons dignes
d'être des hommes -- Jean Rostand
|
Beta Was this translation helpful? Give feedback.
-
Quelques news. C'est plutôt positif vous me direz mais la déception vient du fait qu'en remplaçant la "tolerance" par un post-processing, j'espérais observer une amélioration avec Soplex, puisqu'on était censé élargir les restrictions intérieures. Or, ça ne se produit que sur un seul bench (sambal) avec un gain d'environ 10% (donc pas significatif vu qu'il n'y a qu'une exécution). Pour le reste, c'est plus mauvais et on a même un timeout qui apparaît sur harker. En ajoutant la "tolerance" (donc la combinaison tolerance+post-processing), ça ne change pas des masses. Conclusion: on pourrait envisager de n'activer le post-processing que lorsque CLP est installé mais je trouve ça lourd (et moche). Je vais donc tester un dernier truc, un post-processing très light qui ne corrige que les contraintes de borne, sans dichotomie. A+ |
Beta Was this translation helpful? Give feedback.
-
C'est sympa de me vouloir consoler Gilles ;) ... mais bon, la correction triviale que j'ai finalement testée marche aussi bien que le post-processing entier actuel. Cette correction triviale fait la chose suivante: si un loup-point est en dehors de la boîte du système, bah, on le ramène dans la boîte, c'est tout! Je vais le commiter dans develop...
En fait, sur les problèmes qui restent en timeout avec CLP, on observe clairement qu'au bout du timeout le loup est très proche du minimum et le uplo très à la traîne. Pas sûr que l'upperbounding soit finalement toujours le problème. Il y avait clairement ce souci d'arrondi chez CLP avec les contraintes de bornes mais il doit y avoir d'autres problèmes qu'il faudrait identifier et qui impactent surtout les relaxations. On pourrait tester ton idée de post-processing Gilles mais je ne sais pas si ce chantier vaut la peine d'être poursuivi. Bien sûr, c'est un peu énervant car notre upperbouding cumule deux défauts: 1/ le simplexe est une sur-restriction et 2/ on ne sait pas corriger un loup-point qui sort de ce simplexe. Mais bon si ça marche comme ça...
Oui, elle ne fonctionne pas tout le temps. A cause des singularités en effet, mais aussi les arrondis dans les calculs, notamment de la direction. En théorie cette direction rentre dans le simplexe mais en pratique il arrive qu'on ne parvienne jamais à certifier qu'un point parmi ceux testés satisfait les contraintes. Les problèmes les pires sont ceux avec des égalités linéaires (pas de marge liée à la linéarisation). |
Beta Was this translation helpful? Give feedback.
-
J'en suis arrivé aux mêmes conclusions sur les problèmes résolus avec Soplex restant non résolus avec CLP: il s'agit de problèmes |
Beta Was this translation helpful? Give feedback.
-
J'ai fait quelques essais avec la résolution primal() au lieu de dual(). J'ai aussi essayé de jouer avec le paramètre de tolérance, mais sans succès. La seule modification qui a un peu amélioré (permis de résoudre ramsey) est de doubler la restriction supplémentaire sur la linéarisation des contraintes pour la recherche de loup (2.e-9 au lieu de 1.e-9) : on a peut-être un peu moins de loup-points infaisables. |
Beta Was this translation helpful? Give feedback.
-
Pour info, j'ai essayé aussi avec le "mode 1" (il y a deux modes possibles quand on appelle primal()) et pas de changement drastique non plus. Peut-être une nouvelle piste: Sur un bench-type (où CLP explose), je remarque alors que CLP et Soplex ne fournissent effectivement pas du tout les mêmes solutions et que CLP active systématiquement plus de contraintes, comme s'il retournait quoi qu'il arrive un sommet du simplexe là où Soplex se contente d'un point intérieur (Note: je n'ai pas vérifié, c'est une hypothèse. J'ai juste comparé le nombre de contraintes de bornes actives, qui est toujours supérieur avec CLP sur ce bench). Il est alors possible que l'heuristique d'Achterberg implantée actuellement (qui visiblement repose justement sur l'activation des contraintes de bornes) soit induite en erreur par ces activations artificielles. Ce serait donc peut-être une explication au fait que le nombre de boîtes explose parfois avec CLP versus Soplex. Si le solveur était juste plus lent, on devrait avoir le même nombre de boîtes. Et s'il était juste moins précis dans les arrondis, cela devrait ne devrait pas (ou peu) jouer avec des critères d'arrêt comme 1e-3. |
Beta Was this translation helpful? Give feedback.
-
L'heuristique d'Achterberg permet d'éviter des appels au Simplexe inutiles. Si une solution du polytope est proche à epsilon près d'une borne, on est sûr qu'on ne pourra pas réduire cette borne de plus de epsilon. |
Beta Was this translation helpful? Give feedback.
-
Une parenthèse sur l'heuristique de Achterberg et le paramètre eps_Achterberg. De manière générale, je crois qu'on pourra organiser des Ibex days et ne discuter que de ces epsilons de grande cuisine. D'autre part, et de manière générale encore, il me semble plus robuste de fixer les epsilons de manière relative à une taille courante (de boîte par exemple) si on peut. Puisqu'on a la main sur cette heuristique implantée maison (par Bertrand je crois), ne peut-on pas envisager un eps_Achterberg "relatif" (à la taille de x_i) ? Par exemple, ne pas lancer le simplexe sur une dimension i (en minimisation disons) si d_i / w(x_i) < eps_Achterberg (fixé en dur à qque chose entre 1e-3 et 1e-6 après expés), où d_i est la distance entre lb{x_i} et la meilleure (plus petite) borne sur x_i trouvée lors des appels au simplexe sur les dimensions précédentes ? |
Beta Was this translation helpful? Give feedback.
-
Et du coup, Bertrand, pour en avoir le coeur net, si tu (ré)enlevais l'heuristique de Achterberg, en augmentant le timeout d'un facteur 10... ? Juste pour tester les problèmes pathologiques avec CLP... Si ça fonctionnait, on tiendrait la piste et il sera alors temps de trouver une solution intelligente... |
Beta Was this translation helpful? Give feedback.
-
Merci pour l'explication sur l'heuristique d'Achterberg. Elle est tout à fait logique. En continuant à creuser, l'étau se resserre sur le postprocessing de Neumaier-Shcherbina, que j'ai commencé à regarder de près. Et, soit c'est moi qui ai compris tout de travers, soit il y a un gros souci! Je m'explique. Cet algo repose sur le calcul du résidu du problème dual, qui doit être en théorie un petit intervalle, proche de 0 (en gros, de la taille de la tolérance du solveur PL). Or ce n'est pas du tout le cas! Je vous ai mis plus bas à titre d'exemple la trace intégrale de ces résidus sur un problème très simple. Cela vient des multiplicateurs eux-mêmes, dont les valeurs sont visiblement souvent aberrantes. J'observe par exemple une situation qui se produit très souvent: tous les multiplicateurs sont à 0 (alors qu'à ma connaissance cela n'a aucun sens en PL, à moins d'avoir un critère nul, ce qui n'est pas notre cas). Et, plus étonnant, j'observe ça aussi bien avec Soplex qu'avec CLP. Et du coup, avec un coût de type -x_i, cela donne automatiquement un résidu de 1 (qu'on voit bien apparaître souvent dans la trace ci-dessous). C'est assez "grave" car ce résidu se répercute directement sur la qualité de la borne obtenue. Et donc ce comportement pourrait tout à fait expliquer des différences de filtrage. La bonne nouvelle est que la théorie reste correcte et que la borne calculée est safe (on s'en serait aperçu sinon bien sûr...). Donc ma question est la suivante: ceux qui ont implanté ce post-processing (Bertrand?) avaient-ils observé ces comportements et ont-il une explication à cela? Et voici la trace. Il s'agit tout simplement de la norme infinie de la variable
|
Beta Was this translation helpful? Give feedback.
-
J'ai essayé d'enlever le test de Neumaier Shcherbina. Cela ne change pas grand chose pour les problèmes non résolus avec CLP. |
Beta Was this translation helpful? Give feedback.
-
Bon, les écarts de 1e-5 était une erreur d'interprétation. J'appliquais Par contre, CLP est effectivement beaucoup plus sensible que Soplex au mode d'arrondi. Soplex doit avoir un algorithme qui travaille au moins partiellement avec des valeurs exactes (ce qui me fait penser ça est cette publi des auteurs de Soplex https://opus4.kobv.de/opus4-zib/frontdoor/index/index/docId/5511). Sur un problème assez facile comme La bidouille corrige le tir aussi pour Bertrand, j'ai commité (au moins temporairement) ma bidouille pour CLP sur develop, je veux bien que tu me dises ce que ça donne pour toi. Je vais arrêter là ce travail d'investigation. Je résume ci-dessous les problèmes que j'estime très gênants et qui sont en suspens, pour une âme charitable qui aurait un un jour le courage de le poursuivre (ah, que je suis naïf) :
|
Beta Was this translation helpful? Give feedback.
-
La dernière modif marche chez moi nettement moins bien que la version précédente on arrive effectivement à résoudre srcpm en 15s, mais on n'arrive plus à résoudre avec la précision 1.e-6 en 1000s ex3_1_1, ex2_1_9, ex6_1_1, ex7_2_3, ex7_2_4, ex7_2_8 ex7_2_9 |
Beta Was this translation helpful? Give feedback.
-
Comme indiqué dans l'issue #461, il faut démarrer ce chantier qui est une condition à la réalisation d'un paquet Debian
Beta Was this translation helpful? Give feedback.
All reactions