Class EH_atlas


Code: embedded/roothalf/EH_atlas.mpl

An instance of this class represents an approximation to the isomorphism $HX(a)\to EX^*$, together with associated data.

Extends: E_atlas
Constructor: `new/EH_atlas`()

Field: a_H::RR0

This is an approximation to the number a such that $EX^*$ is isomorphic to $HX(a)$

Field: log_rescale_z

This is an approximation to the function $f$ such that $\exp(2f)$ times the metric tensor inherited from $\mathbb{R}^4$ has curvature equal to $-1$. It is represented here as a function from the $z$-plane to $\mathbb{R}$. It should be set using the set_rescale method, or one of the find_rescale_* methods.

Field: log_rescale_x

This is an approximation to the function $f$ such that $\exp(2f)$ times the metric tensor inherited from $\mathbb{R}^4$ has curvature equal to $-1$. It is represented here as a function from $\mathbb{R}^4$ to $\mathbb{R}$. It should be set using the set_rescale method, or one of the find_rescale_* methods.

Field: rescale_z

This is the composite of $\exp$ with the map in the log_rescale_z field. It should be set using the set_rescale method.

Field: rescale_x

This is the composite of $\exp$ with the map in the log_rescale_x field. It should be set using the set_rescale method, or one of the find_rescale_* methods.

Field: rescale_type::string

This should be "pade" or "poly", to specify whether the log_rescale_z function is polynomial or rational

Field: rescale_degree::posint

When the log_rescale_z function is polynomial in $z_1$ and $z_2$, this field specifies the total degree. When the log_rescale_z function is rational in $z_1$ and $z_2$, this field specifies the total degree of the numerator and denominator. This field should be set by the set_rescale_type method.

Field: rescale_dof::posint

This field holds the number of degrees of freedom that we can vary when specifying the log_rescale_z function. It is calculated by the set_rescale_type method from the rescale_type and rescale_degree fields.

Field: curvature_z

This is the curvature of the rescaled metric, represented as a function from the $z$-plane to $\mathbb{R}$. It is set by the set_rescale method, and also by the find_rescale_* methods.

Field: quadrature_rule::E_quadrature_rule

This is a quadrature rule, which we use to measure the total deviation of the rescaled curvature from the desired value of $-1$. It is not important for the quadrature to be accurate. This field must be set before any of the find_rescale_* methods can be used.

Field: rescaling_error::numeric

This is the integral of $(K+1)^2$, where $K$ is the curvature of the rescaled metric. It is set by the set_rescale method, and also by the find_rescale_* methods.

Field: curve_lengths::table

This is a table indexed by $\{0,1,3,5\}$, which holds the lengths (with respect to the rescaled metric) of the sides of the fundamental domain $F_{16}$. These lengths are set by the find_a_H method.

Field: curve_a_H_estimates::table

This is a table indexed by $\{0,1,3,5\}$. The $i$'th entry is an estimate of $a_H$ obtained from the length of edge $i$ in $F_{16}$. These estimates are set by the find_a_H method.

Field: a_H_discrepancy

This is the maximum of the differences between the estimates of $a_H$ obtained from the different edges of $F_{16}$. This is set by the find_a_H method.

Field: u_degree::posint

The fields discussed below are Fourier sin series. The u_degree field holds the number of terms in each of these series. This number is set by supplying it as an argument to the find_u method.

Field: u::table

This is a table indexed by $\{0,1,3,5\}$. The $i$'th entry is an approximation to the function $u$ such that $q(c_{Hi}(t))=c_{Ei}(u(t))$. It has the form $u(t) = t + \sum_j a_j\sin(jmt)$, where $m=4$ for $i=0$, and $m=2$ for $i\in\{1,3\}$, and $m=1$ for $i=5$. This table is set by the find_u method.

Field: u_inv::table

This is a table, whose entries are approximately the inverses of the functions stored in the u field. This table is set by the find_u method.

Field: c_E_rescaled_speed::table

This is a table indexed by $\{0,1,3,5\}$. The $i$'th entry is a Fourier approximation to the speed of $c_{Ei}(t)$ with respect to the rescaled metric. This table is set by the find_u method.

Field: c_E_rescaled_length::table

This is a table indexed by $\{0,1,3,5\}$. The $i$'th entry is the indefinite integral of the corresponding entry in the c_E_rescaled_speed field; this is a constant multiple of the $i$'th entry in the u_inv field. This table is set by the find_u method.

Field: c_E_average_rescaled_speed::table

This is a table indexed by $\{0,1,3,5\}$. The $i$'th entry is the time average of the corresponding entry in the c_E_rescaled_speed field. This table is set by the find_u method.

Field: H_samples::list

A list of closely spaced points in $HF_{16}$, set by the make_H_samples method.

Field: D_samples::list

A list of closely spaced points in a disc centred at the origin that contains $HF_{16}$ (but usually has radius less than 1). This is set by the make_D_samples method.

Field: H_samples_q::list

Images in $EX^*$ of the points in H_samples. These are set by the make_H_samples_q method, which will only work once we have constructed and adjusted charts to put ourselves in a position to calculate the map q.

Field: D_samples_q::list

Images in $EX^*$ of the points in D_samples. These are set by the make_D_samples_q method, which will only work once we have constructed and adjusted charts to put ourselves in a position to calculate the map q.

Field: chart_dist::table

Distances between H-sample points and centres of charts. This can be set by the set_chart_dist method after charts have been created and the H_samples field has been set.

Field: square_q_inv = NULL

A polynomial function $\mathbb{R}^2\to\mathbb{C}$ which approximates the inverse of the map $HF_{16}\xrightarrow{q}EX^*\xrightarrow{\delta}[0,1]^2$ (where $\delta$ is square_diffeo). This can be set by the set_square_q_inv method.

Field: num_edges::integer

Some methods rely on having a triangulation of $F_{16}$ with the centres of the charts as vertices. After adding the charts, we specify the edges of the triangulation using the add_edge method. The number of edges is stored in the num_edges field.

Field: edges::table

This is a table indexed by natural numbers. Each entry is an instance of the class EH_atlas_edge, representing an edge between chart centres.

Field: fourier_r_max::RR0

The set_q_approx_fourier method will look for a Fourier approximation for $q$ on a disc of this radius centred at the origin. This radius is set by supplying it as the first argument to set_q_approx_fourier.

Field: fourier_m::posint

The number of circles on which we calculate the Fourier series. This number is set by supplying it as the second argument to set_q_approx_fourier.

Field: fourier_r::list

The list of radii of the circles on which we calculate the Fourier series. This is set by set_q_approx_fourier.

Field: fourier_k::posint

The number of sample points on each circle will be $2^k$. This number is set by supplying it as the third argument to set_q_approx_fourier.

Field: fourier_v::table

A table indexed by pairs $(r,t)$, where $r$ is in fourier_r and $t$ is an integer multiple of $2^{-k}$. The entries are $q(r e^{2\pi i t})\in\mathbb{R}^4$. This is set by set_q_approx_fourier.

Field: fourier_a::table

A table indexed by triples $(k,j,r)$, where $1\leq klleq 4$ and $j\geq 0$ and $r$ is in fourier_r. The entries are Fourier coefficients for $q_k$ on the circle of radius $r$. This is set by set_q_approx_fourier.

Field: fourier_qr::table

A table indexed by pairs $(k,r)$, giving a Fourier approximation to $q_k$ on a circle of radius $r$. This is set by set_q_approx_fourier.

Field: fourier_a_spline::table

A table indexed by pairs $(k,j)$, giving a spline approximation to the Fourier coefficient $a_{k,j}(r)$. This is set by the method set_fourier_a_spline, which is called by set_q_approx_fourier.

Field: q_approx

A rational function $\mathbb{R}^2\to\mathbb{R}^4$ which approximates $q$ on a disc containing $HF_4$

Field: H_to_P_map

An object encoding information about a cromulent isomorphism $HX(a_H)\to PX(a_P)$

Field: P_to_H_map

An object encoding information about a cromulent isomorphism $PX(a_P)\to HX(a_H)$

Field: E_to_S_map

An object encoding information about a conformal map $EX^*\to S^2$

Method: set_rescale_type(t::string,d::posint)

This sets the type and degree of the rescaling function


Method: set_rescale(f0)

This sets the log of rescaling function itself, together with some other fields that can be calculated from it. The argument should be an expression in $z_1$ and $z_2$.


Method: rescaled_curvature(f)

This calculates the curvature of $\exp(2f)$ times the metric inherited from $\mathbb{R}^4$. It expects $f$ to be an expression in z[1] and z[2] (not a function). It does not set the log_rescale_z field, because it is intended to be used in an exploratory way when searching for a better rescaling function.


Method: find_rescaling_error(f)

This calculates the integral of $(K+1)^2$, where $K$ is the curvature of $\exp(2f)$ times the metric inherited from $\mathbb{R}^4$. It expects $f$ to be an expression in z[1] and z[2] (not a function). It does not set the rescaling_error field, because it is intended to be used in an exploratory way when searching for a better rescaling function.


Method: find_rescale_poly(d::posint)

This method attempts to find a polynomial approximation to the function $f$ such that $\exp(2f)$ times the standard metric on $EX^*$ has curvature $-1$. The argument d specifies the degree of polynomial (in $z_1$ and $z_2$) to use.


Method: find_rescale_poly_alt(d::posint)

This method attempts to find a polynomial approximation to the function $f$ such that $\exp(2f)$ times the standard metric on $EX^*$ has curvature $-1$. The argument d specifies the degree of polynomial (in $z_1$ and $z_2$) to use. This version is harder to understand than find_rescale_poly(), but is much quicker.


Method: find_rescale_pade(d::posint)

This method attempts to find a rational approximation to the function $f$ such that $\exp(2f)$ times the standard metric on $EX^*$ has curvature $-1$. The argument d specifies the degree of the numerator and denominator (in $z_1$ and $z_2$).


Method: find_rescale_pade_alt(d::posint)

This method attempts to find a rational approximation to the function $f$ such that $\exp(2f)$ times the standard metric on $EX^*$ has curvature $-1$. The argument d specifies the degree of the numerator and denominator (in $z_1$ and $z_2$). This version is harder to understand than find_rescale_pade, but is much quicker.


Method: vector_to_poly(v::{list, Vector})

This converts a vector (or list) of coefficients to a polynomial in $z_1$ and $z_2$.


Method: poly_to_vector(f)

This is inverse to the vector_to_poly method.


Method: vector_to_pade(v::{list, Vector})

This converts a vector (or list) of coefficients to a rational function in $z_1$ and $z_2$. The coefficients for the numerator are given first, followed by the coefficients for the denominator. The constant term in the denominator is always taken to be 1, and this coefficient is omitted from the vector.


Method: pade_to_vector(f)

This is inverse to the vector_to_pade method.


Method: find_a_H()

This method comutes the lengths (with respect to the rescaled metric) of the sides of the fundamental domain $F_{16}$. It then calculates estimates of $a_H$ from these lengths, and averages them.


Method: find_u(d)

This calculates appropriate values for the c_E_rescaled_length field and various related fields. These involve various Fourier sin series; the parameter d controls the number of terms in those series.


Method: find_v_series(k,t0,d0)

Let $u$ be the function such that $q(c_{Hk}(t))=c_{Ek}(u(t))$. This method finds an approximate power series for the function $v(z) = u(u^{-1}(t_0) + 2\arctanh(z)/s_k) - t_0$, where $s_k$ is the speed of $c_{Hk}$. This can be calculated without knowing $u^{-1}(t_0)$, and does not rely on the Fourier series for $u$ calculated by the find_u method.


Method: add_chart()

This adds a chart object to the atlas, but the chart object contains no data at this stage.


Method: add_vertex_chart(k::integer,d::posint)

This adds a chart centred at $v_k$, with polynomial degree $d$, and calculates the coefficients and associated data.


Method: add_curve_chart(k::integer,t0::RR0,d::posint)

This adds a chart centred at $c_k(t0)$, with polynomial degree $d$, and calculates the coefficients and associated data.


Method: add_square_chart(s0::RR0_2,d::posint)

This adds a chart centred at $\delta^{-1}(s0)$, with polynomial degree $d$, and calculates the coefficients and associated data. Here $\delta$ is the map square_diffeo.


Method: add_centre_chart(x0::RR0_4,d::posint)

This adds a chart centred at $x0$, with polynomial degree $d$, and calculates the coefficients and associated data.


Method: max_chart_error()
Method: q_c(z)

This evaluates $q(z)$ using the chart whose centre is as close as possible to $z$


Method: q_c_aux(z)
Method: q(st)

This is the same as q_c, except that the argument is in $\mathbb{R}^2$ instead of $\mathbb{C}$


Method: patching_error(z0,r0)

This method looks for charts centred at a hyperbolic distance of at most r0 from z0. For each such chart, it calculates an approximation to q(z0). It returns a pair giving the number of different approximations, and the maximum discrepancy between them.


Method: max_patching_error(r)
Method: make_H_samples(N::posint)

Set the H_samples field to be the set of points of the form $(j + kI)/N$ that lie in $HF_{16}$


Method: make_D_samples(N::posint,r::RR0)

Set the D_samples field to be the set of points of the form $(j + kI)/N$ that lie in the first quadrant of the disc of radius $r$ centred at the origin. Here $r$ should be big enough that the disc contains $HF_{16}$, but not much bigger than that.


Method: make_H_samples_q()

Calculate the images of the H-sample points under the map $q\colon\Delta\to EX^*$


Method: make_D_samples_q()

Calculate the images of the D-sample points under the map $q\colon\Delta\to EX^*$


Method: set_chart_dist()

Calculate distances between H-sample points and centres of charts


Method: set_q_approx_pade(dd)

Find an approximation to $q(x+iy)$ by rational functions in $x$ and $y$. The approximation will be equivariant with respect to $\langle\lambda,\nu\rangle$, and will minimize the error for points $x+iy$ in D_samples.


Method: set_q_approx_poly(dd)

Find an approximation to $q(x+iy)$ by polynomials in $x$ and $y$. The approximation will be equivariant with respect to $\langle\lambda,\nu\rangle$, and will minimize the error for points $x+iy$ in D_samples.


Method: set_q_approx_fourier(r_max,m,k)

This sets the fields fourier_r_max, fourier_m, fourier_k, fourier_r, fourier_v, fourier_a, fourier_qr and fourier_a_spline. See the documentation of those fields for more details.


Method: set_fourier_a_spline()
Method: q_fourier(s::RR0_2)
Method: q_fourier_c(z::CC0)
Method: set_square_q_inv_a(d::posint)
Method: square_q_inv_search(s0::RR0_2)
Method: set_square_q_inv_b(n::posint,d::posint)
Method: add_edge(i,j)
Method: set_edge_lengths()

Set the H_length field of each edge, by assuming that the charts are exactly isometric.


Method: set_beta_approx()

This method sets the beta field for each chart that is not centred on an edge of $F_{16}$. If $q$ is the standard map $\Delta\to EX^*$, then $q(\beta)$ should be the centre of the chart. If we have already set the square_q_inv field (to an approximation of (square_diffeo_E o q)^(-1)) then we use that. Otherwise, we use square_diffeo_H^(-1) o square_diffeo_E. If the $\lambda$ field has already been set, then we also put $\alpha = -\beta/\lambda$.


Method: optimize_lambda()

This method assumes that we have a value of $\beta$ for each chart, and then chooses the best possible values of $\lambda$ consistent with the values of $\beta$. It then sets $\alpha = -\beta/\lambda$. It does not alter the values of $\alpha$, $\beta$ or $\lambda$ for charts centred on the edges of $F_{16}$, because in those cases we have other methods that are considered to be more reliable.


Method: optimize_beta()

This method adjusts the $\beta$ fields for all charts that are not centred on an edge of $F_{16}$. It attempts to ensure that whenever any two charts are joined by an edge, the hyperbolic distance in $\Delta$ between the coresponding $\beta$ values is the same as the distance in $EX^*$ between the corresponding centres, measured using the rescaled metric. It then calls the optimize_lambda method to set $\lambda$ and $\alpha$.


Method: curvature_error_plot()

Generate a plot showing the difference between $-1$ and the curvature of the rescaled metric.


Method: log_rescale_plot()

Generate a plot of the log_rescale_z field.


Method: beta_plot()

Generate a plot showing the $\beta$ values of all the charts, and the edges between them.


Method: beta_plot_tikz()

Generate a plot showing the $\beta$ values of all the charts, and the edges between them.


Method: H_sample_plot()

Generate a plot showing the H-sample points.


Method: D_sample_plot()

Generate a plot showing the D-sample points.


Method: H_sample_q_plot()

Generate a plot showing the images in $EX^*$ of the H-sample points.


Method: D_sample_q_plot()

Generate a plot showing the images in $EX^*$ of the D-sample points.


Method: square_q_inv_plot()

This method shows a distorted grid obtained by applying the square_q_inv map to a regular grid covering the unit square. Thus, the distorted grid will cover the domain $HF_{16}$ in the unit disc.


Method: edge_length_scatter_plot()

We usually want to arrange our charts and edges so that most edges have approximately the same length. Also, if everything was working perfectly, then the edge lengths in the H_length and EH_length fields would be the same. Thus, the plot generated by this method should show a cluster of points that are very close to the diagonal, and mostly close to each other.


Method: edge_length_anomaly_plot()

If everything was working perfectly, then the edge lengths in the H_length and EH_length fields would be the same. This method generates a plot showing a normalised measure of the difference between them.


Method: nearest_charts_plot()

This generates a plot which helps one to understand how well the fundamental domain $HF_{16}$ is covered by the charts in this atlas. For each point in H_samples we find the distance to the closest chart centre, then we sort these distances in order, and the result is the red curve. The green curve shows distances to the second closest chart centre, and so on, up to the cyan curve, which shows distances to the fifth closest chart centre.


Method: fourier_v_plot(m)

This generates a surface plot of the m'th component of the map $q\colon\Delta\to EX^*\subset\mathbb{R}^4$


Method: fourier_ring_vals(r::RR0,n::posint := 2)

This method generates a list of points in $EX^*\subset\mathbb{R}^4$ obtained by applying the map $q\colon\Delta\to EX^*$ to $n$ equally spaced points on the circle of radius $r$ centred at $0$.


Method: fourier_curve(r::RR0,n::posint := 2,p := 2)

This generates a plot of the curve $tmapsto p(q(r,e^{it}))$, where $r$ is supplied as the first argument, and $p$ is a map from $EX^*$ to $\mathbb{R}^2$ or $\mathbb{R}^3$ which is supplied as the third argument. The second argument is the number of sample points, which needs to be large in order to get a smooth plot. If the third argument is omitted then we use the stereographic projection map to $\mathbb{R}^3$