dfm-python 0.5.2__tar.gz → 0.5.3__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 (413) hide show
  1. {dfm_python-0.5.2 → dfm_python-0.5.3}/PKG-INFO +2 -2
  2. dfm_python-0.5.3/lightning_logs/ddfm/version_11/checkpoints/ddfm-epoch=00-train_loss=0.8447.ckpt +0 -0
  3. dfm_python-0.5.3/lightning_logs/ddfm/version_11/metrics.csv +2 -0
  4. dfm_python-0.5.3/lightning_logs/ddfm/version_12/checkpoints/ddfm-epoch=00-train_loss=0.8701.ckpt +0 -0
  5. dfm_python-0.5.3/lightning_logs/ddfm/version_12/metrics.csv +2 -0
  6. dfm_python-0.5.3/lightning_logs/dfm/version_210/metrics.csv +6 -0
  7. dfm_python-0.5.3/lightning_logs/dfm/version_211/metrics.csv +6 -0
  8. dfm_python-0.5.3/lightning_logs/dfm/version_212/metrics.csv +6 -0
  9. dfm_python-0.5.3/lightning_logs/dfm/version_213/metrics.csv +6 -0
  10. dfm_python-0.5.3/lightning_logs/dfm/version_214/metrics.csv +2 -0
  11. dfm_python-0.5.3/lightning_logs/dfm/version_215/metrics.csv +2 -0
  12. dfm_python-0.5.3/lightning_logs/dfm/version_216/metrics.csv +6 -0
  13. dfm_python-0.5.3/lightning_logs/dfm/version_217/metrics.csv +6 -0
  14. dfm_python-0.5.3/lightning_logs/dfm/version_218/metrics.csv +6 -0
  15. dfm_python-0.5.3/lightning_logs/dfm/version_219/metrics.csv +6 -0
  16. dfm_python-0.5.3/lightning_logs/dfm/version_220/metrics.csv +2 -0
  17. dfm_python-0.5.3/lightning_logs/dfm/version_221/metrics.csv +6 -0
  18. dfm_python-0.5.3/lightning_logs/dfm/version_222/metrics.csv +6 -0
  19. dfm_python-0.5.3/lightning_logs/dfm/version_223/metrics.csv +2 -0
  20. dfm_python-0.5.3/lightning_logs/dfm/version_224/metrics.csv +2 -0
  21. dfm_python-0.5.3/lightning_logs/dfm/version_225/metrics.csv +6 -0
  22. dfm_python-0.5.3/lightning_logs/dfm/version_226/metrics.csv +6 -0
  23. dfm_python-0.5.3/lightning_logs/dfm/version_227/metrics.csv +2 -0
  24. dfm_python-0.5.3/lightning_logs/dfm/version_228/metrics.csv +6 -0
  25. dfm_python-0.5.3/lightning_logs/dfm/version_229/metrics.csv +6 -0
  26. {dfm_python-0.5.2 → dfm_python-0.5.3}/pyproject.toml +2 -2
  27. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/encoder/vae.py +16 -2
  28. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/ddfm.py +67 -10
  29. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/dfm.py +163 -55
  30. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/mcmc.py +5 -4
  31. dfm_python-0.5.3/src/test/test_mixed_frequency.py +335 -0
  32. {dfm_python-0.5.2 → dfm_python-0.5.3}/tutorial/tutorial_finance_dfm.py +4 -1
  33. {dfm_python-0.5.2 → dfm_python-0.5.3}/tutorial/tutorial_macro_dfm.py +4 -1
  34. {dfm_python-0.5.2 → dfm_python-0.5.3}/.git +0 -0
  35. {dfm_python-0.5.2 → dfm_python-0.5.3}/.gitignore +0 -0
  36. {dfm_python-0.5.2 → dfm_python-0.5.3}/.python-version +0 -0
  37. {dfm_python-0.5.2 → dfm_python-0.5.3}/LICENSE +0 -0
  38. {dfm_python-0.5.2 → dfm_python-0.5.3}/MANIFEST.in +0 -0
  39. {dfm_python-0.5.2 → dfm_python-0.5.3}/README.md +0 -0
  40. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/experiment/test_finance.yaml +0 -0
  41. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/experiment/test_macro.yaml +0 -0
  42. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/model/ddfm.yaml +0 -0
  43. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/model/dfm.yaml +0 -0
  44. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KO3YEARC.yaml +0 -0
  45. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBFDSAAF.yaml +0 -0
  46. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBFINAAF.yaml +0 -0
  47. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBFXSAAF.yaml +0 -0
  48. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSESI_R.yaml +0 -0
  49. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIBCEQ.yaml +0 -0
  50. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIBCOQ.yaml +0 -0
  51. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIBNER.yaml +0 -0
  52. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIBNMR.yaml +0 -0
  53. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIEMAR.yaml +0 -0
  54. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIHAPR.yaml +0 -0
  55. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIIMER.yaml +0 -0
  56. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIIMPR.yaml +0 -0
  57. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBSIXMER.yaml +0 -0
  58. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOBUSINVR.yaml +0 -0
  59. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCALL_.yaml +0 -0
  60. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCNFBUSR.yaml +0 -0
  61. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCNFCONR.yaml +0 -0
  62. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCNGOV_D.yaml +0 -0
  63. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCNPER_D.yaml +0 -0
  64. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCOBUSIR.yaml +0 -0
  65. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCONPMTH.yaml +0 -0
  66. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCONPRCF.yaml +0 -0
  67. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCONSTRP.yaml +0 -0
  68. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCPCOREF.yaml +0 -0
  69. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCPEXFEF.yaml +0 -0
  70. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCREU__A.yaml +0 -0
  71. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSECDMR.yaml +0 -0
  72. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSECEMR.yaml +0 -0
  73. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSEMEMR.yaml +0 -0
  74. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSEOHDR.yaml +0 -0
  75. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSEOHSR.yaml +0 -0
  76. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSHHEMR.yaml +0 -0
  77. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSHHLMR.yaml +0 -0
  78. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSMTTOA.yaml +0 -0
  79. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSPHIMR.yaml +0 -0
  80. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCSPSPMR.yaml +0 -0
  81. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOCYLEADR.yaml +0 -0
  82. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KODBLNEQA.yaml +0 -0
  83. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KODBLNHSA.yaml +0 -0
  84. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEMPCONF.yaml +0 -0
  85. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEMPMANF.yaml +0 -0
  86. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEMPTOTO.yaml +0 -0
  87. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEMPWREP.yaml +0 -0
  88. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEQUIMAE.yaml +0 -0
  89. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEQUIPTE.yaml +0 -0
  90. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEQUITTE.yaml +0 -0
  91. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEXCHINA.yaml +0 -0
  92. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEXNGS_D.yaml +0 -0
  93. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEXPGDSA.yaml +0 -0
  94. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOEXPPRCF.yaml +0 -0
  95. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOGCFCNSD.yaml +0 -0
  96. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOGCFFNVD.yaml +0 -0
  97. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOGDP___D.yaml +0 -0
  98. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOGFCF__D.yaml +0 -0
  99. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOHWRWEMP.yaml +0 -0
  100. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIMNGS_D.yaml +0 -0
  101. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIMPCONA.yaml +0 -0
  102. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIMPGDDA.yaml +0 -0
  103. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIMPGDSA.yaml +0 -0
  104. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIMPPRCF.yaml +0 -0
  105. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIPALL_G.yaml +0 -0
  106. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOIPMIMAG.yaml +0 -0
  107. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOLRLTCO.yaml +0 -0
  108. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOLRLTHH.yaml +0 -0
  109. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMPCAPGG.yaml +0 -0
  110. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMPCONDG.yaml +0 -0
  111. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMPCONGG.yaml +0 -0
  112. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMPCONNG.yaml +0 -0
  113. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMPRI30G.yaml +0 -0
  114. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMSCAPGG.yaml +0 -0
  115. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOMSCONGG.yaml +0 -0
  116. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KONETTRDF.yaml +0 -0
  117. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KONEWCONA.yaml +0 -0
  118. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPICAPGG.yaml +0 -0
  119. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPICONGG.yaml +0 -0
  120. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPIMANUG.yaml +0 -0
  121. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPOPACTE.yaml +0 -0
  122. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPPSRM_F.yaml +0 -0
  123. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPROPRCF.yaml +0 -0
  124. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOPSMANUG.yaml +0 -0
  125. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORCNST.yaml +0 -0
  126. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORELEC.yaml +0 -0
  127. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORFBEV.yaml +0 -0
  128. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORMACH.yaml +0 -0
  129. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORMCMP.yaml +0 -0
  130. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOROCOINF.yaml +0 -0
  131. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KORWHLS.yaml +0 -0
  132. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSHRPRCF.yaml +0 -0
  133. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSIAHOTE.yaml +0 -0
  134. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSIAI__E.yaml +0 -0
  135. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSIARRLE.yaml +0 -0
  136. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSIAWRTE.yaml +0 -0
  137. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOSSBFMBE.yaml +0 -0
  138. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOUN_TOTQ.yaml +0 -0
  139. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOUS____.yaml +0 -0
  140. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOVALCONA.yaml +0 -0
  141. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOWRCCNSE.yaml +0 -0
  142. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOWRCDURE.yaml +0 -0
  143. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOWRCNODE.yaml +0 -0
  144. {dfm_python-0.5.2 → dfm_python-0.5.3}/config/series/KOWRCSEME.yaml +0 -0
  145. {dfm_python-0.5.2 → dfm_python-0.5.3}/data/finance.csv +0 -0
  146. {dfm_python-0.5.2 → dfm_python-0.5.3}/data/macro.csv +0 -0
  147. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_0/checkpoints/ddfm-epoch=00-train_loss=0.7892.ckpt +0 -0
  148. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_0/metrics.csv +0 -0
  149. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_1/checkpoints/ddfm-epoch=00-train_loss=0.6617.ckpt +0 -0
  150. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_1/metrics.csv +0 -0
  151. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_10/checkpoints/ddfm-epoch=00-train_loss=0.7841.ckpt +0 -0
  152. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_10/metrics.csv +0 -0
  153. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_2/checkpoints/ddfm-epoch=00-train_loss=0.7447.ckpt +0 -0
  154. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_2/metrics.csv +0 -0
  155. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_3/checkpoints/ddfm-epoch=00-train_loss=0.7343.ckpt +0 -0
  156. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_3/metrics.csv +0 -0
  157. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_4/checkpoints/ddfm-epoch=00-train_loss=0.9361.ckpt +0 -0
  158. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_4/metrics.csv +0 -0
  159. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_5/checkpoints/ddfm-epoch=00-train_loss=0.6573.ckpt +0 -0
  160. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_5/metrics.csv +0 -0
  161. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_6/checkpoints/ddfm-epoch=00-train_loss=0.8632.ckpt +0 -0
  162. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_6/metrics.csv +0 -0
  163. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_7/checkpoints/ddfm-epoch=00-train_loss=0.9101.ckpt +0 -0
  164. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_7/metrics.csv +0 -0
  165. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_8/checkpoints/ddfm-epoch=00-train_loss=0.6250.ckpt +0 -0
  166. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_8/metrics.csv +0 -0
  167. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_9/checkpoints/ddfm-epoch=00-train_loss=0.6293.ckpt +0 -0
  168. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/ddfm/version_9/metrics.csv +0 -0
  169. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_0/metrics.csv +0 -0
  170. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_1/metrics.csv +0 -0
  171. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_10/metrics.csv +0 -0
  172. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_100/metrics.csv +0 -0
  173. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_101/metrics.csv +0 -0
  174. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_102/metrics.csv +0 -0
  175. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_103/metrics.csv +0 -0
  176. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_104/metrics.csv +0 -0
  177. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_106/metrics.csv +0 -0
  178. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_107/metrics.csv +0 -0
  179. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_108/metrics.csv +0 -0
  180. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_109/metrics.csv +0 -0
  181. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_11/metrics.csv +0 -0
  182. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_110/metrics.csv +0 -0
  183. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_111/metrics.csv +0 -0
  184. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_112/metrics.csv +0 -0
  185. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_113/metrics.csv +0 -0
  186. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_114/metrics.csv +0 -0
  187. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_115/metrics.csv +0 -0
  188. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_116/metrics.csv +0 -0
  189. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_118/metrics.csv +0 -0
  190. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_119/metrics.csv +0 -0
  191. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_12/metrics.csv +0 -0
  192. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_120/metrics.csv +0 -0
  193. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_121/metrics.csv +0 -0
  194. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_122/metrics.csv +0 -0
  195. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_123/metrics.csv +0 -0
  196. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_124/metrics.csv +0 -0
  197. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_125/metrics.csv +0 -0
  198. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_126/metrics.csv +0 -0
  199. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_127/metrics.csv +0 -0
  200. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_128/metrics.csv +0 -0
  201. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_13/metrics.csv +0 -0
  202. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_130/metrics.csv +0 -0
  203. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_131/metrics.csv +0 -0
  204. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_132/metrics.csv +0 -0
  205. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_133/metrics.csv +0 -0
  206. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_134/metrics.csv +0 -0
  207. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_135/metrics.csv +0 -0
  208. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_136/metrics.csv +0 -0
  209. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_137/metrics.csv +0 -0
  210. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_138/metrics.csv +0 -0
  211. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_139/metrics.csv +0 -0
  212. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_14/metrics.csv +0 -0
  213. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_140/metrics.csv +0 -0
  214. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_141/metrics.csv +0 -0
  215. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_142/metrics.csv +0 -0
  216. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_143/metrics.csv +0 -0
  217. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_144/metrics.csv +0 -0
  218. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_146/metrics.csv +0 -0
  219. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_147/metrics.csv +0 -0
  220. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_148/metrics.csv +0 -0
  221. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_149/metrics.csv +0 -0
  222. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_15/metrics.csv +0 -0
  223. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_150/metrics.csv +0 -0
  224. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_151/metrics.csv +0 -0
  225. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_152/metrics.csv +0 -0
  226. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_153/metrics.csv +0 -0
  227. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_154/metrics.csv +0 -0
  228. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_155/metrics.csv +0 -0
  229. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_156/metrics.csv +0 -0
  230. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_157/metrics.csv +0 -0
  231. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_158/metrics.csv +0 -0
  232. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_159/metrics.csv +0 -0
  233. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_16/metrics.csv +0 -0
  234. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_160/metrics.csv +0 -0
  235. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_162/metrics.csv +0 -0
  236. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_163/metrics.csv +0 -0
  237. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_164/metrics.csv +0 -0
  238. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_165/metrics.csv +0 -0
  239. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_166/metrics.csv +0 -0
  240. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_167/metrics.csv +0 -0
  241. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_168/metrics.csv +0 -0
  242. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_169/metrics.csv +0 -0
  243. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_17/metrics.csv +0 -0
  244. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_170/metrics.csv +0 -0
  245. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_171/metrics.csv +0 -0
  246. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_172/metrics.csv +0 -0
  247. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_174/metrics.csv +0 -0
  248. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_175/metrics.csv +0 -0
  249. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_176/metrics.csv +0 -0
  250. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_177/metrics.csv +0 -0
  251. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_178/metrics.csv +0 -0
  252. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_179/metrics.csv +0 -0
  253. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_180/metrics.csv +0 -0
  254. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_181/metrics.csv +0 -0
  255. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_182/metrics.csv +0 -0
  256. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_183/metrics.csv +0 -0
  257. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_184/metrics.csv +0 -0
  258. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_186/metrics.csv +0 -0
  259. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_187/metrics.csv +0 -0
  260. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_188/metrics.csv +0 -0
  261. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_189/metrics.csv +0 -0
  262. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_19/metrics.csv +0 -0
  263. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_190/metrics.csv +0 -0
  264. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_191/metrics.csv +0 -0
  265. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_192/metrics.csv +0 -0
  266. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_193/metrics.csv +0 -0
  267. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_194/metrics.csv +0 -0
  268. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_195/metrics.csv +0 -0
  269. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_196/metrics.csv +0 -0
  270. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_197/metrics.csv +0 -0
  271. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_198/metrics.csv +0 -0
  272. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_199/metrics.csv +0 -0
  273. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_2/metrics.csv +0 -0
  274. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_20/metrics.csv +0 -0
  275. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_200/metrics.csv +0 -0
  276. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_201/metrics.csv +0 -0
  277. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_202/metrics.csv +0 -0
  278. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_204/metrics.csv +0 -0
  279. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_205/metrics.csv +0 -0
  280. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_206/metrics.csv +0 -0
  281. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_207/metrics.csv +0 -0
  282. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_208/metrics.csv +0 -0
  283. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_209/metrics.csv +0 -0
  284. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_21/metrics.csv +0 -0
  285. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_22/metrics.csv +0 -0
  286. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_23/metrics.csv +0 -0
  287. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_24/metrics.csv +0 -0
  288. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_25/metrics.csv +0 -0
  289. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_26/metrics.csv +0 -0
  290. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_27/metrics.csv +0 -0
  291. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_28/metrics.csv +0 -0
  292. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_29/metrics.csv +0 -0
  293. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_3/metrics.csv +0 -0
  294. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_30/metrics.csv +0 -0
  295. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_32/metrics.csv +0 -0
  296. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_33/metrics.csv +0 -0
  297. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_34/metrics.csv +0 -0
  298. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_35/metrics.csv +0 -0
  299. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_36/metrics.csv +0 -0
  300. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_37/metrics.csv +0 -0
  301. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_38/metrics.csv +0 -0
  302. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_39/metrics.csv +0 -0
  303. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_4/metrics.csv +0 -0
  304. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_40/metrics.csv +0 -0
  305. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_41/metrics.csv +0 -0
  306. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_42/metrics.csv +0 -0
  307. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_44/metrics.csv +0 -0
  308. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_45/metrics.csv +0 -0
  309. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_46/metrics.csv +0 -0
  310. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_47/metrics.csv +0 -0
  311. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_48/metrics.csv +0 -0
  312. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_49/metrics.csv +0 -0
  313. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_50/metrics.csv +0 -0
  314. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_51/metrics.csv +0 -0
  315. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_52/metrics.csv +0 -0
  316. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_53/metrics.csv +0 -0
  317. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_54/metrics.csv +0 -0
  318. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_55/metrics.csv +0 -0
  319. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_57/metrics.csv +0 -0
  320. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_58/metrics.csv +0 -0
  321. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_59/metrics.csv +0 -0
  322. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_6/metrics.csv +0 -0
  323. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_60/metrics.csv +0 -0
  324. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_61/metrics.csv +0 -0
  325. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_62/metrics.csv +0 -0
  326. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_63/metrics.csv +0 -0
  327. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_64/metrics.csv +0 -0
  328. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_65/metrics.csv +0 -0
  329. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_66/metrics.csv +0 -0
  330. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_67/metrics.csv +0 -0
  331. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_69/metrics.csv +0 -0
  332. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_7/metrics.csv +0 -0
  333. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_70/metrics.csv +0 -0
  334. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_71/metrics.csv +0 -0
  335. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_72/metrics.csv +0 -0
  336. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_73/metrics.csv +0 -0
  337. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_74/metrics.csv +0 -0
  338. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_75/metrics.csv +0 -0
  339. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_76/metrics.csv +0 -0
  340. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_77/metrics.csv +0 -0
  341. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_78/metrics.csv +0 -0
  342. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_79/metrics.csv +0 -0
  343. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_8/metrics.csv +0 -0
  344. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_80/metrics.csv +0 -0
  345. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_82/metrics.csv +0 -0
  346. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_83/metrics.csv +0 -0
  347. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_84/metrics.csv +0 -0
  348. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_85/metrics.csv +0 -0
  349. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_86/metrics.csv +0 -0
  350. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_87/metrics.csv +0 -0
  351. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_88/metrics.csv +0 -0
  352. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_89/metrics.csv +0 -0
  353. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_9/metrics.csv +0 -0
  354. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_90/metrics.csv +0 -0
  355. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_91/metrics.csv +0 -0
  356. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_92/metrics.csv +0 -0
  357. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_94/metrics.csv +0 -0
  358. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_95/metrics.csv +0 -0
  359. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_96/metrics.csv +0 -0
  360. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_97/metrics.csv +0 -0
  361. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_98/metrics.csv +0 -0
  362. {dfm_python-0.5.2 → dfm_python-0.5.3}/lightning_logs/dfm/version_99/metrics.csv +0 -0
  363. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/__init__.py +0 -0
  364. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/config/__init__.py +0 -0
  365. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/config/adapter.py +0 -0
  366. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/config/results.py +0 -0
  367. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/config/schema.py +0 -0
  368. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/config/utils.py +0 -0
  369. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/data/__init__.py +0 -0
  370. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/data/dataloader.py +0 -0
  371. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/data/dataset.py +0 -0
  372. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/data/utils.py +0 -0
  373. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/encoder/__init__.py +0 -0
  374. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/encoder/base.py +0 -0
  375. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/encoder/pca.py +0 -0
  376. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/lightning/__init__.py +0 -0
  377. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/lightning/data_module.py +0 -0
  378. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/lightning/scaling.py +0 -0
  379. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/logger/__init__.py +0 -0
  380. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/logger/inference_logger.py +0 -0
  381. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/logger/logger.py +0 -0
  382. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/logger/train_logger.py +0 -0
  383. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/__init__.py +0 -0
  384. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/base.py +0 -0
  385. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/models/utils.py +0 -0
  386. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/ssm/__init__.py +0 -0
  387. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/ssm/em.py +0 -0
  388. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/ssm/kalman.py +0 -0
  389. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/ssm/utils.py +0 -0
  390. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/trainer/__init__.py +0 -0
  391. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/trainer/ddfm.py +0 -0
  392. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/trainer/dfm.py +0 -0
  393. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/__init__.py +0 -0
  394. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/data.py +0 -0
  395. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/diagnostics.py +0 -0
  396. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/helpers.py +0 -0
  397. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/statespace.py +0 -0
  398. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/dfm_python/utils/time.py +0 -0
  399. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_config.py +0 -0
  400. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_helpers.py +0 -0
  401. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_logger.py +0 -0
  402. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_models.py +0 -0
  403. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_nowcast.py +0 -0
  404. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_nowcast_implementation.py +0 -0
  405. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_predict.py +0 -0
  406. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_sktime_integration.py +0 -0
  407. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_ssm.py +0 -0
  408. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_trainer.py +0 -0
  409. {dfm_python-0.5.2 → dfm_python-0.5.3}/src/test/test_utils.py +0 -0
  410. {dfm_python-0.5.2 → dfm_python-0.5.3}/test_update_manual.py +0 -0
  411. {dfm_python-0.5.2 → dfm_python-0.5.3}/tutorial/tutorial_finance_ddfm.py +0 -0
  412. {dfm_python-0.5.2 → dfm_python-0.5.3}/tutorial/tutorial_macro_ddfm.py +0 -0
  413. {dfm_python-0.5.2 → dfm_python-0.5.3}/uv.lock +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dfm-python
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Dynamic Factor Model (DFM) estimation and nowcasting in Python
5
5
  Project-URL: Homepage, https://github.com/yourusername/dfm-python
6
6
  Project-URL: Documentation, https://github.com/yourusername/dfm-python#readme
7
7
  Project-URL: Repository, https://github.com/yourusername/dfm-python
8
8
  Project-URL: Issues, https://github.com/yourusername/dfm-python/issues
9
- Author: DFM Python Contributors
9
+ Author: Minkey Chang
10
10
  License: MIT
11
11
  License-File: LICENSE
12
12
  Keywords: dfm,dynamic-factor-model,econometrics,forecasting,nowcasting,time-series
@@ -0,0 +1,2 @@
1
+ epoch,step,train_loss_epoch
2
+ 0,0,0.8447005748748779
@@ -0,0 +1,2 @@
1
+ epoch,step,train_loss_epoch
2
+ 0,0,0.8700895309448242
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 38.0,0,1164.719482421875,0,19.5,-2481.600830078125,3379.77783203125
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 11.0,0,-223.8029022216797,0,6.0,-225.65797424316406,6.871443271636963
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 38.0,0,1164.719482421875,0,19.5,-2481.600830078125,3379.77783203125
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 11.0,0,-223.8029022216797,0,6.0,-225.65797424316406,6.871443271636963
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 38.0,0,1164.719482421875,0,19.5,-2481.600830078125,3379.77783203125
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -0,0 +1,2 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 11.0,0,-223.8029022216797,0,6.0,-225.65797424316406,6.871443271636963
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-88.56625366210938,0,3.0,-60569.14453125,60471.5859375
3
+ 5.0,1,-88.56625366210938,1,,,
4
+ 5.0,2,-88.56625366210938,2,,,
5
+ 5.0,3,-88.56625366210938,3,,,
6
+ 5.0,4,-88.56625366210938,4,,,
@@ -0,0 +1,6 @@
1
+ em_iteration_epoch,epoch,loglik_epoch,step,train/em_iteration,train/loglik,train/loglik_change
2
+ 5.0,0,-91.18582916259766,0,3.0,-70.42988586425781,12.529343605041504
3
+ 5.0,1,-91.18582916259766,1,,,
4
+ 5.0,2,-91.18582916259766,2,,,
5
+ 5.0,3,-91.18582916259766,3,,,
6
+ 5.0,4,-91.18582916259766,4,,,
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "dfm-python"
3
- version = "0.5.2"
3
+ version = "0.5.3"
4
4
  description = "Dynamic Factor Model (DFM) estimation and nowcasting in Python"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
