La marche de l’innovation se poursuits

par Stephen Wolfram

Il y a quelques semaines à peine, un tiers de siècle s’est écoulé depuis la sortie de Mathematica 1.0. Aujourd’hui, j’ai le plaisir d’annoncer les derniers résultats de notre long processus de recherche et développement: la version 13 de Wolfram Language et Mathematica. (Oui, le thème du 1, 3 – complété par le fait que nous sommes le 13 du mois aujourd’hui – est amusant, bien que fortuit). Cela fait 207 jours, soit un peu plus de 6 mois, que nous avons lancé la version 12.3. Et j’ai le plaisir de vous annoncer que, dans ce court laps de temps, un nombre impressionnant de travaux de recherche et développement ont été réalisés: non seulement un total de 117 fonctions entièrement nouvelles, mais aussi plusieurs centaines de fonctions mises à jour et améliorées, plusieurs milliers de corrections de bogues et de petites améliorations, et une foule de nouvelles idées pour rendre le système encore plus facile et plus fluide à utiliser. Chaque jour, chaque semaine, chaque mois, depuis un tiers de siècle, nous nous efforçons d’enrichir le vaste cadre intégré que constituent Mathematica et le langage Wolfram. Aujourd’hui, nous pouvons constater les résultats de toutes ces idées, de tous ces projets et de tous ces travaux individuels: un rythme d’innovation régulier, qui s’est maintenu pendant plus d’un tiers de siècle:

Ce résultat est le fruit d’un travail acharné. Mais il reflète aussi autre chose: le succès des principes de conception fondamentaux du Wolfram Language. Car ce sont ces principes qui ont permis à ce qui est aujourd’hui un énorme système de conserver sa cohérence et sa consistance, et de devenir de plus en plus fort. Ceque nous construisons aujourd’hui ne part pas de zéro; il est construit au sommet de l’énorme tour de capacités que nous avons bâtie auparavant. C’est pourquoi nous sommes capables d’aller si loin, d’automatiser tant de choses et d’inventer tant de choses.

La version 1.0 comptait 554 fonctions au total. Entre la version 12.0 et la version 13.0, nous avons ajouté un total de 635 nouvelles fonctions (en plus des 702 fonctions qui ont été mises à jour et améliorées). Et c’est encore plus
impressionnant que cela. En effet, lorsque nous ajoutons une fonction aujourd’hui, les attentes sont bien plus élevées qu’en 1988, car nous pouvons automatiser bien plus de choses et nous devons nous connecter et nous intégrer à bien plus de choses dans l’ensemble du système. Et, bien sûr, nous pouvons aujourd’hui écrire, et nous le faisons, une documentation peut-être cent fois plus étendue et détaillée que celle qui aurait pu tenir dans le livre (imprimé) Mathematica de 1988.

L’éventail complet des nouveautés de la version 13 par rapport à la version 12 est très large et impressionnant. Mais je me concentrerai ici sur les nouveautés de la version 13.0 par rapport à la version 12.3. J’ai déjà écrit sur les versions 12.1, 12.2 et 12.3.

N’oubliez pas les intégrales!

En 1988, l’une des caractéristiques de Mathematica 1.0 que les gens ont vraiment appréciée était la possibilité d’effectuer des intégrales de manière symbolique. Au fil des ans, nous avons progressivement élargi l’éventail des intégrales réalisables. Et un tiers de siècle plus tard, dans la version 13.0, nous faisons un nouveau bond en avant.

Voici une intégrale qui ne pouvait pas être réalisée « en forme fermée » auparavant, mais qui peut l’être dans la version 13.0:

Toute intégrale d’une fonction algébrique peut en principe être réalisée en termes de nos objets généraux DifferentialRoot. Mais le plus grand défi algorithmique est d’obtenir une « réponse adaptée à l’homme » en termes de fonctions familières. Il s’agit d’une activité fragile, où un petit changement dans un coefficient peut avoir un effet important sur les réductions possibles. Mais dans la version 13.0, il y a maintenant de nombreuses intégrales qui ne pouvaient auparavant être réalisées qu’en termes de fonctions spéciales, mais qui donnent maintenant des résultats en fonctions élémentaires. En voici un exemple:

Dans la version 12.3, la même intégrale pouvait encore être effectuée, mais uniquement en termes d’intégrales elliptiques:

Fonctions mathématiques: Une étape importante est franchie

À l’époque où l’on devait encore faire des intégrales et d’autres opérations similaires à la main, on était toujours ravi de découvrir que son problème pouvait être résolu grâce à une « fonction spéciale » exotique dont on n’avait jamais entendu parler auparavant. Les fonctions spéciales sont en quelque sorte une façon d’emballer les connaissances mathématiques: une fois que vous savez que la solution de votre équation est une fonction de Lamé, cela vous dit immédiatement beaucoup de choses mathématiques à son sujet.

Dans le langage Wolfram, nous avons toujours pris les fonctions spéciales très au sérieux, non seulement en prenant en charge une vaste collection d’entre elles, mais aussi en permettant de les évaluer avec n’importe quelle précision numérique et de les faire participer à une gamme complète d’opérations mathématiques symboliques.
Lorsque j’ai commencé à utiliser des fonctions spéciales, il y a environ 45 ans, le livre qui constituait la référence standard était le Handbook of Mathematical Functions d’Abramowitz & Stegun (1964). Il répertoriait des centaines de fonctions, certaines largement utilisées, d’autres moins. Au fil des ans, le développement du langage Wolfram a permis d’ajouter de plus en plus de fonctions à celles d’Abramowitz & Stegun.

Et dans la version 13.0, nous avons enfin terminé! Toutes les fonctions d’Abramowitz & Stegun sont maintenant entièrement calculables dans le Wolfram Language. Les dernières fonctions à être ajoutées sont les fonctions d’onde de Coulomb (pertinentes pour l’étude des processus de diffusion quantique). Les voici dans Abramowitz & Stegun:

Et voici – à partir de la version 13 – comment obtenir cette première image dans le langage Wolfram:

Bien sûr, l’histoire ne s’arrête pas là, comme on peut le voir maintenant:

Un autre type de numéro

Un autre type de numéro On pourrait penser qu’un nombre n’est qu’un nombre. Et c’est fondamentalement vrai pour les nombres entiers. Mais lorsqu’un nombre est un nombre réel, l’histoire est plus compliquée. Parfois, vous pouvez « nommer » un nombre réel de manière symbolique, par exemple. Mais la plupart des nombres réels n’ont pas de « nom symbolique ». Et pour les spécifier exactement, il faudrait donner un nombre infini de chiffres, ou l’équivalent. Le résultat est que l’on finit par vouloir avoir des nombres réels approximatifs que l’on peut considérer comme représentant certaines collections entières de nombres réels réels.

Une façon directe de le faire est d’utiliser des nombres à précision finie, comme dans:

Une autre approche – introduite dans la version 12.0 – est celle de l’Around, qui représente en fait une distribution de nombres « répartis au hasard » autour d’un nombre donné:

Lorsque vous effectuez des opérations sur des nombres approximatifs, les « erreurs » sont combinées à l’aide d’un certain calcul d’erreurs qui est effectivement basé sur des distributions gaussiennes – et les résultats que vous obtenez sont toujours, dans un certain sens, statistiques.

Mais que faire si l’on veut utiliser des nombres approximatifs, tout en obtenant des résultats prouvables? L’une des approches consiste à utiliser Interval. Mais une approche plus rationnelle, désormais disponible dans la version 13.0, consiste à utiliser CenteredInterval. Voici un CenteredInterval utilisé comme entrée d’une fonction de Bessel:

Vous pouvez prouver des choses dans le Wolfram Language de plusieurs façons. Vous pouvez utiliser Reduce. Vous pouvez utiliser FindEquationalProof. Et vous pouvez utiliser CenteredInterval – qui, en fait, tire parti de l’évaluation numérique. Voici une fonction qui a des racines transcendantales compliquées :
Peut-on prouver que la fonction est supérieure à 0 entre 3 et 4 ? Évaluons la fonction sur un intervalle centré ici :

Maintenant nous pouvons vérifier qu’effectivement « tout cet intervalle » est supérieur à 0:
Et à partir de la façon dont l’intervalle a été calculé dans le « pire des cas », cela fournit maintenant un théorème définitif.

Ainsi que beaucoup d’autres maths…

Comme dans chaque nouvelle version du Wolfram Language, la version 13.0 comporte de nombreuses améliorations mathématiques spécifiques. Un exemple est une nouvelle façon pratique d’obtenir les pôles d’une fonction. Voici une fonction particulière tracée dans le plan complexe:

Et voici les pôles exacts (et leurs multiplicités) pour cette fonction dans le cercle unitaire

Maintenant, nous pouvons additionner les résidus à ces pôles et utiliser le théorème de Cauchy pour obtenir une intégrale de contour:

Toujours dans le domaine du calcul, nous avons ajouté diverses commodités pour la manipulation des équations différentielles. Par exemple, nous supportons maintenant directement les variables vectorielles dans les ODEs:

Grâce à nos capacités en matière de théorie des graphes, nous avons également été en mesure d’améliorer considérablement notre traitement des systèmes d’EOD, en trouvant des moyens de les « démêler » en formes bloc diagonales qui nous permettent de trouver des solutions symboliques dans des cas beaucoup plus complexes qu’auparavant.

Pour les EDP, il n’est généralement pas possible d’obtenir des solutions générales « à forme fermée » pour les EDP non linéaires. Mais on peut parfois obtenir des solutions particulières connues sous le nom d’intégrales complètes (dans lesquelles il n’y a que des constantes arbitraires, et non des fonctions arbitraires « entières »). Et maintenant nous avons une fonction explicite pour les trouver:

