Prafull Ahire

Create your portfolio with ProoVCreate your portfolio with ProoV
ProoV
DE Verified work portfolio

ProoV Portfolio

Prafull Ahire

Electronics and Telecommunication Engineering · University of Mumbai

View the ProoV leaderboard

Projects

Certified

Self-directed project

Amazon Robotics - Black-Friday Fleet Coordination

Software Engineering · July 2026

96/ 100

Built a full warehouse fleet-coordination solution for Black Friday surge conditions: framed the bottleneck as aisle congestion and dock contention, implemented A* for single-robot routing, then extended it to centralized cooperative A* with vertex and edge reservations to prevent collisions. Validated the policy in simulation with zero collisions and deadlocks, selected staggered charging plus dispersed idle parking, and packaged the result into an executive-ready pilot recommendation.

Graded against

  • Problem framing & operational stakes20%
  • Algorithmic depth - A* and cooperative coordination30%
  • Coordination policy realism - deadlock, charging, idle25%
  • Throughput trade-off analysis15%
  • Executive pitch to leadership10%

Passed · pass mark 55/100

What stood out6
  • Implemented A* with Manhattan heuristic and showed it outperforming Dijkstra in node expansions
  • Built a reservation table that blocks both vertex conflicts and head-on edge swaps
  • Chose a realistic fleet policy: priority-watchdog deadlock handling, staggered charging, and dispersed perimeter idle parking
  • Used simulator outputs to identify a concave throughput optimum at 35 robots and tied the capstone pitch to measurable operational metrics
  • Leakage-Free Feature Engineering
  • Honest Model Evaluation
The work I submitted12 tasks

Role And Mission

My solution
{"acknowledged":true,"zonesExplored":["pick","aisles","pack","charge"],"kpisShown":["speed","safety","throughput"]}

Amazon Robotics Context

My solution
{"viewedAt":"2026-07-17T15:04:01.047Z","timeline":["2003","2012","2015","2025"],"driveUnitStats":["110 kg","450 kg","5.5 km / h"],"disclaimerShown":true,"sourcesShown":true,"sources":["Amazon, Kiva Systems acquisition (2012)","About Amazon, one millionth robot (2025)","Published Kiva / Amazon drive-unit specifications","Statista, Amazon net sales by leading market (2024)","Amazon, Bad Hersfeld (FRA1) site","Wurman, D’Andrea & Mountz (2008), AI Magazine"]}

Program Overview

My solution
{"explored":["understand","plan-one","defend","coordinate-many","optimize"],"exploredCount":5,"activePhase":"optimize","totalPhases":5}

Grid World Theory

My solution
{"concept":"grid-world-model","connectivity":8,"gridSize":"20x20","viewedAt":"2026-07-17T15:06:09.157Z"}

State Representation Task

My solution
{"robots":[{"id":"R1","x":0,"y":0,"goal":{"x":9,"y":9},"battery":100},{"id":"R2","x":1,"y":0,"goal":{"x":8,"y":9},"battery":94},{"id":"R3","x":2,"y":0,"goal":{"x":7,"y":9},"battery":88},{"id":"R4","x":3,"y":0,"goal":{"x":6,"y":9},"battery":82},{"id":"R5","x":4,"y":0,"goal":{"x":5,"y":9},"battery":76}],"placedAt":"2026-07-17T15:13:48.644Z"}

Phase1 Recap

My solution
{"phase":1,"phaseTitle":"Grid-world modeling","takeaways":[{"id":"grid-of-typed-cells","title":"Warehouse = grid of typed cells"},{"id":"state-positions-goals-batteries","title":"State = positions + goals + batteries"},{"id":"collisions-vertex-and-edge","title":"Collisions = same cell OR same edge at the same tick"}],"skillAxisTicked":"Modeling"}

Astar Theory

My solution
{"heuristic":"manhattan","admissible":true,"viewed_comparison":true,"replays":0,"astar_expanded":32,"dijkstra_expanded":107}

State Representation Task Validator

My solution
{"code":"# Auto-validator: every robot needs a position AND a goal.\n# The planner refuses to schedule a robot whose state is incomplete.\nimport json\n\nstate = json.loads(r\"\"\"{\n  \"robots\": [\n    {\n      \"id\": \"R1\",\n      \"x\": 0,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 9,\n        \"y\": 9\n      },\n      \"battery\": 100\n    },\n    {\n      \"id\": \"R2\",\n      \"x\": 1,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 8,\n        \"y\": 9\n      },\n      \"battery\": 94\n    },\n    {\n      \"id\": \"R3\",\n      \"x\": 2,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 7,\n        \"y\": 9\n      },\n      \"battery\": 88\n    },\n    {\n      \"id\": \"R4\",\n      \"x\": 3,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 6,\n        \"y\": 9\n      },\n      \"battery\": 82\n    },\n    {\n      \"id\": \"R5\",\n      \"x\": 4,\n      \"y\": 0,\n      \"goal\": {\n        \"x\": 5,\n        \"y\": 9\n      },\n      \"battery\": 76\n    }\n  ]\n}\"\"\")\n\ndef validate(state):\n    bots = state.get('robots', [])\n    issues = []\n    for b in bots:\n        if b.get('x') is None or b.get('y') is None:\n            issues.append(f\"robot {b['id']} has no position\")\n        if not b.get('goal') or b['goal'].get('x') is None:\n            issues.append(f\"robot {b['id']} has no goal\")\n    return issues\n\nissues = validate(state)\nif issues:\n    print(\"INCOMPLETE STATE\")\n    for line in issues:\n        print(\" -\", line)\nelse:\n    print(f\"OK, {len(state['robots'])} robots, each with position + goal.\")\n    print('Planner can schedule this state.')\n","stdout":"OK, 5 robots, each with position + goal.\nPlanner can schedule this state.\n","stderr":"","error":null,"imageCount":0,"durationMs":12,"ranAt":"2026-07-17T15:26:43.324Z"}

