24556f51d7
- 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.
234 lines
6.2 KiB
Python
234 lines
6.2 KiB
Python
"""
|
|
OptimizR - High-Performance Optimization Algorithms
|
|
===================================================
|
|
|
|
Fast, reliable implementations of advanced optimization and statistical
|
|
inference algorithms with Rust acceleration and pure Python fallbacks.
|
|
|
|
.. moduleauthor:: OptimizR Contributors
|
|
|
|
"""
|
|
|
|
from optimizr.hmm import HMM
|
|
from optimizr.core import (
|
|
mcmc_sample,
|
|
differential_evolution,
|
|
parallel_differential_evolution_rust,
|
|
grid_search,
|
|
mutual_information,
|
|
shannon_entropy,
|
|
sparse_pca_py,
|
|
box_tao_decomposition_py,
|
|
elastic_net_py,
|
|
hurst_exponent_py,
|
|
compute_risk_metrics_py,
|
|
estimate_half_life_py,
|
|
bootstrap_returns_py,
|
|
# Time-series utilities
|
|
prepare_for_hmm_py,
|
|
rolling_hurst_exponent_py,
|
|
rolling_half_life_py,
|
|
return_statistics_py,
|
|
create_lagged_features_py,
|
|
rolling_correlation_py,
|
|
# Benchmark functions
|
|
Sphere,
|
|
Rosenbrock,
|
|
Rastrigin,
|
|
Ackley,
|
|
Griewank,
|
|
)
|
|
|
|
# Try to import maths_toolkit and mean_field from Rust backend
|
|
try:
|
|
from optimizr import _core
|
|
maths_toolkit = _core
|
|
MFGConfig = _core.MFGConfigPy
|
|
solve_mfg_1d_rust = _core.solve_mfg_1d_rust
|
|
except (ImportError, AttributeError):
|
|
maths_toolkit = None
|
|
MFGConfig = None
|
|
solve_mfg_1d_rust = None
|
|
|
|
# Portfolio Optimization (CARA, Mean-Variance, ERC)
|
|
try:
|
|
from optimizr._core import (
|
|
cara_optimal_weights,
|
|
mean_variance_optimal_weights,
|
|
min_variance_weights,
|
|
erc_weights,
|
|
)
|
|
except (ImportError, AttributeError):
|
|
cara_optimal_weights = None
|
|
mean_variance_optimal_weights = None
|
|
min_variance_weights = None
|
|
erc_weights = None
|
|
|
|
# ===== 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",
|
|
"differential_evolution",
|
|
"parallel_differential_evolution_rust",
|
|
"grid_search",
|
|
"mutual_information",
|
|
"shannon_entropy",
|
|
"sparse_pca_py",
|
|
"box_tao_decomposition_py",
|
|
"elastic_net_py",
|
|
"hurst_exponent_py",
|
|
"compute_risk_metrics_py",
|
|
"estimate_half_life_py",
|
|
"bootstrap_returns_py",
|
|
# Time-series utilities
|
|
"prepare_for_hmm_py",
|
|
"rolling_hurst_exponent_py",
|
|
"rolling_half_life_py",
|
|
"return_statistics_py",
|
|
"create_lagged_features_py",
|
|
"rolling_correlation_py",
|
|
# Benchmark functions
|
|
"Sphere",
|
|
"Rosenbrock",
|
|
"Rastrigin",
|
|
"Ackley",
|
|
"Griewank",
|
|
"maths_toolkit",
|
|
# Mean Field Games
|
|
"MFGConfig",
|
|
"solve_mfg_1d_rust",
|
|
# Portfolio Optimization
|
|
"cara_optimal_weights",
|
|
"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",
|
|
]
|
|
|
|
|
|
def __getattr__(name):
|
|
"""Transparent fallback: forward any unresolved top-level attribute access
|
|
to the compiled `_core` extension. This keeps `from optimizr import X`
|
|
working for every Rust-backed function (v1.x and v2.0 primitives) without
|
|
having to enumerate the full list above."""
|
|
try:
|
|
from optimizr import _core as _ext
|
|
except ImportError as exc: # pragma: no cover
|
|
raise AttributeError(
|
|
f"module 'optimizr' has no attribute {name!r} "
|
|
f"(_core extension is not built: {exc})"
|
|
) from exc
|
|
if hasattr(_ext, name):
|
|
return getattr(_ext, name)
|
|
raise AttributeError(f"module 'optimizr' has no attribute {name!r}")
|