En passant du calcul à l’algèbre, nous avons ajouté la fonction PolynomialSumOfSquaresList qui fournit une sorte de « certificat de positivité » pour un polynôme multivarié. L’idée est que si un polynôme peut être décomposé en une somme de carrés (et la plupart de ceux qui ne sont jamais négatifs, mais pas tous, le peuvent), cela prouve que le polynôme est effectivement toujours non négatif.

Et, oui, en additionnant les carrés, on retrouve le polynôme d’origine:

Dans la version 13.0, nous avons également ajouté quelques nouvelles fonctions matricielles. Il y a Adjugate, qui est essentiellement un inverse de matrice, mais sans diviser par le déterminant. Et il y a DrazinInverse qui donne l’inverse de la partie non singulière d’une matrice – comme cela est particulièrement utilisé dans la résolution d’équations différentiellesalgébriques.

Plus de modélisation PDE: Mécanique des
solides et des structures

Les EDP sont à la fois difficiles à résoudre et difficiles à configurer pour des situations particulières. Au cours de nombreuses années, nous avons développé des capacités de pointe pour la résolution des EDP par éléments finis. Nous avons également mis au point un système de géométrie informatique symbolique révolutionnaire qui nous permet de décrire de manière flexible des régions pour les EDP. Mais à partir de la version 12.2, nous avons également fait autre chose: nous avons commencé à créer des cadres de modélisation symbolique explicite pour des types particuliers de systèmes physiques qui peuvent être modélisés avec des EDP. Nous avons déjà le transfert de chaleur, le transport de masse et l’acoustique. Maintenant, dans la version 13.0, nous ajoutons la mécanique des solides et des structures.

Pour nous, un « problème de test classique » a été la déviation d’une cuillère à café. Voici comment nous pouvons maintenant le configurer. Tout d’abord, nous devons définir nos variables: les déplacements de la cuillère dans chaque direction, à chaque point x, y, z:

Nous devons ensuite indiquer quels sont les paramètres du matériau de notre cuillère. Et là, nous pouvons utiliser toute notre base de connaissances, qui contient des informations détaillées sur de nombreux types de matériaux:

Maintenant nous sommes prêts à mettre en place et à résoudre le problème de l’EDP:

Le résultat est donné sous forme de liste de fonctions d’interpolation pour les déplacements x, y, z. Nous pouvons maintenant utiliser une nouvelle fonction graphique de la version 13.0 pour visualiser immédiatement ce résultat:

Mais ces fonctions d’interpolation contiennent également de nombreux détails sur la solution que nous avons obtenue. Par exemple, voici le tenseur de déformation de la cuillère, donné comme un tableau symétrique de fonctions d’interpolation:

Et maintenant nous pouvons par exemple trouver la composante maximale 3, 3 du tenseur de déformation et la position où elle est atteinte:

Que diriez-vous de trouver la distribution des valeurs de la déformation sur la cuillère? Une façon simple de le faire est d’échantillonner des points aléatoires dans la cuillère

puis de faire un histogramme lissé des souches à ces points:

(Le maximum que nous avons vu auparavant se trouve dans la queue à droite).
La mécanique des solides est un domaine complexe, et la version 13 offre une technologie de qualité industrielle pour le gérer. En fait, nous avons une monographie entière intitulée « Solid Mechanics Model Verification » qui décrit comment nous avons validé nos résultats. Nous fournissons également une monographie générale sur la mécanique des solides qui décrit comment prendre des problèmes particuliers et les résoudre avec notre pile
technologique.

Réaliser des vidéos à partir d’images et de vidéos

Dans la version 12.3, nous avons lancé des fonctions comme AnimationVideo et SlideShowVideo qui facilitent la production de vidéos à partir de contenu généré. Dans la version 13.0, nous disposons également d’un ensemble de fonctions permettant de créer des vidéos à partir d’images et de vidéos existantes.

D’ailleurs, avant même de passer à la création de vidéos, une autre nouveauté importante de la version 13.0 est qu’il est désormais possible de lire des vidéos directement dans un ordinateur portable.

Cela fonctionne à la fois sur le bureau et dans le nuage, et vous disposez de toutes les commandes vidéo standard directement dans le bloc-notes, mais vous pouvez également extraire la vidéo pour la visualiser avec une visionneuse externe (par exemple, en plein écran). (Vous pouvez aussi maintenant simplement envelopper une vidéo avec AnimatedImage pour la transformer en une animation par trames de type « GIF »).

OK, revenons à la création de vidéos à partir d’images. Disons que vous avez une grande image:

Une bonne façon de « vivre » une image comme celle-ci peut être une « vidéo de visite » qui visite tour à tour différentes parties de l’image. Voici un exemple de la façon de procéder:

Vous pouvez faire un zoom et un panoramique :

Pour un exemple plus sophistiqué, prenons une « image physique » classique:

Elle trouve les positions de toutes les faces, puis calcule le plus court chemin visitant chacune d’elles:

Nous pouvons maintenant créer un « tour du visage » de l’image:

En plus de passer des images aux vidéos, nous pouvons également passer des vidéos aux vidéos. GridVideo prend plusieurs vidéos, les dispose dans une grille et crée une nouvelle vidéo combinée:

Nous pouvons également prendre une seule vidéo et la « résumer » sous la forme d’une série d’extraits vidéo + audio, choisis par exemple à intervalles réguliers dans la vidéo. Il s’agit d’une version vidéo de VideoFrameList. Voici un exemple de « résumé » d’une vidéo de 75 minutes:

La version 13.0 a ajouté quelques commodités pratiques pour la manipulation des vidéos. L’une d’elles est OverlayVideo, qui vous permet d’ajouter une image en filigrane à une vidéo ou d’insérer ce qui revient à une
vidéo « image dans l’image »:

Nous avons également fait en sorte que de nombreuses opérations d’image fonctionnent directement sur les vidéos. Ainsi, par exemple, pour recadrer une vidéo, il suffit d’utiliser ImageCrop:

Assemblage d’images

Imaginons que vous ayez pris plusieurs photos sous différents angles et que vous souhaitiez les assembler. Dans la version 13.0, nous avons rendu cela très facile, avec la fonction ImageStitch:

Une partie de ce qui se cache sous le capot dans l’assemblage d’images consiste à trouver des points clés dans les images. Dans la version 13.0, nous avons ajouté deux méthodes supplémentaires (SIFT et RootSIFT) pour ImageKeypoints. Mais l’alignement des points clés n’est pas la seule chose que nous faisons dans
l’assemblage d’images. Nous faisons également des choses comme l’égalisation de la luminosité et la correction de l’objectif, ainsi que le mélange d’images à travers les coutures.

L’assemblage d’images peut être affiné à l’aide d’options telles que TransformationClass, qui spécifie les transformations autorisées lorsque les images séparées sont assemblées.

Les arbres continuent de pousser

Nous avons introduit l’arbre comme construction de base dans la version 12.3. Dans la version 13.0, nous étendons l’arbre et y ajoutons quelques améliorations. Tout d’abord, il existe désormais des options pour la disposition et la visualisation des arbres.

Par exemple, voici la disposition radiale d’un arbre (notez que le fait de savoir qu’il s’agit d’un arbre plutôt que d’un graphe général permet de faire des enchâssements beaucoup plus systématiques):

Cela ajoute des options pour le style des éléments, un élément particulier, spécifié par sa position dans l’arbre, étant mis en évidence en bleu:

L’un des nouveaux « concepts d’arbre » les plus sophistiqués est TreeTraversalOrder. Imaginez que vous allez « parcourir » un arbre. Dans quel ordre devez-vous visiter les nœuds? Voici le comportement par défaut. Créez un arbre:

Montrez maintenant dans quel ordre les nœuds sont visités par TreeScan :

Cela étiquette explicitement les nœuds dans l’ordre où ils sont visités:

Here’s a slightly more ornate ordering:

Pourquoi cela est-il important? L' »ordre de traversée » s’avère être lié à des questions profondes concernant les processus d’évaluation et ce que j’appelle désormais le multicomputing. En un sens, l’ordre de traversée définit le « cadre de référence » à travers lequel un « observateur » de l’arbre l’échantillonne. Et, oui, ce langage ressemble à de la physique, et pour une bonne raison: tout ceci est profondément lié à un tas de concepts de physique fondamentale qui apparaissent dans notre projet de physique. Et la paramétrisation de l’ordre de traversée – en plus d’être utile pour un grand nombre d’algorithmes existants – commence à ouvrir la porte à la connexion des processus de calcul aux idées de la physique, et à de nouvelles notions sur ce que j’appelle le calcul multiple.

Coloriage de graphiques

Les capacités du Wolfram Language en matière de théorie des graphes sont très impressionnantes depuis longtemps (et ont été essentielles, par exemple, pour rendre possible notre projet de physique). Mais dans la version 13.0, nous en ajoutons encore plus.

Un ensemble de capacités fréquemment demandées tourne autour de la coloration des graphiques. Par exemple, étant donné un graphe, comment peut on attribuer des « couleurs » à ses sommets de sorte qu’aucune paire de sommets adjacents n’ait la même couleur? Dans la version 13.0, il existe une fonction FindVertexColoring qui permet de le faire:

Et maintenant nous pouvons « surligner » le graphique avec ces couleurs:

Le problème classique de « coloration de graphes » consiste à colorier des cartes géographiques. Voici donc, par exemple, le graphe représentant les relations entre les frontières des États américains:

Maintenant, il est facile de trouver un 4-couleurs des états américains:

Il existe en fait une gamme remarquable de problèmes qui peuvent être réduits à la coloration de graphes. Un autre exemple concerne la planification d’un « tournoi » dans lequel toutes les paires de personnes « jouent » les unes contre les autres, mais chacun ne joue qu’un match à la fois. La collection de matchs nécessaire est simplement le graphe complet:

Chaque correspondance correspond à une arête dans le graphe:

Et maintenant, en trouvant une « coloration des bords », nous avons une liste de « créneaux horaires » possibles dans lesquels chaque match peut être joué:

EdgeChromaticNumber indique le nombre total de correspondances nécessaires:

Le coloriage de cartes soulève le sujet des graphes planaires. La version 13.0 introduit de nouvelles fonctions pour travailler avec les graphes planaires. PlanarFaceList prend un graphe planaire et nous indique comment le graphe peut être décomposé en « faces »:

FindPlanarColoring calcule directement une coloration pour ces faces planes. Pendant ce temps, DualPlanarGraph crée un graphe dans lequel chaque face est un sommet:

Isomorphisme des sous-graphes et autres

On en parle partout. (En fait, dans notre projet de physique, c’est même quelque chose que l’univers fait effectivement à travers le réseau qui représente l’espace). Où un graphe donné contient-il un certain sous-graphe? Dans la version 13.0, il y a une fonction pour le déterminer (le Tout dit de donner toutes les instances):

Un domaine typique où ce type d’isomorphisme de sous-graphe apparaît est la chimie. Voici la structure du graphe d’une molécule :

Maintenant, nous pouvons trouver un 6-cycle:

Nous pouvons maintenant demander le DominatorTreeGraph, qui nous montre une carte de quels sommets sont critiques pour arriver où, en partant de A:

Cela indique maintenant pour chaque sommet quel est son « dominateur », c’est-à-dire quel est le sommet critique le plus proche de lui:

Si le graphique représente la dépendance causale ou autre d’un « événement » par rapport à d’autres, les dominateurs sont effectivement des points de synchronisation, où tout doit passer par un seul « fil de l’histoire ».

Estimations des champs spatiaux

Imaginez que vous ayez des données échantillonnées en certains points de l’espace, disons à la surface de la Terre. Ces données peuvent provenir de stations météorologiques, d’échantillons de sol, de forages miniers, ou de bien d’autres choses. Dans la version 13.0, nous avons ajouté une série de fonctions permettant d’estimer les « champs spatiaux » à partir d’échantillons (ou ce que l’on appelle parfois le « krigeage »).
Prenons quelques données échantillons et traçons-les:

Faisons maintenant une « estimation spatiale » des données:

Cela se comporte comme une InterpolatingFunction, que nous pouvons échantillonner où nous voulons:

Pour créer cette estimation, nous avons inévitablement utilisé un modèle. Nous pouvons changer le modèle lorsque nous créons l’estimation spatiale:

Maintenant, les résultats seront différents:

Dans la version 13.0, vous pouvez obtenir un contrôle détaillé du modèle en utilisant des options comme SpatialTrendFunction et SpatialNoiseLevel. Une question clé est de savoir ce qu’il faut supposer des variations locales du champ spatial, ce que vous pouvez spécifier sous forme symbolique en utilisant VariogramModel.

L’heure juste: Secondes bissextiles et plus

Il est censé y avoir exactement 24 heures dans une journée. Sauf que la Terre ne le sait pas. Et en fait, sa période de rotation varie légèrement avec le temps (en général, sa rotation ralentit). Pour que l’heure de la journée corresponde à la position du Soleil dans le ciel, on a donc inventé le « hack » consistant à ajouter ou à soustraire des « secondes intercalaires ».

En un sens, le problème de la description d’un moment dans le temps est un peu comme le problème de la géolocalisation. Dans le cas de la géolocalisation, il s’agit de décrire une position dans l’espace. Il ne suffit pas de connaître la latitude et la longitude sur la Terre; il faut également disposer d’un « modèle géographique » (défini par l’option GeoModel) qui décrit la forme à donner à la Terre, et donc la manière dont la latitude et la longitude doivent correspondre à la position spatiale réelle.

En décrivant un moment de temps, nous devons également indiquer comment notre « temps d’horloge » correspond au « temps physique » réel. Et pour ce faire, nous avons introduit dans la version 13.0 la notion de système temporel, défini par l’option TimeSystem.
Ceci définit le premier moment de décembre 2021 dans le système de temps UT1:

Voici le premier moment de décembre 2021 dans le système horaire TAI:

Mais même si elles sont toutes deux associées à la même « description d’horloge », elles correspondent à des moments réels différents dans le temps. En les soustrayant, on obtient une valeur non nulle:

Qu’est-ce qui se passe ici? Eh bien, le TAI est un système temporel basé sur des horloges atomiques dans lequel chaque jour est considéré comme faisant précisément 24 heures, et le « zéro » du système temporel a été fixé à la fin des années 1950. L’UT1, quant à lui, est un système temporel dans lequel chaque jour a une longueur définie par la rotation réelle de la Terre. Il en ressort que, depuis la synchronisation du TAI et de l’UT1 à la fin des années 1950, la rotation réelle de la Terre a ralenti au point d’accuser un retard d’environ 37 secondes par rapport à ce qu’elle serait avec une journée précise de 24 heures. Un système de temps important est l’UTC, qui est le « temps civil » standard, et le temps standard de facto de l’internet. L’UTC ne suit pas la vitesse de rotation précise de la Terre; au lieu de cela, il ajoute ou soustrait des secondes intercalaires discrètes lorsque UT1 est sur le point d’accumuler une autre seconde d’écart par rapport au TAI, de sorte qu’à l’heure actuelle, l’UTC est exactement 37 secondes derrière le TAI:

Dans la version 12.3, nous avons introduit GeoOrientationData qui est basé sur un flux de données sur la vitesse de rotation mesurée de la Terre. Sur cette base, voici l’écart de la durée du jour par rapport à 24 heures pour la dernière décennie:

(Et, oui, cela montre que pour la première fois depuis le début des mesures à la fin des années 1950, la rotation de la Terre s’accélère légèrement).

Pouvons-nous voir les secondes intercalaires qui ont été ajoutées pour tenir compte de ces changements? Examinons quelques secondes au début de l’année 2017 dans le système de temps TAI:

Convertissons maintenant ces moments dans le temps dans leur représentation UTC, en utilisant la nouvelle fonction TimeSystemConvert:

Regardez attentivement. D’abord, le moment où 2016 se termine et où 2017 commence est légèrement différent en UTC et en TAI. Mais il y a quelque chose d’encore plus étrange qui se passe. À la toute fin de 2016, UTC indique un temps de 23:59:60. Pourquoi cette heure n’a-t-elle pas été reportée au jour suivant dans le style « arithmétique de l’horloge »?

Réponse: parce qu’une seconde intercalaire a été insérée. (Ce qui me fait me demander quand le Nouvel An a été célébré dans le fuseau horaire 0 cette année-là….)
Si vous pensez que cela est subtil, considérez un autre point. Dans votre ordinateur, il y a beaucoup de minuteries qui contrôlent les opérations du système – et qui sont basées sur le « temps global ». Et de mauvaises choses pourraient se produire avec ces minuteries si le temps global « glissait ». Alors, comment pouvons-nous résoudre ce problème? Ce que nous faisons dans le langage Wolfram est d’utiliser « l’UTC étalé », et d’étaler efficacement la seconde intercalaire au cours d’une journée – essentiellement en faisant en sorte que chaque « seconde » individuelle ne soit pas exactement une « seconde physique ».
Voici le début de la dernière seconde de 2016 en UTC:

Mais c’est ici en UTC barbouillé:

Et, oui, vous pouvez dériver ce nombre à partir du nombre de secondes dans un « jour de seconde intercalaire » :

À propos, vous vous demandez peut-être pourquoi on devrait s’intéresser à toute cette complexité. Dans la vie quotidienne, les secondes intercalaires sont un détail. Mais si vous faites de l’astronomie, elles peuvent être très importantes. Après tout, en une seconde (intercalaire), la lumière parcourt environ 186 000 miles…..

Nouvelles cartes géographiques croustillantesr

Les cartes comportent beaucoup de données, et il est difficile de les livrer et de les restituer efficacement (dans les projections appropriées, etc.). Dans la version 13.0, nous rendons les cartes beaucoup plus « nettes » en utilisant des polices vectorielles pour toutes les étiquettes:

Pour l’instant du moins, l’arrière-plan par défaut est toujours un bitmap. Vous pouvez également utiliser des graphiques vectoriels « croustillants » pour l’arrièreplan, mais le rendu sera plus long:

L’un des avantages de l’utilisation d’étiquettes vectorielles est qu’elles peuvent fonctionner dans toutes les projections géographiques (notez que dans la version 13, si vous ne spécifiez pas la région pour la géographie, elle sera par défaut le monde entier):

Une autre nouveauté de la version 13 est la possibilité de mélanger plusieurs couches d’arrière-plan. Voici un exemple qui comprend une carte des rues avec une carte en relief translucide par-dessus (et des étiquettes par-dessus):

Régions géométriques: Ajustement et construction

Étant donné un groupe de points sur un cercle, quel est le cercle sur lequel ils se trouvent?
Voici des points choisis au hasard autour d’un cercle:

La nouvelle fonction RegionFit peut déterminer sur quel cercle se trouvent les points:

Voici une collection de points en 3D:

Cela correspond à un cylindre sur ces points:

Une autre nouvelle fonction très utile de la version 13.0 est ConcaveHullMesh, qui tente de reconstruire une surface à partir d’une collection de points 3D. Voici 1000 points:

La coque convexe va mettre une « enveloppe rétractable » autour de tout:

Mais la coque concave fera en sorte que la surface « entre dans les concavités »:

Il y a beaucoup de liberté dans la façon dont on peut reconstruire la surface. Une autre fonction de la version 13 est GradientFittedMesh, qui forme la surface à partir d’une collection de normales de surface déduites:

Nous venons de parler de la recherche de régions géométriques à partir de « données ponctuelles ». Une autre nouvelle fonctionnalité de la version 13.0 est la géométrie solide constructive (CSG), qui construit explicitement des régions à partir de primitives géométriques. La fonction principale est CSGRegion, qui permet d’effectuer une variété d’opérations sur les primitives.
Voici une région formée à partir d’une intersection de primitives :
Notez qu’il s’agit d’une région « exacte » – aucune approximation numérique n’est impliquée. Ainsi, lorsque nous demandons son volume, nous obtenons un résultat exact :

On peut construire des structures plus complexes de manière hiérarchique:

Bien que les intégrales deviennent difficiles, il est encore souvent possible d’obtenir des résultats exacts pour des choses comme le volume:

Étant donné une région géométrique construite de manière hiérarchique, il est possible de l’arborer avec CSGRegionTree:

Dans le cadre de l’ingénierie mécanique, il est très courant de fabriquer des pièces en effectuant physiquement diverses opérations qui peuvent facilement être représentées sous forme de DSC. Voici donc par exemple un arbre CSG légèrement plus compliqué

qui peuvent être « assemblés » en une région CSG réelle pour une pièce d’ingénierie typique:

La réflexion sur les DSC met en évidence la question de savoir quand deux régions sont « identiques ». Par exemple, même si une région peut être représentée comme un polygone général, elle peut aussi être un rectangle pur. Et plus encore, la région peut se trouver à un endroit différent de l’espace, avec une orientation différente.
Dans la version 13.0, la fonction RegionCongruent teste ce phénomène:

RegionSimilar permet également aux régions de changer de taille :

Mais sachant que deux régions sont similaires, la question suivante pourrait être: Quelle transformation est nécessaire pour passer de l’une à l’autre?
Dans la version 13.0, FindRegionTransform essaie de le déterminer:

Formules chimiques et réactions chimiques

Dans la version 12, nous avons présenté Molecule comme une représentation symbolique d’une molécule en chimie. Dans les versions successives, nous avons régulièrement ajouté de nouvelles fonctionnalités autour de Molecule. Dans la version 13.0, nous ajoutons des éléments tels que la possibilité
d’annoter les tracés de molécules 2D et 3D avec des informations supplémentaires:

Molecule fournit une représentation pour un type spécifique de molécule, avec un arrangement spécifique des atomes dans l’espace 3D. Dans la version 13.0, cependant, nous généralisons aux formules chimiques arbitraires, dans lesquelles on décrit le nombre de chaque type d’atome, sans donner d’informations sur les liaisons ou l’arrangement 3D. On peut entrer une formule chimique comme une chaîne de caractères:

À partir de la formule seule, il est possible de calculer quelques propriétés, comme la masse moléculaire :
Étant donné la formule chimique, on peut demander les molécules spécifiques « connues » qui ont cette formule :

Souvent, ces molécules sont nombreuses et on peut, par exemple, voir comment elles sont disposées dans un « espace de caractéristiques chimiques »:

Maintenant que nous pouvons gérer à la fois les molécules et les formules chimiques, la prochaine grande étape est celle des réactions chimiques. Et dans la version 13.0, le début de cette étape est la possibilité de représenter
symboliquement une réaction chimique.

Vous pouvez saisir une réaction sous forme de chaîne de caractères:

Voici la réaction représentée en termes de règles explicites:

Mais ce n’est pas encore une réaction équilibrée. Pour l’équilibrer, nous pouvons utiliser ReactionBalance:

Et, il va sans dire que ReactionBalance est assez général, de sorte qu’il peuttraiter les réactions dont l’équilibrage nécessite la résolution d’équations diophantiennes légèrement non triviales:

Bioséquences: Tracés, liaisons secondaires et
plus encore

Dans la version 12.2, nous avons introduit le concept de BioSéquence, pourreprésenter des molécules comme l’ADN, l’ARN et les protéines qui sontconstituées de séquences d’unités discrètes. Dans la version 13.0, nous avonsajouté une variété de nouvelles fonctionnalités de BioSequence. La premièreest BioSequencePlot, qui fournit une représentation visuelle immédiate des bio-séquences:

Mais au-delà de la visualisation, la version 13.0 offre également la possibilité de représenter la structure secondaire de l’ARN, des protéines et de l’ADN monocaténaire. Voici, par exemple, un morceau d’ARN avec des liaisons hydrogène supplémentaires:

Vous pouvez également spécifier la structure secondaire en utilisant la notation « point-bracket »:

BioSequence prend également en charge les brins hybrides, impliquant par exemple la liaison entre l’ADN et l’ARN:

Molecule convertit la BioSequence en une collection explicite d’atomes:

En mettant tout cela en commun, voici un exemple de réticulation entre deux peptides (maintenant avec des liaisons disulfure), dans ce cas pour l’insuline :

Données de vol

L’un des objectifs du Wolfram Language est d’avoir le plus de connaissances possibles sur le monde. Dans la version 13.0, nous ajoutons un nouveau domaine: les informations sur les vols d’avion actuels et passés (pour l’instant, uniquement aux États-Unis). Disons que nous voulons connaître les vols entre Boston et San Diego hier.

Nous pouvons simplement demander à FlightData:

Examinons maintenant l’un de ces vols. Il est représenté comme une entité symbolique, avec toutes sortes de propriétés:

Ce graphique indique l’altitude de l’avion en fonction du temps:

Et voici la trajectoire de vol qu’il a suivie:

FlightData nous permet également d’obtenir des données agrégées. Par exemple, ceci indique d’où viennent tous les vols qui sont arrivés hier à Boston:

Et ceci montre un histogramme de l’heure de départ des vols de Boston hier:

Pendant ce temps, voici les chemins que les vols arrivant à Boston ont pris près de l’aéroport:

Et, oui, on pourrait maintenant commencer à regarder les caps des pistes, les directions du vent hier, etc. – des données pour tout cela que nous avons dans notre base de connaissances.

Tracés multiaxes et multi-panneaux

Elle a été demandée depuis des années. Et il y a eu de nombreuses implémentations de paquets. Mais maintenant, dans la version 13.0, le traçage multiaxe est directement intégré au langage Wolfram. Voici un exemple:

Comme indiqué, l’échelle de la courbe bleue est à gauche, et celle de la courbe orange à droite.

Vous pourriez penser que cela semble simple. Mais ce n’est pas le cas. En effet, plusieurs systèmes de coordonnées sont combinés en un seul graphique, puis désambiguïsés par des axes liés par diverses formes de
style. La dernière étape de ce travail de fond a été réalisée dans la version 12.3, lorsque nous avons introduit AxisObject et les « axes désincarnés ».

Voici un cas plus compliqué, avec maintenant 5 courbes, chacune avec son propre axe:

Et voici ce qui se passe si certaines courbes partagent leurs axes:

Les axes multiples vous permettent de regrouper plusieurs courbes sur un seul « panneau de tracé ». Les tracés multi-panneaux vous permettent de placer des courbes dans des panneaux séparés, connectés, avec des axes partagés. Les premiers cas de tracés multipanneaux ont déjà été introduits dans la version 12.0. Mais maintenant, dans la version 13.0, nous étendons les tracés multi-panneaux à d’autres types de visualisations:

Dates, et infinités, dans les échelles de traçage

Dans la version 13.0, les « coordonnées » dans les graphiques ne sont plus seulement des nombres, mais aussi des dates. Par exemple, cela signifie que toutes les fonctions de traçage habituelles « fonctionnent » sur des choses comme les séries chronologiques :

Et rien ne vous empêche d’avoir des dates sur plusieurs axes. Voici un exemple de tracé de l’heure du jour (un TimeObject) en fonction de la date, dans ce cas pour les horodatages des e-mails stockés dans un Databin:

Une autre nouveauté concernant les axes – ou plutôt les échelles – dans la version 13.0 est la possibilité d’avoir des plages de tracé infinies:

Le principe est qu’il existe une fonction de mise à l’échelle qui transforme l’intervalle infini en un intervalle fini. Vous pouvez l’utiliser explicitement avec les ScalingFunctions:

Voici un exemple un peu plus élaboré, qui inclut un intervalle doublement infini:

Nouveaux types de visualisation

Nous ajoutons constamment de nouveaux types de visualisations intégrées, notamment pour prendre en charge de nouveaux types de fonctionnalités. Ainsi, par exemple, dans la version 13.0, nous ajoutons des tracés de déplacement vectoriel pour prendre en charge nos nouvelles capacités en mécanique des solides:

Ou en 3D:

Le graphique montre comment une région donnée est déformée par un certain champ de déplacement. VectorPoints vous permet d’inclure également les vecteurs de déplacement :

Dans la version 12.3, nous avons introduit la fonction GeoGraphPlot pour tracer des graphiques dont les sommets sont des positions géographiques. Dans la version 13.0, nous ajoutons GeoGraphValuePlot qui vous permet également de visualiser les « valeurs » sur les bords du graphique:

L’éclairage devient symbolique

L’éclairage est un élément crucial de la perception des graphiques 3D. Depuis la version 1.0, nous disposons de l’option de base Éclairage pour spécifier l’éclairage général des scènes 3D. Mais dans la version 13.0, nous permettons un contrôle beaucoup plus fin de l’éclairage, ce qui est devenu particulièrement important maintenant que nous prenons en charge les propriétés de matériau, de surface et d’ombrage pour les objets 3D. L’idée principale est de rendre la représentation des sources de lumière symbolique. Ainsi, par exemple, ceci représente une configuration de sources lumineuses

qui peut immédiatement être utilisé avec l’option d’éclairage existante:

Mais la nouvelle possibilité consiste à « éclairer séparément » différents objets d’une scène, en spécifiant pour eux différents « styles d’éclairage » symboliques:

À propos, une autre nouvelle fonctionnalité de la version 13.0 est la primitive Torus intégrée:

Détecteurs de contenu pour l’apprentissage automatique

Classify vous permet d’entraîner des classificateurs de « données entières ». Par exemple : « Est-ce un chat ? » ou « Ce texte parle-t-il de films ? ». Dans la version 13.0, nous avons ajouté la possibilité d’entraîner des détecteurs de contenu qui servent de classificateurs pour des sous-parties de données. « Quels chats y a-t-il ici ? » « Où est-ce
que ça parle de films ici ? »
L’idée de base est de donner des exemples d’entrées entières, en indiquant dans chaque cas où l’entrée correspond à une classe particulière. Voici une formation de base pour identifier les classes de sujets dans un texte :

Nous pouvons maintenant utiliser le détecteur de contenu sur desentrées spécifiques:

Comment cela fonctionne-t-il ? En fait, le langage Wolfram en sait déjà beaucoup sur les textes, les mots et leur signification. Il suffit donc de lui donner un exemple de football pour qu’il comprenne, grâce à ses connaissances intégrées, que le basket-ball est le même genre de chose.

Dans la version 13.0, vous pouvez créer des détecteurs de contenu non seulement pour le texte mais aussi pour les images. Le problème étant considérablement plus complexe pour les images, il faut plus de temps pour construire le détecteur de contenu. Mais une fois construit, il peut être exécuté rapidement sur n’importe quelle image.
Comme pour le texte, vous entraînez un détecteur de contenu d’image en donnant des exemples d’images et en indiquant où se trouvent les classes de choses que vous recherchez dans ces images :

Après avoir effectué cet entraînement (qui, oui, a pris environ 5 minutes sur une machine équipée de GPU), nous pouvons alors appliquer le détecteur que nous venons de créer:

Lorsque vous appliquez le détecteur, vous pouvez lui demander différents types d’informations. Ici, il donne des boîtes de délimitation que vous pouvez utiliser pour annoter l’image originale:

À propos, ce qui se passe sous le capot pour que tout cela fonctionne est assez sophistiqué. En fin de compte, nous utilisons de nombreuses connaissances intégrées sur les types d’images qui se produisent habituellement. Et lorsque vous fournissez des échantillons d’images, nous les complétons avec toutes sortes d’images « typiquement similaires » dérivées de la transformation de vos échantillons. Ensuite, nous ré-entraînons efficacement notre système d’images pour utiliser les nouvelles informations dérivées de vos exemples.

Nouvelle visualisation et nouveaux diagnostics pour l’apprentissage automatique

L’une des fonctions d’apprentissage automatique que j’utilise en permanence est FeatureSpacePlot. Dans la version 13.0, nous avons ajouté une nouvelle méthode par défaut qui rend FeatureSpacePlot plus rapide et plus robuste, et lui permet de produire des résultats plus convaincants. Voici un exemple d’exécution sur 10 000 images:

L’un des avantages de l’apprentissage automatique dans le langage Wolfram est que vous pouvez l’utiliser de manière hautement automatisée. Il suffit de donner à Classify une collection d’exemples d’entraînement pour qu’il produise automatiquement un classificateur que vous pouvez utiliser immédiatement. Mais comment fait-il exactement? Une partie essentielle du pipeline consiste à trouver comment extraire des caractéristiques pour transformer vos données en tableaux de chiffres. Et dans la version 13.0, vous pouvez maintenant obtenir l’extracteur de caractéristiques explicite qui a été construit pour (afin que vous puissiez, par exemple, l’utiliser sur d’autres données):

Voici les caractéristiques extraites pour un seul élément de données:

Cela montre une partie des rouages de ce qui se passe dans Classify. Mais vous pouvez aussi vous demander ce qui affecte le plus les résultats de Classify. Une approche consiste à utiliser les valeurs SHAP pour déterminer l’impact de chaque attribut spécifié dans les données que vous fournissez sur le résultat. Dans la version 13.0, nous avons ajouté un moyen graphique pratique pour afficher cela pour une entrée donnée:

Automatiser le problème de la localisation pour les robots et plus encore

La conception de systèmes de contrôle est une affaire compliquée. Tout d’abord, il faut disposer d’un modèle du système que l’on cherche à contrôler. Ensuite, il faut définir les objectifs du contrôleur. Et enfin, vous devez construire un contrôleur qui atteigne ces objectifs. Grâce à l’ensemble des technologies de Wolfram Language et de Wolfram System Modeler, nous arrivons à un point où nous disposons d’un pipeline automatisé sans précédent pour réaliser ces tâches.

La version 13.0 ajoute spécifiquement des capacités pour concevoir des contrôleurs qui permettent à un système de suivre un signal spécifique – par exemple, un robot qui suit une trajectoire particulière.
Considérons un robot très simple, constitué d’un chariot mobile auquel est fixé un pointeur:

Tout d’abord, nous avons besoin d’un modèle pour le robot, que nous pouvons créer dans Wolfram System Modeler (ou importer comme modèle Modelica):

Notre objectif est maintenant de mettre en place un moyen de \ »piloter » les variables d’entrée du robot (la force qui déplace le chariot et le couple pour le pointeur).

afin d’obtenir un certain comportement pour les variables de sortie (la position de la fin du pointeur):

Voici une courbe que nous voulons que l’extrémité du pointeur suive dans le temps :

Maintenant, nous voulons construire le contrôleur – et c’est là qu’il faut connaître un peu la théorie du contrôle. Ici, nous allons utiliser la méthode de placement des pôles pour créer notre contrôleur. Et nous allons utiliser la nouvelle capacité de la version 13.0 pour pouvoir concevoir un « contrôleur de suivi » qui suit des sorties spécifiées (oui, pour définir ces chiffres, vous devez connaître la théorie du contrôle):

Nous devons maintenant réaliser le système en boucle fermée qui comprend le robot et son contrôleur:

Et maintenant nous pouvons simuler le comportement de tout ce système, en donnant en entrée des listes de coordonnées x et y de la trajectoire de référence:

Et sur la base de cette simulation, voici un tracé de l’endroit où se trouve la fin du pointeur:

Après un transitoire initial, cela suit le chemin que nous voulions. Et, oui, même si tout cela est un peu compliqué, c’est incroyablement plus simple que si nous utilisions directement du matériel réel, plutôt que de faire de la conception théorique « basée sur un modèle ».

Tapez moins de parenthèses!

Lorsque vous lancez la version 13 pour la première fois, et que vous tapez quelque chose comme f[, vous verrez ce qui suit:

La version 13 ajoute automatiquement les parenthèses correspondantes lorsqu’elle estime qu’il n’y a pas d’ambiguïté à le faire. La seule chose à savoir est que vous pouvez alors « taper à travers » la parenthèse; en d’autres termes, si dans ce cas, avec le curseur juste avant le ] ajouté automatiquement, vous tapez explicitement ], aucun nouveau ] n’apparaîtra; le système va juste « taper à travers » le ].
Il y a aussi l’alternative d’utiliser ctrl space pour se déplacer à droite du crochet fermant ajouté automatiquement. Et, d’ailleurs ctrl space se déplace également à droite de la parenthèse fermante suivante, même si votre curseur n’est pas immédiatement à côté de la parenthèse; il le fera même si le curseur est profondément enfoui dans une structure imbriquée.

Le comportement d’automatching (que vous pouvez désactiver dans la boîte de dialogue Préférences si vous ne l’aimez vraiment pas) s’applique non seulement à [ ] mais aussi à { }, ( ), [[ ]], <| |>, (* *) et (surtout)  » « . Et ctrl space fonctionne également avec tous ces types de délimiteurs.

Pour les aficionados de l’expérience utilisateur, il y a un point supplémentaire qui peut être intéressant. En tapant ctrl space peut potentiellement déplacer votre curseur suffisamment loin pour que votre œil le perde. Ce type de déplacement du curseur sur une longue distance peut également se produire lorsque vous saisissez des données mathématiques ou d’autres données 2D qui sont composées en temps réel. Dans les années 1990, nous avons inventé un mécanisme pour éviter que les gens « perdent le curseur ». En interne, nous l’appelons « l’incroyable tache qui rétrécit ». Il s’agit d’une grosse tache noire qui apparaît à la nouvelle position du curseur et qui rétrécit jusqu’au curseur pur en 160 millisecondes environ. Pensez-y comme un « vision hack ». En fait, nous nous connectons au système de vision préattentive de l’homme, qui fait que l’on déplace automatiquement son regard vers « l’objet qui apparaît soudainement », mais sans vraiment
s’en rendre compte.
Dans la version 13, nous utilisons maintenant ce mécanisme non seulement pour la composition en temps réel, mais aussi pour les commandes de type ctrl space -pour ajouter le blob chaque fois que la « distance de saut » est supérieure à un certain seuil.
Vous ne remarquerez probablement même pas la présence du blob (seule une petite fraction de personnes semble le « voir »). Mais si vous l’attrapez à temps, voici ce que vous verrez:

Progrès dans la visualisation de la progression des calculs…

Vous exécutez un long calcul. Que se passe-t-il? Nous avons une initiative à long terme visant à fournir un suivi interactif de la progression pour autant de fonctions qui effectuent des calculs longs que possible.

Par exemple, dans la version 13.0, ParallelMap, ParallelTable, etc. vous donnent automatiquement un suivi de la progression

L’affichage est temporaire; il n’est là que le temps du calcul, puis il disparaît.
Il existe de nombreux autres exemples de ce type, et d’autres encore sont à venir. Il y a le suivi de la progression en vidéo, l’apprentissage automatique, l’accès à la base de connaissances, l’importation/exportation et diverses fonctions algorithmiques:

En général, le suivi de la progression est une bonne chose; il vous aide à savoir ce qui se passe et vous permet de vérifier si les choses ont dérapé. Mais parfois, il peut être déroutant, surtout si une fonction interne dont vous ne saviez même pas qu’elle était appelée apparaît soudainement dans le suivi de la progression. Pendant longtemps, nous avons pensé que ce problème rendrait la généralisation du suivi de la progression une mauvaise idée. Mais l’intérêt de voir ce qui se passe semble presque toujours l’emporter sur la confusion potentielle de voir quelque chose se passer « sous le capot » dont vous n’étiez pas au courant. Et il est très utile que, dès qu’une opération est terminée, ses moniteurs de progression disparaissent, de sorte que votre carnet de notes final n’en porte aucune trace.
À propos, chaque fonction avec contrôle de la progression possède une option ProgressReporting, que vous pouvez régler sur False. En outre, il existe une variable globale $ProgressReporting qui spécifie la valeur par défaut dans tout le système.
Il convient de mentionner qu’il existe différents niveaux de suivi du type « Are we there yet ». Certaines fonctions passent par une séquence systématique d’étapes, par exemple le traitement de chaque image d’une vidéo. Dans ce cas, il est possible d’afficher la « fraction complète » sous forme de barre d’indicateur de progression. Parfois, il est également possible de faire au moins une estimation de la « fraction achevée » (et donc du temps d’achèvement prévu) en examinant « statistiquement » ce qui s’est passé jusqu’à présent dans certaines parties du calcul. C’est, par exemple, la façon dont ParallelMap etc. fait son suivi de la progression.
Bien sûr, en général, il n’est pas possible de savoir combien de temps prendra un calcul arbitraire; c’est l’histoire de l’irréductibilité informatique et de choses comme l’indécidabilité du problème de la halte pour les machines de Turing. Mais en supposant (ce qui s’avère être assez bon la plupart du temps) qu’il y a une distribution assez régulière des temps d’exécution pour différents sous-calculs, il est toujours possible de donner des estimations raisonnables. (Et, oui, le « signe visible » d’une indécidabilité potentielle est qu’un pourcentage de complétion pourrait sauter vers le bas aussi bien qu’augmenter avec le temps).

Wolfram|Alpha Notebooks

Pendant de nombreuses années, nous avons eu Mathematica + Wolfram Language, et nous avons eu Wolfram|Alpha. Puis, fin 2019, nous avons introduit Wolfram|Alpha Notebook Edition comme une sorte de mélange entre les deux. En fait, dans les déploiements standard de Mathematica et de Wolfram|Alpha sur le bureau et dans le cloud, il y a aussi maintenant le concept d’un Notebook en mode Wolfram|Alpha, où l’idée de base est que vous pouvez saisir des choses en langage naturel libre, mais obtenir les capacités du langage Wolfram pour représenter et construire des calculs:

Dans la version 13.0, de nombreux éléments ont été ajoutés aux blocsnotes Wolfram|Alpha-Mode. Tout d’abord, il existe des palettes permettant de saisir directement la notation mathématique 2D:

Il est également possible de générer immédiatement un contenu dynamique riche directement à partir d’une entrée linguistique de forme libre:
Outre le contenu interactif « sur mesure », les ordinateurs portables en mode alpha de Wolfram permettent également d’accéder immédiatement au contenu interactif des plus de 12 000 démonstrations du projet de démonstrations Wolfram:
Wolfram|Alpha Notebook Edition est particulièrement bien adapté à l’enseignement. Et dans la version 13.0, nous incluons une première collection de quiz interactifs, portant spécifiquement sur les parcelles:

Tout pour les quiz dans la langue

La version 13.0 offre la possibilité de créer, de déployer et de noter desquiz directement dans Wolfram Language, à la fois sur le bureau et dans le nuage. Voici un exemple de quiz déployé:
Tout cela est basé sur les capacités du carnet de formulaires que nous avons introduites dans la version 12.2. Mais il y a un élément supplémentaire: QuestionObject. Un QuestionObject donne une représentation symbolique d’une question à poser, ainsi qu’une AssessmentFunction à appliquer à la réponse qui est fournie, pour l’évaluer, la noter ou la traiter d’une autre manière. Dans le cas le plus simple, la « question à poser » est simplement une chaîne de caractères. Mais elle peut être plus sophistiquée, et il existe une liste de possibilités (qui s’allongera régulièrement) que vous pouvez sélectionner dans le cahier d’écriture:

(La construction QuestionInterface vous permet de contrôler en détail la façon dont l' »invite de la question » est configurée). Une fois que vous avez créé votre quiz dans le cahier de création (et bien sûr, il ne doit pas nécessairement s’agir d’un « quiz » au sens du didacticiel), vous devez le déployer. Les paramètres vous permettent de définir diverses options:

Ensuite, lorsque vous appuyez sur Générer, vous obtenez immédiatement une version déployée de votre quiz qui peut, par exemple, être consultée directement sur le Web. Vous obtenez également un carnet de résultats, qui vous montre comment récupérer les résultats des personnes qui font le quiz.

Que se passe-t-il réellement lorsque quelqu’un répond au quiz? Dès qu’il appuie sur Soumettre, sa réponse est évaluée et soumise à la destination que vous avez spécifiée, qui peut être un objet en nuage, un databin, etc. (Vous pouvez également spécifier que vous souhaitez que la personne qui répond au quiz reçoive un retour d’information local).
Ainsi, après que plusieurs personnes ont soumis des réponses, voici à quoi pourraient ressembler les résultats que vous obtenez:
Dans l’ensemble, la version 13.0 offre désormais un flux de travail rationalisé pour la création de quiz simples et complexes. Les quiz peuvent comporter toutes sortes de réponses différentes, notamment du code exécutable en Wolfram Language. Et les évaluations peuvent également être sophistiquées, par exemple en incluant des comparaisons de code.
Pour donner une idée de ce qui est possible, voici une question qui demande de sélectionner une couleur, qui sera comparée à la bonne réponse dans une certaine tolérance:

Démêler les courriels, les PDF et plus encore

À quoi ressemblent réellement les fils de discussion des courriels? Je me pose cette question depuis longtemps. Et maintenant, dans la version 13.0, nous disposons d’un moyen facile d’importer des fichiers MBOX et de voir la structure des fils de discussion des e-mails. Voici un exemple tiré d’une de nos listes de diffusion internes:

Maintenant nous pouvons faire des opérations standard sur le graphe :

Une nouvelle fonctionnalité importante de la version 12.2 était la possibilité d’importer fidèlement des PDF sous diverses formes, y compris des images de pages et du texte brut. Dans la version 13.0, nous avons ajouté la possibilité d’importer des PDF sous forme de graphiques vectoriels.
Voici un exemple de pages importées en tant qu’images:

Voici maintenant une page importée en tant que graphique vectoriel:

Et maintenant, pour prouver qu’il s’agit d’un graphique vectoriel, nous pouvons le modifier, jusqu’aux traits utilisés dans chaque glyphe:

Maintenant que nous avons la vidéo dans Wolfram Language, nous voulons pouvoir importer autant de vidéos que possible. Nous prenons déjà en charge une liste très complète de conteneurs et de codecs vidéo. Dans la version 13.0, nous avons également ajouté la possibilité d’importer des vidéos .FLV (Flash), ce qui vous permet de les convertir dans des formats modernes.

CloudExpression s’impose

Vous avez une expression que vous souhaitez manipuler d’une session à l’autre. L’une des façons de procéder consiste à rendre l’expression entière persistante à l’aide de PersistentValue, ou à la stocker explicitement dans un fichier ou un objet en nuage et à la relire lorsque vous en avez besoin. Mais il existe une méthode beaucoup plus efficace et transparente, qui ne nécessite pas de manipuler l’ensemble de l’expression en permanence, mais qui vous permet plutôt de « poke » et de « peek » les parties individuelles.
Nous avons introduit CloudExpression pour la première fois en 2016 dans la version 10.4. À l’époque, il était destiné à être un moyen assez temporaire de stocker des expressions assez petites. Mais nous avons constaté qu’il est beaucoup plus généralement utile que prévu, et donc dans la version 13.0, il reçoit une mise à niveau majeure qui le rend plus efficace et robuste.Il convient de mentionner qu’il existe plusieurs autres moyens de stocker des éléments de manière persistante dans le Wolfram Language. Vous pouvez utiliser PersistentValue pour conserver des expressions entières. Vous pouvez utiliser la fonctionnalité Wolfram Data Drop pour vous permettre d’ajouter progressivement des données aux banques de données. Vous pouvez utiliser ExternalStorageUpload pour stocker des léments dans des systèmes de stockage externes tels que S3 ou IPFS. Vous pouvez également configurer une base de données externe (comme une base de données SQL ou documentaire), puis utiliser les fonctions du langage Wolfram pour y accéder et la mettre à jour. Mais CloudExpression offre un moyen beaucoup plus léger, mais général, de configurer et de manipuler des expressions persistantes.
L’idée de base est de créer une expression en nuage qui est stockée de manière persistante dans votre compte en nuage, puis de pouvoir effectuer des opérations sur cette expression. Si l’expression du nuage se compose de listes et d’associations, les opérations standard du Wolfram Language vous permettent de lire ou d’écrire efficacement des parties de l’expression du nuage sans jamais devoir mettre l’ensemble en mémoire dans votre session. Ceci crée une expression nuage à partir d’une table de, dans ce cas, polynômes:

Cela nous donne la 5e partie du tableau:

Nous pouvons le réinitialiser :

Cela permet d’obtenir l’expression de tout le nuage:

Mais le point important est que l’obtention et le réglage des parties de l’expression du nuage ne nécessitent pas de tirer l’expression en mémoire. Chaque opération est effectuée directement dans le nuage.Dans un système de base de données relationnelle traditionnel, les données doivent être d’une certaine « rectangularité ». Mais dans une expression en nuage (comme dans une base de données NoSQL), vous pouvez avoir n’importe quelle liste imbriquée et structure d’association, et, en outre, les éléments peuvent être des expressions symboliques arbitraires. CloudExpression est configuré de manière à ce que les opérations que vous
utilisez soient atomiques, de sorte que, par exemple, vous pouvez en toute sécurité avoir deux processus différents qui lisent et écrivent simultanément dans la même expression de nuage. Le résultat est queCloudExpression est un bon moyen de gérer les données construites par des choses comme APIFunction et FormFunction.
D’ailleurs, CloudExpression n’est en fait qu’un objet du nuage, et partagedonc les mêmes capacités de permission que CloudObject. Cela signifie, par exemple, que vous pouvez laisser d’autres personnes lire ou écrire sur une expression de nuage que vous avez créée. (Les données associées à CloudExpression sont stockées dans votre compte cloud, mais elles utilisent leur propre quota de stockage, distinct de celui de CloudObject).
Imaginons que vous stockiez de nombreuses données importantes sous forme de sous-liste dans CloudExpression. CloudExpression est tellement facile à utiliser que vous pourriez craindre de taper quelque chose comme ce[« clients »]=7 et que vos données importantes soient soudainement écrasées. Pour éviter cela, CloudExpression dispose de l’option PartProtection, qui vous permet de spécifier si, par exemple, vous souhaitez autoriser la modification de la structure de l’expression, ou seulement deses « éléments feuilles »

L’avancée du référentiel de fonctions

Lorsque nous avons lancé le référentiel Wolfram Function en 2019, nous ne savions pas à quelle vitesse il allait se développer. Mais je suis heureux de dire que c’est un grand succès – avec peut-être 3 nouvelles fonctions par
jour publiées, ce qui donne un total à ce jour de 2259 fonctions. Il s’agit de fonctions qui ne font pas partie du noyau du langage Wolfram, mais auxquelles on peut accéder immédiatement à partir de n’importe quel système Wolfram Language.
Il s’agit de fonctions fournies par les membres de la communauté, que nous avons examinées et sélectionnées. Et compte tenu de toutes les capacités du langage Wolfram de base, il est remarquable de voir ce qui peut être réalisé dans une seule fonction fournie. La plupart des fonctions n’ont pas toute l’ampleur et la robustesse
nécessaires pour être intégrées au cœur du langage Wolfram (bien que des fonctions comme Adjugate dans la version 13.0 aient été développées à partir de « prototypes » dans le référentiel de fonctions). Mais ce qu’ils ont, c’est un processus de livraison considérablement accéléré qui permet de mettre à disposition
extrêmement rapidement de nouvelles fonctionnalités pratiques dans de nouveaux domaines.
Certaines des fonctions du référentiel de fonctions étendent les capacités algorithmiques. Par exemple, FractionalOrderD permet de calculer les dérivées fractionnaires:

Il y a beaucoup de choses dans FractionalOrderD. Mais il est d’une certaine manière assez spécifique, dans le sens où il est basé sur un type particulier de différenciation fractionnaire. À l’avenir, nous pourrons intégrer au système une différenciation fractionnaire à grande échelle, mais cela nécessitera une multitude de nouveaux algorithmes. Ce que fait FractionalOrderD dans le référentiel de fonctions est de fournir une forme de différenciation fractionnelle maintenant.
Voici un autre exemple de fonction dans le référentiel de fonctions, cette fois-ci basée sur les capacités de Wolfram|Alpha:

Certaines fonctions offrent des capacités de visualisation étendues. Voici VennDiagram:

Il existe de nombreuses façons d’imaginer le traitement des cas plus compliqués; cette fonction fait un choix particulier:

Comme autre exemple de fonction de visualisation, voici TruthTable, construit pour donner un affichage visuel des résultats de la fonction BooleanTable du langage de base:

Certaines fonctions offrent des extensions pratiques – mais peut-être pas entièrement générales – à des caractéristiques particulières du langage. Voici IntegerChop qui réduit les nombres réels « suffisamment proches des entiers » aux entiers exacts:

Voici un exemple d’une fonction qui sera peut-être un jour dans le langage de base. Mais pour l’instant, les cas les plus courants de cette fonction sont fournis par une fonction du Répertoire des fonctions:

Il existe de nombreuses fonctions dans le référentiel de fonctions qui fournissent des extensions spécifiques à des domaines de fonctionnalité dans le langage de base. BootstrappedEstimate, par exemple, donne une extension utile et spécifique à la fonctionnalité des statistiques:

Voici une fonction qui « remappe » l’ensemble de Mandelbrot – en utilisant FunctionCompile pour aller plus loin que MandelbrotSetPlot:

Certaines fonctions peuvent sembler  » de niche « , mais elles sont extrêmement utiles si vous en avez besoin:

Il existe ensuite des fonctions qui rendent les « questions d’actualité » pratiques. MintNFT en est un exemple :

Il existe aussi des « fonctions pour le plaisir » (qui peuvent certainement aussi être utiles):

Et il y a des fonctions qui peuvent être considérées comme de l’humour « d’initiés »:

D’ailleurs, le référentiel de fonctions n’est pas le seul à s’enrichir de toutes sortes de contributions intéressantes: le référentiel de données et le référentiel de réseaux neuronaux ont également progressé de manière dynamique.

Introduction d’outils pour la création de paclets

Le référentiel de fonctions permet de créer des fonctions uniques qui ajoutent des fonctionnalités. Mais que faire si vous souhaitez créer un tout nouveau monde de fonctionnalités, avec de nombreuses fonctions liées entre elles? Et peut-être que cela implique non seulement des fonctions, mais aussi, par exemple, des modifications des éléments de votre interface utilisateur. Depuis de nombreuses années, nous construisons en interne de nombreuses parties du système Wolfram Language à l’aide d’une technologie que nous appelons paclets, qui fournit effectivement des paquets de fonctionnalités pouvant être installés automatiquement sur le système d’un utilisateur donné.
Dans la version 12.1, nous avons ouvert le système de paclets, en fournissant des fonctions spécifiques comme PacletFind et PacletInstall pour utiliser les paclets. Mais la création de paclets restait une sorte d’art noir. Dans la version 13.0, nous publions maintenant une première série d’outils pour créer des paclets et vous permettre de les déployer pour les distribuer sous forme de fichiers ou via le Wolfram Cloud. Les outils de paclet sont eux-mêmes (il va sans dire) distribués dans un paclet qui est maintenant inclus par défaut dans chaque installation de Wolfram Language. Pour l’instant, les outils sont dans un paquet séparé que vous devez charger:

Pour commencer à créer une paclet, vous définissez un « dossier paclet » qui contiendra tous les fichiers qui composent votre paclet

Cela établit la structure de base de votre paclet, à laquelle vous pouvez ensuite ajouter des fichiers:

Comme alternative, vous pouvez spécifier certains composants dans votre paclet dès sa création:

Il y a toutes sortes d’éléments qui peuvent exister dans les paclets, et dans les futures versions, il y aura progressivement plus d’outils pour faciliter leur création. Dans la version 13.0, cependant, une pièce majeure de l’outillage livré est les outils de documentation, qui fournissent des outils pour créer le même type de documentation que nous avons pour les fonctions intégrées du système.

Vous pouvez accéder à ces outils directement à partir du menu principal Palettes du système:

Vous pouvez maintenant créer des pages de référence, des pages de guide, des notes techniques et d’autres éléments de documentation en tant que blocs-notes dans votre fonction Paclet. Une fois que vous avez obtenu ces éléments, vous pouvez les transformer en documentation finie à l’aide de PacletDocumentationBuild. Vous pouvez ensuite les avoir sous forme de fichiers de notebook, de fichiers HTML autonomes ou de matériel déployé dans le nuage.
Des outils supplémentaires pour la création de paclets seront bientôt disponibles, ainsi qu’un dépôt public de paclets pour les paclets contribués par les utilisateurs. La nouvelle fonction PacletSymbol est une fonctionnalité importante pour le dépôt de paclets, qui peut déjà être utilisée avec les paclets déployées de manière privée.

Pour le référentiel de fonctions, vous pouvez utiliser ResourceFunction[« name »] pour accéder à n’importe quelle fonction du référentiel. PacletSymbol est un analogue de ceci pour les paclets. Une façon d’utiliser une paclet est de charger explicitement tous ses actifs. Mais PacletSymbol vous permet de faire un « appel profond » dans une
paclet pour accéder à une seule fonction ou un seul symbole. Comme avec ResourceFunction, toutes sortes de chargements d’actifs se produiront en arrière-plan, mais dans votre code, vous pouvez simplement utiliser PacletSymbol sans aucune initialisation visible. D’ailleurs, un modèle émergent consiste à « soutenir » une collection de fonctions interdépendantes du référentiel de fonctions avec une paclet, en accédant aux fonctions individuelles à partir du code du référentiel de fonctions en utilisant PacletSymbol.

Introduction des alias de contexte

Lorsque vous utilisez un nom, comme x, pour quelque chose, il y a toujours la question de « quel x? ». Depuis le tout début, dans la version 1.0, il y a toujours eu la notion d’un contexte pour chaque symbole. Par défaut, vous créez des symboles dans le contexte Global, donc le nom complet du x que vous faites est Global`x.
Lorsque vous créez des paquets, vous voulez généralement les configurer de façon à ce que les noms qu’ils introduisent n’interfèrent pas avec les autres noms que vous utilisez. Et pour y parvenir, il est typique que les paquets définissent leurs propres contextes. Vous pouvez alors toujours faire référence à un symbole à l’intérieur d’un package par son nom complet, par exemple Package`Subpackage`x etc.
Mais si vous demandez simplement x, qu’obtenez-vous? C’est défini par les paramètres de $Context et $ContextPath.
Mais parfois, vous voulez un cas intermédiaire. Plutôt que d’avoir juste x représentant Package`x comme il le ferait si Package` était sur le chemin de contexte $ContextPath, vous voulez être capable de faire référence à x « dans son package », mais sans taper (ou avoir à voir) le long nom potentiel de son package.

Dans la version 13.0, nous introduisons la notion d’alias de contexte pour vous permettre de faire cela. L’idée de base est extrêmement simple. Lorsque vous faites Needs[« Context` »] pour charger le paquetage définissant un contexte particulier, vous pouvez ajouter un « alias de contexte », en faisant Needs[« Context` »-> »alias` »]. Et le résultat de ceci sera que vous pouvez vous référer à n’importe quel symbole dans ce contexte comme alias`name. Si vous ne spécifiez pas d’alias de contexte, Needs ajoutera le contexte que vous demandez à $ContextPath afin que ses symboles soient disponibles sous la forme « juste x ». Mais si vous travaillez avec de nombreux contextes différents qui peuvent avoir des symboles avec des noms qui se chevauchent, c’est une meilleure idée d’utiliser des alias de contexte pour chaque contexte. Si vous définissez des alias courts, il n’y aura pas beaucoup plus de saisie, mais vous serez sûr de toujours faire référence au bon symbole.
Ceci charge un paquet correspondant au contexte ComputerArithmetic`, et par défaut ajoute ce contexte à $ContextPath:

Il est désormais possible d’utiliser les symboles de ComputerArithmetic sans rien dire de leur contexte :

Ceci charge le paquet en définissant un alias de contexte pour celui-ci:

Vous pouvez maintenant vous référer à ses symboles en utilisant l’alias:

Le symbole global $ContextAliases spécifie tous les alias que vous avez actuellement en service :

Au fait, tout comme notre convention sur les symboles dont les noms commencent par des lettres majuscules, c’est une convention générale commune d’avoir des noms de contexte pour les paquets qui commencent aussi par des lettres majuscules. Maintenant que nous avons aussi des alias de contexte, nous suggérons la convention d’utiliser des lettres minuscules pour ceux-ci.

Construction de pages Web symboliques

Si vous voulez prendre un carnet de notes et le transformer en page Web, il vous suffit de le CloudPublier. De même, si vous voulez créer un formulaire sur le Web, vous pouvez simplement utiliser CloudPublish avec FormFunction (ou FormPage). Et il y a une variété d’autres capacités directes vers le Web qui ont été intégrées depuis longtemps dans le Wolfram Language. Mais que faire si vous voulez créer une page Web avec des éléments Web élaborés? Une solution consiste à utiliser XMLTemplate pour insérer la sortie du Wolfram Language dans un fichier HTML, etc. Mais dans la version 13.0, nous commençons à mettre en place des spécifications symboliques de la structure complète d’une page Web, qui vous permettent d’obtenir le meilleur du langage Wolfram et des capacités et cadres Web.
Voici un tout petit exemple:

Et voici la page web qu’il produit :

L’idée de base est de construire des pages Web en utilisant des combinaisons imbriquées de WebColumn, WebRow et WebItem. Chacun de ces éléments dispose de diverses options du langage Wolfram. Mais ils permettent également un accès direct aux options CSS. Ainsi, en plus d’une option Wolfram Language Background->LightBlue, vous pouvez également utiliser une option CSS telle que »border-right »-> »1px solid #ddd ».
Il existe une autre fonctionnalité essentielle: InterfaceSwitched. Il s’agitde l’élément central permettant de créer des pages Web réactives, capables de modifier leur structure lorsqu’elles sont visualisées surdifférents types de périphériques. InterfaceSwitched est uneconstruction symbolique que vous pouvez insérer n’importe où dans WebItem, WebColumn, etc. et qui peut se comporter différemment lorsqu’on y accède avec une interface différente. Ainsi, par exemple, ilse comportera comme 1 si l’on y accède à partir d’un appareil dont lalargeur est comprise entre 0 et 480 pixels, et ainsi de suite. Vous pouvezvoir cela en action en utilisant CloudPublish et en redimensionnant lafenêtre que vous utilisez pour afficher le résultat

puis de redimensionner la fenêtre que vous utilisez pour visualiser le résultat:

Et maintenant… NFTs!

L’une des choses qui s’est produite dans le monde depuis la sortie de la version 12.3 est la généralisation de l’idée des NFT. Nous disposons en fait depuis plusieurs années d’outils permettant de prendre en charge les NFT – et les jetons en général – sur les blockchains. Mais dans la version 13.0, nous avons ajouté des outils NFT plus rationalisés, en particulier dans le contexte de notre connexion à la blockchain Cardano.

L’idée de base d’un NFT (« non-fungible token ») est d’avoir un jeton unique qui peut être transféré entre utilisateurs mais pas répliqué. C’est comme une pièce de monnaie, mais chaque NFT peut être unique. La blockchain fournit un registre permanent indiquant qui possède quel NFT. Lorsque vous transférez un NFT, vous ajoutez simplement quelque chose à la blockchain pour enregistrer cette transaction.

À quoi peuvent servir les NFT? A beaucoup de choses. Par exemple, nous avons émis des « certificats NFT » pour les personnes qui ont été « diplômées » de nos cours d’été et de notre camp d’été cette année. Nous avons également émis des NFT pour enregistrer la propriété de certaines œuvres d’automates cellulaires que nous avons créées lors d’un livestream. D’une manière générale, les NFT peuvent être utilisés comme des enregistrements permanents pour tout type d’information: propriété, références ou simplement commémoration d’une réalisation ou d’un événement.

Dans un cas typique, le NFT comporte une petite « charge utile » qui va directement sur la blockchain. S’il y a des actifs plus importants, comme des images, ils seront stockés sur un système de stockage distribué comme
IPFS, et la charge utile sur la blockchain contiendra un pointeur vers eux.
Voici un exemple qui utilise plusieurs de nos fonctions blockchain, ainsi que la nouvelle connexion à la blockchain Cardano, pour extraire d’IPFS l’image associée à un NFT que nous avons frappé il y a quelques semaines:

Comment pouvez-vous frapper vous-même un tel NFT? Le langage Wolfram dispose des outils pour le faire. ResourceFunction[« MintNFT »] dans le référentiel de fonctions Wolfram fournit un flux de travail commun (spécifiquement pour la norme CIP 25 Cardano NFT) – et il y en aura d’autres.
L’histoire complète de la blockchain sous le niveau du « pur consommateur » est compliquée et technique. Mais le langage Wolfram offre un moyen unique et rationalisé de le gérer, basé sur des représentations symboliques des constructions de la blockchain, qui peuvent être manipulées directement à l’aide de toutes les fonctions standard du langage Wolfram. Il existe également de nombreuses blockchains différentes, avec des configurations différentes. Mais grâce aux nombreux efforts que nous avons déployés au cours des dernières années, nous avons pu créer un cadre uniforme qui interagit entre les différentes blockchains tout en permettant l’accès à toutes leurs caractéristiques particulières. Il vous suffit donc maintenant de définir une BlockchainBase différente (Bitcoin, Ethereum, Cardano, Tezos, ARK, Bloxberg, …) et vous êtes prêt à interagir avec une autre blockchain.

Des téléchargements plus rapides et plus
élégants

Tout ce dont j’ai parlé ici est immédiatement disponible aujourd’hui dansle Wolfram Cloud et sur le bureau – pour macOS, Windows et Linux (et pour macOS, c’est à la fois Intel et « Apple Silicon » ARM). Mais lorsque vous allez télécharger (au moins pour macOS et Windows), il y a une nouvelle option: télécharger sans documentation locale.
Le paquet exécutable réel qu’est Wolfram Desktop ou Mathematica fait environ 1,6 Go pour Windows et 2,1 Go pour macOS (il est plus gros pour macOS car il inclut des binaires « universels » qui couvrent à la fois Intel et ARM). Mais il y a aussi la documentation. Et il y en a beaucoup. Et si vous la téléchargez entièrement, cela représente 4,5 Go supplémentaires à télécharger, et 7,7 Go une fois déployée sur votre système.
Le fait que toute cette documentation existe est très important, et nous sommes fiers de son étendue et de sa profondeur. Il est en outre très pratique de disposer de cette documentation sur votre ordinateur, sous la forme de blocs-notes que vous pouvez afficher immédiatement et modifier si vous le souhaitez. Mais comme notre documentation est devenue plus volumineuse (et nous travaillons à la rendre encore plus volumineuse), il est parfois plus judicieux d’économiser l’espace local sur votre ordinateur et d’obtenir la documentation sur le Web.
C’est pourquoi, dans la version 13.0, nous introduisons les téléchargements sans documentation, qui permettent d’accéder au Web et d’afficher la documentation dans votre navigateur. Lorsque vous installez Mathematica ou Wolfram|One pour la première fois, vous pouvez choisir le « pack complet » comprenant la documentation locale. Vous pouvez également choisir d’installer uniquement le paquet exécutable, sans documentation. Si vous changez d’avis par la suite, vous pouvez toujours télécharger et installer la documentation en utilisant l’option Installer la documentation locale du menu Aide.
(À propos, le Wolfram Engine a toujours été dépourvu de documentation – et sous Linux, sa taille de téléchargement n’est que de 1,3 Go, ce que je considère comme incroyablement petit compte tenu de toutes ses fonctionnalités).