Astar Implementation Cell

My solution
{"code":"# A* path planning for one warehouse drive-unit.\n# Complete the three TODOs and click \"Run cell\" to replay your A* on the\n# 15x15 fixture grid on the right.\n#\n# The grid is a list of rows: 0 = free aisle, 1 = rack obstacle.\n# Robots move 4-connected (up/down/left/right), no diagonals.\n\nimport heapq, json, time\n\nGRID  = __ASTAR_GRID__         # injected by the harness\nSTART = tuple(__ASTAR_START__) # (row, col)\nGOAL  = tuple(__ASTAR_GOAL__)  # (row, col)\nH, W  = len(GRID), len(GRID[0])\n\n\ndef h(cell, goal):\n    # Manhattan distance, admissible AND tight on a 4-connected grid.\n    (r1, c1), (r2, c2) = cell, goal\n    return abs(r1 - r2) + abs(c1 - c2)\n\n\ndef neighbours(cell):\n    r, c = cell\n    # 4-connected moves: up, down, left, right.\n    for dr, dc in [(-1, 0), (1, 0), (0, -1), (0, 1)]:\n        nr, nc = r + dr, c + dc\n        if 0 <= nr < H and 0 <= nc < W and GRID[nr][nc] == 0:\n            yield (nr, nc)\n\n\ndef reconstruct_path(came_from, current):\n    path = [current]\n    while current in came_from:\n        current = came_from[current]\n        path.append(current)\n    return list(reversed(path))\n\n\ndef a_star(start, goal):\n    # open_set holds (f_score, tiebreak, cell) tuples; heapq pops the smallest.\n    counter = 0\n    open_set = [(0, counter, start)]\n    came_from = {}\n    g_score = {start: 0}\n    closed = set()\n    visited_order = []\n    expansions = 0\n\n    while open_set:\n        _, _, current = heapq.heappop(open_set)\n\n        if current in closed:\n            continue\n\n        closed.add(current)\n        visited_order.append(current)\n        expansions += 1\n\n        if current == goal:\n            return reconstruct_path(came_from, current), visited_order, expansions\n\n        for nb in neighbours(current):\n            if nb in closed:\n                continue\n\n            tentative_g = g_score[current] + 1\n\n            if tentative_g < g_score.get(nb, float(\"inf\")):\n                came_from[nb] = current\n                g_score[nb] = tentative_g\n\n                # TODO 1: f-score = g + h\n                f = tentative_g + h(nb, goal)\n\n                # TODO 2: Tie-breaking\n                # Prefer nodes with smaller heuristic value.\n                counter += 1\n                tiebreak = (h(nb, goal), counter)\n\n                heapq.heappush(open_set, (f, tiebreak, nb))\n\n    return None, visited_order, expansions\n\n\nt0 = time.perf_counter()\npath, visited, expansions = a_star(START, GOAL)\nruntime_ms = (time.perf_counter() - t0) * 1000.0\n\n# TODO 3\n# neighbours() already filters out obstacles (GRID[r][c] == 1),\n# so no further changes are needed here.\n_ = list(neighbours(START))\n\n# Emit a single line of JSON the right-side visualiser parses to animate.\nprint(\"__ASTAR_RESULT__\" + json.dumps({\n    \"path\": path,\n    \"visited\": visited,\n    \"nodes_expanded\": expansions,\n    \"path_length\": 0 if path is None else len(path),\n    \"runtime_ms\": round(runtime_ms, 2),\n}))\n","passed":true,"reason":"Path is optimal and obstacle-free.","path_length":29,"nodes_expanded":31,"runtime_ms":7.7,"optimal_length":29,"attempt_count":1,"used_canonical":false,"ranAt":"2026-07-17T15:27:03.147Z"}

Astar Solution Correct

My solution
true

Single Unit Challenge

My solution
{"passed":true,"usedFallback":false,"usedHint":false,"runs":[{"maze":"Maze 1 · Open aisles","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":64,"runtime_ms":19.2},{"maze":"Maze 2 · Narrow corridors","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":61,"runtime_ms":17.1},{"maze":"Maze 3 · Dense racks","passed":true,"path_length":49,"optimal_length":49,"nodes_expanded":75,"runtime_ms":18.87}],"ranAt":"2026-07-17T15:28:18.485Z"}

Phase2 Recap

My solution
{"phase":2,"phaseTitle":"Single-agent A* search","takeaways":[{"id":"astar-equals-dijkstra-plus-admissible-heuristic","title":"A* = Dijkstra + admissible heuristic"},{"id":"manhattan-on-four-connected-grid","title":"Manhattan distance on 4-connected grids"},{"id":"optimal-and-faster-than-dijkstra","title":"Optimal AND faster than Dijkstra"}],"skillAxisTicked":"A* search"}
Verified certificateTamper-proof · issued by ProoV
Certified

