Version 1.1.1
10 Nov 2026We have just released version 1.1.1, which you can find here.
Contributions
There have been 102 commits since version v1.1, which can be inspected here.
Contributors of these commits are:
- Matthew Kirk
- Stefan Meiser
- Fatemeh Nouri
- Méril Reboud
- Danny van Dyk
Changelog
Changed
- Rename
eos.stderr_handlertoeos.default_log_handler#1290 (D. van Dyk) - Let
eos.set_log_levelaccept any Python log level or its name, e.g.'DEBUG', and change the native log level in lock-step, also for the CLI’s verbosity #1290 (D. van Dyk) - Breaking: Rethrow the first exception raised while evaluating an observable in
ObservableCache::update(), on the calling thread and only after every pending computation has been waited on, in lieu of logging it and writing aNaNinto the affected prediction; every evaluation path now catches exceptions of any type, not onlyeos::Exception, so that an exception escaping a worker thread no longer terminates the process. Code that relied onupdate()never throwing must now handle the exception, and a single unevaluable point of a large grid surfaces as an error in lieu of aNaNlog-posterior that a sampler steps straight past #1236 (D. van Dyk) - Test the
eos-analysiscommands in Python, in lieu of the bash scriptsrc/scripts/eos-analysis_TEST; the tests of the pypmc-based commandssample-mcmc,find-clusters,sample-pmc, andfind-mode --from-mcmcare kept apart ineos/cli/analysis_pypmc_TEST.py(issue #1264) (D. van Dyk) - Breaking: Reject a task argument interpolated into the task’s output directory unless it is a single path component without whitespace, and reject file-local names
.and..in analysis files (issue #1291) (D. van Dyk) - Write each task’s outputs to a temporary directory that replaces the final one only once the task succeeds, so that a failed task leaves previous results untouched and no incomplete output directory behind;
sample-mcmcnow fails on a run time error in lieu of logging it and succeeding (issue #1291) (D. van Dyk) - Let kinematic aliases take precedence over kinematic variables of the same name, so that a kinematic specification in an expression applies even if the kinematics provide a variable of that name, e.g. in
<<B->pi::f_+(q2)>> / <<B->pi::f_+(q2)>>[q2=0.0](D. van Dyk) - Require at least Python 3.11 as 3.10 went EOL in October 2026 (M. Kirk)
Added
- Add the
Bbar^*->DandBbar^*->D^*tensor form factors in the HQE parametrisation, following [BGJvD:2025A]; theFormFactors<VToP>andFormFactors<VToV>interfaces gainh_tbar_1toh_tbar_3andh_t4toh_t10respectively (D. van Dyk) - Add the reference [BGJvD:2025A] and cite it from
BGLCoefficientsandHQETUnitarityBounds, which implement its BGL coefficients for the tensor form factors and its1^+and1^-tensor bounds (D. van Dyk) - Add batch computations to
ObservableCache:add_batch()registers a group of observables that are evaluated into one contiguous, pre-allocated block of memory, partitioned across the available threads, andoperator[](BatchId)retrieves their predictions as astd::span#1236 (D. van Dyk) - Add
ObservableCache.used_parameter_ids, which reports the parameters used by all observables of a cache, including those evaluated in batches #1236 (D. van Dyk) - Add the class
eos::ResolutionConvolution, which convolves a signal sampled on a uniform tensor-product grid of rank 1 to 4 with a fixed resolution kernel, through the discrete Fourier transform; the kernel is supplied in centred order and renormalised to unit sum, and the convolution is circular, so that the grid must be padded with a region in which both the signal and the resolution are negligible #1236 (D. van Dyk) - Add the class
eos::DetectorLevelPDFand its Python counterparteos.DetectorLevelPDF: a truth-levelSignalPDFof rank 1 to 4 convolved with a detector resolution, which is itself aSignalPDFand can therefore be evaluated, sampled, and plotted like any other PDF. The truth PDF is sampled on the grid through a singleObservableCachebatch, and the resolution is supplied either as an EOS expression in the per-axis offset variables, which is sampled anew whenever the parameters change, or as a pre-computed kernel grid #1236 (D. van Dyk) - Add the unbinned log-likelihood blocks
LogLikelihoodBlock::Unbinned1DthroughUnbinned4D, and export them to Python aseos.LogLikelihoodBlock.Unbinned1DthroughUnbinned4D. Each takes aneos::DetectorLevelPDFwhose rank matches, together with the individually observed events, and sums the logarithm of the normalized detector-level density over them; the grid is convolved once per evaluation and interpolated at every event. An optional list of non-overlapping windows restricts the events to their union and normalizes the density over it, through the newDetectorLevelPDF::integral()(eos.DetectorLevelPDF.integralin Python) #1236 (D. van Dyk) - Export
SignalPDF.evaluate_linearto Python, which returns the unnormalized density on the linear scale #1236 (D. van Dyk) - Add the
eos.data.UnbinnedLikelihooddata object, a directory holding the individually observed events, the detector resolution, and the description of the native sampling grid that the resolution supports; the rank of the problem is detected from the number of axes rather than declared #1236 (D. van Dyk) - Add the
type: unbinnedanalysis-file likelihood component, which builds an unbinned likelihood from aneos.data.UnbinnedLikelihooddirectory and the qualified name of the truth-level signal PDF fitted to it, and adds it to the posterior. Its optionalaxeskey crops the data object’s native grid to a window without changing the node spacing; because the underlying real discrete Fourier transform requires an even number of points per axis, a crop that yields an odd count is reported as a diagnostic of severityERRORand raises aValueErrorin lieu of being silently adjusted. Its optionalwindowskey restricts the fit to a union of non-overlapping boxes within the cropped axes, over which the detector-level PDF is normalized. Validation also checks the parameters and observables that the resolution of the data object refers to, so that a parameter used only there is no longer reported as unused #1236 (D. van Dyk) - Add a
typekey to the analysis-file likelihood components. It is presently required only fortype: 'unbinned'; where it is absent, the kind of a component is inferred as before from the presence of theconstraints,manual_constraints, orpyhfkey #1236 (D. van Dyk) - Add a user-guide notebook on detector-level PDFs, which builds the truth-level 2D PDF of
B->Dlnuinq2andcos(theta_l), convolves it with a Gaussianq2resolution assembled from EOS expressions, validates the result against manually smeared samples, and fits the form factor shape parameters to the smeared events through an unbinned likelihood in an analysis file #1236 (D. van Dyk) - Let functions in EOS expressions take several arguments, each of which may be a full expression, and accept prefixed function names such as
Kernel::Gaussian; calling a function with the wrong number of arguments is reported as an error #1236 (D. van Dyk) - Add resolution kernels to EOS expressions, beginning with
Kernel::Gaussian(u, mu, sigma), a density of unit area in its first argument, together with a decomposition of an expression into a linear combination of kernels in an offset variable, whose coefficients and kernel parameters may depend on parameters, observables, and other kinematic variables #1236 (D. van Dyk) - Add the resolution kernel
Kernel::CrystalBall(u, mu, sigma, alpha_L, n_L, alpha_R, n_R)to EOS expressions, a Gaussian core with power-law tails on either side #1236 (D. van Dyk) - Add the functions
atan,log, and the Heaviside step functionthetato EOS expressions #1236 (D. van Dyk) - Add the
signal_pdfsanalysis-file section, which registers a truth-level signal PDF as the ratio of two observables, its unnormalized density and its normalization, either of which may be a custom observable of the same file #1236 (D. van Dyk) - Add the class
eos::UnbinnedObservationsand its Python counterparteos.UnbinnedObservations, which hold the observed events of an unbinned likelihood and share them between copies. The unbinned log-likelihood blocks accept them in lieu of an array of events, and use their current events at every evaluation, so that replacing the events throughset()reaches every block built from them, including the clones held by aLogLikelihood; many pseudo-data sets can thus be fitted without constructing the detector-level PDF anew #1236 (D. van Dyk) - Add the figure item
detector-level-pdf, which plots a signal PDF convolved with a resolution, given either explicitly or through aneos.data.UnbinnedLikelihooddata object #1236 (D. van Dyk) - Add the Faddeeva function
eos::faddeeva_w(D. van Dyk) - Add
eos::CauchyTransform, the Cauchy transforms of resolution kernels: forKernel::Gaussianin closed form through the Faddeeva function, and forKernel::CrystalBallto first order in the ratio of the width of a pole to the width of the kernel (D. van Dyk) - Add the subtraction of narrow poles of the truth-level amplitude to
eos::DetectorLevelPDFandeos.DetectorLevelPDF.make_from_expression: the terms of the poles are subtracted from the truth-level PDF before the numerical convolution, and convolved analytically through the Cauchy transform of the resolution, which is evaluated at the query points rather than interpolated from the grid, and integrated over windows by Gauss-Legendre quadrature on panels of one grid spacing. The grid therefore only needs to resolve the resolution, not the widths of the poles. The subtraction coefficients are either given as observables, or extracted from the truth-level PDF on the grid points nearest to each pole; for grids of rank 2 to 4, they are convolved numerically with the resolution of the other axes (D. van Dyk) - Add the
poleskey to thetype: unbinnedanalysis-file likelihood component (D. van Dyk) - Add the
poleskey to the figure itemdetector-level-pdf(D. van Dyk) - Let each data file of
eos.figure.CornerFigureset its line style, line width, and opacity, as well as the contours and credibility levels of its kernel density estimates;level: nullon a one-dimensional KDE item now shades no interval, rather than the 68.3% interval (D. van Dyk) - Let the templates of the
reporttask load any YAML file through the functionload_yaml(path), withpathrelative to the base directory (D. van Dyk) - Add two benchmark problems of the pole subtraction, which
eos::register_benchmarks()andeos.register_benchmarks()register on request, as does importingeoswith the environment variableEOS_REGISTER_BENCHMARKSset (D. van Dyk) - Add the
eos-analysistaskmodel-comparison, which compares a group of posteriors sharing the same likelihood by their nested-sampling evidences: it corrects for differing uniform or transform priors of shared parameters and records their log prior volumes, grades all pairwise Bayes factors on Jeffreys’ scale, and flags pairs whose conclusion is unstable under the evidence uncertainties or the prior-volume correction. The result is stored as the neweos.data.ModelComparison, exposed to reports throughAnalysisData.model_comparisons, and shown at the top of the example report template (issue #1282) (D. van Dyk) - Let
eos.figure.CornerFiguredisplay aneos.data.Mode, drawn as a vertical line on the diagonal and as a point off the diagonal;eos.data.Modegains alookup_table#1302 (D. van Dyk) - Add kinematic substitutions to EOS expressions:
<<B->pi::f_+(q2)>>[q2={m}^2]evaluates the referenced observable withq2computed from other kinematic variables through constants and functions; parameters and observables are rejected. The substituted variable is computed whenever it is read, so that it follows changes of the kinematics, also within anObservableCacheand its clones (D. van Dyk) - Add derived kinematic variables to
eos::Kinematics, declared throughKinematics::declare_derived()with aKinematicHookthat computes the value whenever the variable is read; derived variables cannot be set, and follow clones of their kinematics (D. van Dyk)
Deprecated
Removed
- Breaking: Remove the C++ base class
eos::Density;eos::SignalPDFno longer offersbegin()/end(), and its twoclone()overloads are replaced byclone(const ObservableCache &), which returns aSignalPDFPtr#1303 (D. van Dyk)
Fixed
- Fix
eos.set_log_levelto set the level of the default log handler rather than that of the logger, so that DEBUG messages are shown; correct the FAQ on setting the log level, which caused messages to be printed twice #1290 (D. van Dyk) - Use the mass parameters, rather than compile-time constants, when converting
q2towin theV->VHQE form factors, as the other three transitions already did; settingmass::B_d^*ormass::D_u^*previously had no effect on theBbar^*->D^*form factors (D. van Dyk) - Correct the normalization constants
Kpassed to the outer function_phifor the tensor form factorst_1,t_2,t_23, andf_tin theBGL1997-like parametrization (D. van Dyk) - Evaluate the HQET form factors at zero recoil independently of the compiler’s use of fused multiply-add: reconstructing
q2from the meson masses reproducesw = 1only up to rounding, and the auxiliary functionsrandOmegareturned NaN whenever it landed a few ulps below the endpoint (D. van Dyk) - Fix a reference leak in the conversion of Python sequences to
std::vectorin the Python bindings #1236 (D. van Dyk) - Fix
ObservableCache::clone()to register the observables that a cloned expression refers to with the clone, rather than with the original cache #1236 (D. van Dyk) - Fix fixed kinematic values in expressions, e.g.
<<B->pi::f_+(q2)>>[q2=1.0], which overwrote each other when several expressions, including nested ones, were made on the same kinematics (D. van Dyk) - Fix cloning an
ObservableCachethat holds an expression whose observables are made through a kinematic alias or a fixed kinematic value, which threw anUnknownKinematicVariableError(D. van Dyk) - Fix
Kinematics::set()for an alias, which threw anUnknownKinematicVariableError, and for an unknown name, which accessed invalid memory (D. van Dyk) - Fix
Kinematics::alias()to reject an alias name that is already installed, which it replaced silently; an expression whose kinematic specification renames, fixes, or substitutes a variable that a nested expression handles already now raises an error in lieu of yielding wrong values (D. van Dyk) - Breaking: Fix running of the transverse Gegenbauer moments for rho and K* mesons. The previous implementation did not subtract the running of the transverse decay constant #1311 (S. Meiser)

