StochasticForceInference 2.0.2__tar.gz → 2.0.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 (158) hide show
  1. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/PKG-INFO +11 -1
  2. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/README.md +10 -0
  3. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/overdamped.py +6 -0
  4. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/covariance.py +1 -1
  5. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/underdamped.py +23 -5
  6. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/structexpr.py +56 -0
  7. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/StochasticForceInference.egg-info/PKG-INFO +11 -1
  8. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/pyproject.toml +1 -1
  9. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/AGENTS.md +0 -0
  10. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/CONTRIBUTING.md +0 -0
  11. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/GALLERY_STYLE_GUIDE.md +0 -0
  12. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/LICENSE +0 -0
  13. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/MANIFEST.in +0 -0
  14. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/__init__.py +0 -0
  15. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/__init__.py +0 -0
  16. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/constants.py +0 -0
  17. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/linear.py +0 -0
  18. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/monomials.py +0 -0
  19. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/pairs.py +0 -0
  20. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/bases/spde.py +0 -0
  21. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/__init__.py +0 -0
  22. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/assess.py +0 -0
  23. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/dynamics_order.py +0 -0
  24. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/plotting.py +0 -0
  25. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/report.py +0 -0
  26. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/residual_tests.py +0 -0
  27. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/diagnostics/residuals.py +0 -0
  28. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/__init__.py +0 -0
  29. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/base.py +0 -0
  30. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/optimizers.py +0 -0
  31. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/__init__.py +0 -0
  32. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/banded.py +0 -0
  33. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/driver.py +0 -0
  34. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/flow.py +0 -0
  35. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/flow_multi.py +0 -0
  36. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/flow_ud.py +0 -0
  37. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/gram.py +0 -0
  38. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/jacobians.py +0 -0
  39. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/precompute.py +0 -0
  40. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/runner.py +0 -0
  41. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/parametric_core/solve.py +0 -0
  42. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/result.py +0 -0
  43. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/serialization.py +0 -0
  44. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/__init__.py +0 -0
  45. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/base.py +0 -0
  46. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/beam.py +0 -0
  47. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/greedy.py +0 -0
  48. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/hillclimb.py +0 -0
  49. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/lasso.py +0 -0
  50. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/metrics.py +0 -0
  51. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/result.py +0 -0
  52. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/scorer.py +0 -0
  53. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparse/stlsq.py +0 -0
  54. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/inference/sparsity.py +0 -0
  55. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/integrate/__init__.py +0 -0
  56. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/integrate/api.py +0 -0
  57. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/integrate/integrand.py +0 -0
  58. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/integrate/rk4.py +0 -0
  59. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/integrate/timeops.py +0 -0
  60. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/__init__.py +0 -0
  61. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/base.py +0 -0
  62. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/chunked.py +0 -0
  63. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/noise.py +0 -0
  64. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/overdamped.py +0 -0
  65. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/langevin/underdamped.py +0 -0
  66. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/__init__.py +0 -0
  67. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/basis.py +0 -0
  68. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/core/runtime.py +0 -0
  69. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/factory.py +0 -0
  70. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/interactor.py +0 -0
  71. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/__init__.py +0 -0
  72. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/_base.py +0 -0
  73. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/_eval_compiler.py +0 -0
  74. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/_fd_atoms.py +0 -0
  75. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/_grid.py +0 -0
  76. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/layout/_sectors.py +0 -0
  77. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/memhint.py +0 -0
  78. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/__init__.py +0 -0
  79. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/base.py +0 -0
  80. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/contract.py +0 -0
  81. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/interactions/__init__.py +0 -0
  82. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/interactions/dispatcher.py +0 -0
  83. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/interactions/prepare.py +0 -0
  84. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/interactions/specs.py +0 -0
  85. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/interactions/stencils.py +0 -0
  86. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/leaf.py +0 -0
  87. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/__init__.py +0 -0
  88. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/concat.py +0 -0
  89. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/derivative.py +0 -0
  90. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/einsum.py +0 -0
  91. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/linear.py +0 -0
  92. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/mapn.py +0 -0
  93. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/reshape_rank.py +0 -0
  94. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/nodes/ops/slice.py +0 -0
  95. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/params.py +0 -0
  96. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/psf.py +0 -0
  97. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/sf.py +0 -0
  98. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/statefunc/stateexpr.py +0 -0
  99. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/__init__.py +0 -0
  100. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/collection.py +0 -0
  101. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/dataset.py +0 -0
  102. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/degrade.py +0 -0
  103. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/io.py +0 -0
  104. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/trajectory/reserved_extras.py +0 -0
  105. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/utils/__init__.py +0 -0
  106. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/utils/formatting.py +0 -0
  107. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/utils/maths.py +0 -0
  108. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/utils/neighbors.py +0 -0
  109. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/SFI/utils/plotting.py +0 -0
  110. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/StochasticForceInference.egg-info/SOURCES.txt +0 -0
  111. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/StochasticForceInference.egg-info/dependency_links.txt +0 -0
  112. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/StochasticForceInference.egg-info/requires.txt +0 -0
  113. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/StochasticForceInference.egg-info/top_level.txt +0 -0
  114. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/__init__.py +0 -0
  115. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/abp.py +0 -0
  116. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/bench_utils.py +0 -0
  117. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/coarse_grain.py +0 -0
  118. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/helpers.py +0 -0
  119. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/_gallery_utils/scenario_picker.py +0 -0
  120. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/experimental_data/_analyze_results.py +0 -0
  121. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/experimental_data/_expanded_basis.py +0 -0
  122. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/experimental_data/generate_tweezer_csv.py +0 -0
  123. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/abp_align_demo.py +0 -0
  124. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/abp_nonreciprocal_demo.py +0 -0
  125. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/abp_to_spde_demo.py +0 -0
  126. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/advanced/flocking_3d_demo.py +0 -0
  127. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/advanced/multi_experiment_demo.py +0 -0
  128. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/advanced/nn_force_demo.py +0 -0
  129. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/anisotropic_diffusion_demo.py +0 -0
  130. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/custom_basis_demo.py +0 -0
  131. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/diagnostics_demo.py +0 -0
  132. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/dynamics_order_demo.py +0 -0
  133. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/entropy_production_demo.py +0 -0
  134. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/entropy_production_underdamped_demo.py +0 -0
  135. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/experimental_workflow_demo.py +0 -0
  136. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/gray_scott_demo.py +0 -0
  137. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/home_range_demo.py +0 -0
  138. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/limitcycle_demo.py +0 -0
  139. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/lorenz_demo.py +0 -0
  140. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/lotka_volterra_demo.py +0 -0
  141. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/multiplicative_diffusion_demo.py +0 -0
  142. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/ou_demo.py +0 -0
  143. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/time_dependent_forcing_demo.py +0 -0
  144. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/time_fourier_demo.py +0 -0
  145. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/van_der_pol_demo.py +0 -0
  146. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/gallery/velocity_dependent_noise_demo.py +0 -0
  147. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_align_demo.py +0 -0
  148. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_largescale_config.py +0 -0
  149. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_largescale_demo.py +0 -0
  150. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_largescale_infer.py +0 -0
  151. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_largescale_plot.py +0 -0
  152. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_largescale_simulate.py +0 -0
  153. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/examples/manual_examples/abp_pursuit_demo.py +0 -0
  154. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/setup.cfg +0 -0
  155. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/tests/test_dual_mask.py +0 -0
  156. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/tests/test_parametric_mask.py +0 -0
  157. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/tests/test_parametric_mask_abp.py +0 -0
  158. {stochasticforceinference-2.0.2 → stochasticforceinference-2.0.3}/tests/test_same_particle_jacobian.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: StochasticForceInference
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: Stochastic Force Inference for Langevin SDEs
5
5
  Author-email: Pierre Ronceray <pierre.ronceray@univ-amu.fr>