7
7
  license = {text = "MIT"}
8
8
  authors = [
9
- {name = "DFM Python Contributors"}
9
+ {name = "Minkey Chang"}
10
10
  ]
11
11
  keywords = ["dfm", "dynamic-factor-model", "nowcasting", "forecasting", "time-series", "econometrics"]
12
12
  classifiers = [
@@ -82,13 +82,27 @@ if _has_torch:
82
82
  # Build layers
83
83
  prev_dim = input_dim
84
84
  for hidden_dim in hidden_dims:
85
- self.layers.append(nn.Linear(prev_dim, hidden_dim))
85
+ layer = nn.Linear(prev_dim, hidden_dim)
86
+ # Initialize weights using Xavier/Kaiming initialization for better training stability
87
+ # Use Kaiming for ReLU, Xavier for tanh/sigmoid
88
+ if activation == 'relu':
89
+ nn.init.kaiming_normal_(layer.weight, mode='fan_in', nonlinearity='relu')
90
+ else:
91
+ nn.init.xavier_normal_(layer.weight, gain=1.0)
92
+ # Initialize bias to small values
93
+ if layer.bias is not None:
94
+ nn.init.constant_(layer.bias, 0.0)
95
+ self.layers.append(layer)
86
96
  if use_batch_norm:
87
97
  self.batch_norms.append(nn.BatchNorm1d(hidden_dim))
88
98
  prev_dim = hidden_dim
89
99
 
90
- # Output layer (no activation, linear)
100
+ # Output layer (linear, no activation)
101
+ # Use smaller initialization for output layer to prevent large initial factors
91
102
  self.output_layer = nn.Linear(prev_dim, output_dim)
103
+ nn.init.xavier_normal_(self.output_layer.weight, gain=0.1) # Smaller gain for output
104
+ if self.output_layer.bias is not None:
105
+ nn.init.constant_(self.output_layer.bias, 0.0)
92
106
 
93
107
  def forward(self, x: torch.Tensor) -> torch.Tensor:
94
108
  """Forward pass through encoder.
@@ -308,6 +308,10 @@ class DDFM(BaseFactorModel):
308
308
  decay_learning_rate: bool = True,
309
309
  min_obs_pretrain: int = 50,
310
310
  mult_epoch_pretrain: int = 1,
311
+ loss_function: str = 'mse',
312
+ huber_delta: float = 1.0,
313
+ weight_decay: float = 0.0,
314
+ grad_clip_val: float = 1.0,
311
315
  **kwargs
312
316
  ):
313
317
  """Initialize DDFM instance.
@@ -349,6 +353,19 @@ class DDFM(BaseFactorModel):
349
353
  mult_epoch_pretrain : int, default 1
350
354
  Multiplier for number of epochs during pre-training
351
355
  Display progress every 'disp' iterations
356
+ loss_function : str, default 'mse'
357
+ Loss function for training ('mse', 'huber').
358
+ 'mse': Mean squared error (default, matches original DDFM)
359
+ 'huber': Huber loss (more robust to outliers)
360
+ huber_delta : float, default 1.0
361
+ Delta parameter for Huber loss (only used if loss_function='huber').
362
+ Controls the transition point between quadratic and linear regions.
363
+ weight_decay : float, default 0.0
364
+ Weight decay (L2 regularization) for optimizer. Helps prevent overfitting to linear features.
365
+ Recommended: 1e-5 to 1e-3 for deeper encoders or when encoder collapses to linear behavior.
366
+ grad_clip_val : float, default 1.0
367
+ Maximum gradient norm for gradient clipping. Prevents training instability.
368
+ Set to 0.0 to disable gradient clipping.
352
369
  seed : int, optional
353
370
  Random seed for reproducibility
354
371
  **kwargs
@@ -383,6 +400,22 @@ class DDFM(BaseFactorModel):
383
400
  self.decay_learning_rate = decay_learning_rate
384
401
  self.min_obs_pretrain = min_obs_pretrain
385
402
  self.mult_epoch_pretrain = mult_epoch_pretrain
403
+ self.loss_function = loss_function.lower()
404
+ self.huber_delta = huber_delta
405
+ self.weight_decay = weight_decay
406
+ self.grad_clip_val = grad_clip_val
407
+
408
+ # Validate loss function
409
+ if self.loss_function not in ['mse', 'huber']:
410
+ raise ValueError(
411
+ f"DDFM initialization failed: loss_function must be 'mse' or 'huber', got '{loss_function}'"
412
+ )
413
+
414
+ # Validate gradient clipping value
415
+ if self.grad_clip_val < 0.0:
416
+ raise ValueError(
417
+ f"DDFM initialization failed: grad_clip_val must be >= 0.0, got {grad_clip_val}"
418
+ )
386
419
 
387
420
  # Determine number of factors
388
421
  # DDFM does not use block structure - num_factors is specified directly
@@ -586,7 +619,9 @@ class DDFM(BaseFactorModel):
586
619
 
587
620
  # Clip input data to prevent extreme values that cause NaN
588
621
  # Clip to reasonable range: -10 to 10 standard deviations
589
- data_clipped = torch.clamp(data, min=-10.0, max=10.0)
622
+ # For deeper networks, use slightly tighter clipping to improve stability
623
+ clip_range = 8.0 if len(self.encoder_layers) > 2 else 10.0
624
+ data_clipped = torch.clamp(data, min=-clip_range, max=clip_range)
590
625
 
591
626
  # Forward pass
592
627
  reconstructed = self.forward(data_clipped)
@@ -603,8 +638,23 @@ class DDFM(BaseFactorModel):
603
638
  # Compute loss with missing data masking
604
639
  mask = torch.isfinite(target)
605
640
  target_clean = torch.where(mask, target, torch.zeros_like(target))
606
- squared_diff = (target_clean - reconstructed) ** 2
607
- loss = torch.sum(squared_diff * mask) / (torch.sum(mask) + 1e-8)
641
+
642
+ # Use specified loss function
643
+ if self.loss_function == 'huber':
644
+ # Huber loss: more robust to outliers
645
+ # L_delta(a) = 0.5 * a^2 if |a| <= delta, else delta * (|a| - 0.5 * delta)
646
+ diff = target_clean - reconstructed
647
+ abs_diff = torch.abs(diff)
648
+ huber_loss = torch.where(
649
+ abs_diff <= self.huber_delta,
650
+ 0.5 * diff ** 2,
651
+ self.huber_delta * (abs_diff - 0.5 * self.huber_delta)
652
+ )
653
+ loss = torch.sum(huber_loss * mask) / (torch.sum(mask) + 1e-8)
654
+ else:
655
+ # MSE loss (default)
656
+ squared_diff = (target_clean - reconstructed) ** 2
657
+ loss = torch.sum(squared_diff * mask) / (torch.sum(mask) + 1e-8)
608
658
 
609
659
  # Handle NaN/Inf in loss
610
660
  if not torch.isfinite(loss):
@@ -614,6 +664,9 @@ class DDFM(BaseFactorModel):
614
664
  # Log metrics
615
665
  self.log('train_loss', loss, on_step=True, on_epoch=True, prog_bar=True)
616
666
 
667
+ # Note: Gradient clipping is handled automatically by Lightning trainer if gradient_clip_val is set
668
+ # The grad_clip_val parameter is used in pre_train() and MCMC training for manual training loops
669
+
617
670
  return loss
618
671
 
619
672
 
@@ -697,7 +750,8 @@ class DDFM(BaseFactorModel):
697
750
 
698
751
  optimizer = torch.optim.Adam(
699
752
  list(self.encoder.parameters()) + list(self.decoder.parameters()),
700
- lr=self.learning_rate
753
+ lr=self.learning_rate,
754
+ weight_decay=self.weight_decay
701
755
  )
702
756
 
703
757
  if self.decay_learning_rate:
@@ -750,7 +804,8 @@ class DDFM(BaseFactorModel):
750
804
 
751
805
  optimizer = torch.optim.Adam(
752
806
  list(self.encoder.parameters()) + list(self.decoder.parameters()),
753
- lr=lr
807
+ lr=lr,
808
+ weight_decay=self.weight_decay
754
809
  )
755
810
 
756
811
  return optimizer
@@ -842,7 +897,8 @@ class DDFM(BaseFactorModel):
842
897
  # Create optimizer for pre-training
843
898
  optimizer = torch.optim.Adam(
844
899
  list(self.encoder.parameters()) + list(self.decoder.parameters()),
845
- lr=self.learning_rate
900
+ lr=self.learning_rate,
901
+ weight_decay=self.weight_decay
846
902
  )
847
903
 
848
904
  # Pre-train for epochs * mult_epoch_pretrain
@@ -889,10 +945,11 @@ class DDFM(BaseFactorModel):
889
945
  loss.backward()
890
946
 
891
947
  # Gradient clipping for stability
892
- torch.nn.utils.clip_grad_norm_(
893
- list(self.encoder.parameters()) + list(self.decoder.parameters()),
894
- max_norm=1.0
895
- )
948
+ if self.grad_clip_val > 0.0:
949
+ torch.nn.utils.clip_grad_norm_(
950
+ list(self.encoder.parameters()) + list(self.decoder.parameters()),
951
+ max_norm=self.grad_clip_val
952
+ )
896
953
 
897
954
  optimizer.step()
898
955
 
@@ -23,11 +23,15 @@ from ..config import (
23
23
  MergedConfigSource,
24
24
  )
25
25
  from ..config.results import DFMResult, FitParams
26
+ from ..config.utils import get_agg_structure, get_tent_weights, FREQUENCY_HIERARCHY, TENT_WEIGHTS_LOOKUP
26
27
  from ..logger import get_logger
27
28
  from ..ssm.em import EMAlgorithm, EMStepParams
28
29
  from ..ssm.kalman import KalmanFilter
29
30
  from .base import BaseFactorModel
30
31
 
32
+ # Frequency to integer mapping for tensor conversion
33
+ _FREQ_TO_INT = {'d': 1, 'w': 2, 'm': 3, 'q': 4, 'sa': 5, 'a': 6}
34
+
31
35
  if TYPE_CHECKING:
32
36
  from omegaconf import DictConfig
33
37
  from ..lightning import DFMDataModule
@@ -90,6 +94,7 @@ class DFM(BaseFactorModel):
90
94
  nan_method: int = 2,
91
95
  nan_k: int = 3,
92
96
  tent_weights_dict: Optional[dict] = None,
97
+ mixed_freq: bool = False,
93
98
  **kwargs
94
99
  ):
95
100
  """Initialize DFM instance.
@@ -108,6 +113,12 @@ class DFM(BaseFactorModel):
108
113
  Missing data handling method
109
114
  nan_k : int, default 3
110
115
  Spline interpolation order
116
+ tent_weights_dict : dict, optional
117
+ [DEPRECATED] Optional tent weights to control aggregation. Use `mixed_freq` parameter instead.
118
+ Kept for backward compatibility only.
119
+ mixed_freq : bool, default False
120
+ If True, use tent kernels for mixed-frequency data. If False, treat all series as clock frequency.
121
+ When True, raises ValueError if any frequency pair is not in TENT_WEIGHTS_LOOKUP.
111
122
  **kwargs
112
123
  Additional arguments passed to BaseFactorModel
113
124
  """
@@ -120,8 +131,20 @@ class DFM(BaseFactorModel):
120
131
  self.max_iter = max_iter
121
132
  self.nan_method = nan_method
122
133
  self.nan_k = nan_k
123
- # Optional tent weights to control aggregation (e.g., disable tent by passing {'q':[1.0]})
124
- self.tent_weights_dict = tent_weights_dict
134
+ self.mixed_freq = mixed_freq
135
+
136
+ # Legacy tent_weights_dict parameter (deprecated - use mixed_freq instead)
137
+ # Only used when mixed_freq=False for backward compatibility
138
+ self._legacy_tent_weights_dict = tent_weights_dict
139
+
140
+ # Mixed frequency parameters (set during initialize_from_data)
141
+ self._em_R_mat = None
142
+ self._em_q = None
143
+ self._em_nQ = 0
144
+ self._em_tent_weights_dict = None
145
+ self._em_frequencies = None
146
+ self._em_i_idio = None
147
+ self._em_idio_chain_lengths = None
125
148
 
126
149
  # Determine number of factors
127
150
  if num_factors is None:
@@ -181,6 +204,53 @@ class DFM(BaseFactorModel):
181
204
  # Parameters will be initialized during fit_em() or first training step
182
205
  pass
183
206
 
207
+ def _create_em_step_params(
208
+ self,
209
+ y: torch.Tensor,
210
+ device: torch.device,
211
+ dtype: torch.dtype
212
+ ) -> EMStepParams:
213
+ """Create EM step parameters using stored mixed frequency parameters.
214
+
215
+ Parameters
216
+ ----------
217
+ y : torch.Tensor
218
+ Data tensor (N x T)
219
+ device : torch.device
220
+ Device for tensors
221
+ dtype : torch.dtype
222
+ Data type for tensors
223
+
224
+ Returns
225
+ -------
226
+ EMStepParams
227
+ EM step parameters
228
+ """
229
+ clock = getattr(self.config, 'clock', 'm')
230
+ N = y.shape[0]
231
+
232
+ return EMStepParams(
233
+ y=y,
234
+ A=self.A,
235
+ C=self.C,
236
+ Q=self.Q,
237
+ R=self.R,
238
+ Z_0=self.Z_0,
239
+ V_0=self.V_0,
240
+ r=self.r.to(device),
241
+ p=self.p,
242
+ R_mat=self._em_R_mat,
243
+ q=self._em_q,
244
+ nQ=self._em_nQ,
245
+ i_idio=self._em_i_idio if self._em_i_idio is not None else torch.ones(N, device=device, dtype=dtype),
246
+ blocks=self.blocks.to(device),
247
+ tent_weights_dict=self._em_tent_weights_dict,
248
+ clock=clock,
249
+ frequencies=self._em_frequencies,
250
+ idio_chain_lengths=self._em_idio_chain_lengths if self._em_idio_chain_lengths is not None else torch.zeros(N, device=device, dtype=dtype),
251
+ config=self.config
252
+ )
253
+
184
254
  def initialize_from_data(self, X: torch.Tensor) -> None:
185
255
  """Initialize parameters from data using PCA and OLS.
186
256
 
@@ -190,22 +260,100 @@ class DFM(BaseFactorModel):
190
260
  Standardized data (T x N)
191
261
  """
192
262
  opt_nan = {'method': self.nan_method, 'k': self.nan_k}
263
+ clock = getattr(self.config, 'clock', 'm')
193
264
 
194
- # Use self.em.initialize_parameters() with direct tensor operations (no CPU transfers)
265
+ # Handle mixed_freq parameter
266
+ if self.mixed_freq:
267
+ # Use tent kernels for mixed-frequency data
268
+ agg_structure = get_agg_structure(self.config, clock=clock)
269
+
270
+ # Validate that all required frequency pairs are in TENT_WEIGHTS_LOOKUP
271
+ frequencies_list = [s.frequency for s in self.config.series]
272
+ frequencies_set = set(frequencies_list)
273
+ clock_hierarchy = FREQUENCY_HIERARCHY.get(clock, 3)
274
+
275
+ missing_pairs = []
276
+ for freq in frequencies_set:
277
+ freq_hierarchy = FREQUENCY_HIERARCHY.get(freq, 3)
278
+ if freq_hierarchy > clock_hierarchy:
279
+ # This frequency is slower than clock, needs tent kernel
280
+ tent_w = get_tent_weights(freq, clock)
281
+ if tent_w is None:
282
+ missing_pairs.append((freq, clock))
283
+
284
+ if missing_pairs:
285
+ raise ValueError(
286
+ f"mixed_freq=True but the following frequency pairs are not in TENT_WEIGHTS_LOOKUP: {missing_pairs}. "
287
+ f"Available pairs: {list(TENT_WEIGHTS_LOOKUP.keys())}. "
288
+ f"Either add the missing pairs to TENT_WEIGHTS_LOOKUP or set mixed_freq=False."
289
+ )
290
+
291
+ # Convert tent_weights to torch tensors
292
+ tent_weights_dict = {k: torch.tensor(v, dtype=torch.float32, device=X.device)
293
+ for k, v in agg_structure['tent_weights'].items()}
294
+
295
+ # Get R_mat and q from first structure (if any)
296
+ R_mat = None
297
+ q = None
298
+ if agg_structure['structures']:
299
+ first_structure = list(agg_structure['structures'].values())[0]
300
+ R_mat = torch.tensor(first_structure[0], dtype=torch.float32, device=X.device)
301
+ q = torch.tensor(first_structure[1], dtype=torch.float32, device=X.device)
302
+
303
+ # Create frequencies array
304
+ frequencies_array = np.array(frequencies_list, dtype=object)
305
+
306
+ # Count slower-frequency series
307
+ nQ = sum(1 for freq in frequencies_list
308
+ if FREQUENCY_HIERARCHY.get(freq, 3) > clock_hierarchy)
309
+
310
+ # Compute i_idio (1 for clock frequency, 0 for slower frequencies)
311
+ i_idio = torch.tensor([1 if freq == clock else 0 for freq in frequencies_list],
312
+ dtype=torch.float32, device=X.device)
313
+ else:
314
+ # Treat all series as clock frequency (unified frequency)
315
+ tent_weights_dict = self._legacy_tent_weights_dict
316
+ R_mat = None
317
+ q = None
318
+ frequencies_array = None
319
+ nQ = 0
320
+ i_idio = torch.ones(X.shape[1], dtype=torch.float32, device=X.device)
321
+
322
+ # Convert frequencies to torch tensor
323
+ frequencies_tensor = None
324
+ if frequencies_array is not None:
325
+ frequencies_tensor = torch.tensor(
326
+ [_FREQ_TO_INT.get(f, 3) for f in frequencies_array],
327
+ dtype=torch.int32,
328
+ device=X.device
329
+ )
330
+
331
+ # Store for reuse in EM steps
332
+ self._em_R_mat = R_mat
333
+ self._em_q = q
334
+ self._em_nQ = nQ
335
+ self._em_tent_weights_dict = tent_weights_dict
336
+ self._em_frequencies = frequencies_tensor
337
+ self._em_i_idio = i_idio
338
+
339
+ # Idiosyncratic chain lengths (currently unused, set to zeros)
340
+ self._em_idio_chain_lengths = torch.zeros(X.shape[1], dtype=torch.int32, device=X.device)
341
+
342
+ # Initialize parameters using EM algorithm
195
343
  A, C, Q, R, Z_0, V_0 = self.em.initialize_parameters(
196
344
  X,
197
345
  r=self.r.to(X.device),
198
346
  p=self.p,
199
347
  blocks=self.blocks.to(X.device),
200
348
  opt_nan=opt_nan,
201
- R_mat=None,
202
- q=None,
203
- nQ=0,
204
- i_idio=None,
205
- clock=getattr(self.config, 'clock', 'm'),
206
- tent_weights_dict=self.tent_weights_dict,
207
- frequencies=None,
208
- idio_chain_lengths=None,
349
+ R_mat=R_mat,
350
+ q=q,
351
+ nQ=nQ,
352
+ i_idio=i_idio,
353
+ clock=clock,
354
+ tent_weights_dict=tent_weights_dict,
355
+ frequencies=frequencies_tensor,
356
+ idio_chain_lengths=self._em_idio_chain_lengths,
209
357
  config=self.config
210
358
  )
