Particle Life
cax.cs.particle_life.cs.ParticleLife
Bases: ComplexSystem
Particle Life class.
Source code in src/cax/cs/particle_life/cs.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | |
__init__(num_classes, *, dt=0.01, force_factor=1.0, velocity_half_life=0.01, r_max=0.15, beta=0.3, A)
Initialize Particle Life.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
num_classes
|
int
|
Number of distinct particle types (classes). Each type can have different interactions with other types as specified in the attraction matrix. |
required |
dt
|
float
|
Time step of the simulation in arbitrary time units. Smaller values produce smoother motion but require more steps for the same duration. |
0.01
|
force_factor
|
float
|
Global scaling factor for all interaction forces. Higher values create stronger, more dynamic interactions. |
1.0
|
velocity_half_life
|
float
|
Time constant for velocity decay due to friction. After this time, velocity is halved without force input. Smaller values create more damped, viscous dynamics. |
0.01
|
r_max
|
float
|
Maximum interaction distance in coordinate space [0, 1]. Particles beyond this distance do not interact. Larger values increase computation cost. |
0.15
|
beta
|
float
|
Distance threshold parameter controlling the transition from repulsion to attraction. Typically in range [0, 1], where smaller values create stronger short-range repulsion. |
0.3
|
A
|
Array
|
Attraction matrix of shape (num_classes, num_classes) where A[i, j] defines the attraction strength from type i to type j. Positive values attract, negative values repel. Values typically range from -1 to 1. |
required |
Source code in src/cax/cs/particle_life/cs.py
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | |
render(state, *, resolution=512, particle_radius=0.005)
Render state to RGB image.
Renders particles as colored circles on a black background. Each particle type (class) is assigned a distinct hue from the color spectrum, with colors evenly distributed across the HSV color space. Particles are drawn with smooth anti-aliased edges based on their distance from pixel centers. The visualization uses 2D coordinates in the range [0, 1].
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state
|
ParticleLifeState
|
ParticleLifeState containing class_, position, and velocity arrays. Position should have shape (num_particles, 2) with coordinates in [0, 1]. Class array determines the color of each particle. |
required |
resolution
|
int
|
Size of the output image in pixels for both width and height. Higher values produce smoother, more detailed renderings. |
512
|
particle_radius
|
float
|
Radius of each particle in coordinate space [0, 1]. Particles appear as smooth circles with this radius. Larger values make particles more visible but may cause overlap. |
0.005
|
Returns:
| Type | Description |
|---|---|
Array
|
RGB image with dtype uint8 and shape (resolution, resolution, 3), where particles appear as colored circles on a black background, with colors determined by particle type. |
Source code in src/cax/cs/particle_life/cs.py
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | |
__call__(state, input=None, *, num_steps=1, input_in_axis=None, sow=False)
Step the system for multiple time steps.
This method wraps _step inside a JAX scan for efficiency and JIT-compiles the loop.
If input is time-varying, set input_in_axis to the axis containing the time
dimension so that each step receives the corresponding slice of input.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state
|
State
|
Current state. |
required |
input
|
Input | None
|
Optional input. |
None
|
num_steps
|
int
|
Number of steps. |
1
|
input_in_axis
|
int | None
|
Axis for input if provided for each step. |
None
|
sow
|
bool
|
Whether to sow intermediate values. |
False
|
Returns:
| Type | Description |
|---|---|
State
|
Final state after |
Source code in src/cax/core/cs.py
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | |