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.
Files changed (183) hide show
  1. vine_denoising_copula-0.4.0/CHANGELOG.md +72 -0
  2. vine_denoising_copula-0.4.0/CITATION.cff +36 -0
  3. vine_denoising_copula-0.4.0/CONTRIBUTING.md +46 -0
  4. vine_denoising_copula-0.4.0/LICENSE +21 -0
  5. vine_denoising_copula-0.4.0/MANIFEST.in +8 -0
  6. vine_denoising_copula-0.4.0/PKG-INFO +257 -0
  7. vine_denoising_copula-0.4.0/README.md +183 -0
  8. vine_denoising_copula-0.4.0/configs/README.md +20 -0
  9. vine_denoising_copula-0.4.0/configs/data/synthetic.yaml +64 -0
  10. vine_denoising_copula-0.4.0/configs/default.yaml +100 -0
  11. vine_denoising_copula-0.4.0/configs/inference/default.yaml +94 -0
  12. vine_denoising_copula-0.4.0/configs/model/grid_unet.yaml +37 -0
  13. vine_denoising_copula-0.4.0/configs/train/base.yaml +66 -0
  14. vine_denoising_copula-0.4.0/configs/train/default.yaml +86 -0
  15. vine_denoising_copula-0.4.0/configs/train/denoiser_cond.yaml +89 -0
  16. vine_denoising_copula-0.4.0/configs/train/denoiser_cond_complex.yaml +100 -0
  17. vine_denoising_copula-0.4.0/configs/train/denoiser_cond_enhanced.yaml +113 -0
  18. vine_denoising_copula-0.4.0/configs/train/diffusion_cond.yaml +95 -0
  19. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex.yaml +96 -0
  20. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m128_smooth.yaml +110 -0
  21. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m64_smooth.yaml +109 -0
  22. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_complex_m64_smooth_bilinear.yaml +108 -0
  23. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m128_smooth.yaml +106 -0
  24. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m128_smooth_bilinear.yaml +96 -0
  25. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth.yaml +95 -0
  26. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_bilinear.yaml +96 -0
  27. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_probit.yaml +97 -0
  28. vine_denoising_copula-0.4.0/configs/train/diffusion_cond_m64_smooth_probit_bilinear.yaml +95 -0
  29. vine_denoising_copula-0.4.0/configs/train/enhanced_cnn_cond.yaml +113 -0
  30. vine_denoising_copula-0.4.0/configs/train/linear_grid_cache.yaml +15 -0
  31. vine_denoising_copula-0.4.0/configs/train/linear_grid_pilot.yaml +24 -0
  32. vine_denoising_copula-0.4.0/configs/train/linear_grid_vdc128_v2.yaml +26 -0
  33. vine_denoising_copula-0.4.0/configs/train/linear_grid_vdc64_v2.yaml +26 -0
  34. vine_denoising_copula-0.4.0/docs/API.md +132 -0
  35. vine_denoising_copula-0.4.0/docs/CONFIGURATION.md +110 -0
  36. vine_denoising_copula-0.4.0/docs/DATASETS.md +68 -0
  37. vine_denoising_copula-0.4.0/docs/GETTING_STARTED.md +87 -0
  38. vine_denoising_copula-0.4.0/docs/IMPROVED_ESTIMATORS.md +264 -0
  39. vine_denoising_copula-0.4.0/docs/MODEL_RELEASES.md +71 -0
  40. vine_denoising_copula-0.4.0/docs/RELEASING.md +95 -0
  41. vine_denoising_copula-0.4.0/docs/TECHNICAL_DETAILS.md +57 -0
  42. vine_denoising_copula-0.4.0/docs/TRAINING_DATA.md +33 -0
  43. vine_denoising_copula-0.4.0/docs/USER_GUIDE.md +117 -0
  44. vine_denoising_copula-0.4.0/docs/assets/site.css +291 -0
  45. vine_denoising_copula-0.4.0/docs/compiled_sampler.md +84 -0
  46. vine_denoising_copula-0.4.0/docs/fast_fit.md +54 -0
  47. vine_denoising_copula-0.4.0/docs/index.html +48 -0
  48. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.1.0.md +26 -0
  49. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.1.1.md +27 -0
  50. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.0.md +55 -0
  51. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.1.md +19 -0
  52. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.2.md +10 -0
  53. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.3.md +10 -0
  54. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.4.md +12 -0
  55. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.5.md +14 -0
  56. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.6.md +7 -0
  57. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.2.7.md +38 -0
  58. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.3.0.md +27 -0
  59. vine_denoising_copula-0.4.0/docs/releases/RELEASE_NOTES_v0.4.0.md +33 -0
  60. vine_denoising_copula-0.4.0/examples/README.md +31 -0
  61. vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/README.md +86 -0
  62. vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/reference_results.json +2908 -0
  63. vine_denoising_copula-0.4.0/examples/diagnostics/histogram_normalization/reproduce.py +228 -0
  64. vine_denoising_copula-0.4.0/examples/estimate_mutual_information.py +40 -0
  65. vine_denoising_copula-0.4.0/examples/fit_vine_copula.py +41 -0
  66. vine_denoising_copula-0.4.0/examples/train_custom_copula.py +40 -0
  67. vine_denoising_copula-0.4.0/examples/use_pretrained_model.py +105 -0
  68. vine_denoising_copula-0.4.0/examples/visualize_copulas.py +35 -0
  69. vine_denoising_copula-0.4.0/pyproject.toml +144 -0
  70. vine_denoising_copula-0.4.0/scripts/build_docs_site.py +267 -0
  71. vine_denoising_copula-0.4.0/scripts/check_installation.py +110 -0
  72. vine_denoising_copula-0.4.0/scripts/download_pretrained.py +49 -0
  73. vine_denoising_copula-0.4.0/scripts/download_uci_datasets.py +552 -0
  74. vine_denoising_copula-0.4.0/scripts/legacy/evaluate.py +529 -0
  75. vine_denoising_copula-0.4.0/scripts/legacy/infer.py +339 -0
  76. vine_denoising_copula-0.4.0/scripts/legacy/train.py +148 -0
  77. vine_denoising_copula-0.4.0/scripts/package_pretrained_model.py +109 -0
  78. vine_denoising_copula-0.4.0/scripts/train_linear_grid_estimator.py +26 -0
  79. vine_denoising_copula-0.4.0/scripts/train_unified.py +1815 -0
  80. vine_denoising_copula-0.4.0/scripts/upload_pretrained_to_hf.py +131 -0
  81. vine_denoising_copula-0.4.0/scripts/verify_index_release.py +53 -0
  82. vine_denoising_copula-0.4.0/setup.cfg +4 -0
  83. vine_denoising_copula-0.4.0/tests/test_compiled_sampler.py +95 -0
  84. vine_denoising_copula-0.4.0/tests/test_continuous_mixtures.py +84 -0
  85. vine_denoising_copula-0.4.0/tests/test_diffusion_training_smoke.py +174 -0
  86. vine_denoising_copula-0.4.0/tests/test_docs.py +45 -0
  87. vine_denoising_copula-0.4.0/tests/test_fast_fit_identity.py +70 -0
  88. vine_denoising_copula-0.4.0/tests/test_full_pipeline.py +403 -0
  89. vine_denoising_copula-0.4.0/tests/test_hfunc_dependent_boundary.py +27 -0
  90. vine_denoising_copula-0.4.0/tests/test_hfunc_independence_accuracy.py +47 -0
  91. vine_denoising_copula-0.4.0/tests/test_hfunc_monotonicity.py +46 -0
  92. vine_denoising_copula-0.4.0/tests/test_hfunc_vectorized_inverse.py +73 -0
  93. vine_denoising_copula-0.4.0/tests/test_histogram_normalization.py +40 -0
  94. vine_denoising_copula-0.4.0/tests/test_information_metrics.py +35 -0
  95. vine_denoising_copula-0.4.0/tests/test_ipfp_log.py +35 -0
  96. vine_denoising_copula-0.4.0/tests/test_linear_grid_copula.py +91 -0
  97. vine_denoising_copula-0.4.0/tests/test_linear_grid_estimator.py +172 -0
  98. vine_denoising_copula-0.4.0/tests/test_linear_grid_pretraining.py +84 -0
  99. vine_denoising_copula-0.4.0/tests/test_linear_grid_training.py +150 -0
  100. vine_denoising_copula-0.4.0/tests/test_metrics_tail.py +24 -0
  101. vine_denoising_copula-0.4.0/tests/test_model_factory.py +57 -0
  102. vine_denoising_copula-0.4.0/tests/test_package_imports.py +17 -0
  103. vine_denoising_copula-0.4.0/tests/test_prepared_sampler.py +91 -0
  104. vine_denoising_copula-0.4.0/tests/test_pretrained.py +18 -0
  105. vine_denoising_copula-0.4.0/tests/test_pretrained_linear_grid.py +117 -0
  106. vine_denoising_copula-0.4.0/tests/test_probit_transform.py +32 -0
  107. vine_denoising_copula-0.4.0/tests/test_training_example.py +26 -0
  108. vine_denoising_copula-0.4.0/tests/test_training_generators.py +135 -0
  109. vine_denoising_copula-0.4.0/tests/test_uci_maf_preprocess.py +275 -0
  110. vine_denoising_copula-0.4.0/tests/test_vine_gaussian_ground_truth.py +101 -0
  111. vine_denoising_copula-0.4.0/tests/test_vine_linear_grid.py +146 -0
  112. vine_denoising_copula-0.4.0/tests/test_vine_recursion.py +196 -0
  113. vine_denoising_copula-0.4.0/tests/test_vine_structure_robustness.py +26 -0
  114. vine_denoising_copula-0.4.0/vdc/__init__.py +86 -0
  115. vine_denoising_copula-0.4.0/vdc/baselines/__init__.py +6 -0
  116. vine_denoising_copula-0.4.0/vdc/baselines/pyvinecopulib.py +208 -0
  117. vine_denoising_copula-0.4.0/vdc/cli.py +205 -0
  118. vine_denoising_copula-0.4.0/vdc/config.py +196 -0
  119. vine_denoising_copula-0.4.0/vdc/data/__init__.py +39 -0
  120. vine_denoising_copula-0.4.0/vdc/data/_bicop.py +37 -0
  121. vine_denoising_copula-0.4.0/vdc/data/complex_copulas.py +122 -0
  122. vine_denoising_copula-0.4.0/vdc/data/conditional_copulas.py +325 -0
  123. vine_denoising_copula-0.4.0/vdc/data/continuous_mixtures.py +219 -0
  124. vine_denoising_copula-0.4.0/vdc/data/generators.py +755 -0
  125. vine_denoising_copula-0.4.0/vdc/data/hist.py +330 -0
  126. vine_denoising_copula-0.4.0/vdc/data/loaders.py +286 -0
  127. vine_denoising_copula-0.4.0/vdc/data/mixtures.py +351 -0
  128. vine_denoising_copula-0.4.0/vdc/data/onthefly.py +403 -0
  129. vine_denoising_copula-0.4.0/vdc/data/paths.py +37 -0
  130. vine_denoising_copula-0.4.0/vdc/data/streaming.py +340 -0
  131. vine_denoising_copula-0.4.0/vdc/data/tabular.py +151 -0
  132. vine_denoising_copula-0.4.0/vdc/eval/pairs.py +282 -0
  133. vine_denoising_copula-0.4.0/vdc/eval/visualize.py +682 -0
  134. vine_denoising_copula-0.4.0/vdc/inference/density.py +284 -0
  135. vine_denoising_copula-0.4.0/vdc/losses/__init__.py +539 -0
  136. vine_denoising_copula-0.4.0/vdc/models/__init__.py +17 -0
  137. vine_denoising_copula-0.4.0/vdc/models/copula_cnn.py +223 -0
  138. vine_denoising_copula-0.4.0/vdc/models/copula_cnn_enhanced.py +300 -0
  139. vine_denoising_copula-0.4.0/vdc/models/copula_denoiser.py +200 -0
  140. vine_denoising_copula-0.4.0/vdc/models/copula_diffusion.py +376 -0
  141. vine_denoising_copula-0.4.0/vdc/models/factory.py +92 -0
  142. vine_denoising_copula-0.4.0/vdc/models/hfunc.py +587 -0
  143. vine_denoising_copula-0.4.0/vdc/models/linear_grid_copula.py +205 -0
  144. vine_denoising_copula-0.4.0/vdc/models/linear_grid_estimator.py +281 -0
  145. vine_denoising_copula-0.4.0/vdc/models/projection.py +322 -0
  146. vine_denoising_copula-0.4.0/vdc/models/sample_size_agnostic.py +413 -0
  147. vine_denoising_copula-0.4.0/vdc/models/simple_cnn.py +132 -0
  148. vine_denoising_copula-0.4.0/vdc/models/unet_grid.py +443 -0
  149. vine_denoising_copula-0.4.0/vdc/pretrained.py +520 -0
  150. vine_denoising_copula-0.4.0/vdc/resources/__init__.py +1 -0
  151. vine_denoising_copula-0.4.0/vdc/resources/pretrained/__init__.py +1 -0
  152. vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m128_v2.json +82 -0
  153. vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m64_v1.json +34 -0
  154. vine_denoising_copula-0.4.0/vdc/resources/pretrained/vdc_denoiser_m64_v2.json +82 -0
  155. vine_denoising_copula-0.4.0/vdc/train/__init__.py +16 -0
  156. vine_denoising_copula-0.4.0/vdc/train/linear_grid_pretraining.py +346 -0
  157. vine_denoising_copula-0.4.0/vdc/train/linear_grid_training.py +471 -0
  158. vine_denoising_copula-0.4.0/vdc/train/train_grid.py +490 -0
  159. vine_denoising_copula-0.4.0/vdc/train/unified_trainer.py +786 -0
  160. vine_denoising_copula-0.4.0/vdc/utils/__init__.py +32 -0
  161. vine_denoising_copula-0.4.0/vdc/utils/histogram.py +109 -0
  162. vine_denoising_copula-0.4.0/vdc/utils/information.py +94 -0
  163. vine_denoising_copula-0.4.0/vdc/utils/ipfp_log.py +100 -0
  164. vine_denoising_copula-0.4.0/vdc/utils/metrics.py +174 -0
  165. vine_denoising_copula-0.4.0/vdc/utils/probit_transform.py +336 -0
  166. vine_denoising_copula-0.4.0/vdc/utils/smoothing.py +224 -0
  167. vine_denoising_copula-0.4.0/vdc/utils/stats.py +375 -0
  168. vine_denoising_copula-0.4.0/vdc/utils/training_logger.py +357 -0
  169. vine_denoising_copula-0.4.0/vdc/utils/training_utils.py +378 -0
  170. vine_denoising_copula-0.4.0/vdc/vine/api.py +1277 -0
  171. vine_denoising_copula-0.4.0/vdc/vine/compiled_sampler.cpp +94 -0
  172. vine_denoising_copula-0.4.0/vdc/vine/compiled_sampler.py +197 -0
  173. vine_denoising_copula-0.4.0/vdc/vine/copula_diffusion.py +342 -0
  174. vine_denoising_copula-0.4.0/vdc/vine/metrics.py +378 -0
  175. vine_denoising_copula-0.4.0/vdc/vine/recursion.py +593 -0
  176. vine_denoising_copula-0.4.0/vdc/vine/structure.py +370 -0
  177. vine_denoising_copula-0.4.0/vdc/vine/vine_types.py +511 -0
  178. vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/PKG-INFO +257 -0
  179. vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/SOURCES.txt +181 -0
  180. vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/dependency_links.txt +1 -0
  181. vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/entry_points.txt +2 -0
  182. vine_denoising_copula-0.4.0/vine_denoising_copula.egg-info/requires.txt +59 -0
  183. 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
