Each script uses the PyEQSP Python library (this repository) to reproduce results originally computed in MATLAB using the EQ Sphere Partitioning Toolbox.
Paul Leopardi, "Distributing points on the sphere: Partitions, separation, quadrature and energy", UNSW, 2007.
:::{note} Beta Feedback Wanted If you are running these thesis reproduction scripts on your local system, we would love to know if the results are consistent with your hardware. Please share a screenshot or report any numerical variances in our Feedback Hub. :::
The following table maps the scripts in examples/phd-thesis/src/ to the original thesis figures.
| Script | Thesis Figure | Backend | Description |
|---|---|---|---|
fig_3_1_partition_s2_33.py |
Fig 3.1 | PyVista | 3D partition EQ(2, 33) on S² |
fig_3_3_algorithm_s3_99.py |
Fig 3.3 | Matplotlib (Agg) | Algorithm illustration for EQ(3, 99) |
fig_3_4_max_diam_s2.py |
Fig 3.4 | Matplotlib (Agg) | Max diameter coefficients of EQ(2, N), N=1..100,000 |
fig_3_5_max_diam_s3.py |
Fig 3.5 | Matplotlib (Agg) | Max diameter coefficients of EQ(3, N), N=1..100,000 |
fig_3_6_max_diam_s4.py |
Fig 3.6 | Matplotlib (Agg) | Max diameter coefficients of EQ(4, N), N=1..100,000 |
fig_3_7_max_diam_multi_dim.py |
Fig 3.7 | Matplotlib (Agg) | Max diameters of EQ(d, 2^k), d=2..8, k=1..20 (parallelized) |
fig_4_1_eqp_s2_33.py |
Fig 4.1 | PyVista | 3D EQ code EQP(2, 33) with partition EQ(2, 33) |
fig_4_2_min_dist_s2.py |
Fig 4.2 | Matplotlib (Agg) | Min distance coefficient of EQP(2, N), N=1..20,000 |
fig_4_3_min_dist_s3.py |
Fig 4.3 | Matplotlib (Agg) | Min distance coefficient of EQP(3, N), N=1..20,000 |
fig_4_4_min_dist_s4.py |
Fig 4.4 | Matplotlib (Agg) | Min distance coefficient of EQP(4, N), N=1..20,000 |
fig_4_5_packing_s2.py |
Fig 4.5 | Matplotlib (Agg) | Packing density of EQP(2, N), N=1..20,000 |
fig_4_6_packing_s3.py |
Fig 4.6 | Matplotlib (Agg) | Packing density of EQP(3, N), N=1..20,000 |
fig_4_7_packing_s4.py |
Fig 4.7 | Matplotlib (Agg) | Packing density of EQP(4, N), N=1..20,000 |
fig_4_8_wyner_s2_s3_s4.py |
Fig 4.8 | Matplotlib (Agg) | Wyner ratios for EQP(2), EQP(3), EQP(4), N=2..20,000 |
fig_4_9_wyner_s5_s6_s7.py |
Fig 4.9 | Matplotlib (Agg) | Wyner ratios for EQP(5), EQP(6), EQP(7), N=2..20,000 |
fig_4_10_eqp_voronoi_s2_33.py |
Fig 4.10 | PyVista | EQP(2, 33) Voronoi edges on S² in 3D |
fig_5_1_normalized_energy.py |
Fig 5.1 | Matplotlib (Agg) | Normalized energy of EQP(d, N), d=2,3,4 |
fig_5_2_diff_normalized_energy.py |
Fig 5.2 | Matplotlib (Agg) | Convergence of normalized energy |
fig_5_3_energy_coeff_s2.py |
Fig 5.3 | Matplotlib (Agg) | Energy coefficient of EQP(2, N), N=2..20,000 |
fig_5_4_energy_coeff_s3.py |
Fig 5.4 | Matplotlib (Agg) | Energy coefficient of EQP(3, N), N=2..20,000 |
fig_5_5_energy_coeff_s4.py |
Fig 5.5 | Matplotlib (Agg) | Energy coefficient of EQP(4, N), N=2..20,000 |
All scripts save a PNG output file to the current directory and print a confirmation message on completion.
-
3D Figures: Visualizations using
PyVistaare not always bitwise identical across hardware due to non-deterministic GPU rasterization, even when the underlying mesh is identical. -
Min-distance: Unified search using KDTrees ensures
$O(N \log N)$ scaling, allowing$N=20,000$ to complete in seconds. -
Riesz Energy: Exact summations for
$s > 0$ use memory-efficient block-tiling to ensure$O(N)$ peak RAM.
Beyond figure reproduction, the project includes a formal replication of the performance benchmark described in Section 3.10.2: Running time. It verifies that the recursive zonal partitioning algorithm scales as
To execute:
python3 benchmarks/src/benchmark_eq_regions.py --max-d 11 --max-k 22Reproduction scripts for 3D figures require the PyVista package (pip install 'pyeqsp[pyvista]').
PyEQSP aims for identical numerical results to the original thesis. But users should be aware of two potential sources of variance:
- Hardware Rasterization: 3D plots generated via PyVista use GPU hardware. Minor variances (e.g., ~2 pixel differences) can occur between different GPUs or drivers due to non-deterministic anti-aliasing.
-
Floating-Point Drift: While we use
numpy.longdoublefor critical recursions, extreme depths in high dimensions ($d > 8$ ) may show sub-microscopic differences across different CPU architectures.
To run reproduction scripts on a server or in CI without a display:
export PYVISTA_OFF_SCREEN=true
python3 examples/phd-thesis/src/fig_3_4_max_diam_s2.pyNumerical scripts (Matplotlib Agg backend) will save PNGs directly. 3D scripts (PyVista) will render off-screen if PYVISTA_OFF_SCREEN=true is set.