You are browsing as a guest. Sign up (or log in) to start making projects!

20m logged

D-LOG #2
(Based on work from the past month, was on vaca sorry for taking forever)


Build: ATLASV3.3(L)


Biggest changes:


Full luminance curve pre-pass
Instead of just thresholding each frame’s brightness individually, the script now buckets every image into 5-minute slots, builds a brightness curve across the entire dataset, and derives actual sunrise/sunset intervals from where the curve crosses DAY_THRESHOLD (20.0). There’s also a MIN_DAY_DURATION floor (1 hour) so a passing cloud or a lens flare can’t fake a fake “day.” Anything outside a real daylight window gets logged as NIGHT_CURVE_SKIPPED and skipped before the VLM even sees it saves a ton of compute on a big folder.


Results get merged:


Shadow angle -> circular mean across models, flagged DISAGREE if spread > 45°
Shadow length / density / rock texture / volcanic features -> majority vote
Plant types / rock colors -> unioned into one combined list


Latitude derivation


Previous versions only estimated longitude. v3.3 adds a day-length-based latitude calc, it finds the longest daylight interval in the dataset, converts that duration into a sunset hour angle, and solves for latitude using solar declination for the day of year.


Search area validation


Both derived coordinates now get checked against a Haversine distance from a defined SEARCH_CENTER / SEARCH_RADIUS_KM, with a clean ✅ / ❌ status line and a fallback bounding box printed if the point lands outside the circle.


Habitat classifier got smarter


HABITAT_RULES is now a proper rule list -> each biome match is a lambda checking keyword hits across plant types, rock color, and vegetation density instead of a flat tally. Sonoran/Chihuahuan/Mojave/Colorado Plateau/Cascades/Sierra-Great Basin/High Desert/Mixed Conifer are all still in there, just with tighter matching logic.


Parser resilience


parse_field() handles models that randomly bold their output (SHADOW_ANGLE: etc.) and normalizes stray ° symbols and none/n/a/null variants down to “unknown” so downstream math doesn’t choke on garbage strings.


Known issue, flagging this for myself before I forget


The longitude calc in main() is currently hardcoded, not pulling from the actual solar_noon_avg computed earlier in the run:
day_of_year = 138 # May 18th
eot = 3.65 # Verified EoT for Day 1
noon_secs = 84495 # Verified 23:28:15 UTC trajectory


That’s leftover from debugging against the sample dataset, it means every run right now spits out the same longitude regardless of what images you actually feed it, which is obviously not the goal. Latitude is properly dynamic (built off intervals from the real daylight curve), longitude isn’t yet. Top priority fix for the next patch, need to swap those three constants for the real per-dataset solar_noon_avg / Julian day / EoT calc instead of the frozen debug values.


Next up


Wire the real solar_noon_avg (already computed in compute_solar_noon()) into the longitude block instead of the hardcoded Day 1 constants
Maybe expand HABITAT_RULES matching beyond simple keyword hits, closer to weighted scoring


Look into whether internvl2_5-4b is pulling its weight in the ensemble or just adding runtime for marginal disagreement value

1
7

Comments 0

No comments yet. Be the first!