Resolving F-Theory Models
In F-theory, the standard approach to handling singular geometries is to replace them with smooth ones via crepant resolutions. This process preserves the Calabi–Yau condition and ensures the correct encoding of physical data. However, several important caveats apply:
- Not all singularities admit crepant resolutions; some singularities are obstructed from being resolved without violating the Calabi–Yau condition.
- No general algorithm is known for computing a crepant resolution of a given singular geometry. In practice, one applies all known resolution techniques, guided by mathematical structure and physical expectations. A particularly prominent strategy is a sequence of blowups, which we discuss below.
After applying a resolution strategy, one obtains a partially resolved model. For the reasons stated above, we do currently no verify whether the model has been fully resolved — i.e., whether all resolvable singularities have been removed crepantly to the extent possible. Instead, the following method returns true
if resolution techniques were applied and false
otherwise.
is_partially_resolved
— Methodis_partially_resolved(m::AbstractFTheoryModel)
Return true
if resolution techniques were applied to the F-theory model, thereby potentially resolving its singularities. Otherwise, return false
.
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)
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.
Blowups
Manually Applying Individual Blowups
You can execute individual blowups, whether toric or not, using the following methods:
blow_up
— Methodblow_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)
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)
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
— Methodblow_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)
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(coordinate_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
— Methodblow_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)
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(coordinate_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, simplicial 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.
Registering And Extracting Known Resolution Sequences
Typically, a full resolution requires a sequence of blowups. The known (weighted) blowup resolution sequences, can be accessed with the following methods.
resolutions
— Methodresolutions(m::AbstractFTheoryModel)
Return resolutions
of the F-theory model if known, otherwise throw an error.
See Registering And Extracting Known Resolution Sequences for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> resolutions(m)
1-element Vector{Tuple{Vector{Vector{String}}, Vector{String}}}:
([["x", "y", "w"], ["y", "e1"], ["x", "e4"], ["y", "e2"], ["x", "y"]], ["e1", "e4", "e2", "e3", "s"])
This function is part of the experimental code in Oscar. Please read here for more details.
weighted_resolutions
— Methodweighted_resolutions(m::AbstractFTheoryModel)
Return weighted_resolutions
of the F-theory model if known, otherwise throw an error.
See Registering And Extracting Known Resolution Sequences for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> weighted_resolutions(m)
1-element Vector{Tuple{Vector{Tuple{Vector{String}, Vector{Int64}}}, Vector{String}}}:
([(["x", "y", "w"], [1, 1, 1]), (["x", "y", "w"], [1, 2, 1]), (["x", "y", "w"], [2, 2, 1]), (["x", "y", "w"], [2, 3, 1]), (["x", "y"], [1, 1])], ["e1", "e4", "e2", "e3", "s"])
This function is part of the experimental code in Oscar. Please read here for more details.
If beyond this, a resolution sequence is known, it is advantageous to register it with the model:
add_resolution!
— Methodadd_resolution!(m::AbstractFTheoryModel, centers::Vector{Vector{String}}, exceptionals::Vector{String})
Add a resolution for a model.
See Registering And Extracting Known Resolution Sequences for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> add_resolution!(m, [["x", "y", "w"], ["y", "e1"], ["x", "e4"], ["y", "e2"], ["x", "y"]], ["e1", "e4", "e2", "e3", "s"])
julia> length(resolutions(m))
1
This function is part of the experimental code in Oscar. Please read here for more details.
add_weighted_resolution!
— Methodadd_weighted_resolution!(m::AbstractFTheoryModel, centers::Vector{Tuple{Vector{String}, Vector{Int64}}}, exceptionals::Vector{String})
Add a weighted resolution for a model.
See Registering And Extracting Known Resolution Sequences for more details.
Examples
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> Kbar = anticanonical_divisor_class(B3)
Divisor class on a normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> centers = [(["x", "y", "w"], [1, 1, 1]), (["x", "y", "w"], [1, 2, 1]), (["x", "y", "w"], [2, 2, 1]), (["x", "y", "w"], [2, 3, 1]), (["x", "y"], [1, 1])];
julia> exceptionals = ["e1", "e4", "e2", "e3", "s"];
julia> add_weighted_resolution!(m, centers, exceptionals)
julia> length(weighted_resolutions(m))
1
This function is part of the experimental code in Oscar. Please read here for more details.
Once registered, the following method applies the complete sequence of blowups in a single step:
resolve
— Methodresolve(m::AbstractFTheoryModel, index::Int)
Resolve a model with the index-th resolution that is known.
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)
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> t2 = resolve(t, 1)
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> coordinate_ring(ambient_space(t2))
Multivariate polynomial ring in 12 variables over QQ graded by
x1 -> [1 0 0 0 0 0 0]
x2 -> [0 1 0 0 0 0 0]
x3 -> [0 1 0 0 0 0 0]
x4 -> [0 1 0 0 0 0 0]
x -> [0 0 1 0 0 0 0]
y -> [0 0 0 1 0 0 0]
z -> [0 0 0 0 1 0 0]
e1 -> [0 0 0 0 0 1 0]
e4 -> [0 0 0 0 0 0 1]
e2 -> [-1 -3 -1 1 -1 -1 0]
e3 -> [0 4 1 -1 1 0 -1]
s -> [2 6 -1 0 2 1 1]
julia> w2 = 2 * torusinvariant_prime_divisors(B3)[1]
Torus-invariant, non-prime divisor on a normal toric variety
julia> t3 = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, defining_classes = Dict("w" => w2), completeness_check = false)
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> t4 = resolve(t3, 1)
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.
Resolution Metadata Functions
These methods retrieve known resolution associated section data.
resolution_zero_sections
— Methodresolution_zero_sections(m::AbstractFTheoryModel)
Return resolution_zero_sections
of the F-theory model if known, otherwise throw an error.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> resolution_zero_sections(m)
1-element Vector{Vector{Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}}:
[[1, 1, 0], [1, 1, w], [1, 1], [1, 1], [1, 1], [1, 1]]
This function is part of the experimental code in Oscar. Please read here for more details.
resolution_generating_sections
— Methodresolution_generating_sections(m::AbstractFTheoryModel)
Return resolution_generating_sections
of the F-theory model if known, otherwise throw an error.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> resolution_generating_sections(m)
1-element Vector{Vector{Vector{Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}}}:
[[[0, 0, 1], [0, 0, 1], [0, 1], [0, 1], [0, 1], [a32, a43]]]
This function is part of the experimental code in Oscar. Please read here for more details.
weighted_resolution_zero_sections
— Methodweighted_resolution_zero_sections(m::AbstractFTheoryModel)
Return weighted_resolution_zero_sections
of the F-theory model if known, otherwise throw an error.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> weighted_resolution_zero_sections(m)
1-element Vector{Vector{Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}}:
[[1, 1, 0], [1, 1, w], [1, 1, w], [1, 1, w], [1, 1, w], [1, 1]]
This function is part of the experimental code in Oscar. Please read here for more details.
weighted_resolution_generating_sections
— Methodweighted_resolution_generating_sections(m::AbstractFTheoryModel)
Return weighted_resolution_generating_sections
of the F-theory model if known, otherwise throw an error.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> weighted_resolution_generating_sections(m)
1-element Vector{Vector{Vector{Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}}}:
[[[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1], [a32, a43]]]
This function is part of the experimental code in Oscar. Please read here for more details.
You can also add to this information, if more generating sections or zero sections are known.
add_resolution_zero_section!
— Methodadd_resolution_zero_section!(m::AbstractFTheoryModel, addition::Vector{Vector{String}})
Add a resolution zero section for a model.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> add_resolution_zero_section!(m, [["1", "1", "0"], ["1", "1", "w"], ["1", "1"], ["1", "1"], ["1", "1"], ["1", "1"]])
julia> length(resolution_zero_sections(m))
1
This function is part of the experimental code in Oscar. Please read here for more details.
add_resolution_generating_section!
— Methodadd_resolution_generating_section!(m::AbstractFTheoryModel, addition::Vector{Vector{Vector{String}}})
Add a resolution generating section for a model.
See Resolution Metadata Functions for more details.
Examples
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1")
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> add_resolution_generating_section!(m, [[["0", "0", "1"], ["0", "0", "1"], ["0", "1"], ["0", "1"], ["0", "1"], ["a32", "a43"]]])
julia> length(resolution_generating_sections(m))
1
This function is part of the experimental code in Oscar. Please read here for more details.
add_weighted_resolution_zero_section!
— Methodadd_weighted_resolution_zero_section!(m::AbstractFTheoryModel, addition::Vector{Vector{String}})
Add a weighted resolution zero section for a model.
See Resolution Metadata Functions for more details.
Examples
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> Kbar = anticanonical_divisor_class(B3)
Divisor class on a normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> add_weighted_resolution_zero_section!(m, [["1", "1", "0"], ["1", "1", "x1"], ["1", "1", "x1"], ["1", "1", "x1"], ["1", "1", "x1"], ["1", "1"]])
julia> length(weighted_resolution_zero_sections(m))
1
This function is part of the experimental code in Oscar. Please read here for more details.
add_weighted_resolution_generating_section!
— Methodadd_weighted_resolution_generating_section!(m::AbstractFTheoryModel, addition::Vector{Vector{Vector{String}}})
Add a weighted resolution generating section for a model.
See Resolution Metadata Functions for more details.
Examples
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> Kbar = anticanonical_divisor_class(B3)
Divisor class on a normal toric variety
julia> w = torusinvariant_prime_divisors(B3)[1]
Torus-invariant, prime divisor on a normal toric variety
julia> m = literature_model(arxiv_id = "1109.3454", equation = "3.1", base_space = B3, model_sections = Dict("w" => w), completeness_check = false)
Global Tate model over a concrete base -- SU(5)xU(1) restricted Tate model based on arXiv paper 1109.3454 Eq. (3.1)
julia> addition = [[["0", "0", "1"], ["0", "0", "1"], ["0", "0", "1"], ["0", "0", "1"], ["0", "0", "1"], ["1980*x1^10", "0", "0"]]];
julia> add_weighted_resolution_generating_section!(m, addition)
julia> length(weighted_resolution_generating_sections(m))
2
This function is part of the experimental code in Oscar. Please read here for more details.
Exceptional Divisors
The following methods return information on exceptional divisors introduced by toric blowups. Therefore, these attributes are only available for models build over a concrete toric base space.
exceptional_classes
— Methodexceptional_classes(m::AbstractFTheoryModel)
Return the cohomology classes of the exceptional toric divisors of a model as a vector of cohomology classes in the toric ambient space. This information is only supported for models over a concrete base that is a normal toric variety, but is always available in this case. After a toric blow up this information is updated.
See Exceptional Divisors for more details.
Examples
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> Kbar = anticanonical_divisor_class(B3)
Divisor class on a normal toric variety
julia> foah11_B3 = literature_model(arxiv_id = "1408.4808", equation = "3.142", type = "hypersurface", base_space = B3, defining_classes = Dict("s7" => Kbar, "s9" => Kbar))
Hypersurface model over a concrete base
julia> exceptional_classes(foah11_B3)
4-element Vector{CohomologyClass}:
Cohomology class on a normal toric variety given by e1
Cohomology class on a normal toric variety given by e2
Cohomology class on a normal toric variety given by e3
Cohomology class on a normal toric variety given by e4
This function is part of the experimental code in Oscar. Please read here for more details.
exceptional_divisor_indices
— Methodexceptional_divisor_indices(m::AbstractFTheoryModel)
Return the indices of the generators of the Cox ring of the ambient space which correspond to exceptional divisors. This information is only supported for models over a concrete base that is a normal toric variety, but is always available in this case. After a toric blow up this information is updated.
See Exceptional Divisors for more details.
Examples
julia> B3 = projective_space(NormalToricVariety, 3)
Normal toric variety
julia> Kbar = anticanonical_divisor_class(B3)
Divisor class on a normal toric variety
julia> foah11_B3 = literature_model(arxiv_id = "1408.4808", equation = "3.142", type = "hypersurface", base_space = B3, defining_classes = Dict("s7" => Kbar, "s9" => Kbar))
Hypersurface model over a concrete base
julia> exceptional_divisor_indices(foah11_B3)
4-element Vector{Int64}:
8
9
10
11
This function is part of the experimental code in Oscar. Please read here for more details.
Analyzing the Resolved Fiber Structure
Note: This functionality is currently only supported for Global Tate Models.
After resolution, one typically studies the structure of the resolved fibers to extract intersection numbers and representation-theoretic data. The method below computes the fiber components and their intersection graph in codimension one of the base space:
analyze_fibers
— Methodanalyze_fibers(model::GlobalTateModel, centers::Vector{<:Vector{<:Integer}})
Determine the fiber of a (singular) global Tate model over a particular base locus.
This method may run for very long time and is currently not tested as part of the regular OSCAR CI due to its excessive run times.
This function is part of the experimental code in Oscar. Please read here for more details.