211
359
 
@@ -267,28 +415,8 @@ class DFM(BaseFactorModel):
267
415
  # EM expects y as (N x T), but data is (T x N)
268
416
  y = data.T # (N x T)
269
417
 
270
- # Create EM step parameters
271
- em_params = EMStepParams(
272
- y=y,
273
- A=self.A,
274
- C=self.C,
275
- Q=self.Q,
276
- R=self.R,
277
- Z_0=self.Z_0,
278
- V_0=self.V_0,
279
- r=self.r.to(y.device),
280
- p=self.p,
281
- R_mat=None,
282
- q=None,
283
- nQ=0,
284
- i_idio=torch.ones(y.shape[0], device=y.device, dtype=y.dtype),
285
- blocks=self.blocks.to(y.device),
286
- tent_weights_dict=self.tent_weights_dict,
287
- clock=getattr(self.config, 'clock', 'm'),
288
- frequencies=None,
289
- idio_chain_lengths=torch.zeros(y.shape[0], device=y.device, dtype=y.dtype),
290
- config=self.config
291
- )
418
+ # Create EM step parameters using stored mixed frequency parameters
419
+ em_params = self._create_em_step_params(y, y.device, y.dtype)
292
420
 
293
421
  # Perform EM step - use self.em(...) instead of em_step(...)
294
422
  C_new, R_new, A_new, Q_new, Z_0_new, V_0_new, loglik = self.em(em_params)
@@ -390,28 +518,8 @@ class DFM(BaseFactorModel):
390
518
 
391
519
  # EM loop
392
520
  while num_iter < self.max_iter and not converged:
393
- # Create EM step parameters
394
- em_params = EMStepParams(
395
- y=y,
396
- A=self.A,
397
- C=self.C,
398
- Q=self.Q,
399
- R=self.R,
400
- Z_0=self.Z_0,
401
- V_0=self.V_0,
402
- r=self.r.to(device),
403
- p=self.p,
404
- R_mat=None,
405
- q=None,
406
- nQ=0,
407
- i_idio=torch.ones(y.shape[0], device=device, dtype=dtype),
408
- blocks=self.blocks.to(device),
409
- tent_weights_dict={},
410
- clock=getattr(self.config, 'clock', 'm'),
411
- frequencies=None,
412
- idio_chain_lengths=torch.zeros(y.shape[0], device=device, dtype=dtype),
413
- config=self.config
414
- )
521
+ # Create EM step parameters using stored mixed frequency parameters
522
+ em_params = self._create_em_step_params(y, device, dtype)
415
523
 
416
524
  # Perform EM step - use self.em(...) instead of em_step(...)
417
525
  C_new, R_new, A_new, Q_new, Z_0_new, V_0_new, loglik = self.em(em_params)
@@ -347,10 +347,11 @@ class DDFMMCMCTrainer:
347
347
  loss = torch.sum(squared_diff) / (torch.sum(mask) + 1e-8)
348
348
  loss.backward()
349
349
  # Gradient clipping to prevent NaN and improve stability
350
- torch.nn.utils.clip_grad_norm_(
351
- list(self.model.encoder.parameters()) + list(self.model.decoder.parameters()),
352
- max_norm=1.0
353
- )
350
+ if self.model.grad_clip_val > 0.0:
351
+ torch.nn.utils.clip_grad_norm_(
352
+ list(self.model.encoder.parameters()) + list(self.model.decoder.parameters()),
353
+ max_norm=self.model.grad_clip_val
354
+ )
354
355
  optimizer.step()
355
356
  # Extract factors from this sample
356
357
  x_sample_tensor = torch.tensor(x_sim_den[i, :, :], device=device, dtype=dtype)