Skip to content

Cell growth

jax_morph.physics.SaturatingCellGrowth #

SaturatingCellGrowth(*, max_radius=1.0)

Dynamic step: grow each cell radius toward max_radius by a saturating (von Bertalanffy) law.

Writing \(k\) for the per-cell growth_rate and \(R\) for max_radius, the radius obeys

\[\frac{dr}{dt} = k \left(1 - \frac{r}{R}\right),\]

so growth is proportional to the remaining gap to the target size (not logistic): fastest at small r, relaxing to zero at max_radius, and positive from any birth size. growth_rate is read per cell from the state - a constant initial condition or an upstream controller's output - while max_radius is the module's asymptotic target size.

The increment applied over a step dt is the exact flow of this linear law, not forward Euler:

\[\Delta r = (R - r) \left(1 - e^{-k\,\Delta t / R}\right),\]

which is unconditionally stable and monotone for any dt and any growth_rate >= 0.

Attributes:

  • max_radius

    Asymptotic cell radius. A scalar jax.Array is optimizable. Defaults to 1.0.

Parameters:

  • max_radius

    Asymptotic cell radius. Defaults to 1.0.

state_reads #

state_reads()

Reads the current radius and the per-cell growth rate.

state_writes #

state_writes()

Writes the radius increment (a dynamic delta).