Julia: État des produits intĂ©rieurs dans Base

CrĂ©Ă© le 15 janv. 2018  Â·  146Commentaires  Â·  Source: JuliaLang/julia

Si un utilisateur a besoin de définir des produits internes personnalisés pour les espaces de Hilbert généraux, quel est l'état actuel dans Base pour ce type de généralisation ? https://github.com/JuliaLang/julia/issues/16573 est un problÚme connexe, mais moins général. Mon souci concerne les nouveaux types qui ne sont pas des tableaux.

J'aimerais proposer de renommer dot en inner , ou peut-ĂȘtre demander aux utilisateurs de dĂ©finir inner(x,y) comme un produit interne gĂ©nĂ©ral entre les objets x et y , y compris le cas du tableau :

inner(x::AbstractVector, y::AbstractVector) = dot(x, y)

Au cas oĂč le changement serait raisonnable, pourrait-il faire partie de Julia v1.0 ?

linear algebra

Commentaire le plus utile

Cela devrait-il ĂȘtre fermĂ© puisque #27401 est fusionnĂ© maintenant ?

Tous les 146 commentaires

Pourriez-vous expliquer un peu plus votre cas d'utilisation et pourquoi l'avoir dans Base au lieu de simplement le définir dans votre package est avantageux ? Un exemple concret serait le mieux. Vous attendez-vous à plusieurs définitions inner dans des packages chargés simultanément ?

Je pense qu'avoir une interface formelle pour ces espaces mathĂ©matiques aidera les utilisateurs Ă  mieux exploiter le systĂšme de typage. Par exemple, je m'attendrais Ă  ce que les mĂ©thodes de clustering fonctionnent sur n'importe quel espace mĂ©trique. Si je pouvais dĂ©finir mon type avec un produit intĂ©rieur, je bĂ©nĂ©ficierais de Clustering.jl prĂȘt Ă  l'emploi (aprĂšs que le paquet soit corrigĂ© en consĂ©quence). De nombreux autres algorithmes basĂ©s sur la distance ou sur la projection pourraient Ă©galement ĂȘtre gĂ©nĂ©ralisĂ©s.

Comme exemple concret, je suis tombé sur cette limitation aujourd'hui en essayant de définir une géométrie pour les données de composition : https://github.com/juliohm/CoDa.jl Je préfÚre me spécialiser sur une fonction inner bien connue défini dans Base que de définir ma propre interface dont personne d'autre ne sera au courant.

Pourquoi ne pas Ă©tendre dot pour vos types d'espace Hilbert ? Je suis Ă  peu prĂšs sĂ»r qu'il est conçu pour ĂȘtre le produit intĂ©rieur gĂ©nĂ©rique Ă  l'esprit.

Le concept de produit scalaire est plus strict que le concept de produit scalaire. Alors que ce dernier est dĂ©fini pour des espaces gĂ©nĂ©raux, un produit scalaire n'est dĂ©fini que lorsqu'il y a la notion d'un systĂšme de coordonnĂ©es dĂ©fini par une base finie. La sĂ©mantique de dot(x,y) est x'*y oĂč x et y reprĂ©sentent les coordonnĂ©es des objets dans un monde cartĂ©sien. Les manuels mathĂ©matiques mentionneront rarement le terme produit scalaire car les auteurs sont gĂ©nĂ©ralement intĂ©ressĂ©s Ă  traiter le matĂ©riel dans des espaces plus gĂ©nĂ©raux (pas nĂ©cessairement finis ni euclidiens).

Pour distinguer davantage, dans un espace de Hilbert avec un produit intĂ©rieur <x,y> (ou inner(x,y) ) les objets peuvent ĂȘtre infinis et la sĂ©mantique x'*y ne s'applique pas. Par exemple, dans l'analyse de donnĂ©es fonctionnelles, les objets sont les fonctions f et g et le produit interne est gĂ©nĂ©ralement obtenu par intĂ©gration numĂ©rique : inner(f,g) = quadrature(f*g) . Appeler cette opĂ©ration un produit scalaire est trompeur.

Un autre exemple, comme je l'ai soulignĂ© dans mon package CoDa.jl , concerne les donnĂ©es de composition. Les objets de composition se trouvent dans un monde simplex pour lequel l'opĂ©ration x'*y n'a aucun sens. Cependant, il existe une transformation isomĂ©trique (la transformation log-ratio) que l'on peut utiliser pour mapper des compositions dans une autre gĂ©omĂ©trie oĂč l'on peut ensuite appliquer le produit scalaire avec des coordonnĂ©es. Travailler avec des coordonnĂ©es n'est pas nĂ©cessaire, mais c'est une pratique courante dans ce domaine. Le rĂ©sultat peut ĂȘtre retransformĂ© dans l'espace d'origine oĂč les objets existent.

Je ne vois pas d'avantage à maintenir le terme dot dans le langage, mais si l'on demande une rétrocompatibilité, la généralisation inner(x::AbstractVector, y::AbstractVector) = dot(x,y) fonctionne parfaitement.

Pouvez-vous préciser les objections à ce changement ?

Pouvez-vous préciser les objections à ce changement ?

Nous avons gĂ©nĂ©ralement besoin d'une bonne quantitĂ© de justification pour ajouter de nouvelles fonctions publiques Ă  Base, c'est l'objection. Cela pourrait ĂȘtre fourni par un package InnerProducts . Pourquoi doit-il ĂȘtre intĂ©grĂ© au langage lui-mĂȘme ? C'Ă©tait la premiĂšre question que @andreasnoack a posĂ©e ci-dessus - elle a reçu une rĂ©ponse quelque peu vague de "Je pense qu'avoir une interface formelle pour ces espaces mathĂ©matiques aidera les utilisateurs Ă  mieux exploiter le systĂšme de type". Il n'y a aucune raison pour qu'une interface dĂ©finie dans un package soit moins formelle qu'une dans Base. Qu'est-ce que le fait d'avoir Base.inner offre que InnerProducts.inner n'offre pas ? C'est une vraie question qui pourrait avoir une rĂ©ponse convaincante, mais je ne sais pas quelle pourrait ĂȘtre cette rĂ©ponse, c'est pourquoi la question est posĂ©e.

Je ne vois pas de bon argument pour dĂ©finir un concept mathĂ©matique de base comme les produits internes ailleurs qui ne sont pas dans Base. Un langage dont le public principal est l'informatique scientifique bĂ©nĂ©ficierait d'une terminologie correcte. Pourquoi le concept de norm est dĂ©fini dans Base.LinAlg et inner , qui appartient Ă  la mĂȘme cohorte, devrait ĂȘtre dĂ©fini dans un package ? Outre cette incohĂ©rence, le langage a dĂ©jĂ  dot , ce qui me fait me demander pourquoi il devrait avoir quelque chose d'aussi spĂ©cifique plutĂŽt qu'un concept plus gĂ©nĂ©ral ?

Donc, vous voulez tous les concepts mathématiques possibles dans le langage de base ? Ne pas avoir quelque chose de défini dans Base n'oblige pas les gens à utiliser la mauvaise terminologie. La fonction norm est exportée depuis LinAlg car elle est définie et utilisée dans LinAlg . Similaire pour dot . Proposez-vous que dot soit renommé inner ?

Donc, vous voulez tous les concepts mathématiques possibles dans le langage de base ?

Je n'ai jamais dit cela.

Ne pas avoir quelque chose de défini dans Base n'oblige pas les gens à utiliser la mauvaise terminologie.

Je suis sĂ»r que non. Promouvoir la mauvaise terminologie est le problĂšme. Les personnes venant d'un milieu moins mathĂ©matique adopteront l'utilisation du point parce qu'elles le voient dans Base. L'utilisation du terme produit « scalaire » pour reprĂ©senter le concept de produit intĂ©rieur est incorrecte. C'est Ă©galement prĂ©judiciable Ă  la communautĂ© mathĂ©matique, qui lutte de temps en temps pour rĂ©parer ces cicatrices laissĂ©es par une mauvaise terminologie. Les Ă©tudiants de ma gĂ©nĂ©ration doivent constamment se rĂ©fĂ©rer Ă  de vieux livres pour obtenir la bonne terminologie, cela ne devrait pas ĂȘtre le cas.

Proposez-vous que le point soit renommé en intérieur

Ce serait déjà une amélioration majeure à mon avis. Voir tous les exemples que j'ai donnés ci-dessus sur les données fonctionnelles et compositionnelles. Les gens de ces communautés n'utiliseraient jamais le terme dot dans leur travail. "point" ressemble plus à un terme informatique qu'autre chose.

Renommer dot en inner est une proposition assez différente de l'ajout de inner à Base en plus de dot . C'est plus une question de « terminologie correcte », que vous et d'autres personnes de linalg devrez résoudre, bien que je me souvienne que nous avons fait un bikeshed une fois et avons conclu que dot était le nom correct pour ce que cette fonction implémente.

Renommer le point en intérieur est une proposition assez différente de l'ajout d'inner à Base en plus du point.

C'est ce que j'ai proposé dans mon premier message dans ce fil :

J'aimerais proposer de renommer le point en intĂ©rieur, ou peut-ĂȘtre de demander aux utilisateurs de dĂ©finir intĂ©rieur(x,y) comme un produit interne gĂ©nĂ©ral entre les objets x et y

Je répÚte que le produit scalaire est le terme incorrect pour l'opération dont je parle ici. Produit intérieur, extérieur, scalaire... ce sont des objets mathématiques. "produit scalaire" est un objet de calcul : il obtient deux séquences de nombres et effectue x1*y1 + x2*y2 + ... xn*yn , une opération inutile dans d'autres espaces mathématiques.

