# 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

### 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

### 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`classes_of_model_sections`

— Method`classes_of_model_sections(m::AbstractFTheoryModel)`

Return the divisor classes of all model sections.

```
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, defining_classes = 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> classes_of_model_sections(t)
Dict{String, ToricDivisorClass} with 9 entries:
"a21" => Divisor class on a normal toric variety
"a6" => Divisor class on a normal toric variety
"a3" => Divisor class on a normal toric variety
"w" => Divisor class on a normal toric variety
"a2" => Divisor class on a normal toric variety
"a1" => Divisor class on a normal toric variety
"a43" => Divisor class on a normal toric variety
"a4" => Divisor class on a normal toric variety
"a32" => Divisor class on a normal toric variety
```

This function is part of the experimental code in Oscar. Please read here for more details.

`defining_classes`

— Method`defining_classes(m::AbstractFTheoryModel)`

Return the defining divisor classes of the model in question.

```
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, defining_classes = 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> defining_classes(t)
Dict{String, ToricDivisorClass} with 2 entries:
"w" => Divisor class on a normal toric variety
"Kbar" => Divisor class on a normal toric variety
```

This function is part of the experimental code in Oscar. Please read here for more details.

`gauge_algebra`

— Method`gauge_algebra(m::AbstractFTheoryModel)`

Return the gauge algebra of the given model. If no gauge algebra is known, an error is raised. This information is typically available for all models, however.

```
julia> t = literature_model(arxiv_id = "1408.4808", equation = "3.190", type = "hypersurface")
Assuming that the first row of the given grading is the grading under Kbar
Hypersurface model over a not fully specified base
julia> gauge_algebra(t)
5-element Vector{LinearLieAlgebra{QQBarFieldElem}}:
Special linear Lie algebra of degree 2 over QQBar
Special linear Lie algebra of degree 2 over QQBar
Special linear Lie algebra of degree 2 over QQBar
Special linear Lie algebra of degree 2 over QQBar
Linear Lie algebra with 1x1 matrices over QQBar
```

This function is part of the experimental code in Oscar. Please read here for more details.

`global_gauge_quotients`

— Method`global_gauge_quotients(m::AbstractFTheoryModel)`

Return list of lists of matrices, where each list of matrices corresponds to a gauge factor of the same index given by gauge*algebra(m). These matrices are elements of the center of the corresponding gauge factor and quotienting by them replicates the action of some discrete group on the center of the lie algebra. This list combined with gauge*algebra(m) completely determines the gauge group of the model. If no gauge quotients are known, an error is raised.

```
julia> t = literature_model(arxiv_id = "1408.4808", equation = "3.190", type = "hypersurface")
Assuming that the first row of the given grading is the grading under Kbar
Hypersurface model over a not fully specified base
julia> global_gauge_quotients(t)
5-element Vector{Vector{String}}:
["-identity_matrix(C,2)", "-identity_matrix(C,2)"]
["-identity_matrix(C,2)"]
["-identity_matrix(C,2)"]
["-identity_matrix(C,2)", "-identity_matrix(C,2)"]
["-identity_matrix(C,1)"]
```

This function is part of the experimental code in Oscar. Please read here for more details.

## 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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, defining_classes = 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

## 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, defining_classes = 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, defining_classes = 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)
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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, defining_classes = 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)
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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, defining_classes = 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)
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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, defining_classes = 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
```

This function is part of the experimental code in Oscar. Please read here for more details.

`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
```

This function is part of the experimental code in Oscar. Please read here for more details.