Hypersurface Models

A hypersurface model is a description of an elliptic fibration whose total space is defined as the vanishing locus of a single polynomial in a suitable ambient space. Prominent examples include Weierstrass Models and Global Tate Models. Our algorithmic framework is rooted in the constructions presented in [KM-POPR15].


What is a Hypersurface Model?

Every elliptic fibration is birationally equivalent to an elliptic fibration represented as Weierstrass model (in characteristics other than 2 or 3). However, for practical purposes it is often more convenient to work with alternative descriptions. This is the main reason for working with Global Tate Models, and extends more generally to the constructions presented in [KM-POPR15]. Our implementation is focused on exactly these constructions.

The setup of a hypersurface model following [KM-POPR15] consists of the following ingredients:

  • A base space $B$, over which the elliptic fibration is defined.
  • A fiber ambient space $F$, in which the elliptic fiber appears as a hypersurface.
  • Two divisor classes $D_1$ and $D_2$ in $\text{Cl}(B)$, and a choice of two homogeneous coordinates of the fiber ambient space $F$. These two coordinates transform over the base $B$ as sections of the line bundles associated to $D_1$ and $D_2$, respectively. All remaining homogeneous coordinates of $F$ transform as sections of the trivial line bundle over $B$.
  • A hypersurface equation defining the total space of the elliptic fibration as a section of the anti-canonical bundle $\overline{K}_A$ of the full ambient space $A$, which combines both the fiber ambient space $F$ and the base space $B$. This ensures that the hypersurface equation is Calabi–Yau.

It is worth noting that any elliptic fibration, for which the fiber ambient space is toric, can be cast into this form [KM-POPR15]. Consequently, this approach allows for a uniform interface for constructing and manipulating hypersurface models in a way that generalizes Global Tate Models and Weierstrass Models naturally. Our standing assumption is therefore that the fiber ambient space $F$ is toric.


Constructing Hypersurface Models

Unspecified Base Spaces

We support the construction of hypersurface models over unspecified base spaces, though computational capabilities are significantly limited in this setting. These models can be constructed using the following interface:

hypersurface_modelMethod
hypersurface_model(auxiliary_base_vars::Vector{String}, auxiliary_base_grading::Matrix{Int64}, d::Int, fiber_ambient_space::NormalToricVariety, fiber_twist_divisor_classes::Vector{Vector{Int64}}, p::MPolyRingElem)

Construct a hypersurface model over an unspecified base space by defining a family of base varieties via auxiliary data.

The base is represented by:

  • auxiliary_base_vars: Names of the homogeneous coordinates in the Cox ring of a generic base variety.
  • auxiliary_base_grading: A grading matrix specifying the line bundle degrees of these coordinates.
  • d: The (Krull) dimension of the base.

Additionally, the fiber data must be provided:

  • fiber_ambient_space: A toric variety defining the ambient space for the fiber.

  • fiber_twist_divisor_classes — A list of weight vectors indicating how fiber coordinates transform under the base line bundles.

    • If two vectors are provided, they define the line bundle charges of the first two fiber coordinates; all remaining fiber coordinates are assumed to be base-trivially fibered (i.e., constant over the base).
    • Alternatively, one weight vector can be provided per fiber coordinate, giving full control over how each fiber coordinate twists over the base.
  • p: A multivariate polynomial defining the hypersurface equation in the total ambient space.

To ensure that the hypersurface is Calabi–Yau, the equation p must define a section of the anti-canonical bundle of the total ambient space. If the provided grading matrix does not include this class, a new grading row corresponding to the anti-canonical class is automatically added. By convention, this first row corresponds to $\overline{K}_A$ and the associated variable is named "Kbar".

For convenience, fiber_twist_divisor_classes can also be passed as a ZZMatrix instead of a Vector{Vector{Int64}}.

For a full explanation of hypersurface models, see Hypersurface Models.

Examples

julia> auxiliary_base_vars = ["a1", "a21", "a32", "a43", "a65", "w"];

julia> auxiliary_base_grading = [1 2 3 4 6 0; 0 -1 -2 -3 -5 1]
2×6 Matrix{Int64}:
 1   2   3   4   6  0
 0  -1  -2  -3  -5  1

julia> D1 = [4,0]
2-element Vector{Int64}:
 4
 0

julia> D2 = [6,0]
2-element Vector{Int64}:
 6
 0
 
