feat(simulation): cache TerrainAnalysis + derive basin_direction from the D8 thalweg (T-1044, T-1047)
T-1044: run_layer1 now returns TerrainAnalysis (carried transiently on CascadeSnapshot, dropped after the district + road-graph passes), eliminating the redundant per-body drainage::analyze + TerrainAnalysis::analyze re-run flagged by PERF/TODO(T-1044). Not persisted on the LRU-cached state (D-203/T-1048 size concern). T-1047: basin_direction is now derived from the real D8 thalweg. run_layer1 aggregates a per-district dominant D8 direction from the live fdir grid (carried transiently on DrainageResult), threaded via Layer1Output.district_basin_dirs -> derive_all_districts -> DistrictProfile.basin_direction; derive_chunk_context reads it directly. Removed the false derive_basin_direction (it branched on ocean_fraction_q then read seed bits despite a doc comment claiming an elev_q/slope_q D8 proxy) + corrected the module contract. D-239 §8 (D8 thalweg) now actually honoured. 1559 tests pass; golden byte-identical (district_basin_dirs is #[serde(skip)], transient). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -47,7 +47,8 @@ fn main() {
|
||||
};
|
||||
|
||||
// Warm-up + output characterization.
|
||||
let o = run_layer1(&hm);
|
||||
// run_layer1 now returns (Layer1Output, TerrainAnalysis) — destructure (T-1044).
|
||||
let (o, _ta) = run_layer1(&hm);
|
||||
let mut by_type: std::collections::BTreeMap<String, usize> = std::collections::BTreeMap::new();
|
||||
for a in &o.attractors {
|
||||
*by_type
|
||||
@@ -92,7 +93,7 @@ fn main() {
|
||||
|
||||
let t = Instant::now();
|
||||
let out = run_layer1(&hm);
|
||||
std::hint::black_box(&out);
|
||||
std::hint::black_box(&out.0);
|
||||
t_total.push(t.elapsed().as_secs_f64() * 1000.0);
|
||||
}
|
||||
println!("\n=== phase breakdown (median of {n}, 512×256, release) ===");
|
||||
|
||||
Reference in New Issue
Block a user