Self-directed project

Machine Learning for Automotive Safety

Perception Validation Engineer (ADAS Safety Sign-off) · AI / ML · June 2026

84/ 100

A verified, self-directed Perception Validation Engineer (ADAS Safety Sign-off) project — completed and passed a real industry rubric at 84/100 on ProoV.

Graded against

  • Detection metrics correctness (precision, recall, VRU false-negative rate)30%
  • Failure-mode analysis & per-condition rigour25%
  • SOTIF safety case quality (ISO 21448 reasoning)25%
  • Ship verdict — evidence-based & internally consistent20%

Passed · pass mark 60/100

What stood out6
  • Correctly locked the detection definition at IoU >= 0.5 and computed the worked example IoU as 0.111, classifying it as a miss.
  • Computed and interpreted the key safety metric correctly: VRU recall 0.76 and VRU false-negative rate 0.236, rather than relying on headline accuracy.
  • Produced a strong condition-sliced analysis showing night recall collapse (0.39) and worst-case night+occluded recall (0.27).
  • Wrote an internally consistent GO-WITH-CONDITIONS verdict that cites the dossier's own numbers and ties the real Uber Tempe crash to the night-time pedestrian miss.
  • Data-Driven Decision Making
  • Statistical Analysis
The work I submitted12 tasks

Sensor Match

My solution
{"prompt":"Match each driving condition to its primary-strength sensor and the weak-link sensor that fails there","map":[{"condition":"Pitch-dark rural road","primaryStrength":"Lidar","weakLink":"Camera","correct":true},{"condition":"Dense fog on the motorway","primaryStrength":"Radar","weakLink":"Camera","correct":true},{"condition":"Child behind a parked van","primaryStrength":"Lidar","weakLink":"Occlusion","correct":true},{"condition":"Clear sunny highway","primaryStrength":"Camera","weakLink":"Radar","correct":true}],"passed":true,"attempt":1}

Task Definition

My solution
{"prompt":"Confirm the IoU threshold at 0.5, compute IoU for the borderline pair, and classify it as hit / miss / phantom; define a false negative as an unmatched real object","iouThreshold":0.5,"pairIoU":0.111,"classification":"miss","falseNegativeDefinition":"a real (ground-truth) object with no predicted box matched at IoU >= 0.5","cellRun":false,"passed":true,"attempt":2}

Example Iou Demo

My solution
{"checkpointId":"example_iou_demo","code":"# WORKED EXAMPLE: Intersection-over-Union for one clean box pair.\n# Boxes are [x1, y1, x2, y2] in pixels. (Next slide: you do this on a tougher pair.)\n\ngt   = [60, 50, 200, 150]   # ground-truth box: where the object really is\npred = [68, 56, 206, 156]   # the detector's predicted box (a near-perfect fit)\n\ndef iou(a, b):\n    # 1) the SHARED rectangle (intersection): the overlap of the two boxes\n    ix1, iy1 = max(a[0], b[0]), max(a[1], b[1])\n    ix2, iy2 = min(a[2], b[2]), min(a[3], b[3])\n    inter = max(0, ix2 - ix1) * max(0, iy2 - iy1)\n\n    # 2) the COMBINED area (union): both boxes together, counted once\n    area_a = (a[2] - a[0]) * (a[3] - a[1])\n    area_b = (b[2] - b[0]) * (b[3] - b[1])\n    union = area_a + area_b - inter\n\n    return inter / union, inter, union\n\nscore, inter, union = iou(gt, pred)\nTHRESHOLD = 0.5\nverdict = \"HIT  (counts as a detection)\" if score >= THRESHOLD else \"MISS (no match)\"\n\nprint(f\"shared area    = {inter:6.0f} px\")\nprint(f\"combined area  = {union:6.0f} px\")\nprint(f\"IoU            = {score:6.3f}   (shared / combined)\")\nprint(f\"threshold      = {THRESHOLD}\")\nprint(f\"VERDICT        = {verdict}\")","stdout":"shared area    =  12408 px\ncombined area  =  15392 px\nIoU            =  0.806   (shared / combined)\nthreshold      = 0.5\nVERDICT        = HIT  (counts as a detection)\n","stderr":"","error":null,"imageCount":0,"durationMs":8,"ranAt":"2026-06-16T17:57:36.546Z"}

Task Definition Code

My solution
{"checkpointId":"ttcs_iou_classify_run","code":"# Run IoU on this pair, read the number, then classify it (Section 1).\n# Boxes are [x1, y1, x2, y2] in pixels. The object is REAL, there is a ground-truth box.\n\ngt   = [60, 50, 200, 150]   # ground truth: a real object is here\npred = [150, 96, 280, 196]   # the detector's box for this frame\n\ndef iou(a, b):\n    ix1, iy1 = max(a[0], b[0]), max(a[1], b[1])\n    ix2, iy2 = min(a[2], b[2]), min(a[3], b[3])\n    inter = max(0, ix2 - ix1) * max(0, iy2 - iy1)\n    union = (a[2]-a[0])*(a[3]-a[1]) + (b[2]-b[0])*(b[3]-b[1]) - inter\n    return inter / union\n\nscore = iou(gt, pred)\nprint(f\"IoU = {score:.3f}\")\nprint(f\"threshold = 0.5  ->  {'matches' if score >= 0.5 else 'does NOT match'} a ground-truth box\")\nprint(\"So: a real object, no matching box. Your call on the next panel.\")","stdout":"IoU = 0.111\nthreshold = 0.5  ->  does NOT match a ground-truth box\nSo: a real object, no matching box. Your call on the next panel.\n","stderr":"","error":null,"imageCount":0,"durationMs":6,"ranAt":"2026-06-16T17:57:36.554Z"}

