{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Installation de la boîte à outils Julia MaxPlus.jl et son utilisation avec Jupyter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algèbre tropicale" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'algèbre (max,+) (se prononce max-plus) redéfinit les opérateurs addition et multiplication de l'algèbre classique par respectivement les opérateurs maximum noté $\\oplus$ et addition noté $\\otimes$ dans le domaine des nombres réels $\\mathbb{R}$ augmenté du nombre moins l'infini ($\\varepsilon = -\\infty$) que l'on nomme $\\mathbb{R}_{\\varepsilon} = \\mathbb{R} \\cup \\{ -\\infty \\}$. Sa structure algébrique est celle d'un dioïde selectif-inversible selon la classification de Gondran-Minoux (cette structure est appelée plus fréquemment semi-corps idempotent) $(\\mathbb{R}_{\\varepsilon}, \\oplus, \\otimes)$.\n", "\n", "$$\\forall a,b \\in \\mathbb{R}_{\\varepsilon}: a \\oplus b \\triangleq \\max(a,b)$$\n", "$$\\forall a,b \\in \\mathbb{R}_{\\varepsilon}: a \\otimes b \\triangleq a + b$$\n", "\n", "L'algèbre (min,+) (se prononce min-plus) redéfinit les opérateurs addition et multiplication de l'algèbre classique par respectivement les opérateurs minimum noté $\\oplus$ et addition noté $\\otimes$ dans le domaine des nombres réels $\\mathbb{R}$ augmenté du nombre plus l'infini ($\\varepsilon = +\\infty$) que l'on nomme $\\mathbb{R}_{\\varepsilon} = \\mathbb{R} \\cup \\{ +\\infty \\}$. Sa structure algébrique est celle d'un dioïde selectif-inversible selon la classification de Gondran-Minoux (cette structure est appelée plus fréquemment semi-corps idempotent) $(\\mathbb{R}_{\\varepsilon}, \\oplus, \\otimes)$.\n", "\n", "$$\\forall a,b \\in \\mathbb{R}_{\\varepsilon}: a \\oplus b \\triangleq \\min(a,b)$$\n", "$$\\forall a,b \\in \\mathbb{R}_{\\varepsilon}: a \\otimes b \\triangleq a + b$$\n", "\n", "Les algèbres Max-Plus ou Min-Plus sont parfois qualifiées de tropicales. \n", "\n", "L'intérêt du calcul matriciel dans cette algèbre est enseigné dès les années 60 par J. Kuntzman dans sa théorie des réseaux. Elle est utilisée dans de nombreux domaines Recherche opérationnelle (théorie des réseaux), Physique (Quantification), Probabilité (transformée de Cramer), Automatique (systèmes à événements discrets), Informatique (théorie des automates, Réseaux de Pétri), Mathématiques (géométrie algébrique). On pourra consulter la [bibliographie](../docs/src/bibliography.md) pour plus d'informations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Boîtes à outils pour l'algébre tropicale" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'une des premières boîtes à outils Max-Plus disponibles a été fournie par l'[INRIA](https://www.inria.fr) avec le logiciel Scilab qui est devenu [ScicosLab](http://www.scicoslab.org) (fork) puis par son remplacement [NSP](https://cermics.enpc.fr/~jpc/nsp-tiddly/mine.html) (fork du fork). Le but essentiel de cette boîte à outil est de faciliter les calculs matriciels dans cette algèbre et tire parti du livre [SYNCHRONIZATION AND LINEARITY: An Algebra for Discrete Event Systems](https://www.rocq.inria.fr/metalau/cohen/SED/book-online.html).\n", "\n", "Scilab n'étant plus maintenu par les auteurs originaux, un portage de la boîte à outils Max-Plus pour le langage Julia vous est proposé ici et dont le code est téléchargeable soit sur le dépôt GitHub https://github.com/Lecrapouille/MaxPlus.jl soit depuis le système de paquets de Julia avec la commande `] add MaxPlus`. Notons qu'initiallement, cette boîte devait uniquement se focaliser sur l'algèbre (max,+) (vu que Scilab ne gère que le max+ et que ce projet était un portage) mais de fil en aiguille, des fonctions pour l'algèbre (min,+) ont été introduites (version >= 0.3.0) mais le nom du package `MaxPlus.jl` n'a pas changé.\n", "\n", "Pour information, il existe autre paquet Julia [TropicalNumbers](https://github.com/TensorBFS/TropicalNumbers.jl) dont le développement est actif. Il existe une boîte à outils pour Matlab http://www.stanczyk.pro/mpa/ mais dont le développement semble être abandonné. Mais aucune de ces boîtes à outils n'est un portage de Scilab.\n", "\n", "Ce présent document va uniquement présenter comment installer la boîte à outils `MaxPlus.jl` et la démarer depuis un document Jupyter notebook. Les tutoriels suivants montreront les différentes fonctions qu'offre cette boîte à outils tout en introduisant les bases des algèbres (max,+) et (min,+) ainsi que des applications en relation avec ces algèbres." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Installation de la boîte à outils Julia Max-Plus.jl" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette boîte à outils Max-Plus devrait fonctionner avec toutes les versions de Julia même celles obsolètes (versions 0.4 et 0.7). Certaines versions de Julia ont apporté des correctifs (sur les matrices creuses: version 1.3), d'autres ont apporté des régressions (version 1.0: matrice identité; version 1.4: produit matriciel matrice creuse avec matrice pleine; version 1.5: affichage des matrices creuses comme des matrices denses). D'autres bugs sont vieux (> 3 ans) et n'ont pas encore totallement corrigés (version 1.8) mais des correctifs sont automatiquement appliqués avec ce paquet Max-Plus mais peuvent impacter vos autres packages. Pour plus d'information, confère le fichier `fallbacks.jl`. Norallement la version de Julia >= 1.9 devrait contenir tous les correctifs des bugs détectés par l'auteur de cette boîte à outils.\n", "\n", "Par conséquent, vérifions d'abord votre version de Julia : " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "v\"1.8.1\"" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "VERSION" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour installer la boîte à outils Max-Plus Julia on a plusieurs options. Les codes suivants ne fonctionnent pas directement depuis ce document Jupyter, pensez donc à les décommenter et à les exécuter depuis le mode interactif Julia (REPL) :\n", "- Soit depuis le gestionnaire de paquet Julia (version stable):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# using Pkg; Pkg.add(\"MaxPlus\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Vous pouvez télécharger la version du code source depuis GitHub :" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# using Pkg; Pkg.add(PackageSpec(url=\"https://github.com/Lecrapouille/MaxPlus.jl\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Soit, ma solution préférée et pour les developpeurs, depuis une console Linux télécharger:\n", "```\n", "git clone https://github.com/Lecrapouille/MaxPlus.jl\n", "cd MaxPlus.jl\n", "julia\n", "```\n", "\n", "**Il est important d'être correctement placé dans le dossier racine MaxPlus.jl !**\n", "\n", "Puis lancez le système de package Julia `]` et tapez la ligne suivante :" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# (@v1.8) pkg> add ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Utiliser Max-Plus depuis un document Jupyter\n", "\n", "Maintenant que le paquet Julia Max-Plus vient d'être installé dans le système de Julia, on peut l'utiliser depuis le REPL de Julia via `using MaxPlus`. Il est beaucoup plus agréable d'utiliser Julia depuis un document Jupyter. Pour ce faire, il suffit de lancer un notebook Jupyter depuis le REPL avant le chargement de la boîte à outils. Voici les commandes à taper depuis votre REPL depuis le dossier racine `MaxPlus.jl`:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# using IJulia\n", "# notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Créer un nouveau document Jupyter, pensez à vérifier que votre document est connecté à Julia. Puis dans ce document Jupyter créé, chargez la boîte à outil Max-Plus depuis le dossier MaxPlus.jl:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [], "source": [ "push!(LOAD_PATH, pwd())\n", "using MaxPlus" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tapons notre premier nombre Max-Plus :" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(max,+) 5" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "MP(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tapons notre premier nombre Min-Plus :" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(min,+) 5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "MI(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette boîte à outils permet de générer du code $\\LaTeX$ via la fonction `Base.show`. Dans Jupyter ce mode semble être celui utilisé par défault, mais ici, on préfère garder l'affichage en texte plein. Pour cela on doit d'abord taper:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Base.show(io::IO, ::MIME\"text/latex\", x::MP) = show(io, MIME\"text/plain\", x)\n", "Base.show(io::IO, ::MIME\"text/latex\", A::MPAbstractVecOrMat) = show(io, MIME\"text/plain\", A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tutoriels suivants\n", "\n", "Si vous voyez le bon résultat, vous pouvez continuer les autres tutoriels qui vous présenteront l'API de cette boîte à outils ainsi qu'une introduction aux algèbres tropicales." ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.8.2", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.2" } }, "nbformat": 4, "nbformat_minor": 2 }