Commit 54dd46e
perf(plan): skip disabled windows in remove_intersecting_windows
remove_intersecting_windows runs on every simulation - both Prediction.
run_prediction and run_prediction_kernel call it before simulating - so it sits
in front of the C++ kernel on the hot path. It scanned every charge window
against every export window, testing "is this charge window enabled" and "is
this export window enabled" inside the inner loop, so a plan carrying mostly
disabled windows still paid the full O(charge x export) scan to do nothing.
During optimisation that is the normal case, not an edge case. Instrumenting a
benchmark scenario: 266 charge windows per call of which 24.6 enabled, 48.8
export windows of which 16.0 enabled - 139 million pair-iterations scanned per
plan, of which 3.1% involved an enabled pair.
Enabled export windows are now collected once per call (returning immediately
when there are none, since nothing can clip), and a disabled charge window
short-circuits instead of scanning every export window to discover it cannot be
clipped. Both fast paths rebuild the window dicts exactly as the clipping path
does, so the returned windows carry the same keys and are equally freshly owned.
Profiled on the worst benchmark scenario, this function was 124.7s of a 152.9s
plan (81%). After: that scenario drops from 152.0s to 25.6s. Across the 20
scenario benchmark, mean optimise time falls from 13.674s to 4.359s (3.1x) with
plan metric and cost identical on all 20 - the clipping behaviour is unchanged,
only the work skipped.
Adds characterisation tests first: the fully-covered, disabled-charge,
disabled-export, clip-start, clip-end and split cases, plus a randomised
equivalence check comparing the implementation against a naive reference over
200 random window layouts. These pass before and after the change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>1 parent 24fde5a commit 54dd46e
2 files changed
Lines changed: 185 additions & 16 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
11 | 13 | | |
12 | 14 | | |
13 | 15 | | |
| |||
59 | 61 | | |
60 | 62 | | |
61 | 63 | | |
62 | | - | |
63 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
64 | 99 | | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | 100 | | |
70 | | - | |
71 | | - | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
72 | 104 | | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
73 | 225 | | |
74 | 226 | | |
75 | 227 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
992 | 992 | | |
993 | 993 | | |
994 | 994 | | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
995 | 1003 | | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
996 | 1011 | | |
997 | 1012 | | |
998 | 1013 | | |
| |||
1008 | 1023 | | |
1009 | 1024 | | |
1010 | 1025 | | |
1011 | | - | |
1012 | | - | |
1013 | | - | |
1014 | | - | |
1015 | | - | |
1016 | | - | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
1017 | 1032 | | |
1018 | | - | |
1019 | | - | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
1020 | 1037 | | |
1021 | 1038 | | |
1022 | 1039 | | |
| |||
0 commit comments