Example Metrics Demo

My solution
{"checkpointId":"example_metrics_demo","code":"# WORKED EXAMPLE: score a tiny 8-row detections-vs-ground-truth split.\n# (Next slide: you do this on the detector's full table.)\nimport pandas as pd\n\n# Each row = one scored object. outcome is:\n#   \"TP\" a real object the detector caught,\n#   \"FN\" a real object it MISSED (a false negative),\n#   \"FP\" a phantom box over empty road (a false positive).\ndemo = pd.DataFrame([\n    (\"Pedestrian\", \"TP\"),   # 3 real pedestrians, 2 caught, 1 missed\n    (\"Pedestrian\", \"TP\"),\n    (\"Pedestrian\", \"FN\"),\n    (\"Cyclist\",    \"TP\"),   # 2 real cyclists, 1 caught, 1 missed\n    (\"Cyclist\",    \"FN\"),\n    (\"Car\",        \"TP\"),   # 2 real cars, both caught\n    (\"Car\",        \"TP\"),\n    (\"Car\",        \"FP\"),   # 1 phantom car (braked for nothing)\n], columns=[\"obj_class\", \"outcome\"])\n\n# 1) Confusion counts over the whole split.\nTP = (demo.outcome == \"TP\").sum()\nFP = (demo.outcome == \"FP\").sum()\nFN = (demo.outcome == \"FN\").sum()\nprint(f\"TP = {TP}   FP = {FP}   FN = {FN}\")\n\n# 2) Precision = of everything flagged, how much was real.\nprecision = TP / (TP + FP)\n# 3) Recall = of everything really there, how much we caught.\nrecall = TP / (TP + FN)\nprint(f\"precision = TP/(TP+FP) = {TP}/{TP+FP} = {precision:.2f}\")\nprint(f\"recall    = TP/(TP+FN) = {TP}/{TP+FN} = {recall:.2f}\")\n\n# 4) The safety number: recall on vulnerable road users (pedestrians + cyclists),\n#    then the false-negative RATE = the share of real VRUs we MISSED.\nvru = demo[demo.obj_class.isin([\"Pedestrian\", \"Cyclist\"])]\nvru_TP = (vru.outcome == \"TP\").sum()\nvru_FN = (vru.outcome == \"FN\").sum()\nvru_recall  = vru_TP / (vru_TP + vru_FN)\nvru_fn_rate = 1 - vru_recall\nprint(f\"VRU recall  = {vru_TP}/{vru_TP+vru_FN} = {vru_recall:.2f}\")\nprint(f\"VRU FN-rate = 1 - VRU recall = {vru_fn_rate:.2f}   <- the safety number\")","stdout":"TP = 5   FP = 1   FN = 2\nprecision = TP/(TP+FP) = 5/6 = 0.83\nrecall    = TP/(TP+FN) = 5/7 = 0.71\nVRU recall  = 3/5 = 0.60\nVRU FN-rate = 1 - VRU recall = 0.40   <- the safety number\n","stderr":"","error":null,"imageCount":0,"durationMs":34,"ranAt":"2026-06-16T17:58:31.642Z"}

Scored Metrics Run

My solution
{"checkpointId":"ttcs_scored_metrics","code":"# Section 2: score the Aurora-7 detector on its detections table.\n# SYNTHETIC, illustrative detections-vs-ground-truth (no raw imagery, no model runs here;\n# proportions grounded in the published KITTI/nuScenes benchmarks).\n# Each row = one scored object, tagged with class + condition, with an outcome:\n#   \"TP\" caught,  \"FN\" a real object MISSED (false negative),  \"FP\" a phantom box.\nimport pandas as pd\n\n# Read the SAME scored detections table Act 3 slices by condition, so Section 2 and\n# Section 3 can never disagree. (Normalise two column names so the scoring below reads\n# cleanly: class -> obj_class, flag -> outcome.)\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\").rename(\n    columns={\"class\": \"obj_class\", \"flag\": \"outcome\"})\nprint(f\"scored objects in table: {len(df)}\")\n\ndef score(d, label):\n    TP = (d.outcome == \"TP\").sum()\n    FP = (d.outcome == \"FP\").sum()\n    FN = (d.outcome == \"FN\").sum()\n    precision = TP / (TP + FP)\n    recall    = TP / (TP + FN)\n    print(f\"{label:18s} TP={TP:4d} FP={FP:3d} FN={FN:3d}  \"\n          f\"precision={precision:.2f}  recall={recall:.2f}\")\n    return recall\n\n# 1) The whole table, the headline (aggregate) numbers.\nagg_recall = score(df, \"ALL (aggregate)\")\n\n# 2) Vulnerable road users only = pedestrians + cyclists. THIS is the safety subset.\nvru = df[df.obj_class.isin([\"Pedestrian\", \"Cyclist\"])]\nvru_recall = score(vru, \"VRU (Ped+Cyc)\")\n\n# 3) The safety number: VRU false-negative RATE = share of real VRUs MISSED.\nvru_fn_rate = 1 - vru_recall\nprint(\"-\" * 60)\nprint(f\"AGGREGATE recall (all classes) : {agg_recall:.2f}   <- looks reassuring\")\nprint(f\"VRU false-negative rate        : {vru_fn_rate:.2f}   <- the safety number\")","stdout":"scored objects in table: 991\nALL (aggregate)    TP= 822 FP= 41 FN=128  precision=0.95  recall=0.87\nVRU (Ped+Cyc)      TP= 392 FP= 35 FN=122  precision=0.92  recall=0.76\n------------------------------------------------------------\nAGGREGATE recall (all classes) : 0.87   <- looks reassuring\nVRU false-negative rate        : 0.24   <- the safety number\n","stderr":"","error":null,"imageCount":0,"durationMs":103,"ranAt":"2026-06-16T17:59:06.509Z"}

