# Covered schemes

Oscar supports modeling abstract schemes by means of a covering by affine charts.

## Types

The abstract type for these is:

`AbsCoveredScheme`

— Type`AbsCoveredScheme{BaseRingType}`

An abstract scheme $X$ over some `base_ring`

$𝕜$ of type `BaseRingType`

, given by means of affine charts and their glueings.

The basic concrete instance of an `AbsCoveredScheme`

is:

`CoveredScheme`

— Type`CoveredScheme{BaseRingType}`

A covered scheme $X$ given by means of at least one `Covering`

.

A scheme may possess several coverings which are partially ordered by refinement. Use `default_covering(X)`

to obtain one covering of $X$.

## Constructors

You can manually construct a `CoveredScheme`

from a `Covering`

using

`CoveredScheme`

— Method`CoveredScheme(C::Covering)`

Return a `CoveredScheme`

$X$ with `C`

as its `default_covering`

.

**Examples**

```
julia> P1, (x,y) = QQ["x", "y"];
julia> P2, (u,v) = QQ["u", "v"];
julia> U1 = Spec(P1);
julia> U2 = Spec(P2);
julia> C = Covering([U1, U2]) # A Covering with two disjoint affine charts
Covering with 2 patches
julia> V1 = PrincipalOpenSubset(U1, x); # Preparations for glueing
julia> V2 = PrincipalOpenSubset(U2, u);
julia> f = SpecMor(V1, V2, [1//x, y//x]); # The glueing isomorphism
julia> g = SpecMor(V2, V1, [1//u, v//u]); # and its inverse
julia> G = Glueing(U1, U2, f, g); # Construct the glueing
julia> add_glueing!(C, G) # Make the glueing part of the Covering
Covering with 2 patches
julia> X = CoveredScheme(C) # Create a CoveredScheme from the Glueing
covered scheme with 2 affine patches in its default covering
```

In most cases, however, you may wish for the computer to provide you with a ready-made `Covering`

and use a more high-level constructor, such as, for instance,

`covered_scheme`

— Method`covered_scheme(P::ProjectiveScheme)`

Return a `CoveredScheme`

$X$ isomorphic to `P`

with standard affine charts given by dehomogenization.

Use `dehomogenize(P, U)`

with `U`

one of the `affine_charts`

of $X$ to obtain the dehomogenization map from the `ambient_coordinate_ring`

of `P`

to the `coordinate_ring`

of `U`

.

**Examples**

```
julia> P = projective_space(QQ, 2);
julia> Pcov = covered_scheme(P)
covered scheme with 3 affine patches in its default covering
```

## Attributes

To access the affine charts of a `CoveredScheme`

$X$ use

`affine_charts`

— Method`affine_charts(X::AbsCoveredScheme)`

Return the affine charts in the `default_covering`

of $X$.

**Examples**

```
julia> P = projective_space(QQ, 2);
julia> S = ambient_coordinate_ring(P);
julia> I = ideal(S, [S[1]*S[2]-S[3]^2]);
julia> X = subscheme(P, I);
julia> Xcov = covered_scheme(X)
covered scheme with 3 affine patches in its default covering
julia> affine_charts(Xcov)
3-element Vector{AbsSpec}:
Spec of Quotient of Multivariate Polynomial Ring in (s1//s0), (s2//s0) over Rational Field by ideal((s1//s0) - (s2//s0)^2, 0)
Spec of Quotient of Multivariate Polynomial Ring in (s0//s1), (s2//s1) over Rational Field by ideal((s0//s1) - (s2//s1)^2, 0)
Spec of Quotient of Multivariate Polynomial Ring in (s0//s2), (s1//s2) over Rational Field by ideal((s0//s2)*(s1//s2) - 1, 0)
```

Other attributes are the `base_ring`

over which the scheme is defined and

`default_covering`

— Method`default_covering(X::AbsCoveredScheme)`

Return the default covering for $X$.

**Examples**

```
julia> P = projective_space(QQ, 2);
julia> S = ambient_coordinate_ring(P);
julia> I = ideal(S, [S[1]*S[2]-S[3]^2]);
julia> X = subscheme(P, I);
julia> Xcov = covered_scheme(X)
covered scheme with 3 affine patches in its default covering
julia> default_covering(Xcov)
Covering with 3 patches
```

## Properties

An `AbsCoveredScheme`

may have different properties such as

```
is_empty(X::AbsCoveredScheme)
is_smooth(X::AbsCoveredScheme)
```

## The modeling of covered schemes and their expected behaviour

Any `AbsCoveredScheme`

may possess several `Covering`

s. This is necessary for several reasons; for instance, a morphism $f : X \to Y$ between `AbsCoveredScheme`

s will in general only be given on affine patches on a refinement of the `default_covering`

of `X`

. The list of available `Covering`

s can be obtained using

`coverings`

— Method`coverings(X::AbsCoveredScheme)`

Return the list of internally stored `Covering`

s of $X$.

**Examples**

```
julia> P = projective_space(QQ, 2);
julia> Pcov = covered_scheme(P);
julia> coverings(Pcov)
1-element Vector{Covering{QQField}}:
Covering with 3 patches
```

Every `AbsCoveredScheme`

$X$ has to be modeled using one original `default_covering`

$C$, simply to gather the data necessary to fully describe $X$. The `affine_charts`

of $X$ return the patches of this covering. For any refinement $D < C$, we require the following to hold: Every element $U$ of the `affine_charts`

of $D$ is either

- directly an element of the
`affine_charts`

of $C$; - a
`PrincipalOpenSubset`

with some ancestor in the`affine_charts`

of $C$; - a
`SimplifiedSpec`

with some original in the`affine_charts`

of $C$.

In all these cases, the affine subsets in the refinements form a tree and thus remember their origins and ambient spaces. In particular, affine patches and also their glueings can be recycled and reused in different coverings and the latter should be merely seen as lists pointing to the objects involved.