Expose setInterpolator/setExtrapolator functions in Python
It would be useful to be able to overload the .info-specified interpolator and extrapolator of a PDF or set from Python as well as C++, at least via the string-arg overloads. But these functions are specific to GridPDF... do we need to expose that as a derived type, and use it for the PDFs built that way?
CPU-optimize the grid PDF interpolator code
Cache log(x), log(Q) between samplings -> log() still accounts for 15% of CPU. Caching grid index lookup, caching interpolation weights, encourage vectorization, optimise cache-friendliness. Multi-place caching given usage mode.
5th order polynomials with fallback
Based on Tushar's GSoC work.
Lagrange polynomial interpolation with Chebyshev knots
The idea is to provide a smooth "whole function" interpolation with no derivative discontinuities across knot points... at the cost of having to perform whole-function fits. Chebyshev knots are denser at the ends of the range, to calm Runge's phenomenon.
Mix and match 1D interpolators
The whole-function polynomials will require a lot of evaluations if performed in both directions. We should implement the 1D Lagrange and other interpolators as free "ipol utility" functions, so they can be mixed and matched, e.g. "Chebyshev-Lagrange" in x, with mini-spline type interpolation of a given order in the other.
Mix-and-match mode will require the PDF code to ask the second-direction interpolator what values it needs evaluations for, before executing the first-direction interpolator on them.
The string-based ipol specification probably needs to become a bit more intelligent, parsing a string format for ipol order & scheme specs rather than the current fixed-value approach. Perhaps a version of the function accepting two strings, one for x and one for Q2, to be joined correctly into the single-string form.
Restructure for greater use of vectorisation, GPUs, MPI, etc.?
Requires very clear specification of use-cases from e.g. DISTRESS profiling, NLO Sherpa HPC experience, etc.
New Fortran API completeness
Extrapolation, interpolation, and alpha_s control, and metadata & uncertainty functions in Fortran.
Add C++ SFINAE helpers for no-inheritance PDF interface definition
We don't want LHAPDF to become a code dependency just to define what a "PDF object" behaves like. Could using SFINAE template specialisation be a more hands-off route than inheritance? These would probably just be examples, so in doc rather than code?
Handle zipped data files (AB)
Prefer zipped single member data files rather than virtual filesystem access to the tarball? Can transparently read zipped files with LD_PRELOAD and zlibc: is that enough? Or embed a zip-stream and link against zlib?
Speed up interpolation with GPUs
Interpolation of PDFs seems like an potential use case for GPUs, since it's normal to query for all partons in the set at once: if we can load the relevant ipol anchors for all flavours onto the GPU then we can maybe get a substantial speedup. OpenMP did not particuarly help, from quick tests.
PDF flavor aliasing mechanism
e.g. allow anti-flavours to be identical without duplicating their grids in the data files or memory. How could we implement this?
Allow use of valence/sea etc. decompositions?
GridPDF may be inherited from to allow the returned values to be built from separate interpolations of component PDFs such as interpolated valence, sea, or difference PDFs that are combined to make the physical ones. The PDG ID code range for "generator specific" applications may be used, but we'll need to bear in mind that this will mean that the flavor ID list has different meanings and contents for internal and external purposes: maybe the "internal" PDG ID list needs to become part of the grid data header, or can the metadata be used?
Separate the x and Q2 inter/extrapolation?
Allow mix & match combinations. Would this simplify the code since the 1D interpolation methods are very simple and the 2D is built from them?
Make GridPDFs not read their info or data blocks until an xf value is requested?!
Super-laziness! But is there a real gain other than < 1 sec initialization speed?