julia> d = 3
3

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> auxiliary_ambient_ring, (a1, a21, a32, a43, a65, w, x, y, z)  = QQ[:a1, :a21, :a32, :a43, :a65, :w, :x, :y, :z]
(Multivariate polynomial ring in 9 variables over QQ, QQMPolyRingElem[a1, a21, a32, a43, a65, w, x, y, z])

julia> p = x^3 - y^2 - x * y * z * a1 + x^2 * z^2 * a21 * w - y * z^3 * a32 * w^2 + x * z^4 * a43 * w^3 + z^6 * a65 * w^5
-a1*x*y*z + a21*w*x^2*z^2 - a32*w^2*y*z^3 + a43*w^3*x*z^4 + a65*w^5*z^6 + x^3 - y^2

julia> h = hypersurface_model(auxiliary_base_vars, auxiliary_base_grading, d, fiber_ambient_space, [D1, D2], p)
Assuming that the first row of the given grading is the grading under Kbar

Hypersurface model over a not fully specified base
Experimental

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

source
hypersurface_modelMethod
hypersurface_model(auxiliary_base_vars::Vector{String}, auxiliary_base_grading::Matrix{Int64}, d::Int, fiber_ambient_space::NormalToricVariety, fiber_twist_divisor_classes::Vector{Vector{Int64}}, indices::Vector{Int}, p::MPolyRingElem)

Construct a hypersurface model over an unspecified base space by defining a family of base varieties via auxiliary data.

The base is represented by:

  • auxiliary_base_vars: Names of the homogeneous coordinates in the Cox ring of a generic base variety.
  • auxiliary_base_grading: A grading matrix specifying the line bundle degrees of these coordinates.
  • d: The (Krull) dimension of the base.

Additionally, the fiber data must be provided:

  • fiber_ambient_space: A toric variety defining the ambient space for the fiber.
  • fiber_twist_divisor_classes: A list of two weight vectors specifying how the fiber coordinates at the given indices transform under the base line bundles.
  • p: A multivariate polynomial defining the hypersurface equation in the total ambient space.

To ensure that the hypersurface is Calabi–Yau, the equation p must define a section of the anti-canonical bundle of the total ambient space. If the provided grading matrix does not include this class, a new grading row corresponding to the anti-canonical class is automatically added. By convention, this first row corresponds to $\overline{K}_A$ and the associated variable is named "Kbar".

For convenience, fiber_twist_divisor_classes can also be provided as ZZMatrix.

For a full explanation of hypersurface models, see Hypersurface Models.

Examples

julia> auxiliary_base_vars = ["a1", "a21", "a32", "a43", "a65", "w"];

julia> auxiliary_base_grading = [1 2 3 4 6 0; 0 -1 -2 -3 -5 1]
2×6 Matrix{Int64}:
 1   2   3   4   6  0
 0  -1  -2  -3  -5  1

julia> D1 = [4,0]
2-element Vector{Int64}:
 4
 0

julia> D2 = [6,0]
2-element Vector{Int64}:
 6
 0
 
julia> d = 3
3

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> auxiliary_ambient_ring, (a1, a21, a32, a43, a65, w, x, y, z)  = QQ[:a1, :a21, :a32, :a43, :a65, :w, :x, :y, :z]
(Multivariate polynomial ring in 9 variables over QQ, QQMPolyRingElem[a1, a21, a32, a43, a65, w, x, y, z])

julia> p = x^3 - y^2 - x * y * z * a1 + x^2 * z^2 * a21 * w - y * z^3 * a32 * w^2 + x * z^4 * a43 * w^3 + z^6 * a65 * w^5
-a1*x*y*z + a21*w*x^2*z^2 - a32*w^2*y*z^3 + a43*w^3*x*z^4 + a65*w^5*z^6 + x^3 - y^2

julia> h = hypersurface_model(auxiliary_base_vars, auxiliary_base_grading, d, fiber_ambient_space, [D1, D2], [1, 2], p)
Assuming that the first row of the given grading is the grading under Kbar

Hypersurface model over a not fully specified base
Experimental

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

source

Concrete Toric Base Spaces

Full support exists for constructing hypersurface models over concrete, complete toric base spaces. Completeness is a technical assumption: it ensures that the set of global sections of a line bundle forms a finite-dimensional vector space, enabling OSCAR to handle these sets efficiently. In the future, this restriction may be relaxed. For now, completeness checks—though sometimes slow—are performed in many methods involving hypersurface models. To skip them and improve performance, use the optional keyword:

completeness_check = false

We proceed under the assumption that the base space is a fixed, complete toric variety.

Under this assumption, a toric ambient space $A$ can be constructed algorithmically. Similar to our approach for Weierstrass Models and Global Tate Models, our approach is optimized for performance. In general, several such ambient spaces $A$ may exist. Instead of enumerating a large number of such ambient spaces, we merely compute a single one. As such, the ambient space $A$ computed by our methods may differ from explicit choices in the literature. However, the obtained space $A$ is guaranteed to be consistent with the fibration structure.

Users can construct hypersurface models over such concrete toric bases with the following constructor:

hypersurface_modelMethod
hypersurface_model(base::NormalToricVariety, fiber_ambient_space::NormalToricVariety, fiber_twist_divisor_classes::Vector{ToricDivisorClass}, p::MPolyRingElem; completeness_check::Bool = true)

Construct a hypersurface model where fiber coordinates transform as sections of line bundles over the base.

  • If two fiber_twist_divisor_classes are provided, they specify the line bundle charges of the first two fiber coordinates. All remaining fiber coordinates are treated as base-trivial (i.e., constant over the base).
  • Alternatively, a fiber_twist_divisor_class can be given for each fiber coordinate, allowing full control over how the entire fiber ambient space twists over the base.

The hypersurface equation p defines a section of the anti-canonical bundle of the total ambient space and may also be passed as a string for convenience.

For a full explanation of hypersurface models, see Hypersurface Models.

Examples

julia> b = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> new_gens = string.(vcat(gens(cox_ring(b)), gens(cox_ring(fiber_ambient_space))))
6-element Vector{String}:
 "x1"
 "x2"
 "x3"
 "x"
 "y"
 "z"

julia> ambient_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, new_gens, cached=false)
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 - y^2 + x1^12 * x * z^4 + x2^18 * z^6 + 13 * x3^3*x*y*z
x1^12*x*z^4 + x2^18*z^6 + 13*x3^3*x*y*z + x^3 - y^2

julia> h = hypersurface_model(b, fiber_ambient_space, [D1, D2], p; completeness_check = false)
Hypersurface model over a concrete base

julia> h2 = hypersurface_model(b, fiber_ambient_space, [D1, D2], string(p); completeness_check = false)
Hypersurface model over a concrete base
Experimental

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

source
hypersurface_modelMethod
hypersurface_model(base::NormalToricVariety, fiber_ambient_space::NormalToricVariety, fiber_twist_divisor_classes::Vector{ToricDivisorClass}, indices::Vector{Int}, p::MPolyRingElem; completeness_check::Bool = true)

Construct a hypersurface model where the two fiber coordinates at the given indices transform as sections of the line bundles associated to the specified base divisor classes.

The polynomial p, which encodes the hypersurface equation, can also be passed as a string.

For a full explanation of hypersurface models, see Hypersurface Models.

Examples

julia> b = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> new_gens = string.(vcat(gens(cox_ring(b)), gens(cox_ring(fiber_ambient_space))))
6-element Vector{String}:
 "x1"
 "x2"
 "x3"
 "x"
 "y"
 "z"

julia> ambient_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, new_gens, cached=false)
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 - y^2 + x1^12 * x * z^4 + x2^18 * z^6 + 13 * x3^3*x*y*z
x1^12*x*z^4 + x2^18*z^6 + 13*x3^3*x*y*z + x^3 - y^2

julia> h = hypersurface_model(b, fiber_ambient_space, [D1, D2], [1, 2], p; completeness_check = false)
Hypersurface model over a concrete base

julia> h2 = hypersurface_model(b, fiber_ambient_space, [D1, D2], [1, 2], string(p); completeness_check = false)
Hypersurface model over a concrete base
Experimental

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

source

Famous Hypersurface Models

Several hypersurface models have gained popularity in the F-theory community. These models are often associated with specific publications and may be informally referred to by author names or recognizable keywords. For these established constructions, we provide support through the specialized literature_model interface, which is discussed on the page Literature Models.


Attributes of Hypersurface Models

Hypersurface models represent an elliptic fibration as a hypersurface in an ambient space. While different types of models may vary in implementation, they share a broadly similar structure. Common attributes—such as base_space, ambient_space, and fiber_ambient_space—are documented on the page Functionality for all F-theory models.

The following attributes are specific to hypersurface models and do not generally apply to other representations (such as Weierstrass Models or Global Tate Models):

hypersurface_equationMethod
hypersurface_equation(h::HypersurfaceModel)

Return the hypersurface equation of the hypersurface model.

Examples

julia> b = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> new_gens = string.(vcat(gens(cox_ring(b)), gens(cox_ring(fiber_ambient_space))));