Scored Metrics

My solution
{"prompt":"Score the detector: read off precision, aggregate recall, and the VRU false-negative rate (the safety number)","aggregatePrecision":0.95,"aggregateRecall":0.87,"vruRecall":0.76,"vruFalseNegativeRate":0.236,"safetyNumber":"VRU false-negative rate","readOffBand":"20–30%","readOffCorrect":true,"scoringCellRan":true,"passed":true,"attempt":1}

Ttcs Example Slice

My solution
{"checkpointId":"ttcs_example_slice","code":"# Worked example: slice VRU recall by ONE condition (day vs night).\n# Same move you'll run for every condition next, just for one cut here.\nimport pandas as pd\n\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\")\n\n# Vulnerable road users = pedestrians + cyclists. Keep REAL objects only\n# (a TP was caught, an FN was a real person missed; phantoms are false positives).\nvru = df[df[\"class\"].isin([\"Pedestrian\", \"Cyclist\"])]\nreal = vru[vru[\"flag\"].isin([\"TP\", \"FN\"])]\n\ndef recall(rows):\n    tp = (rows[\"flag\"] == \"TP\").sum()\n    fn = (rows[\"flag\"] == \"FN\").sum()\n    return tp / (tp + fn)            # share of real VRUs the detector actually caught\n\nfor light in [\"day\", \"night\"]:\n    slice_ = real[real[\"lighting\"] == light]\n    r = recall(slice_)\n    print(f\"{light:>5}:  recall = {r:.2f}   ->  {(1-r)*100:4.0f}% of real VRUs missed\")\n\nprint()\nprint(f\"Both together:  recall = {recall(real):.2f}   (the reassuring average)\")","stdout":"  day:  recall = 0.85   ->    15% of real VRUs missed\nnight:  recall = 0.39   ->    61% of real VRUs missed\n\nBoth together:  recall = 0.76   (the reassuring average)\n","stderr":"","error":null,"imageCount":0,"durationMs":122,"ranAt":"2026-06-16T18:00:05.605Z"}

Ttcs Triage Slice

My solution
{"checkpointId":"ttcs_triage_slice","code":"# Section 3: slice VRU recall over EVERY condition in the table.\nimport pandas as pd\n\ndf = pd.read_csv(\"aurora7_detections_kitti.csv\")\nreal = df[(df[\"class\"].isin([\"Pedestrian\", \"Cyclist\"])) & (df[\"flag\"].isin([\"TP\", \"FN\"]))]\n\ndef recall(rows):\n    tp = (rows[\"flag\"] == \"TP\").sum(); fn = (rows[\"flag\"] == \"FN\").sum()\n    return tp / (tp + fn) if (tp + fn) else float(\"nan\")\n\nprint(f\"All conditions (the average):  {recall(real):.2f}\\n\")\nprint(\"By condition  ->  recall   (% of real VRUs missed)\")\nfor col, vals in [(\"lighting\", [\"day\", \"night\"]),\n                  (\"visibility\", [\"clear\", \"occluded\"]),\n                  (\"rarity\", [\"common\", \"rare\"])]:\n    for v in vals:\n        s = real[real[col] == v]\n        r = recall(s)\n        print(f\"  {v:<10} {r:.2f}     {(1-r)*100:4.0f}% missed\")\n\nworst = real[(real[\"lighting\"] == \"night\") & (real[\"visibility\"] == \"occluded\")]\nprint(f\"\\nWorst slice (night + occluded): {recall(worst):.2f}   \"\n      f\"{(1-recall(worst))*100:.0f}% of those people missed\")","stdout":"All conditions (the average):  0.76\n\nBy condition  ->  recall   (% of real VRUs missed)\n  day        0.85       15% missed\n  night      0.39       61% missed\n  clear      0.83       17% missed\n  occluded   0.45       55% missed\n  common     0.79       21% missed\n  rare       0.66       34% missed\n\nWorst slice (night + occluded): 0.27   73% of those people missed\n","stderr":"","error":null,"imageCount":0,"durationMs":256,"ranAt":"2026-06-16T18:07:08.521Z"}

Failure Triage

