pyvinecopulib
Introduction
What are vine copulas?
Sklar's theorem factorizes every joint distribution into one-dimensional marginals and a copula that carries the dependence between variables. A vine copula decomposes that copula into bivariate building blocks — pair copulas — arranged on a sequence of trees called an R-vine (Bedford & Cooke, 2002; Aas et al., 2009). The decomposition makes pair-by-pair estimation scale gracefully into high dimensions and gives a natural place to drop in non-parametric pair-copula estimators like Transformed Local Likelihood (TLL).
A short primer is available on the concepts page; a comprehensive list of publications lives on vine-copula.org.
What is pyvinecopulib?
pyvinecopulib is the Python interface to vinecopulib, a header-only C++ library for vine copula models based on Eigen. It provides high-performance implementations of the core features of the popular VineCopula R library, in particular inference algorithms for both vine copula and bivariate copula models. Advantages over VineCopula are
- a stand-alone C++ library with interfaces to both R and Python,
- a sleeker and more modern API,
- shorter runtimes and lower memory consumption, especially in high dimensions,
- nonparametric and multi-parameter families.
First core fit
The core package is enough to fit, inspect, evaluate, and sample a model:
import numpy as np
import pyvinecopulib as pv
rng = np.random.default_rng(0)
cov = [[1.0, 0.7, 0.3], [0.7, 1.0, 0.5], [0.3, 0.5, 1.0]]
x = rng.multivariate_normal([0, 0, 0], cov, size=500)
u = pv.to_pseudo_obs(x) # ranks, on the copula scale
vine = pv.Vinecop.from_data(u) # selects structure and families
print(vine) # the fitted trees, pair by pair
vine.loglik(u), vine.bic() # fit diagnostics
draws = vine.sample(100, seeds=[1]) # new copula-scale observations
For a distribution on the original data scale — no rank transform, no
to_pseudo_obs — pair the copula with one margin per variable through
pv.Vinedist. It needs no extras: the default margin is a boundary-corrected
kernel density.
dist = pv.Vinedist.from_data(y) # y is data, not pseudo-observations
dist.logpdf(y) # joint log-density
dist.sample(1000, seeds=[1]) # draws on the original scale
Bound a variable whose range you know, and the kernel density stops padding past it:
dist = pv.Vinedist.from_data(y, supports=[(0.0, None), None])
What a variable is — its bounds, its type — is a declaration about the data,
so it travels beside the fit configuration rather than inside it:
margin_controls= says how to estimate a margin, supports= and var_types=
say what it is estimating.
Notebooks 01, 02 and 03 build out these core workflows, and 07 covers the kernel-density margin they default to.
Optional subpackages
Three opt-in subpackages extend the core library:
-
pyvinecopulib.margins— parametric margins and family selection (SciPyMargin) to pair withVinedistwhen a kernel-density margin is not what you want:from pyvinecopulib.core import Vinedist from pyvinecopulib.margins import FitControlsMargin, SciPyMargin class ParametricVinedist(Vinedist): margin_class = SciPyMargin # a family per column, chosen from the data dist = ParametricVinedist.from_data( x, margin_controls=FitControlsMargin(selection_criterion="bic") ) print(dist.margins[0].family_name)
SciPyMarginneedspip install pyvinecopulib[scipy]. Another ecosystem's distributions reach a vine throughpyvinecopulib.margins.register_margin_adapter. -
pyvinecopulib.sklearn— scikit-learn-compatible estimators (VineDensity,VineRegressor). Drop a vine into any sklearn pipeline:from pyvinecopulib.sklearn import VineDensity density = VineDensity().fit(X) # fits a `Vinedist` density.score_samples(X[:3]) density.cdf(X[:3])
Install with
pip install pyvinecopulib[sklearn]. -
pyvinecopulib.torch— pure-PyTorch evaluators and data-scale modules (TorchTllBicop,TorchVinecop,TorchKde1d,TorchDistributionMargin, andTorchVinedist) for GPU placement and autograd:import torch from pyvinecopulib.torch import TorchVinedist # Where the model lives is read from the data, so placing the data places # the whole distribution -- margins and copula together. dist = TorchVinedist.from_data(torch.as_tensor(x, device="cuda")) y = torch.as_tensor(x[:5], device="cuda").requires_grad_(True) dist.log_prob(y).sum().backward() # autograd through the whole vine print(y.grad) # d log f / dy, on the GPU
The same evaluator backs the sklearn estimators: pass
distribution=TorchVinedisttoVineDensityorVineRegressor.Install with
pip install pyvinecopulib[torch].
API stability
pyvinecopulib.core, pyvinecopulib.families and pyvinecopulib.utils are
stable: changes there follow semantic versioning, with a deprecation cycle
before anything is removed.
The four contracts and their canonical bases live in core, so they are
stable too: BicopLike / BicopBase, VinecopLike / VinecopBase,
MarginLike / MarginBase, VinedistLike / VinedistBase. Build a subclass
on them with the same confidence as on Vinecop.
What is provisional in 1.x are the implementations in
pyvinecopulib.margins, pyvinecopulib.sklearn and pyvinecopulib.torch --
the curated family registry, the selection criteria, and the estimator and
controls surfaces -- which may change in a minor version as they meet real
data. The
torch-to-core evaluation parity is treated as required regardless. Pin an
exact version if you depend on those implementation surfaces.
Custom and conditional models
The core evaluators (Bicop / Vinecop / Kde1d / Vinedist, and their torch
counterparts) implement four array-agnostic contracts: BicopLike,
VinecopLike, MarginLike and VinedistLike. Subclass the matching
canonical, pure-Python base -- BicopBase, VinecopBase, MarginBase or
VinedistBase (NumPy or PyTorch) -- to plug your own pair copula, margin
or whole distribution into the library. Fitting has one shape on all four:
fit returns self, from_data constructs, and configuration travels as a
ControlsLike (anything with to_dict()).
A contract names everything the library may ask of that part, and everything past its evaluation surface has a default -- so inheriting the protocol directly is the other route: define what you implement, and a member you decline raises naming your class instead of failing somewhere inside a cascade.
A pair may depend on its vine conditioning-set values (a non-simplified
vine), on row-aligned external covariates, or on both. Vinedist can compose covariate-dependent
margins and such a copula into a full data-scale distribution Y | X.
This joint conditional model is an extension point, not a built-in fitter:
Vinedist.from_data(y, x=...) can fit custom conditional margin
specifications, but fits an x-independent compiled Vinecop for the copula
half. Fit custom conditional pairs through VinecopBase.fit and compose the
parts explicitly when dependence must also vary with X. See the
concepts page
and notebooks examples/10_extending_pyvinecopulib.ipynb and
examples/03_vine_distributions.ipynb.
Conditional sampling and likelihood diagnostics
A fitted Vinecop can draw from the conditional distribution of a subset of
variables given the rest (sample_conditional), select or reorient a
structure so a chosen conditioning set sits at the order tail, and expose its
tree-by-tree decomposition with the fitted pair copulas (get_trees).
Parametric fits additionally provide analytic log-likelihood scores, gradient,
Hessian, and score covariance (scores / gradient / hessian /
scores_cov, on both Bicop and Vinecop) for gradient-based inference. See
the examples/05_conditional_sampling_and_vines.ipynb notebook.
License
pyvinecopulib is provided under an MIT license that can be found in the LICENSE file. By using, distributing, or contributing to this project, you agree to the terms and conditions of this license.
Contact
If you have any questions regarding the library, feel free to open an issue or send a mail to info@vinecopulib.org.
Installation
On x86-64, the distributed wheels require the x86-64-v3 ISA baseline (AVX2 and FMA). The package checks this before loading its native extension and explains how to use a source build when a CPU or VM masks those features.
With pip
The latest release can be installed using pip:
pip install pyvinecopulib
With conda
Similarly, it can be installed with conda:
conda install conda-forge::pyvinecopulib
Or with mamba:
mamba install conda-forge::pyvinecopulib
From source
Start by cloning this repository, noting the --recursive option which is needed for the vinecopulib, wdm, and kde1d submodules:
git clone --recursive https://github.com/vinecopulib/pyvinecopulib.git
cd pyvinecopulib
The main build time prerequisites are:
- scikit-build-core (>=0.5.0),
- nanobind (>=2.7.0),
- libclang (>=18) — used to regenerate
src/include/docstr.hppfrom the C++ headers as a step of the build, - numpy / matplotlib / networkx — imported by the post-build stub-generation step,
- a compiler with C++17 support.
When installing via pip install . (the default), all of these are pulled into an isolated build environment automatically via [build-system] requires in pyproject.toml; you don't need to install them yourself.
To install from source, Eigen and Boost also need to be available, and CMake will try to find suitable versions automatically. Both are looked for in config mode -- FindBoost was removed in CMake 3.30 -- so if the configure step cannot find one, either put its prefix on CMAKE_PREFIX_PATH or point the environment variables below at the headers directly. Boost has one extra fallback, because all this package needs of it is headers: where no BoostConfig.cmake is found, a plain search for boost/version.hpp is tried before giving up, so a headers-only package such as conda-forge's libboost-headers works.
The recommended way to install pyvinecopulib from source is to use conda/mamba for the native build prerequisites and uv for the Python side:
mamba create -n pyvinecopulib python=3.11 boost eigen 'python-clang=18.*' uv
mamba activate pyvinecopulib
make sync
See the contributing guide for the full developer workflow.
Alternatively, you can specify manually the location of Eigen and Boost using the environment variables EIGEN3_INCLUDE_DIR and Boost_INCLUDE_DIR respectively.
On Linux, you can install the required packages and set the environment variables as follows:
sudo apt-get install libeigen3-dev libboost-all-dev
export Boost_INCLUDE_DIR=/usr/include
export EIGEN3_INCLUDE_DIR=/usr/include/eigen3
Finally, you can build and install pyvinecopulib using pip:
pip install .
The build automatically regenerates src/include/docstr.hpp (from the C++ headers via libclang) and src/pyvinecopulib/__init__.pyi (from the freshly built extension). Both files are gitignored — they're pure build artifacts.
For an editable install (recommended for development), use --no-build-isolation so the conda env's libclang is reused and editable.rebuild = true regenerates everything on each import:
pip install -e . --no-build-isolation
Documentation
Stable docs are published at https://pyvinecopulib.readthedocs.io. They are
rebuilt automatically by Read the Docs whenever a new release is tagged on
main and published to PyPI.
To build the documentation locally:
make docs # one-shot HTML build → docs/_build/html/
Contributing
Development setup, the build pipeline, the Makefile + pre-commit conventions, the CI workflow, and the release flow are all documented in the contributing guide.
Release files for pyvinecopulib 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyvinecopulib-1.0.0.tar.gz | 7.4 MB | Details |
Built distributions (wheels)
Total release size: 34.1 MB
Release files / pyvinecopulib-1.0.0.tar.gz
| Download URL | pyvinecopulib-1.0.0.tar.gz |
|---|---|
| Size | 7.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c3bb46512f7280e6ba56451a1e974e774a01571738566cd72cdb8874b525c348
|
|
BLAKE2b-256 checksum How to use checksums |
2fa5158f1978c84b552420a6e4c1710027bbab2b879c90d0bc66a377c2d3ff8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp312-abi3-win_amd64.whl
| Download URL | pyvinecopulib-1.0.0-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d599eb410db77660d04b3b3f8db4e7d982acd0e0f366ba3b47dae98506b95eb5
|
|
BLAKE2b-256 checksum How to use checksums |
5fe60885c800e4f2494044ad8f3305b5f8efb11126848009fb4dde288c05f432
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp312-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.12 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f1129b2ab5eec92aef4b4d4e57039158201383d76d0779e751bb9fc5b7d7da12
|
|
BLAKE2b-256 checksum How to use checksums |
046a6783cbdbd76f08e607ebd3bbfa9bcd39264e371e406dc17bebaa29b34a37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c03cff5753c1248a24406d4ad87c739682d2b82c765db16d7110efb983abe1a9
|
|
BLAKE2b-256 checksum How to use checksums |
4f36039b1605adf6d2e5bd8a9728b42357ad8e6bdbe842c3ca9fdf159acf3899
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | pyvinecopulib-1.0.0-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
228f8347e36be905afbedebca27b27993a1b1e3f08f1cec17d3a060f133cd4cc
|
|
BLAKE2b-256 checksum How to use checksums |
8b6a3f4a69b541949e3b698b18683dc874e47dc153d1db931d2a097e5185e893
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp312-abi3-macosx_10_13_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp312-abi3-macosx_10_13_x86_64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.12 abi3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
4777f7b5b85199bade01c57e4443ad779e418f5f84302585f4d85c9b4b77a693
|
|
BLAKE2b-256 checksum How to use checksums |
049921fa8446f129590c4b9f6ad9f2dd586ed3b1f1823b4a848062519c974092
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp311-cp311-win_amd64.whl
| Download URL | pyvinecopulib-1.0.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fa2c67e148ab54a2a0751006004090abfb4e7a83adb482807fa346da4ee6c660
|
|
BLAKE2b-256 checksum How to use checksums |
2407268378b691d5bb5dd7bdbf5958eb00bce4268d75d57ca406a1d26f6a0df1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp311-cp311-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.11 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
7500a03ea0298acdc55971491d15f24a2b527e03aad63fe4d547e53e16d0ccfe
|
|
BLAKE2b-256 checksum How to use checksums |
b3c11aede5a26aa7eb70649133af5512d11f856c93b65edfebf2cd4cf66b9542
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
9cb100ea1002799b0a34387a6990171ff4f30de9b407ffcedca0e8e8b1ea804b
|
|
BLAKE2b-256 checksum How to use checksums |
7a47cf1477d2e25254d5b23f25308b67bb4389601a40b0ca7fb350c79dc4345d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pyvinecopulib-1.0.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
84844216dceb47bd9f7e3675401c81c52fbb316daeeadebf77b7c1b8d83f65c1
|
|
BLAKE2b-256 checksum How to use checksums |
87151802550f2ff383cb430fa9091651cddcec7d2ffa00ebeef073390a73c508
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / pyvinecopulib-1.0.0-cp311-cp311-macosx_10_13_x86_64.whl
| Download URL | pyvinecopulib-1.0.0-cp311-cp311-macosx_10_13_x86_64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.11 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
d04e5cf367dd5189c1698051101a8606cd1bc266a3ae57c1a6cff6aa327b9f54
|
|
BLAKE2b-256 checksum How to use checksums |
46cb50aea42795ae51d5e0d20eba56fc7ed62abf3b238e204a3d2eca75821389
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|