Skip to content

🗃️ Read .evolve run files directly instead of Evolve exports - #9

Merged
maxded merged 2 commits into
mainfrom
update-export-format
Nov 9, 2026
Merged

maxded merged 2 commits into
mainfrom
update-export-format

Conversation

@maxded

@maxded maxded commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

Evolve Charts read Evolve's exports: the Export zip, the CSVs and deep_analysis.json. Since Evolve records runs as datakit files (https://github.com/Traverse-Research/evolve/pull/3228), the per-frame sensor fields in deep_analysis.json were renamed, so every sensor chart for a new export came out empty. The pass-to-workload catalog was also stale (https://github.com/Traverse-Research/evolve/pull/3072, https://github.com/Traverse-Research/evolve/pull/3320).

Evolve already saves every run as a .evolve file with all measurements in Parquet tables, so exporting was an extra step that also produced a 25× larger file.

Changes

  • Read .evolve files directly (loader.py): the zip's Parquet tables are read with pyarrow, and the tool no longer accepts the Export zip, CSVs or deep_analysis.json.
    • Per-frame workload times come from the frames table, passes from gpu_scopes, sensors from metrics (each frame takes the latest sample, like Evolve's exports) and system info from the client_data document.
    • Pass nesting and totals are now computed with vectorized pandas instead of a Python loop over the JSON.
    • Code that only existed for exports is gone: one .evolve file is one run, so the loop column and loop averaging are dropped, the per-frame and sensor tables are always present, and result cards no longer list "Per frame".
  • Calculate scores the way Evolve does (scores.py): .evolve files hold the measurements, not the scores. GPU, Driver, Energy and image quality scores are ported from evolve-datakit-scores, including Rust's f32 maths so the integers match.
  • Generate the score calibration from Evolve's source (tools/sync_scores.py → score_catalog.py): the multipliers per benchmark and platform, the score names, and the phone Driver multipliers for runs before 17.0 are all read from score.rs.
  • Fix the pass catalog generator (tools/sync_categories.py):
    • A single-line vec![...] arm silently swallowed the next arm, which had emptied the list of uncategorized passes.
    • Renamed passes from pipelines_list_deprecated are now included, which Evolve also counts, so older runs stay comparable (e.g. channel_animation).
    • The generator writes LF line endings.
    • Regenerated scope_catalog.py from current Evolve.
  • UI and docs:
    • The upload box takes .evolve files, and the auto-load folder is now results/ instead of exports/.
    • "Deep analysis" is now "Passes".
    • Result cards show the benchmark, and the tool warns when comparing different benchmarks.
    • README and the download's instructions are updated.
    • The Android guide and run_on_android.py now pull the .evolve files from files/Documents/results instead of CLI exports.
  • Dependencies: pyarrow is now declared explicitly. It was already installed through Streamlit, so the locked versions don't change.

Evidence

A debug ray-tracing-inline run at 4x speed (RTX 4070 Ti, driver 621.14, Windows 11, DX12, Evolve 17.0), loaded both from its .evolve file with this branch and from its CLI exports with the previous JSON/CSV loader:

.evolve (this PR) Exports (previous loader)
Scores RT 6999 · AS 8325 · Raster 5183 · Compute 5752 · Driver 3102 · Energy 5231 identical (Evolve's own scores.csv)
Per-frame workload times, 3,361 frames identical
Pass rows (ms and non-nested ms), 314,402 identical
Frame GPU sum/span/left out, sensors identical
Input size 4.3 MB 107 MB deep_analysis.json
Load time 0.57 s 1.66 s

On the same run, main's loader read no sensor values from deep_analysis.json (0 of 3,361 frames). Every page of the app renders charts from the .evolve file without errors.

🤖 Generated with Claude Code

Evolve Charts now reads the datakit Parquet tables in the .evolve file
Evolve saves for every run, and calculates the scores the way Evolve
does, with multipliers generated from score.rs by tools/sync_scores.py.
The Export zip, CSV and deep analysis JSON inputs are gone.

sync_categories.py no longer swallows the arm after a single-line
vec![...], includes Evolve's deprecated pass names, and writes LF.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@maxded maxded added bug Something isn't working enhancement New feature or request labels Nov 9, 2026
One .evolve file is one run with every table, so the loop column, the
optional per-frame tables and the Per frame card entry go. The Android
guide and script now pull the .evolve files instead of CLI exports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@maxded
maxded merged commit f39310c into main Nov 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant