Opened 3 years ago
Closed 3 years ago
#27856 closed defect (fixed)
Tangent vectors should act as derivations on scalar fields
Reported by:  Eric Gourgoulhon  Owned by:  

Priority:  major  Milestone:  sage8.8 
Component:  geometry  Keywords:  vector, derivation 
Cc:  Travis Scrimshaw  Merged in:  
Authors:  Eric Gourgoulhon  Reviewers:  Travis Scrimshaw 
Report Upstream:  N/A  Work issues:  
Branch:  4c0abd7 (Commits, GitHub, GitLab)  Commit:  4c0abd75065fae7820988a6eb8c2a0ebcb3091f9 
Dependencies:  Stopgaps: 
Description
In Sage 8.7, we have
sage: M = Manifold(2, 'M') sage: X.<x,y> = M.chart() sage: p = M((2,1), name='p') sage: TpM = M.tangent_space(p) sage: v = TpM((2, 3), name='v'); v Tangent vector v at Point p on the 2dimensional differentiable manifold M sage: f = M.scalar_field(x*y^2, name='f') sage: v(f) Traceback (most recent call last): ... TypeError: the argument no. 1 must be a linear form
Note that this works for vector fields:
sage: w = M.vector_field(name='w') sage: w[:] = y, x sage: w.display() w = y d/dx + x d/dy sage: w(f) Scalar field w(f) on the 2dimensional differentiable manifold M sage: w(f).display() w(f): M > R (x, y) > 2*x^2*y  y^3
This issue has been reported in this ask.sagemath question.
Change History (11)
comment:1 Changed 3 years ago by
Branch:  → public/manifolds/vector_derivation27856 

Commit:  → 50bc6da98b97fe2104f670c0cc7412211f87be7f 
comment:2 Changed 3 years ago by
Cc:  Travis Scrimshaw added 

Status:  new → needs_review 
comment:3 followup: 4 Changed 3 years ago by
A good general rule that you should follow is to not overwrite __call__
. Instead, the typical thing to do is implement an _act_on_
(or _acted_upon_
), and let the coercion framework handle the dispatching.
comment:4 Changed 3 years ago by
Replying to tscrim:
A good general rule that you should follow is to not overwrite
__call__
. Instead, the typical thing to do is implement an_act_on_
(or_acted_upon_
), and let the coercion framework handle the dispatching.
I am a little bit puzzled by this: looking at lines 11541184 of src/sage/structure/coerce.pyx
, I have the impression that _act_on_
is used for actions denoted by __mul__
, not by __call__
. This seems confirmed from the doctest examples one can get from grep r "def _act_on_" src/sage
. Now, in the current setting, we do want to write v(f)
for the action of a tangent vector v
on a scalar function f
, not v*f
. Besides, it seems overwriting __call__
is much used in Sage library: grep r "def __call__" src/sage  wc l
returns 496 instances, while grep r "def _act_on_" src/sage  wc l
returns only 16 instances.
comment:5 followup: 7 Changed 3 years ago by
Ah, I see. I saw act in the ticket and was thinking it should behave like a normal action (and be written with a binary operation such as multiplication). So sorry about that noise there. I guess this is fine since it is done on an element and not a parent. (As a side note, it is actually __call__
that starts the dispatch to the coercion framework, not something that is dealt out from it.)
Only other thing you need to address is changing EXAMPLES::
> EXAMPLES:
to get a positive review.
comment:6 Changed 3 years ago by
Commit:  50bc6da98b97fe2104f670c0cc7412211f87be7f → 4c0abd75065fae7820988a6eb8c2a0ebcb3091f9 

Branch pushed to git repo; I updated commit sha1. New commits:
4c0abd7  Correct EXAMPLES statement in tangent_vector

comment:7 followup: 8 Changed 3 years ago by
Replying to tscrim:
Ah, I see. I saw act in the ticket and was thinking it should behave like a normal action (and be written with a binary operation such as multiplication). So sorry about that noise there.
No problem. Actually I should have used "behave" instead of "act" to avoid any confusion (there is indeed no group action here).
I guess this is fine since it is done on an element and not a parent.
(As a side note, it is actually
__call__
that starts the dispatch to the coercion framework, not >something that is dealt out from it.)
For my own instruction, can you tell by which magic this is done (given that __call__
is not redefined in the base class Element
)?
Only other thing you need to address is changing
EXAMPLES::
>EXAMPLES:
to get a positive review.
Done in the above commit.
comment:8 followup: 10 Changed 3 years ago by
Authors:  → Eric Gourgoulhon 

Reviewers:  → Travis Scrimshaw 
Replying to egourgoulhon:
Replying to tscrim:
I guess this is fine since it is done on an element and not a parent.
(As a side note, it is actually
__call__
that starts the dispatch to the coercion framework, not >something that is dealt out from it.)For my own instruction, can you tell by which magic this is done (given that
__call__
is not redefined in the base classElement
)?
It is Parent.__call__
that starts the process off. However, you can explicit invoke the coercion framework by importing the coercion_model
within your own class. There are also things like @coerce_binop
as helpers too.
Only other thing you need to address is changing
EXAMPLES::
>EXAMPLES:
to get a positive review.Done in the above commit.
Thanks, LGTM.
comment:9 Changed 3 years ago by
Status:  needs_review → positive_review 

comment:10 Changed 3 years ago by
Replying to tscrim:
It is
Parent.__call__
that starts the process off. However, you can explicit invoke the coercion framework by importing thecoercion_model
within your own class. There are also things like@coerce_binop
as helpers too.
Thanks for these explanations and thanks for the review!
comment:11 Changed 3 years ago by
Branch:  public/manifolds/vector_derivation27856 → 4c0abd75065fae7820988a6eb8c2a0ebcb3091f9 

Resolution:  → fixed 
Status:  positive_review → closed 
New commits:
Add action of tangent vectors on scalar fields