Changelog
0.8.0
Breaking API changes in pyvinecopulib
Reorganize the public API into the
core/families/utils/sklearnsubpackages (#207).Top-level classes (
Bicop,Vinecop,RVineStructure,CVineStructure,DVineStructure,FitControlsBicop,FitControlsVinecop,BicopFamily) andto_pseudo_obsare kept at the top level indefinitely.Family constants / groups (
indep,gaussian, …,parametric, …,itau),Kde1d,wdm,sobol,ghalton,simulate_uniform,benchmark,pairs_copula_datastill resolve at the top level but emit aDeprecationWarningon access pointing at the canonical subpackage path. Aliases are scheduled for removal in the next major release.reprand pickle now use canonical module paths (Bicop.__module__ == "pyvinecopulib.core",Kde1d.__module__ == "pyvinecopulib.utils", etc.); pickles from releases up to 0.7.x still load via the deprecated aliases.
pyvinecopulib.sklearnestimators take a singlebackend=keyword (#218).VineDensity(controls=..., structure=..., seed=...)→VineDensity(backend=VinecopBackend(controls=..., structure=...), random_state=...). Same shape change forVineRegressor/VineForestDensity/VineForestRegressor. No string shortcuts; pass aVinecopBackendorTorchVinecopBackendinstance.seed-style kwargs renamed torandom_stateacross the forests and onsample/cdf/cdf. Legacyseed/seedskwargs removed without a deprecation alias.VineRegressorgains a realnormalize_weights=True__init__parameter; the previous post-init_normalize_weightsattribute is gone.
from_datanow dispatches oncontrols=FitControlsTorchBicop(...)(#217). Callers who passedgrid_size,mult, orgrid_typeas keyword arguments must move them onto the dataclass.cache_integrals,device, anddtyperemain direct kwargs onfrom_data.TorchBicop.sample(num_sample, seed, is_sobol)renamed toTorchBicop.simulate(n, qrng=False, seeds=[])for parity withpv.Bicop.simulate(#216).Remove
TorchBicop’slog_pdfmethod. The vinepdfcascade now accumulates a product of per-edgepdf(rather than a log-sum-exp), so the pair-level log-density convenience method is no longer needed; it was never part of theBicopLikecontract. UseTorchBicop.pdf(u).log()if you need a log density.
New features in pyvinecopulib
Add backend-neutral pair-copula / vine contracts to
pyvinecopulib.core: the generic,runtime_checkableprotocolsBicopLike/VinecopLikeandBicopBase, their canonical array-backend-agnostic (NumPy / PyTorch, viaarray_api_compat) partial implementation.BicopLikemirrors the C++Bicopevaluation surface exactly (pdf/cdf/hfunc1/hfunc2/hinv1/hinv2, with an optional trailingxconditioning matrix; nodtype/device, since annn.Module-backed pair has no intrinsic precision/placement), so the C++Bicop/VinecopsatisfyBicopLike/VinecopLikestructurally (isinstanceisTrue); thexconditioning matrix appears symmetrically on both (per-pair onBicopLike, per-call onVinecopLike). a custom pair need only implementpdf/hfunc1/hfunc2and inheritshinv1/hinv2(bisection),simulate(inverse Rosenblatt of the pair, via a_simulate_uniformRNG hook),loglik(sum(log pdf), differentiable on autograd backends),plot(density contour / surface), and a structural__repr__fromBicopBase.simulateis part of theBicopLikecontract (symmetric withVinecopLike; the C++Bicopprovides it).TorchBicopnow subclassesBicopBase[torch.Tensor]. These are the extension point for custom (e.g. neural, conditional) pair copulas, andpyvinecopulib.coreimports without PyTorch.Extract the vine evaluation cascades onto an array-agnostic
VinecopBaseinpyvinecopulib.core(NumPy / PyTorch):pdf/cdf/rosenblatt/inverse_rosenblatt/simulate, plusloglik/plot/__repr__/dim/get_pair_copulaand the publicfitengine. Conditioning is threaded per edge through a pluggableConditioningContext(SimplifiedContextdefault — external covariates only;NonSimplifiedContextalso gathers the edge’s conditioning-set valuesu_D):fit(structure, u, fit_edge, *, context=, x=)builds a non-simplified / conditional vine, assembling each pair’sx_ein the fixed C1 column order (u_Din ascending conditioning-tree index, then external covariatesx). A backend hosting arbitrary (e.g. scikit-style, conditional) pair copulas subclassesVinecopBasedirectly.TorchVinecopsubclassesVinecopBase[torch.Tensor], stays annn.Modulevine ofTorchBicoppairs (GPU / autograd /state_dicthonour the whole object), keeps the batched TLL fast path (falling back when a pair lacks the grid internals), and inheritsloglik/plot. Behavior-preserving: thepdfcascade is a product of per-edge densities and the torch↔Vinecop(1e-10) / batched↔non-batched (1e-12) parity are unchanged.Fuse the batched TLL evaluation lookups (torch): with
cache_integrals=True, the per-tree-level batchedpdf/hfunc1/hfunc2(andhfunc1/hfunc2for the Rosenblatt cascade) now share a single bilinear cell search + weight computation viainterpolate_batched_manyover a stacked(N, K, m, m)cache, instead of recomputing the same cell index / weights 3× (pdf cascade) or 2× (Rosenblatt) per level. Bit-for-bit identical to the separate lookups (the batched↔per-pair 1e-15 and torch↔C++ 1e-10 parity gates are unchanged). On CUDA the batched fast path this optimizes runs ~6–18× faster than the non-batched cascade (pdf/rosenblatt, d = 10–20, n = 2000–10000; e.g.pdfat d = 20, n = 10000: ~388 → 22 ms) and up to ~16–18× faster than single-threaded C++; this fusion trims the redundant per-level cell searches on that path (benchmark:scripts/bench_torch_vinecop.py).Add
pyvinecopulib.sklearnwith scikit-learn-compatibleVineDensityandVineRegressorestimators following theBaseEstimator/DensityMixin/RegressorMixinprotocols, with mixed continuous/discrete input handling (DataFrame or ndarray) (#211).Add
VineForestDensityandVineForestRegressor: ensembles of vine estimators sampled either uniformly (Joe’s algorithm) or via Wilson’s Kendall’s-τ-weighted random walk, pruned by a model-confidence-set survivor test on a held-out split (#213).Add the
pyvinecopulib.torchsubpackage: pure-PyTorchTorchBicop/TorchVinecopevaluators (nn.Modulesubclasses) for GPU placement, autograd, andnn.Modulepipeline composition. The torch cascade matches the C++ TLL fit to machine precision (#216).Add a sklearn-side backend layer (
pyvinecopulib.sklearn.backends):VinecopBackend(default, C++) andTorchVinecopBackend(opt-in PyTorch) route the same estimator class through either backend; both produce fitted vines that satisfy the canonicalpyvinecopulib.core.VinecopLikeprotocol (#218).Add
from_structure,simulate, andcdf(quasi-MC) so the torch evaluators mirror theirpv.Vinecopcounterparts (#216).from_datanow selects an R-vine structure automatically whenstructure=None, mirroringpv.Vinecop.from_data, while a suppliedstructurestill fixes the skeleton and fits only the pair copulas. With the API gap closed, the twopyvinecopulib.sklearnbackends collapse onto a single shared base:VinecopBackendandTorchVinecopBackendnow differ only in the divergent members, thename/supports_discrete/supports_cdf/supports_simulatecapability flags are gone (the continuous-only guard lives onfrom_data), andresolve_backendonly defaultsNone.pyvinecopulib.torchno longer re-exportsInterpolationGrid2D(it stays an internal detail ofTorchBicop) (#241).Port vine structure selection into the array-agnostic
VinecopBase, soTorchVinecop.from_data(structure=None)selects the R-vine natively in torch instead of round-tripping throughVinecop.VinecopBase.select(u, fit_edge, *, trunc_lvl=, tree_criterion=, threshold=, tree_algorithm=, seeds=, to_numpy=)is the array-agnostic (NumPy / PyTorch) Dissmann / Wilson selector, an exact port ofVinecop’s: it builds each tree’s candidate graph under the proximity condition (same enumeration order), weights edges by1 - |tau|(Kendall’s tau viawdm), keeps a spanning tree, fits the pair copulas to propagate h-functions, finalizes the chosen edges into anRVineStructurewith the same peel and diagonal policy, and returns(structure, pair_copulas)— the selection-time pairs reoriented onto their finalized slots, so (likeVinecop) no re-fit happens. The fixed-structure fit engine is exposed asfit(renamed from the unreleasedsequential_fit), soVinecopBasenow mirrorsVinecop’sselect/fitby name — both differ only in being functional (they return the structure / fitted pairs rather than mutating the vine in place, sinceVinecopBaseleaves pair storage to the subclass). Given identical pair fits, the selected matrix encoding, the reused pairs, and the resulting density are identical tofrom_data’s (bit-for-bit on the NumPy path; to TLL-fit precision, ~1e-13, on the torch path). Two scoped C++ primitives support it:RVineStructure.from_trees(d, trees)(reuses upstream’sRVineTreespeel — the exact finalizationVinecopuses) and an internal boost-based spanning-tree helper (prim / kruskal / Wilson). TheBicopLikecontract gains aflip()method (return the argument-swapped copula) used to reorient reused pairs:flip()is now bound (returns a flipped copy),flip()transposes its interpolation grid, andBicopBaseships a raising default (custom pairs only need it to be hosted in selection). Thestructure_controlsfield onFitControlsTorchVinecop(a nestedFitControlsVinecop, added in the unreleased #241) is replaced by native fieldstrunc_lvl/tree_criterion/threshold/tree_algorithm/seeds; both sklearn backends now steer selection through these same-named fields, dropping the last backend-specific indirection. Structure selection is continuous-only and TLL-only on the torch path; automatic truncation / thresholding (aic/bic/mbicv) is not ported (trunc_lvlis a fixed cap) (#244).Flip torch defaults based on a bicop + vine benchmark sweep:
cache_integrals=Trueeverywhere (80–300× fastercdf/hfunc/hinvon cpu, 2–80× on cuda),batchedresolves device-aware via_default_batched()(Trueon cuda,Falseon cpu) (#219).Add a tutorial-style
docs/concepts.rstintroducing Sklar’s theorem, pair-copula construction, R-vines, and the TLL family in a ~5-minute read (#218).Use Sphinx autosummary on the four subpackage landing pages so module docstrings, classes, and free functions get their own indexed pages (#214).
Add a custom
tree_criterionfor vine structure selection: setFitControlsVinecop(tree_criterion="custom")and supplytree_criterion_function, a callablef(data, weights) -> floatmapping a two-column array of pair pseudo-observations (and observation weights) to a scalar edge weight (its absolute value is used). The callable round-trips through pickle when it is picklable (e.g. a module-level function); calls acquire the GIL, so they serialise undernum_threads > 1(vinecopulib#674).Add per-row-parameter overloads of
pdf/cdf/hfunc1/hfunc2/hinv1/hinv2/loglik: pass an(n, p)array ofparameters(one row per observation,pfamily parameters each) plus an optionalnum_threadsto evaluate the copula with a different parameter set per row in a single (optionally threaded) call, instead of reusing the object’s stored parameters. Parametric families only (vinecopulib#675).Expose the vine gradient/diagnostics surface on
Vinecop:pdf_full(density plus, withkeep_all=True, the per-edge densities and h-functions, returned as a dict of[tree][edge]nested arrays; the left-limithfunc*_subentries are only populated for models with discrete variables),scores(observation-wise score matrix),hessian(average Hessian),hessian_full(per-observation Hessians), andscores_cov(score covariance). Scores and Hessians are computed analytically (models with discrete variables fall back to finite differences); models with nonparametric pair copulas raiseRuntimeError. Mirrors the R additions in rvinecopulib#320 (vinecopulib#679, vinecopulib#683).Port the closed-form TLL conditional-quantile inversion (vinecopulib#691) to the torch backend:
InterpolationGrid2D.inverse_integrate_1dinverts the piecewise-quadratic conditional cdf exactly, replacing the vectorized ITP root-finder inhinv1/hinv2(cache_integrals=False) and in the inverse-cache construction. The no-cache h-inverse now matches the C++Bicop.hinv*to machine precision (~1e-15, was root-finder-limited) and is ~60–120× faster on cpu (1.4 ms vs 171 ms for 10k points; seescripts/bench_torch_bicop_fit.py --mode hinv); the internal_util.solve_itphelper is removed (a reference copy lives in the benchmark script).Add binary CBOR model persistence:
to_file/to_file/to_fileand the matchingfrom_filefactories select CBOR automatically when the filename ends in.cbor; all other filenames keep reading / writing JSON text.to_json/from_json(and pickling, which serializes via JSON strings) are unchanged (vinecopulib#684).Add
gradient(the observation-average ofscores, mirroring howhessianaverageshessian_full) andscores_full(the scores together with the per-edge derivative caches behind them, returned as a dict of[tree][edge]nested arrays with akeep_alloption mirroringpdf_full; caches are only populated on the analytic path) (vinecopulib#683).Add analytic derivatives of the bivariate copula density and h-functions to
Bicop:pdf_deriv,pdf_deriv2,hfunc1_deriv,hfunc1_deriv2,hfunc2_deriv,hfunc2_deriv2,logpdf_deriv, andlogpdf_deriv2, each taking aderivselector string ("par1","par2", …,"u1","u2";"par"is short for"par1"; second-order selectors concatenate two components in any order, a single component meaning twice, e.g."par1u1"or"u1"≡"u1u1"). Closed forms are used for the families infamilies.analytic_derivs(currently every parametric family); rotations are handled internally, so derivatives are always w.r.t. the natural parameters and arguments of the rotated copula. Likepdfand friends, each method accepts optional per-rowparameters(an(n, p)array) andnum_threads. Fortll, the argument gradientspdf_deriv/logpdf_derivw.r.t."u1"/"u2"return the exact slope of the interpolation grid; parameter selectors, second-order, and h-function derivatives raise (vinecopulib#683, vinecopulib#687, vinecopulib#694).Add the
families.analytic_derivsgroup: families with closed-form density / h-function derivatives (vinecopulib#683, vinecopulib#687).Add tail dependence and Blomqvist’s beta to
Bicop: the read-onlytaildepproperty (a 2×2 matrix collecting the tail dependence coefficients in the four corners of the unit square; NaN fortll) andbetaproperty (Blomqvist’s β = 4·C(0.5, 0.5) − 1, all families), plusparameters_to_taildep/parameters_to_betafor evaluation at arbitrary parameters, analogous toparameters_to_tau(vinecopulib#682).Add
RVineStructure.from_struct_array(order, struct_array, natural_order=False, check=True)(build a structure from an order vector and a[tree][edge]nested-list structure array) andRVineStructure.get_struct_array(natural_order=False)/Vinecop.get_struct_array(natural_order=False)(the full structure array as a nested list, complementing the per-entrystruct_array(tree, edge)), on top of theTriangularArrayconversions added in vinecopulib#680.
Build / packaging
Migrate to
uv+scikit-build-corefor the editable / wheel build pipeline, with[build-system].requiresmirroring the dev[dependency-groups]so--no-build-isolationworks out of the box (#209).Replace
mypywithty(Astral’s type checker, alpha) and enable strict checks against a Python 3.10 baseline; onlypyvinecopulib.pyvinecopulib_extis allowed as an unresolved import (#210).Add
banditsecurity linting tomake checkand pre-commit (scanningsrc/pyvinecopulib+scripts). The previously-unused[tool.bandit]config silently excluded everything ("lib"matchedpyvinecopulib); the config is fixed and the surfaced findings resolved.Refactor the build / docs / examples pipeline into a thin Makefile over
uv runand reworkscripts/regenerate_notebooks.py(#205).Add a
pyvinecopulib[sklearn]extra (scikit-learn>=1.4,pandas>=2.0,joblib>=1.3,scipy>=1.10) and apyvinecopulib[torch]extra (torch>=2.0) (#211, #216).Treat
pyvinecopulib-originatedDeprecationWarnings as errors under pytest so internal call sites stay on the canonical import paths (#207).Install
--extra torchin the notebook-test and regenerate-notebooks CI jobs soexamples/10_torch_backend.ipynbexecutes undernbmake(#216).Fix osx / musllinux wheel builds: feed libclang the compiler’s implicit system include dirs (plus
-ferror-limit=0and the macOS SDK sysroot) so the C++ stdlib / intrinsic headers resolve, and abortdocstr.hppgeneration only on fatal libclang diagnostics (intrinsic-headererrors are benign and no longer silently drop symbols).Fix Windows wheel builds against the VS 2026 / MSVC 14.51 STL: rewrite
__builtin_verbose_trapto__builtin_trap()duringdocstr.hppgeneration. The newer STL emits this Clang-18 builtin from core allocator / string /call_onceheaders, which the pinned PyPI libclang (≤18) can’t resolve; because those headers reach nearly every translation unit, the broken parse crashed symbol extraction. Also narrow a numpy-scalar union in theKde1dplot helper somake check(ty) passes (#224).Migrate macOS CI to
macos-15and re-addmacos-15-intel(MACOSX_DEPLOYMENT_TARGET=10.13for nanobind’s alignednew/delete); wheel matrix is now 5 platforms × 3 ABI (15 wheels).Fix the source build against Eigen 5.x (e.g. conda-forge
eigen>=5): its CMake package exposes the include path only through theEigen3::Eigentarget and no longer sets the legacyEIGEN3_INCLUDE_DIR, leavingdocstr.hppgeneration (and the compile) unable to find<Eigen/Dense>. DeriveEIGEN3_INCLUDE_DIRfrom the target’sINTERFACE_INCLUDE_DIRECTORIESwhen unset.Build the Read the Docs site from source instead of the published PyPI wheel: enable the
lib/submodules, install header-only Boost / Eigen via apt (Ubuntu’slibboost-dev/libeigen3-devclear vinecopulib’s>=1.56/3.4floors), andpip install .[doc,examples,sklearn,torch]. The wheel-install shortcut only rendered the last release’s API, so RTD’sdevbuild failed oncedevmoved ahead of PyPI (missingnumpydoc, then the entirecoreabstraction layer plus thesklearn/torchsubpackagesconf.pydocuments).Make the Sphinx docs cross-reference-clean and enforce it going forward: enable
nitpickysomake docs(-W, run by theverify_docs_buildCI job) fails on any unresolved reference. The bulk of previously-dead links are fixed by giving the autosummary class template’s Attributes block a:toctree:(so each property gets a page for numpydoc’s member-summary links to resolve); backticked class names are rewritten to fully-qualified targets inprocess_cross_referencesso they link from any page;intersphinxmappings (numpy / torch / python) resolve external types; nanobind’snumpy.ndarray[dtype=…]signature annotations are collapsed tonumpy.ndarray; and private-method references are reworded to plain literals. A shortnitpick_ignore_regexcovers the few irreducible refs (upstream-C++ getter-name mismatches,BicopFamilyvalue aliases, scikit-learn-generated methods).
Bug fixes in pyvinecopulib
Port the
integrate_2dmarginal-renormalisation fix to the torch backend (InterpolationGrid2D.integrate_2dandintegrate_2d_batched) socdfenforcesC(1, u_2) = u_2exactly, matching the post-vinecopulib#667 C++ CDF to machine precision on the on-the-fly path (vinecopulib#667).Declare
BicopFamilyenum members as class attributes in the generated type stubs so the documentedpv.BicopFamily.claytonaccess pattern passes static type checking (ty/ pyright / mypy), not only the module-level constants (#223).
Dependency changes
numpy>=2.0is now a project-wide requirement (was>=1.14);VineRegressorneedsnp.quantile(weights=...)from NumPy 2.0 (#211).[sklearn]extra addspandas>=2.0(used byVineBase.expand_factorsfor DataFrame inputs) (#211).
Changes in vinecopulib
NEW FEATURES
Early exit in vine selection when the structure is already a tree, avoiding redundant work in
select(vinecopulib#661).Per-family parameter / rotation / tail-dependence documentation on the
BicopFamilyenum members, surfaced through the Pythonfamiliessubpackage (#214, vinecopulib#668).Numpydoc-compliant
//!comments on every property getter / setter in the Python-binding surface, surfaced through the pyvinecopulib autosummary pages (#214, vinecopulib#670).Allow a custom
tree_criterionfunction for vine structure selection (vinecopulib#674).Per-row parameter evaluation for parametric bivariate copulas:
Bicop::pdf/cdf/hfunc1/hfunc2/hinv1/hinv2/loglikgain an overload taking ann×pparameter matrix (one set per observation) plus an optional thread count, backed by an eval-core refactor to a single parameter-aware leaf per family (vinecopulib#675).Improve start parameters when fitting pair copulas on discrete data (vinecopulib#677).
TriangularArray<T>owns its conversions:to_json(), a JSON constructor, andto_list()(nested rows), used by the pyvinecopulib bindings for the structure-array and per-edge outputs (vinecopulib#680).Analytic derivatives of the bivariate copula density and h-functions with respect to parameters and arguments for all parametric families, making
Vinecopscores and Hessians analytic (exact and faster); models with nonparametric pair copulas are now rejected byscores/hessian(vinecopulib#683, vinecopulib#687). The TLL family additionally gains the exact argument gradient of its density (vinecopulib#694).Rename the
VinecopHessian API:hessian_avg→hessian(average) andhessian→hessian_full(per-observation), mirrored by the Python bindings (vinecopulib#679).
PERFORMANCE
Speed up the bicop evaluation engine: vectorized closed-form pdf / h-function / CDF leaves and derivative-cascade allocation hygiene. Evaluations may shift by ≤ 1e-12 and fitted parameters by ≤ 1e-8 (vinecopulib#681).
Speed up
Vinecopevaluation and structure selection: no per-edge copula copies ininverse_rosenblatt, in-place data collapsing, parallel allocation-free Monte-Carlocdf, and selection fast paths.pdf_fullno longer duplicates continuous h-functions into thehfunc*_subbuffers (they are now empty for models without discrete variables) (vinecopulib#692).Speed up TLL fitting and evaluation: fused conditional-cdf interpolation and closed-form inversion of the conditional cdf. TLL
hinv1/hinv2(hencesimulate/inverse_rosenblatton TLL vines) may shift by ≤ 1e-9 (vinecopulib#691).Speed up
tools_stats: SIMDqnorm, leaner bivariate normal / t kernels, faster pseudo-observations and quasi-random fills. Gaussian / Student evaluations may shift at the ≤ 1e-12 level (vinecopulib#690).Faster shared Eigen / thread / integration primitives; the relaxed integration tolerance (1e-12 → 1e-9) may shift Kendall’s τ of the integrated families (BB6 / BB7 / BB8, Tawn) by up to ~1e-7 (vinecopulib#689).
Compute the Student t score’s df-only terms once per call, speeding up
Vinecopscores / Hessians and Student t maximum-likelihood fits (vinecopulib#693).
BUG FIXES
Fix an out-of-bounds read in the mixed discrete/continuous h-inverse (
hinv2for{d, c}copulas with a numeric inverse: Frank, BB1/6/7/8, Tawn) (vinecopulib#675).Add a missing thread-related include (vinecopulib#676).
Fix
integrade_2dnumerical handling on the bivariate-copula CDF path (vinecopulib#667).Fix a typo in
pdf_d_dand tighten the threshold under which the analytical derivative is preferred over the finite-difference fallback (vinecopulib#664).Drop an unused fit-controls option (vinecopulib#662).
Fix Doxygen typos surfaced by the
libclangextractor (vinecopulib#665).Bump CI off the deprecated
macos-13runner (vinecopulib#663).
Changes in kde1d
0.7.6
This release was only used to pull the latest changes from vinecopulib’s dev branch, which includes some bug fixes.
0.7.5
New features in pyvinecopulib
Bug fixes in pyvinecopulib
Improve repo health (#188)
Improve pickling by making the state a dict instead of tuple for all classes (#190)
0.7.4
This release was yanked due to an issue with the wheel upload. Please use 0.7.5 instead.
0.7.3
Breaking API changes in pyvinecopulib
Rename the
mst_algorithmargument inFitControlsVinecoptotree_algorithmto match the underlying C++ API (#178).The accepted values are now
"mst_prim","mst_kruskal"instead of"prim"and"kruskal".
Drop support for Python 3.8. Add support for Python 3.13 (#181).
New features in pyvinecopulib
Add support for random spanning trees in structure selection via
tree_algorithm="random_weighted"and"random_unweighted"using Wilson’s algorithm, enabling uniform or weight-proportional tree sampling (#178).Upgrade to
nanobindv0.2.7, which removes the need for casting hacks and improves compatibility (#180).Introduce a
format()method and improve__str__output for theVinecopclass (#144, #185).Add PEP 561-compatible stub files and full static type annotations across the package. Enable
mypychecks in CI (#144).Add
.[dev]and.[examples]extras inpyproject.tomlfor installing development and example dependencies (#181, #182, #183).Replace
flake8withrufffor linting and add code formatting checks (#182).Execute and test Jupyter notebooks in CI, including Graphviz rendering (#181).
Bug fixes in pyvinecopulib
Fix non-deterministic structure selection in multithreaded environments by decoupling criterion computation from edge insertion (#178, vinecopulib#640).
Refactor unit test environment setup and cleanup; remove stale directories in tests (#183).
Fix documentation rendering and improve docstrings across the package (#144, #185).
Changes in vinecopulib version 0.7.3
These changes originate from the release 0.7.3 of vinecopulib, the C++ library which powers pyvinecopulib.
BREAKING API CHANGES
The
mst_algorithmoption toFitControlsVinecophas been renamed totree_algorithmto allow for alternative spanning tree algorithms (#637).tree_algorithm’s default value is now"mst_prim"instead of"prim", and"mst_kruskal"replaces"kruskal"(#637).The CMake option
VINECOPULIB_BUILD_SHARED_LIBShas been changed toVINECOPULIB_PRECOMPILEDto better reflect its purpose (#641).
NEW FEATURES
Allow for random spanning trees as alternatives to the MST-based structure selection using
tree_algorithminFitControlsVinecopwith"random_weighted"or"random_unweighted"(#637).
BUG FIXES
Decouple edge insertion from criterion computation in
VinecopSelectorto fix randomness issues in structure selection when using multiple threads (#640)
Changes in vinecopulib version 0.7.2
These changes originate from the release 0.7.2 of vinecopulib, the C++ library which powers pyvinecopulib.
BUG FIXES
0.7.1
New features in pyvinecopulib
Add pickle support for all classes (#168)
Add
allow_rotationoption toFitControlsBicopandFitControlsVinecop(#168)
Bug fixes in pyvinecopulib
Upgrade nanobind to allow for single row matrices (fix #169 and #170)
Changes in vinecopulib version 0.7.1
These changes originate from the latest release of vinecopulib, the C++ library which powers pyvinecopulib.
NEW FEATURES
Add
allow_rotationoption toFitControlsBicopandFitControlsVinecopto allow for the rotation of the pair copulas (#628).Add a
FitControlsConfigstruct to create flexible and yet safe constructors forFitControlsBicopandFitControlsVinecop(#629).
BUG FIXES
0.7.0
This version introduces a switch to nanobind as a backend (#160): i.e., the C++ bindings, now use nanobind instead of pybind11. It allows for considerable performance improvements (~8x speedup in our latest benchmarks) and smaller binaries.
Breaking API changes in pyvinecopulib
Removal of the overloaded constructors:
For all classes, only one constructor is now available. The reason is that the overloaded constructors were un-Pythonic, error-prone, and could not be properly documented with Sphinx. They have been replaced by a single constructor for each class, along with factory
from_xzymethods.For the
{py:class}~pyvinecopulib.core.Bicop`` class:{py:meth}~pyvinecopulib.core.Bicop.from_family``: Instantiate from a family, rotation, parameters, and variable types.{py:meth}~pyvinecopulib.core.Bicop.from_data``: Instantiate from data, as well as optional controls and variable types.{py:meth}~pyvinecopulib.core.Bicop.from_file``: Instantiate from a file.{py:meth}~pyvinecopulib.core.Bicop.from_json``: Instantiate from a JSON-like string.
For the
{py:class}~pyvinecopulib.core.Vinecop`` class:{py:meth}~pyvinecopulib.core.Vinecop.from_dimension``: Instantiate an empty vine copula of a given dimension.{py:meth}~pyvinecopulib.core.Vinecop.from_data: Instantiate from data, as well as an optional `{py:class}`~pyvinecopulib.core.FitControlsVinecop, an{py:class}~pyvinecopulib.core.RVineStructure`` or matrix, and variable types.{py:meth}~pyvinecopulib.core.Vinecop.from_structure: Instantiate from an `{py:class}`~pyvinecopulib.core.RVineStructureor matrix, as well as optional pair-copulas and variable types.{py:meth}~pyvinecopulib.core.Vinecop.from_file``: Instantiate from a file.{py:meth}~pyvinecopulib.core.Vinecop.from_json``: Instantiate from a JSON-like string.
For the
{py:class}~pyvinecopulib.core.RVineStructure`` class:{py:meth}~pyvinecopulib.core.RVineStructure.from_dimension``: Instantiate a default structure of a given dimension and truncation level.{py:meth}~pyvinecopulib.core.RVineStructure.from_order``: Instantiate from an order vector.{py:meth}~pyvinecopulib.core.RVineStructure.from_matrix``: Instantiate from a matrix.{py:meth}~pyvinecopulib.core.RVineStructure.from_file``: Instantiate from a file.{py:meth}~pyvinecopulib.core.RVineStructure.from_json``: Instantiate from a JSON-like string.
New features in pyvinecopulib
Bug fixes in pyvinecopulib
Install and test source distribution (#164)
Changes in vinecopulib
These changes originate from the underlying C++ library, vinecopulib, which powers pyvinecopulib.
New features
Use analytical derivatives in discrete pdf/hfuncs (#572)
Allow for alternative for
"prim"vs"kruskal"in MST-based model selection (#577)Improve the dependencies install script to use it in other projects (#576)
Add tawn copula (#579)
Allow for the discrete Rosenblatt transform (#581)
Add
Vinecop::fit()(#584)Properly handle discrete variables for the TLL family (#597)
Weighted pseudo-observations (#602)
Cross-platform random numbers and add seeds options to
to_pseudo_obs(#603)Improve performance by
aligning with the
Rdefaults (e.g.,BOOST_NO_AUTO_PTR,BOOST_ALLOW_DEPRECATED_HEADERS,BOOST_MATH_PROMOTE_DOUBLE_POLICY=false,std::string nonparametric_method = "constant"for the TLL instead of"quadratic",-O3 -march=nativecompiler flags) and add benchmarking example (#592, #611, #613),using
Eigenelement-wise operations instead ofboostwhenever possible (#598, #612),using binary search in the TLL for
get_indices(#613).