+ [![CI](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml/badge.svg)](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml)
82
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://kempnerinstitute.github.io/vine-denoising-copula/)
83
+ [![Paper](https://img.shields.io/badge/NeurIPS-2026-8c1515)](https://arxiv.org/abs/2604.20568)
84
+ [![Model](https://img.shields.io/badge/%F0%9F%A4%97%20model-vdc--denoiser--m64--v1-yellow)](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1)
85
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](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
+ ![VDC overview: one pretrained denoising network estimates every pair-copula of a vine](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_overview.png)
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
+ ![Density accuracy, vine likelihood, fitting time and S&P100 likelihood](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_results_density_speed.png)
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
+ ![Mutual-information error, total-correlation runtime and self-consistency](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_results_information.png)
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
+ [![CI](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml/badge.svg)](https://github.com/KempnerInstitute/vine-denoising-copula/actions/workflows/ci.yml)
8
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://kempnerinstitute.github.io/vine-denoising-copula/)
9
+ [![Paper](https://img.shields.io/badge/NeurIPS-2026-8c1515)](https://arxiv.org/abs/2604.20568)
10
+ [![Model](https://img.shields.io/badge/%F0%9F%A4%97%20model-vdc--denoiser--m64--v1-yellow)](https://huggingface.co/hsafaai/vdc-denoiser-m64-v1)
11
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](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
+ ![VDC overview: one pretrained denoising network estimates every pair-copula of a vine](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_overview.png)
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
+ ![Density accuracy, vine likelihood, fitting time and S&P100 likelihood](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_results_density_speed.png)
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
+ ![Mutual-information error, total-correlation runtime and self-consistency](https://raw.githubusercontent.com/KempnerInstitute/vine-denoising-copula/main/docs/assets/vdc_results_information.png)
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.