My solution
{"prompt":"Slice VRU recall per condition, then triage the failure modes by (condition likelihood x miss impact); do not bury a rare-but-catastrophic VRU miss in green","aggregateVruRecall":0.76,"perConditionRecall":[{"condition":"Daylight","recall":0.85},{"condition":"Clear","recall":0.83},{"condition":"Common class","recall":0.79},{"condition":"Rare class (cyclist)","recall":0.66},{"condition":"Occluded","recall":0.45},{"condition":"Night","recall":0.39},{"condition":"Night + occluded","recall":0.27}],"worstCondition":"Night + occluded","worstConditionRecall":0.27,"triage":[{"failureMode":"Night-time pedestrian miss","recallSlice":"night 0.39","likelihood":"Common","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Occluded child at night","recallSlice":"night+occluded 0.27","likelihood":"Occasional","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Rare-class cyclist miss","recallSlice":"rare 0.66","likelihood":"Rare","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Occluded pedestrian (daytime)","recallSlice":"occluded 0.45","likelihood":"Common","impact":"Catastrophic","severityBand":"red"},{"failureMode":"Night glare phantom brake","recallSlice":"precision dip","likelihood":"Occasional","impact":"Serious","severityBand":"amber"},{"failureMode":"Clear-daylight car miss","recallSlice":"day 0.99","likelihood":"Common","impact":"Serious","severityBand":"red"},{"failureMode":"Dusk / low-sun pedestrian","recallSlice":"transition","likelihood":"Common","impact":"Catastrophic","severityBand":"red"}],"topBandFailureModes":["Night-time pedestrian miss","Occluded child at night","Rare-class cyclist miss","Occluded pedestrian (daytime)","Night glare phantom brake","Clear-daylight car miss","Dusk / low-sun pedestrian"],"passed":false,"attempt":2}

Sotif Case

My solution
{"prompt":"For each top failure mode write one ISO 21448 SOTIF chain (triggering condition -> functional insufficiency -> hazardous behaviour -> concrete mitigation); a vague mitigation or a SOTIF gap framed as a fault fails","rows":[{"failureMode":"Occluded child at night","triggeringCondition":"A small Vulnerable Road User (VRU) stepping out from behind a solid, opaque object (like a parked van) in a low-light environment.","functionalInsufficiency":"Sensors cannot violate physics; neither Camera, Lidar, nor Radar can see through solid metal. In the dark, the camera lacks the pixel contrast for rapid classification. By the time the child breaks occlusion and enters the sensor's line of sight, the physical distance is too short for the perception pipeline to classify the object and trigger the brakes.","hazardousBehaviour":"The vehicle maintains speed and strikes the child without braking, or with severely delayed braking.","mitigation":"Implement a strict daylight cap on automated driving in environments with heavy roadside occlusion. If operating at night, trigger a driver-attention rule requiring the human to take manual control, or rely on a strict sensor-fusion fallback where the vehicle caps its speed to match the Lidar's maximum line-of-sight depth.","mitigationIsConcrete":true,"framedAsFault":false},{"failureMode":"Rare-class cyclist miss","triggeringCondition":"The presence of a cyclist on a physically irregular and geometrically complex road user operating in the vehicle's path.","functionalInsufficiency":"Class imbalance in the machine learning architecture. Because the neural network's training dataset was heavily dominated by standard cars and walking pedestrians, the model lacks the statistical confidence to consistently classify the less common silhouette of a human riding a bicycle, causing it to drop the bounding box.","hazardousBehaviour":"The perception system fails to flag the cyclist as a valid obstacle, the control system receives a \"clear road\" signal, and the vehicle strikes the cyclist at speed.","mitigation":"Halt the software release and mandate targeted data augmentation. The perception model must be quarantined and retrained using oversampled and synthetic cyclist data until the isolated \"cyclist class\" recall metric clears a hard safety threshold (e.g., matching the >0.85 daytime pedestrian recall) before the feature is allowed to ship to the fleet.","mitigationIsConcrete":true,"framedAsFault":false}],"mitigations":["Implement a strict daylight cap on automated driving in environments with heavy roadside occlusion. If operating at night, trigger a driver-attention rule requiring the human to take manual control, or rely on a strict sensor-fusion fallback where the vehicle caps its speed to match the Lidar's maximum line-of-sight depth.","Halt the software release and mandate targeted data augmentation. The perception model must be quarantined and retrained using oversampled and synthetic cyclist data until the isolated \"cyclist class\" recall metric clears a hard safety threshold (e.g., matching the >0.85 daytime pedestrian recall) before the feature is allowed to ship to the fleet."],"passed":true,"attempt":1}

Ship Verdict

My solution
{"prompt":"Write the GO / GO-WITH-CONDITIONS / NO-GO ship verdict, each of five fields citing its own dossier section number, internally consistent (no unconditional GO over an unmitigated night miss; no NO-GO if a daylight-restricted release is viable)","verdict":"CONDITIONS","fields":{"definition":"A valid detection requires a bounding box match of IoU ≥ 0.5. Any VRU without a matching box at this threshold is considered a false negative.","metrics":"Overall system performance shows a VRU recall of 0.76, which mathematically translates to a catastrophic FN-rate 24% across all combined conditions.","worst":"The system suffers a critical SOTIF failure during the worst slice: Night + occluded, where recall collapses to 0.27, missing over 70% of vulnerable targets.","mitigation":"Implement a strict daylight cap on automated braking, utilising a driver-attention rule or sensor-fusion fallback when operating outside of safe lighting parameters.","ask":"I recommend the board approve a feature release with a strict daylight-only cap. The system is safe for daytime deployment but must remain restricted until the nighttime perception collapse is resolved."},"citedSections":["Detection Definition","Metrics","Worst Failure Mode","Mitigation","The Ask"],"internallyConsistent":true,"passed":true,"attempt":1}
Verified certificateTamper-proof · issued by ProoV
Certified

