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 ?
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.
Il y a eu une petite discussion Ă ce sujet dans https://github.com/JuliaLang/julia/issues/22227 et https://github.com/JuliaLang/julia/pull/22220
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 (je ne pense pas qu'il sera renommé using LinAlg
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)veclength
est ajoutéeOption 2 (probablement meilleure) : utilisez des noms plus mathématiquement corrects
inner
dimension
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 :
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.
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
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.dot(x[i], y[i])
, y compris pour les tableaux multidimensionnels, et conj(x)*y
pour Number
. Actuellement, c'est vecdot(x,y)
.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éfinirdot
etnorm
.
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
etinnernorm
. 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éfinissezinnernorm
, cela implique que vous avez un espace de Hilbert (ou au moins un espace de produit interne) et que cette norme est cohérente avecinner
.
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 :
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.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Â :
norm(matrix)
Ă opnorm(matrix)
et norm(vector of vectors)
Ă vecnorm
.dot([vector of arrays], [vector of arrays])
pour un appel Ă sum
.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 :
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
:
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.)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
).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 :
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).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 :
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 !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.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:
<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 :
dot
Ă inner
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Ăč :
inner
est un vrai produit interne récursifdot = 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
etinner
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 ?
Commentaire le plus utile
Cela devrait-il ĂȘtre fermĂ© puisque #27401 est fusionnĂ© maintenant ?