6
6
  License: MIT
@@ -202,6 +202,16 @@ together with the method paper(s) relevant to the features you use. See
202
202
  documentation for the full, feature-specific list (overdamped, underdamped/ULI,
203
203
  trapeze, and PASTIS references).
204
204
 
205
+ ## Funding
206
+
207
+ Funded by the European Union (ERC, SuperStoc, 101117322). Views and opinions
208
+ expressed are however those of the author(s) only and do not necessarily
209
+ reflect those of the European Union or the European Research Council Executive
210
+ Agency. Neither the European Union nor the granting authority can be held
211
+ responsible for them. P. R. also acknowledges funding from the French National
212
+ Research Agency (ANR-16-CONV-0001) and from the Excellence Initiative of
213
+ Aix-Marseille University A\*MIDEX.
214
+
205
215
  ## License
206
216
 
207
217
  MIT — see [LICENSE](https://github.com/ronceray/StochasticForceInference/blob/main/LICENSE) for details.
@@ -148,6 +148,16 @@ together with the method paper(s) relevant to the features you use. See
148
148
  documentation for the full, feature-specific list (overdamped, underdamped/ULI,
149
149
  trapeze, and PASTIS references).
150
150
 
151
+ ## Funding
152
+
153
+ Funded by the European Union (ERC, SuperStoc, 101117322). Views and opinions
154
+ expressed are however those of the author(s) only and do not necessarily
155
+ reflect those of the European Union or the European Research Council Executive
156
+ Agency. Neither the European Union nor the granting authority can be held
157
+ responsible for them. P. R. also acknowledges funding from the French National
158
+ Research Agency (ANR-16-CONV-0001) and from the Excellence Initiative of
159
+ Aix-Marseille University A\*MIDEX.
160
+
151
161
  ## License
152
162
 
153
163
  MIT — see [LICENSE](https://github.com/ronceray/StochasticForceInference/blob/main/LICENSE) for details.
@@ -1169,6 +1169,12 @@ class OverdampedLangevinInference(BaseLangevinInference):
1169
1169
  )
1170
1170
  D = self.get_diffusion_timeop("noisy") # already a TimeOperand with alias
1171
1171
 
1172
+ # Contraction correctness relies on D_inst being SYMMETRIC: the einsum
1173
+ # pairs D_inst with the derivative axis (n) of the Jacobian and A_inv
1174
+ # with the output axis (o), giving (D_inst . A_inv) : grad b. This is
1175
+ # the intended order only because D ("noisy") is symmetric; a future
1176
+ # non-symmetric instantaneous-D estimator would need the index roles of
1177
+ # D and A_inv swapped (and would differ whenever [A_inv, D] != 0).
1172
1178
  prog_grad = Integrand(
1173
1179
  exprs=[G],
1174
1180
  times=[D],
@@ -242,7 +242,7 @@ def build_ud_blocks_exact(alpha_plus, alpha_zero, alpha_minus, qing, Lambda,
242
242
 
243
243
  A_n^{\rm proc} &= Q^{xx}_{\rm out}(n)
244
244
  + J^{xv}_{\rm out}(n)\,S_v(n)\,J^{xv}_{\rm out}(n)^{\!\top},\\
245
- S_v(n) &= Q^{vv}_{\rm in} - N Q^{xv\top}_{\rm in} - Q^{xv}_{\rm in} N^{\!\top}
245
+ S_v(n) &= Q^{vv}_{\rm in} - N Q^{xv}_{\rm in} - (N Q^{xv}_{\rm in})^{\!\top}
246
246
  + N Q^{xx}_{\rm in} N^{\!\top}\ \big|_n ,\\
247
247
  C_n^{\rm proc} &= \bigl[Q^{xv}_{\rm out}(n) - Q^{xx}_{\rm out}(n)\,N(n{+}1)^{\!\top}\bigr]
248
248
  J^{xv}_{\rm out}(n{+}1)^{\!\top},
@@ -984,10 +984,17 @@ class UnderdampedLangevinInference(BaseLangevinInference):
984
984
 
985
985
  M_a = \bigl\langle \hat a_t \cdot A^{-1} \cdot b_a(\hat x_t, \hat v_t)
986
986
  \bigr\rangle
987
- \;+\; w \,\bigl\langle -D_{\text{inst}} : (A^{-1}\cdot\partial_v b_a)
988
- \bigr\rangle
989
-
990
- where :math:`w = (1+2\ell)/3`, with :math:`\ell=1` (symmetric),
987
+ \;-\; w \,\bigl\langle (D_{\text{inst}}\,A^{-1})_{kl}\,
988
+ \partial_{v_k} (b_a)_l \bigr\rangle
989
+
990
+ where :math:`k` is the velocity-derivative index and :math:`l` the
991
+ output (force) index of :math:`\partial_v b_a`. The matrix acting
992
+ on the Jacobian is :math:`D_{\text{inst}}\,A^{-1}` in this order:
993
+ contracting :math:`D_{\text{inst}}` with the output index instead
994
+ would give :math:`A^{-1} D_{\text{inst}}`, which differs whenever
995
+ :math:`[A^{-1}, D_{\text{inst}}] \neq 0` (this is the overdamped
996
+ gradient-correction convention, mirrored here). The weight is
997
+ :math:`w = (1+2\ell)/3`, with :math:`\ell=1` (symmetric),
991
998
  :math:`\ell=0` (early), :math:`\ell=-\tfrac{1}{2}` (anticipated).
992
999
 
993
1000
  Contractions
@@ -997,7 +1004,12 @@ class UnderdampedLangevinInference(BaseLangevinInference):
997
1004
 
998
1005
  - correction term:
999
1006
  eq='imn,no,imoa->ia' with ops (D_inst, A_inv, ∂_v b)
1000
- (the third axis of ∂_v b is the derivative index; we label it 'o' above).
1007
+ (∂_v b has axes (i, m, o, a): m is the velocity-DERIVATIVE index
1008
+ — contracted with D_inst — and o is the OUTPUT/force index —
1009
+ contracted with A_inv; a is the feature. This yields
1010
+ (D_inst · A_inv) : ∂_v b. Per stateexpr.py, d_v inserts the
1011
+ derivative axis immediately before the rank block, so it is the
1012
+ second axis, not the third.)
1001
1013
  """
1002
1014
  if not hasattr(self, "A_inv"):
1003
1015
  raise RuntimeError("A_inv not available. Compute diffusion first.")
@@ -1049,6 +1061,12 @@ class UnderdampedLangevinInference(BaseLangevinInference):
1049
1061
  alias="Gv",
1050
1062
  )
1051
1063
 
1064
+ # Contraction correctness relies on D_inst being SYMMETRIC: D_inst (m,n)
1065
+ # pairs with the velocity-derivative axis (m) of Gv and A_inv (n,o) with
1066
+ # the output axis (o), giving (D_inst . A_inv) : grad_v b. Correct only
1067
+ # because D ("noisy") is symmetric; a non-symmetric instantaneous-D
1068
+ # estimator would need the D/A_inv index roles swapped (they differ
1069
+ # whenever [A_inv, D] != 0). Mirrors overdamped._force_moments.
1052
1070
  prog_w = Integrand(
1053
1071
  exprs=[Gv],
1054
1072
  times=[D_op],
@@ -428,6 +428,40 @@ def _feature_count(idx: Any, n_features: int) -> int:
428
428
  raise TypeError(f"Unsupported index type: {type(idx).__name__}")
429
429
 
430
430
 
431
+ def _selected_feature_indices(idx: Any, n_features: int) -> list[int]:
432
+ """Normalise a ``__getitem__`` index to a list of non-negative feature ids.
433
+
434
+ Mirrors the validation in :func:`_feature_count`; assumes ``idx`` has
435
+ already passed it (so range/type errors have been raised).
436
+ """
437
+ if isinstance(idx, int):
438
+ return [idx % n_features]
439
+ if isinstance(idx, slice):
440
+ return list(range(*idx.indices(n_features)))
441
+ # list/tuple of ints (validated by _feature_count)
442
+ return [int(i) % n_features for i in idx]
443
+
444
+
445
+ def _flatten_concat_features(node: _StructNode) -> list[_StructNode]:
446
+ """Flatten a (possibly nested) ``_ConcatOp`` into its per-term sub-nodes.
447
+
448
+ Feature concatenation via ``&`` builds ``_ConcatOp`` trees whose children
449
+ are the individual feature terms. Returns one entry per structural
450
+ feature; a non-concat node contributes itself (treated as a single
451
+ feature). The caller must check ``len(result) == n_features`` before
452
+ trusting the decomposition — that equality is what distinguishes a
453
+ genuine ``&``-concatenated field (where feature selection can be resolved
454
+ structurally) from an opaque/parametric node whose feature axis is not
455
+ expressed as concat structure.
456
+ """
457
+ if isinstance(node, _ConcatOp):
458
+ out: list[_StructNode] = []
459
+ for c in node.children:
460
+ out.extend(_flatten_concat_features(c))
461
+ return out
462
+ return [node]
463
+
464
+
431
465
  # =====================================================================
432
466
  # StructuredExpr
433
467
  # =====================================================================
@@ -727,6 +761,28 @@ class StructuredExpr:
727
761
  lbls = tuple(self.labels[idx]) if self.labels else ()
728
762
  else:
729
763
  lbls = ()
764
+
765
+ # Feature selection is a structural (concat-level) concept: a compiled
766
+ # inner value carries no feature axis, so `_SliceOp`'s pointwise
767
+ # `v[..., idx]` would slice a *spatial* axis, not a feature (it errors
768
+ # for scalar sectors and silently returns the wrong component for
769
+ # vector/tensor sectors). When the field is `&`-concatenated — the
770
+ # normal way multi-feature structured fields are built — resolve the
771
+ # selection by picking the corresponding `_ConcatOp` term(s), so it
772
+ # compiles through the working feature-concat path in `_compile_sector`
773
+ # and never reaches `_SliceOp`.
774
+ feats = _flatten_concat_features(self._node)
775
+ if len(feats) == self.n_features:
776
+ sel = _selected_feature_indices(idx, self.n_features)
777
+ picked = [feats[i] for i in sel]
778
+ new_node: _StructNode = (
779
+ picked[0] if len(picked) == 1 else _ConcatOp(tuple(picked))
780
+ )
781
+ return self._new(n_features=n, labels=lbls, node=new_node)
782
+
783
+ # Fallback: the feature axis is not expressed as concat structure
784
+ # (opaque/parametric node). Preserve the prior algebra behaviour;
785
+ # such nodes are not produced by the SPDE embed path.
730
786
  return self._new(
731
787
  n_features=n,
732
788
  labels=lbls,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: StochasticForceInference
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: Stochastic Force Inference for Langevin SDEs
5
5
  Author-email: Pierre Ronceray <pierre.ronceray@univ-amu.fr>
6
6
  License: MIT
@@ -202,6 +202,16 @@ together with the method paper(s) relevant to the features you use. See
202
202
  documentation for the full, feature-specific list (overdamped, underdamped/ULI,
203
203
  trapeze, and PASTIS references).
204
204
 
205
+ ## Funding
206
+
207
+ Funded by the European Union (ERC, SuperStoc, 101117322). Views and opinions
208
+ expressed are however those of the author(s) only and do not necessarily
209
+ reflect those of the European Union or the European Research Council Executive
210
+ Agency. Neither the European Union nor the granting authority can be held
211
+ responsible for them. P. R. also acknowledges funding from the French National
212
+ Research Agency (ANR-16-CONV-0001) and from the Excellence Initiative of
213
+ Aix-Marseille University A\*MIDEX.
214
+
205
215
  ## License
206
216
 
207
217
  MIT — see [LICENSE](https://github.com/ronceray/StochasticForceInference/blob/main/LICENSE) for details.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "StochasticForceInference"
7
- version = "2.0.2"
7
+ version = "2.0.3"
8
8
  description = "Stochastic Force Inference for Langevin SDEs"
9
9
  authors = [{name = "Pierre Ronceray", email = "pierre.ronceray@univ-amu.fr"}]
10
10
  readme = "README.md"