release(v2.0.0): finalize PyPI metadata, README rewrite, v2 benchmark + McKean-Vlasov animation

- Restore correct PyPI distribution name 'optimiz-rs' (continuity with v1.0.x).
  Rust crate stays 'optimiz-rs'; Python module is 'optimizr'.
- python/optimizr/__init__.py:
  * Bump __version__ from stale '0.2.0' to '2.0.0'.
  * Eagerly bind every v2 primitive from _core (so dir(optimizr), IDE
    auto-complete and 'from optimizr import X' all work without relying on
    the lazy __getattr__ fallback).
  * Extend __all__ with 38 new v2 entries.
- README.md: full v2 features section grouped by domain (rough volatility,
  BSDE/PDE, stochastic control, mean-field, topology/graphs/signatures,
  risk/robust inference, point processes, Kalman). Embedded
  examples/mckean_vlasov.gif at the top. Added v2 benchmark table.
- examples/benchmark_v2.py: honest benchmark vs pure-Python/NumPy
  references on intrinsically loopy workloads. Best-of-3, single-thread,
  Apple M2: HMM 67.7x, DE 13.9x, signatures 11.2x, Hawkes 3.3x, MCMC 1.7x.
- examples/animate_mckean_vlasov.py + examples/mckean_vlasov.gif (5MB):
  cinematic 800-particle mean-reverting McKean-Vlasov flow animation
  using optimizr.mean_reverting_mckean_vlasov.
- tests/test_v2_api.py already in place: 20/20 pass.
This commit is contained in:
ThotDjehuty
2026-05-14 21:54:49 +02:00
parent 1799a2fa7b
commit 24556f51d7
8 changed files with 599 additions and 20 deletions
+112 -1
View File
@@ -64,7 +64,73 @@ except (ImportError, AttributeError):
min_variance_weights = None
erc_weights = None
__version__ = "0.2.0"
# ===== v2.0 primitives (lazy via __getattr__, but eagerly bound when possible) =====
try:
from optimizr._core import (
# Volterra / fractional
solve_fractional_ode,
solve_volterra,
geometric_grid_lift,
fourier_invert,
mittag_leffler_py,
# BSDE
linear_bsde_constant_coeffs,
# Mean-field / agent-based
mean_reverting_mckean_vlasov,
consensus_dynamics,
# Risk measures
historical_var_py,
parametric_var_py,
cvar_value_py,
minimize_cvar_py,
# PDE
fokker_planck_constant,
hjb_quadratic_2d,
poisson_2d_zero_boundary,
# Stochastic control
optimal_switching_dp,
pontryagin_lqr,
two_sided_intensities,
quadratic_impact_control_py,
# Topology
vietoris_rips_filtration,
persistent_homology,
bottleneck_distance,
# Graph
combinatorial_laplacian_py,
normalised_laplacian_py,
random_walk_laplacian_py,
spectral_cluster_py,
# Signatures
path_signature,
path_log_signature,
random_signature,
signature_kernel,
shuffle_product,
concatenate_signatures,
# Inference / optimisation
robust_drift,
estimate_hurst,
scale_dependent_hurst,
f_alpha_lambda_py,
mmd_gaussian,
# Point processes
simulate_hawkes,
simulate_bivariate_hawkes,
simulate_fbm,
simulate_mixed_fbm,
# Kalman / smoothing
LinearKalmanFilter,
UnscentedKalmanFilter,
RTSSmoother,
FilterResult,
SmootherResult,
KalmanState,
)
except (ImportError, AttributeError):
pass
__version__ = "2.0.0"
__all__ = [
"HMM",
"mcmc_sample",
@@ -102,6 +168,51 @@ __all__ = [
"mean_variance_optimal_weights",
"min_variance_weights",
"erc_weights",
# ===== v2.0 primitives =====
"solve_fractional_ode",
"solve_volterra",
"geometric_grid_lift",
"fourier_invert",
"mittag_leffler_py",
"linear_bsde_constant_coeffs",
"mean_reverting_mckean_vlasov",
"consensus_dynamics",
"historical_var_py",
"parametric_var_py",
"cvar_value_py",
"minimize_cvar_py",
"fokker_planck_constant",
"hjb_quadratic_2d",
"poisson_2d_zero_boundary",
"optimal_switching_dp",
"pontryagin_lqr",
"two_sided_intensities",
"quadratic_impact_control_py",
"vietoris_rips_filtration",
"persistent_homology",
"bottleneck_distance",
"combinatorial_laplacian_py",
"normalised_laplacian_py",
"random_walk_laplacian_py",
"spectral_cluster_py",
"path_signature",
"path_log_signature",
"random_signature",
"signature_kernel",
"shuffle_product",
"concatenate_signatures",
"robust_drift",
"estimate_hurst",
"scale_dependent_hurst",
"f_alpha_lambda_py",
"mmd_gaussian",
"simulate_hawkes",
"simulate_bivariate_hawkes",
"simulate_fbm",
"simulate_mixed_fbm",
"LinearKalmanFilter",
"UnscentedKalmanFilter",
"RTSSmoother",
]