vine-denoising-copula 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vine_denoising_copula-0.4.0/CHANGELOG.md +72 -0
- vine_denoising_copula-0.4.0/CITATION.cff +36 -0
- vine_denoising_copula-0.4.0/CONTRIBUTING.md +46 -0
- vine_denoising_copula-0.4.0/LICENSE +21 -0
- vine_denoising_copula-0.4.0/MANIFEST.in +8 -0
- vine_denoising_copula-0.4.0/PKG-INFO +257 -0
- vine_denoising_copula-0.4.0/README.md +183 -0
- vine_denoising_copula-0.4.0/configs/README.md +20 -0
- vine_denoising_copula-0.4.0/configs/data/synthetic.yaml +64 -0
- vine_denoising_copula-0.4.0/configs/default.yaml +100 -0
- vine_denoising_copula-0.4.0/configs/inference/default.yaml +94 -0
- vine_denoising_copula-0.4.0/configs/model/grid_unet.yaml +37 -0
- vine_denoising_copula-0.4.0/configs/train/base.yaml +66 -0
- vine_denoising_copula-0.4.0/configs/train/default.yaml +86 -0
- vine_denoising_copula-0.4.0/configs/train/denoiser_cond.yaml +89 -0
- vine_denoising_copula-0.4.0/configs/train/denoiser_cond_complex.yaml +100 -0
- vine_denoising_copula-0.4.0/configs/train/denoiser_cond_enhanced.yaml +113 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond.yaml +95 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex.yaml +96 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m128_smooth.yaml +110 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m64_smooth.yaml +109 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m64_smooth_bilinear.yaml +108 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m128_smooth.yaml +106 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m128_smooth_bilinear.yaml +96 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth.yaml +95 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_bilinear.yaml +96 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_probit.yaml +97 -0
- vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_probit_bilinear.yaml +95 -0
- vine_denoising_copula-0.4.0/configs/train/enhanced_cnn_cond.yaml +113 -0
- vine_denoising_copula-0.4.0/configs/train/linear_grid_cache.yaml +15 -0
- vine_denoising_copula-0.4.0/configs/train/linear_grid_pilot.yaml +24 -0
- vine_denoising_copula-0.4.0/configs/train/linear_grid_vdc128_v2.yaml +26 -0
- vine_denoising_copula-0.4.0/configs/train/linear_grid_vdc64_v2.yaml +26 -0
- vine_denoising_copula-0.4.0/docs/API.md +132 -0
- vine_denoising_copula-0.4.0/docs/CONFIGURATION.md +110 -0
- vine_denoising_copula-0.4.0/docs/DATASETS.md +68 -0
- vine_denoising_copula-0.4.0/docs/GETTING_STARTED.md +87 -0
- vine_denoising_copula-0.4.0/docs/IMPROVED_ESTIMATORS.md +264 -0
- vine_denoising_copula-0.4.0/docs/MODEL_RELEASES.md +71 -0
- vine_denoising_copula-0.4.0/docs/RELEASING.md +95 -0
- vine_denoising_copula-0.4.0/docs/TECHNICAL_DETAILS.md +57 -0
- vine_denoising_copula-0.4.0/docs/TRAINING_DATA.md +33 -0
- vine_denoising_copula-0.4.0/docs/USER_GUIDE.md +117 -0
- vine_denoising_copula-0.4.0/docs/assets/site.css +291 -0
- vine_denoising_copula-0.4.0/docs/compiled_sampler.md +84 -0
- vine_denoising_copula-0.4.0/docs/fast_fit.md +54 -0
- vine_denoising_copula-0.4.0/docs/index.html +48 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.1.0.md +26 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.1.1.md +27 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.0.md +55 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.1.md +19 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.2.md +10 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.3.md +10 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.4.md +12 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.5.md +14 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.6.md +7 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.7.md +38 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.3.0.md +27 -0
- vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.4.0.md +33 -0
- vine_denoising_copula-0.4.0/examples/README.md +31 -0
- vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/README.md +86 -0
- vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/reference_results.json +2908 -0
- vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/reproduce.py +228 -0
- vine_denoising_copula-0.4.0/examples/estimate_mutual_information.py +40 -0
- vine_denoising_copula-0.4.0/examples/fit_vine_copula.py +41 -0
- vine_denoising_copula-0.4.0/examples/train_custom_copula.py +40 -0
- vine_denoising_copula-0.4.0/examples/use_pretrained_model.py +105 -0
- vine_denoising_copula-0.4.0/examples/visualize_copulas.py +35 -0
- vine_denoising_copula-0.4.0/pyproject.toml +144 -0
- vine_denoising_copula-0.4.0/scripts/build_docs_site.py +267 -0
- vine_denoising_copula-0.4.0/scripts/check_installation.py +110 -0
- vine_denoising_copula-0.4.0/scripts/download_pretrained.py +49 -0
- vine_denoising_copula-0.4.0/scripts/download_uci_datasets.py +552 -0
- vine_denoising_copula-0.4.0/scripts/legacy/evaluate.py +529 -0
- vine_denoising_copula-0.4.0/scripts/legacy/infer.py +339 -0
- vine_denoising_copula-0.4.0/scripts/legacy/train.py +148 -0
- vine_denoising_copula-0.4.0/scripts/package_pretrained_model.py +109 -0
- vine_denoising_copula-0.4.0/scripts/train_linear_grid_estimator.py +26 -0
- vine_denoising_copula-0.4.0/scripts/train_unified.py +1815 -0
- vine_denoising_copula-0.4.0/scripts/upload_pretrained_to_hf.py +131 -0
- vine_denoising_copula-0.4.0/scripts/verify_index_release.py +53 -0
- vine_denoising_copula-0.4.0/setup.cfg +4 -0
- vine_denoising_copula-0.4.0/tests/test_compiled_sampler.py +95 -0
- vine_denoising_copula-0.4.0/tests/test_continuous_mixtures.py +84 -0
- vine_denoising_copula-0.4.0/tests/test_diffusion_training_smoke.py +174 -0
- vine_denoising_copula-0.4.0/tests/test_docs.py +45 -0
- vine_denoising_copula-0.4.0/tests/test_fast_fit_identity.py +70 -0
- vine_denoising_copula-0.4.0/tests/test_full_pipeline.py +403 -0
- vine_denoising_copula-0.4.0/tests/test_hfunc_dependent_boundary.py +27 -0
- vine_denoising_copula-0.4.0/tests/test_hfunc_independence_accuracy.py +47 -0
- vine_denoising_copula-0.4.0/tests/test_hfunc_monotonicity.py +46 -0
- vine_denoising_copula-0.4.0/tests/test_hfunc_vectorized_inverse.py +73 -0
- vine_denoising_copula-0.4.0/tests/test_histogram_normalization.py +40 -0
- vine_denoising_copula-0.4.0/tests/test_information_metrics.py +35 -0
- vine_denoising_copula-0.4.0/tests/test_ipfp_log.py +35 -0
- vine_denoising_copula-0.4.0/tests/test_linear_grid_copula.py +91 -0
- vine_denoising_copula-0.4.0/tests/test_linear_grid_estimator.py +172 -0
- vine_denoising_copula-0.4.0/tests/test_linear_grid_pretraining.py +84 -0
- vine_denoising_copula-0.4.0/tests/test_linear_grid_training.py +150 -0
- vine_denoising_copula-0.4.0/tests/test_metrics_tail.py +24 -0
- vine_denoising_copula-0.4.0/tests/test_model_factory.py +57 -0
- vine_denoising_copula-0.4.0/tests/test_package_imports.py +17 -0
- vine_denoising_copula-0.4.0/tests/test_prepared_sampler.py +91 -0
- vine_denoising_copula-0.4.0/tests/test_pretrained.py +18 -0
- vine_denoising_copula-0.4.0/tests/test_pretrained_linear_grid.py +117 -0
- vine_denoising_copula-0.4.0/tests/test_probit_transform.py +32 -0
- vine_denoising_copula-0.4.0/tests/test_training_example.py +26 -0
- vine_denoising_copula-0.4.0/tests/test_training_generators.py +135 -0
- vine_denoising_copula-0.4.0/tests/test_uci_maf_preprocess.py +275 -0
- vine_denoising_copula-0.4.0/tests/test_vine_gaussian_ground_truth.py +101 -0
- vine_denoising_copula-0.4.0/tests/test_vine_linear_grid.py +146 -0
- vine_denoising_copula-0.4.0/tests/test_vine_recursion.py +196 -0
- vine_denoising_copula-0.4.0/tests/test_vine_structure_robustness.py +26 -0
- vine_denoising_copula-0.4.0/vdc/__init__.py +86 -0
- vine_denoising_copula-0.4.0/vdc/baselines/__init__.py +6 -0
- vine_denoising_copula-0.4.0/vdc/baselines/pyvinecopulib.py +208 -0
- vine_denoising_copula-0.4.0/vdc/cli.py +205 -0
- vine_denoising_copula-0.4.0/vdc/config.py +196 -0
- vine_denoising_copula-0.4.0/vdc/data/__init__.py +39 -0
- vine_denoising_copula-0.4.0/vdc/data/_bicop.py +37 -0
- vine_denoising_copula-0.4.0/vdc/data/complex_copulas.py +122 -0
- vine_denoising_copula-0.4.0/vdc/data/conditional_copulas.py +325 -0
- vine_denoising_copula-0.4.0/vdc/data/continuous_mixtures.py +219 -0
- vine_denoising_copula-0.4.0/vdc/data/generators.py +755 -0
- vine_denoising_copula-0.4.0/vdc/data/hist.py +330 -0
- vine_denoising_copula-0.4.0/vdc/data/loaders.py +286 -0
- vine_denoising_copula-0.4.0/vdc/data/mixtures.py +351 -0
- vine_denoising_copula-0.4.0/vdc/data/onthefly.py +403 -0
- vine_denoising_copula-0.4.0/vdc/data/paths.py +37 -0
- vine_denoising_copula-0.4.0/vdc/data/streaming.py +340 -0
- vine_denoising_copula-0.4.0/vdc/data/tabular.py +151 -0
- vine_denoising_copula-0.4.0/vdc/eval/pairs.py +282 -0
- vine_denoising_copula-0.4.0/vdc/eval/visualize.py +682 -0
- vine_denoising_copula-0.4.0/vdc/inference/density.py +284 -0
- vine_denoising_copula-0.4.0/vdc/losses/__init__.py +539 -0
- vine_denoising_copula-0.4.0/vdc/models/__init__.py +17 -0
- vine_denoising_copula-0.4.0/vdc/models/copula_cnn.py +223 -0
- vine_denoising_copula-0.4.0/vdc/models/copula_cnn_enhanced.py +300 -0
- vine_denoising_copula-0.4.0/vdc/models/copula_denoiser.py +200 -0
- vine_denoising_copula-0.4.0/vdc/models/copula_diffusion.py +376 -0
- vine_denoising_copula-0.4.0/vdc/models/factory.py +92 -0
- vine_denoising_copula-0.4.0/vdc/models/hfunc.py +587 -0
- vine_denoising_copula-0.4.0/vdc/models/linear_grid_copula.py +205 -0
- vine_denoising_copula-0.4.0/vdc/models/linear_grid_estimator.py +281 -0
- vine_denoising_copula-0.4.0/vdc/models/projection.py +322 -0
- vine_denoising_copula-0.4.0/vdc/models/sample_size_agnostic.py +413 -0
- vine_denoising_copula-0.4.0/vdc/models/simple_cnn.py +132 -0
- vine_denoising_copula-0.4.0/vdc/models/unet_grid.py +443 -0
- vine_denoising_copula-0.4.0/vdc/pretrained.py +520 -0
- vine_denoising_copula-0.4.0/vdc/resources/__init__.py +1 -0
- vine_denoising_copula-0.4.0/vdc/resources/pretrained/__init__.py +1 -0
- vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m128_v2.json +82 -0
- vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m64_v1.json +34 -0
- vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m64_v2.json +82 -0
- vine_denoising_copula-0.4.0/vdc/train/__init__.py +16 -0
- vine_denoising_copula-0.4.0/vdc/train/linear_grid_pretraining.py +346 -0
- vine_denoising_copula-0.4.0/vdc/train/linear_grid_training.py +471 -0
- vine_denoising_copula-0.4.0/vdc/train/train_grid.py +490 -0
- vine_denoising_copula-0.4.0/vdc/train/unified_trainer.py +786 -0
- vine_denoising_copula-0.4.0/vdc/utils/__init__.py +32 -0
- vine_denoising_copula-0.4.0/vdc/utils/histogram.py +109 -0
- vine_denoising_copula-0.4.0/vdc/utils/information.py +94 -0
- vine_denoising_copula-0.4.0/vdc/utils/ipfp_log.py +100 -0
- vine_denoising_copula-0.4.0/vdc/utils/metrics.py +174 -0
- vine_denoising_copula-0.4.0/vdc/utils/probit_transform.py +336 -0
- vine_denoising_copula-0.4.0/vdc/utils/smoothing.py +224 -0
- vine_denoising_copula-0.4.0/vdc/utils/stats.py +375 -0
- vine_denoising_copula-0.4.0/vdc/utils/training_logger.py +357 -0
- vine_denoising_copula-0.4.0/vdc/utils/training_utils.py +378 -0
- vine_denoising_copula-0.4.0/vdc/vine/api.py +1277 -0
- vine_denoising_copula-0.4.0/vdc/vine/compiled_sampler.cpp +94 -0
- vine_denoising_copula-0.4.0/vdc/vine/compiled_sampler.py +197 -0
- vine_denoising_copula-0.4.0/vdc/vine/copula_diffusion.py +342 -0
- vine_denoising_copula-0.4.0/vdc/vine/metrics.py +378 -0
- vine_denoising_copula-0.4.0/vdc/vine/recursion.py +593 -0
- vine_denoising_copula-0.4.0/vdc/vine/structure.py +370 -0
- vine_denoising_copula-0.4.0/vdc/vine/vine_types.py +511 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/PKG-INFO +257 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/SOURCES.txt +181 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/dependency_links.txt +1 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/entry_points.txt +2 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/requires.txt +59 -0
- vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Published versions are immutable. The NeurIPS 2026 paper pins v0.2.6;
|
|
4
|
+
its checkpoints and reproduction archives remain available.
|
|
5
|
+
|
|
6
|
+
## v0.4.0 — 2026-11-13
|
|
7
|
+
|
|
8
|
+
- Separate pretrained model construction from the training engine. The base
|
|
9
|
+
install no longer requires pyvinecopulib, Matplotlib, HDF5, Hydra or
|
|
10
|
+
scikit-learn; use `[train]`, `[baselines]`, `[viz]` and `[data]` as needed.
|
|
11
|
+
- Require Python 3.11 or later and test Python 3.11–3.13.
|
|
12
|
+
- Add installed-model checks and TestPyPI/PyPI Trusted Publishing. Model
|
|
13
|
+
weights, constructor calculations and inference defaults are unchanged.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
- Name the probability-mass histogram `vdc.data.hist.scatter_to_mass_hist`
|
|
17
|
+
and retain `scatter_to_hist` as a compatibility alias. Document the distinct
|
|
18
|
+
density normalization required by pretrained inference, and test that
|
|
19
|
+
input contract through the public estimator. Histogram values and model
|
|
20
|
+
outputs are unchanged.
|
|
21
|
+
- Add a portable reproduction and reference results for the histogram
|
|
22
|
+
normalization failure reported in issue #8.
|
|
23
|
+
|
|
24
|
+
## v0.3.0 — 2026-11-12
|
|
25
|
+
|
|
26
|
+
- Rewrite the README and the documentation landing page with the method overview, results
|
|
27
|
+
figures, pretrained-model table, training commands and reproduction guide.
|
|
28
|
+
- Keep maintained entry points in `scripts/`; move the GridUNet workflow scripts to
|
|
29
|
+
`scripts/legacy/` and remove the two deprecated demo shims (use `examples/`).
|
|
30
|
+
- Gather all NeurIPS 2026 reproduction material in `paper/`: the experiment runners and
|
|
31
|
+
reference outputs (formerly `projects/neurips2026/`), the figure and table generators with
|
|
32
|
+
their saved inputs (formerly distributed only as a release archive) and the ablation training
|
|
33
|
+
configurations (formerly in `configs/train/`). Saved outputs, runner defaults and numerical
|
|
34
|
+
behavior are unchanged; [`paper/README.md`](paper/README.md) maps every figure and table to
|
|
35
|
+
its script, inputs and runner.
|
|
36
|
+
- Add the opt-in linear-grid estimator of the paper's exploratory retraining
|
|
37
|
+
appendix: `LinearGridCopula` (consistent PDF, h and inverse-h functions),
|
|
38
|
+
`VineCopulaModel(pair_estimator="linear_grid", ...)`,
|
|
39
|
+
`VineCopulaModel.from_pretrained` and `estimate_pair_copula_from_samples`.
|
|
40
|
+
Defaults and the results of `vdc-denoiser-m64-v1` are unchanged.
|
|
41
|
+
- Add configurable conditional clipping (`conditional_clip_eps`, default 1e-6).
|
|
42
|
+
- Release `vdc-denoiser-m64-v2` and `vdc-denoiser-m128-v2` on Hugging Face (manifests pin the
|
|
43
|
+
upload revisions) and their training pilot `vdc-linear-grid-pilot`; `checkpoint_path=` loads a
|
|
44
|
+
hash-verified local copy of any registered model.
|
|
45
|
+
- Add their pretraining, continuous-mixture data and fine-tuning recipes
|
|
46
|
+
(`scripts/train_linear_grid_estimator.py`, `configs/train/linear_grid_*.yaml`).
|
|
47
|
+
- Fix `stage_release_bundle` for manifests without local source files.
|
|
48
|
+
|
|
49
|
+
Details: [linear-grid estimators](docs/IMPROVED_ESTIMATORS.md).
|
|
50
|
+
|
|
51
|
+
## v0.2.7 — 2026-11-12
|
|
52
|
+
|
|
53
|
+
- Correct Joe/BB1/BB7 training samples and BB density targets; test against analytic CDFs.
|
|
54
|
+
- Correct Frank/Joe conditional CDFs, BB rotations and mixture counts; reject invalid conditional training pairs.
|
|
55
|
+
- Replace obsolete API examples with programs using the released model loader.
|
|
56
|
+
- Correct API signatures and document numerical limits and opt-in batching.
|
|
57
|
+
- Simplify installation, consolidate release documentation and expand CI coverage.
|
|
58
|
+
- Keep manuscript production and internal research records outside the library.
|
|
59
|
+
|
|
60
|
+
Details: [v0.2.7 release notes](docs/releases/RELEASE_NOTES_v0.2.7.md).
|
|
61
|
+
|
|
62
|
+
## Earlier releases
|
|
63
|
+
|
|
64
|
+
- [v0.2.6](docs/releases/RELEASE_NOTES_v0.2.6.md)
|
|
65
|
+
- [v0.2.5](docs/releases/RELEASE_NOTES_v0.2.5.md)
|
|
66
|
+
- [v0.2.4](docs/releases/RELEASE_NOTES_v0.2.4.md)
|
|
67
|
+
- [v0.2.3](docs/releases/RELEASE_NOTES_v0.2.3.md)
|
|
68
|
+
- [v0.2.2](docs/releases/RELEASE_NOTES_v0.2.2.md)
|
|
69
|
+
- [v0.2.1](docs/releases/RELEASE_NOTES_v0.2.1.md)
|
|
70
|
+
- [v0.2.0](docs/releases/RELEASE_NOTES_v0.2.0.md)
|
|
71
|
+
- [v0.1.1](docs/releases/RELEASE_NOTES_v0.1.1.md)
|
|
72
|
+
- [v0.1.0](docs/releases/RELEASE_NOTES_v0.1.0.md)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite the repository. If you use the VDC method, please also cite the associated paper."
|
|
3
|
+
title: "Vine Denoising Copula (VDC)"
|
|
4
|
+
abstract: >-
|
|
5
|
+
Vine Denoising Copula (VDC) is an amortized vine-copula pipeline that
|
|
6
|
+
trains one bivariate denoising density operator and reuses it across
|
|
7
|
+
all vine edges. The project provides the trained edge estimator,
|
|
8
|
+
inference code for D-/C-/R-vines, IPFP projection, information-theoretic
|
|
9
|
+
estimators (MI, TC), and released-model verification tooling.
|
|
10
|
+
authors:
|
|
11
|
+
- family-names: "Safaai"
|
|
12
|
+
given-names: "Houman"
|
|
13
|
+
affiliation: "Kempner Institute at Harvard University"
|
|
14
|
+
license: MIT
|
|
15
|
+
repository-code: "https://github.com/KempnerInstitute/vine-denoising-copula"
|
|
16
|
+
url: "https://huggingface.co/hsafaai/vdc-denoiser-m64-v1"
|
|
17
|
+
keywords:
|
|
18
|
+
- copula
|
|
19
|
+
- vine copula
|
|
20
|
+
- density estimation
|
|
21
|
+
- mutual information
|
|
22
|
+
- total correlation
|
|
23
|
+
- amortized inference
|
|
24
|
+
version: "0.4.0"
|
|
25
|
+
date-released: 2026-11-13
|
|
26
|
+
preferred-citation:
|
|
27
|
+
type: conference-paper
|
|
28
|
+
title: "Amortized Vine Copulas for High-Dimensional Density and Information Estimation"
|
|
29
|
+
authors:
|
|
30
|
+
- family-names: "Safaai"
|
|
31
|
+
given-names: "Houman"
|
|
32
|
+
affiliation: "Kempner Institute for the Study of Natural and Artificial Intelligence at Harvard University"
|
|
33
|
+
year: 2026
|
|
34
|
+
collection-title: "Advances in Neural Information Processing Systems"
|
|
35
|
+
conference:
|
|
36
|
+
name: "NeurIPS 2026"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Start from `main`, the maintained public library branch. Keep changes focused
|
|
4
|
+
and open a pull request with the problem, resulting behavior and verification.
|
|
5
|
+
Use tagged releases and explicit checkpoint hashes for scientific reproduction.
|
|
6
|
+
|
|
7
|
+
## Development environment
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python -m pip install -e '.[dev,train,data,viz]'
|
|
11
|
+
python -m pytest tests
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A CPU is sufficient for the tests. Optional compiled-sampler tests require a
|
|
15
|
+
C++17/OpenMP compiler; tests that require unavailable artifacts report a skip.
|
|
16
|
+
Do not describe skipped checks as passed. Avoid downloading large checkpoints
|
|
17
|
+
in unit tests; use a separate integration check for the released model.
|
|
18
|
+
|
|
19
|
+
## Repository organization
|
|
20
|
+
|
|
21
|
+
- `vdc/`: reusable models, data utilities, training and inference.
|
|
22
|
+
- `scripts/`: software entry points and model/data tools.
|
|
23
|
+
- `examples/`: small programs using the public API.
|
|
24
|
+
- `docs/`: user and maintainer documentation.
|
|
25
|
+
- `paper/`: everything paper-specific: experiment runners, figure and table
|
|
26
|
+
generators with their compact saved inputs, reference outputs and the
|
|
27
|
+
ablation training configurations of the NeurIPS 2026 paper.
|
|
28
|
+
|
|
29
|
+
Keep paper material in `paper/`; it imports `vdc` and is not installed with the
|
|
30
|
+
package. Saved inputs there are immutable: their hashes are recorded in
|
|
31
|
+
`MANIFEST.json` files and checked by the figure scripts. Keep manuscript
|
|
32
|
+
builds, cluster launchers and internal research notes outside this repository.
|
|
33
|
+
Do not commit credentials, personal storage paths, scheduler accounts, raw
|
|
34
|
+
datasets or model weights.
|
|
35
|
+
|
|
36
|
+
## Numerical changes
|
|
37
|
+
|
|
38
|
+
Keep estimator changes separate from organization and documentation work. Test
|
|
39
|
+
fixed inputs, model serialization, seeds and relevant numerical outputs. Do not
|
|
40
|
+
change a scientific experiment's source pin solely because a newer release
|
|
41
|
+
imports successfully. Preserve historical release tags and publish numerical
|
|
42
|
+
changes in the changelog.
|
|
43
|
+
|
|
44
|
+
Use markers, line styles, hatches or labels in addition to color in examples.
|
|
45
|
+
Document shapes, units, random-state behavior and unsupported combinations.
|
|
46
|
+
See the [release guide](docs/RELEASING.md) before publishing a version.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 The Vine Denoising Copula Authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
include LICENSE README.md CHANGELOG.md CONTRIBUTING.md CITATION.cff
|
|
2
|
+
recursive-include docs *.md *.html *.css
|
|
3
|
+
recursive-include configs *.yaml *.md
|
|
4
|
+
recursive-include examples *.py *.md
|
|
5
|
+
include examples/diagnostics/histogram_normalization/reference_results.json
|
|
6
|
+
recursive-include scripts *.py
|
|
7
|
+
recursive-include tests *.py
|
|
8
|
+
include vdc/vine/compiled_sampler.cpp
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vine-denoising-copula
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Vine Denoising Copula for high-dimensional vine-copula modeling and information estimation
|
|
5
|
+
Author-email: Houman Safaai <houman_safaai@harvard.edu>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/KempnerInstitute/vine-denoising-copula
|
|
8
|
+
Project-URL: Repository, https://github.com/KempnerInstitute/vine-denoising-copula
|
|
9
|
+
Project-URL: Issues, https://github.com/KempnerInstitute/vine-denoising-copula/issues
|
|
10
|
+
Project-URL: Documentation, https://kempnerinstitute.github.io/vine-denoising-copula/
|
|
11
|
+
Keywords: copulas,vine copulas,density estimation,mutual information,machine learning
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: torch>=2.0.0
|
|
25
|
+
Requires-Dist: filelock>=4.2.1
|
|
26
|
+
Requires-Dist: numpy>=1.24.0
|
|
27
|
+
Requires-Dist: scipy>=1.10.0
|
|
28
|
+
Requires-Dist: networkx>=3.0
|
|
29
|
+
Requires-Dist: tqdm>=4.65.0
|
|
30
|
+
Requires-Dist: PyYAML>=6.0
|
|
31
|
+
Provides-Extra: train
|
|
32
|
+
Requires-Dist: matplotlib>=3.7.0; extra == "train"
|
|
33
|
+
Requires-Dist: h5py>=3.8.0; extra == "train"
|
|
34
|
+
Requires-Dist: hydra-core>=1.3.0; extra == "train"
|
|
35
|
+
Requires-Dist: pyvinecopulib<0.8,>=0.7.5; extra == "train"
|
|
36
|
+
Provides-Extra: baselines
|
|
37
|
+
Requires-Dist: pyvinecopulib<0.8,>=0.7.5; extra == "baselines"
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: build>=1.2.0; extra == "dev"
|
|
40
|
+
Requires-Dist: ruff>=0.0.270; extra == "dev"
|
|
41
|
+
Requires-Dist: black>=23.3.0; extra == "dev"
|
|
42
|
+
Requires-Dist: mypy>=1.3.0; extra == "dev"
|
|
43
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pytest>=7.3.0; extra == "dev"
|
|
45
|
+
Requires-Dist: hypothesis>=6.75.0; extra == "dev"
|
|
46
|
+
Requires-Dist: ipython>=8.12.0; extra == "dev"
|
|
47
|
+
Requires-Dist: jupyter>=1.0.0; extra == "dev"
|
|
48
|
+
Provides-Extra: test
|
|
49
|
+
Requires-Dist: pytest>=7.3.0; extra == "test"
|
|
50
|
+
Requires-Dist: hypothesis>=6.75.0; extra == "test"
|
|
51
|
+
Provides-Extra: viz
|
|
52
|
+
Requires-Dist: matplotlib>=3.7.0; extra == "viz"
|
|
53
|
+
Requires-Dist: seaborn>=0.12.0; extra == "viz"
|
|
54
|
+
Requires-Dist: pandas>=2.0.0; extra == "viz"
|
|
55
|
+
Provides-Extra: data
|
|
56
|
+
Requires-Dist: h5py>=3.8.0; extra == "data"
|
|
57
|
+
Requires-Dist: pandas>=2.0.0; extra == "data"
|
|
58
|
+
Requires-Dist: openpyxl>=3.1.0; extra == "data"
|
|
59
|
+
Provides-Extra: release
|
|
60
|
+
Requires-Dist: build>=1.2.0; extra == "release"
|
|
61
|
+
Requires-Dist: huggingface-hub>=0.20.0; extra == "release"
|
|
62
|
+
Provides-Extra: tracking
|
|
63
|
+
Requires-Dist: wandb>=0.15.0; extra == "tracking"
|
|
64
|
+
Provides-Extra: r-baselines
|
|
65
|
+
Requires-Dist: rpy2>=3.5.0; extra == "r-baselines"
|
|
66
|
+
Provides-Extra: paper-baselines
|
|
67
|
+
Requires-Dist: pyvinecopulib<0.8,>=0.7.5; extra == "paper-baselines"
|
|
68
|
+
Requires-Dist: scikit-learn>=1.2.0; extra == "paper-baselines"
|
|
69
|
+
Requires-Dist: matplotlib>=3.7.0; extra == "paper-baselines"
|
|
70
|
+
Requires-Dist: copulas>=0.13.0; extra == "paper-baselines"
|
|
71
|
+
Requires-Dist: ennemi>=1.4.0; extra == "paper-baselines"
|
|
72
|
+
Requires-Dist: pytorch-lightning>=2.1.0; extra == "paper-baselines"
|
|
73
|
+
Dynamic: license-file
|
|
74
|
+
|
|
75
|
+
<div align="center">
|
|
76
|
+
|
|
77
|
+
# Vine Denoising Copula (VDC)
|
|
78
|
+
|
|
79
|
+
**Amortized vine copulas for high-dimensional density and information estimation**
|
|
80
|
+
|
|
81
|
+
[](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml)
|
|
82
|
+
[](https://kempnerinstitute.github.io/vine-denoising-copula/)
|
|
83
|
+
[](https://arxiv.org/abs/2604.20568)
|
|
84
|
+
[](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1)
|
|
85
|
+
[](LICENSE)
|
|
86
|
+
|
|
87
|
+
[Paper](https://arxiv.org/abs/2604.20568) · [Documentation](https://kempnerinstitute.github.io/vine-denoising-copula/) · [Quick start](#quick-start) · [Pretrained models](#pretrained-models) · [Reproduce the paper](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md)
|
|
88
|
+
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
Vine copulas model high-dimensional dependence through a tree of bivariate
|
|
94
|
+
**pair-copulas**, but classical fitting estimates every edge separately, which
|
|
95
|
+
becomes the bottleneck as dimension grows. **VDC** trains one bivariate
|
|
96
|
+
denoising network on simulated copulas and reuses it for every edge: it maps the
|
|
97
|
+
empirical histogram of an edge to a density grid in a single forward pass, and
|
|
98
|
+
an IPFP (Sinkhorn) projection restores uniform copula marginals. The fitted
|
|
99
|
+
pair-copulas and their cached h-functions plug into standard vine recursion, so
|
|
100
|
+
the model keeps an explicit, interpretable dependence structure while replacing
|
|
101
|
+
repeated per-edge fitting with reusable neural inference.
|
|
102
|
+
|
|
103
|
+
**What you can do with it**
|
|
104
|
+
|
|
105
|
+
- Estimate a **bivariate copula density** from samples in milliseconds.
|
|
106
|
+
- Fit **D-, C- and regular vines** in high dimensions, with batched GPU inference.
|
|
107
|
+
- Evaluate **likelihoods**, draw **samples** (inverse Rosenblatt), and compute
|
|
108
|
+
conditional transforms.
|
|
109
|
+
- Estimate **mutual information** and **total correlation**, decomposed by edge
|
|
110
|
+
and by tree of the fitted vine.
|
|
111
|
+
- Train your own estimator on the included synthetic copula generators.
|
|
112
|
+
|
|
113
|
+
## Results at a glance
|
|
114
|
+
|
|
115
|
+

|
|
116
|
+
|
|
117
|
+
From the NeurIPS 2026 paper (all numbers use the released `vdc-denoiser-m64-v1`):
|
|
118
|
+
|
|
119
|
+
| | |
|
|
120
|
+
|---|---|
|
|
121
|
+
| Bivariate density (9 in-library cases) | lower ISE than histogram, KDE and pyvine-TLL at **~6 ms per edge** on a GPU; parametric family selection is more accurate on its own families at ~100x the cost |
|
|
122
|
+
| Families never seen in training | matches per-case TLL refits in held-out likelihood and **roughly halves MI error** |
|
|
123
|
+
| High-dimensional vines (d = 100–500) | **3.3–4.0x faster** than 16-thread pyvine-TLL on one node (749 s vs 2,489 s at d = 500) |
|
|
124
|
+
| S&P100 daily returns (d = 100) | **best held-out likelihood** of the compared methods on random and chronological splits |
|
|
125
|
+
| Information estimation | fewer data-processing-inequality violations and lower additivity error than KSG; TC at d = 50 in **0.71 s** |
|
|
126
|
+
|
|
127
|
+
Limits are reported alongside: the 64x64 grid bounds accuracy for near-deterministic
|
|
128
|
+
pairs, and chained conditional prediction (VaR, imputation) is not yet competitive.
|
|
129
|
+
See the paper and [the reproduction guide](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md) for every protocol.
|
|
130
|
+
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
## Installation
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
python -m pip install vine-denoising-copula
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Python 3.11 or later with PyTorch 2 is required. A GPU is optional. The base
|
|
140
|
+
install supports pretrained pair densities, vine fitting, likelihoods and
|
|
141
|
+
sampling without pyvinecopulib or plotting/training packages. Optional features:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
python -m pip install 'vine-denoising-copula[train]' # synthetic data and training
|
|
145
|
+
python -m pip install 'vine-denoising-copula[baselines]' # qualified pyvinecopulib 0.7.x
|
|
146
|
+
python -m pip install 'vine-denoising-copula[viz,data]' # plotting and dataset downloads
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Install `vine-denoising-copula`, not the unrelated PyPI project `vdc`. Both
|
|
150
|
+
provide an `import vdc` namespace, so use separate virtual environments.
|
|
151
|
+
Checkpoints remain on Hugging Face and are downloaded and hash-verified on first
|
|
152
|
+
use. For a source installation:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
git clone https://github.com/KempnerInstitute/vine-denoising-copula.git
|
|
156
|
+
cd vine-denoising-copula
|
|
157
|
+
python -m pip install -e '.[dev,train,data,viz]'
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
See [getting started](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/GETTING_STARTED.md) for CPU/GPU PyTorch installation.
|
|
161
|
+
The paper reproduction environment retains its recorded dependency versions.
|
|
162
|
+
|
|
163
|
+
## Quick start
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
import numpy as np
|
|
167
|
+
from vdc import load_pretrained_model, estimate_pair_density_from_samples, VineCopulaModel
|
|
168
|
+
|
|
169
|
+
bundle = load_pretrained_model("vdc-denoiser-m64-v1", device="cpu") # downloads and hash-checks
|
|
170
|
+
|
|
171
|
+
# 1) a bivariate copula density from pseudo-observations in [0, 1]^2
|
|
172
|
+
u = np.random.default_rng(0).uniform(size=(2000, 2))
|
|
173
|
+
density = estimate_pair_density_from_samples(bundle, u) # (64, 64) grid
|
|
174
|
+
|
|
175
|
+
# 2) a vine on d-dimensional pseudo-observations
|
|
176
|
+
x = np.random.default_rng(1).uniform(size=(2000, 8))
|
|
177
|
+
vine = VineCopulaModel(vine_type="dvine", m=64, device="cpu", batch_edges=True)
|
|
178
|
+
vine.fit(x, bundle.model, diffusion=bundle.diffusion)
|
|
179
|
+
loglik = vine.logpdf(x) # per-row log copula density
|
|
180
|
+
samples = vine.simulate(n=1000) # inverse-Rosenblatt sampling
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Pseudo-observations are ranks scaled to (0, 1). Fit marginal transforms on
|
|
184
|
+
training rows and apply them to held-out rows. More: [examples/](https://github.com/KempnerInstitute/vine-denoising-copula/tree/main/examples/) and
|
|
185
|
+
the [user guide](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/USER_GUIDE.md).
|
|
186
|
+
|
|
187
|
+
## Pretrained models
|
|
188
|
+
|
|
189
|
+
| Model | Grid | Use | Status |
|
|
190
|
+
|---|---|---|---|
|
|
191
|
+
| [`vdc-denoiser-m64-v1`](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1) | 64x64 | the estimator of all main paper results | released |
|
|
192
|
+
| [`vdc-denoiser-m64-v2`](https://huggingface.co/hsafaai/vdc-denoiser-m64-v2) | 64x64 | retrained linear-grid estimator VDC-64 (paper, Appendix G) | released |
|
|
193
|
+
| [`vdc-denoiser-m128-v2`](https://huggingface.co/hsafaai/vdc-denoiser-m128-v2) | 128x128 | retrained linear-grid estimator VDC-128 (paper, Appendix G) | released |
|
|
194
|
+
|
|
195
|
+
Every checkpoint is verified by SHA-256 on load. The v2 estimators were trained after the paper's
|
|
196
|
+
main experiments on corrected synthetic data; they use a continuous bilinear density with exact
|
|
197
|
+
h-functions and are selected with `VineCopulaModel.from_pretrained(bundle)`. Their training
|
|
198
|
+
initialization is published as [`vdc-linear-grid-pilot`](https://huggingface.co/hsafaai/vdc-linear-grid-pilot).
|
|
199
|
+
See [docs/MODEL_RELEASES.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/MODEL_RELEASES.md) and [docs/IMPROVED_ESTIMATORS.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/IMPROVED_ESTIMATORS.md).
|
|
200
|
+
|
|
201
|
+
## Train an estimator
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# the released estimator (vdc-denoiser-m64-v1)
|
|
205
|
+
python scripts/train_unified.py --config configs/train/denoiser_cond_enhanced.yaml --model-type denoiser
|
|
206
|
+
|
|
207
|
+
# the retrained linear-grid estimators: pilot, data cache, then each fine-tune
|
|
208
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_pilot.yaml
|
|
209
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_cache.yaml
|
|
210
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_vdc128_v2.yaml
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Configurations and the synthetic training generators are documented in
|
|
214
|
+
[docs/CONFIGURATION.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/CONFIGURATION.md) and [docs/TRAINING_DATA.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/TRAINING_DATA.md);
|
|
215
|
+
the linear-grid recipes, their resources and verification are in [docs/IMPROVED_ESTIMATORS.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/IMPROVED_ESTIMATORS.md).
|
|
216
|
+
|
|
217
|
+
## Reproduce the paper
|
|
218
|
+
|
|
219
|
+
[`paper/`](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md) contains everything needed to reproduce the NeurIPS 2026
|
|
220
|
+
results: experiment runners with fixed protocols, the scripts and saved outputs that
|
|
221
|
+
regenerate every figure and table, and reference results. Figures and tables
|
|
222
|
+
rebuild from saved outputs on a laptop in minutes:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
bash paper/figures/make_figures.sh output/figures
|
|
226
|
+
bash paper/tables/make_tables.sh output/tables
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Repository layout
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
vdc/ library: models, projection (IPFP), vine fitting, sampling, information, training, data
|
|
233
|
+
configs/ training configurations
|
|
234
|
+
scripts/ command-line entry points (training, model and dataset downloads, packaging)
|
|
235
|
+
examples/ runnable examples
|
|
236
|
+
tests/ test suite (run with python -m pytest tests)
|
|
237
|
+
docs/ documentation (also served at kempnerinstitute.github.io/vine-denoising-copula)
|
|
238
|
+
paper/ NeurIPS 2026 reproduction: runners, figure and table generators, saved results
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Citation
|
|
242
|
+
|
|
243
|
+
```bibtex
|
|
244
|
+
@inproceedings{safaai2026vdc,
|
|
245
|
+
title = {Amortized Vine Copulas for High-Dimensional Density and Information Estimation},
|
|
246
|
+
author = {Safaai, Houman},
|
|
247
|
+
booktitle = {Advances in Neural Information Processing Systems},
|
|
248
|
+
year = {2026},
|
|
249
|
+
note = {arXiv:2604.20568}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
## License
|
|
254
|
+
|
|
255
|
+
MIT; see [LICENSE](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/LICENSE). This work was supported in part by a gift from the Chan
|
|
256
|
+
Zuckerberg Initiative Foundation to establish the Kempner Institute for the Study of
|
|
257
|
+
Natural and Artificial Intelligence at Harvard University.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# Vine Denoising Copula (VDC)
|
|
4
|
+
|
|
5
|
+
**Amortized vine copulas for high-dimensional density and information estimation**
|
|
6
|
+
|
|
7
|
+
[](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml)
|
|
8
|
+
[](https://kempnerinstitute.github.io/vine-denoising-copula/)
|
|
9
|
+
[](https://arxiv.org/abs/2604.20568)
|
|
10
|
+
[](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1)
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
|
|
13
|
+
[Paper](https://arxiv.org/abs/2604.20568) · [Documentation](https://kempnerinstitute.github.io/vine-denoising-copula/) · [Quick start](#quick-start) · [Pretrained models](#pretrained-models) · [Reproduce the paper](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
Vine copulas model high-dimensional dependence through a tree of bivariate
|
|
20
|
+
**pair-copulas**, but classical fitting estimates every edge separately, which
|
|
21
|
+
becomes the bottleneck as dimension grows. **VDC** trains one bivariate
|
|
22
|
+
denoising network on simulated copulas and reuses it for every edge: it maps the
|
|
23
|
+
empirical histogram of an edge to a density grid in a single forward pass, and
|
|
24
|
+
an IPFP (Sinkhorn) projection restores uniform copula marginals. The fitted
|
|
25
|
+
pair-copulas and their cached h-functions plug into standard vine recursion, so
|
|
26
|
+
the model keeps an explicit, interpretable dependence structure while replacing
|
|
27
|
+
repeated per-edge fitting with reusable neural inference.
|
|
28
|
+
|
|
29
|
+
**What you can do with it**
|
|
30
|
+
|
|
31
|
+
- Estimate a **bivariate copula density** from samples in milliseconds.
|
|
32
|
+
- Fit **D-, C- and regular vines** in high dimensions, with batched GPU inference.
|
|
33
|
+
- Evaluate **likelihoods**, draw **samples** (inverse Rosenblatt), and compute
|
|
34
|
+
conditional transforms.
|
|
35
|
+
- Estimate **mutual information** and **total correlation**, decomposed by edge
|
|
36
|
+
and by tree of the fitted vine.
|
|
37
|
+
- Train your own estimator on the included synthetic copula generators.
|
|
38
|
+
|
|
39
|
+
## Results at a glance
|
|
40
|
+
|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
From the NeurIPS 2026 paper (all numbers use the released `vdc-denoiser-m64-v1`):
|
|
44
|
+
|
|
45
|
+
| | |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Bivariate density (9 in-library cases) | lower ISE than histogram, KDE and pyvine-TLL at **~6 ms per edge** on a GPU; parametric family selection is more accurate on its own families at ~100x the cost |
|
|
48
|
+
| Families never seen in training | matches per-case TLL refits in held-out likelihood and **roughly halves MI error** |
|
|
49
|
+
| High-dimensional vines (d = 100–500) | **3.3–4.0x faster** than 16-thread pyvine-TLL on one node (749 s vs 2,489 s at d = 500) |
|
|
50
|
+
| S&P100 daily returns (d = 100) | **best held-out likelihood** of the compared methods on random and chronological splits |
|
|
51
|
+
| Information estimation | fewer data-processing-inequality violations and lower additivity error than KSG; TC at d = 50 in **0.71 s** |
|
|
52
|
+
|
|
53
|
+
Limits are reported alongside: the 64x64 grid bounds accuracy for near-deterministic
|
|
54
|
+
pairs, and chained conditional prediction (VaR, imputation) is not yet competitive.
|
|
55
|
+
See the paper and [the reproduction guide](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md) for every protocol.
|
|
56
|
+
|
|
57
|
+

|
|
58
|
+
|
|
59
|
+
## Installation
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python -m pip install vine-denoising-copula
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Python 3.11 or later with PyTorch 2 is required. A GPU is optional. The base
|
|
66
|
+
install supports pretrained pair densities, vine fitting, likelihoods and
|
|
67
|
+
sampling without pyvinecopulib or plotting/training packages. Optional features:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
python -m pip install 'vine-denoising-copula[train]' # synthetic data and training
|
|
71
|
+
python -m pip install 'vine-denoising-copula[baselines]' # qualified pyvinecopulib 0.7.x
|
|
72
|
+
python -m pip install 'vine-denoising-copula[viz,data]' # plotting and dataset downloads
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Install `vine-denoising-copula`, not the unrelated PyPI project `vdc`. Both
|
|
76
|
+
provide an `import vdc` namespace, so use separate virtual environments.
|
|
77
|
+
Checkpoints remain on Hugging Face and are downloaded and hash-verified on first
|
|
78
|
+
use. For a source installation:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/KempnerInstitute/vine-denoising-copula.git
|
|
82
|
+
cd vine-denoising-copula
|
|
83
|
+
python -m pip install -e '.[dev,train,data,viz]'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
See [getting started](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/GETTING_STARTED.md) for CPU/GPU PyTorch installation.
|
|
87
|
+
The paper reproduction environment retains its recorded dependency versions.
|
|
88
|
+
|
|
89
|
+
## Quick start
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
import numpy as np
|
|
93
|
+
from vdc import load_pretrained_model, estimate_pair_density_from_samples, VineCopulaModel
|
|
94
|
+
|
|
95
|
+
bundle = load_pretrained_model("vdc-denoiser-m64-v1", device="cpu") # downloads and hash-checks
|
|
96
|
+
|
|
97
|
+
# 1) a bivariate copula density from pseudo-observations in [0, 1]^2
|
|
98
|
+
u = np.random.default_rng(0).uniform(size=(2000, 2))
|
|
99
|
+
density = estimate_pair_density_from_samples(bundle, u) # (64, 64) grid
|
|
100
|
+
|
|
101
|
+
# 2) a vine on d-dimensional pseudo-observations
|
|
102
|
+
x = np.random.default_rng(1).uniform(size=(2000, 8))
|
|
103
|
+
vine = VineCopulaModel(vine_type="dvine", m=64, device="cpu", batch_edges=True)
|
|
104
|
+
vine.fit(x, bundle.model, diffusion=bundle.diffusion)
|
|
105
|
+
loglik = vine.logpdf(x) # per-row log copula density
|
|
106
|
+
samples = vine.simulate(n=1000) # inverse-Rosenblatt sampling
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Pseudo-observations are ranks scaled to (0, 1). Fit marginal transforms on
|
|
110
|
+
training rows and apply them to held-out rows. More: [examples/](https://github.com/KempnerInstitute/vine-denoising-copula/tree/main/examples/) and
|
|
111
|
+
the [user guide](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/USER_GUIDE.md).
|
|
112
|
+
|
|
113
|
+
## Pretrained models
|
|
114
|
+
|
|
115
|
+
| Model | Grid | Use | Status |
|
|
116
|
+
|---|---|---|---|
|
|
117
|
+
| [`vdc-denoiser-m64-v1`](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1) | 64x64 | the estimator of all main paper results | released |
|
|
118
|
+
| [`vdc-denoiser-m64-v2`](https://huggingface.co/hsafaai/vdc-denoiser-m64-v2) | 64x64 | retrained linear-grid estimator VDC-64 (paper, Appendix G) | released |
|
|
119
|
+
| [`vdc-denoiser-m128-v2`](https://huggingface.co/hsafaai/vdc-denoiser-m128-v2) | 128x128 | retrained linear-grid estimator VDC-128 (paper, Appendix G) | released |
|
|
120
|
+
|
|
121
|
+
Every checkpoint is verified by SHA-256 on load. The v2 estimators were trained after the paper's
|
|
122
|
+
main experiments on corrected synthetic data; they use a continuous bilinear density with exact
|
|
123
|
+
h-functions and are selected with `VineCopulaModel.from_pretrained(bundle)`. Their training
|
|
124
|
+
initialization is published as [`vdc-linear-grid-pilot`](https://huggingface.co/hsafaai/vdc-linear-grid-pilot).
|
|
125
|
+
See [docs/MODEL_RELEASES.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/MODEL_RELEASES.md) and [docs/IMPROVED_ESTIMATORS.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/IMPROVED_ESTIMATORS.md).
|
|
126
|
+
|
|
127
|
+
## Train an estimator
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# the released estimator (vdc-denoiser-m64-v1)
|
|
131
|
+
python scripts/train_unified.py --config configs/train/denoiser_cond_enhanced.yaml --model-type denoiser
|
|
132
|
+
|
|
133
|
+
# the retrained linear-grid estimators: pilot, data cache, then each fine-tune
|
|
134
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_pilot.yaml
|
|
135
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_cache.yaml
|
|
136
|
+
python scripts/train_linear_grid_estimator.py configs/train/linear_grid_vdc128_v2.yaml
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Configurations and the synthetic training generators are documented in
|
|
140
|
+
[docs/CONFIGURATION.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/CONFIGURATION.md) and [docs/TRAINING_DATA.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/TRAINING_DATA.md);
|
|
141
|
+
the linear-grid recipes, their resources and verification are in [docs/IMPROVED_ESTIMATORS.md](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/docs/IMPROVED_ESTIMATORS.md).
|
|
142
|
+
|
|
143
|
+
## Reproduce the paper
|
|
144
|
+
|
|
145
|
+
[`paper/`](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/paper/README.md) contains everything needed to reproduce the NeurIPS 2026
|
|
146
|
+
results: experiment runners with fixed protocols, the scripts and saved outputs that
|
|
147
|
+
regenerate every figure and table, and reference results. Figures and tables
|
|
148
|
+
rebuild from saved outputs on a laptop in minutes:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
bash paper/figures/make_figures.sh output/figures
|
|
152
|
+
bash paper/tables/make_tables.sh output/tables
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Repository layout
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
vdc/ library: models, projection (IPFP), vine fitting, sampling, information, training, data
|
|
159
|
+
configs/ training configurations
|
|
160
|
+
scripts/ command-line entry points (training, model and dataset downloads, packaging)
|
|
161
|
+
examples/ runnable examples
|
|
162
|
+
tests/ test suite (run with python -m pytest tests)
|
|
163
|
+
docs/ documentation (also served at kempnerinstitute.github.io/vine-denoising-copula)
|
|
164
|
+
paper/ NeurIPS 2026 reproduction: runners, figure and table generators, saved results
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Citation
|
|
168
|
+
|
|
169
|
+
```bibtex
|
|
170
|
+
@inproceedings{safaai2026vdc,
|
|
171
|
+
title = {Amortized Vine Copulas for High-Dimensional Density and Information Estimation},
|
|
172
|
+
author = {Safaai, Houman},
|
|
173
|
+
booktitle = {Advances in Neural Information Processing Systems},
|
|
174
|
+
year = {2026},
|
|
175
|
+
note = {arXiv:2604.20568}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## License
|
|
180
|
+
|
|
181
|
+
MIT; see [LICENSE](https://github.com/KempnerInstitute/vine-denoising-copula/blob/main/LICENSE). This work was supported in part by a gift from the Chan
|
|
182
|
+
Zuckerberg Initiative Foundation to establish the Kempner Institute for the Study of
|
|
183
|
+
Natural and Artificial Intelligence at Harvard University.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Configurations
|
|
2
|
+
|
|
3
|
+
For a new run, start with `examples/train_custom_copula.py` and
|
|
4
|
+
[the configuration guide](../docs/CONFIGURATION.md). That example uses the
|
|
5
|
+
maintained unified trainer and a small model suitable for checking the workflow.
|
|
6
|
+
|
|
7
|
+
The existing YAML files retain earlier training and inference configurations.
|
|
8
|
+
They are source records, not a list of recommended recipes. In particular, the
|
|
9
|
+
`*_enhanced*` and `enhanced_cnn_cond.yaml` recipes contain `conditional_*` examples
|
|
10
|
+
that the corrected generator rejects. Remove those entries and explicitly choose
|
|
11
|
+
a new family mixture for a new study; do not describe it as exact historical
|
|
12
|
+
retraining. The `data/`, `model/` and `inference/` fragments also serve older
|
|
13
|
+
configuration frontends and cannot all be passed directly to the unified trainer.
|
|
14
|
+
|
|
15
|
+
Paper reproduction uses the source pins and protocol-specific settings in
|
|
16
|
+
[`paper/`](../paper/), not whichever configuration happens to be present on
|
|
17
|
+
`main`. The training configurations of the paper's corruption and probit
|
|
18
|
+
ablations are kept with it in [`paper/configs/`](../paper/configs/). Pretrained
|
|
19
|
+
inference restores the model's embedded configuration and does not require
|
|
20
|
+
these YAML files.
|