feat(evals): pointcloud comprehension suite over a go2 office replay - #4075
feat(evals): pointcloud comprehension suite over a go2 office replay#4075spomichter wants to merge 2 commits into
Conversation
five hand-labelled questions (room counts, doorways, occupancy, size compare) against the final global_map frame + odom path. brings over PointCloud2.agent_encode so the map is legible to the model on main. dataset (3mb slice) in lfs as go2_office_pc.db.
|
| n = int(pts.shape[0]) | ||
| out: dict[str, object] = { | ||
| "frame_id": self.frame_id, |
There was a problem hiding this comment.
A point cloud containing a non-finite XYZ return can break agent_encode(). PointCloud2 construction and the ROS/WebRTC decoding paths preserve NaN and infinity values, but the raster calculation passes them through min/max, floor, integer conversion, and array indexing. Invalid lidar returns can therefore crash the encoding instead of producing an agent observation. Filter non-finite rows before calculating the encoding.
| grade=lambda o: within(1.0)(2.0, first_number(o.trajectory.final_answer)), | ||
| tags=frozenset({"pointcloud", "count"}), | ||
| ), | ||
| EvalCase( | ||
| id="pc_rooms_passed", | ||
| inputs=( | ||
| "How many distinct rooms did you walk past or into in total? " | ||
| "Answer with just the number." | ||
| ), | ||
| environment=_env(), | ||
| grade=lambda o: within(1.0)(3.0, first_number(o.trajectory.final_answer)), | ||
| tags=frozenset({"pointcloud", "count"}), | ||
| ), | ||
| EvalCase( | ||
| id="pc_open_doorways", | ||
| inputs=( | ||
| "How many open doorways did you see? The building has only standard " | ||
| "residential-width doors. Answer with just the number." | ||
| ), | ||
| environment=_env(), | ||
| grade=lambda o: within(1.0)(4.0, first_number(o.trajectory.final_answer)), |
There was a problem hiding this comment.
The three count graders use within(1.0), so an integer answer exactly one away from the expected count receives zero credit. This conflicts with the documented off-by-one partial-credit policy and makes the count cases effectively exact-match for integer responses, distorting the suite's reported mean score. This is non-blocking for runtime behavior, but use a tolerance greater than one or otherwise implement the stated policy.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Artifacts
- Authored and executed Python harness that invokes each supplied count grader with integer answers one below and one above its expected count, showing the tested grading scope.
- Successful execution capture of all six one-away integer grading cases, each scoring 0.0, showing no off-by-one partial credit.
- Second successful execution capture at the identical scope, again showing all six one-away integer grading cases score 0.0.
❌ 1 Tests Failed:
View the top 1 failed test(s) by shortest run time
View the full list of 7 ❄️ flaky test(s)
To view more test analytics, go to the Test Analytics Dashboard |
Problem
hidden eval for @hvent90 milestone tomorrow
Solution
dimos.evals.suites.pointcloud_office— 5 hand-labelled cases against thego2_office_pcrecording. the agent sees the finalglobal_mapframe (viaPointCloud2.agent_encode) plus the odom path.PointCloud2.agent_encode(+ tests) so the map is legible to the model on main.go2_office_pc.db.questions + ground truth:
Breaking Changes
None
How to Test
one line (checkout pulls the LFS dataset, then run):
baseline so far: question_answer scores 0.20 (1/5) with gpt-5.6-luna and does not beat the blind ablation (0.25) — the geometric encoding isnt giving the model usable signal for these semantic room questions yet. that gap is the point.
run it blind to confirm guessability:
Contributor License Agreement