julia> ambient_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, new_gens, cached=false)
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 - y^2 + x1^12 * x * z^4 + x2^18 * z^6 + 13 * x3^3*x*y*z
x1^12*x*z^4 + x2^18*z^6 + 13*x3^3*x*y*z + x^3 - y^2

julia> h = hypersurface_model(b, fiber_ambient_space, [D1, D2], p; completeness_check = false)
Hypersurface model over a concrete base

julia> hypersurface_equation(h)
x1^12*x*z^4 + x2^18*z^6 + 13*x3^3*x*y*z + x^3 - y^2
Experimental

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

source
calabi_yau_hypersurfaceMethod
calabi_yau_hypersurface(h::HypersurfaceModel)

Return the Calabi–Yau hypersurface that defines the hypersurface model as a closed subvariety of its toric ambient space.

Examples

julia> b = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(b)
Divisor class on a normal toric variety

julia> new_gens = string.(vcat(gens(cox_ring(b)), gens(cox_ring(fiber_ambient_space))));

julia> ambient_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, new_gens, cached=false)
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 - y^2 + x1^12 * x * z^4 + x2^18 * z^6 + 13 * x3^3*x*y*z
x1^12*x*z^4 + x2^18*z^6 + 13*x3^3*x*y*z + x^3 - y^2

julia> h = hypersurface_model(b, fiber_ambient_space, [D1, D2], p; completeness_check = false)
Hypersurface model over a concrete base

julia> calabi_yau_hypersurface(h)
Closed subvariety of a normal toric variety
Experimental

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

source
weierstrass_modelMethod
weierstrass_model(h::HypersurfaceModel)

Return the Weierstrass model corresponding to the given hypersurface model, if known.

In the example below, we construct a hypersurface model and its corresponding Weierstrass model (see BMT25 for background), and then establish the relationship between the two models.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> weier_f = 1//48*(-(28*x1*x2^5 + 169*x3^6)^2 + 24*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> weier_g = 1//864*(216*x1^4*x2^8*x3^6 + (28*x1*x2^5 + 169*x3^6)^3 - 36*(28*x1*x2^5 + 169*x3^6)*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> w = weierstrass_model(B2, weier_f, weier_g; completeness_check = false)
Weierstrass model over a concrete base

julia> set_weierstrass_model(h, w)

julia> weierstrass_model(h) === w
true
Experimental

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

source
global_tate_modelMethod
global_tate_model(h::HypersurfaceModel)

Return the global Tate model corresponding to the given hypersurface model, if known.

In the example below, we construct a hypersurface model and its corresponding global Tate model (see BMT25 for background), and then establish the relationship between the two models.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> a1 = 13 * x3^3;

julia> a2 = 7 * x1 * x2^5;

julia> a3 = x1^2 * x2^4 * x3^3;

julia> a4 = x1^3 * (x2 + x3)^9;

julia> a6 = zero(cox_ring(B2));

julia> t = global_tate_model(B2, [a1, a2, a3, a4, a6])
Global Tate model over a concrete base

julia> set_global_tate_model(h, t)

julia> global_tate_model(h) === t
true
Experimental

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

source

Currently, we do not provide automatic functionality to convert a hypersurface model into a Weierstrass Model or a Global Tate Model. However, such relations may be known or derived in the literature. If desired, users can manually establish the connection using the functions below:

set_weierstrass_modelMethod
set_weierstrass_model(h::HypersurfaceModel, w::WeierstrassModel)

Assigns a Weierstrass model to the given hypersurface model.

In the example below, we construct a hypersurface model and its corresponding Weierstrass model (see BMT25 for background), and demonstrate how to associate them using this function.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> weier_f = 1//48*(-(28*x1*x2^5 + 169*x3^6)^2 + 24*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> weier_g = 1//864*(216*x1^4*x2^8*x3^6 + (28*x1*x2^5 + 169*x3^6)^3 - 36*(28*x1*x2^5 + 169*x3^6)*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> w = weierstrass_model(B2, weier_f, weier_g; completeness_check = false)
Weierstrass model over a concrete base

julia> set_weierstrass_model(h, w)
Experimental

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

source
set_global_tate_modelMethod
set_global_tate_model(h::HypersurfaceModel, w::GlobalTateModel)

Assigns a global Tate model to the given hypersurface model.

In the example below, we construct a hypersurface model and its corresponding global Tate model (see BMT25 for background), and demonstrate how to associate them using this function.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> a1 = 13 * x3^3;