Self-directed project

Machine Learning for Automotive

AI / ML · June 2026

84/ 100

A verified, self-directed industry project — completed and passed a real industry rubric at 84/100 on ProoV.

Graded against

  • Exploratory Data Analysis20%
  • Feature Engineering25%
  • Model Building & Evaluation35%
  • Business Communication20%

Passed · pass mark 60/100

What stood out6
  • Combined VW and Audi data correctly with a brand indicator and explored cross-brand pricing differences.
  • Identified key pricing drivers such as age, mileage per year, and brand premium in the business summary.
  • Produced a clear executive-style recommendation tied to operational workflow and financial impact.
  • Exploratory Data Analysis
  • Feature Engineering
  • Model Evaluation
The work I submitted5 tasks

VW Sprint1 Complete

My solution
{"completed":true,"notebookName":"vw_sprint1_eda.ipynb"}

VW Sprint2 Complete

My solution
{"completed":true,"notebookName":"vw_sprint2_features.ipynb"}

VW Sprint3 Complete

My solution
{"completed":true,"notebookName":"vw_sprint3_models.ipynb"}

VW Business Insights

My solution
{"text":"To: VP of Used Car Sales\n\nFrom: Prafull Ahire, Data Science\n\nSubject: ML Pricing Model Results & Action Plan\n\nOur new Random Forest model predicts used vehicle prices with 91% accuracy (R^2=0.91), completely outperforming our old baselines. Most importantly, it reduces our average estimation error down to just £1,500 per vehicle (MAE).\n\nThe algorithm identified three primary drivers of resale value:\n1. Vehicle Age: The steepness of early depreciation dictates the core baseline price.\n2. Mileage Velocity: Our engineered \"mileage per year\" metric heavily penalizes newer cars driven aggressively.\n3. Brand/Engine Premium: The model successfully isolates and accurately prices the luxury markup of Audi models over VW.\n\nFinancial Impact: We sell roughly 100,000 used cars annually. An average manual mispricing error of £1,500 translates to a £150 million portfolio mispricing risk. Transitioning to automated pricing tightens margins and protects us from this massive human-error exposure.\n\nRecommendation: Integrate this model into the CPO intake workflow immediately. Let the algorithm instantly auto-price our standard inventory. This frees our human appraisers to focus entirely on complex, high-risk valuations like modified trims or damaged vehicles scaling our operations without adding headcount.","charCount":1308,"selfChecks":[{"label":"Model comparison","checked":false},{"label":"Top features identified","checked":false},{"label":"Financial Impact","checked":false},{"label":"Clear recommendation","checked":false}]}

Jupyterlite Code

