Opened 14 months ago
Closed 12 months ago
#31653 closed enhancement (fixed)
Images of continuous maps and embedded submanifolds as manifold subsets
Reported by:  mkoeppe  Owned by:  

Priority:  major  Milestone:  sage9.4 
Component:  manifolds  Keywords:  
Cc:  egourgoulhon, tscrim, yzh, ghmjungmath, ghmwageringel, roed  Merged in:  
Authors:  Matthias Koeppe  Reviewers:  Eric Gourgoulhon, Michael Jung 
Report Upstream:  N/A  Work issues:  
Branch:  0f3e36d (Commits, GitHub, GitLab)  Commit:  0f3e36d35b688a92028d09fd9edef3cf5ddae590 
Dependencies:  Stopgaps: 
Description
We define a subclass of ManifoldSubset
, instances of which represent the image of a continuous map.
In particular, this will allow an embedded submanifold to be considered as a subset of the ambient manifold.
Change History (33)
comment:1 Changed 14 months ago by
comment:2 Changed 14 months ago by
Also there are various image
methods of various morphism classes, not all with the same signature:
 without extra argument: category
FiniteDimensionalModulesWithBasis
parent method,CrystalMorphismByGenerators
,SimplicialComplexMorphism
,Matrix
,MatrixMorphism_...
,SchemeMorphism_...
 with an extra argument (substructure to compute the image of):
AbelianGroupMorphism
,PermutationGroupMorphism
,SimplicialSetMorphism
,  incompatible:
WordMorphism.image
comment:3 Changed 14 months ago by
Thanks for opening this ticket; I've added it to the metaticket #30525.
comment:4 Changed 14 months ago by
 Cc ghmwageringel roed added
Likewise, there is some diversity regarding inverse_image
and preimage
methods.
comment:5 Changed 14 months ago by
 Branch set to u/mkoeppe/images_of_continuous_maps_and_embedded_submanifolds_as_manifold_subsets
comment:6 Changed 14 months ago by
 Commit set to d757adb0db47f9b9a39c3da5e1ab68d6dbe68606
Branch pushed to git repo; I updated commit sha1. New commits:
d757adb  ImageManifoldSubset.__contains__: New

comment:7 Changed 14 months ago by
 Commit changed from d757adb0db47f9b9a39c3da5e1ab68d6dbe68606 to 4b59194b4af33de5566a14cf5d6c57b6c418a1ee
Branch pushed to git repo; I updated commit sha1. New commits:
4b59194  ImageManifoldSubset._an_element_: New

comment:8 Changed 14 months ago by
comment:9 Changed 14 months ago by
 Commit changed from 4b59194b4af33de5566a14cf5d6c57b6c418a1ee to 18c1bd97aee0bd5b690f8452551ef583bcfc3dc3
Branch pushed to git repo; I updated commit sha1. New commits:
18c1bd9  ImageManifoldSubset, ContinuousMap.image: Add optional 'inverse' argument, use it in __contains__

comment:10 Changed 14 months ago by
 Commit changed from 18c1bd97aee0bd5b690f8452551ef583bcfc3dc3 to 645aa2fd83b31b4bb8a32f05030b3f06db4a4c24
Branch pushed to git repo; I updated commit sha1. New commits:
645aa2f  src/sage/manifolds/continuous_map_image.py: Update doctests

comment:11 Changed 14 months ago by
 Commit changed from 645aa2fd83b31b4bb8a32f05030b3f06db4a4c24 to 5170c15dae7e82877a5fcecf4516f5df2192a96a
Branch pushed to git repo; I updated commit sha1. New commits:
5170c15  TopologicalSubmanifold.as_subset: New

comment:12 followup: ↓ 18 Changed 14 months ago by
Early stage. Comments on this design are very welcome
comment:13 followup: ↓ 15 Changed 14 months ago by
Yes, I have two comments:
 I advocate fstrings:
 return "Image of the {}".format(self._map) + return f"Image of the {self._map}"
More readable and even (slightly) faster.
 I don't quite get the purpose of
return self._map(preimage) == point
Isn't that always true if
preimage in self._map.domain()
is already met (and the inverse is correctly defined)?
comment:14 followup: ↓ 16 Changed 14 months ago by
This notion of inverse is taken from TopologicalSubmanifold
. This inverse maps the whole ambient space to the domain of the map  so one needs to check
comment:15 in reply to: ↑ 13 Changed 14 months ago by
Replying to ghmjungmath:
 I advocate fstrings:
Yes, I like them too. Unfortunate clash of these braces with LaTeX notation though
comment:16 in reply to: ↑ 14 ; followup: ↓ 17 Changed 14 months ago by
Replying to mkoeppe:
This notion of inverse is taken from
TopologicalSubmanifold
. This inverse maps the whole ambient space to the domain of the map  so one needs to check
Alright, I see it now. It's just a very unusual definition of inverse...
The rest looks pretty nice already. :)
comment:17 in reply to: ↑ 16 Changed 14 months ago by
comment:18 in reply to: ↑ 12 Changed 14 months ago by
comment:19 Changed 14 months ago by
 Commit changed from 5170c15dae7e82877a5fcecf4516f5df2192a96a to 9726d367d46d3abb54955db47e5f82993d12efa6
Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:
cd8d6af  sage.manifolds.continuous_map_image, ContinuousMap.image: New