julia> a2 = 7 * x1 * x2^5;

julia> a3 = x1^2 * x2^4 * x3^3;

julia> a4 = x1^3 * (x2 + x3)^9;

julia> a6 = zero(cox_ring(B2));

julia> t = global_tate_model(B2, [a1, a2, a3, a4, a6])
Global Tate model over a concrete base

julia> set_global_tate_model(h, t)
Experimental

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

source

Singularities in Hypersurface Models

Let us emphasize again that in F-theory, singular elliptic fibrations are of central importance (cf. [Wei18] and references therein): singularities signal non-trivial physics.

Detecting Singularities

A key step in analyzing an elliptic fibration is identifying its singular fibers—those whose structure degenerates over certain loci in the base. The discriminant locus is the subset of the base space over which the fibers degenerate.

For hypersurface models, we provide this functionality only if corresponding Weierstrass Models or Global Tate Models are known.

discriminantMethod
discriminant(h::HypersurfaceModel)

Return the discriminant $\Delta = 4f^3 + 27g^2$ of the Weierstrass model associated with the given hypersurface model.

Raises an error if no such Weierstrass model is known.

In the example below, we construct a hypersurface model and its corresponding Weierstrass model (see BMT25 for background), in order to demonstrate this functionality.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> weier_f = 1//48*(-(28*x1*x2^5 + 169*x3^6)^2 + 24*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> weier_g = 1//864*(216*x1^4*x2^8*x3^6 + (28*x1*x2^5 + 169*x3^6)^3 - 36*(28*x1*x2^5 + 169*x3^6)*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> w = weierstrass_model(B2, weier_f, weier_g; completeness_check = false)
Weierstrass model over a concrete base

julia> set_weierstrass_model(h, w)

julia> degree(discriminant(h))
Abelian group element [36]
Experimental

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

source

More informative than the discriminant itself is its decomposition into irreducible components. Each component corresponds to a locus where the fiber exhibits a distinct singularity structure. These can be classified using:

singular_lociMethod
singular_loci(h::HypersurfaceModel)

Return the singular loci of the Weierstrass model equivalent to the given hypersurface model, along with the order of vanishing of $(f, g, \Delta)$ at each locus and the corresponding refined Tate fiber type. See singular_loci(w::WeierstrassModel) for more details.

Raises an error if no such Weierstrass model is known.

In the example below, we construct a hypersurface model and its corresponding Weierstrass model (see BMT25 for background), in order to demonstrate this functionality.

Warning

The classification of singularities is performed using a Monte Carlo algorithm, involving randomized sampling. While reliable in practice, this probabilistic method may occasionally yield non-deterministic results.

Examples

julia> B2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> fiber_ambient_space = weighted_projective_space(NormalToricVariety, [2,3,1])
Normal toric variety

julia> set_coordinate_names(fiber_ambient_space, ["x", "y", "z"])

julia> D1 = 2 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> D2 = 3 * anticanonical_divisor_class(B2)
Divisor class on a normal toric variety

julia> amb_ring, (x1, x2, x3, x, y, z) = polynomial_ring(QQ, ["x1", "x2", "x3", "x", "y", "z"])
(Multivariate polynomial ring in 6 variables over QQ, QQMPolyRingElem[x1, x2, x3, x, y, z])

julia> p = x^3 + 7*x1*x2^5*x^2*z^2 + x1^3*(x2 + x3)^9*x*z^4 - y^2 - 13*x3^3*x*y*z - x1^2*x2^4*x3^3*y*z^3;

julia> h = hypersurface_model(B2, fiber_ambient_space, [D1, D2], p, completeness_check = false)
Hypersurface model over a concrete base

julia> x1, x2, x3 = gens(cox_ring(B2));

julia> weier_f = 1//48*(-(28*x1*x2^5 + 169*x3^6)^2 + 24*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> weier_g = 1//864*(216*x1^4*x2^8*x3^6 + (28*x1*x2^5 + 169*x3^6)^3 - 36*(28*x1*x2^5 + 169*x3^6)*(2*x1^3*(x2 + x3)^9 + 13*x1^2*x2^4*x3^6));

julia> w = weierstrass_model(B2, weier_f, weier_g; completeness_check = false)
Weierstrass model over a concrete base

julia> set_weierstrass_model(h, w)

julia> length(singular_loci(h))
2
Experimental

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

source

We discuss singularities in greater depth—including how to deform models to achieve a desired singularity structure and how to resolve them—in Resolving F-Theory Models.