My solution
base64:CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTm90ZWJvb2s6IHZ3X3NwcmludDFfZWRhLmlweW5iCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICMxQTNDNkUgMCUsICMwQjEzMkIgMTAwJSk7IGJvcmRlci1yYWRpdXM6IDE2cHg7IHBhZGRpbmc6IDM2cHggMzJweDsgbWFyZ2luLWJvdHRvbTogOHB4OyI+CiMgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjE2cHg7IG1hcmdpbi1ib3R0b206MjBweDsiPgojICAgICA8ZGl2PgojICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiM2MGE1ZmE7IGZvbnQtc2l6ZToxMXB4OyBmb250LXdlaWdodDo3MDA7IGxldHRlci1zcGFjaW5nOjNweDsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBtYXJnaW4tYm90dG9tOjRweDsiPlByb29WIFdvcmsgRXhwZXJpZW5jZTwvZGl2PgojICAgICAgIDxkaXYgc3R5bGU9ImNvbG9yOiNmZmY7IGZvbnQtc2l6ZToyMnB4OyBmb250LXdlaWdodDo4MDA7IGxpbmUtaGVpZ2h0OjEuMjsiPlVzZWQgQ2FyIFByaWNlIFByZWRpY3Rpb248L2Rpdj4KIyAgICAgPC9kaXY+CiMgICA8L2Rpdj4KIyAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsgZ2FwOjEwcHg7IGZsZXgtd3JhcDp3cmFwOyBtYXJnaW4tYm90dG9tOjIwcHg7Ij4KIyAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjEyKTsgY29sb3I6I2ZmZjsgYm9yZGVyLXJhZGl1czoyMHB4OyBwYWRkaW5nOjVweCAxNHB4OyBmb250LXNpemU6MTJweDsgZm9udC13ZWlnaHQ6NjAwOyI+RGF0YSBTY2llbnRpc3QgLSBWVyBDYXNlIFN0dWR5PC9zcGFuPgojICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMTIpOyBjb2xvcjojZmZmOyBib3JkZXItcmFkaXVzOjIwcHg7IHBhZGRpbmc6NXB4IDE0cHg7IGZvbnQtc2l6ZToxMnB4OyBmb250LXdlaWdodDo2MDA7Ij5QeXRob24gLyBzY2lraXQtbGVhcm4gLyBwYW5kYXM8L3NwYW4+CiMgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4xMik7IGNvbG9yOiNmZmY7IGJvcmRlci1yYWRpdXM6MjBweDsgcGFkZGluZzo1cHggMTRweDsgZm9udC1zaXplOjEycHg7IGZvbnQtd2VpZ2h0OjYwMDsiPkVzdC4gNC02IGhvdXJzPC9zcGFuPgojICAgPC9kaXY+CiMgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4wOCk7IGJvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTsgYm9yZGVyLXJhZGl1czoxMHB4OyBwYWRkaW5nOjEycHggMTZweDsiPgojICAgICA8cCBzdHlsZT0iY29sb3I6Izk0YTNiODsgZm9udC1zaXplOjExcHg7IG1hcmdpbjowOyBsaW5lLWhlaWdodDoxLjY7Ij4KIyAgICAgICA8c3Ryb25nIHN0eWxlPSJjb2xvcjojY2JkNWUxOyI+TGVnYWwgbm90aWNlOjwvc3Ryb25nPiBUaGlzIGlzIGFuIGluZGVwZW5kZW50IGVkdWNhdGlvbmFsIGNhc2Ugc3R1ZHkgY3JlYXRlZCBieSBQcm9vVi4gVm9sa3N3YWdlbiwgQXVkaSwgVlcsIEdvbGYsIGFuZCBBNCBhcmUgdHJhZGVtYXJrcyBvZiBWb2xrc3dhZ2VuIEFHLiBUaGlzIG5vdGVib29rIGlzIG5vdCBlbmRvcnNlZCBieSwgYWZmaWxpYXRlZCB3aXRoLCBvciBzcG9uc29yZWQgYnkgVm9sa3N3YWdlbiBBRyBvciBhbnkgb2YgaXRzIHN1YnNpZGlhcmllcy4gRGF0YXNldCBzb3VyY2VkIGZyb20gdGhlIDxlbT4xMDAsMDAwIFVLIFVzZWQgQ2FyPC9lbT4gZGF0YXNldCBieSBhZGl0eWFkZXNhaTEzIG9uIEthZ2dsZSwgdXNlZCB1bmRlciBub21pbmF0aXZlIGZhaXIgdXNlIGZvciBlZHVjYXRpb25hbCBwdXJwb3NlcyBvbmx5LgojICAgICA8L3A+CiMgICA8L2Rpdj4KIyA8L2Rpdj4KCiMgIyMgWW91ciBNaXNzaW9uCiMgCiMgSW4gdGhpcyBzaW11bGF0ZWQgY2FzZSBzdHVkeSBieSBQcm9vViwgeW91IHdpbGwgc3RlcCBpbnRvIHRoZSByb2xlIG9mIGEgRGF0YSBTY2llbnRpc3QgYW5hbHl6aW5nIHRoZSB1c2VkIGNhciBtYXJrZXQgZm9yIFZvbGtzd2FnZW4gYW5kIEF1ZGkgdmVoaWNsZXMuIENlcnRpZmllZCBQcmUtT3duZWQgKENQTykgcHJvZ3JhbXMgcHJpY2UgdGhvdXNhbmRzIG9mIHVzZWQgdmVoaWNsZXMgZXZlcnkgbW9udGggLSBhbmQgb2Z0ZW4gZG8gaXQgbWFudWFsbHkuIFlvdXIgam9iOiAqKmJ1aWxkIGEgbWFjaGluZSBsZWFybmluZyBtb2RlbCB0aGF0IHByZWRpY3RzIHJlc2FsZSBwcmljZXMgYXV0b21hdGljYWxseSoqLgojIAojIFlvdSdsbCB3b3JrIHdpdGggcmVhbCBVSyBtYXJrZXQgZGF0YToKIyAtICoqfjE1LDIwMCBWVyBsaXN0aW5ncyoqIChtb3N0bHkgR29sZikKIyAtICoqfjEwLDcwMCBBdWRpIGxpc3RpbmdzKiogKG1vc3RseSBBNCkKIyAtIENvbHVtbnM6IGBtb2RlbGAsIGB5ZWFyYCwgYHByaWNlYCwgYHRyYW5zbWlzc2lvbmAsIGBtaWxlYWdlYCwgYGZ1ZWxUeXBlYCwgYHRheGAsIGBtcGdgLCBgZW5naW5lU2l6ZWAKIyAKIyBCeSB0aGUgZW5kIHlvdSdsbCBoYXZlIHRyYWluZWQgdHdvIG1vZGVscywgY29tcGFyZWQgdGhlbSwgYW5kIHdyaXR0ZW4gYSBidXNpbmVzcyByZWNvbW1lbmRhdGlvbiBmb3IgbGVhZGVyc2hpcC4KIyAKIyAtLS0KIyAKIyAqKkZvbGxvdyB0aGUgc2VjdGlvbnMgaW4gb3JkZXIuKiogRWFjaCBvbmUgaGFzIGEgY2hlY2tsaXN0LiBGaWxsIGluIHRoZSBgIyBZT1VSIENPREUgSEVSRWAgY2VsbHMuCgojIC0tLQojICMjIFNlY3Rpb24gMCAtIFNldHVwICYgRGF0YSBMb2FkaW5nCiMgPiAqKlJ1biB0aGlzIGNlbGwgZmlyc3QuIERvIG5vdCBtb2RpZnkgaXQuKioKCiMgSW5bIF06CiMgUHJvb1Y6IFZXICYgQXVkaSBVc2VkIENhciBQcmljZSBQcmVkaWN0aW9uCiMgVm9sa3N3YWdlbiwgQXVkaSwgVlcsI
…
Verified certificateTamper-proof · issued by ProoV
3Projects completed
3Verified certificates
88Average score
Create your portfolio with ProoV