ae0b7f9  ImageManifoldSubset.__contains__: New

0135892  ImageManifoldSubset._an_element_: New

459758e  ImageManifoldSubset, ContinuousMap.image: Add optional 'inverse' argument, use it in __contains__

26c7e56  src/sage/manifolds/continuous_map_image.py: Update doctests

3e273bb  TopologicalSubmanifold.as_subset: New

9726d36  Docstring work

comment:20 followup: ↓ 25 Changed 14 months ago by
I am considering possible extensions of the current code:
 handle a domain
subset
directly inImageManifoldSubset
 which would allow us to extendContinuousMap.image
to take asubset
that is not open  if the map is an isomorphism (and the domain
subset
open), we could create a submanifold  but should this use extra classesImageTopologicalManifold
,ImageDifferentiableManifold
, which remember the map, or just compute the result? (in either case  followup ticket)
comment:21 Changed 14 months ago by
 Commit changed from 9726d367d46d3abb54955db47e5f82993d12efa6 to 19762ae034f7b740f2aa31c2fc79685095a39cec
Branch pushed to git repo; I updated commit sha1. New commits:
19762ae  ImageManifoldSubset: New parameter domain_subset, use it in ContinuousMap.image

comment:22 Changed 14 months ago by
 Status changed from new to needs_review
comment:23 Changed 14 months ago by
 Commit changed from 19762ae034f7b740f2aa31c2fc79685095a39cec to 964f9f7d18b2a7e052ad3e537557b861fbcb3106
Branch pushed to git repo; I updated commit sha1. New commits:
964f9f7  src/sage/manifolds/continuous_map.py: Update copyright

comment:24 Changed 14 months ago by
Some TESTS::
fields are actually empty.
comment:25 in reply to: ↑ 20 ; followup: ↓ 26 Changed 14 months ago by
Replying to mkoeppe:
I am considering possible extensions of the current code:
 handle a domain
subset
directly inImageManifoldSubset
 which would allow us to extendContinuousMap.image
to take asubset
that is not open
Sounds legitimate.
 if the map is an isomorphism (and the domain
subset
open), we could create a submanifold  but should this use extra classesImageTopologicalManifold
,ImageDifferentiableManifold
, which remember the map, or just compute the result? (in either case  followup ticket)
Maybe just compute the result?
comment:26 in reply to: ↑ 25 Changed 14 months ago by
Replying to egourgoulhon:
Replying to mkoeppe:
 if the map is an isomorphism (and the domain
subset
open), we could create a submanifold  but should this use extra classesImageTopologicalManifold
,ImageDifferentiableManifold
, which remember the map, or just compute the result? (in either case  followup ticket)Maybe just compute the result?
OK, I have opened #31685 for this.
comment:27 Changed 14 months ago by
 Commit changed from 964f9f7d18b2a7e052ad3e537557b861fbcb3106 to e711215d154223b34f17f758b94407545843fe55
Branch pushed to git repo; I updated commit sha1. New commits:
e711215  src/sage/manifolds/continuous_map_image.py: Add tests

comment:28 Changed 13 months ago by
Ready for review
comment:29 Changed 13 months ago by
To generate the documentation regarding the new class ImageManifoldSubset
, the following line
sage/manifolds/continuous_map_image
should added at the end of src/doc/en/reference/manifolds/continous_map.rst
. Also, it would be nice to modify the head of src/sage/manifolds/subsets.py
so that it refers to it, e.g. something like:
The class :class:`ManifoldSubset` implements generic subsets of a topological manifold. Open subsets are implemented by the class :class:`~sage.manifolds.manifold.TopologicalManifold` (since an open subset of a manifold is a manifold by itself), which inherits  from :class:`ManifoldSubset`. + from :class:`ManifoldSubset`. Besides, subsets that are images of + a manifold subset under a continuous map are implemented by the + subclass :class:`~sage.manifolds.continuous_map_image.ImageManifoldSubset`.
comment:30 Changed 13 months ago by
 Commit changed from e711215d154223b34f17f758b94407545843fe55 to 0f3e36d35b688a92028d09fd9edef3cf5ddae590
Branch pushed to git repo; I updated commit sha1. New commits:
0f3e36d  Link in documentation of sage.manifolds.continuous_map_image

comment:31 Changed 13 months ago by
 Reviewers set to Eric Gourgoulhon, Michael Jung
 Status changed from needs_review to positive_review
Thanks!
comment:32 Changed 13 months ago by
Thanks for reviewing!
comment:33 Changed 12 months ago by
 Branch changed from u/mkoeppe/images_of_continuous_maps_and_embedded_submanifolds_as_manifold_subsets to 0f3e36d35b688a92028d09fd9edef3cf5ddae590
 Resolution set to fixed
 Status changed from positive_review to closed
There are a number of related existing methods in various components of Sage.
FreeModuleMorphism.pushforward
can compute the image of a submodule, andRingHomomorphism.pushforward
can compute the image of an ideal.