Anonymous function creation is slow, and almost always necessary

Ouverte
#873 9 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
35/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
Active
Stack technique
julia
Domaine
backend

Piste de recherche

Start by reading the ForwardDiff method signatures that accept functions and initial values; the issue does not name specific files or tests. Check how DifferentialEquations handles call-site parameters, then determine the scope and compatibility implications of adding a similar option. Done means ForwardDiff can accept parameters at the call site without relying on a closure that captures changing state.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Suppose I have a function f(x::Vector, p::SomeData), which I want to compute the Jacobian of. A common way to do this is

p = generate_some_data()
jac = ForwardDiff(x -> f(x, p), x0)

which has very bad performance on every call because we are instantiating a new anonymous function every time, which triggers compilation. A more clever way of doing this is

partially_applied_f = x -> f(x, p)
#repeat the lines below as much as needed
p = generate_some_data()
jac = ForwardDiff(partially_applied_f, x0)

which introduces a weird invisible dependency of the calls of partially_applied_f on the current state of p. Would it be feasible to update method signatures in this package to accept parameters at the call site? Such that the following code is valid:

p = generate_some_data()
jac = ForwardDiff(f, x0, parameter = p)

DifferentialEquations already do something similar with their method calls. This would remove a lot of overhead and imprevisibility in my use cases.

Langage dominant
Julia
Étoiles
1k
Forks
165
Merge moyen
8 j 22 h
PR mergées (30 j)
3

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de JuliaDiff/ForwardDiff.jl

Toutes les issues de JuliaDiff/ForwardDiff.jl

Issues similaires

Plus d'issues Julia

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.