Fiber bundles #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
Mathematically, a (topological) fiber bundle with fiber F
over a base B
is a space projecting on
B
for which the fibers are all homeomorphic to F
, such that the local situation around each
point is a direct product.
In our formalism, a fiber bundle is by definition the type
bundle.total_space F E
where E : B → Type*
is a function associating to x : B
the fiber over
x
. This type bundle.total_space F E
is a type of pairs (proj : B, snd : E proj)
.
To have a fiber bundle structure on bundle.total_space F E
, one should
additionally have the following data:
F
should be a topological space;- There should be a topology on
bundle.total_space F E
, for which the projection toB
is a fiber bundle with fiberF
(in particular, each fiberE x
is homeomorphic toF
); - For each
x
, the fiberE x
should be a topological space, and the injection fromE x
tobundle.total_space F E
should be an embedding; - There should be a distinguished set of bundle trivializations, the "trivialization atlas"
- There should be a choice of bundle trivialization at each point, which belongs to this atlas.
If all these conditions are satisfied, we register the typeclass fiber_bundle F E
.
It is in general nontrivial to construct a fiber bundle. A way is to start from the knowledge of
how changes of local trivializations act on the fiber. From this, one can construct the total space
of the bundle and its topology by a suitable gluing construction. The main content of this file is
an implementation of this construction: starting from an object of type
fiber_bundle_core
registering the trivialization changes, one gets the corresponding
fiber bundle and projection.
Similarly we implement the object fiber_prebundle
which allows to define a topological
fiber bundle from trivializations given as local equivalences with minimum additional properties.
Main definitions #
Basic definitions #
fiber_bundle F E
: Structure saying thatE : B → Type*
is a fiber bundle with fiberF
.
Construction of a bundle from trivializations #
bundle.total_space F E
is the type of pairs(proj : B, snd : E proj)
. We can use the extra argumentF
to construct topology on the total space.fiber_bundle_core ι B F
: structure registering how changes of coordinates act on the fiberF
above open subsets ofB
, where local trivializations are indexed byι
.
Let Z : fiber_bundle_core ι B F
. Then we define
-
Z.fiber x
: the fiber abovex
, homeomorphic toF
(and defeq toF
as a type). -
Z.total_space
: the total space ofZ
, defined as aType*
asbundle.total_space F Z.fiber
with a custom topology. -
Z.proj
: projection fromZ.total_space
toB
. It is continuous. -
Z.local_triv i
: fori : ι
, bundle trivialization above the setZ.base_set i
, which is an open set inB
. -
fiber_prebundle F E
: structure registering a cover of prebundle trivializations and requiring that the relative transition maps are local homeomorphisms. -
fiber_prebundle.total_space_topology a
: natural topology of the total space, making the prebundle into a bundle.
Implementation notes #
Data vs mixins #
For both fiber and vector bundles, one faces a choice: should the definition state the existence of local trivializations (a propositional typeclass), or specify a fixed atlas of trivializations (a typeclass containing data)?
In their initial mathlib implementations, both fiber and vector bundles were defined
propositionally. For vector bundles, this turns out to be mathematically wrong: in infinite
dimension, the transition function between two trivializations is not automatically continuous as a
map from the base B
to the endomorphisms F →L[R] F
of the fiber (considered with the
operator-norm topology), and so the definition needs to be modified by restricting consideration to
a family of trivializations (constituting the data) which are all mutually-compatible in this sense.
The PRs #13052 and #13175 implemented this change.
There is still the choice about whether to hold this data at the level of fiber bundles or of vector
bundles. As of PR #17505, the data is all held in fiber_bundle
, with vector_bundle
a
(propositional) mixin stating fiberwise-linearity.
This allows bundles to carry instances of typeclasses in which the scalar field, R
, does not
appear as a parameter. Notably, we would like a vector bundle over R
with fiber F
over base B
to be a charted_space (B × F)
, with the trivializations providing the charts. This would be a
dangerous instance for typeclass inference, because R
does not appear as a parameter in
charted_space (B × F)
. But if the data of the trivializations is held in fiber_bundle
, then a
fiber bundle with fiber F
over base B
can be a charted_space (B × F)
, and this is safe for
typeclass inference.
We expect that this choice of definition will also streamline constructions of fiber bundles with similar underlying structure (e.g., the same bundle being both a real and complex vector bundle).
Core construction #
A fiber bundle with fiber F
over a base B
is a family of spaces isomorphic to F
,
indexed by B
, which is locally trivial in the following sense: there is a covering of B
by open
sets such that, on each such open set s
, the bundle is isomorphic to s × F
.
To construct a fiber bundle formally, the main data is what happens when one changes trivializations
from s × F
to s' × F
on s ∩ s'
: one should get a family of homeomorphisms of F
, depending
continuously on the base point, satisfying basic compatibility conditions (cocycle property).
Useful classes of bundles can then be specified by requiring that these homeomorphisms of F
belong to some subgroup, preserving some structure (the "structure group of the bundle"): then
these structures are inherited by the fibers of the bundle.
Given such trivialization change data (encoded below in a structure called
fiber_bundle_core
), one can construct the fiber bundle. The intrinsic canonical
mathematical construction is the following.
The fiber above x
is the disjoint union of F
over all trivializations, modulo the gluing
identifications: one gets a fiber which is isomorphic to F
, but non-canonically
(each choice of one of the trivializations around x
gives such an isomorphism). Given a
trivialization over a set s
, one gets an isomorphism between s × F
and proj^{-1} s
, by using
the identification corresponding to this trivialization. One chooses the topology on the bundle that
makes all of these into homeomorphisms.
For the practical implementation, it turns out to be more convenient to avoid completely the
gluing and quotienting construction above, and to declare above each x
that the fiber is F
,
but thinking that it corresponds to the F
coming from the choice of one trivialization around x
.
This has several practical advantages:
- without any work, one gets a topological space structure on the fiber. And if
F
has more structure it is inherited for free by the fiber. - In the case of the tangent bundle of manifolds, this implies that on vector spaces the derivative
(from
F
toF
) and the manifold derivative (fromtangent_space I x
totangent_space I' (f x)
) are equal.
A drawback is that some silly constructions will typecheck: in the case of the tangent bundle, one
can add two vectors in different tangent spaces (as they both are elements of F
from the point of
view of Lean). To solve this, one could mark the tangent space as irreducible, but then one would
lose the identification of the tangent space to F
with F
. There is however a big advantage of
this situation: even if Lean can not check that two basepoints are defeq, it will accept the fact
that the tangent spaces are the same. For instance, if two maps f
and g
are locally inverse to
each other, one can express that the composition of their derivatives is the identity of
tangent_space I x
. One could fear issues as this composition goes from tangent_space I x
to
tangent_space I (g (f x))
(which should be the same, but should not be obvious to Lean
as it does not know that g (f x) = x
). As these types are the same to Lean (equal to F
), there
are in fact no dependent type difficulties here!
For this construction of a fiber bundle from a fiber_bundle_core
, we should thus
choose for each x
one specific trivialization around it. We include this choice in the definition
of the fiber_bundle_core
, as it makes some constructions more
functorial and it is a nice way to say that the trivializations cover the whole space B
.
With this definition, the type of the fiber bundle space constructed from the core data is
bundle.total_space F (λ b : B, F)
, but the topology is not the product one, in general.
We also take the indexing type (indexing all the trivializations) as a parameter to the fiber bundle
core: it could always be taken as a subtype of all the maps from open subsets of B
to continuous
maps of F
, but in practice it will sometimes be something else. For instance, on a manifold, one
will use the set of charts as a good parameterization for the trivializations of the tangent bundle.
Or for the pullback of a fiber_bundle_core
, the indexing type will be the same as
for the initial bundle.
Tags #
Fiber bundle, topological bundle, structure group
General definition of fiber bundles #
- total_space_mk_inducing : ∀ (b : B), inducing (bundle.total_space.mk b)
- trivialization_atlas : set (trivialization F bundle.total_space.proj)
- trivialization_at : B → trivialization F bundle.total_space.proj
- mem_base_set_trivialization_at : ∀ (b : B), b ∈ (fiber_bundle.trivialization_at F E b).base_set
- trivialization_mem_atlas : ∀ (b : B), fiber_bundle.trivialization_at F E b ∈ fiber_bundle.trivialization_atlas F E
A (topological) fiber bundle with fiber F
over a base B
is a space projecting on B
for which the fibers are all homeomorphic to F
, such that the local situation around each point
is a direct product.
Instances of this typeclass
Instances of other typeclasses for fiber_bundle
- fiber_bundle.has_sizeof_inst
- out : e ∈ fiber_bundle.trivialization_atlas F E
Given a type E
equipped with a fiber bundle structure, this is a Prop
typeclass
for trivializations of E
, expressing that a trivialization is in the designated atlas for the
bundle. This is needed because lemmas about the linearity of trivializations or the continuity (as
functions to F →L[R] F
, where F
is the model fiber) of the transition functions are only
expected to hold for trivializations in the designated atlas.
The projection from a fiber bundle to its base is continuous.
The projection from a fiber bundle to its base is an open map.
The projection from a fiber bundle with a nonempty fiber to its base is a surjective map.
The projection from a fiber bundle with a nonempty fiber to its base is a quotient map.
Characterization of continuous functions (at a point, within a set) into a fiber bundle.
Characterization of continuous functions (at a point) into a fiber bundle.
If E
is a fiber bundle over a conditionally complete linear order,
then it is trivial over any closed interval.
Core construction for constructing fiber bundles #
- base_set : ι → set B
- is_open_base_set : ∀ (i : ι), is_open (self.base_set i)
- index_at : B → ι
- mem_base_set_at : ∀ (x : B), x ∈ self.base_set (self.index_at x)
- coord_change : ι → ι → B → F → F
- coord_change_self : ∀ (i : ι) (x : B), x ∈ self.base_set i → ∀ (v : F), self.coord_change i i x v = v
- continuous_on_coord_change : ∀ (i j : ι), continuous_on (λ (p : B × F), self.coord_change i j p.fst p.snd) ((self.base_set i ∩ self.base_set j) ×ˢ set.univ)
- coord_change_comp : ∀ (i j k : ι) (x : B), x ∈ self.base_set i ∩ self.base_set j ∩ self.base_set k → ∀ (v : F), self.coord_change j k x (self.coord_change i j x v) = self.coord_change i k x v
Core data defining a locally trivial bundle with fiber F
over a topological
space B
. Note that "bundle" is used in its mathematical sense. This is the (computer science)
bundled version, i.e., all the relevant data is contained in the following structure. A family of
local trivializations is indexed by a type ι
, on open subsets base_set i
for each i : ι
.
Trivialization changes from i
to j
are given by continuous maps coord_change i j
from
base_set i ∩ base_set j
to the set of homeomorphisms of F
, but we express them as maps
B → F → F
and require continuity on (base_set i ∩ base_set j) × F
to avoid the topology on the
space of continuous maps on F
.
Instances for fiber_bundle_core
- fiber_bundle_core.has_sizeof_inst
- vector_bundle_core.to_fiber_bundle_core_coe
The index set of a fiber bundle core, as a convenience function for dot notation
The base space of a fiber bundle core, as a convenience function for dot notation
The fiber of a fiber bundle core, as a convenience function for dot notation and typeclass inference
Instances for fiber_bundle_core.fiber
Equations
- Z.topological_space_fiber x = _inst_3
The total space of the fiber bundle, as a convenience function for dot notation.
It is by definition equal to bundle.total_space Z.fiber
Equations
- Z.total_space = bundle.total_space F Z.fiber
The projection from the total space of a fiber bundle core, on its base.
Equations
Local homeomorphism version of the trivialization change.
Equations
- Z.triv_change i j = {to_local_equiv := {to_fun := λ (p : B × F), (p.fst, Z.coord_change i j p.fst p.snd), inv_fun := λ (p : B × F), (p.fst, Z.coord_change j i p.fst p.snd), source := (Z.base_set i ∩ Z.base_set j) ×ˢ set.univ, target := (Z.base_set i ∩ Z.base_set j) ×ˢ set.univ, map_source' := _, map_target' := _, left_inv' := _, right_inv' := _}, open_source := _, open_target := _, continuous_to_fun := _, continuous_inv_fun := _}
Associate to a trivialization index i : ι
the corresponding trivialization, i.e., a bijection
between proj ⁻¹ (base_set i)
and base_set i × F
. As the fiber above x
is F
but read in the
chart with index index_at x
, the trivialization in the fiber above x is by definition the
coordinate change from i to index_at x
, so it depends on x
.
The local trivialization will ultimately be a local homeomorphism. For now, we only introduce the
local equiv version, denoted with a prime. In further developments, avoid this auxiliary version,
and use Z.local_triv
instead.
Equations
- Z.local_triv_as_local_equiv i = {to_fun := λ (p : Z.total_space), (p.proj, Z.coord_change (Z.index_at p.proj) i p.proj p.snd), inv_fun := λ (p : B × F), {proj := p.fst, snd := Z.coord_change i (Z.index_at p.fst) p.fst p.snd}, source := Z.proj ⁻¹' Z.base_set i, target := Z.base_set i ×ˢ set.univ, map_source' := _, map_target' := _, left_inv' := _, right_inv' := _}
The composition of two local trivializations is the trivialization change Z.triv_change i j.
Topological structure on the total space of a fiber bundle created from core, designed so that all the local trivialization are continuous.
Equations
- Z.to_topological_space = topological_space.generate_from (⋃ (i : ι) (s : set (B × F)) (s_open : is_open s), {(Z.local_triv_as_local_equiv i).source ∩ ⇑(Z.local_triv_as_local_equiv i) ⁻¹' s})
Extended version of the local trivialization of a fiber bundle constructed from core, registering additionally in its type that it is a local bundle trivialization.
Equations
- Z.local_triv i = {to_local_homeomorph := {to_local_equiv := Z.local_triv_as_local_equiv i, open_source := _, open_target := _, continuous_to_fun := _, continuous_inv_fun := _}, base_set := Z.base_set i, open_base_set := _, source_eq := _, target_eq := _, proj_to_fun := _}
Preferred local trivialization of a fiber bundle constructed from core, at a given point, as a bundle trivialization
Equations
- Z.local_triv_at b = Z.local_triv (Z.index_at b)
If an element of F
is invariant under all coordinate changes, then one can define a
corresponding section of the fiber bundle, which is continuous. This applies in particular to the
zero section of a vector bundle. Another example (not yet defined) would be the identity
section of the endomorphism bundle of a vector bundle.
The inclusion of a fiber into the total space is a continuous map.
A fiber bundle constructed from core is indeed a fiber bundle.
Equations
- Z.fiber_bundle = {total_space_mk_inducing := _, trivialization_atlas := set.range Z.local_triv, trivialization_at := Z.local_triv_at, mem_base_set_trivialization_at := _, trivialization_mem_atlas := _}
The projection on the base of a fiber bundle created from core is continuous
The projection on the base of a fiber bundle created from core is an open map
Prebundle construction for constructing fiber bundles #
- pretrivialization_atlas : set (pretrivialization F bundle.total_space.proj)
- pretrivialization_at : B → pretrivialization F bundle.total_space.proj
- mem_base_pretrivialization_at : ∀ (x : B), x ∈ (self.pretrivialization_at x).base_set
- pretrivialization_mem_atlas : ∀ (x : B), self.pretrivialization_at x ∈ self.pretrivialization_atlas
- continuous_triv_change : ∀ (e : pretrivialization F bundle.total_space.proj), e ∈ self.pretrivialization_atlas → ∀ (e' : pretrivialization F bundle.total_space.proj), e' ∈ self.pretrivialization_atlas → continuous_on (⇑e ∘ ⇑(e'.to_local_equiv.symm)) (e'.to_local_equiv.target ∩ ⇑(e'.to_local_equiv.symm) ⁻¹' e.to_local_equiv.source)
- total_space_mk_inducing : ∀ (b : B), inducing (⇑(self.pretrivialization_at b) ∘ bundle.total_space.mk b)
This structure permits to define a fiber bundle when trivializations are given as local equivalences but there is not yet a topology on the total space. The total space is hence given a topology in such a way that there is a fiber bundle structure for which the local equivalences are also local homeomorphism and hence local trivializations.
Instances for fiber_prebundle
- fiber_prebundle.has_sizeof_inst
Topology on the total space that will make the prebundle into a bundle.
Equations
Promotion from a pretrivialization
to a trivialization
.
Equations
- a.trivialization_of_mem_pretrivialization_atlas he = {to_local_homeomorph := {to_local_equiv := e.to_local_equiv, open_source := _, open_target := _, continuous_to_fun := _, continuous_inv_fun := _}, base_set := e.base_set, open_base_set := _, source_eq := _, target_eq := _, proj_to_fun := _}
Make a fiber_bundle
from a fiber_prebundle
. Concretely this means
that, given a fiber_prebundle
structure for a sigma-type E
-- which consists of a
number of "pretrivializations" identifying parts of E
with product spaces U × F
-- one
establishes that for the topology constructed on the sigma-type using
fiber_prebundle.total_space_topology
, these "pretrivializations" are actually
"trivializations" (i.e., homeomorphisms with respect to the constructed topology).
Equations
- a.to_fiber_bundle = {total_space_mk_inducing := _, trivialization_atlas := {e : trivialization F bundle.total_space.proj | ∃ (e₀ : pretrivialization F bundle.total_space.proj) (he₀ : e₀ ∈ a.pretrivialization_atlas), e = a.trivialization_of_mem_pretrivialization_atlas he₀}, trivialization_at := λ (x : B), a.trivialization_of_mem_pretrivialization_atlas _, mem_base_set_trivialization_at := _, trivialization_mem_atlas := _}
For a fiber bundle E
over B
constructed using the fiber_prebundle
mechanism,
continuity of a function total_space F E → X
on an open set s
can be checked by precomposing at
each point with the pretrivialization used for the construction at that point.