Skip to content

Commit e5fd91d

Browse files
committed
phase 2 changes
1 parent 81f4d2f commit e5fd91d

3 files changed

Lines changed: 50 additions & 42 deletions

File tree

docs/HPC_GUIDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ watch -n 10 "ls -1 results_JOBID | wc -l"
4747
4848
# Fetching the results once the job is done
4949
50-
scp -r kanagnostopoul@snellius.surf.nl:~/CSS_Project/results/phase1_JOBID/ ./results/
50+
scp -r kanagnostopoul@snellius.surf.nl:~/CSS_Project/results/phase1_18680757/ ./results/
5151
```
5252

5353
The jobscript template can be found in ```run_analysis.sh``` (default rome paritition).

models/config.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ class Config:
8383
critical_prey_death: float = 0.04 # FIXME; Change after obtaining results
8484

8585
# Prey parameter sweep (Phase 1)
86-
prey_birth_range: Tuple[float, float] = (0.10, 0.35)
87-
prey_death_range: Tuple[float, float] = (0.0, 0.20)
86+
prey_death_range: Tuple[float, float] = (0.0, 0.2)
8887
n_prey_birth: int = 15 # FIXME: Decide number of grid points along prey axes
8988
n_prey_death: int = 20
9089

@@ -105,7 +104,7 @@ class Config:
105104
# Evo
106105
with_evolution: bool = False
107106
evolve_sd: float = 0.10
108-
evolve_min: float = 0.001
107+
evolve_min: float = 0.0
109108
evolve_max: float = 0.10
110109

111110
# Sensitivity: mutation strength values to test
@@ -216,7 +215,7 @@ def estimate_runtime(self, n_cores: int = 32) -> str:
216215
# Evolution settings
217216
with_evolution=True,
218217
evolve_sd=0.01, # Smaller mutation rate for smoother convergence
219-
evolve_min=0.001,
218+
evolve_min=0.0,
220219
evolve_max=0.20, # Allow full range
221220

222221
collect_pcf=False,

scripts/experiments.py

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,11 @@ def run_single_simulation(
188188
warmup_steps = cfg.get_warmup_steps(grid_size)
189189
measurement_steps = cfg.get_measurement_steps(grid_size)
190190

191+
191192
# Warmup phase
192193
for _ in range(warmup_steps):
193194
model.update()
194195

195-
196-
# FIXME: Remove the two lines below after phase 2.
197196
if with_evolution:
198197
model._evolution_stopped = True
199198

@@ -219,7 +218,30 @@ def run_single_simulation(
219218
if with_evolution:
220219
stats = get_evolved_stats(model, "prey_death")
221220
evolved_means.append(stats["mean"])
222-
evolved_stds.append(stats["std"])
221+
evolved_stds.append(stats["std"])
222+
223+
# Cluster analysis (at end of measurement)
224+
if step == measurement_steps - 1:
225+
prey_survived = prey_pops[-1] > min_count
226+
pred_survived = pred_pops[-1] > (min_count // 4)
227+
228+
if prey_survived:
229+
prey_stats = get_cluster_stats_fast(model.grid, 1)
230+
cluster_sizes_prey = prey_stats['sizes'].tolist()
231+
largest_fractions_prey.append(prey_stats['largest_fraction'])
232+
233+
if pred_survived:
234+
pred_stats = get_cluster_stats_fast(model.grid, 2)
235+
cluster_sizes_pred = pred_stats['sizes'].tolist()
236+
largest_fractions_pred.append(pred_stats['largest_fraction'])
237+
238+
# PCF requires both
239+
if compute_pcf and prey_survived and pred_survived:
240+
max_dist = min(grid_size / 2, cfg.pcf_max_distance)
241+
pcf_data = compute_all_pcfs_fast(model.grid, max_dist, cfg.pcf_n_bins)
242+
pcf_samples['prey_prey'].append(pcf_data['prey_prey'])
243+
pcf_samples['pred_pred'].append(pcf_data['pred_pred'])
244+
pcf_samples['prey_pred'].append(pcf_data['prey_pred'])
223245

224246
# Compile results
225247
result = {
@@ -375,45 +397,36 @@ def run_phase2(cfg: Config, output_dir: Path, logger: logging.Logger) -> List[Di
375397
"""
376398
Phase 2: Self-organization analysis.
377399
378-
SOC Hypothesis: When prey_death is allowed to evolve, the population
379-
should self-organize toward the critical point (~0.095-0.105 from Phase 1)
380-
regardless of initial prey_death value.
400+
SOC Hypothesis: Prey evolve toward critical critical point regardless of initial conditions.
381401
382-
Test: Start evolution from different initial prey_death values.
383-
If SOC holds, all runs converge to similar final evolved_prey_death.
402+
NOTE: Test is currently start evo from different intial prey_death values (?)
403+
If SOC holds, then all runs converge to the same final prey_death near critical point.
404+
405+
FIXME: This run script needs to be adjusted
384406
"""
385407
from joblib import Parallel, delayed
386408

387409
warmup_numba_kernels(cfg.grid_size, directed_hunting=cfg.directed_hunting)
388410

389-
# Vary initial prey_death across subcritical to supercritical range
390-
# Based on Phase 1: critical point ~0.095-0.105
391-
initial_prey_deaths = np.array([0.02, 0.04, 0.06, 0.08, 0.10, 0.12])
411+
# Test at multiple prey_birth values
412+
prey_births = cfg.get_prey_births()
413+
414+
# Vary intial prey_death
415+
initial_prey_deaths = np.linspace(cfg.prey_death_range[0], cfg.prey_death_range[1], 20)
392416

393417
jobs = []
394-
for initial_pd in initial_prey_deaths:
395-
for rep in range(cfg.n_replicates):
396-
params = {"initial_pd": initial_pd, "phase": 2}
397-
seed = generate_unique_seed(params, rep)
398-
399-
# Fixed prey_birth, varying initial prey_death, evolution ON
400-
jobs.append((
401-
cfg.prey_birth, # prey_birth (fixed at 0.2)
402-
initial_pd, # prey_death (initial value, will evolve)
403-
cfg.predator_birth, # predator_birth (fixed)
404-
cfg.predator_death, # predator_death (fixed)
405-
cfg.grid_size,
406-
seed,
407-
cfg,
408-
True # with_evolution=True
409-
))
410-
418+
for pb in prey_births:
419+
for initial_pd in initial_prey_deaths:
420+
for rep in range(cfg.n_replicates):
421+
params = {"pb": pb, "initial_pd": initial_pd, "phase": 2}
422+
seed = generate_unique_seed(params, rep)
423+
jobs.append((pb, initial_pd, cfg.predator_birth, cfg.predator_death,
424+
cfg.grid_size, seed, cfg, True))
411425

412426
logger.info(f"Phase 2: {len(jobs):,} simulations")
413-
logger.info(f" Initial prey_death values: {initial_prey_deaths.tolist()}")
414-
logger.info(f" Replicates per condition: {cfg.n_replicates}")
415-
logger.info(f" Evolution: ENABLED (sd={cfg.evolve_sd})")
416-
logger.info(f" Expected convergence: ~0.095-0.105 (critical point)")
427+
logger.info(f" prey_birth values: {len(prey_births)}")
428+
logger.info(f" initial prey_death values: {len(initial_prey_deaths)}")
429+
logger.info(f" Replicates: {cfg.n_replicates}")
417430

418431
output_jsonl = output_dir / "phase2_results.jsonl"
419432
all_results = []
@@ -429,13 +442,9 @@ def run_phase2(cfg: Config, output_dir: Path, logger: logging.Logger) -> List[Di
429442

430443
meta = {
431444
"phase": 2,
432-
"description": "Self-organization toward criticality (SOC test)",
445+
"description": "Self-organization toward criticality",
433446
"n_sims": len(all_results),
434447
"initial_prey_deaths": initial_prey_deaths.tolist(),
435-
"prey_birth": cfg.prey_birth,
436-
"evolve_sd": cfg.evolve_sd,
437-
"measurement_steps": cfg.measurement_steps,
438-
"expected_convergence": "~0.095-0.105",
439448
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
440449
}
441450
with open(output_dir / "phase2_metadata.json", "w") as f:

0 commit comments

Comments
 (0)