diff --git a/README.md b/README.md index 94baf9e..dff3692 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,171 @@

Pydiffuser

+[![pypi](https://img.shields.io/badge/pypi-v0.0.1-blue)](https://pypi.org/) +[![python](https://img.shields.io/badge/python-3.10_|_3.11_|_3.12-blue)](https://pypi.org/) +[![doi](https://img.shields.io/badge/DOI--blue)](https://zenodo.org/) +[![codecov](https://codecov.io/gh/jung235/pydiffuser/graph/badge.svg?token=XXXXXXXXXX)](https://codecov.io/gh/jung235/pydiffuser) +[![ci](https://github.com/jung235/pydiffuser/actions/workflows/ci.yml/badge.svg)](https://github.com/jung235/pydiffuser) +[![docs](https://img.shields.io/badge/docs-dev-black)](https://github.com/jung235/pydiffuser) +[![status](https://img.shields.io/badge/status-alpha-blueviolet)](https://github.com/jung235/pydiffuser) + Pydiffuser is a numerical simulation framework for nonequilibrium statistical physics based on [JAX](https://github.com/google/jax). +**This package mainly aims:** +- to share code to implement a numerical simulation on physical models written in various forms of [stochastic differential equations](https://en.wikipedia.org/wiki/Stochastic_differential_equation). +- to revisit recent research highlights in non-equilibrium statistical physics. +- to reduce the repeated code on time-series data analysis, e.g., statistical analysis of [single-particle trajectory](https://en.wikipedia.org/wiki/Single-particle_trajectory) for [SPT](https://en.wikipedia.org/wiki/Single-particle_tracking) experiments. +- to provide the skeleton of stochastic model simulation for anyone interested in stochastic processes. + +## Installation + +### Requirements + +Python 3.10+, [`jax>=0.4.18`](https://pypi.org/project/jax/), and [`jaxlib>=0.4.18`](https://pypi.org/project/jaxlib/). + +### From [PyPI](https://pypi.org) + +```console +$ pip install pydiffuser +``` + +If properly installed, you can run: + +```console +$ pydiffuser --version +pydiffuser, version 0.0.1 +``` + +### From source + +```console +$ git clone https://github.com/jung235/pydiffuser.git +$ cd pydiffuser +$ pip install . +``` + +## Quickstart + +Pydiffuser provides various stochastic models that implement a numerical simulation based on the [Monte Carlo method](https://en.wikipedia.org/wiki/Monte_Carlo_method). +All Pydiffuser's models inherit an abstract class `pydiffuser.models.BaseDiffusion` and initiate the simulation after a method `generate` is called. +For the simplest case, you can produce a non-interacting [Brownian motion](https://en.wikipedia.org/wiki/Brownian_motion) at low Reynolds numbers as follows: + +```python +from pydiffuser.models import BrownianMotion +from pydiffuser.tracer import Ensemble, Trajectory + + +model = BrownianMotion() +ensemble: Ensemble = model.generate() +tracer: Trajectory = ensemble[0] # 0th particle +``` + +Relevant stochastic observables, such as [mean-squared displacement](https://en.wikipedia.org/wiki/Mean_squared_displacement) $\left \langle \mathbf{r}^{2}(t) \right \rangle$ and normalized [velocity autocorrelation function](https://en.wikipedia.org/wiki/Autocorrelation), can be calculated through the [methods](#observables) of `Trajectory` and `Ensemble`. +For example: + +```python +tamsd = tracer.get_mean_squared_displacement(lagtime=1, rolling=True) +eamsd = ensemble.get_mean_squared_displacement(lagtime=1, rolling=False) +eatamsd = ensemble.get_mean_squared_displacement(lagtime=1, rolling=True) +``` + +You can visualize the results using [matplotlib](https://github.com/matplotlib/matplotlib). + +

+ +

+ +The trajectory is obtained by `matplotlib.pyplot.plot(tracer.position_x1, tracer.position_x2)`. + +## CLI + +List all stochastic models supported by Pydiffuser. + +```console +$ pydiffuser list +NAME MODEL CONFIG DIMENSION +abp ActiveBrownianParticle ActiveBrownianParticleConfig 2d +aoup ActiveOUParticle ActiveOUParticleConfig 1d, 2d, 3d +bm BrownianMotion BrownianMotionConfig 1d, 2d, 3d +levy LevyWalk LevyWalkConfig 1d, 2d, 3d +rtp RunAndTumbleParticle RunAndTumbleParticleConfig 1d, 2d, 3d +smoluchowski SmoluchowskiEquation SmoluchowskiEquationConfig 1d, 2d +``` + +Here, every model is the subclass of `pydiffuser.models.BaseDiffusion`, and every configuration is the subclass of `pydiffuser.utils.BaseDiffusionConfig`. + +## Features + +### Observables + +*class* `pydiffuser.tracer.Trajectory` ∈ *class* `pydiffuser.tracer.Ensemble` + +- `get_increments` +- `get_displacement_moment` +- `get_mean_squared_displacement` +- `get_cosine_moment` +- `get_velocity_autocorrelation` +- `get_real_time` + +The above methods are defined in both `Trajectory` and `Ensemble` to enhance transparency. +Using the methods of `Trajectory`, the statistical analysis of [single-particle trajectory](https://en.wikipedia.org/wiki/Single-particle_trajectory) can be accelerated. + +### Configuration + +We introduce a configuration file to deal with extensive parameter manipulation. +For instance, see [`config.json`](https://github.com/jung235/pydiffuser/blob/main/docs/features/configs/config.json), which contains all parameters demanded to instantiate `pydiffuser.ActiveBrownianParticle`. +Every JSON file of the configurations listed in [CLI](#cli) can be obtained as follows: + +```python +import pydiffuser as pyd +from pydiffuser.models import ActiveBrownianParticle, ActiveBrownianParticleConfig + + +config = ActiveBrownianParticleConfig() +config.to_json(json_path=) +``` + +We suggest a research pipeline. + +```python +┌────┐ ┌─────────────────────┐ ┌───────────────┐ ┌──────────┐ ┌────────────┐ +│JSON├──>──┤`BaseDiffusionConfig`├──>──┤`BaseDiffusion`├──>──┤`Ensemble`├──>──┤NPY | PICKLE│ +└────┘ [1] └─────────────────────┘ [2] └───────────────┘ [3] └──────────┘ [4] └────────────┘ +``` + +It can be automized as follows: + +```python +config = ActiveBrownianParticleConfig.from_json(json_path=) # [1] +model = ActiveBrownianParticle.from_config(config=config) # [2] +ensemble = model.generate() # [3] +ensemble.to_npy(npy_path=) # [4] +``` + +After calculating the stochastic [observables](#observables), you can plot: + +

+ +

+ +It is possible to save & load a picklable object through `pydiffuser.save` and `pydiffuser.load`. + +```python +MODEL_PATH = "model.pickle" + +pyd.save(obj=model, pickle_path=MODEL_PATH) # = MODEL_PATH +model = pyd.load(pickle_path=MODEL_PATH) +``` + ## Related Works [Hyperdiffusion of Poissonian run-and-tumble particles in two dimensions](https://arxiv.org/abs/2308.00554) ## License -Apache License 2.0 +[Apache License 2.0](https://github.com/jung235/pydiffuser/blob/main/LICENSE) + +## Citation + +```bibtex +```