Je m'Ă©tais concentrĂ© sur la deuxiĂšme option que vous avez proposĂ©e, qui semble avoir ajoutĂ© Base.inner avec une solution de repli pour appeler Base.dot . L'une ou l'autre option est possible, mais les deux nĂ©cessitent une justification : pour ajouter une nouvelle opĂ©ration, il faut une raison pour laquelle elle ne peut pas simplement ĂȘtre dans un package (ce dont parlait la premiĂšre partie de cette discussion) ; pour renommer, il faut dĂ©cider que dot n'est pas le bon nom et inner est le bon (vers quoi la conversation semble s'ĂȘtre tournĂ©e).

@juliohm Il vaut probablement la peine de (rĂ©)affirmer qu'il existe actuellement un effort actif pour rĂ©duire Base et encourager l'utilisation de packages. Dans ce cas, dot semble ĂȘtre correct pour tous les types participant Ă  l'algĂšbre linĂ©aire fournis dans Julia standard (c'est-Ă -dire Number et Array - donc oui, il existe un certain, connu , base finie dans tous les cas - je ne pense donc pas que nous nous soyons trompĂ©s de terminologie, bien qu'il puisse y avoir de meilleurs choix). Je ne suis pas contre cette proposition - mais je voulais le signaler pour clarifier pourquoi vous pourriez rencontrer une certaine rĂ©sistance "latente" au changement.

Il convient Ă©galement de garder Ă  l'esprit qu'un bon nombre de nouveaux arrivants de Julia peuvent ĂȘtre familiers avec un produit scalaire mais pas avec un produit interne (par exemple, ils ont fait un peu de physique Ă  l'universitĂ©, mais ne sont pas des majors en mathĂ©matiques), il y a donc aussi quelques raisons de gardez dot (sans oublier que nous avons un opĂ©rateur infixe auquel il correspond - nous pourrions simplement le mapper Ă  inner je suppose, mais c'est un peu moins Ă©vident). Nous n'avons pas non plus de fonction outer , ni une variĂ©tĂ© d'autres opĂ©rations possibles.

Ainsi, il est difficile de dĂ©montrer de maniĂšre raisonnable en quoi mettre this dans Base (ou LinAlg ) est strictement mieux que de le mettre dans un package utilisateur. La principale raison semble ĂȘtre de fournir une interface qui peut ĂȘtre partagĂ©e et Ă©tendue par d'autres - est-ce un rĂ©sumĂ© raisonnable ? L'argument consistant Ă  laisser le code gĂ©nĂ©rique de Clustering.jl fonctionner avec votre produit interne semble assez convaincant. De plus, dans le contexte oĂč nous semblons diviser LinAlg dans un package stdlib - je pensais que si je devais crĂ©er un package appelĂ© LinearAlgebra , je serais probablement heureux d'inclure un inner fonction que d'autres peuvent Ă©tendre.

Merci @andyferris d'avoir partagĂ© vos pensĂ©es. Je vois trĂšs clairement la rĂ©sistance, ce qui ne me passionne pas beaucoup. NĂ©anmoins, je suis curieux de savoir comment cette proposition spĂ©cifique conduit Ă  une augmentation du code ? Pour moi, cela ressemble Ă  un changement trivial de code avec une amĂ©lioration majeure de l'abstraction. L'exemple avec Clustering.jl n'est qu'un parmi tant d'autres, pensez Ă  n'importe quelle mĂ©thode basĂ©e sur le noyau qui peut ĂȘtre conçue pour fonctionner avec des types Julia arbitraires pour lesquels la notion de produit interne existe. MultivariateStats.jl en a beaucoup.

En ce qui concerne le commentaire sur LinAlg divisĂ© en un package sĂ©parĂ©, je suis d'accord que cela semble ĂȘtre un bon endroit pour encapsuler des produits mathĂ©matiques. Je suppose que ce paquet LinearAlgebra du futur serait importĂ© dans une session Julia par dĂ©faut et donc tous les utilisateurs auraient accĂšs au concept de inner , outer , etc. tout de suite.

Oui, les bibliothÚques standard sont toutes construites avec l'image systÚme Julia et disponibles par défaut. Au moins pour la série v1.x, personne n'aura besoin de taper using LinAlg (je ne pense pas qu'il sera renommé LinearAlgbebra , d'ailleurs, je viens de l'inventer comme un concurrent hypothétique) .

Pour clarifier, il serait chargé avec Julia standard afin que vous n'ayez rien à installer, mais vous devriez toujours écrire using LinAlg pour obtenir les noms qu'il exporte.

C'est là que ça devient bizarre, n'est-ce pas, puisque nous aurons les méthodes * et ainsi de suite sans using LinAlg ? (en d'autres termes, LinAlg est un pirate de type).

Oui, c'est essentiellement là que nous devrons tracer la ligne : Base doit définir autant de fonctionnalités d'algÚbre linéaire que nécessaire pour que LinAlg ne soit pas un pirate, donc matmul est défini dans Base car Array et * les deux le sont. Les types de matrice funky et les opérations non basiques y vivent cependant.

Permettez-moi de vous donner un exemple concret et de vous demander comment le rĂ©soudriez-vous avec l'interface actuelle, peut-ĂȘtre que cela peut clarifier les choses pour moi.

L'objectif est d'effectuer une analyse factorielle avec des données de composition. J'ai un type appelé Composition et un produit interne dans l'espace des compositions. Je collecte de nombreux échantillons (par exemple des échantillons de roche) et je les mets tous dans un gros Vector{Composition} (par exemple, composition = %eau, %grain, %air). Maintenant, je veux appeler un algorithme d'analyse factorielle implémenté dans un autre package (par exemple MultivariateStats.jl) sur ce vecteur de données. Comment implémenteriez-vous cela de maniÚre générique sans avoir un produit inner importé par défaut ?

Ce que j'ai compris des derniers commentaires, c'est que MultivariateStats.jl et CoDa.jl devraient dĂ©pendre de LinAlg.jl. La dĂ©pendance dans MultivariateStats.jl consiste simplement Ă  apporter le nom inner dans la portĂ©e. La dĂ©pendance dans CoDa.jl consiste Ă  dĂ©finir une mĂ©thode pour inner qui peut ĂȘtre appelĂ©e par MultivariateStats.jl. Est-ce ce que vous suggĂ©rez?

Il semble Composition{D} soit un espace vectoriel dimensionnel D sous + et * .

Je serais bien tenté de définir l'espace vectoriel dual.

Ainsi, vous pouvez définir adjoint(::Composition) -> DualComposition et *(::DualComposition, ::Composition) -> scalar (actuellement inner ). DualComposition n'aurait pas à faire grand-chose à part tenir un Composition à l'intérieur.

La premiĂšre phrase de https://en.wikipedia.org/wiki/Dot_product semble suggĂ©rer que dot pourrait ĂȘtre une opĂ©ration sur deux itĂ©rables. Nous pourrions le rendre rĂ©cursif et le dĂ©finir pour Number , et dĂ©finir inner comme la fonction d'algĂšbre linĂ©aire abstraite, qui se chevauche pour Number et AbstractArray .

Merci @andyferris , j'apprécie vos réflexions sur le double espace. Je préfÚre cependant ne pas compter sur un nouveau type pour cette tùche. La solution finale est inutilement complexe.

Ce que je veux comprendre, c'est pourquoi quelque chose comme:

inner(x,y) = sum(x.*y)
norm(x) = sqrt(inner(x,x))

export inner, norm

pas les bienvenus Ă  Base ? Je suppose que c'est tout ce qui est nĂ©cessaire pour dĂ©finir les noms de fonction de maniĂšre gĂ©nĂ©rique pour que les utilisateurs du langage se spĂ©cialisent. Gardez Ă  l'esprit que je pose ces questions avec le vĂ©ritable intĂ©rĂȘt de comprendre le point de vue des dĂ©veloppeurs principaux. Je tiens Ă  le dire avant que la conversation ne s'engage Ă  nouveau dans la mauvaise direction.

Du point de vue de quelqu'un qui s'intĂ©resse aux mathĂ©matiques en gĂ©nĂ©ral, il ne semble pas naturel que ces concepts ne soient pas exportĂ©s par dĂ©faut et qu'ils soient dĂ©finis Ă  l'intĂ©rieur de LinAlg . Je pense Ă  LinAlg comme des implĂ©mentations de ces concepts de haut niveau pour les types de tableaux. Peut-ĂȘtre que tout mon travail ne nĂ©cessite pas d'algĂšbre linĂ©aire sur les tableaux, mais je pourrais toujours bĂ©nĂ©ficier du concept de produit interne Ă  travers les packages (par exemple, MultivariateStats.jl, Clustering.jl). De plus, je ne souhaite peut-ĂȘtre pas avoir LinAlg comme dĂ©pendance dans mon package, car ce n'est pas le cas.

Si je peux insister davantage, il y a le concept de produit intĂ©rieur, qui est indĂ©pendant des tableaux. Ce concept est reprĂ©sentĂ© par l'instruction export inner dans Base. Il y a l' implĂ©mentation de produits internes pour les objets de type tableau reprĂ©sentant les coordonnĂ©es inner(x,y) = sum(x.*y) . Cette opĂ©ration peut ĂȘtre dĂ©finie comme une mĂ©thode de secours dans Base comme ci-dessus, si nĂ©cessaire.

Un autre exemple de cas d'utilisation est celui des méthodes de Krylov. Si vous avez par exemple des espaces fonctionnels avec des produits internes, vous pouvez utiliser les méthodes de Krylov pour approximer un problÚme linéaire ou un problÚme propre dans un petit sous-espace de dimension finie de cet espace fonctionnel de dimension infinie.

J'ai aussi mes propres objets qui forment un espace vectoriel/Hilbert mais ne font pas partie de <: AbstractArray . D'aprĂšs l'analogie qui montre Ă©galement que les tableaux de rang N>1 forment des espaces vectoriels et peuvent ĂȘtre utilisĂ©s comme "vecteurs" dans les mĂ©thodes de Krylov, j'en suis venu Ă  m'appuyer sur l'utilisation vecdot et vecnorm Ă©tant la notion gĂ©nĂ©ralisĂ©e de produit interne et de norme. J'ai donc dĂ©veloppĂ© un package avec des mĂ©thodes Krylov qui utilise des fonctions comme opĂ©rateurs linĂ©aires et oĂč les 'vecteurs' peuvent ĂȘtre de n'importe quel type, Ă  condition que les objets de ce type prennent en charge vecdot , vecnorm et quelques d'autres choses ( scale! , zero , ...). Mais peut-ĂȘtre que cela abuse de ce que signifiaient ces concepts dans Base, il serait donc bon de redresser l'interface correcte ici.

À droite - vecdot pourrait ĂȘtre renommĂ© inner .

(Maintenant, je me demande vaguement si norm devrait en fait ĂȘtre appelĂ© matrixnorm pour les matrices avec norm correspondant toujours inner . Il semble qu'il y ait peut-ĂȘtre deux distincts il se passe des choses avec norm ce qui cause quelques difficultĂ©s Ă  le gĂ©nĂ©raliser)

En fait, pour les objets gĂ©nĂ©raux de type vectoriel, il est Ă©galement utile d'interroger la dimension de l'espace vectoriel (par exemple, pour vĂ©rifier que la dimension de Krylov ne doit pas ĂȘtre supĂ©rieure Ă  la dimension de l'espace complet dans mon exemple de cas d'utilisation). L'exemple des tableaux imbriquĂ©s montre que length n'est pas le bon concept ici, c'est-Ă -dire qu'il faudrait une notion rĂ©cursive de longueur pour ces cas.

Maintenant, pour l'exemple d'utilisation de tableaux imbriquĂ©s comme vecteur gĂ©nĂ©ral, vecdot et vecnorm ne sont mĂȘme pas dans certains cas la notion correcte de produit interne et de norme, comme indiquĂ© dans #25093, c'est-Ă -dire qu'ils sont n'appelant pas rĂ©cursivement vecdot et vecnorm . Mon interprĂ©tation de ces fonctions en tant que produit interne gĂ©nĂ©rique et fonction de norme est ce qui a dĂ©clenchĂ© # 25093, mais il semble que ce ne soit peut-ĂȘtre pas ainsi que ces fonctions Ă©taient destinĂ©es (je ne sais pas ce qu'elles Ă©taient censĂ©es faire Ă  la place).

Je suis donc d'accord sur le fait que nous avons besoin d'une interface cohérente ici à utiliser sur tous les packages, qui appartiendrait donc à un emplacement central (probablement pas dans Base mais certainement dans une bibliothÚque standard, par exemple de telle sorte que l'on doive faire using VectorSpaces ). Quant au nommage, je vois deux options :

Option 1 (mon interprétation jusqu'à présent):
le prĂ©fixe vec indique la propriĂ©tĂ© de cet objet lorsqu'il est interprĂ©tĂ© comme un vecteur gĂ©nĂ©rique, d'oĂč

  • vecdot et vecnorm pour les tableaux imbriquĂ©s sont corrigĂ©s (PR #25093)
  • une nouvelle dĂ©finition veclength est ajoutĂ©e

Option 2 (probablement meilleure) : utilisez des noms plus mathématiquement corrects

  • inner
  • dimension
  • Mais que faire de norm ?

Et enfin, envoyez un ping Ă  @stevengj car il aura certainement des commentaires utiles ; mes excuses si cela est gĂȘnant.

Le nom est la partie la moins intĂ©ressante de tout cela. Je n'ai aucun problĂšme avec l'utilisation de la fonction dot pour faire rĂ©fĂ©rence Ă  un produit intĂ©rieur gĂ©nĂ©ral pour des espaces de Hilbert arbitraires. Non seulement il n'y a pas d'autre signification raisonnable pour, par exemple, "produit scalaire de deux fonctions", mais il est assez courant de voir "produit scalaire de fonctions" dans un usage informel, en particulier dans les contextes pĂ©dagogiques oĂč l'on essaie de souligner l'analogie avec le vecteur de dimension finie les espaces.

@juliohm , inner(x,y) = sum(x.*y) n'est mĂȘme pas un produit interne en gĂ©nĂ©ral, donc ce serait une solution de repli assez terrible Ă  mettre dans la base.

Mais dot ne calcule dĂ©jĂ  pas le produit interne correct (en fait, il Ă©choue) pour divers objets de Base qui se comportent comme des vecteurs, par exemple des tableaux de rang N>1 ou des tableaux imbriquĂ©s (les vecteurs imbriquĂ©s Ă©tant le seul cas oĂč il fonctionne correctement). De plus, le nom gĂ©nĂ©rique norm devient ambigu pour les matrices, car je suis d'accord avec le choix actuel d'avoir ce retour la norme induite, mais parfois la "norme vectorielle" (norme de Frobenius) est Ă©galement requise.

Par consĂ©quent, ma proposition la moins impactante serait de laisser tomber la sĂ©mantique vecnorm(x) = norm(vec(x)) et d'interprĂ©ter plutĂŽt vecnorm(x) comme "pour x Ă©tant un objet d'un type gĂ©nĂ©rique qui se comporte comme un espace vectoriel, calculez la norme vectorielle correspondante de x " (et similaire avec vecdot ). Bien qu'il s'agisse d'un changement d'interprĂ©tation (et donc de documentation), l'implĂ©mentation/l'action rĂ©elle pour les objets dans Base ne serait pas trĂšs diffĂ©rente (PR #25093) et produirait le mĂȘme rĂ©sultat dans la plupart des cas (rang N arrays de scalaires ou de vecteurs). Une fonction veclength(x) qui renvoie la dimension d'espace vectoriel correspondante de x complĂ©terait l'interface.

Les packages personnalisés doivent alors apprendre à implémenter ces fonctions lorsqu'ils définissent de nouveaux types qui se comportent comme des vecteurs.

il est assez courant de voir le "produit scalaire de fonctions" dans un usage informel, en particulier dans les contextes pĂ©dagogiques oĂč l'on essaie de souligner l'analogie avec les espaces vectoriels de dimension finie

S'il vous plaĂźt, ne dites pas que le nom n'est pas important, car il l'est. Je vais rĂ©pĂ©ter pour la Ă©niĂšme fois : produit scalaire et produit scalaire ne sont pas la mĂȘme chose. Tout matĂ©riel sĂ©rieux exposant un travail avec des espaces abstraits de Hilbert n'utilisera jamais de "point". Si vous prĂ©fĂ©rez faire confiance Ă  WikipĂ©dia plutĂŽt qu'Ă  mes propos, voici les dĂ©finitions copiĂ©es-collĂ©es :

Produit intérieur

En algÚbre linéaire, un espace de produit interne est un espace vectoriel avec une structure supplémentaire appelée produit interne. Cette structure supplémentaire associe chaque paire de vecteurs dans l'espace à une quantité scalaire appelée produit scalaire des vecteurs.

Produit scalaire

En mathématiques, le produit scalaire ou produit scalaire est une opération algébrique qui prend deux séquences de nombres de longueur égale (généralement des vecteurs de coordonnées) et renvoie un seul nombre.


Cette résistance à améliorer la terminologie et la cohérence mathématique dans la langue est démotivante. Peu importe le nombre de faits que je vous présente, peu importe le nombre d'exemples et de cas d'utilisation, il n'y a pas d'autre contre-argument que "je suis d'accord avec le point".

@juliohm , la terminologie est une question de convention, pas d'exactitude. Je conviens que dans l'usage formel des espaces de Hilbert, en particulier ceux de dimension infinie, le terme «produit interne» est utilisĂ© Ă  peu prĂšs exclusivement. Mais, comme je l'ai dit, si vous recherchez "fonctions de produit par points" sur Google, vous trouverez Ă©galement de nombreuses utilisations informelles de cette terminologie. Si vous dites "prenez un produit scalaire de deux Ă©lĂ©ments de cet espace de Hilbert", chaque mathĂ©maticien saura que vous faites rĂ©fĂ©rence Ă  un produit interne, mĂȘme pour des espaces de dimension infinie, il n'y a donc pas de rĂ©el danger de confusion, car il n'y a pas d'autre gĂ©nĂ©ralisation standard du terme "produit scalaire". C'est pourquoi je ne trouve pas que le dĂ©bat sur l'orthographe entre "point" et "intĂ©rieur" soit une question centrale.

Il est important de décider de la sémantique que l'on veut ici, et de l'ensemble des fonctions que les types doivent implémenter s'ils définissent un nouvel espace de Hilbert ou un espace de Banach. Actuellement, si vous souhaitez définir un type représentant un nouvel espace de Hilbert, vous devriez sans doute définir dot et norm (puisque nous manquons actuellement de solution de repli pour ce dernier), et je suppose que adjoint si vous voulez le mappage vers un objet à double espace.

Comme le dit @Jutho , tout cela est compliquĂ© par le cas du tableau de tableaux, car il y a plusieurs choses possibles que l'on pourrait vouloir lĂ -bas. Puisqu'il n'y a pas de noms standardisĂ©s pour toutes les sĂ©mantiques possibles, il est difficile de trouver des noms/sĂ©mantiques qui satisferont tout le monde. Voir le #25093 pour la discussion de la sĂ©mantique vecdot . Je n'ai pas de bonne rĂ©ponse ici, moi-mĂȘme.

Quelques possibilités ici

  1. Somme de x[i]' * y[i] . Actuellement, c'est dot(x,y) . Pas un produit interne pour les vecteurs de matrices (oĂč il donne une matrice), et actuellement pas dĂ©fini pour les tableaux multidimensionnels.
  2. Somme de dot(x[i], y[i]) , y compris pour les tableaux multidimensionnels, et conj(x)*y pour Number . Actuellement, c'est vecdot(x,y) .
  3. Certaines fonctions, par exemple inner(x,y) sont définies comme étant toujours un vrai produit interne, et pour les tableaux, faites-en la somme inner(x[i],y[i]) - essentiellement le "vecdot récursif" que @Jutho veut. Mais alors, pour les matrices A , ce produit scalaire est incompatible avec la norme induite norm(A) qui est notre définition actuelle norm . Pour résoudre ce problÚme, nous devrions modifier norm(A) pour que les matrices adoptent par défaut la norme de Frobenius, ce qui serait potentiellement un changement radical de grande envergure.

Une question (partiellement discutée dans # 25093) est de savoir si nous avons besoin de ces trois éléments dans Base, ou si nous pouvons nous en tirer avec deux (et lesquels deux, et comment les appelons-nous). La proposition de @ Jutho , si je comprends bien, consiste essentiellement à éliminer l'option 2 dans Base, puis à utiliser vecdot et vecnorm pour l'option 3. Nous avons alors un véritable produit interne, mais la terminologie est plutÎt unique à Julia, et un peu étrange pour, par exemple, les espaces de Hilbert de dimension infinie. Ce ne serait pas la fin du monde, bien sûr.

Une autre possibilité (quelque peu indépendante de ce que nous faisons avec vecdot ) serait de revenir à exiger que dot soit un véritable produit intérieur. c'est-à-dire éliminer le comportement 1 et rendre dot(x::AbstractVector, y::AbstractVector) égal à sum dot(x[i],y[i]) . Ne le définissez toujours pas pour les tableaux multidimensionnels (pour rester cohérent avec norm ).

Mon penchant personnel actuel serait de dĂ©finir dot comme un vĂ©ritable produit intĂ©rieur (qui devrait ĂȘtre cohĂ©rent avec norm ), en le changeant en somme de dot(x[i],y[i]) pour les vecteurs (c'est-Ă -dire en changeant le cas du vecteur de matrices), et en continuant Ă  ne pas le dĂ©finir pour les tableaux multidimensionnels. DĂ©finissez ensuite vecdot pour appeler rĂ©cursivement vecdot comme le suggĂšre @Jutho , avec un repli vecdot(x,y) = dot(x,y) . Enfin, disons que les nouveaux types "Hilbert-space" doivent dĂ©finir dot et norm . Cela me semble ĂȘtre le changement le moins perturbateur et le plus comprĂ©hensible.

(Un repli norm(x) = sqrt(real(dot(x,x))) est également une possibilité, bien qu'il soit quelque peu dangereux car il est vulnérable à un débordement intempestif. Notez que nous ne pouvons pas utiliser sqrt(dot(x,x)) comme repli pour des raisons techniques : nous voulons un résultat Real , pas un résultat Complex .)

Merci @stevengj pour cette réaction informative. Juste un petit commentaire :

avec un repli vecdot(x,y) = dot(x,y) . Enfin, disons que les nouveaux types "Hilbert-space" doivent définir dot et norm .

Il y a deux problĂšmes avec cela. vecdot(x,y) = dot(x,y) fallback ne peut pas exister, car vecdot accepte dĂ©jĂ  les arguments Any pour traiter les itĂ©rateurs gĂ©nĂ©raux. Le deuxiĂšme problĂšme est que, si dot et norm sont exposĂ©s comme Ă©tant le vĂ©ritable produit interne et la norme que tout vecteur comme le type d'utilisateur devrait dĂ©finir, alors mĂȘme lors de l'Ă©criture d'un package avec, par exemple, des mĂ©thodes Krylov qui devrait fonctionner avec des types de vecteurs complĂštement gĂ©nĂ©riques, cela ne fonctionnera toujours pas dans le cas oĂč l'utilisateur souhaite utiliser des tableaux imbriquĂ©s ou multidimensionnels comme objets de type vecteur. Par consĂ©quent, je dirais que vecdot et vecnorm sont le produit interne gĂ©nĂ©ral et la norme des objets de type vectoriel. Cela correspond Ă©galement bien au fait que pour les matrices, la plupart des gens s'attendront en effet Ă  ce que norm soit la norme induite de la matrice/de l'opĂ©rateur.

Comme pour un cas d'utilisation rĂ©el (pour montrer qu'il ne s'agit pas d'un cas exceptionnel). Les matrices stochastiques ont une valeur propre la plus grande (Perron-Frobenius) pour laquelle le vecteur propre correspondant reprĂ©sente une distribution de probabilitĂ© Ă  point fixe. Dans sa gĂ©nĂ©ralisation quantique, la distribution de probabilitĂ© se gĂ©nĂ©ralise Ă  une matrice dĂ©finie positive (la matrice de densitĂ©) et une telle matrice est le point fixe (vecteur propre correspondant Ă  la plus grande valeur propre) d'une carte complĂštement positive, c'est-Ă -dire la carte rho -> sum(A[i] rho A[i]^\dagger for i = 1:N) oĂč donc rho est la matrice de densitĂ© et A[i] est une matrice pour chaque i (connu sous le nom d'opĂ©rateurs de Kraus reprĂ©sentant la carte complĂštement positive). Pour les grandes dimensions de matrice, une mĂ©thode Arnoldi est idĂ©ale pour trouver la matrice de densitĂ© Ă  point fixe.

Mon inclination personnelle actuelle serait de dĂ©finir le point comme un vĂ©ritable produit interne (qui devrait ĂȘtre cohĂ©rent avec la norme), en le changeant en somme de point (x [i], y [i]) pour les vecteurs. Enfin, disons que les nouveaux types « d'espace de Hilbert » devraient dĂ©finir le point et la norme.

C'est déjà une énorme amélioration. Documenter dot pour avoir la sémantique inner dans Base permettra au moins aux utilisateurs de définir leurs propres espaces sans importer de bibliothÚques inutiles. Je ne suis pas satisfait de la dénomination, mais au moins la fonctionnalité serait disponible pour ceux qui en ont besoin.

Oui, je pense que ce sera bien d'avoir une interface documentée à implémenter pour les types "Hilbert-space".

Bien sĂ»r, en pensant Ă  cette interface gĂ©nĂ©rique pour les espaces vectoriels, si elle inclut norm comme suggĂ©rĂ© ci-dessus, cela devrait ĂȘtre la norme de Frobenius pour les matrices (et gĂ©nĂ©raliser pour les tableaux de plus grande dimension, puisque tous les tableaux sont des Ă©lĂ©ments d'un vecteur espacer). Dans ce cas, nous aurions besoin d'une fonction "norme d'opĂ©rateur" distincte pour les matrices ( matnorm ou opnorm ou quelque chose, ou un argument de mot-clĂ© sur norm ...).

@andyferris , veuillez noter mon dernier commentaire. norm et dot ne peuvent pas devenir l'interface spatiale gĂ©nĂ©rale de Hilbert, car ils ne fonctionnent mĂȘme pas sur des objets vectoriels dans Julia, tels que des tableaux de plus grande dimension et des tableaux imbriquĂ©s. Par consĂ©quent, vecdot et vecnorm sont un "meilleur" candidat (dans le sens de la moindre rupture) pour cela.

Relancer ce sujet, que je considÚre tout à fait pertinent pour le type de mathématiques que je compte faire avec la langue dans un avenir proche. Existe-t-il un consensus sur ce qui sera fait pour améliorer la généralité et la sémantique des produits internes ?

Voici la partie de mon ontologie mathématique personnelle concernant le produit.
Si cela pouvait aider à rafraßchir la mémoire / apporter un consensus

Bonus : pas de références wikipedia

À ce stade, la proposition de @Jutho dans # 25093 semble ĂȘtre le changement le moins perturbateur, mĂȘme si la terminologie vec* me semble un peu Ă©trange dans ce contexte.

Je suis d'accord que la terminologie vec* est étrange. C'est pourquoi renommer les fonctions pour qu'elles aient des noms standard serait bénéfique pour tous les utilisateurs.

Je suis Ă©galement d'accord que la terminologie vec* est Ă©trange.

Je suis d'accord, comme alternative à vecdot , nous pourrions introduire une nouvelle méthode inner , mais je ne connais pas de bon nom pour "remplacer" vecnorm . En fait, je ne trouve pas vecnorm si mauvais, la norme vectorielle est un terme bien établi et explicite pour l'opération que nous voulons.

Le problÚme de base ici concerne les matrices et les tableaux multidimensionnels, pour lesquels le norm(A) habituel ne correspond pas à un produit interne, ainsi qu'avec les tableaux de tableaux comme indiqué ci-dessus. Une désambiguïsation (par exemple vec* ou fro* ) est nécessaire dans ces cas pour indiquer quel produit intérieur est prévu.

Vous pourriez avoir une fonction inner dont la valeur par dĂ©faut est vecdot , mais c'est un peu idiot d'avoir deux noms pour la mĂȘme fonction, et il y a toujours le problĂšme de savoir comment appeler la norme.

Je trouve aussi le nom vecdot Ă©trange, en fait, je ne savais mĂȘme pas qu'il existait et j'avais crĂ©Ă© ma propre fonction pour cela... appelĂ©e inner .

Ma compréhension est que nous pouvons simplement déprécier l'étrange vecdot en faveur de inner , et lui donner la sémantique interne du produit pour que les utilisateurs implémentent leurs propres espaces.

Concernant les norm , ça je ne sais pas. J'ai ouvert ce sujet pour discuter des produits internes, peut-ĂȘtre qu'un autre sujet serait appropriĂ© pour discuter de l'Ă©tat des normes dans Base.

Je suppose que nous pourrions avoir inner(x,y) et innernorm(x) = sqrt(inner(x,x)) (avec des cas spéciaux optimisés pour éviter le débordement) au lieu de vecdot et vecnorm . innernorm est légÚrement inhabituel mais est raisonnablement clair dans son contexte.

Bravo pour ce changement. Les noms inner et innernorm sont clairs et cohérents avec les concepts. Je souhaite qu'ils puissent arriver à Julia v1.0.

inner et innernorm me semblent corrects.

Je dirais quand mĂȘme qu'Ă  mon avis, notre fonction norm ne s'intĂšgre pas trĂšs bien dans la fonction gĂ©nĂ©rique et le systĂšme de rĂ©partition de Julia et ce que j'appellerais des "interfaces claires" oĂč la rĂ©partition ne devrait pas faire des choix sĂ©mantiques, juste des choix d'implĂ©mentation. Personnellement, je prĂ©fĂ©rerais que nous puissions dire " norm renvoie la norme d'un Ă©lĂ©ment d'un espace vectoriel", oĂč les matrices et les opĂ©rateurs linĂ©aires sont toujours des Ă©lĂ©ments d'espaces vectoriels (vous pouvez les additionner et les multiplier par un scalaire) . Nous pourrions Ă©galement avoir par exemple " opnorm renvoie la norme d'opĂ©rateur d'un opĂ©rateur linĂ©aire" (ou matnorm ou autre).

Pour le moment nous avons " norm renvoie la norme d'un Ă©lĂ©ment d'un espace vectoriel, sauf si l'Ă©lĂ©ment est aussi un opĂ©rateur linĂ©aire, auquel cas nous vous donnerons la norme de l'opĂ©rateur Ă  la place". Je pense personnellement que la dĂ©pĂȘche ne devrait jamais ĂȘtre surprenante.

C'est-à-dire que je préférerais une fonction qui fait toujours la norme vectorielle et une autre fonction qui fait toujours la norme de l'opérateur, et aucune fonction qui essaie de faire les deux.

J'aime encore mieux @andyferris :+1: Des normes spĂ©cifiques qui ne sont pas les normes induites par le produit intĂ©rieur dans l'espace pourraient avoir un nom plus spĂ©cifique. Le nom norm signifierait exactement norm(x) = sqrt(inner(x,x)) et pourrait ĂȘtre redĂ©fini selon les besoins pour les types d'utilisateurs.

Personnellement, je préférerais que nous puissions dire " norm renvoie la norme d'un élément d'un espace vectoriel"

La fonction actuelle norm satisfait cette définition. Pour les matrices, il calcule la norme induite (opérateur), qui est une norme parfaitement valide pour un espace vectoriel . (Les espaces vectoriels n'ont pas du tout besoin d'avoir des produits internes ou des normes.)

Vous pouvez ĂȘtre quelque peu confus quant Ă  la dĂ©finition d'une "norme" si vous pensez que la norme de l'opĂ©rateur n'est pas une "norme d'un espace vectoriel".

C'est aussi une distinction utile entre norm et innernorm . Si vous définissez norm , je dirais que cela implique seulement que vous avez un espace de Banach (ou au moins un espace vectoriel normé). Si vous définissez innernorm , cela implique que vous avez un espace de Hilbert (ou au moins un espace de produit intérieur) et que cette norme est cohérente avec inner .

Par exemple, l'intégration numérique adaptative (ala quadgk) est quelque chose qui ne nécessite qu'un espace vectoriel normé, pas un espace de produit interne.

Bien sĂ»r, dĂ©solĂ©, j'ai peut-ĂȘtre Ă©tĂ© un peu trop imprĂ©cis avec mon langage. Il existe Ă©videmment de nombreuses normes valides pour un espace vectoriel, y compris diverses normes d'opĂ©rateurs.

Je suppose que ce que je veux dire, c'est que je prĂ©fĂ©rerais peut-ĂȘtre que le choix de la norme soit plus explicite qu'implicite ? Et que si vous utilisez la mĂȘme fonction (sans par exemple des arguments de mots clĂ©s supplĂ©mentaires), vous obtenez la "mĂȘme" norme, auquel cas l'Euclidean semble ĂȘtre un choix quelque peu dĂ©fendable pour AbstractArray .

C'est aussi une distinction utile entre norm et innernorm . Si vous définissez la norme, je dirais que cela implique seulement que vous avez un espace de Banach (ou au moins un espace vectoriel normé). Si vous définissez innernorm , cela implique que vous avez un espace de Hilbert (ou au moins un espace de produit interne) et que cette norme est cohérente avec inner .

Cela semble raisonnable, mais je me demande toujours pourquoi si un objet a un innernorm , il aurait besoin d'un autre norm ? Je proposerais alternativement que l' interface pour l'espace Banach nĂ©cessite norm tandis qu'une interface pour les espaces de produits internes fournirait Ă  la fois norm et inner . Ces fonctions peuvent ensuite ĂȘtre utilisĂ©es dans du code gĂ©nĂ©rique qui attend des objets de Banach ou des espaces de produit interne, selon le cas (EDIT : en pensant que le code qui fonctionne dans les espaces de Banach fonctionnera automatiquement Ă©galement sur les espaces de produit interne).

Je pense que vous proposez que norm(x) se rĂ©fĂšre toujours Ă  une sorte de norme euclidienne Ă©lĂ©ment par Ă©lĂ©ment (c'est-Ă -dire une norme Frobenius pour les matrices), c'est-Ă -dire fondamentalement ce que vecnorm est maintenant modulo le cas rĂ©cursif. Dans ce cas, nous pourrions tout aussi bien redĂ©finir dot(x,y) comme Ă©tant le produit intĂ©rieur correspondant ( inner fonctionne aussi, mais dot a l'avantage d'une variante infixe x ⋅ y ).

Je suis d'accord avec cela en principe, mais ce serait un changement radical et il pourrait ĂȘtre un peu tard avant 0,7 pour l'intĂ©grer


Est-ce que L2 est aussi un bon défaut en haute dimension ?
Cet article parle de distance, mais peut-ĂȘtre concerne-t-il aussi la norme
https://stats.stackexchange.com/questions/99171/why-is-euclidean-distance-not-a-good-metric-in-high-dimensions

Dans ce cas, nous pourrions tout aussi bien redĂ©finir dot(x,y) comme Ă©tant le produit scalaire correspondant (inner fonctionne aussi, mais dot a l'avantage d'une variante infixe x ⋅ y)

Pouvons-nous nous dĂ©barrasser entiĂšrement de dot ? La notation infixe ne doit pas ĂȘtre liĂ©e Ă  l'existence d'une fonction appelĂ©e dot . DĂ©finissez simplement l'infixe avec la mĂ©thode inner pour les tableaux Julia. Est-ce possible?

C'est vraiment ce que c'est, le produit scalaire : une notation pratique x ⋅ y pour les produits internes entre les vecteurs x et y dans R^n avec la gĂ©omĂ©trie euclidienne.

@stevengj Je pense que c'est un bon résumé, oui.

@o314 L2 est-il un bon dĂ©faut en haute dimensionnalité ? Peut-ĂȘtre pas, mais je dĂ©testerais vraiment ça si, par exemple, la norme choisie par norm(v::AbstractVector) dĂ©pendait de length(v) :) Je n'aimerais pas non plus qu'il devine si ma matrice ou un tableau de dimension supĂ©rieure est "trop ​​grand pour L2" - je suggĂ©rerais que cela devrait peut-ĂȘtre ĂȘtre explicitement marquĂ© par l'utilisateur ?

@juliohm C'est tout Ă  fait possible, mĂȘme si, comme mentionnĂ©, ce sont des changements de rupture que nous suggĂ©rons. (Encore une fois, modulo ce qu'il faut faire dans le cas rĂ©cursif et les discussions prĂ©cĂ©dentes sur les diffĂ©rences possibles entre inner et dot ).

@stevengj , mon interprĂ©tation de ce que @andyferris impliquait est que, Ă  cause du typage de canard, il est difficile de dĂ©cider si un utilisateur veut interprĂ©ter un objet comme un vecteur (et utiliser un vecteur correspondant p -norm) ou en tant qu'opĂ©rateur (et calculer une p -norme induite). Je pense donc qu'il n'y a pas d'autre choix que de spĂ©cifier explicitement quel comportement est recherchĂ©. L'approche actuelle est un peu Ă©trange dans le sens oĂč norm essaie de deviner implicitement s'il faut choisir la norme vectorielle ou la norme induite en fonction de l'entrĂ©e, et vecnorm est un moyen de spĂ©cifier explicitement que vous voulez la norme vectorielle (c'est aussi pourquoi je ne trouve pas vecnorm un si mauvais nom). Un changement plus radical serait de faire en sorte que norm toujours par dĂ©faut la norme vectorielle, et de spĂ©cifier explicitement quand vous voulez la norme induite, en utilisant un argument (mot-clĂ©) ou une fonction complĂštement diffĂ©rente.

D'un autre cÎté, cela ne me dérange pas non plus le nom innernorm , qui est explicite en ce qu'il s'agit d'une norme basée sur un produit interne (c'est-à-dire toujours p=2 dans le cas euclidien). J'ai du mal à juger si pour les objets personnalisés (vec)norm devrait prendre en charge un argument optionnel p dans le cadre de l'interface, puisque dans certains de mes cas d'utilisation, seulement p=2 est facile à calculer.

C'est vraiment ce que c'est, le produit scalaire : une notation pratique x ⋅ y pour les produits internes entre les vecteurs x et y dans R^n avec la gĂ©omĂ©trie euclidienne.

Je suis d'accord avec cela, dans le sens oĂč je ne me souviens pas avoir jamais vu la notation x ⋅ y dans le contexte d'espaces vectoriels gĂ©nĂ©raux (par exemple complexes). Je pense que seule la notation mathĂ©matique (x,y) ou la notation de Dirac < x | y > est utilisĂ©e dans de tels cas. En Ă©lectromagnĂ©tisme, on utilise souvent E ⋅ B pour les vecteurs dans l'espace euclidien tridimensionnel, et mĂȘme si l'on utilise une notation complexe (c'est-Ă -dire des phaseurs), cela n'implique pas de conjugaison complexe. Si nĂ©cessaire, la conjugaison complexe est notĂ©e explicitement dans de tels cas. Donc, cela ne me dĂ©rangerait pas si dot devenait simplement sum(x_i * y_i) sans conjugaison complexe ou hermitienne, et que inner devenait le produit interne correct pour les espaces de produits internes gĂ©nĂ©raux. Malheureusement, cela ne peut probablement pas ĂȘtre fait en un seul cycle de publication.

L2 est-il un bon dĂ©faut en haute dimensionnalitĂ© ? Peut-ĂȘtre pas, mais je dĂ©testerais vraiment ça si, par exemple, la norme choisie par norm(v::AbstractVector) dĂ©pendait de length(v) :) Je n'aimerais pas non plus qu'il devine si ma matrice ou mon tableau de dimension supĂ©rieure est "trop ​​gros pour L2" - Je suggĂ©rerais que cela devrait peut-ĂȘtre ĂȘtre explicitement marquĂ© par l'utilisateur ?

Je travaille dans le monde du BIM oĂč l'on gĂšre du 2d et du 3d, mais aussi du 4d, du 5d, du 6d voire du 7d. Nous n'allons jamais plus loin. A tout moment nous savons dans quelles dimensions nous travaillons, et quel algo est impliquĂ©. C'est largement suffisant.

Je ne peux pas exprimer le pov des gens qui travaillent dans le ML, la recherche d'information etc. LĂ , peut ĂȘtre norminf c'est mieux. Ce qui est important dans mon point de vue, c'est la possibilitĂ© de deviner et la stabilitĂ©. Je ne serais pas du tout choquĂ© si les gens de ML avaient besoin de diffĂ©rents paramĂštres par dĂ©faut pour leurs affaires. S'il n'y a pas de confusion. Par exemple. il est dĂ©cidĂ© explicitement et statiquement au moment de la compilation. C'est mĂȘme du luxe s'il reste stable et consistant lors de l'application d'algos.

Inspiré de array:similar Pas entiÚrement implémenté et testez-le.

norm2 = x -> x |> inner |> sqrt
norminf = ...
NMAX = 10
for N in 1:NMAX
    <strong i="13">@eval</strong> begin norm(a::Array{T,N}) where {T} = norm2 end
end
norm(a::Array{T,n}) where {T} = norminf

Pouvons-nous nous dĂ©barrasser entiĂšrement du point ? La notation infixe ne doit pas ĂȘtre liĂ©e Ă  l'existence d'une fonction appelĂ©e point. DĂ©finissez simplement l'infixe avec la mĂ©thode interne pour les tableaux Julia. Est-ce possible?

norm(x::AbstractVector, p::Real=2) = vecnorm(x, p) # https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/generic.jl#L498
vecdot(x::Number, y::Number) = conj(x) * y # https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/generic.jl#L657
dot(x::Number, y::Number) = vecdot(x, y) # https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/generic.jl#L659
function dot(x::AbstractVector, y::AbstractVector) # https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/generic.jl#L677

# Call optimized BLAS methods for vectors of numbers
dot(x::AbstractVector{<:Number}, y::AbstractVector{<:Number}) = vecdot(x, y) # https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/generic.jl#L698

Point / vecdot implique d'utiliser le conjuguĂ© et de dĂ©cider quand aller Ă  BLAS. cela doit ĂȘtre gĂ©rĂ© quelque part. Mais cela devrait ĂȘtre gĂ©rable dans un seul espace de noms.

L2 est-il un bon dĂ©faut en haute dimensionnalitĂ© ? Peut-ĂȘtre pas

L2 est également la norme la plus courante pour les espaces de dimension infinie (par exemple les fonctions). Je pense que c'est une valeur par défaut raisonnable à attendre pour tout espace vectoriel.

De toute Ă©vidence, vous souhaitez Ă©galement disposer d'autres normes. Si nous redĂ©finissons norm(x) pour qu'il soit Ă©lĂ©ment par Ă©lĂ©ment L2 dans la mesure du possible, alors norm(x, p) serait Ă©lĂ©ment par Ă©lĂ©ment Lₚ, et nous aurions besoin d'une autre fonction (par exemple opnorm ) pour le induit/ correspondant normes de l'opĂ©rateur.

Je suis d'accord avec cela, dans le sens oĂč je ne me souviens pas avoir jamais vu la notation x ⋅ y dans le contexte d'espaces vectoriels gĂ©nĂ©raux (par exemple complexes).

J'ai donnĂ© plusieurs citations dans un autre fil, IIRC (par exemple, BLAS utilise dot pour un produit scalaire complexe, et vous pouvez trouver des sources pĂ©dagogiques mĂȘme en utilisant le terme pour les produits internes des fonctions). Le terme mĂȘme de "produit interne" est gĂ©nĂ©ralement introduit comme "une gĂ©nĂ©ralisation d'un produit scalaire". Je ne pense pas que quiconque sera trop surpris par la notation de dot pour un produit interne euclidien, et il est pratique d'avoir un opĂ©rateur infixe.

Nous pourrions garder dot tel quel et introduire inner , bien sĂ»r, mais je pense que cela crĂ©erait une dichotomie dĂ©routante — dans les cas les plus courants, les fonctions seraient Ă©quivalentes, mais dans des cas impairs (par exemple, des tableaux de matrices), ils seraient diffĂ©rents.

Mais encore une fois, il est peut-ĂȘtre un peu tard pour les changements de rupture, nous devrons donc peut-ĂȘtre recourir Ă  innernorm et inner . Dans tous les cas, quelqu'un aurait besoin de crĂ©er un PR dĂšs que possible.

Si une mesure raisonnable de consensus se forme, je pourrai peut-ĂȘtre consacrer une certaine bande passante Ă  l'exploration de la mise en Ɠuvre sur une Ă©chelle de temps pertinente (courte), changements de rupture potentiels inclus. J'apprĂ©cie la volontĂ© de clarifier la sĂ©mantique de ces opĂ©rations et de leur donner des noms explicites. Meilleur!

Je vois deux options principales :

  • Incassable, ajoute une fonctionnalitĂ© : inner(x,y) et innernorm(x) . Remplace vecdot et vecnorm , et rĂ©cursif pour les tableaux de tableaux.

  • Rupture : changez norm(x,p=2) pour qu'il soit toujours Ă©lĂ©ment par Ă©lĂ©ment et rĂ©cursif, en remplaçant vecnorm , et introduisez une nouvelle fonction opnorm pour l'opĂ©rateur/norme induite. Faites dot(x,y) le produit scalaire Ă©lĂ©ment par Ă©lĂ©ment correspondant, en remplaçant vecdot . (Alternative : renommer en inner , mais c'est bien d'avoir un opĂ©rateur infixe, et c'est ennuyeux d'avoir Ă  la fois dot et inner .)

Si je concevais des choses Ă  partir de zĂ©ro, je prĂ©fĂ©rerais 2, mais cela pourrait ĂȘtre trop perturbateur pour changer silencieusement la signification de norm .

Une option intermĂ©diaire serait de dĂ©finir inner et innernorm (dĂ©prĂ©ciant vecdot et vecnorm ), et de dĂ©prĂ©cier norm(matrix) en opnorm . Puis, en 1.0, rĂ©introduisez norm(matrix) = innernorm(matrix) . De cette façon, les gens peuvent Ă©ventuellement utiliser simplement inner et norm , et nous laissons dot comme la bĂȘte Ă©trange actuelle pour les vecteurs de tableaux (coĂŻncidant avec inner pour les vecteurs de nombres).

Une bizarrerie à propos innernorm est que vous voulez un moyen de spécifier les normes L1 ou Linf "élément par élément", mais aucune de celles-ci ne correspond à un produit interne, donc innernorm(x,p) est un peu impropre.

J'aime votre option intermédiaire.

Comme indiqué ci-dessus, j'aime le nom innernorm(x) car il implique p=2 et il ne devrait pas y avoir de deuxiÚme argument . J'ai des objets pour lesquels je ne sais que calculer la norme du produit interne. Mais avec l'actuel (vec)norm , il n'est pas clair pour moi si l'argument p fait partie de l'interface de base supposée, et donc je ne sais pas s'il faut omettre le deuxiÚme argument ou prendre en charge mais vérifie explicitement p != 2 et génÚre une erreur.

Mais je vois le problÚme de ne pas avoir de moyen non obsolÚte de faire vecnorm(matrix, p!=2) pendant l'étape intermédiaire de votre proposition.

J'aime aussi l'option intermédiaire - nous voulons vraiment passer par un cycle approprié de dépréciation des normes plutÎt que de faire un changement immédiat. (En tant qu'utilisateur, les changements de rupture me font peur, mais je vois que la correction des obsolescences dans mon code pour la v1.0 est comme un investissement dans un code propre et clair pour l'avenir).

Aurions-nous réellement besoin innernorm ou pourrions-nous simplement utiliser vecnorm pour l'instant (et déprécier vecnorm au profit de norm plus tard) ?

En fait, je ne vois aucun tollĂ© potentiel en remplaçant simplement dot par inner ... Je pense aussi qu'il est assez clair que le produit interne est censĂ© ĂȘtre une gĂ©nĂ©ralisation des produits scalaires.

Les changements pourraient ĂȘtre mis en Ɠuvre dans deux PR distincts :

  1. Remplacez dot par inner et donnez-lui le sens général. Facultativement, faites pointer la notation infixe \cdot vers l'intérieur entre les tableaux Julia.
  2. Plus de cycles de discussion et de dépréciation autour des variantes de normes et de la terminologie.

Je crois comprendre que PR 1 pourrait ĂȘtre fusionnĂ© avant Julia v1.0. Il ne casse pas.

Remplacer dot par inner serait toujours en panne car dot n'est actuellement pas un vĂ©ritable produit interne pour les tableaux de tableaux - vous modifieriez donc le sens, pas seulement le renommage. Je suis pour changer le sens d'ĂȘtre un vrai produit intĂ©rieur, mais si vous changez le sens (en le dĂ©finissant comme le vrai produit intĂ©rieur), je ne vois pas le problĂšme de continuer Ă  l'Ă©peler comme dot .

Ainsi, nous pourrions faire ce qui suit en 0.7 :

  1. Déprécier norm(matrix) à opnorm(matrix) et norm(vector of vectors) à vecnorm .
  2. Déprécier dot([vector of arrays], [vector of arrays]) pour un appel à sum .
  3. Dites que vecdot(x,y) et vecnorm(x, p=2) sont des produits/normes intérieurs euclidiens (pour p=2 ), et rendez-les récursifs (ce qui est légÚrement cassant, mais en pratique probablement pas un gros problÚme) .

Puis, en 1.0 :

  1. Déprécier vecnorm à norm et vecdot à dot . (Vous ne savez pas si cela est autorisé par les rÚgles de la version 1.0, @StefanKarpinski ?)

(Notez que la fonction numpy.inner , Ă©tonnamment, n'est pas toujours un produit interne. Mais la terminologie de NumPy sur inner et dot est bizarre depuis un moment.)

Les raisons pour lesquelles je préfÚre continuer à l'épeler comme dot :

  • C'est bien d'avoir une orthographe infixe.
  • Pour les non-mathĂ©maticiens opĂ©rant sur des espaces vectoriels ordinaires de dimension finie, dot est un nom plus familier pour le produit scalaire euclidien. (Les mathĂ©maticiens s'adapteront facilement Ă  l'utilisation du nom dot pour la fonction de produit interne sur des espaces de Hilbert arbitraires - "produit scalaire" n'a pas d'autre signification possible pour de tels espaces.)
  • Avoir Ă  la fois inner et dot serait dĂ©routant, car ils coĂŻncideraient dans certains cas mais peut-ĂȘtre pas dans d'autres (si nous gardons la signification actuelle dot ).
  • En dehors de l'algĂšbre linĂ©aire, inner a beaucoup d'autres significations potentielles en informatique, et il est donc quelque peu ennuyeux d'exporter ce nom depuis Base.

Pouvez-vous préciser votre opposition au nom intérieur ? je ne comprends toujours pas
c'est pourquoi vous préférez aller à l'encontre d'une terminologie que tout le monde sur ce fil semble
ĂȘtre d'accord?

Le mar. 15 mai 2018, 05:13 Steven G. Johnson [email protected]
a Ă©crit:

(Notez que le numpy.inner
https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.inner.html
la fonction, étonnamment, n'est pas toujours un produit intérieur.)

—
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, consultez-le sur GitHub
https://github.com/JuliaLang/julia/issues/25565#issuecomment-389144575 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ADMLbdcpeWo7M4prYz76NoqUPIkfVPP3ks5tysZlgaJpZM4ReGXu
.

Aucune des raisons ne m'impose :

>

  • C'est bien d'avoir une variante infixe.

Oui, et la notation infixe peut toujours exister quel que soit le changement de nom
intérieur comme expliqué ci-dessus.

>

  • Pour les non-mathĂ©maticiens opĂ©rant sur la dimension finie ordinaire
    espaces vectoriels, le point est un nom plus familier pour l'intérieur euclidien
    produit. (Les mathématiciens s'adapteront facilement à l'utilisation du point de nom pour
    la fonction de produit interne sur des espaces de Hilbert arbitraires - "produit scalaire" n'a pas
    autre signification possible pour de tels espaces.)

Cet argument n'est pas bon : enseignons aux gens ordinaires le mal
terminologie parce qu'ils sont paresseux et ne peuvent pas apprendre un nouveau mot approprié,
et forcer les mathématiciens à utiliser la mauvaise terminologie contre leur gré.

>

  • Avoir Ă  la fois intĂ©rieur et point serait dĂ©routant, car ils
    coĂŻncident dans certains cas mais peut-ĂȘtre pas dans d'autres (si nous gardons le point actuel
    signification).

Nous n'avons pas besoin des deux, débarrassez-vous du nom moins général, qui, nous en convenons, est
point Ă  ce stade.

>

  • En dehors de l'algĂšbre linĂ©aire, inner a beaucoup d'autres potentiels
    significations en informatique, et il est donc quelque peu ennuyeux de
    exporter ce nom depuis Base.

En dehors de l'algÚbre linéaire, je peux trouver de nombreuses utilisations pour le point. Encore plus pour le
notation infixe par points signifiant des choses complÚtement différentes.

>

Je reposte le dernier post de @juliohm avec une mise en forme fixe.


Aucune des raisons ne m'impose :

C'est bien d'avoir une variante infixe.

Oui, et la notation infixe peut toujours exister quel que soit le changement de nom en interne comme expliqué ci-dessus.

Pour les non-mathématiciens opérant sur des espaces vectoriels de dimension finie ordinaires, le point est un nom plus familier pour le produit interne euclidien. (Les mathématiciens s'adapteront facilement à l'utilisation du nom point pour la fonction de produit interne sur des espaces de Hilbert arbitraires - "produit scalaire" n'a pas d'autre signification possible pour de tels espaces.)

Cet argument n'est pas bon : enseignons aux gens ordinaires la mauvaise terminologie parce qu'ils sont paresseux et ne peuvent pas apprendre un nouveau mot approprié, et forçons les mathématiciens à utiliser la mauvaise terminologie contre leur gré.

Avoir Ă  la fois intĂ©rieur et point serait dĂ©routant, car ils coĂŻncideraient dans certains cas mais peut-ĂȘtre pas dans d'autres (si nous gardons la signification actuelle du point).

Nous n'avons pas besoin des deux, débarrassez-vous du nom moins général, dont nous convenons qu'il s'agit d'un point à ce stade.

En dehors de l'algÚbre linéaire, inner a beaucoup d'autres significations potentielles en informatique, et il est donc quelque peu ennuyeux d'exporter ce nom depuis Base.

En dehors de l'algÚbre linéaire, je peux trouver de nombreuses utilisations pour le point. Encore plus pour la notation infixe par points signifiant des choses complÚtement différentes.

Oui, et la notation infixe peut toujours exister quel que soit le changement de nom en interne comme expliqué ci-dessus.

Vous pouvez certainement dĂ©finir const ⋅ = inner , mais votre terminologie est alors incohĂ©rente. Je pensais que vous n'aimiez pas utiliser le "produit scalaire" comme produit interne gĂ©nĂ©ral ?

forcer les mathématiciens à utiliser la mauvaise terminologie contre leur gré

Les mathĂ©maticiens savent que la terminologie n'est ni bonne ni mauvaise, elle est seulement conventionnelle ou non conventionnelle (et peut-ĂȘtre cohĂ©rente ou incohĂ©rente). (Et la plupart des gens ne se lancent pas dans les mathĂ©matiques parce qu'ils ont une passion pour l'orthographe prescriptive.) D'aprĂšs mon expĂ©rience, si vous dites aux mathĂ©maticiens qu'en mĂ©canique quantique, un vecteur s'appelle un "Ă©tat", l'adjoint s'appelle "poignard", et un double vecteur s'appelle un "soutien-gorge", ils sont sublimement insouciants. De mĂȘme, je ne pense pas qu'un mathĂ©maticien expĂ©rimentĂ© clignera des yeux plus d'une fois si vous lui dites que dans Julia, un produit intĂ©rieur s'Ă©crit dot(x,y) ou x ⋅ y , d'autant plus que les termes sont dĂ©jĂ  compris comme Ă©tant synonymes dans de nombreux contextes. (Je doute que vous trouviez un mathĂ©maticien qui ne sache pas instantanĂ©ment que vous faites rĂ©fĂ©rence Ă  un produit interne si vous dites "prenez le produit scalaire de deux fonctions dans cet espace fonctionnel".)

D'un autre cÎté, pour les personnes qui ne sont pas des mathématiciens formés et qui n'ont pas été exposées à des espaces abstraits de produits internes (c'est-à-dire la majorité des utilisateurs), mon expérience est que la terminologie inconnue est plus un obstacle. "Comment puis-je prendre un produit scalaire de deux vecteurs dans Julia?" deviendra une FAQ.

Il n'y a vraiment aucune difficulté mathématique ici à résoudre en dehors du choix de la sémantique. La question d'orthographe est purement une question de commodité et d'usage.

En dehors de l'algÚbre linéaire, je peux trouver de nombreuses utilisations pour le point. Encore plus pour la notation infixe par points signifiant des choses complÚtement différentes.

Sauf que Julia et de nombreux autres langages de programmation ont eu dot pendant des années et cela n'a pas été un problÚme. inner serait une nouvelle casse.

En fin de compte, l'orthographe de cette fonction (ou de toute autre) est une question mineure par rapport à la sémantique et au chemin de dépréciation, mais je pense que l'équilibre penche en faveur de dot .

Vous pouvez certainement dĂ©finir const ⋅ = inner, mais alors votre terminologie est incohĂ©rente. Je pensais que vous n'aimiez pas utiliser le "produit scalaire" comme produit interne gĂ©nĂ©ral ?

Je pense que tu ne comprends toujours pas. Il n'y a aucune incohérence à appeler point un produit scalaire. C'est un produit intérieur, trÚs spécifique et inutile pour beaucoup d'entre nous. Rien de plus que sum(x.*y) .

Si le terme dot se retrouve dans Julia ayant la sémantique de inner , ce sera un désastre historique dont je peux vous garantir que beaucoup se sentiront agacés. Je peux prévoir des professeurs dans une salle de classe expliquant des choses comme : "Vous savez, nous allons maintenant définir le produit interne de notre espace, mais dans Julia, quelqu'un (@stevengj) a décidé de l'appeler point."

Je m'assurerai de capturer ce fil pour référence future si cela finit par se produire.

Vous ĂȘtes le seul @stevengj Ă  insister sur la terminologie dot , personne d'autre ne s'y est opposĂ©. Ce serait bien si vous pouviez reconsidĂ©rer ce fait avant de prendre une dĂ©cision.

C'est un produit intérieur, trÚs spécifique et inutile pour beaucoup d'entre nous. Rien de plus que sum(x.*y).

Si vous pensez que "produit scalaire" ne peut faire rĂ©fĂ©rence qu'au produit intĂ©rieur euclidien dans ℝⁿ, alors vous ne devriez pas dĂ©finir const ⋅ = inner , vous ne devriez dĂ©finir que ⋅(x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) = inner(x,y) .

Vous ne pouvez pas jouer dans les deux sens : soit inner peut utiliser ⋅ comme synonyme infixe (auquel cas l'opĂ©rateur infixe est Ă  la fois "faux" dans votre langage et la dĂ©nomination est incohĂ©rente) ou il n'a pas de synonyme infixe (sauf dans un cas particulier).

Je peux prévoir des professeurs dans une salle de classe expliquant des choses comme : "Vous savez, nous allons maintenant définir le produit interne de notre espace, mais dans Julia, quelqu'un (@stevengj) a décidé de l'appeler point."

Ha ha, je suis prĂȘt Ă  prendre la chaleur de ce professeur outragĂ© imaginaire. SĂ©rieusement, vous devez regarder autour de vous si vous pensez que le terme "produit scalaire" n'est jamais utilisĂ© que dans ℝⁿ, ou que les mathĂ©maticiens sont scandalisĂ©s si le terme est utilisĂ© dans d'autres espaces de Hilbert.

ce sera une catastrophe historique

SĂ©rieusement?

Cette discussion semble s'éroder au-delà de ce que l'on pourrait considérer comme un environnement accueillant, civil et constructif . Les opinions et les antécédents diffÚrent, mais veuillez vous abstenir de faire des attaques personnelles ou de blùmer qui que ce soit et supposez que toutes les parties débattent de leur point de vue de bonne foi.

Je peux prévoir des professeurs dans une salle de classe expliquant des choses comme : "Vous savez, nous allons maintenant définir le produit interne de notre espace, mais dans Julia, quelqu'un (@stevengj) a décidé de l'appeler point."

Il peut Ă©galement ĂȘtre utile de noter ici que Steven _est_ professeur. :clin d'Ɠil:

Je suis Ă©galement sur le point de supprimer dot en faveur de inner . Le terme dot est assez largement utilisĂ©, et ne pas avoir la fonction dans Julia, alors qu'elle est en Python et MATLAB serait surprenant. Cependant, j'aime aussi le terme inner , Ă©tant donnĂ© qu'il est plus appropriĂ© pour les espaces vectoriels non ℝⁿ, et en particulier les matrices.

Incidemment, pendant que je testais ce que les méthodes faisaient dans Julia, j'ai remarqué que dot ne fonctionne que sur de vrais vecteurs/matrices. Est-ce intentionnel ?

Avoir Ă  la fois intĂ©rieur et point serait dĂ©routant, car ils coĂŻncideraient dans certains cas mais peut-ĂȘtre pas dans d'autres (si nous gardons la signification actuelle du point).

@stevengj Serait-il complĂštement ridicule de remplacer vecdot par inner , et de conserver Ă©galement dot ? À l'heure actuelle, ce problĂšme exact que vous dĂ©crivez existe dĂ©jĂ , juste avec vecdot au lieu de inner .

OK... j'ai hùte, quelles sont les suggestions en direct ? Sont-ils :

  • Adoptez dot comme produit interne gĂ©nĂ©rique pour un plus large Ă©ventail de types. C'est dĂ©jĂ  correctement rĂ©cursif sur les vecteurs de vecteurs, mais nous le ferions fonctionner sur les matrices, etc. ( @jebej Je ne pense pas qu'avoir Ă  la fois dot et inner soit si utile, et comme Steven dit, nous utilisons au moins familiĂšrement dot pour signifier produit interne assez souvent, et ce n'est pas incorrect - c'est juste de la terminologie).
  • Envisagez de rendre norm un peu plus cohĂ©rent avec les dot ci-dessus et sur tous les AbstractArray , en introduisant Ă©ventuellement par exemple opnorm pour les normes d'opĂ©rateur (sur AbstractMatrix ) et ayant (en notation nouvelle Ă  ancienne) norm(matrix) == vecnorm(matrix) aprĂšs les dĂ©prĂ©ciations appropriĂ©es. À ce stade, nous n'avons peut-ĂȘtre plus besoin vecdot et vecnorm ?

Est-ce correct? Je pense que cela nous amĂšnerait au moins Ă  une histoire d'algĂšbre linĂ©aire relativement cohĂ©rente avec des interfaces "propres", oĂč le code gĂ©nĂ©rique peut utiliser dot et norm comme une paire fiable pour travailler avec des espaces de produits internes indĂ©pendant du genre.

@andyferris , oui, je pense que si nous apportons ce changement, nous n'avons besoin que dot et norm (qui sont maintenant les opérations euclidiennes récursives sur des tableaux ou des tableaux de tableaux de n'importe quelle dimensionnalité, bien que pour la norme, nous définissons également norm(x,p) comme étant la norme p) et opnorm , et n'avons plus vecdot ou vecnorm .

Notez que le passage Ă  dot est un changement de rupture car dot n'est actuellement pas un vĂ©ritable produit interne pour les vecteurs de matrices (#22392), ce qui a Ă©tĂ© longtemps dĂ©battu dans #22220 ( Ă  quel point l'Ă©limination vecdot n'Ă©tait pas considĂ©rĂ©e comme IIRC). Cependant, cela a Ă©tĂ© introduit dans la version 0.7, donc cela ne casse aucun code rĂ©ellement publiĂ©. En fait, dot en 0.6 est dĂ©jĂ  le produit scalaire euclidien sur les tableaux Ă  dimensionnalitĂ© arbitraire, un peu par accident (#22374). Le changement suggĂ©rĂ© ici restaurerait et Ă©tendrait ce comportement 0.6 et changerait norm pour ĂȘtre cohĂ©rent avec lui.

Une question est de savoir si norm(x,p) appellerait norm(x[i]) ou norm(x[i],p) rĂ©cursivement. Les deux sont des comportements potentiellement utiles. Je penche pour le premier parce qu'il est plus gĂ©nĂ©ral - x[i] peut ĂȘtre un espace vectoriel normĂ© arbitraire qui ne dĂ©finit que norm mais pas la norme p. Appeler norm maniĂšre rĂ©cursive est Ă©galement ce que vecnorm fait maintenant, donc c'est cohĂ©rent avec la dĂ©prĂ©ciation vecnorm Ă  norm .

@jebej , dot sur master et 0.6 fonctionne pour moi sur des tableaux complexes : dot([3im],[4im]) renvoie correctement 12+0im , par exemple.

Un autre bon point Ă  propos de changer norm(matrix) pour ĂȘtre la norme Frobenius est que c'est beaucoup moins cher. Il est courant d'utiliser simplement norm(A-B) pour avoir une idĂ©e de l'importance de la diffĂ©rence entre deux matrices, mais sans trop se soucier du choix spĂ©cifique de la norme, mais de nombreux utilisateurs ne se rendront pas compte que la valeur par dĂ©faut actuelle norm(matrix) nous oblige Ă  calculer la SVD.

Merveilleux de voir un consensus se former autour de plusieurs points majeurs ! :) (À moins que quelqu'un ne me devance (veuillez le faire si vous avez de la bande passante !) ou qu'une balise alpha apparaisse auparavant, je donnerai une chance Ă  la mise en Ɠuvre des points de consensus actuels aprĂšs l'expĂ©dition # 26997.) Meilleur !

Un autre lien pour référence future : https://math.stackexchange.com/a/476742

Pour illustrer la mauvaise dénomination qui est adoptée ici consciemment , et la mauvaise décision imposée par un seul esprit. Les produits scalaires et internes ont des propriétés mathématiques différentes. Vous forcez toute une communauté contre ce qui est bien connu dans la littérature mathématique.

Et pour les futurs lecteurs, qu'aurait-il fallu faire à la place si nous avions eu une décision collective :

# make dot what it is, a NOTATION
⋅(x::AbstractVector, y::AbstractVector) = sum(x[i]*y[i] for i in indices(x))

# replace the name dot by the more general inner
inner(x, y) = # anything

Je suppose que nous serons simplement les premiĂšres personnes dans l' univers Ă  employer le terme "produit scalaire" pour un produit intĂ©rieur sur autre chose que ℝⁿ. C'est une bonne chose que j'ai pu imposer ma volontĂ© Ă  ce fil (principalement en faisant chanter les autres dĂ©veloppeurs) pour forcer cette innovation dans le monde ! Le produit scalaire ne sera plus relĂ©guĂ© Ă  une simple "notation": il s'agira plutĂŽt d'un symbole qui signifie un produit interne (comme chacun devrait le savoir, attribuer des significations aux symboles est le contraire de la "notation").

TrÚs bonne prise de décision :clap: c'était définitivement un consensus. Lisez les commentaires ci-dessus et vous verrez comment tout le monde était d'accord. :+1:

Ou peut-ĂȘtre devrais-je citer quelques commentaires afin qu'il soit trĂšs clair en quoi il s'agissait d'un consensus :

>

Droit - vecdot pourrait ĂȘtre renommĂ© inner

par @andyferris

Option 2 (probablement meilleure) : utilisez des noms plus mathématiquement corrects

intérieur
dimension
Mais que faire de la norme ?

par @Jutho

Je suis d'accord, comme alternative à vecdot, nous pourrions introduire une nouvelle méthode interne

par @Jutho

Je trouve aussi le nom de vecdot Ă©trange, en fait, je ne savais mĂȘme pas qu'il existait et j'avais crĂ©Ă© ma propre fonction pour cela... appelĂ©e inner.

par @jebej

Et beaucoup plus...

Les gens peuvent débattre avec véhémence les uns avec les autres et soulever de nombreux points de désaccord, mais arrivent toujours à un consensus (mais pas toujours à l'unanimité) en étant persuadés et en équilibrant le pour/le contre. (Je suis d'accord qu'il y a des avantages et des inconvénients de chaque option ici.) Je suis désolé que le résultat qui semble (provisoirement !) Se gélifier ici ne soit pas le résultat que vous avez préféré, mais je ne sais pas comment vous pensez J'ai « imposé » ma volonté.

(Pas qu'une dĂ©cision finale ait Ă©tĂ© prise, bien sĂ»r - il n'y a mĂȘme pas encore de relations publiques, et encore moins quelque chose de fusionnĂ©.)

Je souhaite seulement que nous puissions prendre une dĂ©cision basĂ©e sur le public de la langue. Si quelqu'un choisit Julia comme outil, je suis sĂ»r que la personne a au moins entendu parler du terme produit inner . C'est un concept assez populaire et loin d'ĂȘtre exotique. Les choses exotiques incluent "l'homologie persistante", la "thĂ©orie quantique", qui sont moins rĂ©pandues, et je serais contre l'inclusion de ce type de terminologie.

AprÚs tout, je veux juste avoir un langage qui soit le meilleur langage pour le calcul scientifique, les mathématiques, etc.

@juliohm , tous les arguments ont été basés sur les besoins de qui nous pensons que le public est, et nous essayons tous de faire de Julia une langue aussi bonne que possible. Les personnes raisonnables peuvent arriver à des conclusions différentes sur la terminologie, puisque les mathématiques ne déterminent pas l'orthographe.

PremiĂšrement, comme mentionnĂ© ci-dessus, je peux certainement ĂȘtre d'accord avec la proposition actuelle de @stevengj et m'en tenir Ă  dot comme nom gĂ©nĂ©ral pour le produit interne. De plus, je n'aime pas la façon dont cette discussion se dĂ©roule et j'aimerais certainement ĂȘtre citĂ© correctement. @juliohm , la deuxiĂšme citation que vous m'attribuez n'est pas la mienne.

Cela Ă©tant dit, je voudrais mentionner ce qui suit comme matiĂšre Ă  rĂ©flexion dans l'examen des avantages et des inconvĂ©nients. Les Ă©lĂ©ments suivants sont principalement des inconvĂ©nients, mais je suis d'accord avec les avantages mentionnĂ©s par @stevengj. Il pourrait facilement y avoir des cas d'utilisation distincts pour avoir dot signifie simplement sum(x[i]*y[i] for i ...) . Dans les cas oĂč la notation infixe par points est la plus utilisĂ©e en mathĂ©matiques, c'est en effet typiquement le sens. En tant que produit interne, la notation infixe par points est gĂ©nĂ©ralement (mais certainement pas exclusivement) rĂ©servĂ©e aux espaces vectoriels rĂ©els. D'autres cas d'utilisation incluent l'activation de choses comme σ ⋅ n avec σ un vecteur de matrices de Pauli et n un vecteur de scalaires. C'Ă©tait l'une des motivations derriĂšre la façon dont dot est actuellement implĂ©mentĂ©, comme cela m'a Ă©tĂ© signalĂ© dans un autre fil. Le fait que BLAS ait dĂ©cidĂ© de n'utiliser que dot pour les vecteurs rĂ©els et de faire une distinction entre dotu et dotc pour les vecteurs complexes est un autre problĂšme Ă  considĂ©rer. Les personnes ayant des antĂ©cĂ©dents BLAS peuvent se demander si, ayant des vecteurs complexes, elles veulent calculer dot(conj(u),v) ou dot(u,v) alors qu'elles veulent le vrai produit interne (c'est-Ă -dire dotc ). De plus, ils pourraient chercher un moyen de faire dotu sans d'abord faire une copie conjuguĂ©e du vecteur en question.

@Jutho la citation est la vÎtre, votre commentaire complet est copié ci-dessous :

Je suis d'accord, comme alternative à vecdot, nous pourrions introduire une nouvelle méthode inner, mais je ne connais pas de bon nom pour "remplacer" vecnorm. En fait, je ne trouve pas vecnorm si mauvais, la norme vectorielle est un terme bien établi et explicite pour l'opération que nous voulons.

En tout cas, la citation est destinĂ©e Ă  montrer quel est le dĂ©sir de beaucoup ici (au moins comme une premiĂšre pensĂ©e naturelle) quand on rĂ©flĂ©chit Ă  ce sujet. Si vous avez changĂ© votre dĂ©sir au fil du temps, c'est une autre histoire. Moi-mĂȘme, je ne sortirais jamais le terme "point" de ma tĂȘte lors d'une modĂ©lisation avec des espaces de Hilbert. Cela semble anormal et incompatible avec ce que j'ai appris.

@Jutho : De plus, ils pourraient chercher un moyen de faire dotu sans d'abord faire une copie conjuguée du vecteur à portée de main.

La possibilitĂ© d'exporter une fonction dotu est apparue de temps en temps (voir par exemple #8300). Je suis d'accord que c'est parfois une fonction utile: un "produit interne" euclidien non conjuguĂ© (qui n'est plus vraiment un produit interne) qui est une forme symĂ©trique bilinĂ©aire (non sesquilinĂ©aire) dotu(x,y) == dotu(y,x) (non conjuguĂ©e) mĂȘme pour des espaces vectoriels complexes . Mais l'utilitĂ© de cette opĂ©ration ne se limite pas Ă  ℂⁿ - par exemple, ce type de produit apparaĂźt souvent dans des espaces vectoriels de dimension infinie (fonctions) pour les Ă©quations de Maxwell en raison de la rĂ©ciprocitĂ© (essentiellement: l'opĂ©rateur de Maxwell dans les matĂ©riaux typiques avec perte est analogue Ă  une «matrice Ă  symĂ©trie complexe» - symĂ©trique sous le «produit interne» non conjuguĂ©). Donc, si nous dĂ©finissons dot(x,y) comme Ă©tant le produit intĂ©rieur euclidien gĂ©nĂ©ral (avec le premier argument conjuguĂ©), il serait tout Ă  fait naturel de dĂ©finir une fonction dotu(x,y) pour le produit euclidien non conjuguĂ© sur n'importe quel espace vectoriel oĂč cela a du sens. Cependant, je ne vois pas la possibilitĂ© d'une fonction dotu comme argument contre dot . Dans la majoritĂ© des cas, lorsque vous travaillez avec des espaces vectoriels complexes, vous voulez le produit conjuguĂ©, c'est donc le bon comportement par dĂ©faut.

Mais je suis d'accord qu'une possibilitĂ© serait de dĂ©finir dot(x,y) = sum(x[i]'*y[i] for i = 1:length(x)) , qui est la façon dont il est actuellement dĂ©fini dans master (pas 0.6), et de dĂ©finir inner(x,y) comme le vrai produit scalaire. Ceci a l'avantage de fournir les deux fonctions, qui peuvent toutes deux ĂȘtre utiles dans certains cas. Cependant, nous avons alors deux fonctions qui coĂŻncident presque toujours Ă  l'exception des tableaux de matrices, et je soupçonne qu'il serait un peu dĂ©routant de dĂ©cider quand utiliser l'une ou l'autre. Beaucoup de gens Ă©criraient dot quand ils voulaient dire inner , et cela fonctionnerait bien pour eux dans la plupart des cas, mais leur code ferait alors quelque chose d'inattendu s'il passait un tableau de matrices. Je soupçonne que dans 99 % des cas, les gens veulent le vĂ©ritable produit interne, et la version "somme du produit" peut ĂȘtre laissĂ©e Ă  un package, si en effet elle est nĂ©cessaire (par opposition Ă  simplement appeler sum ).

@juliohm , j'ai mal lu votre message car je pensais que les noms Ă©taient au-dessus (au lieu d'en dessous) des citations respectives, donc je pensais que vous m'attribuiez la citation de @jebej . Mes excuses pour cela.

@stevengj , je ne pensais certainement pas avoir dot(x,y) = sum(x[i]'*y[i] for i = 1:length(x)) comme valeur par dĂ©faut raisonnable. Dans le cas comme σ ⋅ n , la conjugaison complexe/hermitienne du premier ou du deuxiĂšme argument n'est pas nĂ©cessaire. Donc, ce que je disais, c'est que, dans de nombreux cas (mais pas tous) oĂč la notation infixe par points est utilisĂ©e dans les formules scientifiques, sa signification coĂŻncide avec dotu , c'est-Ă -dire sum(x[i]*y[i] for i = 1:length(x)) sans conjugaison, soit comme produit interne sur des espaces vectoriels rĂ©els ou comme une construction plus gĂ©nĂ©rale.

Donc si je devais faire une proposition alternative (bien que je ne la préconise pas forcément), c'est d'avoir deux fonctions :

  • dot(x,y) = sum(x[i]*y[i] for i...) , qui est toujours le produit interne correct pour les vecteurs rĂ©els (ce qui est probablement le cas d'utilisation des personnes qui connaissent moins ou ne connaissent pas le terme produit interne) mais permet Ă©galement des constructions plus gĂ©nĂ©rales comme σ ⋅ n , et est donc la fonction correspondant Ă  la notation infixe

  • inner(x,y) Ă©tant le produit interne toujours valide, avec conjugaison et rĂ©cursivitĂ©, qui sera utilisĂ© par des personnes dans des contextes plus gĂ©nĂ©raux et techniques.

Je ne dĂ©fends pas cela comme un bon choix Ă  adopter dans la langue Julia, mais je pense que c'est ainsi qu'il est utilisĂ© dans une grande partie de la littĂ©rature. Lorsque le point infixe est utilisĂ©, c'est soit comme un produit interne dans le contexte de vecteurs rĂ©els, soit dans une construction plus gĂ©nĂ©rale oĂč cela signifie simplement une contraction. Lorsqu'un produit interne gĂ©nĂ©ral sur des espaces vectoriels arbitraires est prĂ©vu, la plupart de la littĂ©rature scientifique (mais vous avez certainement montrĂ© des contre-exemples) passe Ă  <u,v> ou <u|v> (oĂč dans la premiĂšre notation il y a encore une discussion qui des deux arguments est conjuguĂ©).

Je pourrais vivre avec cette proposition, mais je pourrais tout aussi bien vivre avec seulement dot comme produit interne général. Au final, il s'agit d'avoir une bonne documentation, et moi non plus je n'arrive pas à croire que quelqu'un trébucherait sur ce choix "design".

@Jutho , je suis d'accord qu'il n'est pas rare de définir dot pour signifier simplement contraction. Certes, on peut trouver des exemples dans les deux sens. Par exemple, dans les langages de programmation et les bibliothÚques populaires :

  • Non conjuguĂ© : Numpy dot (et, bizarrement, inner ), Mathematica's Dot , Maxima . , BLAS dotu

  • ConjuguĂ© : Matlab's dot , Fortran's DOT_PRODUCT , Maple's DotProduct , Petsc's VecDot , Numpy vdot , BLAS dotc (notez que le manque de la surcharge dans Fortran 77 rendait impossible d'appeler ce dot mĂȘme s'ils le voulaient), le point d'Eigen

D'une part, le produit interne conjugué est généralement introduit dans les manuels comme l' extension "naturelle" de la notion de "produit scalaire" aux vecteurs complexes - la version non conjuguée est en quelque sorte une extension "non naturelle", en ce sens qu'elle n'est généralement pas ce que tu veux. (Considérez le fait que, parmi les langages qui fournissent une fonction conjuguée dot dans leurs bibliothÚques standard - Matlab, Fortran, Julia, Maple - seul Maple fournit une variante non conjuguée, ce qui indique un manque de demande.) d'autre part, une fonction dotu non conjuguée est pratique (en complément) dans certains cas particuliers (dont certains que j'ai mentionnés ci-dessus).

Si nous avons à la fois dot et inner , je soupçonne que beaucoup de gens finiront par utiliser dot par accident alors qu'ils veulent vraiment inner pour que leur code soit générique. (Je parierais que inner de Numpy n'est pas conjugué à cause d'un tel accident - ils l'ont implémenté avec de vrais tableaux à l'esprit, et n'ont pas pensé au cas complexe jusqu'à ce qu'il soit trop tard pour changer alors ils ont ajouté le maladroitement nommé vdot .) Alors que si nous avons dot et (éventuellement) dotu , il sera plus clair que dot est le choix par défaut et dotu est la variante spéciale.

(Je suis d'accord que ⟹u,v⟩ , ⟹u|v⟩ ou (u,v) sont des notations plus courantes pour les produits internes sur des espaces de Hilbert arbitraires - ce sont ce que j'utilise gĂ©nĂ©ralement moi-mĂȘme - mais ces notations sont un non dĂ©marreur pour Julia. Il y a eu des discussions sur l'analyse des parenthĂšses Unicode en tant qu'appels de fonction/macro, par exemple # 8934 et # 8892, mais cela n'est jamais allĂ© nulle part et cela semble peu susceptible de changer bientĂŽt.)

Je suis entiĂšrement d'accord avec votre Ă©valuation @stevengj .

Moi aussi.

Je soupçonne qu'il est temps pour l'un de nous de jouer avec l'une ou l'autre des implémentations dans un PR et de voir comment cela se passe.

@Jutho J'ai toujours vu le produit scalaire avec les matrices de Pauli comme un raccourci pour une contraction sur des tenseurs d'ordre supérieur ... l'un des espaces vectoriels est réel, 3D.

Je suis d'accord que ⟹u,v⟩, ⟹u|v⟩ ou (u,v) sont des notations plus courantes pour les produits internes sur des espaces de Hilbert arbitraires - ce sont ce que j'utilise gĂ©nĂ©ralement moi-mĂȘme - mais ces notations sont un non-dĂ©marrage pour Julia.

Il serait en fait possible de faire fonctionner ⟹u,v⟩ .

@StefanKarpinski : Il serait en fait possible de faire fonctionner ⟹u,v⟩.

Absolument, et soutenir cette notation prĂ©cise a Ă©tĂ© suggĂ©rĂ©e dans #8934, mais elle n'est jamais allĂ©e nulle part. (Notez Ă©galement que les crochets angulaires ont d'autres utilisations courantes, par exemple ⟹u⟩ dĂ©signe souvent une moyenne quelconque.) Il est incassable et pourrait encore ĂȘtre ajoutĂ© Ă  un moment donnĂ©, mais il ne semble pas raisonnable de s'attendre dans un proche terme. Il est Ă©galement assez lent de taper \langle<tab> x, y \rangle<tab> , donc ce n'est pas trĂšs pratique du point de vue de la programmation pour une opĂ©ration Ă©lĂ©mentaire.

et nous ne pouvons pas surcharger <> pour cela, n'est-ce pas ?

Non

Je ne peux pas dire que j'ai lu tous les commentaires sur ce fil énorme, mais je veux juste souligner quelques points, dont certains ont déjà été faits :

  • La distinction entre le point et l'intĂ©rieur semble trop pĂ©dante. En effet Ă  mes oreilles cela semble un non sens car en français il n'y a qu'un seul terme - "produit scalaire" - et il est difficile de faire la diffĂ©rence entre des choses qui pour moi portent le mĂȘme nom ;-)
  • Lorsque vous venez de numpy et que vous travaillez avec des tableaux complexes, avoir dot conjuguĂ© par dĂ©faut est la meilleure chose qui soit. Pas de point de dĂ©cision ici, je voulais juste dire Ă  quel point je suis heureux de ne plus avoir Ă  faire ces conj(dot()) s !
  • Avoir deux fonctions qui ont le mĂȘme comportement dans la plupart des cas mais qui diffĂšrent parfois est une mauvaise conception, et a et causera de la confusion, avec du code qui devrait appeler l'une appelant en fait l'autre, simplement parce que l'utilisateur ne sait pas mieux. C'est particuliĂšrement ennuyeux avec norm : si vous codez un algorithme d'optimisation et que vous voulez vous arrĂȘter Ă  chaque fois que norm(delta x) < eps , vous allez Ă©crire norm . Mais ensuite, vous voulez optimiser une image ou quelque chose, vous exĂ©cutez votre code, et il se lance soudainement dans un SVD impossible Ă  tuer (parce que BLAS) d'un grand tableau. Ce n'est pas acadĂ©mique, cela a causĂ© des problĂšmes dans Optim.jl, et sans doute dans d'autres packages Ă©galement. Personne ne saura que vecnorm existe Ă  moins d'avoir une raison prĂ©cise de le rechercher.
  • Sur la base du point prĂ©cĂ©dent, toute solution qui fusionne dot et vecdot , et norm et vecnorm est bonne, mĂȘme si elle enlĂšve un peu de flexibilitĂ© dans cas de tableaux de tableaux. Pour les normes, j'ajouterais que souvent lorsque vous travaillez avec des Ă©lĂ©ments sur lesquels plusieurs normes sont dĂ©finies (par exemple, des matrices), ce que l'utilisateur veut, c'est appeler norm pour obtenir une norme, sans se soucier particuliĂšrement de laquelle. Les normes induites sont le plus souvent d'intĂ©rĂȘt thĂ©orique plutĂŽt que pratique en raison de leur caractĂšre intraitable par les calculs. Ils sont Ă©galement spĂ©cifiques Ă  l'interprĂ©tation du tableau 2D en tant qu'opĂ©rateur plutĂŽt qu'Ă  celle du tableau 2D en tant que stockage (une image est un tableau 2D, mais ce n'est pas un opĂ©rateur dans un sens utile). C'est bien d'avoir la possibilitĂ© de les calculer, mais ils ne mĂ©ritent pas d'ĂȘtre les norm par dĂ©faut. Des valeurs par dĂ©faut raisonnables, simples et bien documentĂ©es qui ont des alternatives dĂ©tectables valent mieux qu'une tentative d'intelligence (si l'utilisateur veut faire une chose intelligente, laissez-le le faire explicitement).

Par conséquent, +1 sur @stevengj 's

oui, je pense que si nous apportons ce changement, nous n'avons besoin que de point et de norme (qui sont maintenant les opérations euclidiennes récursives sur des tableaux ou des tableaux de tableaux de n'importe quelle dimensionnalité, bien que pour la norme nous définissions également la norme (x, p) comme étant la p-norm) et opnorm, et n'ont plus vecdot ou vecnorm.

Une alternative plus "julienne" Ă  norm/opnorm pourrait ĂȘtre d'avoir un type Operator, qui pourrait envelopper un tableau 2D, sur lequel norm fait opnorm. Cela peut se faire au niveau des packages (dont plusieurs existent dĂ©jĂ )

Je préfÚre de loin taper opnorm(matrix) plutÎt que norm(Operator(matrix)) 


Je vais intervenir de la galerie des cacahuĂštes ici et dire que j'aime oĂč cela se passe vecnorm et vecdot m'ont toujours dĂ©rangĂ©. Devoir demander explicitement la norme de l'opĂ©rateur - qui m'a toujours semblĂ© assez spĂ©cialisĂ© - semble beaucoup plus sain que de devoir demander une norme beaucoup plus rapide et plus facile Ă  calculer (par exemple la norme de Frobenius). Écrire opnorm semble ĂȘtre une bonne interface pour demander la norme d'opĂ©rateur relativement spĂ©cialisĂ©e.

Je pense Ă©galement qu'avoir une distinction subtile entre dot et inner est susceptible de conduire Ă  la confusion et Ă  une utilisation abusive gĂ©nĂ©ralisĂ©e. Faire la leçon aux utilisateurs sur la fonction qu'ils sont _supposĂ©s_ utiliser lorsque les deux fonctions font ce qu'ils veulent et que l'une d'elles est plus facile a tendance Ă  ne pas trĂšs bien fonctionner. Mon impression est qu'il est relativement rare dans le code gĂ©nĂ©rique que sum(x*y for (x,y) in zip(u,v)) soit en fait ce que vous voulez quand un vrai produit interne ⟹u,v⟩ existe rĂ©ellement. Quand c'est vraiment ce qu'on veut, c'est assez facile, clair et efficace (parce que Julia est ce que c'est) d'Ă©crire quelque chose comme ça pour le calculer.

Que ce soit pour appeler la fonction u⋅v dot ou inner semble ĂȘtre la partie la moins consĂ©quente de tout cela. Je suis Ă  peu prĂšs sĂ»r qu'aucun de ces choix ne serait considĂ©rĂ© comme un dĂ©sastre par les historiens - bien que l'idĂ©e que les historiens s'en soucient est certainement flatteuse. D'une part, si nous acceptons de conserver la signification du "vĂ©ritable produit interne" de u⋅v alors oui, inner est le terme mathĂ©matique le plus correct. D'autre part, lorsqu'il existe une syntaxe avec un nom de fonction correspondant, cela a tendance Ă  moins confondre les utilisateurs lorsque le nom correspond Ă  la syntaxe. Étant donnĂ© que la syntaxe ici utilise un point, cette rĂšgle empirique prend en charge l'orthographe de cette opĂ©ration sous la forme dot . Peut-ĂȘtre que cela pourrait ĂȘtre un cas raisonnable pour dĂ©finir const dot = inner et exporter les deux ? Ensuite, les gens peuvent utiliser ou Ă©tendre le nom qu'ils prĂ©fĂšrent puisqu'il s'agit de la mĂȘme chose. Si quelqu'un veut utiliser l'un ou l'autre nom pour quelque chose d'autre, il le peut, et l'autre nom restera disponible avec sa signification par dĂ©faut. Bien sĂ»r, cela ferait trois noms exportĂ©s pour la mĂȘme fonction — dot , inner et ⋅ — ce qui semble un peu excessif.

Est-il possible de supprimer le symbole ⋅ ou de le remplacer par <u,v> ?

Commentaires:

  • Cela rend l'intention claire. Comparez ces deux exemples :
<u,v> * M * x

vs.

u ⋅ v * M * x
  • La syntaxe <u,v> implique une association : nous opĂ©rons d'abord sur u et v , puis le reste de l'expression suit.

  • Si un utilisateur a fait l'effort de taper <u,v> , il est trĂšs peu probable qu'il ait en tĂȘte un simple sum(x[i]*y[i]) . Le symbole ⋅ est facile Ă  ignorer avec les yeux et a de nombreuses autres connotations. En particulier, en algĂšbre linĂ©aire, pour un espace vectoriel V sur un champ F, le produit d'un scalaire α ∈ F avec un vecteur v ∈ V est notĂ© α ⋅ v dans divers manuels.

  • La suppression ou le remplacement de ⋅ Ă©liminerait Ă©galement le problĂšme de l'exportation de plusieurs noms. Il faudrait seulement exporter inner et <,> pour les produits internes gĂ©nĂ©raux, avec l'implĂ©mentation par dĂ©faut pour les tableaux correspondant Ă  la sĂ©mantique de sommation itĂ©rable.

  • Si l'on a besoin de dĂ©finir un produit scalaire par vecteur comme dĂ©crit ci-dessus pour un espace vectoriel V sur un champ F, il/elle pourrait dĂ©finir la notation ⋅ pour cela. L'espace vectoriel serait alors entiĂšrement dĂ©fini avec une belle syntaxe courte et pourrait ĂȘtre Ă©tendu Ă  un espace de Hilbert en dĂ©finissant davantage <u,v> .

Nous ne pouvons dĂ©finitivement pas utiliser la syntaxe <u,v> ; la syntaxe que nous pourrions utiliser est ⟹u,v⟩ — notez les crochets Unicode, pas les signes infĂ©rieur Ă  et supĂ©rieur Ă , < et > . Nous avons Ă©galement u'v comme syntaxe pour quelque chose qui est soit un produit scalaire, soit un produit interne ? (je ne sais pas lequel...)

Oui, dĂ©solĂ©, la version unicode de celui-ci. Ce serait trĂšs clair Ă  lire. Cela rĂ©soudrait Ă©galement ce problĂšme avec plusieurs noms et libĂ©rerait ⋅ Ă  d'autres fins.

Je ne pense pas que nous voulions utiliser ⋅ Ă  d'autres fins, ce serait dĂ©routant.

Imaginez Ă  quel point ce serait merveilleux de pouvoir Ă©crire du code qui ressemble Ă  :

⟚α ⋅ u, v⟩ + ⟹ÎČ â‹… w, z⟩

pour les vecteurs abstraits (ou types) u,v,w,z ∈ V et les scalaires α, ÎČ âˆˆ F .

u'v est un produit interne (et un produit scalaire, si vous suivez la convention conjuguée) uniquement pour les tableaux 1d, pas pour les matrices, par exemple. (C'est une autre raison pour laquelle il est inutile de limiter le point infixe aux tableaux 1d, puisque nous avons déjà une notation laconique pour ce cas.)

Stefan, "terme mathématique correct" est une erreur de catégorie - l'exactitude mathématique n'est pas un concept qui s'applique à la terminologie/notation. (Remplacez "conventionnel" par "correct". Mais alors le souci devient moins urgent,)

Plus de cas d'utilisation : https://stackoverflow.com/questions/50408177/julia-calculate-an-inner-product-using-boolean-algebra

Et une dĂ©rivation formelle des produits internes boolĂ©ens en utilisant la notation ⟹,⟩ : https://arxiv.org/abs/0902.1290

EDIT : lien fixe vers le papier

Que pensez-vous de la proposition de syntaxe des chevrons ? Résoudrait-il les problÚmes soulevés ici ?

Alors quelle est votre proposition exactement ? C'est à peu prÚs ça :

  1. Déprécier dot à inner
  2. DĂ©prĂ©cier u⋅v Ă  ⟹u,v⟩

Alors il n'y aurait pas de fonction dot ni d'opĂ©rateur ⋅ ?

Ce changement serait-il quelque chose de raisonnable?

Désolé pour le délai de réponse, je suis à une conférence avec un accÚs limité à internet.

Et juste pour plus de clarté et d'exhaustivité, quelle est la contre-proposition ici ? Ne fais rien?

Pour clarifier encore plus la proposition, un changement sémantique est impliqué : les produits internes généralisés.

Attention : nous en avons maintenant dĂ©battu au point oĂč il y a un risque rĂ©el qu'il n'atteigne pas 0,7-alpha. Cela ne signifie pas qu'il ne peut pas ĂȘtre changĂ© aprĂšs l'alpha, mais il y aura beaucoup plus de rĂ©ticence Ă  changer les choses aprĂšs cela.

Oui, j'aurais aimĂ© avoir les compĂ©tences nĂ©cessaires pour soumettre un PR il y a longtemps. C'est au-delĂ  de mes capacitĂ©s d'y arriver, mĂȘme si je trouve que c'est une caractĂ©ristique extrĂȘmement importante.

MĂȘme en Ă©cartant la question de la syntaxe de l'opĂ©rateur, il y a toujours une certaine complexitĂ© avec l'occultation des noms et les dĂ©prĂ©ciations en plusieurs Ă©tapes pour chaque ensemble de concepts sĂ©mantiques (actuels dot et vecdot et actuels norm et vecnorm ).

Pour le cÎté dot , il semble que tout l'espace d'options (encore une fois les opérateurs à prix réduit) soit :

I. Cassez silencieusement dot sur les vecteurs de tableaux en changeant le comportement dans 0.7 en un produit interne sans depwarn standard (bien que vous puissiez avertir que le comportement est modifié). Déprécier vecdot à dot en 0.7 également.
II. En 0.7, déprécier vecdot sur toutes les entrées à inner .
III. En 0.7, déconseillez dot sur les vecteurs de tableaux à sa définition, et dot sur les autres entrées et vecdot sur toutes les entrées à inner .
IV. Dans la version 0.7, déconseillez dot et vecdot sur les vecteurs de tableaux vers les fonctions non exportées ou vers leurs définitions, et vecdot sur toutes les autres entrées vers dot . Dans la version 1.0, ajoutez dot sur les vecteurs de tableaux avec une sémantique de produit interne.

Pour le cĂŽtĂ© de la norme, il y a un certain consensus autour d'un seul chemin (en 0.7, dĂ©prĂ©cier norm sur les matrices Ă  opnorm et Ă©ventuellement dĂ©prĂ©cier vecnorm Ă  innernorm ; en 1.0 , ajoutez norm sur les matrices avec la sĂ©mantique vecnorm actuelle), mais cela entraĂźne Ă©galement un nom supplĂ©mentaire dans la version 1.0 (soit vecnorm soit innernorm ); encore une fois, un moyen d'Ă©viter cela pourrait ĂȘtre de rendre obsolĂšte vecnorm en 0.7 Ă  sa dĂ©finition ou Ă  une fonction non exportĂ©e comme Base.vecnorm plutĂŽt qu'Ă  un nom exportĂ©.

...Je pense. J'espÚre que je n'ai pas rendu les choses plus musclées qu'elles ne l'étaient déjà.

Quelqu'un qui connaßt la base de code peut-il soumettre un PR pour le changement ?

Pouvons-nous sĂ©parer les Ă©lĂ©ments de norme sur lesquels tout le monde semble ĂȘtre d'accord et faire au moins cela ? Le bit dot contre inner est un peu plus controversĂ©, mais ne laissons pas cela contrecarrer la partie qui ne l'est pas.

@StefanKarpinski , notez qu'ils sont quelque peu couplĂ©s : pour les types oĂč vous avez Ă  la fois un produit scalaire (intĂ©rieur) et une norme, ils doivent ĂȘtre cohĂ©rents.

Ok, je ne me soucie pas vraiment de la façon dont cela se passe. Celui qui fait le travail décide.

J'avais un PR ( #25093 ) pour que vecdot se comporte comme un vrai produit intĂ©rieur (et vecnorm comme la norme correspondante), en les rendant rĂ©cursifs. Cela pourrait ĂȘtre utile comme point de dĂ©part pour savoir Ă  quoi devraient ressembler les futurs dot et norm . Malheureusement, mon manque de compĂ©tences en git m'a fait bousiller ce PR, alors je l'ai fermĂ©, prĂ©voyant d'y revenir une fois la nouvelle syntaxe d'itĂ©ration terminĂ©e.

Cependant, le fait d'ĂȘtre devenu pĂšre pour la deuxiĂšme fois il y a quelques jours signifie qu'il n'y a actuellement aucun crĂ©neau "temps libre" dans mon calendrier.

vient de devenir papa pour la deuxiĂšme fois il y a quelques jours

FĂ©licitations Jutho ! 🎉

Oui, félicitations !

Il semble qu'il pourrait y avoir un consensus autour de l'idĂ©e d'avoir Ă  la fois dot et inner , oĂč :

  1. inner est un vrai produit interne récursif
  2. dot = dot(x,y) = sum(x[i]'*y[i] for i = 1:length(x)) conjugué ou non, et se chevaucherait donc avec dot pour Vector{<:Number} ou Vector{<:Real}

Concernant:

Beaucoup de gens écriraient point quand ils voulaient dire intérieur, et cela fonctionnerait bien pour eux dans la plupart des cas, mais leur code ferait alors quelque chose d'inattendu s'il passait un tableau de matrices.

Je ne crois pas que ce serait un problÚme. Comme il s'agit d'une opération assez rare, je m'attendrais à ce que les gens l'essaient au moins pour voir ce qu'elle fait et/ou qu'ils consultent la documentation.

Je pense que ce qui précÚde serait un grand changement, et pas trÚs perturbateur puisque la sémantique de dot n'est pas modifiée dans la plupart des cas.

Il semble qu'il pourrait y avoir un consensus autour de l'idée d'avoir à la fois dot et inner

Au contraire, la discussion de https://github.com/JuliaLang/julia/issues/25565#issuecomment -390069503 semble privilégier l'un ou l'autre mais pas les deux, comme par exemple indiqué dans https://github. com/JuliaLang/julia/issues/25565#issuecomment -390388230 et bien soutenu avec des réactions.

Peut-ĂȘtre que inner (et aussi dot ) devraient ĂȘtre des produits internes/dot/scalaires rĂ©cursifs et l'ancien comportement pourrait ĂȘtre implĂ©mentĂ© dans des fonctions telles que dotc(x,y) = sum(x[i]' * y[i] for i in eachindex(x)) et dotu(x,y) = sum(transpose(x[i]) * y[i] for i in eachindex(x)) ? Les noms dotu et dotc correspondraient aux noms BLAS correspondants.

(Je suis d'accord que ⟹u,v⟩, ⟹u|v⟩ ou (u,v) sont des notations plus courantes pour les produits internes sur des espaces de Hilbert arbitraires - ce sont ce que j'utilise gĂ©nĂ©ralement moi-mĂȘme - mais ces notations sont un non-dĂ©marrage pour Julia Il y a eu quelques discussions sur l'analyse des parenthĂšses Unicode en tant qu'appels de fonction/macro, par exemple #8934 et #8892, mais cela n'est jamais allĂ© nulle part et cela semble peu susceptible de changer bientĂŽt.)

@stevengj , lorsque vous avez ajoutĂ© vous-mĂȘme ce paragraphe Ă  un commentaire prĂ©cĂ©dent, vous vouliez dire que la syntaxe ⟹u,v⟩ est difficile Ă  implĂ©menter dans le langage ?

Y a-t-il une chance que cette fonctionnalité soit disponible dans Julia v1.0 ? J'ai tellement d'idées et de packages qui dépendent de la notion de produits intérieurs généraux. Veuillez me faire savoir si je dois réduire mes attentes. Désolé pour le rappel constant.

Vous n'avez pas vu #27401 ?

Merci @jebej et merci @ranocha d'avoir pris les devants :coeur:

lorsque vous avez ajoutĂ© vous-mĂȘme ce paragraphe Ă  un commentaire prĂ©cĂ©dent, vous vouliez dire que la syntaxe ⟹u,v⟩ est difficile Ă  implĂ©menter dans le langage ?

Pas techniquement difficile Ă  ajouter Ă  l'analyseur, mais il s'est avĂ©rĂ© difficile de parvenir Ă  un consensus sur la maniĂšre (et si) de reprĂ©senter les parenthĂšses personnalisĂ©es dans le langage. Voir la discussion au # 8934, qui n'est allĂ©e nulle part il y a 4 ans et n'a pas Ă©tĂ© relancĂ©e depuis. (Ajoutez cela au fait que dans diffĂ©rents domaines, les gens utilisent les mĂȘmes crochets pour de nombreuses choses diffĂ©rentes, par exemple ⟹u⟩ est utilisĂ© pour les moyennes d'ensemble en physique statistique.) Un autre problĂšme, soulevĂ© dans # 8892, est la similitude visuelle de nombreux Unicode diffĂ©rents supports.

Merci @stevengj , j'apprĂ©cie les clarifications. Je suis dĂ©jĂ  trĂšs enthousiaste Ă  l'idĂ©e que nous allons standardiser les produits intĂ©rieurs gĂ©nĂ©raux sur tous les packages. :100: Peut-ĂȘtre que la notation entre crochets pourrait briller dans un autre cycle de publication Ă  l'avenir. Pas aussi important, mais assez pratique pour pouvoir Ă©crire du code qui ressemble littĂ©ralement aux mathĂ©matiques de nos publications.

Si ⟹args...⟩ est une syntaxe valide pour appeler l'opĂ©rateur anglebrackets ou quelque chose (comment appeler la fonction que cette syntaxe appelle est en fait assez dĂ©licat puisque nous n'avons aucun prĂ©cĂ©dent), alors les gens pourraient optez pour la signification qu'ils veulent pour la syntaxe.

@StefanKarpinski , l'argument dans # 8934 Ă©tait qu'il devrait s'agir d'une macro. Je ne pense pas que nous soyons parvenus Ă  un consensus.

(Si nous décidons dans Base que anglebrackets(a,b) signifie inner(a,b) , cela découragera les gens de "choisir le sens qu'ils veulent" car la décision aura déjà été prise.
Ce n'est pas un choix terrible, bien sĂ»r, mais il peut ĂȘtre inutile de lui attribuer une signification dans Base tant qu'ils sont analysĂ©s.)

Je ne me souviens pas des détails de cette discussion, mais faire une macro me semble évidemment une mauvaise idée.

Avec # 27401, je pense que nous pouvons considérer que les produits intérieurs ont été pris au sérieux.

Traditionnellement, un problÚme n'est clos que lorsque le PR concerné est fusionné...

Bien sûr, nous pouvons le laisser ouvert, je suppose. Je voulais juste le retirer de l'étiquette de triage.

Cela devrait-il ĂȘtre fermĂ© puisque #27401 est fusionnĂ© maintenant ?

Cette page vous a été utile?
0 / 5 - 0 notes