# Functionality for all F-theory models

All F-theory models focus on elliptic (or genus-one) fibrations. Details depend on the specific way in which the fibration is constructed/described. Still, some functionality is common among all or at least the majority of all supported models. We will document such common functionality here.

## Family of Spaces

Many F-theory constructions (e.g. in the literature) work without fully specifying the base space of the elliptic fibrations. Put differently, those works consider an entire family of base spaces. We aim to support this data structure.

Note of caution: This data structure is subject to discussion. The exact implementation details may change drastically in the future. Use with care (as all experimental code, of course).

### Constructors

We currently support the following constructor:

`family_of_spaces`

— Method`family_of_spaces(coordinate_ring::MPolyRing, grading::Matrix{Int64}, dim::Int)`

Return a family of spaces that is (currently) used to build families of F-theory models, defined by using a family of base spaces for an elliptic fibration. It is specified by the following data:

- A polynomial ring. This may be thought of as the coordinate

ring of the generic member in this family of spaces.

- A grading for this polynomial ring. This may be thought of as

specifying certain line bundles on the generic member in this family of spaces. Of particular interest for F-theory is always the canonical bundle. For this reason, the first row is always thought of as grading the coordinate ring with regard to the canonical bundle. Or put differently, if a variable shares the weight 1 in the first row, then this means that we should think of this coordinate as a section of 1 times the canonical bundle.

- An integer, which specifies the dimension of the generic member

within this family of spaces.

Note that the coordinate ring can have strictly more variables than the dimension. This is a desired feature for most, if not all, F-theory literature constructions.

```
julia> coord_ring, _ = QQ["f", "g", "Kbar", "u"];
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> d = 3
3
julia> f = family_of_spaces(coord_ring, grading, d)
A family of spaces of dimension d = 3
```

### Attributes

We currently support the following attributes:

`coordinate_ring`

— Method`coordinate_ring(f::FamilyOfSpaces)`

Return the coordinate ring of a generic member of the family of spaces.

```
julia> ring, (f, g, Kbar, u) = QQ["f", "g", "Kbar", "u"]
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[f, g, Kbar, u])
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> d = 3
3
julia> f = family_of_spaces(ring, grading, d)
A family of spaces of dimension d = 3
julia> coordinate_ring(f)
Multivariate polynomial ring in 4 variables f, g, Kbar, u
over rational field
```

`weights`

— Method`weights(f::FamilyOfSpaces)`

Return the grading of the coordinate ring of a generic member of the family of spaces.

```
julia> ring, (f, g, Kbar, u) = QQ["f", "g", "Kbar", "u"]
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[f, g, Kbar, u])
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> d = 3
3
julia> f = family_of_spaces(ring, grading, d)
A family of spaces of dimension d = 3
julia> weights(f)
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
```

`dim`

— Method`dim(f::FamilyOfSpaces)`

Return the dimension of the generic member of the family of spaces.

```
julia> ring, (f, g, Kbar, u) = QQ["f", "g", "Kbar", "u"]
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[f, g, Kbar, u])
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> d = 3
3
julia> f = family_of_spaces(ring, grading, d)
A family of spaces of dimension d = 3
julia> dim(f)
3
```

`irrelevant_ideal`

— Method`irrelevant_ideal(f::FamilyOfSpaces)`

Return the equivalent of the irrelevant ideal for the generic member of the family of spaces.

```
julia> coord_ring, (f, g, Kbar, u) = QQ["f", "g", "Kbar", "u"]
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[f, g, Kbar, u])
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> d = 3
3
julia> f = family_of_spaces(coord_ring, grading, d)
A family of spaces of dimension d = 3
julia> irrelevant_ideal(f)
Ideal generated by
u
Kbar
g
f
```

`ideal_of_linear_relations`

— Method`ideal_of_linear_relations(f::FamilyOfSpaces)`

Return the equivalent of the ideal of linear relations for the generic member of the family of spaces.

```
julia> coord_ring, (f, g, Kbar, u) = QQ["f", "g", "Kbar", "u"]
(Multivariate polynomial ring in 4 variables over QQ, QQMPolyRingElem[f, g, Kbar, u])
julia> grading = [4 6 1 0; 0 0 0 1]
2×4 Matrix{Int64}:
4 6 1 0
0 0 0 1
julia> f = family_of_spaces(coord_ring, grading, 3)
A family of spaces of dimension d = 3
julia> ideal_of_linear_relations(f)
Ideal generated by
-5*f + 3*g + 2*Kbar
-3*f + 2*g
```

### Printouts

The user can decide to get information whenever a family of spaces is being used. To this end, one invokes `set_verbosity_level(:FTheoryModelPrinter, 1)`

. More information is available here.

## Attributes of all (or most) F-theory models

`ambient_space`

— Method`ambient_space(m::AbstractFTheoryModel)`

Return the ambient space of the F-theory model.

```
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> ambient_space(m)
A family of spaces of dimension d = 5
```

`base_space`

— Method`base_space(m::AbstractFTheoryModel)`

Return the base space of the F-theory model.

```
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> base_space(m)
A family of spaces of dimension d = 3
```

`fiber_ambient_space`

— Method`fiber_ambient_space(m::AbstractFTheoryModel)`

Return the fiber ambient space of an F-theory model.

```
julia> t = su5_tate_model_over_arbitrary_3d_base()
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base
julia> fiber_ambient_space(t)
Normal toric variety
```

`explicit_model_sections`

— Method`explicit_model_sections(m::AbstractFTheoryModel)`

Return the model sections in explicit form, that is as polynomials of the base space coordinates.

```
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1")
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> explicit_model_sections(t)
Dict{String, QQMPolyRingElem} with 9 entries:
"a6" => 0
"a21" => a21
"a3" => w^2*a32
"w" => w
"a2" => w*a21
"a1" => a1
"a4" => w^3*a43
"a43" => a43
"a32" => a32
```

`defining_section_parametrization`

— Method`defining_section_parametrization(m::AbstractFTheoryModel)`

Return the model sections in explicit form, that is as polynomials of the base space coordinates.

```
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1")
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> defining_section_parametrization(t)
Dict{String, MPolyRingElem} with 4 entries:
"a6" => 0
"a3" => w^2*a32
"a2" => w*a21
"a4" => w^3*a43
```

## Properties of all (or most) F-theory models

`is_base_space_fully_specified`

— Method`is_base_space_fully_specified(m::AbstractFTheoryModel)`

Return `true`

if the F-theory model has a concrete base space and `false`

otherwise.

```
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1")
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> is_base_space_fully_specified(t)
false
```

`is_partially_resolved`

— Method`is_partially_resolved(m::AbstractFTheoryModel)`

Return `true`

if resolution techniques were applied to the F-theory model, thereby potentially resolving its singularities. Otherwise, return `false`

.

```
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> is_partially_resolved(t)
false
julia> t2 = blow_up(t, ["x", "y", "x1"]; coordinate_name = "e1")
Partially resolved global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> is_partially_resolved(t2)
true
```

## Methods for all (or most) F-theory models

`blow_up`

— Method`blow_up(m::AbstractFTheoryModel, ideal_gens::Vector{String}; coordinate_name::String = "e")`

Resolve an F-theory model by blowing up a locus in the ambient space.

**Examples**

```
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> blow_up(t, ["x", "y", "x1"]; coordinate_name = "e1")
Partially resolved global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
```

Here is an example for a Weierstrass model.

**Examples**

```
julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety
julia> b = torusinvariant_prime_divisors(B2)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> w = literature_model(arxiv_id = "1208.2695", equation = "B.19", base_space = B2, model_sections = Dict("b" => b), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Weierstrass model over a concrete base -- U(1) Weierstrass model based on arXiv paper 1208.2695 Eq. (B.19)
julia> blow_up(w, ["x", "y", "x1"]; coordinate_name = "e1")
Partially resolved Weierstrass model over a concrete base -- U(1) Weierstrass model based on arXiv paper 1208.2695 Eq. (B.19)
```

`blow_up`

— Method`blow_up(m::AbstractFTheoryModel, I::MPolyIdeal; coordinate_name::String = "e")`

Resolve an F-theory model by blowing up a locus in the ambient space.

**Examples**

```
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> x1, x2, x3, x4, x, y, z = gens(cox_ring(ambient_space(t)))
7-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
x1
x2
x3
x4
x
y
z
julia> blow_up(t, ideal([x, y, x1]); coordinate_name = "e1")
Partially resolved global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
```

`blow_up`

— Method`blow_up(m::AbstractFTheoryModel, I::AbsIdealSheaf; coordinate_name::String = "e")`

Resolve an F-theory model by blowing up a locus in the ambient space. For this method, the blowup center is encoded by an ideal sheaf.

**Examples**

```
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> x1, x2, x3, x4, x, y, z = gens(cox_ring(ambient_space(t)))
7-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
x1
x2
x3
x4
x
y
z
julia> blowup_center = ideal_sheaf(ambient_space(t), ideal([x, y, x1]))
Sheaf of ideals
on normal toric variety
with restrictions
1: Ideal (x_5_1, x_4_1, x_1_1)
2: Ideal (1)
3: Ideal (x_5_3, x_4_3, x_1_3)
4: Ideal (x_5_4, x_4_4, x_1_4)
5: Ideal (1)
6: Ideal (1)
7: Ideal (1)
8: Ideal (1)
9: Ideal (1)
10: Ideal (1)
11: Ideal (1)
12: Ideal (1)
julia> blow_up(t, blowup_center; coordinate_name = "e1")
Partially resolved global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
```

`tune`

— Method`tune(m::AbstractFTheoryModel, p::MPolyRingElem; completeness_check::Bool = true)`

Tune an F-theory model by replacing the hypersurface equation by a custom (polynomial) equation. The latter can be any type of polynomial: a Tate polynomial, a Weierstrass polynomial or a general polynomial. We do not conduct checks to tell which type the provided polynomial is. Consequently, this tuning will always return a hypersurface model.

Note that there is less functionality for hypersurface models than for Weierstrass or Tate models. For instance, `singular_loci`

can (currently) not be computed for hypersurface models.

**Examples**

```
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Construction over concrete base may lead to singularity enhancement. Consider computing singular_loci. However, this may take time!
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> x1, x2, x3, x4, x, y, z = gens(parent(tate_polynomial(t)))
7-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
x1
x2
x3
x4
x
y
z
julia> new_tate_polynomial = x^3 - y^2 - x * y * z * x4^4
-x4^4*x*y*z + x^3 - y^2
julia> tuned_t = tune(t, new_tate_polynomial)
Hypersurface model over a concrete base
julia> hypersurface_equation(tuned_t) == new_tate_polynomial
true
julia> base_space(tuned_t) == base_space(t)
true
```

`put_over_concrete_base`

— Method`put_over_concrete_base(m::AbstractFTheoryModel, concrete_data::Dict{String, <:Any}; completeness_check::Bool = true)`

Put an F-theory model defined over a family of spaces over a concrete base.

Currently, this functionality is limited to Tate and Weierstrass models.

**Examples**

```
julia> t = literature_model(arxiv_id = "1109.3454", equation = "3.1", completeness_check = false)
Assuming that the first row of the given grading is the grading under Kbar
Global Tate model over a not fully specified base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> w_bundle = toric_line_bundle(torusinvariant_prime_divisors(B3)[1])
Toric line bundle on a normal toric variety
julia> kbar = anticanonical_bundle(B3)
Toric line bundle on a normal toric variety
julia> w = generic_section(w_bundle);
julia> a21 = generic_section(kbar^2 * w_bundle^(-1));
julia> a32 = generic_section(kbar^3 * w_bundle^(-2));
julia> a43 = generic_section(kbar^4 * w_bundle^(-3));
julia> t2 = put_over_concrete_base(t, Dict("base" => B3, "w" => w, "a21" => a21, "a32" => a32, "a43" => a43), completeness_check = false)
Global Tate model over a concrete base
```